def test_to_pep_508_in_extras() -> None: dependency = Dependency("Django", "^1.23") dependency.in_extras.append("foo") result = dependency.to_pep_508() assert result == 'Django (>=1.23,<2.0); extra == "foo"' result = dependency.to_pep_508(with_extras=False) assert result == "Django (>=1.23,<2.0)" dependency.in_extras.append("bar") result = dependency.to_pep_508() assert result == 'Django (>=1.23,<2.0); extra == "foo" or extra == "bar"' dependency.python_versions = "~2.7 || ^3.6" result = dependency.to_pep_508() assert (result == "Django (>=1.23,<2.0); " "(" 'python_version >= "2.7" and python_version < "2.8" ' 'or python_version >= "3.6" and python_version < "4.0"' ") " 'and (extra == "foo" or extra == "bar")') result = dependency.to_pep_508(with_extras=False) assert (result == "Django (>=1.23,<2.0); " 'python_version >= "2.7" and python_version < "2.8" ' 'or python_version >= "3.6" and python_version < "4.0"')
def test_to_pep_508_combination() -> None: dependency = Dependency("foo", "^1.2,!=1.3.5") assert dependency.to_pep_508() == "foo (>=1.2,<2.0,!=1.3.5)" dependency = Dependency("foo", "~1.2,!=1.2.5") assert dependency.to_pep_508() == "foo (>=1.2,<1.3,!=1.2.5)"
def test_to_pep_508_combination(): dependency = Dependency("foo", "^1.2,!=1.3.5") assert "foo (>=1.2,<2.0,!=1.3.5)" == dependency.to_pep_508() dependency = Dependency("foo", "~1.2,!=1.2.5") assert "foo (>=1.2,<1.3,!=1.2.5)" == dependency.to_pep_508()
def test_to_pep_508() -> None: dependency = Dependency("Django", "^1.23") result = dependency.to_pep_508() assert result == "Django (>=1.23,<2.0)" dependency = Dependency("Django", "^1.23") dependency.python_versions = "~2.7 || ^3.6" result = dependency.to_pep_508() assert (result == "Django (>=1.23,<2.0); " 'python_version >= "2.7" and python_version < "2.8" ' 'or python_version >= "3.6" and python_version < "4.0"')
def test_to_pep_508_caret() -> None: dependency = Dependency("foo", "^1.2.3") assert dependency.to_pep_508() == "foo (>=1.2.3,<2.0.0)" dependency = Dependency("foo", "^1.2") assert dependency.to_pep_508() == "foo (>=1.2,<2.0)" dependency = Dependency("foo", "^0.2.3") assert dependency.to_pep_508() == "foo (>=0.2.3,<0.3.0)" dependency = Dependency("foo", "^0.2") assert dependency.to_pep_508() == "foo (>=0.2,<0.3)"
def test_to_pep_508_tilde() -> None: dependency = Dependency("foo", "~1.2.3") assert dependency.to_pep_508() == "foo (>=1.2.3,<1.3.0)" dependency = Dependency("foo", "~1.2") assert dependency.to_pep_508() == "foo (>=1.2,<1.3)" dependency = Dependency("foo", "~0.2.3") assert dependency.to_pep_508() == "foo (>=0.2.3,<0.3.0)" dependency = Dependency("foo", "~0.2") assert dependency.to_pep_508() == "foo (>=0.2,<0.3)"
def test_to_pep_508_caret(): dependency = Dependency("foo", "^1.2.3") assert "foo (>=1.2.3,<2.0.0)" == dependency.to_pep_508() dependency = Dependency("foo", "^1.2") assert "foo (>=1.2,<2.0)" == dependency.to_pep_508() dependency = Dependency("foo", "^0.2.3") assert "foo (>=0.2.3,<0.3.0)" == dependency.to_pep_508() dependency = Dependency("foo", "^0.2") assert "foo (>=0.2,<0.3)" == dependency.to_pep_508()
def test_to_pep_508_tilde(): dependency = Dependency("foo", "~1.2.3") assert "foo (>=1.2.3,<1.3.0)" == dependency.to_pep_508() dependency = Dependency("foo", "~1.2") assert "foo (>=1.2,<1.3)" == dependency.to_pep_508() dependency = Dependency("foo", "~0.2.3") assert "foo (>=0.2.3,<0.3.0)" == dependency.to_pep_508() dependency = Dependency("foo", "~0.2") assert "foo (>=0.2,<0.3)" == dependency.to_pep_508()
def test_to_pep_508_with_patch_python_version(python_versions, marker): dependency = Dependency("Django", "^1.23") dependency.python_versions = python_versions expected = "Django (>=1.23,<2.0); {}".format(marker) assert expected == dependency.to_pep_508() assert marker == str(dependency.marker)
def test_to_pep_508_with_patch_python_version(python_versions: str, marker: str) -> None: dependency = Dependency("Django", "^1.23") dependency.python_versions = python_versions expected = f"Django (>=1.23,<2.0); {marker}" assert dependency.to_pep_508() == expected assert str(dependency.marker) == marker
def test_single_page_repository_find_packages(): repo = MockSinglePageRepository("jax_releases") dep = Dependency("jaxlib", "0.3.7") packages = repo.find_packages(dep) assert len(packages) == 1 package = packages[0] assert package.name == dep.name assert package.to_dependency().to_pep_508() == dep.to_pep_508()
def find_packages( self, dependency: poetry_dep.Dependency, ) -> list[poetry_pkg.Package]: if dependency.name.startswith("pypkg-"): pep508 = dependency.to_pep_508().replace("pypkg-", "") dependency = type(dependency).create_from_pep_508(pep508) else: return [] packages = super().find_packages(dependency) for package in packages: package._name = f"pypkg-{package._name}" package._pretty_name = f"pypkg-{package._pretty_name}" return packages # type: ignore
def locked_repository( self, with_dev_reqs: bool = False) -> poetry.repositories.Repository: """ Searches and returns a repository of locked packages. """ from poetry.factory import Factory if not self.is_locked(): return poetry.repositories.Repository() lock_data = self.lock_data packages = poetry.repositories.Repository() if with_dev_reqs: locked_packages = lock_data["package"] else: locked_packages = [ p for p in lock_data["package"] if p["category"] == "main" ] if not locked_packages: return packages for info in locked_packages: source = info.get("source", {}) source_type = source.get("type") url = source.get("url") if source_type in ["directory", "file"]: url = self._lock.path.parent.joinpath(url).resolve().as_posix() package = Package( info["name"], info["version"], info["version"], source_type=source_type, source_url=url, source_reference=source.get("reference"), source_resolved_reference=source.get("resolved_reference"), ) package.description = info.get("description", "") package.category = info.get("category", "main") package.groups = info.get("groups", ["default"]) package.optional = info["optional"] if "hashes" in lock_data["metadata"]: # Old lock so we create dummy files from the hashes package.files = [{ "name": h, "hash": h } for h in lock_data["metadata"]["hashes"][info["name"]]] else: package.files = lock_data["metadata"]["files"][info["name"]] package.python_versions = info["python-versions"] extras = info.get("extras", {}) if extras: for name, deps in extras.items(): package.extras[name] = [] for dep in deps: try: dependency = Dependency.create_from_pep_508(dep) except InvalidRequirement: # handle lock files with invalid PEP 508 m = re.match( r"^(.+?)(?:\[(.+?)])?(?:\s+\((.+)\))?$", dep) dep_name = m.group(1) extras = m.group(2) or "" constraint = m.group(3) or "*" dependency = Dependency(dep_name, constraint, extras=extras.split(",")) package.extras[name].append(dependency) if "marker" in info: package.marker = parse_marker(info["marker"]) else: # Compatibility for old locks if "requirements" in info: dep = Dependency("foo", "0.0.0") for name, value in info["requirements"].items(): if name == "python": dep.python_versions = value elif name == "platform": dep.platform = value split_dep = dep.to_pep_508(False).split(";") if len(split_dep) > 1: package.marker = parse_marker(split_dep[1].strip()) for dep_name, constraint in info.get("dependencies", {}).items(): root_dir = self._lock.path.parent if package.source_type == "directory": # root dir should be the source of the package relative to the lock path root_dir = Path(package.source_url) if isinstance(constraint, list): for c in constraint: package.add_dependency( Factory.create_dependency(dep_name, c, root_dir=root_dir)) continue package.add_dependency( Factory.create_dependency(dep_name, constraint, root_dir=root_dir)) if "develop" in info: package.develop = info["develop"] packages.add_package(package) return packages
def test_to_pep_508_wilcard() -> None: dependency = Dependency("Django", "*") result = dependency.to_pep_508() assert result == "Django"
def test_to_pep_508_with_excluded_versions(exclusion: str, expected: str) -> None: dependency = Dependency("foo", exclusion) assert dependency.to_pep_508() == f"foo ({expected})"
def test_to_pep_508_with_single_version_excluded(): dependency = Dependency("foo", "!=1.2.3") assert "foo (!=1.2.3)" == dependency.to_pep_508()