From 1a8e808d5347707e195357df27677c85978bd1dd Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 14 Aug 2021 15:28:22 -0400 Subject: [PATCH] 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" + }