Skip to content

Commit 0fe32e1

Browse files
committed
Filter out redundant entries in zip_children. Closes #117.
1 parent 11b483d commit 0fe32e1

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

importlib_metadata/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
MetaPathFinder,
2929
email_message_from_string,
3030
PyPy_repr,
31+
unique_ordered,
3132
)
3233
from importlib import import_module
3334
from itertools import starmap
@@ -425,7 +426,7 @@ def zip_children(self):
425426
names = zip_path.root.namelist()
426427
self.joinpath = zip_path.joinpath
427428

428-
return (
429+
return unique_ordered(
429430
posixpath.split(child)[0]
430431
for child in names
431432
)

importlib_metadata/_compat.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@
1515
NotADirectoryError = builtins.NotADirectoryError
1616
PermissionError = builtins.PermissionError
1717
map = builtins.map
18+
from itertools import filterfalse
1819
else: # pragma: nocover
1920
from backports.configparser import ConfigParser
2021
from itertools import imap as map # type: ignore
22+
from itertools import ifilterfalse as filterfalse
2123
import contextlib2 as contextlib
2224
FileNotFoundError = IOError, OSError
2325
IsADirectoryError = IOError, OSError
@@ -131,3 +133,18 @@ def make_param(name):
131133
if affected: # pragma: nocover
132134
__repr__ = __compat_repr__
133135
del affected
136+
137+
138+
# from itertools recipes
139+
def unique_everseen(iterable):
140+
"List unique elements, preserving order. Remember all elements ever seen."
141+
seen = set()
142+
seen_add = seen.add
143+
144+
for element in filterfalse(seen.__contains__, iterable):
145+
seen_add(element)
146+
yield element
147+
148+
149+
unique_ordered = (
150+
unique_everseen if sys.version_info < (3, 7) else dict.fromkeys)

0 commit comments

Comments
 (0)