[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