[Python-checkins] r57166 - in sandbox/trunk/import_in_py: _importlib.py tests/test_fs_importer.py
brett.cannon
python-checkins at python.org
Sat Aug 18 01:13:09 CEST 2007
Author: brett.cannon
Date: Sat Aug 18 01:12:59 2007
New Revision: 57166
Modified:
sandbox/trunk/import_in_py/_importlib.py
sandbox/trunk/import_in_py/tests/test_fs_importer.py
Log:
Enforce that the source importer searches for source files before bytecode
files.
Modified: sandbox/trunk/import_in_py/_importlib.py
==============================================================================
--- sandbox/trunk/import_in_py/_importlib.py (original)
+++ sandbox/trunk/import_in_py/_importlib.py Sat Aug 18 01:12:59 2007
@@ -262,8 +262,16 @@
raise
+def suffix_list(suffix_type):
+ """Return a list of suffixes for a specific type of file."""
+ return [suffix[0] for suffix in imp.get_suffixes()
+ if suffix[2] == suffix_type]
+
+
class PyFileLoader(object):
+ # XXX Take in fullname from importer to make sure loader is not called for
+ # another module?
def __init__(self, path):
self._path = path
@@ -284,8 +292,8 @@
Subclasses are expected to define the following attributes:
- * _file_types
- Sequence of imp file types (e.g., imp.C_EXTENSION).
+ * _suffixes
+ Sequence of file suffixes whose order will be followed.
* _possible_package
True if importer should check for packages.
* _loader
@@ -302,8 +310,6 @@
"""
self._path_entry = path_entry
- self._suffixes = [suffix[0] for suffix in imp.get_suffixes()
- if suffix[2] in self._file_types]
def find_module(self, fullname, path=None):
tail_module = fullname.rsplit('.', 1)[-1]
@@ -341,9 +347,9 @@
_loader = ExtensionFileLoader
def __init__(self, path_entry):
- # Assigning to _file_types here instead of at the class level because
+ # Assigning to _suffixes here instead of at the class level because
# imp is not imported at the time of class creation.
- self._file_types = [imp.C_EXTENSION]
+ self._suffixes = suffix_list(imp.C_EXTENSION)
super(self.__class__, self).__init__(path_entry)
@@ -355,7 +361,11 @@
_loader = lambda path: FileSystemLoader(path, PyPycHandler)
def __init__(self, path_entry):
- self._file_types = [imp.PY_SOURCE, imp.PY_COMPILED]
+ # Lack of imp during class creation means _suffixes is set here.
+ # Make sure that Python source files are listed first! Needed for an
+ # optimization by the loader.
+ self._suffixes = suffix_list(imp.PY_SOURCE)
+ self._suffixes += suffix_list(imp.PY_COMPILED)
super(self.__class__, self).__init__(path_entry)
Modified: sandbox/trunk/import_in_py/tests/test_fs_importer.py
==============================================================================
--- sandbox/trunk/import_in_py/tests/test_fs_importer.py (original)
+++ sandbox/trunk/import_in_py/tests/test_fs_importer.py Sat Aug 18 01:12:59 2007
@@ -67,16 +67,20 @@
self.assertEqual(found, expected)
def test_file_type_order(self):
- # The order of the search should be preserved.
+ # The order of the search should be preserved with source files being
+ # found first.
assert os.path.exists(self.py_path)
assert self.py_ext in self.importer._suffixes
assert os.path.exists(self.pyc_path)
assert self.pyc_ext in self.importer._suffixes
- assert self.importer._suffixes[0] in [self.py_ext, self.pyc_ext]
- expected = self.importer._suffixes[0]
+ py_suffixes = importlib.suffix_list(imp.PY_SOURCE)
found = self.importer.find_module(self.module_name)
- ext = os.path.splitext(found)[1]
- self.assertEqual(ext, self.importer._suffixes[0])
+ for suffix in py_suffixes:
+ if found.endswith(suffix):
+ break
+ else:
+ self.fail("Python source files not searched for before bytecode "
+ "files")
def test_missing__init__warning(self):
# An ImportWarning should be raised if a directory matches a module
More information about the Python-checkins
mailing list