def load(cls, env: Env) -> "InstalledRepository": """ Load installed packages. """ repo = cls() seen = set() for entry in reversed(env.sys_path): for distribution in sorted( metadata.distributions(path=[entry]), key=lambda d: str(d._path), ): name = distribution.metadata["name"] path = Path(str(distribution._path)) version = distribution.metadata["version"] package = Package(name, version, version) package.description = distribution.metadata.get("summary", "") if package.name in seen: continue try: path.relative_to(_VENDORS) except ValueError: pass else: continue seen.add(package.name) repo.add_package(package) is_standard_package = env.is_path_relative_to_lib(path) if is_standard_package: if path.name.endswith(".dist-info"): paths = cls.get_package_paths(env=env, name=package.pretty_name) if paths: is_editable_package = False for src in paths: if cls.is_vcs_package(src, env): cls.set_package_vcs_properties( package, env) break if not (is_editable_package or env.is_path_relative_to_lib(src)): is_editable_package = True else: # TODO: handle multiple source directories? if is_editable_package: package._source_type = "directory" package._source_url = paths.pop().as_posix( ) continue if cls.is_vcs_package(path, env): cls.set_package_vcs_properties(package, env) else: # If not, it's a path dependency package._source_type = "directory" package._source_url = str(path.parent) return repo
def create_package_from_distribution( cls, distribution: metadata.Distribution, env: Env ) -> Package: # We first check for a direct_url.json file to determine # the type of package. path = Path(str(distribution._path)) if ( path.name.endswith(".dist-info") and path.joinpath("direct_url.json").exists() ): return cls.create_package_from_pep610(distribution) is_standard_package = env.is_path_relative_to_lib(path) source_type = None source_url = None source_reference = None source_resolved_reference = None if is_standard_package: if path.name.endswith(".dist-info"): paths = cls.get_package_paths( env=env, name=distribution.metadata["name"] ) if paths: is_editable_package = False for src in paths: if cls.is_vcs_package(src, env): ( source_type, source_url, source_reference, ) = cls.get_package_vcs_properties_from_path(src) break if not ( is_editable_package or env.is_path_relative_to_lib(src) ): is_editable_package = True else: # TODO: handle multiple source directories? if is_editable_package: source_type = "directory" source_url = paths.pop().as_posix() elif cls.is_vcs_package(path, env): ( source_type, source_url, source_reference, ) = cls.get_package_vcs_properties_from_path( env.path / "src" / canonicalize_name(distribution.metadata["name"]) ) else: # If not, it's a path dependency source_type = "directory" source_url = str(path.parent) package = Package( distribution.metadata["name"], distribution.metadata["version"], source_type=source_type, source_url=source_url, source_reference=source_reference, source_resolved_reference=source_resolved_reference, ) package.description = distribution.metadata.get("summary", "") return package