[Python-checkins] r57140 - in sandbox/trunk/import_in_py: _importlib.py tests/test_fs_loader.py

brett.cannon python-checkins at python.org
Fri Aug 17 09:54:48 CEST 2007


Author: brett.cannon
Date: Fri Aug 17 09:54:20 2007
New Revision: 57140

Modified:
   sandbox/trunk/import_in_py/_importlib.py
   sandbox/trunk/import_in_py/tests/test_fs_loader.py
Log:
Rework extension module loader tests.


Modified: sandbox/trunk/import_in_py/_importlib.py
==============================================================================
--- sandbox/trunk/import_in_py/_importlib.py	(original)
+++ sandbox/trunk/import_in_py/_importlib.py	Fri Aug 17 09:54:20 2007
@@ -61,6 +61,7 @@
 # The injected modules are 'imp', 'sys', 'marshal', and '_os' (a.k.a. 'posix',
 # 'nt' & 'os2').
 
+
 # XXX Could also expose Modules/getpath.c:joinpath()
 def _path_join(*args):
     """Replacement for os.path.join so as to remove dependency on os module."""
@@ -305,18 +306,32 @@
 
     def load_module(self, fullname):
         """Load an extension module."""
-        # Check sys.modules first.
-        if fullname in sys.modules:
-            return sys.modules[fullname]
         try:
             module = imp.load_dynamic(fullname, self._path)
             module.__loader__ = self
+            return module
         except:
             # If an error occurred, don't leave a partially initialized module.
             if fullname in sys.modules:
                 del sys.modules[fullname]
             raise
-        return module
+
+
+class PyFileLoader(object):
+
+    def __init__(self, path):
+        self._path = path
+
+    def load_module(self, fullname):
+        """Load a Python source or bytecode file."""
+        if fullname in sys.modules:
+            return sys.modules[fullname]
+        try:
+            return handle_py(self, fullname, self_path, XXX, XXX, XXX)
+        except:
+            if fullname in sys.modules:
+                del sys.modules[fullname]
+            raise
 
 
 class ExtensionFileImporter(FileImporter):

Modified: sandbox/trunk/import_in_py/tests/test_fs_loader.py
==============================================================================
--- sandbox/trunk/import_in_py/tests/test_fs_loader.py	(original)
+++ sandbox/trunk/import_in_py/tests/test_fs_loader.py	Fri Aug 17 09:54:20 2007
@@ -8,31 +8,45 @@
 import unittest
 
 
+test_ext_module = '_testcapi'
+
 class LoaderBasics(unittest.TestCase):
 
-    def test_cache_check(self):
-        # sys.modules should always be checked first.
-        cached = sys.modules.keys()[0]
-        cached_module = sys.modules[cached]
-        loader = importlib.ExtensionFileLoader('.')
-        module = loader.load_module(cached)
-        self.assert_(module is cached_module)
+    def reload_test(self, loader, name):
+        # If a module already exists in sys.modules then it should be reused
+        # and be re-initialized.
+        if name not in sys.modules:
+            loader.load_module(name)
+        cached = sys.modules[name]
+        loaded = loader.load_module(name)
+        self.assert_(cached is loaded)
+
+    def basic_test(self, loader, name, path):
+        # A module, after being loaded, should appear in sys.modules.
+        if name in sys.modules:
+            del sys.modules[name]
+            loaded = loader.load_module(name)
+            self.assert_(loaded is sys.modules[name])
+            self.assertEqual(loaded.__name__, name)
+            self.assertEqual(loaded.__file__, path)
+            self.assertEqual(loaded.__loader__, loader)
 
 
 class ExtensionFileLoaderTests(LoaderBasics):
 
     def test_basic(self):
         # Should be able to import an extension module.
-        module_name = 'datetime'
-        if module_name in sys.modules:
-            del sys.modules[module_name]
-        path, filename = find_ext_location(module_name)
+        path, filename = find_ext_location(test_ext_module)
         module_path = os.path.join(path, filename)
         loader = importlib.ExtensionFileLoader(module_path)
-        module = loader.load_module(module_name)
-        self.assertEqual(module.__name__, module_name)
-        self.assertEqual(module.__file__, module_path)
-        self.assertEqual(module.__loader__, loader)
+        self.basic_test(loader, test_ext_module, module_path)
+
+    def test_reload(self):
+        # A module that is already in sys.modules should be reused and be
+        # re-initialized.
+        path, filename = find_ext_location(test_ext_module)
+        loader = importlib.ExtensionFileLoader(os.path.join(path, filename))
+        self.reload_test(loader, test_ext_module)
 
 
 def test_main():


More information about the Python-checkins mailing list