Skip to content

Commit

Permalink
[3.10] gh-99130: Apply bugfixes from importlib_metadata 4.11.4. (#99132)
Browse files Browse the repository at this point in the history
  • Loading branch information
jaraco authored Nov 10, 2022
1 parent e6f066a commit 9a5ca31
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 9 deletions.
22 changes: 17 additions & 5 deletions Lib/importlib/metadata/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
from . import _adapters, _meta
from ._meta import PackageMetadata
from ._collections import FreezableDefaultDict, Pair
from ._functools import method_cache
from ._functools import method_cache, pass_none
from ._itertools import unique_everseen
from ._meta import PackageMetadata, SimplePath

Expand Down Expand Up @@ -938,13 +938,25 @@ def _normalized_name(self):
normalized name from the file system path.
"""
stem = os.path.basename(str(self._path))
return self._name_from_stem(stem) or super()._normalized_name
return (
pass_none(Prepared.normalize)(self._name_from_stem(stem))
or super()._normalized_name
)

def _name_from_stem(self, stem):
name, ext = os.path.splitext(stem)
@staticmethod
def _name_from_stem(stem):
"""
>>> PathDistribution._name_from_stem('foo-3.0.egg-info')
'foo'
>>> PathDistribution._name_from_stem('CherryPy-3.0.dist-info')
'CherryPy'
>>> PathDistribution._name_from_stem('face.egg-info')
'face'
"""
filename, ext = os.path.splitext(stem)
if ext not in ('.dist-info', '.egg-info'):
return
name, sep, rest = stem.partition('-')
name, sep, rest = filename.partition('-')
return name


Expand Down
19 changes: 19 additions & 0 deletions Lib/importlib/metadata/_functools.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,22 @@ def wrapper(self, *args, **kwargs):
wrapper.cache_clear = lambda: None

return wrapper


# From jaraco.functools 3.3
def pass_none(func):
"""
Wrap func so it's not called if its first param is None
>>> print_text = pass_none(print)
>>> print_text('text')
text
>>> print_text(None)
"""

@functools.wraps(func)
def wrapper(param, *args, **kwargs):
if param is not None:
return func(param, *args, **kwargs)

return wrapper
10 changes: 6 additions & 4 deletions Lib/test/test_importlib/test_metadata_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,13 +89,15 @@ def test_entry_points_distribution(self):
self.assertIn(ep.dist.name, ('distinfo-pkg', 'egginfo-pkg'))
self.assertEqual(ep.dist.version, "1.0.0")

def test_entry_points_unique_packages(self):
# Entry points should only be exposed for the first package
# on sys.path with a given name.
def test_entry_points_unique_packages_normalized(self):
"""
Entry points should only be exposed for the first package
on sys.path with a given name (even when normalized).
"""
alt_site_dir = self.fixtures.enter_context(fixtures.tempdir())
self.fixtures.enter_context(self.add_sys_path(alt_site_dir))
alt_pkg = {
"distinfo_pkg-1.1.0.dist-info": {
"DistInfo_pkg-1.1.0.dist-info": {
"METADATA": """
Name: distinfo-pkg
Version: 1.1.0
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Apply bugfixes from `importlib_metadata 4.11.4
<https://importlib-metadata.readthedocs.io/en/latest/history.html#v4-11-4>`_,
namely: In ``PathDistribution._name_from_stem``, avoid including parts of
the extension in the result. In ``PathDistribution._normalized_name``,
ensure names loaded from the stem of the filename are also normalized,
ensuring duplicate entry points by packages varying only by non-normalized
name are hidden.

0 comments on commit 9a5ca31

Please sign in to comment.