[pypy-svn] r70089 - in pypy/branch/import-builtin/pypy/module/imp: . test

afa at codespeak.net afa at codespeak.net
Mon Dec 14 10:56:36 CET 2009


Author: afa
Date: Mon Dec 14 10:56:35 2009
New Revision: 70089

Modified:
   pypy/branch/import-builtin/pypy/module/imp/importing.py
   pypy/branch/import-builtin/pypy/module/imp/test/test_import.py
Log:
Add a test + fix for the reload() function


Modified: pypy/branch/import-builtin/pypy/module/imp/importing.py
==============================================================================
--- pypy/branch/import-builtin/pypy/module/imp/importing.py	(original)
+++ pypy/branch/import-builtin/pypy/module/imp/importing.py	Mon Dec 14 10:56:35 2009
@@ -326,7 +326,7 @@
     if pkgdir is not None:
         space.setattr(w_mod, w('__path__'), space.newlist([w(pkgdir)]))
 
-def load_module(space, w_modulename, find_info, ispkg=False):
+def load_module(space, w_modulename, find_info, reuse=False):
     if find_info is None:
         return
     if find_info.w_loader:
@@ -336,7 +336,7 @@
         return space.getbuiltinmodule(find_info.filename)
 
     if find_info.modtype in (PY_SOURCE, PY_COMPILED, PKG_DIRECTORY):
-        if ispkg:
+        if reuse:
             w_mod = space.getitem(space.sys.get('modules'), w_modulename)
         else:
             w_mod = space.wrap(Module(space, w_modulename))
@@ -364,7 +364,10 @@
                                         w_path, use_loader=False)
                 if find_info is None:
                     return w_mod
-                load_module(space, w_modulename, find_info, ispkg=True)
+                try:
+                    load_module(space, w_modulename, find_info, reuse=True)
+                finally:
+                    find_info.stream.close()
                 # fetch the module again, in case of "substitution"
                 w_mod = check_sys_modules(space, w_modulename)
                 return w_mod
@@ -442,7 +445,11 @@
         msg = "No module named %s" % modulename
         raise OperationError(space.w_ImportError, space.wrap(msg))
 
-    return load_module(space, w_modulename, find_info)
+    try:
+        return load_module(space, w_modulename, find_info, reuse=True)
+    finally:
+        find_info.stream.close()
+
 
 # __________________________________________________________________
 #

Modified: pypy/branch/import-builtin/pypy/module/imp/test/test_import.py
==============================================================================
--- pypy/branch/import-builtin/pypy/module/imp/test/test_import.py	(original)
+++ pypy/branch/import-builtin/pypy/module/imp/test/test_import.py	Mon Dec 14 10:56:35 2009
@@ -34,6 +34,7 @@
                     a = "imamodule = 1\ninpackage = 0",
                     b = "imamodule = 1\ninpackage = 0",
                     ambig = "imamodule = 1",
+                    test_reload = "def test():\n    raise ValueError\n",
                     )
     root.ensure("notapackage", dir=1)    # empty, no __init__.py
     setuppkg("pkg",
@@ -383,6 +384,34 @@
         assert mod.b == 16
         assert mod.c == "foo\nbar"
 
+    def test_reload(self):
+        import test_reload
+        try:
+            test_reload.test()
+        except ValueError:
+            pass
+
+        # If this test runs too quickly, test_reload.py's mtime
+        # attribute will remain unchanged even if the file is rewritten.
+        # Consequently, the file would not reload.  So, added a sleep()
+        # delay to assure that a new, distinct timestamp is written.
+        import time
+        time.sleep(1)
+
+        f = open(test_reload.__file__, "w")
+        f.write("def test():\n    raise NotImplementedError\n")
+        f.close()
+        reload(test_reload)
+        try:
+            test_reload.test()
+        except NotImplementedError:
+            pass
+
+        # Ensure that the file is closed
+        # (on windows at least)
+        import os
+        os.unlink(test_reload.__file__)
+
 def _getlong(data):
     x = marshal.dumps(data)
     return x[-4:]



More information about the Pypy-commit mailing list