def load(cls, env): # type: (Env) -> InstalledRepository """ Load installed packages. For now, it uses the pip "freeze" command. """ repo = cls() seen = set() for entry in env.sys_path: for distribution in sorted( metadata.distributions(path=[entry]), key=lambda d: str(d._path), ): name = distribution.metadata["name"] version = distribution.metadata["version"] package = Package(name, version, version) package.description = distribution.metadata.get("summary", "") if package.name in seen: continue seen.add(package.name) repo.add_package(package) path = Path(str(distribution._path)) is_standard_package = True try: path.relative_to(env.site_packages) except ValueError: is_standard_package = False if is_standard_package: continue src_path = env.path / "src" # A VCS dependency should have been installed # in the src directory. If not, it's a path dependency try: path.relative_to(src_path) from poetry.vcs.git import Git git = Git() revision = git.rev_parse("HEAD", src_path / package.name).strip() url = git.remote_url(src_path / package.name) package.source_type = "git" package.source_url = url package.source_reference = revision except ValueError: package.source_type = "directory" package.source_url = str(path.parent) return repo
def load(cls, env): # type: (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: for src in paths: if cls.is_vcs_package(src, env): cls.set_package_vcs_properties(package, env) break else: # TODO: handle multiple source directories? 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 test_throw_on_invalid_package(): invalid = next( filter( lambda e: str(e._path).endswith("invalid-0.0.1.dist-info"), sorted( metadata.distributions(path=[str(SITE_PURELIB)]), key=lambda d: str(d._path), ), ) ) name = invalid.metadata["name"] version = invalid.metadata["version"] with pytest.raises(TypeError) as error: Package(name, version, version) assert str(error.value) == "expected string or bytes-like object"
def load(cls, env: Env, with_dependencies: bool = False) -> "InstalledRepository": """ Load installed packages. """ from poetry.core.packages.dependency import Dependency 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 = canonicalize_name(distribution.metadata["name"]) if name in seen: continue path = Path(str(distribution._path)) try: path.relative_to(_VENDORS) except ValueError: pass else: continue package = cls.create_package_from_distribution( distribution, env) if with_dependencies: for require in distribution.metadata.get_all( "requires-dist", []): dep = Dependency.create_from_pep_508(require) package.add_dependency(dep) seen.add(package.name) repo.add_package(package) return repo
def load(cls, env): # type: (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 = True try: path.relative_to(env.site_packages) except ValueError: is_standard_package = False if is_standard_package: if path.name.endswith(".dist-info"): paths = cls.get_package_paths( sitedir=env.site_packages, name=package.pretty_name) if paths: # TODO: handle multiple source directories? package.source_type = "directory" package.source_url = paths.pop().as_posix() continue src_path = env.path / "src" # A VCS dependency should have been installed # in the src directory. If not, it's a path dependency try: path.relative_to(src_path) from poetry.core.vcs.git import Git git = Git() revision = git.rev_parse("HEAD", src_path / package.name).strip() url = git.remote_url(src_path / package.name) package.source_type = "git" package.source_url = url package.source_reference = revision except ValueError: package.source_type = "directory" package.source_url = str(path.parent) return repo
def load(cls, env: Env, with_dependencies: bool = False) -> InstalledRepository: """ Load installed packages. """ from poetry.core.packages.dependency import Dependency repo = cls() seen = set() skipped = set() for entry in reversed(env.sys_path): if not entry.strip(): logger.debug( "Project environment contains an empty path in <c1>sys_path</>," " ignoring.") continue for distribution in sorted( metadata.distributions( # type: ignore[no-untyped-call] path=[entry], ), key=lambda d: str(d._path), # type: ignore[attr-defined] ): path = Path(str( distribution._path)) # type: ignore[attr-defined] if path in skipped: continue try: name = canonicalize_name(distribution.metadata["name"]) except TypeError: logger.warning( "Project environment contains an invalid distribution" " (<c1>%s</>). Consider removing it manually or recreate the" " environment.", path, ) skipped.add(path) continue if name in seen: continue try: path.relative_to(_VENDORS) except ValueError: pass else: continue package = cls.create_package_from_distribution( distribution, env) if with_dependencies: for require in distribution.metadata.get_all( "requires-dist", []): dep = Dependency.create_from_pep_508(require) package.add_dependency(dep) seen.add(package.name) repo.add_package(package) return repo
def load(cls, env: Env, with_dependencies: bool = False) -> "InstalledRepository": """ Load installed packages. """ from poetry.core.packages.dependency import Dependency 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 with_dependencies: for require in distribution.metadata.get_all( "requires-dist", []): dep = Dependency.create_from_pep_508(require) package.add_dependency(dep) 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