mirror of https://github.com/pypa/pip
Merge pull request #8758 from uranusjr/new-resolver-requires-python-when-no-deps
This commit is contained in:
parent
0a637fa89a
commit
4aec7e81c9
|
@ -0,0 +1,2 @@
|
||||||
|
New resolver: Correctly respect ``Requires-Python`` metadata to reject
|
||||||
|
incompatible packages in ``--no-deps`` mode.
|
|
@ -261,31 +261,25 @@ class _InstallRequirementBackedCandidate(Candidate):
|
||||||
self._fetch_metadata()
|
self._fetch_metadata()
|
||||||
return self._dist
|
return self._dist
|
||||||
|
|
||||||
def _get_requires_python_specifier(self):
|
def _get_requires_python_dependency(self):
|
||||||
# type: () -> Optional[SpecifierSet]
|
# type: () -> Optional[Requirement]
|
||||||
requires_python = get_requires_python(self.dist)
|
requires_python = get_requires_python(self.dist)
|
||||||
if requires_python is None:
|
if requires_python is None:
|
||||||
return None
|
return None
|
||||||
try:
|
try:
|
||||||
spec = SpecifierSet(requires_python)
|
spec = SpecifierSet(requires_python)
|
||||||
except InvalidSpecifier as e:
|
except InvalidSpecifier as e:
|
||||||
logger.warning(
|
message = "Package %r has an invalid Requires-Python: %s"
|
||||||
"Package %r has an invalid Requires-Python: %s", self.name, e,
|
logger.warning(message, self.name, e)
|
||||||
)
|
|
||||||
return None
|
return None
|
||||||
return spec
|
return self._factory.make_requires_python_requirement(spec)
|
||||||
|
|
||||||
def iter_dependencies(self, with_requires):
|
def iter_dependencies(self, with_requires):
|
||||||
# type: (bool) -> Iterable[Optional[Requirement]]
|
# type: (bool) -> Iterable[Optional[Requirement]]
|
||||||
if not with_requires:
|
requires = self.dist.requires() if with_requires else ()
|
||||||
return
|
for r in requires:
|
||||||
for r in self.dist.requires():
|
|
||||||
yield self._factory.make_requirement_from_spec(str(r), self._ireq)
|
yield self._factory.make_requirement_from_spec(str(r), self._ireq)
|
||||||
python_dep = self._factory.make_requires_python_requirement(
|
yield self._get_requires_python_dependency()
|
||||||
self._get_requires_python_specifier(),
|
|
||||||
)
|
|
||||||
if python_dep:
|
|
||||||
yield python_dep
|
|
||||||
|
|
||||||
def get_install_requirement(self):
|
def get_install_requirement(self):
|
||||||
# type: () -> Optional[InstallRequirement]
|
# type: () -> Optional[InstallRequirement]
|
||||||
|
|
|
@ -988,3 +988,35 @@ def test_new_resolver_local_and_req(script):
|
||||||
source_dir, "pkg!=0.1.0",
|
source_dir, "pkg!=0.1.0",
|
||||||
expect_error=True,
|
expect_error=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_new_resolver_no_deps_checks_requires_python(script):
|
||||||
|
create_basic_wheel_for_package(
|
||||||
|
script,
|
||||||
|
"base",
|
||||||
|
"0.1.0",
|
||||||
|
depends=["dep"],
|
||||||
|
requires_python="<2", # Something that always fails.
|
||||||
|
)
|
||||||
|
create_basic_wheel_for_package(
|
||||||
|
script,
|
||||||
|
"dep",
|
||||||
|
"0.2.0",
|
||||||
|
)
|
||||||
|
|
||||||
|
result = script.pip(
|
||||||
|
"install",
|
||||||
|
"--use-feature=2020-resolver",
|
||||||
|
"--no-cache-dir",
|
||||||
|
"--no-index",
|
||||||
|
"--no-deps",
|
||||||
|
"--find-links", script.scratch_path,
|
||||||
|
"base",
|
||||||
|
expect_error=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
message = (
|
||||||
|
"Package 'base' requires a different Python: "
|
||||||
|
"{}.{}.{} not in '<2'".format(*sys.version_info[:3])
|
||||||
|
)
|
||||||
|
assert message in result.stderr
|
||||||
|
|
Loading…
Reference in New Issue