Skip to content

Commit 85ce4df

Browse files
authored
Merge pull request pypa#8374 from uranusjr/unsupported-link-with-marker
Correctly apply marker matching logic to all requirements
2 parents cdeb377 + 1719fc3 commit 85ce4df

File tree

6 files changed

+21
-27
lines changed

6 files changed

+21
-27
lines changed

src/pip/_internal/resolution/resolvelib/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def is_installed(self):
5555
raise NotImplementedError("Override in subclass")
5656

5757
def iter_dependencies(self):
58-
# type: () -> Iterable[Requirement]
58+
# type: () -> Iterable[Optional[Requirement]]
5959
raise NotImplementedError("Override in subclass")
6060

6161
def get_install_requirement(self):

src/pip/_internal/resolution/resolvelib/candidates.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ def _get_requires_python_specifier(self):
210210
return spec
211211

212212
def iter_dependencies(self):
213-
# type: () -> Iterable[Requirement]
213+
# type: () -> Iterable[Optional[Requirement]]
214214
for r in self.dist.requires():
215215
yield self._factory.make_requirement_from_spec(str(r), self._ireq)
216216
python_dep = self._factory.make_requires_python_requirement(
@@ -336,7 +336,7 @@ def version(self):
336336
return self.dist.parsed_version
337337

338338
def iter_dependencies(self):
339-
# type: () -> Iterable[Requirement]
339+
# type: () -> Iterable[Optional[Requirement]]
340340
for r in self.dist.requires():
341341
yield self._factory.make_requirement_from_spec(str(r), self._ireq)
342342

@@ -418,7 +418,7 @@ def is_installed(self):
418418
return self.base.is_installed
419419

420420
def iter_dependencies(self):
421-
# type: () -> Iterable[Requirement]
421+
# type: () -> Iterable[Optional[Requirement]]
422422
factory = self.base._factory
423423

424424
# The user may have specified extras that the candidate doesn't
@@ -438,7 +438,7 @@ def iter_dependencies(self):
438438
yield factory.make_requirement_from_candidate(self.base)
439439

440440
for r in self.base.dist.requires(valid_extras):
441-
requirement = factory.make_requirement_from_spec_matching_extras(
441+
requirement = factory.make_requirement_from_spec(
442442
str(r), self.base._ireq, valid_extras,
443443
)
444444
if requirement:
@@ -479,7 +479,7 @@ def version(self):
479479
return self._version
480480

481481
def iter_dependencies(self):
482-
# type: () -> Iterable[Requirement]
482+
# type: () -> Iterable[Optional[Requirement]]
483483
return ()
484484

485485
def get_install_requirement(self):

src/pip/_internal/resolution/resolvelib/factory.py

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,14 @@ def find_candidates(self, requirements, constraint):
233233
if all(req.is_satisfied_by(c) for req in requirements)
234234
)
235235

236-
def make_requirement_from_install_req(self, ireq):
237-
# type: (InstallRequirement) -> Requirement
236+
def make_requirement_from_install_req(self, ireq, requested_extras):
237+
# type: (InstallRequirement, Iterable[str]) -> Optional[Requirement]
238+
if not ireq.match_markers(requested_extras):
239+
logger.info(
240+
"Ignoring %s: markers '%s' don't match your environment",
241+
ireq.name, ireq.markers,
242+
)
243+
return None
238244
if not ireq.link:
239245
return SpecifierRequirement(ireq)
240246
cand = self._make_candidate_from_link(
@@ -250,26 +256,15 @@ def make_requirement_from_candidate(self, candidate):
250256
# type: (Candidate) -> ExplicitRequirement
251257
return ExplicitRequirement(candidate)
252258

253-
def make_requirement_from_spec(self, specifier, comes_from):
254-
# type: (str, InstallRequirement) -> Requirement
255-
ireq = self._make_install_req_from_spec(specifier, comes_from)
256-
return self.make_requirement_from_install_req(ireq)
257-
258-
def make_requirement_from_spec_matching_extras(
259+
def make_requirement_from_spec(
259260
self,
260261
specifier, # type: str
261262
comes_from, # type: InstallRequirement
262263
requested_extras=(), # type: Iterable[str]
263264
):
264265
# type: (...) -> Optional[Requirement]
265266
ireq = self._make_install_req_from_spec(specifier, comes_from)
266-
if not ireq.match_markers(requested_extras):
267-
logger.info(
268-
"Ignoring %s: markers '%s' don't match your environment",
269-
ireq.name, ireq.markers,
270-
)
271-
return None
272-
return self.make_requirement_from_install_req(ireq)
267+
return self.make_requirement_from_install_req(ireq, requested_extras)
273268

274269
def make_requires_python_requirement(self, specifier):
275270
# type: (Optional[SpecifierSet]) -> Optional[Requirement]

src/pip/_internal/resolution/resolvelib/provider.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,4 @@ def get_dependencies(self, candidate):
147147
# type: (Candidate) -> Sequence[Requirement]
148148
if self._ignore_dependencies:
149149
return []
150-
return list(candidate.iter_dependencies())
150+
return [r for r in candidate.iter_dependencies() if r is not None]

src/pip/_internal/resolution/resolvelib/resolver.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,6 @@ def resolve(self, root_reqs, check_supported_wheels):
106106
user_requested = set() # type: Set[str]
107107
requirements = []
108108
for req in root_reqs:
109-
if not req.match_markers():
110-
continue
111109
if req.constraint:
112110
# Ensure we only accept valid constraints
113111
reject_invalid_constraint_types(req)
@@ -120,9 +118,11 @@ def resolve(self, root_reqs, check_supported_wheels):
120118
else:
121119
if req.is_direct and req.name:
122120
user_requested.add(canonicalize_name(req.name))
123-
requirements.append(
124-
self.factory.make_requirement_from_install_req(req)
121+
r = self.factory.make_requirement_from_install_req(
122+
req, requested_extras=(),
125123
)
124+
if r is not None:
125+
requirements.append(r)
126126

127127
provider = PipProvider(
128128
factory=self.factory,

tests/functional/test_install_reqs.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,6 @@ def test_install_distribution_union_conflicting_extras(script, data):
507507
assert "Conflict" in result.stderr
508508

509509

510-
@pytest.mark.fails_on_new_resolver
511510
def test_install_unsupported_wheel_link_with_marker(script):
512511
script.scratch_path.joinpath("with-marker.txt").write_text(
513512
textwrap.dedent("""\

0 commit comments

Comments
 (0)