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] 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']