Skip to content

Commit a49252b

Browse files
committed
Add explicit interfaces for loaded entrypoints, resolvable first by group then by name.
1 parent 9950845 commit a49252b

File tree

1 file changed

+24
-5
lines changed

1 file changed

+24
-5
lines changed

importlib_metadata/__init__.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,27 @@ def __reduce__(self):
153153
)
154154

155155

156+
class EntryPoints(tuple):
157+
"""
158+
A collection of EntryPoint objects, retrievable by name.
159+
"""
160+
161+
def __getitem__(self, name) -> EntryPoint:
162+
try:
163+
return next(ep for ep in self if ep.name == name)
164+
except Exception:
165+
raise KeyError(name)
166+
167+
168+
class GroupedEntryPoints(tuple):
169+
"""
170+
A collection of EntryPoint objects, retrievable by group.
171+
"""
172+
173+
def __getitem__(self, group) -> EntryPoints:
174+
return EntryPoints(ep for ep in self if ep.group == group)
175+
176+
156177
class PackagePath(pathlib.PurePosixPath):
157178
"""A reference to a path in a package"""
158179

@@ -308,7 +329,8 @@ def version(self):
308329

309330
@property
310331
def entry_points(self):
311-
return list(EntryPoint._from_text_for(self.read_text('entry_points.txt'), self))
332+
eps = EntryPoint._from_text_for(self.read_text('entry_points.txt'), self)
333+
return GroupedEntryPoints(eps)
312334

313335
@property
314336
def files(self):
@@ -647,10 +669,7 @@ def entry_points():
647669
:return: EntryPoint objects for all installed packages.
648670
"""
649671
eps = itertools.chain.from_iterable(dist.entry_points for dist in distributions())
650-
by_group = operator.attrgetter('group')
651-
ordered = sorted(eps, key=by_group)
652-
grouped = itertools.groupby(ordered, by_group)
653-
return {group: tuple(eps) for group, eps in grouped}
672+
return GroupedEntryPoints(eps)
654673

655674

656675
def files(distribution_name):

0 commit comments

Comments
 (0)