summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Philip <chrisp533@gmail.com>2017-10-26 14:56:45 -0400
committerClaudiu Popa <pcmanticore@gmail.com>2018-04-02 10:49:27 +0200
commite38f8abf294834c1512b1e30a21895a59e88c9ad (patch)
treee9096d03d1c9f847a31cc06ba95d78dc276c5164
parent9169adc3048deeb2eb8d9d8ec8417de5b658354b (diff)
downloadastroid-git-e38f8abf294834c1512b1e30a21895a59e88c9ad.tar.gz
fix nested namespace package import
-rw-r--r--astroid/interpreter/_import/spec.py2
-rw-r--r--astroid/tests/testdata/python2/data/foogle_fax-0.12.5-py2.7-nspkg.pth1
-rw-r--r--astroid/tests/testdata/python3/data/foogle_fax-0.12.5-py2.7-nspkg.pth1
-rw-r--r--astroid/tests/unittest_manager.py11
4 files changed, 14 insertions, 1 deletions
diff --git a/astroid/interpreter/_import/spec.py b/astroid/interpreter/_import/spec.py
index bee51512..b328b74f 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 d3cb4591..eeb7ecac 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 d3cb4591..eeb7ecac 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 67e6fbce..2b5258fe 100644
--- a/astroid/tests/unittest_manager.py
+++ b/astroid/tests/unittest_manager.py
@@ -138,6 +138,17 @@ class AstroidManagerTest(resources.SysPathSetup,
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)