Skip to content

Commit 35bc403

Browse files
committed
When resolving entry points globally, only expose entry points for unique distributions. Fixes #280.
1 parent 9950845 commit 35bc403

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

.coveragerc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ omit =
33
*/.tox/*
44
tests/*
55
prepare/*
6+
*/_itertools.py
67

78
[report]
89
show_missing = True

importlib_metadata/__init__.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
Protocol,
2020
)
2121

22+
from ._itertools import unique_everseen
23+
2224
from configparser import ConfigParser
2325
from contextlib import suppress
2426
from importlib import import_module
@@ -646,7 +648,10 @@ def entry_points():
646648
647649
:return: EntryPoint objects for all installed packages.
648650
"""
649-
eps = itertools.chain.from_iterable(dist.entry_points for dist in distributions())
651+
unique = functools.partial(unique_everseen, key=operator.attrgetter('name'))
652+
eps = itertools.chain.from_iterable(
653+
dist.entry_points for dist in unique(distributions())
654+
)
650655
by_group = operator.attrgetter('group')
651656
ordered = sorted(eps, key=by_group)
652657
grouped = itertools.groupby(ordered, by_group)

importlib_metadata/_itertools.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from itertools import filterfalse
2+
3+
4+
def unique_everseen(iterable, key=None):
5+
"List unique elements, preserving order. Remember all elements ever seen."
6+
# unique_everseen('AAAABBBCCDAABBB') --> A B C D
7+
# unique_everseen('ABBCcAD', str.lower) --> A B C D
8+
seen = set()
9+
seen_add = seen.add
10+
if key is None:
11+
for element in filterfalse(seen.__contains__, iterable):
12+
seen_add(element)
13+
yield element
14+
else:
15+
for element in iterable:
16+
k = key(element)
17+
if k not in seen:
18+
seen_add(k)
19+
yield element

0 commit comments

Comments
 (0)