[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