def test_parse_address_family_empty() -> None: """Test that parsing an empty BUILD file results in an empty AddressFamily.""" af = run_rule_with_mocks( parse_address_family, rule_args=[ Parser(build_root="", target_type_aliases=[], object_aliases=BuildFileAliases()), BuildFileOptions(("BUILD",)), BuildFilePreludeSymbols(FrozenDict()), AddressFamilyDir("/dev/null"), ], mock_gets=[ MockGet( output_type=DigestContents, input_type=PathGlobs, mock=lambda _: DigestContents([FileContent(path="/dev/null/BUILD", content=b"")]), ), ], ) assert len(af.name_to_target_adaptors) == 0
async def addresses_from_raw_specs_without_file_owners( specs: RawSpecsWithoutFileOwners, build_file_options: BuildFileOptions, specs_filter: SpecsFilter, ) -> Addresses: matched_addresses: OrderedSet[Address] = OrderedSet() filtering_disabled = specs.filter_by_global_options is False literal_wrapped_targets = await _determine_literal_addresses_from_raw_specs( specs.address_literals, description_of_origin=specs.description_of_origin) matched_addresses.update( wrapped_tgt.target.address for wrapped_tgt in literal_wrapped_targets if filtering_disabled or specs_filter.matches(wrapped_tgt.target)) if not (specs.dir_literals or specs.dir_globs or specs.recursive_globs or specs.ancestor_globs): return Addresses(matched_addresses) # Resolve all globs. build_file_globs, validation_globs = specs.to_build_file_path_globs_tuple( build_patterns=build_file_options.patterns, build_ignore_patterns=build_file_options.ignores, ) build_file_paths, _ = await MultiGet( Get(Paths, PathGlobs, build_file_globs), Get(Paths, PathGlobs, validation_globs), ) dirnames = {os.path.dirname(f) for f in build_file_paths.files} address_families = await MultiGet( Get(AddressFamily, AddressFamilyDir(d)) for d in dirnames) base_addresses = Addresses( itertools.chain.from_iterable( address_family.addresses_to_target_adaptors for address_family in address_families)) target_parametrizations_list = await MultiGet( Get( _TargetParametrizations, _TargetParametrizationsRequest( base_address, description_of_origin=specs.description_of_origin), ) for base_address in base_addresses) residence_dir_to_targets = defaultdict(list) for target_parametrizations in target_parametrizations_list: for tgt in target_parametrizations.all: residence_dir_to_targets[tgt.residence_dir].append(tgt) def valid_tgt( tgt: Target, spec: DirLiteralSpec | DirGlobSpec | RecursiveGlobSpec | AncestorGlobSpec ) -> bool: if not spec.matches_target_generators and isinstance( tgt, TargetGenerator): return False return filtering_disabled or specs_filter.matches(tgt) for glob_spec in specs.glob_specs(): for residence_dir in residence_dir_to_targets: if not glob_spec.matches_target_residence_dir(residence_dir): continue matched_addresses.update( tgt.address for tgt in residence_dir_to_targets[residence_dir] if valid_tgt(tgt, glob_spec)) return Addresses(sorted(matched_addresses))