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
@@ -324,7 +325,7 @@ def _prepare_distribution(self) -> BaseDistribution:
324
325
return self ._factory .preparer .prepare_editable_requirement (self ._ireq )
325
326
326
327
327
- class AlreadyInstalledCandidate (Candidate ):
328
+ class AlreadyInstalledCandidate (Candidate , KeyBasedCompareMixin ):
328
329
is_installed = True
329
330
source_link = None
330
331
@@ -346,20 +347,16 @@ def __init__(
346
347
skip_reason = "already satisfied"
347
348
factory .preparer .prepare_installed_requirement (self ._ireq , skip_reason )
348
349
350
+ KeyBasedCompareMixin .__init__ (
351
+ self , key = (self .name , self .version ), defining_class = self .__class__
352
+ )
353
+
349
354
def __str__ (self ) -> str :
350
355
return str (self .dist )
351
356
352
357
def __repr__ (self ) -> str :
353
358
return f"{ self .__class__ .__name__ } ({ self .dist !r} )"
354
359
355
- def __hash__ (self ) -> int :
356
- return hash ((self .__class__ , self .name , self .version ))
357
-
358
- def __eq__ (self , other : Any ) -> bool :
359
- if isinstance (other , self .__class__ ):
360
- return self .name == other .name and self .version == other .version
361
- return False
362
-
363
360
@property
364
361
def project_name (self ) -> NormalizedName :
365
362
return self .dist .canonical_name
0 commit comments