Skip to content

Commit e16867e

Browse files
committed
Use the caching variant of is_satified_by in Factory.find_candidates
1 parent f5480f1 commit e16867e

File tree

3 files changed

+14
-1
lines changed

3 files changed

+14
-1
lines changed

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import logging
44
from typing import (
55
TYPE_CHECKING,
6+
Callable,
67
Dict,
78
FrozenSet,
89
Iterable,
@@ -391,6 +392,7 @@ def find_candidates(
391392
incompatibilities: Mapping[str, Iterator[Candidate]],
392393
constraint: Constraint,
393394
prefers_installed: bool,
395+
is_satisfied_by: Callable[[Requirement, Candidate], bool],
394396
) -> Iterable[Candidate]:
395397
# Collect basic lookup information from the requirements.
396398
explicit_candidates: Set[Candidate] = set()
@@ -456,7 +458,7 @@ def find_candidates(
456458
for c in explicit_candidates
457459
if id(c) not in incompat_ids
458460
and constraint.is_satisfied_by(c)
459-
and all(req.is_satisfied_by(c) for req in requirements[identifier])
461+
and all(is_satisfied_by(req, c) for req in requirements[identifier])
460462
)
461463

462464
def _make_requirements_from_install_req(

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

+1
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ def _eligible_for_upgrade(identifier: str) -> bool:
235235
constraint=constraint,
236236
prefers_installed=(not _eligible_for_upgrade(identifier)),
237237
incompatibilities=incompatibilities,
238+
is_satisfied_by=self.is_satisfied_by,
238239
)
239240

240241
@lru_cache(maxsize=None)

tests/unit/resolution_resolvelib/test_requirement.py

+10
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@
2323
# Editables
2424

2525

26+
def _is_satisfied_by(requirement: Requirement, candidate: Candidate) -> bool:
27+
"""A helper function to check if a requirement is satisfied by a candidate.
28+
29+
Used for mocking PipProvider.is_satified_by.
30+
"""
31+
return requirement.is_satisfied_by(candidate)
32+
33+
2634
@pytest.fixture
2735
def test_cases(data: TestData) -> Iterator[List[Tuple[str, str, int]]]:
2836
def _data_file(name: str) -> Path:
@@ -80,6 +88,7 @@ def test_new_resolver_correct_number_of_matches(
8088
{},
8189
Constraint.empty(),
8290
prefers_installed=False,
91+
is_satisfied_by=_is_satisfied_by,
8392
)
8493
assert sum(1 for _ in matches) == match_count
8594

@@ -98,6 +107,7 @@ def test_new_resolver_candidates_match_requirement(
98107
{},
99108
Constraint.empty(),
100109
prefers_installed=False,
110+
is_satisfied_by=_is_satisfied_by,
101111
)
102112
for c in candidates:
103113
assert isinstance(c, Candidate)

0 commit comments

Comments
 (0)