Skip to content

Commit af92b41

Browse files
authored
Merge pull request #13001 from notatallshaw/vendor-resolvelib-1.1.0
Vendor resolvelib 1.1.0
2 parents de44d99 + b4c2ffd commit af92b41

26 files changed

+624
-625
lines changed

docs/html/topics/more-dependency-resolution.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,6 @@ follows:
160160
explicit URL.
161161
* If equal, prefer if any requirement is "pinned", i.e. contains
162162
operator ``===`` or ``==``.
163-
* If equal, calculate an approximate "depth" and resolve requirements
164-
closer to the user-specified requirements first.
165163
* Order user-specified requirements by the order they are specified.
166164
* If equal, prefers "non-free" requirements, i.e. contains at least one
167165
operator, such as ``>=`` or ``<``.

news/13001.bugfix.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Resolvelib 1.1.0 fixes a known issue where pip would report a
2+
ResolutionImpossible error even though there is a valid solution.
3+
However, some very complex dependency resolutions that previously
4+
resolved may resolve slower or fail with an ResolutionTooDeep error.

news/resolvelib.vendor.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Upgrade resolvelib to 1.1.0.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -748,7 +748,7 @@ def get_installation_error(
748748
# The simplest case is when we have *one* cause that can't be
749749
# satisfied. We just report that case.
750750
if len(e.causes) == 1:
751-
req, parent = e.causes[0]
751+
req, parent = next(iter(e.causes))
752752
if req.name not in constraints:
753753
return self._report_single_requirement_conflict(req, parent)
754754

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

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import collections
21
import math
32
from functools import lru_cache
43
from typing import (
@@ -100,7 +99,6 @@ def __init__(
10099
self._ignore_dependencies = ignore_dependencies
101100
self._upgrade_strategy = upgrade_strategy
102101
self._user_requested = user_requested
103-
self._known_depths: Dict[str, float] = collections.defaultdict(lambda: math.inf)
104102

105103
def identify(self, requirement_or_candidate: Union[Requirement, Candidate]) -> str:
106104
return requirement_or_candidate.name
@@ -124,10 +122,6 @@ def get_preference(
124122
explicit URL.
125123
* If equal, prefer if any requirement is "pinned", i.e. contains
126124
operator ``===`` or ``==``.
127-
* If equal, calculate an approximate "depth" and resolve requirements
128-
closer to the user-specified requirements first. If the depth cannot
129-
by determined (eg: due to no matching parents), it is considered
130-
infinite.
131125
* Order user-specified requirements by the order they are specified.
132126
* If equal, prefers "non-free" requirements, i.e. contains at least one
133127
operator, such as ``>=`` or ``<``.
@@ -157,23 +151,6 @@ def get_preference(
157151
direct = candidate is not None
158152
pinned = any(op[:2] == "==" for op in operators)
159153
unfree = bool(operators)
160-
161-
try:
162-
requested_order: Union[int, float] = self._user_requested[identifier]
163-
except KeyError:
164-
requested_order = math.inf
165-
if has_information:
166-
parent_depths = (
167-
self._known_depths[parent.name] if parent is not None else 0.0
168-
for _, parent in information[identifier]
169-
)
170-
inferred_depth = min(d for d in parent_depths) + 1.0
171-
else:
172-
inferred_depth = math.inf
173-
else:
174-
inferred_depth = 1.0
175-
self._known_depths[identifier] = inferred_depth
176-
177154
requested_order = self._user_requested.get(identifier, math.inf)
178155

179156
# Requires-Python has only one candidate and the check is basically
@@ -190,7 +167,6 @@ def get_preference(
190167
not direct,
191168
not pinned,
192169
not backtrack_cause,
193-
inferred_depth,
194170
requested_order,
195171
not unfree,
196172
identifier,

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from collections import defaultdict
22
from logging import getLogger
3-
from typing import Any, DefaultDict
3+
from typing import Any, DefaultDict, Optional
44

55
from pip._vendor.resolvelib.reporters import BaseReporter
66

@@ -9,7 +9,7 @@
99
logger = getLogger(__name__)
1010

1111

12-
class PipReporter(BaseReporter):
12+
class PipReporter(BaseReporter[Requirement, Candidate, str]):
1313
def __init__(self) -> None:
1414
self.reject_count_by_package: DefaultDict[str, int] = defaultdict(int)
1515

@@ -55,7 +55,7 @@ def rejecting_candidate(self, criterion: Any, candidate: Candidate) -> None:
5555
logger.debug(msg)
5656

5757

58-
class PipDebuggingReporter(BaseReporter):
58+
class PipDebuggingReporter(BaseReporter[Requirement, Candidate, str]):
5959
"""A reporter that does an info log for every event it sees."""
6060

6161
def starting(self) -> None:
@@ -71,7 +71,9 @@ def ending_round(self, index: int, state: Any) -> None:
7171
def ending(self, state: Any) -> None:
7272
logger.info("Reporter.ending(%r)", state)
7373

74-
def adding_requirement(self, requirement: Requirement, parent: Candidate) -> None:
74+
def adding_requirement(
75+
self, requirement: Requirement, parent: Optional[Candidate]
76+
) -> None:
7577
logger.info("Reporter.adding_requirement(%r, %r)", requirement, parent)
7678

7779
def rejecting_candidate(self, criterion: Any, candidate: Candidate) -> None:

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def resolve(
8282
user_requested=collected.user_requested,
8383
)
8484
if "PIP_RESOLVER_DEBUG" in os.environ:
85-
reporter: BaseReporter = PipDebuggingReporter()
85+
reporter: BaseReporter[Requirement, Candidate, str] = PipDebuggingReporter()
8686
else:
8787
reporter = PipReporter()
8888
resolver: RLResolver[Requirement, Candidate, str] = RLResolver(

src/pip/_vendor/resolvelib/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@
1111
"ResolutionTooDeep",
1212
]
1313

14-
__version__ = "1.0.1"
14+
__version__ = "1.1.0"
1515

1616

17-
from .providers import AbstractProvider, AbstractResolver
17+
from .providers import AbstractProvider
1818
from .reporters import BaseReporter
1919
from .resolvers import (
20+
AbstractResolver,
2021
InconsistentCandidate,
2122
RequirementsConflicted,
2223
ResolutionError,

src/pip/_vendor/resolvelib/__init__.pyi

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/pip/_vendor/resolvelib/compat/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)