Skip to content

Commit

Permalink
bpo-47004: Sync with importlib_metadata 4.11.3. (python#31854)
Browse files Browse the repository at this point in the history
  • Loading branch information
jaraco authored Mar 13, 2022
1 parent c99ac3c commit b1e2868
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 18 deletions.
1 change: 1 addition & 0 deletions Doc/library/importlib.metadata.rst
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,7 @@ Python packages or modules::

.. versionadded:: 3.10

.. _distributions:

Distributions
=============
Expand Down
57 changes: 39 additions & 18 deletions Lib/importlib/metadata/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,15 @@ class EntryPoint(DeprecatedTuple):
See `the packaging docs on entry points
<https://packaging.python.org/specifications/entry-points/>`_
for more information.
>>> ep = EntryPoint(
... name=None, group=None, value='package.module:attr [extra1, extra2]')
>>> ep.module
'package.module'
>>> ep.attr
'attr'
>>> ep.extras
['extra1', 'extra2']
"""

pattern = re.compile(
Expand Down Expand Up @@ -203,7 +212,7 @@ def attr(self):
@property
def extras(self):
match = self.pattern.match(self.value)
return list(re.finditer(r'\w+', match.group('extras') or ''))
return re.findall(r'\w+', match.group('extras') or '')

def _for(self, dist):
vars(self).update(dist=dist)
Expand All @@ -221,6 +230,25 @@ def __iter__(self):
return iter((self.name, self))

def matches(self, **params):
"""
EntryPoint matches the given parameters.
>>> ep = EntryPoint(group='foo', name='bar', value='bing:bong [extra1, extra2]')
>>> ep.matches(group='foo')
True
>>> ep.matches(name='bar', value='bing:bong [extra1, extra2]')
True
>>> ep.matches(group='foo', name='other')
False
>>> ep.matches()
True
>>> ep.matches(extras=['extra1', 'extra2'])
True
>>> ep.matches(module='bing')
True
>>> ep.matches(attr='bong')
True
"""
attrs = (getattr(self, param) for param in params)
return all(map(operator.eq, params.values(), attrs))

Expand Down Expand Up @@ -292,21 +320,15 @@ def wrapped(self, *args, **kwargs):
self._warn()
return getattr(super(), method_name)(*args, **kwargs)

return wrapped

for method_name in [
'__setitem__',
'__delitem__',
'append',
'reverse',
'extend',
'pop',
'remove',
'__iadd__',
'insert',
'sort',
]:
locals()[method_name] = _wrap_deprecated_method(method_name)
return method_name, wrapped

locals().update(
map(
_wrap_deprecated_method,
'__setitem__ __delitem__ append reverse extend pop remove '
'__iadd__ insert sort'.split(),
)
)

def __add__(self, other):
if not isinstance(other, tuple):
Expand Down Expand Up @@ -660,7 +682,7 @@ def _read_dist_info_reqs(self):

def _read_egg_info_reqs(self):
source = self.read_text('requires.txt')
return source and self._deps_from_requires_text(source)
return pass_none(self._deps_from_requires_text)(source)

@classmethod
def _deps_from_requires_text(cls, source):
Expand Down Expand Up @@ -765,7 +787,6 @@ def __new__(cls, root):

def __init__(self, root):
self.root = root
self.base = os.path.basename(self.root).lower()

def joinpath(self, child):
return pathlib.Path(self.root, child)
Expand Down
10 changes: 10 additions & 0 deletions Lib/test/test_importlib/test_metadata_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,16 @@ def test_requires_egg_info(self):
assert len(deps) == 2
assert any(dep == 'wheel >= 1.0; python_version >= "2.7"' for dep in deps)

def test_requires_egg_info_empty(self):
fixtures.build_files(
{
'requires.txt': '',
},
self.site_dir.joinpath('egginfo_pkg.egg-info'),
)
deps = requires('egginfo-pkg')
assert deps == []

def test_requires_dist_info(self):
deps = requires('distinfo-pkg')
assert len(deps) == 2
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Apply bugfixes from importlib_metadata 4.11.3, including bugfix for
EntryPoint.extras, which was returning match objects and not the extras
strings.

0 comments on commit b1e2868

Please sign in to comment.