Skip to content

Commit 1b460fc

Browse files
authored
gh-84530: fix namespace package support in modulefinder (#29196)
* bpo-40350: fix namespace package support in modulefinder Signed-off-by: Filipe Laíns <[email protected]> * consider that namespace package specs might have the loader set Signed-off-by: Filipe Laíns <[email protected]> * Revert "consider that namespace package specs might have the loader set" This reverts commit 23fb4e0. Signed-off-by: Filipe Laíns <[email protected]> * Fix load_module and load_package to handle namespace packages Signed-off-by: Filipe Laíns <[email protected]> * Drop _NAMESPACE constant Signed-off-by: Filipe Laíns <[email protected]> * Drop importlib changes Signed-off-by: Filipe Laíns <[email protected]> * Update NamespacePath check Signed-off-by: Filipe Laíns <[email protected]> * Mixed some Signed-off-by: Filipe Laíns <[email protected]> --------- Signed-off-by: Filipe Laíns <[email protected]>
1 parent 49207a5 commit 1b460fc

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

Lib/modulefinder.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,12 @@ def _find_module(name, path=None):
6666

6767
file_path = spec.origin
6868

69-
if spec.loader.is_package(name):
69+
# On namespace packages, spec.loader might be None, but
70+
# spec.submodule_search_locations should always be set — check it instead.
71+
if isinstance(spec.submodule_search_locations, importlib.machinery.NamespacePath):
72+
return None, spec.submodule_search_locations, ("", "", _PKG_DIRECTORY)
73+
74+
if spec.loader.is_package(name): # non-namespace package
7075
return None, os.path.dirname(file_path), ("", "", _PKG_DIRECTORY)
7176

7277
if isinstance(spec.loader, importlib.machinery.SourceFileLoader):
@@ -453,6 +458,11 @@ def load_package(self, fqname, pathname):
453458
if newname:
454459
fqname = newname
455460
m = self.add_module(fqname)
461+
462+
if isinstance(pathname, importlib.machinery.NamespacePath):
463+
m.__path__ = pathname
464+
return m
465+
456466
m.__file__ = pathname
457467
m.__path__ = [pathname]
458468

Lib/test/test_modulefinder.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,18 @@
7676
from sys import version_info
7777
"""]
7878

79+
namespace_package_test = [
80+
"module",
81+
["a", "module"],
82+
["a.c", "blahblah"], [],
83+
"""\
84+
module.py
85+
import a
86+
import a.c
87+
import blahblah
88+
a/b.py
89+
"""]
90+
7991
absolute_import_test = [
8092
"a.module",
8193
["a", "a.module",
@@ -353,6 +365,9 @@ def _do_test(self, info, report=False, debug=0, replace_paths=[], modulefinder_c
353365
def test_package(self):
354366
self._do_test(package_test)
355367

368+
def test_namespace_package(self):
369+
self._do_test(namespace_package_test)
370+
356371
def test_maybe(self):
357372
self._do_test(maybe_test)
358373

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix support for namespace packages in :mod:`modulefinder`.

0 commit comments

Comments
 (0)