From 56aee0332f3a5a637b9de97a68f5b173f4ee8549 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filipe=20La=C3=ADns?= Date: Fri, 10 Mar 2023 00:57:43 +0000 Subject: [PATCH 1/4] Add missing modules to packages_distributions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Filipe LaĆ­ns --- importlib_metadata/__init__.py | 14 +++++++++----- tests/test_main.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/importlib_metadata/__init__.py b/importlib_metadata/__init__.py index 9a36a8e6..9428e7d0 100644 --- a/importlib_metadata/__init__.py +++ b/importlib_metadata/__init__.py @@ -13,6 +13,7 @@ import itertools import posixpath import collections +import inspect from . import _adapters, _meta, _py39compat from ._collections import FreezableDefaultDict, Pair @@ -897,8 +898,11 @@ def _top_level_declared(dist): def _top_level_inferred(dist): - return { - f.parts[0] if len(f.parts) > 1 else f.with_suffix('').name - for f in always_iterable(dist.files) - if f.suffix == ".py" - } + return filter( + None, + { + # this logic relies on the assumption that dist.files only contains files (not directories) + inspect.getmodulename(f) if len(f.parts) == 1 else f.parts[0] + for f in always_iterable(dist.files) + }, + ) diff --git a/tests/test_main.py b/tests/test_main.py index f0f84983..16367793 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -322,3 +322,34 @@ def test_packages_distributions_neither_toplevel_nor_files(self): prefix=self.site_dir, ) packages_distributions() + + def test_packages_distributions_all_module_types(self): + """ + Test top-level modules detected on a package without 'top-level.txt'. + """ + suffixes = importlib.machinery.all_suffixes() + fixtures.build_files( + { + 'all_distributions-1.0.0.dist-info': { + 'METADATA': """ + Name: all_distributions + Version: 1.0.0 + """, + 'RECORD': ''.join( + f'{i}-top-level{suffix},,\n' + f'{i}-in-namespace/mod{suffix},,\n' + f'{i}-in-package/__init__.py,,\n' + f'{i}-in-package/mod{suffix},,\n' + for i, suffix in enumerate(suffixes) + ), + }, + }, + prefix=self.site_dir, + ) + + distributions = packages_distributions() + + for i in range(len(suffixes)): + assert distributions[f'{i}-top-level'] == ['all_distributions'] + assert distributions[f'{i}-in-namespace'] == ['all_distributions'] + assert distributions[f'{i}-in-package'] == ['all_distributions'] From a3c066ddd3c0780c6e64364f1917b06b9795b330 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 18 Mar 2023 12:49:27 -0400 Subject: [PATCH 2/4] Remove long-line comment. --- importlib_metadata/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/importlib_metadata/__init__.py b/importlib_metadata/__init__.py index 9428e7d0..1d300ddb 100644 --- a/importlib_metadata/__init__.py +++ b/importlib_metadata/__init__.py @@ -901,7 +901,6 @@ def _top_level_inferred(dist): return filter( None, { - # this logic relies on the assumption that dist.files only contains files (not directories) inspect.getmodulename(f) if len(f.parts) == 1 else f.parts[0] for f in always_iterable(dist.files) }, From 6610368e5952f2780f347b9c8af060f9984e0846 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 18 Mar 2023 12:52:20 -0400 Subject: [PATCH 3/4] Extract variable for optional names. --- importlib_metadata/__init__.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/importlib_metadata/__init__.py b/importlib_metadata/__init__.py index 1d300ddb..656a79dc 100644 --- a/importlib_metadata/__init__.py +++ b/importlib_metadata/__init__.py @@ -898,10 +898,8 @@ def _top_level_declared(dist): def _top_level_inferred(dist): - return filter( - None, - { - inspect.getmodulename(f) if len(f.parts) == 1 else f.parts[0] - for f in always_iterable(dist.files) - }, - ) + opt_names = { + inspect.getmodulename(f) if len(f.parts) == 1 else f.parts[0] + for f in always_iterable(dist.files) + } + return filter(None, opt_names) From df7824b2ca587b073b08d25e306a68b5d61a960c Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 18 Mar 2023 12:54:34 -0400 Subject: [PATCH 4/4] Restore logic for parts. --- CHANGES.rst | 7 +++++++ importlib_metadata/__init__.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 8eca4dfb..eccdd5ba 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,10 @@ +v6.1.0 +====== + +* #428: ``packages_distributions`` now honors packages and modules + with Python modules that not ``.py`` sources (e.g. ``.pyc``, + ``.so``). + v6.0.1 ====== diff --git a/importlib_metadata/__init__.py b/importlib_metadata/__init__.py index 656a79dc..8d9f0016 100644 --- a/importlib_metadata/__init__.py +++ b/importlib_metadata/__init__.py @@ -899,7 +899,7 @@ def _top_level_declared(dist): def _top_level_inferred(dist): opt_names = { - inspect.getmodulename(f) if len(f.parts) == 1 else f.parts[0] + f.parts[0] if len(f.parts) > 1 else inspect.getmodulename(f) for f in always_iterable(dist.files) } return filter(None, opt_names)