Skip to content

Commit 38b5645

Browse files
committed
Don't use KeyBasedCompareMixin
1 parent efab550 commit 38b5645

File tree

2 files changed

+35
-18
lines changed

2 files changed

+35
-18
lines changed

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
from pip._internal.req.req_install import InstallRequirement
2121
from pip._internal.utils.direct_url_helpers import direct_url_from_link
2222
from pip._internal.utils.misc import normalize_version_info
23-
from pip._internal.utils.models import KeyBasedCompareMixin
2423

2524
from .base import Candidate, CandidateVersion, Requirement, format_name
2625

@@ -325,7 +324,7 @@ def _prepare_distribution(self) -> BaseDistribution:
325324
return self._factory.preparer.prepare_editable_requirement(self._ireq)
326325

327326

328-
class AlreadyInstalledCandidate(Candidate, KeyBasedCompareMixin):
327+
class AlreadyInstalledCandidate(Candidate):
329328
is_installed = True
330329
source_link = None
331330

@@ -347,16 +346,20 @@ def __init__(
347346
skip_reason = "already satisfied"
348347
factory.preparer.prepare_installed_requirement(self._ireq, skip_reason)
349348

350-
KeyBasedCompareMixin.__init__(
351-
self, key=(self.name, self.version), defining_class=self.__class__
352-
)
353-
354349
def __str__(self) -> str:
355350
return str(self.dist)
356351

357352
def __repr__(self) -> str:
358353
return f"{self.__class__.__name__}({self.dist!r})"
359354

355+
def __eq__(self, other: object) -> bool:
356+
if not isinstance(other, AlreadyInstalledCandidate):
357+
return NotImplemented
358+
return self.name == other.name and self.version == other.version
359+
360+
def __hash__(self) -> int:
361+
return hash((self.name, self.version))
362+
360363
@property
361364
def project_name(self) -> NormalizedName:
362365
return self.dist.canonical_name

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

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
from pip._internal.req.constructors import install_req_drop_extras
77
from pip._internal.req.req_install import InstallRequirement
8-
from pip._internal.utils.models import KeyBasedCompareMixin
98

109
from .base import Candidate, CandidateLookup, Requirement, format_name
1110

@@ -48,21 +47,26 @@ def is_satisfied_by(self, candidate: Candidate) -> bool:
4847
return candidate == self.candidate
4948

5049

51-
class SpecifierRequirement(Requirement, KeyBasedCompareMixin):
50+
class SpecifierRequirement(Requirement):
5251
def __init__(self, ireq: InstallRequirement) -> None:
5352
assert ireq.link is None, "This is a link, not a specifier"
5453
self._ireq = ireq
5554
self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras)
56-
KeyBasedCompareMixin.__init__(
57-
self, key=str(ireq), defining_class=SpecifierRequirement
58-
)
5955

6056
def __str__(self) -> str:
6157
return str(self._ireq.req)
6258

6359
def __repr__(self) -> str:
6460
return f"{self.__class__.__name__}({str(self._ireq.req)!r})"
6561

62+
def __eq__(self, other: object) -> bool:
63+
if not isinstance(other, SpecifierRequirement):
64+
return NotImplemented
65+
return str(self._ireq) == str(other._ireq)
66+
67+
def __hash__(self) -> int:
68+
return hash(str(self._ireq))
69+
6670
@property
6771
def project_name(self) -> NormalizedName:
6872
assert self._ireq.req, "Specifier-backed ireq is always PEP 508"
@@ -111,9 +115,14 @@ def __init__(self, ireq: InstallRequirement) -> None:
111115
assert ireq.link is None, "This is a link, not a specifier"
112116
self._ireq = install_req_drop_extras(ireq)
113117
self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras)
114-
KeyBasedCompareMixin.__init__(
115-
self, key=str(ireq), defining_class=SpecifierRequirement
116-
)
118+
119+
def __eq__(self, other: object) -> bool:
120+
if not isinstance(other, SpecifierWithoutExtrasRequirement):
121+
return NotImplemented
122+
return str(self._ireq) == str(other._ireq)
123+
124+
def __hash__(self) -> int:
125+
return hash(str(self._ireq))
117126

118127

119128
class RequiresPythonRequirement(Requirement):
@@ -165,21 +174,26 @@ def is_satisfied_by(self, candidate: Candidate) -> bool:
165174
return self.specifier.contains(candidate.version, prereleases=True)
166175

167176

168-
class UnsatisfiableRequirement(Requirement, KeyBasedCompareMixin):
177+
class UnsatisfiableRequirement(Requirement):
169178
"""A requirement that cannot be satisfied."""
170179

171180
def __init__(self, name: NormalizedName) -> None:
172181
self._name = name
173-
KeyBasedCompareMixin.__init__(
174-
self, key=str(name), defining_class=UnsatisfiableRequirement
175-
)
176182

177183
def __str__(self) -> str:
178184
return f"{self._name} (unavailable)"
179185

180186
def __repr__(self) -> str:
181187
return f"{self.__class__.__name__}({str(self._name)!r})"
182188

189+
def __eq__(self, other: object) -> bool:
190+
if not isinstance(other, UnsatisfiableRequirement):
191+
return NotImplemented
192+
return self._name == other._name
193+
194+
def __hash__(self) -> int:
195+
return hash(self._name)
196+
183197
@property
184198
def project_name(self) -> NormalizedName:
185199
return self._name

0 commit comments

Comments
 (0)