async def find_build_file(address: Address) -> BuildFileAddress: address_family = await Get(AddressFamily, Dir(address.spec_path)) owning_address = address.maybe_convert_to_base_target() if address_family.get_target_adaptor(owning_address) is None: raise _did_you_mean_exception(address_family=address_family, name=owning_address.target_name) bfa = next(build_file_address for build_file_address in address_family.build_file_addresses if build_file_address.address == owning_address) return (bfa if address.is_base_target else BuildFileAddress( rel_path=bfa.rel_path, address=address))
def __init__(self, address: Address, *, unused_ignores: Iterable[Address], result: Iterable[Address]) -> None: # If the address was generated, we convert back to the original base target to correspond to # what users actually put in BUILD files. address = address.maybe_convert_to_base_target() sorted_unused_ignores = sorted([f"!{addr}" for addr in unused_ignores]) formatted_unused_ignores = (repr(sorted_unused_ignores[0]) if len(sorted_unused_ignores) == 1 else str(sorted_unused_ignores)) bulleted_list_sep = "\n * " possible_deps = sorted(addr.spec for addr in result) super().__init__( f"The target {address} includes {formatted_unused_ignores} in its `dependencies` field, " f"but {'it does' if len(sorted_unused_ignores) == 1 else 'they do'} not match any of " f"the resolved dependencies. Instead, please choose from the dependencies that are " f"being used:\n\n{bulleted_list_sep}{bulleted_list_sep.join(possible_deps)}" )
async def find_build_file(address: Address) -> BuildFileAddress: address_family = await Get(AddressFamily, AddressFamilyDir(address.spec_path)) owning_address = address.maybe_convert_to_base_target() 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 ( bfa if address.is_base_target else BuildFileAddress(rel_path=bfa.rel_path, address=address) )
async def resolve_target( address: Address, registered_target_types: RegisteredTargetTypes, union_membership: UnionMembership, ) -> WrappedTarget: if not address.is_base_target: base_target = await Get(WrappedTarget, Address, address.maybe_convert_to_base_target()) subtarget = generate_subtarget( base_target.target, full_file_name=address.filename, union_membership=union_membership ) return WrappedTarget(subtarget) target_adaptor = await Get(TargetAdaptor, Address, address) target_type = registered_target_types.aliases_to_types.get(target_adaptor.type_alias, None) if target_type is None: raise UnrecognizedTargetTypeException( target_adaptor.type_alias, registered_target_types, address=address ) target = target_type(target_adaptor.kwargs, address=address, union_membership=union_membership) return WrappedTarget(target)