[Python-checkins] r52758 - sandbox/trunk/import_in_py/importer.py sandbox/trunk/import_in_py/test_importer.py
brett.cannon
python-checkins at python.org
Wed Nov 15 22:35:55 CET 2006
Author: brett.cannon
Date: Wed Nov 15 22:35:54 2006
New Revision: 52758
Modified:
sandbox/trunk/import_in_py/importer.py
sandbox/trunk/import_in_py/test_importer.py
Log:
Add regression tests for new-style relative imports.
Also added helper functions for replacing the built-in import function with
the new import code.
Modified: sandbox/trunk/import_in_py/importer.py
==============================================================================
--- sandbox/trunk/import_in_py/importer.py (original)
+++ sandbox/trunk/import_in_py/importer.py Wed Nov 15 22:35:54 2006
@@ -95,11 +95,11 @@
way and hyper-generalize by having a meta_path importer that
returns entries in sys.path.
* Loaders don't have to return the loaded module.
- + Since they have the responsibility of adding it to sys.modules, there
- no real need.
+ Importing the module being imported in a circular import dependency
requires that module added to sys.modules stay consistent from the
point it is added to initialization anyway.
+ + Can get the module the loader was supposed to handle directly out of
+ sys.modules.
* Remove any idea of a default importer.
+ Removes support for None entries from sys.path_importer_cache.
+ Rely on default importers being in sys.path_hooks or sys.meta_path.
@@ -152,6 +152,18 @@
import py_compile
+def _set__import__():
+ """Set __import__ to an instance of Import."""
+ global original__import__
+ original__import__ = __import__
+ __builtins__['__import__'] = Import()
+
+def _reset__import__():
+ """Set __import__ back to the original implementation (assumes
+ _set__import__ was called previously)."""
+ __builtins__['__import__'] = original__import__
+
+
class BuiltinFrozenBaseImporter(object):
"""Base class for meta_path importers for built-in and frozen modules.
@@ -237,8 +249,9 @@
def __call__(self, path_entry):
"""If path_entry is a directory, return an importer object for it, else
raise ImportError."""
- if os.path.isdir(path_entry):
- return FileSystemImporter(path_entry, *self.handlers)
+ absolute_path = os.path.abspath(path_entry)
+ if os.path.isdir(absolute_path):
+ return FileSystemImporter(absolute_path, *self.handlers)
else:
raise ImportError("can only handle directory entries from "
"sys.path")
Modified: sandbox/trunk/import_in_py/test_importer.py
==============================================================================
--- sandbox/trunk/import_in_py/test_importer.py (original)
+++ sandbox/trunk/import_in_py/test_importer.py Wed Nov 15 22:35:54 2006
@@ -137,7 +137,7 @@
"""
- def create_files(self, faked_names=True):
+ def setUp(self, faked_names=True):
"""Generate the path to a temporary file to test with.
If faked_names is true then all names are non-standard compared to
@@ -173,7 +173,7 @@
self.bytecode = marshal.dumps(code)
sys.path.insert(0, self.directory)
- def remove_files(self):
+ def tearDown(self):
"""If the temporary path was used, make sure to clean up."""
if self.directory in sys.path:
sys.path.remove(self.directory)
@@ -208,8 +208,8 @@
"""
- def create_files(self, faked_names=True):
- TestPyPycFiles.create_files(self, faked_names)
+ def setUp(self, faked_names=True):
+ TestPyPycFiles.setUp(self, faked_names)
self.top_level_module_name = 'top_level_' + self.module_name
self.top_level_module_path = os.path.join(self.directory,
self.top_level_module_name+self.py_ext)
@@ -249,8 +249,8 @@
with open(self.sub_pkg_module_path, 'w') as submodule_file:
submodule_file.write(self.source)
- def remove_files(self):
- TestPyPycFiles.remove_files(self)
+ def tearDown(self):
+ TestPyPycFiles.tearDown(self)
os.remove(self.top_level_module_path)
shutil.rmtree(self.pkg_path)
@@ -287,22 +287,25 @@
self.failUnlessEqual(module.__file__, self.pkg_module_path)
+class FileSystemFactoryTests(TestPyPycPackages):
+
+ """Test the filesystem path_hooks factory function."""
+
+ pass # XXX
+
+
class FileSystemImporterTests(TestPyPycPackages):
"""Test the filesystem importer."""
def setUp(self):
"""Create a basic importer."""
- TestPyPycPackages.create_files(self)
+ TestPyPycPackages.setUp(self)
self.handler = mock_importer.MockHandler(self.py_ext)
self.importer = importer.FileSystemImporter(self.directory,
self.handler)
self.importer.loader = mock_importer.MockPyPycLoader
- def tearDown(self):
- """Clean up the created file."""
- TestPyPycPackages.remove_files(self)
-
def test_find_module_single_handler(self):
# Having a single handler should work without issue.
loader = self.importer.find_module(self.module_name)
@@ -476,12 +479,9 @@
"""Test the py/pyc handler."""
def setUp(self):
- self.create_files()
+ TestPyPycFiles.setUp(self)
self.handler = importer.PyPycHandler()
- def tearDown(self):
- self.remove_files()
-
def test_init(self):
# Test __init__ usage.
proper_bytecode_ext = '.pyc' if __debug__ else '.pyo'
@@ -960,7 +960,7 @@
"""
def setUp(self):
- TestPyPycPackages.create_files(self, False)
+ TestPyPycPackages.setUp(self, False)
self.import_ = importer.Import()
self.cached_modules = []
if self.module_name in sys.modules:
@@ -971,7 +971,7 @@
del sys.modules[self.pkg_module_name]
def tearDown(self):
- TestPyPycPackages.remove_files(self)
+ TestPyPycPackages.tearDown(self)
for module_name, module in self.cached_modules:
sys.modules[module_name] = module
@@ -1089,11 +1089,19 @@
self.verify_package(module)
self.failUnlessEqual(module.__name__, self.top_level_module_name)
- def XXX_test_relative_import_in_package_init(self):
- pass
+ def test_relative_import_in_package_init(self):
+ # Importing a module with a relative name in a package's __init__ file
+ # should work.
+ package_globals = {'__name__':self.pkg_name, '__path__':self.pkg_path}
+ module = self.import_(self.module_name, package_globals, level=1)
+ self.verify_package(module, self.pkg_module_name)
- def XXX_test_relative_import_in_package(self):
- pass
+ def test_relative_import_in_package(self):
+ # Importing a module with a relative name in another module should
+ # work.
+ module_globals = {'__name__':self.pkg_name + '.another_module'}
+ module = self.import_(self.module_name, module_globals, level=1)
+ self.verify_package(module, self.pkg_module_name)
def test_main():
More information about the Python-checkins
mailing list