From bb960a66fcf8903a79909314b954feaf4a1de076 Mon Sep 17 00:00:00 2001 From: Frost Ming Date: Sat, 22 Feb 2020 16:33:23 +0800 Subject: [PATCH] Merge markers correctly from different parents --- news/47.bugfix | 1 + pdm/models/candidates.py | 4 ---- pdm/models/repositories.py | 27 +++++++++------------------ pdm/project/core.py | 8 -------- tests/resolver/test_resolve.py | 8 ++++++++ 5 files changed, 18 insertions(+), 30 deletions(-) create mode 100644 news/47.bugfix diff --git a/news/47.bugfix b/news/47.bugfix new file mode 100644 index 00000000..54685fbc --- /dev/null +++ b/news/47.bugfix @@ -0,0 +1 @@ +Always consider wheels before tarballs; correctly merge markers from different parents. diff --git a/pdm/models/candidates.py b/pdm/models/candidates.py index 983f9727..16f46349 100644 --- a/pdm/models/candidates.py +++ b/pdm/models/candidates.py @@ -108,10 +108,6 @@ class Candidate: self.wheel = None self.metadata = None - # Dependencies from lockfile content. - self.dependencies = None - self.summary = None - def __hash__(self): return hash((self.name, self.version)) diff --git a/pdm/models/repositories.py b/pdm/models/repositories.py index d3e18d00..53abf588 100644 --- a/pdm/models/repositories.py +++ b/pdm/models/repositories.py @@ -155,15 +155,6 @@ class BaseRepository: for c in matching_candidates } - def _get_dependencies_from_lockfile(self, candidate: Candidate) -> CandidateInfo: - if candidate.dependencies is None: - raise CandidateInfoNotFound(candidate) - return ( - [dep.as_line() for dep in candidate.dependencies], - candidate.requires_python, - candidate.summary, - ) - def dependency_generators(self) -> Iterable[Callable[[Candidate], CandidateInfo]]: """Return an iterable of getter functions to get dependencies, which will be called one by one. @@ -212,7 +203,6 @@ class PyPIRepository(BaseRepository): def dependency_generators(self) -> Iterable[Callable[[Candidate], CandidateInfo]]: return ( - self._get_dependencies_from_lockfile, self._get_dependencies_from_cache, self._get_dependencies_from_json, self._get_dependencies_from_metadata, @@ -241,19 +231,20 @@ class PyPIRepository(BaseRepository): c for c in cans if requirement.specifier.contains(c.version, allow_prereleases) + and (allow_all or requires_python.is_subset(c.requires_python)) ), - key=lambda c: (c.version, c.ireq.is_wheel), + key=lambda c: (c.version, c.link.is_wheel), ) - if not allow_all: - sorted_cans = [ - can - for can in sorted_cans - if requires_python.is_subset(can.requires_python) - ] + if not sorted_cans and allow_prereleases is None: # No non-pre-releases is found, force pre-releases now sorted_cans = sorted( - (c for c in cans if requirement.specifier.contains(c.version, True)), + ( + c + for c in cans + if requirement.specifier.contains(c.version, True) + and (allow_all or requires_python.is_subset(c.requires_python)) + ), key=lambda c: c.version, ) return sorted_cans diff --git a/pdm/project/core.py b/pdm/project/core.py index bbbfc6e7..92cc642b 100644 --- a/pdm/project/core.py +++ b/pdm/project/core.py @@ -185,17 +185,9 @@ class Project: if version: package["version"] = f"=={version}" package_name = package.pop("name") - summary = package.pop("summary", None) - dependencies = [ - Requirement.from_req_dict(k, v) - for k, v in package.pop("dependencies", {}).items() - ] req = Requirement.from_req_dict(package_name, dict(package)) can = Candidate(req, self.environment, name=package_name, version=version) can.marker = req.marker - can.requires_python = str(req.requires_python) - can.dependencies = dependencies - can.summary = summary can.hashes = { item["file"]: item["hash"] for item in self.lockfile["metadata"].get( diff --git a/tests/resolver/test_resolve.py b/tests/resolver/test_resolve.py index 500215f5..825def77 100644 --- a/tests/resolver/test_resolve.py +++ b/tests/resolver/test_resolve.py @@ -178,6 +178,14 @@ def test_exclude_incompatible_requirements(project, repository): assert "bar" not in result +def test_union_markers_from_different_parents(project, repository): + repository.add_candidate("foo", "0.1.0") + repository.add_dependencies("foo", "0.1.0", ["bar; python_version < '3'"]) + repository.add_candidate("bar", "0.1.0") + result = resolve_requirements(repository, ["foo", "bar"], ">=3.6") + assert not result["bar"].requires_python + + def test_requirements_from_different_sections(project, repository): repository.add_candidate("foo", "0.1.0") repository.add_candidate("foo", "0.2.0") -- GitLab