From b26db5e2fa87a1bd85eb8bcd5edd9f0af8a29874 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 14 Aug 2021 14:48:39 -0400 Subject: [PATCH 1/5] Add an 'example2' project built by trampolim. --- prepare/example2/example2/__init__.py | 2 ++ prepare/example2/pyproject.toml | 10 ++++++++++ tests/data/example2-1.0.0-py3-none-any.whl | Bin 0 -> 1167 bytes 3 files changed, 12 insertions(+) create mode 100644 prepare/example2/example2/__init__.py create mode 100644 prepare/example2/pyproject.toml create mode 100644 tests/data/example2-1.0.0-py3-none-any.whl diff --git a/prepare/example2/example2/__init__.py b/prepare/example2/example2/__init__.py new file mode 100644 index 00000000..de645c2e --- /dev/null +++ b/prepare/example2/example2/__init__.py @@ -0,0 +1,2 @@ +def main(): + return "example" diff --git a/prepare/example2/pyproject.toml b/prepare/example2/pyproject.toml new file mode 100644 index 00000000..011f4751 --- /dev/null +++ b/prepare/example2/pyproject.toml @@ -0,0 +1,10 @@ +[build-system] +build-backend = 'trampolim' +requires = ['trampolim'] + +[project] +name = 'example2' +version = '1.0.0' + +[project.scripts] +example = 'example2:main' diff --git a/tests/data/example2-1.0.0-py3-none-any.whl b/tests/data/example2-1.0.0-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..5ca93657f819601b83a57762db71d03dad12f78a GIT binary patch literal 1167 zcmWIWW@Zs#U|`^2h@Q$9ETws{LJ`OVVUTEQMPhD2PO6c9e0*kJW=VX!UO}a|r*H5H z-!o?}U)b^}h@olGl}VQt*|2`S(skrc)0~h}J%#|dk(*2Tg5y7Yys8g0$^>dG%t&2B zJp&+2$t*6>&CE;7*Y|Y|addGEas2G7>*?dE<9UVGTUYDcne&^23@#Zz`s97acWaQx zT8}fjCp=9bHJz4xCHX?KfDz5MzpI@lg#c{|1!6fM#%Wu)hpVfP=qX381_c3z1H0GX z;9nzg_m4wKcZZds58V*ju&HNFk+AXS9XpUc4~)G%DhBEQfRCIbeChj-ICy*M3ZtsFSrmBkh=j1cEb;Q7d&Ar$@L#zb9$Vue#oPCb0aL5c71K zRb5sBzwheY+{SQ7@b}`L8Pcy__>+KgTMyzlO=zO+(sU7k_Wpmh%gXI+`S`plJ6=}#w3+U_l2vF`iB zqo-v9ADM30!*%9D@)Xl3zF2Lkwa0c{FP|5G)j?_Q$FqTtW^_tTQu-Ku&G~Ua*rn%X zk01E{s@r+&z`y6NP4SD4uqS+B4)A7V5@E)j^nu|A21^=26f7MfX9Q#uu%&c}eg=jH z#$Y59aHe~7K4X*_)LYQ Vz5s7lHjoBZAZ!3C|H%a60RRCxggXEL literal 0 HcmV?d00001 From b379ff6754b11d8d046f3e91592b347e0b7b1a6c Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 14 Aug 2021 15:19:07 -0400 Subject: [PATCH 2/5] Add unit test for packages_distributions. --- tests/test_main.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test_main.py b/tests/test_main.py index f7c9c518..af9615eb 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -17,6 +17,7 @@ distributions, entry_points, metadata, + packages_distributions, version, ) @@ -282,3 +283,9 @@ def test_unicode_dir_on_sys_path(self): prefix=self.site_dir, ) list(distributions()) + + +class PackagesDistributionsTest(fixtures.ZipFixtures, unittest.TestCase): + def test_packages_distributions_example(self): + self._fixture_on_path('example-21.12-py3-none-any.whl') + assert packages_distributions()['example'] == ['example'] From 43afaebc2d2eca353045e34d029bdc0ebc1f9099 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 14 Aug 2021 15:23:49 -0400 Subject: [PATCH 3/5] Add failing test illustrating missed expectation. Ref #330. --- tests/fixtures.py | 2 +- tests/test_main.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/fixtures.py b/tests/fixtures.py index 03c44006..a5be07c8 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -301,7 +301,7 @@ class ZipFixtures: def _fixture_on_path(self, filename): pkg_file = resources.files(self.root).joinpath(filename) file = self.resources.enter_context(resources.as_file(pkg_file)) - assert file.name.startswith('example-'), file.name + assert file.name.startswith('example'), file.name sys.path.insert(0, str(file)) self.resources.callback(sys.path.pop, 0) diff --git a/tests/test_main.py b/tests/test_main.py index af9615eb..8426c48f 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -289,3 +289,11 @@ class PackagesDistributionsTest(fixtures.ZipFixtures, unittest.TestCase): def test_packages_distributions_example(self): self._fixture_on_path('example-21.12-py3-none-any.whl') assert packages_distributions()['example'] == ['example'] + + def test_packages_distributions_example2(self): + """ + Test packages_distributions on a wheel built + by trampolim. + """ + self._fixture_on_path('example2-1.0.0-py3-none-any.whl') + assert packages_distributions()['example2'] == ['example2'] From 1a8e808d5347707e195357df27677c85978bd1dd Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 14 Aug 2021 15:28:22 -0400 Subject: [PATCH 4/5] Add fallback to infer top-level names for a distribution. Fixes #330. --- importlib_metadata/__init__.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/importlib_metadata/__init__.py b/importlib_metadata/__init__.py index 9f5bf347..48a91c34 100644 --- a/importlib_metadata/__init__.py +++ b/importlib_metadata/__init__.py @@ -1013,6 +1013,18 @@ def packages_distributions() -> Mapping[str, List[str]]: """ pkg_to_dist = collections.defaultdict(list) for dist in distributions(): - for pkg in (dist.read_text('top_level.txt') or '').split(): + for pkg in _top_level_declared(dist) or _top_level_inferred(dist): pkg_to_dist[pkg].append(dist.metadata['Name']) return dict(pkg_to_dist) + + +def _top_level_declared(dist): + return (dist.read_text('top_level.txt') or '').split() + + +def _top_level_inferred(dist): + return { + f.parts[0] if len(f.parts) > 1 else f.with_suffix('').name + for f in dist.files + if f.suffix == ".py" + } From 73e5d6ed32b8d7c50f44999b3889b982c524b776 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Wed, 25 Aug 2021 20:27:19 -0400 Subject: [PATCH 5/5] Update changelog. --- CHANGES.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 0faf0a47..2f20b890 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,10 @@ +v4.7.0 +====== + +* #330: In ``packages_distributions``, now infer top-level + names from ``.files()`` when a ``top-level.txt`` + (Setuptools-specific metadata) is not present. + v4.6.4 ======