From d589795834bd36d057f51b2b65643f8c44726e1f Mon Sep 17 00:00:00 2001 From: Tzu-ping Chung Date: Wed, 4 Nov 2020 00:29:19 +0800 Subject: [PATCH] Allow constraining an explicit requirement --- src/pip/_internal/resolution/resolvelib/base.py | 7 +++++++ src/pip/_internal/resolution/resolvelib/factory.py | 10 ++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/pip/_internal/resolution/resolvelib/base.py b/src/pip/_internal/resolution/resolvelib/base.py index 7c09cd70b..e2edbe9f4 100644 --- a/src/pip/_internal/resolution/resolvelib/base.py +++ b/src/pip/_internal/resolution/resolvelib/base.py @@ -58,6 +58,13 @@ class Constraint(object): hashes = self.hashes & other.hashes(trust_internet=False) return Constraint(specifier, hashes) + def is_satisfied_by(self, candidate): + # type: (Candidate) -> bool + # We can safely always allow prereleases here since PackageFinder + # already implements the prerelease logic, and would have filtered out + # prerelease candidates if the user does not expect them. + return self.specifier.contains(candidate.version, prereleases=True) + class Requirement(object): @property diff --git a/src/pip/_internal/resolution/resolvelib/factory.py b/src/pip/_internal/resolution/resolvelib/factory.py index c65cb7f76..f4177d981 100644 --- a/src/pip/_internal/resolution/resolvelib/factory.py +++ b/src/pip/_internal/resolution/resolvelib/factory.py @@ -235,16 +235,10 @@ class Factory(object): prefers_installed, ) - if constraint: - name = explicit_candidates.pop().name - raise InstallationError( - "Could not satisfy constraints for {!r}: installation from " - "path or url cannot be constrained to a version".format(name) - ) - return ( c for c in explicit_candidates - if all(req.is_satisfied_by(c) for req in requirements) + if constraint.is_satisfied_by(c) + and all(req.is_satisfied_by(c) for req in requirements) ) def make_requirement_from_install_req(self, ireq, requested_extras):