def test_address_specs_do_not_exist( address_specs_rule_runner: RuleRunner) -> None: address_specs_rule_runner.write_files({ "real/f.txt": "", "real/BUILD": "mock_tgt(sources=['f.txt'])", "empty/BUILD": "# empty" }) def assert_resolve_error(specs: Iterable[AddressSpec], *, expected: str) -> None: with pytest.raises(ExecutionError) as exc: resolve_address_specs(address_specs_rule_runner, specs) assert expected in str(exc.value) # Literal addresses require both a BUILD file to exist and for a target to be resolved. assert_resolve_error([AddressLiteralSpec("fake", "tgt")], expected="'fake' does not exist on disk") assert_resolve_error( [AddressLiteralSpec("fake/f.txt", "tgt")], expected="'fake/f.txt' does not exist on disk", ) did_you_mean = ResolveError.did_you_mean(bad_name="fake_tgt", known_names=["real"], namespace="real") assert_resolve_error([AddressLiteralSpec("real", "fake_tgt")], expected=str(did_you_mean)) assert_resolve_error([AddressLiteralSpec("real/f.txt", "fake_tgt")], expected=str(did_you_mean)) # SiblingAddresses requires the BUILD file to exist and at least one match. assert_resolve_error( [SiblingAddresses("fake")], expected= ("'fake' does not contain any BUILD files, but 'fake:' expected matching targets " "there."), ) assert_resolve_error( [SiblingAddresses("empty")], expected="Address spec 'empty:' does not match any targets", ) # MaybeEmptySiblingAddresses does not require a BUILD file to exist nor any matches. assert not resolve_address_specs(address_specs_rule_runner, [MaybeEmptySiblingAddresses("fake")]) assert not resolve_address_specs(address_specs_rule_runner, [MaybeEmptySiblingAddresses("empty")]) # DescendantAddresses requires at least one match, even if BUILD files exist. assert_resolve_error( [DescendantAddresses("fake"), DescendantAddresses("empty")], expected="Address spec 'fake::' does not match any targets", ) # AscendantAddresses does not require any matches or BUILD files. assert not resolve_address_specs( address_specs_rule_runner, [AscendantAddresses("fake"), AscendantAddresses("empty")])
def test_address_specs_do_not_exist( address_specs_rule_runner: RuleRunner) -> None: address_specs_rule_runner.write_files({ "real/f.txt": "", "real/BUILD": "mock_tgt(sources=['f.txt'])", "empty/BUILD": "# empty" }) def assert_resolve_error(specs: Iterable[AddressSpec], *, expected: str) -> None: with engine_error(contains=expected): resolve_address_specs(address_specs_rule_runner, specs) # Literal addresses require for the relevant BUILD file to exist and for the target to be # resolved. assert_resolve_error([AddressLiteralSpec("fake", "tgt")], expected="'fake' does not exist on disk") assert_resolve_error( [AddressLiteralSpec("fake/f.txt", "tgt")], expected="'fake/f.txt' does not exist on disk", ) did_you_mean = ResolveError.did_you_mean(bad_name="fake_tgt", known_names=["real"], namespace="real") assert_resolve_error([AddressLiteralSpec("real", "fake_tgt")], expected=str(did_you_mean)) assert_resolve_error([AddressLiteralSpec("real/f.txt", "fake_tgt")], expected=str(did_you_mean)) # SiblingAddresses requires at least one match. assert_resolve_error( [SiblingAddresses("fake")], expected="No targets found for the address glob `fake:`", ) assert_resolve_error( [SiblingAddresses("empty")], expected="No targets found for the address glob `empty:`") # MaybeEmptySiblingAddresses does not require any matches. assert not resolve_address_specs(address_specs_rule_runner, [MaybeEmptySiblingAddresses("fake")]) assert not resolve_address_specs(address_specs_rule_runner, [MaybeEmptySiblingAddresses("empty")]) # DescendantAddresses requires at least one match. assert_resolve_error( [DescendantAddresses("fake"), DescendantAddresses("empty")], expected= "No targets found for these address globs: ['empty::', 'fake::']", ) # AscendantAddresses does not require any matches. assert not resolve_address_specs( address_specs_rule_runner, [AscendantAddresses("fake"), AscendantAddresses("empty")])
async def find_build_file(address: Address) -> BuildFileAddress: address_family = await Get(AddressFamily, AddressFamilyDir(address.spec_path)) owning_address = address.maybe_convert_to_target_generator() if address_family.get_target_adaptor(owning_address) is None: raise ResolveError.did_you_mean( bad_name=owning_address.target_name, known_names=address_family.target_names, namespace=address_family.namespace, ) bfa = next(build_file_address for build_file_address in address_family.build_file_addresses if build_file_address.address == owning_address) return BuildFileAddress( address, bfa.rel_path) if address.is_generated_target else bfa
async def find_target_adaptor(address: Address) -> TargetAdaptor: """Hydrate a TargetAdaptor so that it may be converted into the Target API.""" if not address.is_base_target: raise ValueError( f"Subtargets are not resident in BUILD files, and so do not have TargetAdaptors: {address}" ) address_family = await Get(AddressFamily, Dir(address.spec_path)) target_adaptor = address_family.get_target_adaptor(address) if target_adaptor is None: raise ResolveError.did_you_mean( bad_name=address.target_name, known_names=address_family.target_names, namespace=address_family.namespace, ) return target_adaptor
async def find_target_adaptor(address: Address) -> TargetAdaptor: """Hydrate a TargetAdaptor so that it may be converted into the Target API.""" if address.is_generated_target: raise AssertionError( "Generated targets are not defined in BUILD files, and so do not have " f"TargetAdaptors: {address}") address_family = await Get(AddressFamily, AddressFamilyDir(address.spec_path)) target_adaptor = address_family.get_target_adaptor(address) if target_adaptor is None: raise ResolveError.did_you_mean( bad_name=address.target_name, known_names=address_family.target_names, namespace=address_family.namespace, ) return target_adaptor
def test_address_specs_do_not_exist(self) -> None: self.create_file("real/f.txt") self.add_to_build_file("real", "mock_tgt(sources=['f.txt'])") self.add_to_build_file("empty", "# empty") def assert_resolve_error(specs: Iterable[AddressSpec], *, expected: str) -> None: with pytest.raises(ExecutionError) as exc: self.resolve_address_specs(specs) assert expected in str(exc.value) # Literal addresses require both a BUILD file to exist and for a target to be resolved. assert_resolve_error([AddressLiteralSpec("fake", "tgt")], expected="'fake' does not exist on disk") assert_resolve_error( [AddressLiteralSpec("fake/f.txt", "tgt")], expected="'fake/f.txt' does not exist on disk", ) did_you_mean = ResolveError.did_you_mean(bad_name="fake_tgt", known_names=["real"], namespace="real") assert_resolve_error([AddressLiteralSpec("real", "fake_tgt")], expected=str(did_you_mean)) assert_resolve_error([AddressLiteralSpec("real/f.txt", "fake_tgt")], expected=str(did_you_mean)) # SiblingAddresses require the BUILD file to exist, but are okay if no targets are resolved. assert_resolve_error( [SiblingAddresses("fake")], expected= ("'fake' does not contain any BUILD files, but 'fake:' expected matching targets " "there."), ) assert not self.resolve_address_specs([SiblingAddresses("empty")]) # DescendantAddresses requires at least one match, even if BUILD files exist. assert_resolve_error( [DescendantAddresses("fake"), DescendantAddresses("empty")], expected="Address spec 'fake::' does not match any targets", ) # AscendantAddresses does not require any matches or BUILD files. assert not self.resolve_address_specs( [AscendantAddresses("fake"), AscendantAddresses("empty")])