[Python-checkins] r53280 - sandbox/trunk/import_in_py/importer.py sandbox/trunk/import_in_py/mock_importer.py sandbox/trunk/import_in_py/test_importer.py

brett.cannon python-checkins at python.org
Fri Jan 5 22:59:40 CET 2007


Author: brett.cannon
Date: Fri Jan 5 22:59:39 2007
New Revision: 53280
Modified:
 sandbox/trunk/import_in_py/importer.py
 sandbox/trunk/import_in_py/mock_importer.py
 sandbox/trunk/import_in_py/test_importer.py
Log:
Tighten up API to just what needs to be publicly exposed by adding underscores
to various functions and methods.
Modified: sandbox/trunk/import_in_py/importer.py
==============================================================================
--- sandbox/trunk/import_in_py/importer.py	(original)
+++ sandbox/trunk/import_in_py/importer.py	Fri Jan 5 22:59:39 2007
@@ -1,7 +1,5 @@
 """Re-implementation of import machinery in Python source code.
 
-XXX See http://docs.google.com/View?docid=dg7fctr4_4d8tdbq on current status.
-
 ====================
 References on import
 ====================
@@ -30,38 +28,39 @@
 AttributeError.
 + Possible fix
 - Implement optional interface for loaders.
+ - Do not have new loaders set __loader__.
+ * Might happen because of security issues.
 * warnings and stack level.
 + Affected tests
 - test___all__
 - test_imageop
 + 'warnings' assumes that the import code does not show up in the call
 stack.
- + Because import now in Python, import does show up in the call stack.
- + Trick of specifying that going back two levels will cause the warning
- to be raised in the caller for an import statement no longer holds true.
+ + Because import now implemented in Python, import does show up in the
+ call stack.
+ + Trick of specifying going back in the call stack two levels so warning
+ shows up in the caller will cause the warning no longer holds true.
 + Possible fixes
 - Special module deprecation function.
- - Code in warnings.warn to handle import case.
+ - Code in warnings.warn to handle special import case.
 - Flag on warnings.warn that warning is for an import and ignore stack
 level argument.
 * Could also infer from type of warning.
 * test_pkg
 + Old-style test that compares output.
 + Setting of __loader__ leads to different output.
-* PEP 235 not implemented.
 
 """
 from __future__ import with_statement
 
+# Built-in modules.
 import imp
 import sys
 import marshal
-# XXX Following imports will eventually need to be removed since they are not
-# built-in modules.
+# Not built-in.
 import errno
 import os
 import contextlib
-import py_compile
 import warnings
 
 
@@ -76,7 +75,7 @@
 _set__import__ was called previously)."""
 __builtins__['__import__'] = original__import__
 
-def w_long(x):
+def _w_long(x):
 """Convert a 32-bit integer to little-endian.
 
 XXX Temporary until marshal's long functions are exposed.
@@ -89,7 +88,7 @@
 bytes.append((x >> 24) & 0xFF)
 return ''.join(chr(x) for x in bytes)
 
-def r_long(bytes):
+def _r_long(bytes):
 """Convert 4 bytes in little-endian to an integer.
 
 XXX Temporary until marshal's long function are exposed.
@@ -101,7 +100,7 @@
 x |= ord(bytes[3]) << 24
 return x
 
-def case_ok(directory, file_name):
+def _case_ok(directory, file_name):
 """Verify that file_name (as found in 'directory') has the proper case.
 
 The path is assumed to already exist.
@@ -114,8 +113,6 @@
 """
 if sys.platform not in ('win32', 'mac', 'riscos', 'darwin', 'cygwin',
 'os2emx') or os.environ.get('PYTHONCASEOK'):
- # Platform is case-sensitive so existence check already handle
- # case-sensitivity.
 return True
 directory_contents = os.listdir(directory)
 if file_name in directory_contents:
@@ -124,7 +121,7 @@
 return False
 
 
-class BuiltinFrozenBaseImporter(object):
+class _BuiltinFrozenBaseImporter(object):
 
 """Base class for meta_path importers for built-in and frozen modules.
 
@@ -164,7 +161,7 @@
 return mod
 
 
