@@ -448,47 +448,29 @@ def zip_children(self):
448448
449449 return dict .fromkeys (child .split (posixpath .sep , 1 )[0 ] for child in names )
450450
451- def is_egg (self , search ):
452- base = self .base
451+ def search (self , name ):
453452 return (
454- base == search . versionless_egg_name
455- or base . startswith ( search . prefix )
456- and base . endswith ( '.egg' )
453+ self . joinpath ( child )
454+ for child in self . children ( )
455+ if name . matches ( child , self . base )
457456 )
458457
459- def search (self , name ):
460- for child in self .children ():
461- n_low = child .lower ()
462- if (
463- n_low in name .exact_matches
464- or n_low .replace ('.' , '_' ).startswith (name .prefix )
465- and n_low .endswith (name .suffixes )
466- # legacy case:
467- or self .is_egg (name )
468- and n_low == 'egg-info'
469- ):
470- yield self .joinpath (child )
471-
472458
473459class Prepared :
474460 """
475461 A prepared search for metadata on a possibly-named package.
476462 """
477463
478- normalized = ''
479- prefix = ''
464+ normalized = None
480465 suffixes = '.dist-info' , '.egg-info'
481466 exact_matches = ['' ][:0 ]
482- versionless_egg_name = ''
483467
484468 def __init__ (self , name ):
485469 self .name = name
486470 if name is None :
487471 return
488472 self .normalized = self .normalize (name )
489- self .prefix = self .normalized + '-'
490473 self .exact_matches = [self .normalized + suffix for suffix in self .suffixes ]
491- self .versionless_egg_name = self .normalized + '.egg'
492474
493475 @staticmethod
494476 def normalize (name ):
@@ -497,6 +479,37 @@ def normalize(name):
497479 """
498480 return re .sub (r"[-_.]+" , "-" , name ).lower ().replace ('-' , '_' )
499481
482+ @staticmethod
483+ def legacy_normalize (name ):
484+ """
485+ Normalize the package name as found in the convention in
486+ older packaging tools versions and specs.
487+ """
488+ return name .lower ().replace ('-' , '_' )
489+
490+ def matches (self , cand , base ):
491+ low = cand .lower ()
492+ pre , ext = os .path .splitext (low )
493+ name , sep , rest = pre .partition ('-' )
494+ return (
495+ low in self .exact_matches
496+ or ext in self .suffixes
497+ and (not self .normalized or name .replace ('.' , '_' ) == self .normalized )
498+ # legacy case:
499+ or self .is_egg (base )
500+ and low == 'egg-info'
501+ )
502+
503+ def is_egg (self , base ):
504+ normalized = self .legacy_normalize (self .name or '' )
505+ prefix = normalized + '-' if normalized else ''
506+ versionless_egg_name = normalized + '.egg' if self .name else ''
507+ return (
508+ base == versionless_egg_name
509+ or base .startswith (prefix )
510+ and base .endswith ('.egg' )
511+ )
512+
500513
501514@install
502515class MetadataPathFinder (NullFinder , DistributionFinder ):
0 commit comments