20
20
from pip ._internal .req .req_install import InstallRequirement
21
21
from pip ._internal .utils .direct_url_helpers import direct_url_from_link
22
22
from pip ._internal .utils .misc import normalize_version_info
23
+ from pip ._internal .utils .models import KeyBasedCompareMixin
23
24
24
25
from .base import Candidate , CandidateVersion , Requirement , format_name
25
26
@@ -325,7 +326,7 @@ def _prepare_distribution(self) -> BaseDistribution:
325
326
return self ._factory .preparer .prepare_editable_requirement (self ._ireq )
326
327
327
328
328
- class AlreadyInstalledCandidate (Candidate ):
329
+ class AlreadyInstalledCandidate (Candidate , KeyBasedCompareMixin ):
329
330
is_installed = True
330
331
source_link = None
331
332
@@ -347,20 +348,16 @@ def __init__(
347
348
skip_reason = "already satisfied"
348
349
factory .preparer .prepare_installed_requirement (self ._ireq , skip_reason )
349
350
351
+ KeyBasedCompareMixin .__init__ (
352
+ self , key = (self .name , self .version ), defining_class = self .__class__
353
+ )
354
+
350
355
def __str__ (self ) -> str :
351
356
return str (self .dist )
352
357
353
358
def __repr__ (self ) -> str :
354
359
return f"{ self .__class__ .__name__ } ({ self .dist !r} )"
355
360
356
- def __hash__ (self ) -> int :
357
- return hash ((self .__class__ , self .name , self .version ))
358
-
359
- def __eq__ (self , other : Any ) -> bool :
360
- if isinstance (other , self .__class__ ):
361
- return self .name == other .name and self .version == other .version
362
- return False
363
-
364
361
@property
365
362
def project_name (self ) -> NormalizedName :
366
363
return self .dist .canonical_name
0 commit comments