1
1
Fork 0
mirror of https://github.com/pypa/pip synced 2023-12-13 21:30:23 +01:00
pip/src/pip/_internal/resolution/resolvelib/requirements.py

110 lines
3.2 KiB
Python
Raw Normal View History

from pip._vendor.packaging.utils import canonicalize_name
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
2020-03-25 13:25:23 +01:00
from .base import Requirement, format_name
2020-03-12 16:18:47 +01:00
from .candidates import make_candidate
if MYPY_CHECK_RUNNING:
2020-03-12 16:18:47 +01:00
from typing import Sequence
from pip._internal.index.package_finder import PackageFinder
2020-03-12 16:18:47 +01:00
from pip._internal.operations.prepare import RequirementPreparer
from pip._internal.req.req_install import InstallRequirement
from pip._internal.resolution.base import InstallRequirementProvider
from .base import Candidate
def make_requirement(
ireq, # type: InstallRequirement
finder, # type: PackageFinder
preparer, # type: RequirementPreparer
make_install_req # type: InstallRequirementProvider
):
# type: (...) -> Requirement
if ireq.link:
candidate = make_candidate(
ireq.link,
preparer,
ireq,
2020-03-25 13:25:23 +01:00
make_install_req,
set()
2020-03-12 16:18:47 +01:00
)
return ExplicitRequirement(candidate)
else:
2020-03-12 16:18:47 +01:00
return SpecifierRequirement(
ireq,
finder,
preparer,
make_install_req
)
2020-03-12 16:18:47 +01:00
class ExplicitRequirement(Requirement):
def __init__(self, candidate):
# type: (Candidate) -> None
self.candidate = candidate
@property
def name(self):
# type: () -> str
2020-03-19 11:53:15 +01:00
# No need to canonicalise - the candidate did this
2020-03-12 16:18:47 +01:00
return self.candidate.name
def find_matches(self):
# type: () -> Sequence[Candidate]
return [self.candidate]
def is_satisfied_by(self, candidate):
# type: (Candidate) -> bool
2020-03-12 16:18:47 +01:00
return candidate == self.candidate
2020-03-12 16:18:47 +01:00
class SpecifierRequirement(Requirement):
def __init__(
self,
2020-03-12 16:18:47 +01:00
ireq, # type: InstallRequirement
finder, # type: PackageFinder
preparer, # type:RequirementPreparer
make_install_req # type: InstallRequirementProvider
):
2020-03-12 16:18:47 +01:00
# type: (...) -> None
assert ireq.link is None, "This is a link, not a specifier"
self._ireq = ireq
2020-03-12 16:18:47 +01:00
self._finder = finder
self._preparer = preparer
self._make_install_req = make_install_req
2020-03-25 13:25:23 +01:00
self.extras = ireq.req.extras
@property
def name(self):
# type: () -> str
canonical_name = canonicalize_name(self._ireq.req.name)
2020-03-25 13:25:23 +01:00
return format_name(canonical_name, self.extras)
2020-03-12 16:18:47 +01:00
def find_matches(self):
# type: () -> Sequence[Candidate]
found = self._finder.find_best_candidate(
project_name=self._ireq.req.name,
specifier=self._ireq.req.specifier,
hashes=self._ireq.hashes(trust_internet=False),
)
return [
2020-03-12 16:18:47 +01:00
make_candidate(
ican.link,
self._preparer,
self._ireq,
2020-03-25 13:25:23 +01:00
self._make_install_req,
self.extras
2020-03-12 16:18:47 +01:00
)
for ican in found.iter_applicable()
]
def is_satisfied_by(self, candidate):
# type: (Candidate) -> bool
2020-03-12 16:18:47 +01:00
assert candidate.name == self.name, \
2020-03-18 15:54:15 +01:00
"Internal issue: Candidate is not for this requirement " \
" {} vs {}".format(candidate.name, self.name)
return candidate.version in self._ireq.req.specifier