file_path = spec.origin
- if spec.loader.is_package(name):
+ # On namespace packages, spec.loader might be None, but
+ # spec.submodule_search_locations should always be set — check it instead.
+ if isinstance(spec.submodule_search_locations, importlib.machinery.NamespacePath):
+ return None, spec.submodule_search_locations, ("", "", _PKG_DIRECTORY)
+
+ if spec.loader.is_package(name): # non-namespace package
return None, os.path.dirname(file_path), ("", "", _PKG_DIRECTORY)
if isinstance(spec.loader, importlib.machinery.SourceFileLoader):
if newname:
fqname = newname
m = self.add_module(fqname)
+
+ if isinstance(pathname, importlib.machinery.NamespacePath):
+ m.__path__ = pathname
+ return m
+
m.__file__ = pathname
m.__path__ = [pathname]
from sys import version_info
"""]
+namespace_package_test = [
+ "module",
+ ["a", "module"],
+ ["a.c", "blahblah"], [],
+ """\
+module.py
+ import a
+ import a.c
+ import blahblah
+a/b.py
+"""]
+
absolute_import_test = [
"a.module",
["a", "a.module",
def test_package(self):
self._do_test(package_test)
+ def test_namespace_package(self):
+ self._do_test(namespace_package_test)
+
def test_maybe(self):
self._do_test(maybe_test)