[pypy-svn] r4757 - in pypy/trunk/src/pypy/module: . test test/impsubdir/pkg test/impsubdir/pkg/pkg1

pedronis at codespeak.net pedronis at codespeak.net
Mon May 31 16:22:20 CEST 2004


Author: pedronis
Date: Mon May 31 16:22:19 2004
New Revision: 4757

Added:
   pypy/trunk/src/pypy/module/test/impsubdir/pkg/a.py
   pypy/trunk/src/pypy/module/test/impsubdir/pkg/pkg1/
   pypy/trunk/src/pypy/module/test/impsubdir/pkg/pkg1/__init__.py
   pypy/trunk/src/pypy/module/test/impsubdir/pkg/pkg1/a.py
Modified:
   pypy/trunk/src/pypy/module/__builtin__interp.py
   pypy/trunk/src/pypy/module/test/test_import.py
Log:
dotted package imports


Modified: pypy/trunk/src/pypy/module/__builtin__interp.py
==============================================================================
--- pypy/trunk/src/pypy/module/__builtin__interp.py	(original)
+++ pypy/trunk/src/pypy/module/__builtin__interp.py	Mon May 31 16:22:19 2004
@@ -32,18 +32,30 @@
     return _actframe(position).getdictscope()
 
 
-def try_import_mod(w_modulename,f):
+def try_import_mod(w_modulename,f,pkgdir=None):
     w = space.wrap
     if os.path.exists(f):
         w_mod = space.wrap(Module(space, w_modulename))
         space.sys.setmodule(w_mod)
         space.setattr(w_mod, w('__file__'), w(f))
+        if pkgdir is not None:
+            space.setattr(w_mod,w('__path__'),space.newlist([w(pkgdir)]))
         w_dict = space.getattr(w_mod, w('__dict__'))
         execfile(w(f), w_dict, w_dict)
         return w_mod
     else:
         return None
 
+def check_sys_modules(w_modulename):
+    try:
+        w_mod = space.getitem(space.sys.w_modules, w_modulename)
+    except OperationError,e:
+        pass
+    else:
+        return w_mod
+    if not e.match(space, space.w_KeyError):
+        raise
+    return None
 
 def __import__(w_modulename, w_globals=None,
                w_locals=None, w_fromlist=None):
@@ -56,34 +68,62 @@
         raise OperationError(space.w_TypeError,
               space.wrap("__import__() argument 1 must be string" + helper))
     w = space.wrap
-    try:
-        w_mod = space.getitem(space.sys.w_modules, w_modulename)
-    except OperationError,e:
-        pass
-    else:
+    w_mod = check_sys_modules(w_modulename)
+    if w_mod is not None:
         return w_mod
-    if not e.match(space, space.w_KeyError):
-        raise
+    
     w_mod = space.get_builtin_module(modulename)
     if w_mod is not None:
         return w_mod
 
     import os
-    for path in space.unpackiterable(space.sys.w_path):
-        f = os.path.join(space.unwrap(path), modulename + '.py')
+
+    parts = modulename.split('.')
+    prefix = []
+    w_path = space.sys.w_path
+
+    first = None
+    
+    for part in parts:
+        w_mod = load_part(w_path,prefix,part)
+        if w_mod is None:
+            # ImportError
+            w_failing = w('.'.join(prefix+[part]))
+            w_exc = space.call_function(space.w_ImportError, w_failing)
+            raise OperationError(space.w_ImportError, w_exc)
+        if first is None:
+            first = w_mod
+        prefix.append(part)
+        try:
+            w_path = space.getattr(w_mod,w('__path__'))
+        except OperationError,e:
+            if not e.match(space, space.w_AttributeError):
+                raise
+            w_path = None
+
+    return first    
+
+def load_part(w_path,prefix,partname):
+    w = space.wrap
+    w_modulename = w('.'.join(prefix+[partname]))
+    w_mod = check_sys_modules(w_modulename)
+    if w_mod is not None:
+        return w_mod
+    
+    for path in space.unpackiterable(w_path):
+        f = os.path.join(space.unwrap(path), partname + '.py')
         w_mod = try_import_mod(w_modulename,f)
         if w_mod is not None:
             return w_mod
-        dir = os.path.join(space.unwrap(path),modulename)
+        dir = os.path.join(space.unwrap(path),partname)
         if not os.path.isdir(dir):
             continue
         f = os.path.join(dir,'__init__.py')
-        w_mod = try_import_mod(w_modulename,f)
+        w_mod = try_import_mod(w_modulename,f,pkgdir=dir)
         if w_mod is not None:
             return w_mod
-        
-    w_exc = space.call_function(space.w_ImportError, w_modulename)
-    raise OperationError(space.w_ImportError, w_exc)
+
+    return None
 
 
 def compile(w_str, w_filename, w_startstr,

Added: pypy/trunk/src/pypy/module/test/impsubdir/pkg/a.py
==============================================================================
--- (empty file)
+++ pypy/trunk/src/pypy/module/test/impsubdir/pkg/a.py	Mon May 31 16:22:19 2004
@@ -0,0 +1 @@
+# a.py

Added: pypy/trunk/src/pypy/module/test/impsubdir/pkg/pkg1/__init__.py
==============================================================================
--- (empty file)
+++ pypy/trunk/src/pypy/module/test/impsubdir/pkg/pkg1/__init__.py	Mon May 31 16:22:19 2004
@@ -0,0 +1 @@
+# package

Added: pypy/trunk/src/pypy/module/test/impsubdir/pkg/pkg1/a.py
==============================================================================
--- (empty file)
+++ pypy/trunk/src/pypy/module/test/impsubdir/pkg/pkg1/a.py	Mon May 31 16:22:19 2004
@@ -0,0 +1 @@
+# a.py

Modified: pypy/trunk/src/pypy/module/test/test_import.py
==============================================================================
--- pypy/trunk/src/pypy/module/test/test_import.py	(original)
+++ pypy/trunk/src/pypy/module/test/test_import.py	Mon May 31 16:22:19 2004
@@ -26,6 +26,21 @@
       import pkg
       self.assert_('pkg' in sys.modules)
 
+   def test_import_dotted(self):
+      import sys
+      sys.path.append('impsubdir')
+      import pkg.a
+      self.assert_('pkg' in sys.modules)
+      self.assert_('pkg.a' in sys.modules)
+
+   def test_import_dotted2(self):
+      import sys
+      sys.path.append('impsubdir')
+      import pkg.pkg1.a
+      self.assert_('pkg' in sys.modules)
+      self.assert_('pkg.pkg1' in sys.modules)
+      self.assert_('pkg.pkg1.a' in sys.modules)
+      
 if __name__ == '__main__':
     testit.main()
 



More information about the Pypy-commit mailing list