2020-03-09 10:06:32 +01:00
|
|
|
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
|
2020-03-09 10:06:32 +01:00
|
|
|
|
|
|
|
if MYPY_CHECK_RUNNING:
|
2020-03-12 16:18:47 +01:00
|
|
|
from typing import Sequence
|
2020-03-09 10:06:32 +01:00
|
|
|
|
|
|
|
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)
|
2020-03-09 10:06:32 +01:00
|
|
|
else:
|
2020-03-12 16:18:47 +01:00
|
|
|
return SpecifierRequirement(
|
|
|
|
ireq,
|
|
|
|
finder,
|
|
|
|
preparer,
|
|
|
|
make_install_req
|
|
|
|
)
|
2020-03-09 10:06:32 +01:00
|
|
|
|
|
|
|
|
2020-03-12 16:18:47 +01:00
|
|
|
class ExplicitRequirement(Requirement):
|
|
|
|
def __init__(self, candidate):
|
|
|
|
# type: (Candidate) -> None
|
|
|
|
self.candidate = candidate
|
2020-03-09 10:06:32 +01:00
|
|
|
|
|
|
|
@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]
|
2020-03-09 10:06:32 +01:00
|
|
|
|
|
|
|
def is_satisfied_by(self, candidate):
|
|
|
|
# type: (Candidate) -> bool
|
2020-03-12 16:18:47 +01:00
|
|
|
return candidate == self.candidate
|
2020-03-09 10:06:32 +01:00
|
|
|
|
|
|
|
|
2020-03-12 16:18:47 +01:00
|
|
|
class SpecifierRequirement(Requirement):
|
|
|
|
def __init__(
|
2020-03-09 10:06:32 +01:00
|
|
|
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-09 10:06:32 +01:00
|
|
|
):
|
2020-03-12 16:18:47 +01:00
|
|
|
# type: (...) -> None
|
|
|
|
assert ireq.link is None, "This is a link, not a specifier"
|
2020-03-09 10:06:32 +01:00
|
|
|
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
|
2020-03-09 10:06:32 +01:00
|
|
|
|
|
|
|
@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-09 10:06:32 +01:00
|
|
|
|
2020-03-12 16:18:47 +01:00
|
|
|
def find_matches(self):
|
|
|
|
# type: () -> Sequence[Candidate]
|
|
|
|
found = self._finder.find_best_candidate(
|
2020-03-09 10:06:32 +01:00
|
|
|
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
|
|
|
)
|
2020-03-09 10:06:32 +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)
|
2020-03-09 10:06:32 +01:00
|
|
|
return candidate.version in self._ireq.req.specifier
|