-class BuiltinImporter(BuiltinFrozenBaseImporter):
+class BuiltinImporter(_BuiltinFrozenBaseImporter):
 
 """sys.meta_path class for importing built-in modules.
 
@@ -177,7 +174,7 @@
 _load = imp.init_builtin
 
 
-class FrozenImporter(BuiltinFrozenBaseImporter):
+class FrozenImporter(_BuiltinFrozenBaseImporter):
 
 """sys.meta_path class for importing frozen modules."""
 
@@ -248,17 +245,17 @@
 init_filename = '__init__' + file_ext
 package_init = os.path.join(package_directory, init_filename)
 if (os.path.isfile(package_init) and
- case_ok(self.path_entry, tail_module) and
- case_ok(package_directory, init_filename)):
+ _case_ok(self.path_entry, tail_module) and
+ _case_ok(package_directory, init_filename)):
 return self.loader(package_init, handler, package_directory)
 file_name = tail_module + file_ext
 file_path = os.path.join(self.path_entry, file_name)
 if (os.path.isfile(file_path) and
- case_ok(self.path_entry, file_name)):
+ _case_ok(self.path_entry, file_name)):
 return self.loader(file_path, handler)
 else:
 if (os.path.isdir(package_directory) and
- case_ok(self.path_entry, tail_module)):
+ _case_ok(self.path_entry, tail_module)):
 warnings.warn("Not importing directory %s: missing __init__.py"
 % package_directory,
 ImportWarning)
@@ -367,7 +364,7 @@
 
 def parse_pyc(self, data):
 """Split data into magic number, timestamp, and bytecode."""
- return data[:4], r_long(data[4:8]), data[8:]
+ return data[:4], _r_long(data[4:8]), data[8:]
 
 def check_magic(self, magic):
 """Check whether the magic number is valid or not."""
@@ -389,7 +386,7 @@
 def create_pyc(self, bytecode, timestamp):
 """Create data for a .pyc file."""
 data = imp.get_magic()
- data += w_long(timestamp)
+ data += _w_long(timestamp)
 data += marshal.dumps(bytecode)
 return data
 
@@ -551,7 +548,7 @@
 handlers = ExtensionFileHandler(), PyPycHandler()
 self.default_path_hook = FileSystemFactory(*handlers)
 
- def search_meta_path(self, name, path=None):
+ def _search_meta_path(self, name, path=None):
 """Check the importers on sys.meta_path for a loader along with the
 extended meta path sequence stored within this instance.
 
@@ -566,7 +563,7 @@
 else:
 raise ImportError("No module named %s" % name)
 
