mirror of https://github.com/python/cpython
bpo-44246: Entry points performance improvements. (GH-26467)
From importlib_metadata 4.3.1.
This commit is contained in:
parent
142e5c5445
commit
410b70d39d
|
@ -493,6 +493,11 @@ class Distribution:
|
||||||
"""Return the 'Name' metadata for the distribution package."""
|
"""Return the 'Name' metadata for the distribution package."""
|
||||||
return self.metadata['Name']
|
return self.metadata['Name']
|
||||||
|
|
||||||
|
@property
|
||||||
|
def _normalized_name(self):
|
||||||
|
"""Return a normalized version of the name."""
|
||||||
|
return Prepared.normalize(self.name)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def version(self):
|
def version(self):
|
||||||
"""Return the 'Version' metadata for the distribution package."""
|
"""Return the 'Version' metadata for the distribution package."""
|
||||||
|
@ -795,6 +800,22 @@ class PathDistribution(Distribution):
|
||||||
def locate_file(self, path):
|
def locate_file(self, path):
|
||||||
return self._path.parent / path
|
return self._path.parent / path
|
||||||
|
|
||||||
|
@property
|
||||||
|
def _normalized_name(self):
|
||||||
|
"""
|
||||||
|
Performance optimization: where possible, resolve the
|
||||||
|
normalized name from the file system path.
|
||||||
|
"""
|
||||||
|
stem = os.path.basename(str(self._path))
|
||||||
|
return self._name_from_stem(stem) or super()._normalized_name
|
||||||
|
|
||||||
|
def _name_from_stem(self, stem):
|
||||||
|
name, ext = os.path.splitext(stem)
|
||||||
|
if ext not in ('.dist-info', '.egg-info'):
|
||||||
|
return
|
||||||
|
name, sep, rest = stem.partition('-')
|
||||||
|
return name
|
||||||
|
|
||||||
|
|
||||||
def distribution(distribution_name):
|
def distribution(distribution_name):
|
||||||
"""Get the ``Distribution`` instance for the named package.
|
"""Get the ``Distribution`` instance for the named package.
|
||||||
|
@ -849,7 +870,8 @@ def entry_points(**params) -> Union[EntryPoints, SelectableGroups]:
|
||||||
|
|
||||||
:return: EntryPoints or SelectableGroups for all installed packages.
|
:return: EntryPoints or SelectableGroups for all installed packages.
|
||||||
"""
|
"""
|
||||||
unique = functools.partial(unique_everseen, key=operator.attrgetter('name'))
|
norm_name = operator.attrgetter('_normalized_name')
|
||||||
|
unique = functools.partial(unique_everseen, key=norm_name)
|
||||||
eps = itertools.chain.from_iterable(
|
eps = itertools.chain.from_iterable(
|
||||||
dist.entry_points for dist in unique(distributions())
|
dist.entry_points for dist in unique(distributions())
|
||||||
)
|
)
|
||||||
|
|
|
@ -76,3 +76,7 @@ class TestEgg(TestZip):
|
||||||
for file in files('example'):
|
for file in files('example'):
|
||||||
path = str(file.dist.locate_file(file))
|
path = str(file.dist.locate_file(file))
|
||||||
assert '.egg/' in path, path
|
assert '.egg/' in path, path
|
||||||
|
|
||||||
|
def test_normalized_name(self):
|
||||||
|
dist = distribution('example')
|
||||||
|
assert dist._normalized_name == 'example'
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
In importlib.metadata.entry_points, de-duplication of distributions no
|
||||||
|
longer requires loading the full metadata for PathDistribution objects,
|
||||||
|
improving entry point loading performance by ~10x.
|
Loading…
Reference in New Issue