diff options
author | Jason R. Coombs <jaraco@jaraco.com> | 2016-05-22 15:59:45 -0400 |
---|---|---|
committer | Jason R. Coombs <jaraco@jaraco.com> | 2016-05-22 15:59:45 -0400 |
commit | e75bb0594bad10cb307620359abcd3b5779ecfd2 (patch) | |
tree | 5b5df5f759c026ec72aaa50544e0ad76d9a9c229 | |
parent | 1af011b1f1dac17485c0cf8fe9eb08c43b5b6f2a (diff) | |
download | external_python_setuptools-e75bb0594bad10cb307620359abcd3b5779ecfd2.tar.gz external_python_setuptools-e75bb0594bad10cb307620359abcd3b5779ecfd2.tar.bz2 external_python_setuptools-e75bb0594bad10cb307620359abcd3b5779ecfd2.zip |
Re-use unique_everseen from itertools recipes.
-rw-r--r-- | setuptools/command/build_py.py | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/setuptools/command/build_py.py b/setuptools/command/build_py.py index 1db0acb9..758a3fdf 100644 --- a/setuptools/command/build_py.py +++ b/setuptools/command/build_py.py @@ -6,10 +6,9 @@ import fnmatch import textwrap import io import distutils.errors -import collections import itertools -from setuptools.extern.six.moves import map, filter +from setuptools.extern.six.moves import map, filter, filterfalse try: from setuptools.lib2to3_ex import Mixin2to3 @@ -204,14 +203,13 @@ class build_py(orig.build_py, Mixin2to3): # flatten the groups of matches into an iterable of matches matches = itertools.chain.from_iterable(match_groups) bad = set(matches) - seen = collections.defaultdict(itertools.count) - return [ + keepers = ( fn for fn in files if fn not in bad - # ditch dupes - and not next(seen[fn]) - ] + ) + # ditch dupes + return list(_unique_everseen(keepers)) @staticmethod def _get_platform_patterns(spec, package, src_dir): @@ -232,6 +230,25 @@ class build_py(orig.build_py, Mixin2to3): ) +# from Python docs +def _unique_everseen(iterable, key=None): + "List unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') --> A B C D + # unique_everseen('ABBCcAD', str.lower) --> A B C D + seen = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element + + def assert_relative(path): if not os.path.isabs(path): return path |