- def sys_path_importer(self, path_entry):
+ def _sys_path_importer(self, path_entry):
 """Return the importer for the specified path.
 
 If None is stored in sys.path_importer_cache then use the default path
@@ -608,7 +605,7 @@
 sys.path_importer_cache[path_entry] = None
 raise ImportError("no importer found for %s" % path_entry)
 
- def search_std_path(self, name, path=None):
+ def _search_std_path(self, name, path=None):
 """Check sys.path or 'path' (depending if 'path' is set) for the
 named module and return its loader."""
 if path:
@@ -617,7 +614,7 @@
 search_paths = sys.path
 for entry in search_paths:
 try:
- importer = self.sys_path_importer(entry)
+ importer = self._sys_path_importer(entry)
 except ImportError:
 continue
 loader = importer.find_module(name)
@@ -626,7 +623,7 @@
 else:
 raise ImportError("No module found named %s" % name)
 
- def import_module(self, name, path=None):
+ def _import_module(self, name, path=None):
 """Import the specified module with no handling of parent modules.
 
 If None is set for a value in sys.modules (to signify that a relative
@@ -641,16 +638,16 @@
 return value
 try:
 # Attempt to find a loader on sys.meta_path.
- loader = self.search_meta_path(name, path)
+ loader = self._search_meta_path(name, path)
 except ImportError:
 # sys.meta_path search failed. Attempt to find a loader on
 # sys.path. If this fails then module cannot be found.
- loader = self.search_std_path(name, path)
+ loader = self._search_std_path(name, path)
 # A loader was found. It is the loader's responsibility to have put an
 # entry in sys.modules.
 return loader.load_module(name)
 
- def import_full_module(self, name):
+ def _import_full_module(self, name):
 """Import a module along with its parent modules and set into
 sys.modules."""
 # Import the module (importing its parent modules first).
@@ -671,12 +668,12 @@
 path_list = parent_module.__path__
 except AttributeError:
 pass
- module = self.import_module(current_name, path_list)
+ module = self._import_module(current_name, path_list)
 if parent_module:
 setattr(parent_module, name_part, module)
 parent_module = module
 
- def classic_resolve_name(self, name, caller_name, caller_is_package):
+ def _classic_resolve_name(self, name, caller_name, caller_is_package):
 """Return the absolute name of the module specified in 'name' as based
 on the name of the caller and whether it is a package."""
 if caller_is_package:
@@ -689,7 +686,7 @@
 base_name = caller_name.rsplit('.', 1)[0]
 return base_name + '.' + name
 
- def resolve_name(self, name, caller_name, caller_is_package, level):
+ def _resolve_name(self, name, caller_name, caller_is_package, level):
 """Return the absolute name of the module specified by 'name' based on
 where the module is being imported and the requested change in dotted
 name level.
@@ -711,7 +708,7 @@
 else:
 return base_name
 
- def return_module(self, absolute_name, relative_name, fromlist):
+ def _return_module(self, absolute_name, relative_name, fromlist):
 """Return the proper module based on what module was requested (and its
 absolute module name), who is
 requesting it, and whether any speicific attributes were specified.
@@ -755,10 +752,10 @@
 if item == '*':
 continue
 if not hasattr(module, item):
- resolved_name = self.resolve_name(item, module.__name__,
+ resolved_name = self._resolve_name(item, module.__name__,
 True, 1)
 try:
- self.import_full_module(resolved_name)
+ self._import_full_module(resolved_name)
 except ImportError:
 pass
 return module
@@ -808,30 +805,30 @@
 # Handle the classic style of import: relative first, then
 # absolute.
 if level == -1:
- relative_name = self.classic_resolve_name(name, caller_name,
+ relative_name = self._classic_resolve_name(name, caller_name,
 is_pkg)
 imported_name = relative_name
 try:
 # Try a relative import.
- self.import_full_module(imported_name)
+ self._import_full_module(imported_name)
 except ImportError:
 # If the relative import fails (or is redirected), try an
 # absolute import.
 imported_name = name
- self.import_full_module(imported_name)
+ self._import_full_module(imported_name)
 # Redirection entry for resolved relative name to instead
 # redirect to the absolute import.
 sys.modules[relative_name] = None
 # If using absolute imports with a relative path, only attempt with
 # the fully-resolved module name.
 else:
- imported_name = self.resolve_name(name, caller_name, is_pkg,
+ imported_name = self._resolve_name(name, caller_name, is_pkg,
 level)
 # This call will also handle setting the attribute on the
 # package.
- self.import_full_module(imported_name)
+ self._import_full_module(imported_name)
 else:
 imported_name = name
- self.import_full_module(name)
+ self._import_full_module(name)
 relative_name = '' if imported_name == name else name
- return self.return_module(imported_name, relative_name, fromlist)
+ return self._return_module(imported_name, relative_name, fromlist)
Modified: sandbox/trunk/import_in_py/mock_importer.py
==============================================================================
--- sandbox/trunk/import_in_py/mock_importer.py	(original)
+++ sandbox/trunk/import_in_py/mock_importer.py	Fri Jan 5 22:59:39 2007
@@ -2,8 +2,7 @@
 import marshal
 import imp
 from test import test_support
-# XXX for w_long and r_long
-from importer import w_long, r_long
+from importer import _w_long
 
 def log_call(method):
 """Log method calls to self.log."""
@@ -94,9 +93,9 @@
 magic = imp.get_magic()
 pyc = magic[:3] + chr(ord(magic[3]) - 1)
 if good_timestamp:
- pyc += w_long(self.modification_time)
+ pyc += _w_long(self.modification_time)
 else:
- pyc += w_long(self.modification_time - 1)
+ pyc += _w_long(self.modification_time - 1)
 # Needed for read_data on .pyc path.
 if good_bytecode:
 self.pyc = pyc + bytecode
@@ -198,7 +197,7 @@
 assert path[1] == self.pyc_ext, "%s != %s" % (path[1], self.pyc_ext)
 assert binary
 assert data[:4] == imp.get_magic()
- assert w_long(self.modification_time) == data[4:8]
+ assert _w_long(self.modification_time) == data[4:8]
 module = MockModule(self.module_name)
 code = marshal.loads(data[8:])
 exec code in module.__dict__
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	Fri Jan 5 22:59:39 2007
@@ -653,7 +653,7 @@
 data = self.handler.create_pyc(bytecode, timestamp)
 self.failUnlessEqual(imp.get_magic(), data[:4])
 # XXX Using importer module's marshal long function.
- self.failUnlessEqual(timestamp, importer.r_long(data[4:8]))
+ self.failUnlessEqual(timestamp, importer._r_long(data[4:8]))
 self.failUnlessEqual(marshal.dumps(bytecode), data[8:])
 
 
@@ -865,7 +865,7 @@
 # Importing from within a package's __init__ file should lead to a
 # resolved import name of the package name tacked on to the name of the
 # module being imported.
- resolved_name = self.importer.classic_resolve_name(self.child_name,
+ resolved_name = self.importer._classic_resolve_name(self.child_name,
 self.parent_name,
 True)
 self.failUnlessEqual(resolved_name, self.full_child_name)
@@ -875,7 +875,7 @@
 # module name being removed and replaced with the name of what is to be
 # imported.
 calling_from = self.parent_name + '.' + '<calling from>'
- resolved_name = self.importer.classic_resolve_name(self.child_name,
+ resolved_name = self.importer._classic_resolve_name(self.child_name,
 calling_from,
 False)
 self.failUnlessEqual(resolved_name, self.full_child_name)
@@ -884,7 +884,7 @@
 # Trying to import a single level within a package within it's __init__
 # module should stay within the package.
 # ``from .child_name import ...`` in a package.
- resolved_name = self.importer.resolve_name(self.child_name,
+ resolved_name = self.importer._resolve_name(self.child_name,
 self.parent_name, True, 1)
 self.failUnlessEqual(resolved_name, self.full_child_name)
 
@@ -893,7 +893,7 @@
 # within the same directory as the module requesting the import.
 # ``from .child_name import ...`` in a package module.
 calling_from = self.parent_name + '.' + '<calling from>'
- resolved_name = self.importer.resolve_name(self.child_name,
+ resolved_name = self.importer._resolve_name(self.child_name,
 calling_from, False, 1)
 self.failUnlessEqual(resolved_name, self.full_child_name)
 
@@ -902,7 +902,7 @@
 depth = 10
 name_extension = (str(x) for x in xrange(10))
 calling_from = self.parent_name + '.' + '.'.join(name_extension)
- resolved_name = self.importer.resolve_name(self.child_name,
+ resolved_name = self.importer._resolve_name(self.child_name,
 calling_from, False, depth)
 self.failUnlessEqual(resolved_name, self.full_child_name)
 
@@ -910,7 +910,7 @@
 # Attempting to go too high out of a package in its __init__ file
 # should raise ImportError.
 # ``from ..child_name import ...`` in a top-level package.
- self.failUnlessRaises(ImportError, self.importer.resolve_name,
+ self.failUnlessRaises(ImportError, self.importer._resolve_name,
 self.child_name, self.parent_name, True, 2)
 
 def test_attempt_to_escape_out_of_package_module(self):
@@ -918,25 +918,25 @@
 # ImportError.
 # ``from ..child_name import ...`` in a top-level package module.
 calling_from = self.parent_name + '.' + '<calling from>'
- self.failUnlessRaises(ImportError, self.importer.resolve_name,
+ self.failUnlessRaises(ImportError, self.importer._resolve_name,
 self.child_name, calling_from, False, 2)
 
 def test_relative_import_in_top_level(self):
 # Attempting a relative import in a top-level location should raise
 # ImportError.
 # ``from .child_name import ...`` outside of a package.
- self.failUnlessRaises(ImportError, self.importer.resolve_name,
+ self.failUnlessRaises(ImportError, self.importer._resolve_name,
 self.child_name, self.parent_name, False, 1)
 
 def test_relative_import_in_package_init(self):
 # ``from . import ...`` in a package.
- resolved_name = self.importer.resolve_name('', self.parent_name, True,
+ resolved_name = self.importer._resolve_name('', self.parent_name, True,
 1)
 self.failUnlessEqual(resolved_name, self.parent_name)
 
 def test_relative_import_in_package_module(self):
 # ``from . import ...`` in a package module.
- resolved_name = self.importer.resolve_name('', self.full_child_name,
+ resolved_name = self.importer._resolve_name('', self.full_child_name,
 False, 1)
 self.failUnlessEqual(resolved_name, self.parent_name)
 
@@ -973,7 +973,7 @@
 succeed = mock_importer.SucceedImporter()
 sys.meta_path.append(succeed)
 # Import the package with a fromlist of the module.
- module = self.importer.return_module(pkg_name, '',
+ module = self.importer._return_module(pkg_name, '',
 fromlist=[module_name])
 self.failUnless(hasattr(module, module_name))
 fromlist_module = getattr(module, module_name)
@@ -986,7 +986,7 @@
 pkg_module = mock_importer.MockModule(pkg_name, pkg_list=['some path'])
 sys.modules[pkg_name] = pkg_module
 nonexistent_attr = 'asdfsdfd'
- module = self.importer.return_module(pkg_name, '',
+ module = self.importer._return_module(pkg_name, '',
 fromlist=[nonexistent_attr])
 self.failUnless(not hasattr(module, nonexistent_attr))
 
@@ -1036,7 +1036,7 @@
 # An empty fromlist means that the root module is returned.
 sys.modules[self.parent_name] = self.parent_module
 sys.modules[self.full_child_name] = self.child_module
- module = self.importer.return_module(self.full_child_name, '', [])
+ module = self.importer._return_module(self.full_child_name, '', [])
 self.failUnless(module is self.parent_module)
 
 def test_nonempty_fromlist(self):
@@ -1045,7 +1045,7 @@
 sys.modules[self.full_child_name] = self.child_module
 test_attr_name = 'test_attr'
 setattr(self.child_module, test_attr_name, None)
- module = self.importer.return_module(self.full_child_name, '',
+ module = self.importer._return_module(self.full_child_name, '',
 [test_attr_name])
 self.failUnless(module is self.child_module)
 
@@ -1054,7 +1054,7 @@
 # then the module specified in the relative name is returned.
 sys.modules[self.full_child_name] = self.child_module
 sys.modules[self.parent_name] = self.parent_module
- module = self.importer.return_module(self.full_child_name,
+ module = self.importer._return_module(self.full_child_name,
 self.child_name, [])
 self.failUnless(module is self.child_module)
 
@@ -1066,7 +1066,7 @@
 extra_depth = '.baz'
 absolute_name = self.full_child_name + extra_depth
 relative_name = self.child_name + extra_depth
- module = self.importer.return_module(absolute_name, relative_name, [])
+ module = self.importer._return_module(absolute_name, relative_name, [])
 self.failUnless(module is self.child_module)
 
 
@@ -1082,14 +1082,14 @@
 def test_sys_module_return(self):
 # A module found in sys.modules should be returned immediately.
 sys.modules[self.parent_name] = self.parent_module
- module = self.importer.import_module(self.parent_name)
+ module = self.importer._import_module(self.parent_name)
 self.failUnless(module is self.parent_module)
 
 def test_sys_module_None(self):
 # If sys.modules contains None for a module name, then raise ImportError.
 module_name = '<module>'
 sys.modules[module_name] = None
- self.failUnlessRaises(ImportError, self.importer.import_module,
+ self.failUnlessRaises(ImportError, self.importer._import_module,
 module_name)
 
 def test_parent_missing(self):
@@ -1150,13 +1150,13 @@
 # Test search method of sys.meta_path.
 # Should raise ImportError on error.
 self.clear_sys_modules('sys')
- self.failUnlessRaises(ImportError, self.importer.search_meta_path,
+ self.failUnlessRaises(ImportError, self.importer._search_meta_path,
 'sys')
 # Verify call order.
 meta_path = (mock_importer.PassImporter(),
 mock_importer.SucceedImporter())
 sys.meta_path = meta_path
- loader = self.importer.search_meta_path('sys')
+ loader = self.importer._search_meta_path('sys')
 for entry in meta_path:
 self.failUnlessEqual(entry.find_request, ('sys', None))
 self.failUnless(loader is meta_path[-1])
@@ -1169,7 +1169,7 @@
 sys.meta_path = [pass_importer]
 succeed_importer = mock_importer.SucceedImporter()
 importer_ = importer.Import(extended_meta_path=(succeed_importer,))
- module = importer_.import_module('sys')
+ module = importer_._import_module('sys')
 for meta_importer in (pass_importer, succeed_importer):
 self.failUnlessEqual(meta_importer.find_request, ('sys', None))
 self.failUnless(module in succeed_importer.loaded_modules)
@@ -1207,7 +1207,7 @@
 sys.meta_path = []
 sys.path = ['<succeed>']
 sys.path_importer_cache['<succeed>'] = None
- module = importer_.import_module(module_name)
+ module = importer_._import_module(module_name)
 self.failUnlessEqual(succeed_importer.find_request,
 (module_name, None))
 self.failUnless(module in succeed_importer.loaded_modules)
@@ -1221,7 +1221,7 @@
 pass_importer = mock_importer.PassImporter.set_on_sys_path()
 succeed_importer = mock_importer.SucceedImporter.set_on_sys_path()
 sys_path = (pass_importer, succeed_importer)
- module = importer_.import_module(module_name)
+ module = importer_._import_module(module_name)
 for entry in sys_path:
 self.failUnlessEqual(entry.find_request, (module_name, None))
 self.failUnless(module in succeed_importer.loaded_modules)
@@ -1233,7 +1233,7 @@
 self.clear_sys_modules(module_name)
 sys.path = []
 succeed_importer = mock_importer.SucceedImporter.set_on_sys_path()
- loader = self.importer.search_std_path(module_name)
+ loader = self.importer._search_std_path(module_name)
 self.failUnless(loader is succeed_importer)
 
 def test_importer_cache_from_path_hooks(self):
@@ -1247,7 +1247,7 @@
 sys.path = [path_entry]
 sys.path_importer_cache.clear()
 sys.path_hooks = [succeed_importer]
- loader = self.importer.search_std_path(module_name)
+ loader = self.importer._search_std_path(module_name)
 self.failUnless(loader is succeed_importer)
 self.failUnless(sys.path_importer_cache[path_entry] is
 succeed_importer)
@@ -1261,7 +1261,7 @@
 sys.path = [path_entry]
 sys.path_hooks = []
 sys.path_importer_cache.clear()
- self.failUnlessRaises(ImportError, self.importer.search_std_path,
+ self.failUnlessRaises(ImportError, self.importer._search_std_path,
 module_name)
 self.failUnless(sys.path_importer_cache[path_entry] is None)
 
@@ -1272,7 +1272,7 @@
 sys.path_hooks.append(succeed_importer)
 search_paths = ['test path']
 module_name = '<pkg>.<dummy>'
- loader = self.importer.search_std_path(module_name, search_paths)
+ loader = self.importer._search_std_path(module_name, search_paths)
 self.failUnless(loader is succeed_importer)
 self.failUnless(search_paths[0] in succeed_importer.path_entries)
 self.failUnlessEqual(succeed_importer.find_request,
@@ -1281,7 +1281,7 @@
 self.clear_sys_modules(module_name)
 del sys.path_importer_cache[search_paths[0]]
 succeed_importer.path_entries = []
- self.importer.import_module(module_name, search_paths)
+ self.importer._import_module(module_name, search_paths)
 self.failUnless(search_paths[0] in succeed_importer.path_entries)
 
 
@@ -1404,8 +1404,8 @@
 data = pyc_file.read()
 self.failUnlessEqual(data[:4], imp.get_magic())
 py_mod = int(os.stat(self.py_path).st_mtime)
- # XXX Using importer's r_long.
- pyc_mod = importer.r_long(data[4:8])
+ # XXX Using importer's _r_long.
+ pyc_mod = importer._r_long(data[4:8])
 self.failUnlessEqual(py_mod, pyc_mod)
 code = marshal.loads(data[8:])
 module = mock_importer.MockModule(self.module_name)


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /