diff --git a/astroid/interpreter/_import/spec.py b/astroid/interpreter/_import/spec.py index 3330230080..cbb8b6c7ac 100644 --- a/astroid/interpreter/_import/spec.py +++ b/astroid/interpreter/_import/spec.py @@ -122,7 +122,7 @@ class ExplicitNamespacePackageFinder(ImpFinder): def find_module(self, modname, module_parts, processed, submodule_path): if processed: - return None + modname = '.'.join(processed + [modname]) if util.is_namespace(modname) and modname in sys.modules: submodule_path = sys.modules[modname].__path__ return ModuleSpec(name=modname, location='', diff --git a/astroid/tests/testdata/python2/data/foogle_fax-0.12.5-py2.7-nspkg.pth b/astroid/tests/testdata/python2/data/foogle_fax-0.12.5-py2.7-nspkg.pth index d3cb4591d4..eeb7ecac69 100644 --- a/astroid/tests/testdata/python2/data/foogle_fax-0.12.5-py2.7-nspkg.pth +++ b/astroid/tests/testdata/python2/data/foogle_fax-0.12.5-py2.7-nspkg.pth @@ -1 +1,2 @@ import sys, types, os;p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('foogle',));ie = os.path.exists(os.path.join(p,'__init__.py'));m = not ie and sys.modules.setdefault('foogle', types.ModuleType('foogle'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p) +import sys, types, os;p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('foogle','crank'));ie = os.path.exists(os.path.join(p,'__init__.py'));m = not ie and sys.modules.setdefault('foogle.crank', types.ModuleType('foogle.crank'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p) diff --git a/astroid/tests/testdata/python3/data/foogle_fax-0.12.5-py2.7-nspkg.pth b/astroid/tests/testdata/python3/data/foogle_fax-0.12.5-py2.7-nspkg.pth index d3cb4591d4..eeb7ecac69 100644 --- a/astroid/tests/testdata/python3/data/foogle_fax-0.12.5-py2.7-nspkg.pth +++ b/astroid/tests/testdata/python3/data/foogle_fax-0.12.5-py2.7-nspkg.pth @@ -1 +1,2 @@ import sys, types, os;p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('foogle',));ie = os.path.exists(os.path.join(p,'__init__.py'));m = not ie and sys.modules.setdefault('foogle', types.ModuleType('foogle'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p) +import sys, types, os;p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('foogle','crank'));ie = os.path.exists(os.path.join(p,'__init__.py'));m = not ie and sys.modules.setdefault('foogle.crank', types.ModuleType('foogle.crank'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p) diff --git a/astroid/tests/unittest_manager.py b/astroid/tests/unittest_manager.py index b7a0742e7b..7d3e2b0721 100644 --- a/astroid/tests/unittest_manager.py +++ b/astroid/tests/unittest_manager.py @@ -139,6 +139,17 @@ def test_namespace_package_pth_support(self): del pkg_resources._namespace_packages['foogle'] # pylint: disable=no-member sys.modules.pop('foogle') + def test_nested_namespace_import(self): + pth = 'foogle_fax-0.12.5-py2.7-nspkg.pth' + site.addpackage(resources.RESOURCE_PATH, pth, []) + pkg_resources._namespace_packages['foogle'] = ['foogle.crank'] # pylint: disable=no-member + pkg_resources._namespace_packages['foogle.crank'] = [] # pylint: disable=no-member + try: + self.manager.ast_from_module_name('foogle.crank') + finally: + del pkg_resources._namespace_packages['foogle'] # pylint: disable=no-member + sys.modules.pop('foogle') + def test_namespace_and_file_mismatch(self): filepath = unittest.__file__ ast = self.manager.ast_from_file(filepath)