From a3ad5f708054e1a86a97a086f8ec01c34549eed6 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 21 May 2022 11:56:47 -0400 Subject: [PATCH 1/2] Extract '_unique' for identifying unique distributions. --- importlib_metadata/__init__.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/importlib_metadata/__init__.py b/importlib_metadata/__init__.py index b1db5a6e..29ce1175 100644 --- a/importlib_metadata/__init__.py +++ b/importlib_metadata/__init__.py @@ -1015,6 +1015,15 @@ def version(distribution_name): return distribution(distribution_name).version +_unique = functools.partial( + unique_everseen, + key=operator.attrgetter('_normalized_name'), +) +""" +Wrapper for ``distributions`` to return unique distributions by name. +""" + + def entry_points(**params) -> Union[EntryPoints, SelectableGroups]: """Return EntryPoint objects for all installed packages. @@ -1032,10 +1041,8 @@ def entry_points(**params) -> Union[EntryPoints, SelectableGroups]: :return: EntryPoints or SelectableGroups for all installed packages. """ - norm_name = operator.attrgetter('_normalized_name') - unique = functools.partial(unique_everseen, key=norm_name) eps = itertools.chain.from_iterable( - dist.entry_points for dist in unique(distributions()) + dist.entry_points for dist in _unique(distributions()) ) return SelectableGroups.load(eps).select(**params) From da980921eaf63bdaf5b0242356a85ba815cb930d Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 21 May 2022 12:15:34 -0400 Subject: [PATCH 2/2] Add test for _unique. --- tests/test_main.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/test_main.py b/tests/test_main.py index c88ce35a..215662dd 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -13,6 +13,7 @@ EntryPoint, MetadataPathFinder, PackageNotFoundError, + _unique, distributions, entry_points, metadata, @@ -105,6 +106,21 @@ def test_dist_name_found_as_any_case(self): assert version(pkg_name.lower()) == '1.0' assert version(pkg_name.upper()) == '1.0' + def test_unique_distributions(self): + """ + Two distributions varying only by non-normalized name on + the file system should resolve as the same. + """ + fixtures.build_files(self.make_pkg('abc'), self.site_dir) + before = list(_unique(distributions())) + + alt_site_dir = self.fixtures.enter_context(fixtures.tempdir()) + self.fixtures.enter_context(self.add_sys_path(alt_site_dir)) + fixtures.build_files(self.make_pkg('ABC'), alt_site_dir) + after = list(_unique(distributions())) + + assert len(after) == len(before) + class NonASCIITests(fixtures.OnSysPath, fixtures.SiteDir, unittest.TestCase): @staticmethod