# can create the namespace package.
spec.origin = None
spec.submodule_search_locations = _NamespacePath(fullname, namespace_path, cls._get_spec)
+ spec.loader = NamespaceLoader(fullname, namespace_path, cls._get_spec)
return spec
else:
return None
_PKG_DIRECTORY = 5
_C_BUILTIN = 6
_PY_FROZEN = 7
+_NAMESPACE = 8
# Modulefinder does a good job at simulating Python's, but it can not
# handle __path__ modifications packages make at runtime. Therefore there
file_path = spec.origin
- if spec.loader.is_package(name):
+ if isinstance(spec.loader, importlib.machinery.NamespaceLoader):
+ return None, spec.submodule_search_locations, ("", "", _NAMESPACE)
+
+ 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):
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)