Finish properly hiding importlib implementation code.

This commit is contained in:
Brett Cannon 2009-03-12 22:47:53 +00:00
parent e9103d2619
commit f87e04d339
12 changed files with 43 additions and 55 deletions

View file

@ -7,15 +7,6 @@ to do
+ Expose function to see if a frozen module is a package. + Expose function to see if a frozen module is a package.
* Remove ``import *`` from importlib.__init__.
* Remove __all__ from importlib._bootstrap.
* Add leading underscores to all objects in importlib._bootstrap that are not
publicly exposed.
* Reorder importlib/_bootstrap.py so definitions are not in inverted order.
* Make sure that there is documentation *somewhere* fully explaining the * Make sure that there is documentation *somewhere* fully explaining the
semantics of import that can be referenced from the package's documentation semantics of import that can be referenced from the package's documentation
(even if it is in the package documentation itself, although it might be best (even if it is in the package documentation itself, although it might be best

View file

@ -136,7 +136,3 @@ def import_module(name, package=None):
break break
level += 1 level += 1
return _bootstrap._gcd_import(name[level:], package, level) return _bootstrap._gcd_import(name[level:], package, level)
# XXX This should go away once the public API is done.
from ._bootstrap import *

View file

@ -387,7 +387,7 @@ class PyPycLoader(PyLoader):
return code_object return code_object
class PyFileLoader(PyLoader): class _PyFileLoader(PyLoader):
"""Load a Python source file.""" """Load a Python source file."""
@ -452,7 +452,7 @@ class PyFileLoader(PyLoader):
return self._is_pkg return self._is_pkg
class PyPycFileLoader(PyPycLoader, PyFileLoader): class _PyPycFileLoader(PyPycLoader, _PyFileLoader):
"""Load a module from a source or bytecode file.""" """Load a module from a source or bytecode file."""
@ -626,7 +626,7 @@ class _ChainedFinder:
return None return None
class FileFinder: class _FileFinder:
"""Base class for file finders. """Base class for file finders.
@ -685,12 +685,12 @@ class FileFinder:
return None return None
class PyFileFinder(FileFinder): class _PyFileFinder(_FileFinder):
"""Importer for source/bytecode files.""" """Importer for source/bytecode files."""
_possible_package = True _possible_package = True
_loader = PyFileLoader _loader = _PyFileLoader
def __init__(self, path_entry): def __init__(self, path_entry):
# Lack of imp during class creation means _suffixes is set here. # Lack of imp during class creation means _suffixes is set here.
@ -700,11 +700,11 @@ class PyFileFinder(FileFinder):
super().__init__(path_entry) super().__init__(path_entry)
class PyPycFileFinder(PyFileFinder): class _PyPycFileFinder(_PyFileFinder):
"""Finder for source and bytecode files.""" """Finder for source and bytecode files."""
_loader = PyPycFileLoader _loader = _PyPycFileLoader
def __init__(self, path_entry): def __init__(self, path_entry):
super().__init__(path_entry) super().__init__(path_entry)
@ -713,7 +713,7 @@ class PyPycFileFinder(PyFileFinder):
class ExtensionFileFinder(FileFinder): class _ExtensionFileFinder(_FileFinder):
"""Importer for extension files.""" """Importer for extension files."""
@ -750,7 +750,7 @@ def _chained_path_hook(*path_hooks):
return path_hook return path_hook
_DEFAULT_PATH_HOOK = _chained_path_hook(ExtensionFileFinder, PyPycFileFinder) _DEFAULT_PATH_HOOK = _chained_path_hook(_ExtensionFileFinder, _PyPycFileFinder)
class _DefaultPathFinder(PathFinder): class _DefaultPathFinder(PathFinder):
@ -902,8 +902,3 @@ def _import(name, globals={}, locals={}, fromlist=[], level=0):
except ImportError: except ImportError:
pass pass
return module return module
# XXX Eventually replace with a proper __all__ value (i.e., don't expose os
# replacements but do expose _ExtensionFileLoader, etc. for testing).
__all__ = [obj for obj in globals().keys() if not obj.startswith('__')]

View file

@ -1,7 +1,7 @@
import sys import sys
from test import support from test import support
import unittest import unittest
import importlib from importlib import _bootstrap
from .. import util from .. import util
from . import util as ext_util from . import util as ext_util
@ -13,7 +13,7 @@ class ExtensionModuleCaseSensitivityTest(unittest.TestCase):
good_name = ext_util.NAME good_name = ext_util.NAME
bad_name = good_name.upper() bad_name = good_name.upper()
assert good_name != bad_name assert good_name != bad_name
finder = importlib.ExtensionFileFinder(ext_util.PATH) finder = _bootstrap._ExtensionFileFinder(ext_util.PATH)
return finder.find_module(bad_name) return finder.find_module(bad_name)
def test_case_sensitive(self): def test_case_sensitive(self):

View file

@ -1,4 +1,4 @@
import importlib from importlib import _bootstrap
from .. import abc from .. import abc
from . import util from . import util
@ -9,7 +9,7 @@ class FinderTests(abc.FinderTests):
"""Test the finder for extension modules.""" """Test the finder for extension modules."""
def find_module(self, fullname): def find_module(self, fullname):
importer = importlib.ExtensionFileFinder(util.PATH) importer = _bootstrap._ExtensionFileFinder(util.PATH)
return importer.find_module(fullname) return importer.find_module(fullname)
def test_module(self): def test_module(self):

View file

@ -1,4 +1,4 @@
import importlib from importlib import _bootstrap
from . import util as ext_util from . import util as ext_util
from .. import abc from .. import abc
from .. import util from .. import util
@ -12,7 +12,7 @@ class LoaderTests(abc.LoaderTests):
"""Test load_module() for extension modules.""" """Test load_module() for extension modules."""
def load_module(self, fullname): def load_module(self, fullname):
loader = importlib._ExtensionFileLoader(ext_util.NAME, loader = _bootstrap._ExtensionFileLoader(ext_util.NAME,
ext_util.FILEPATH, False) ext_util.FILEPATH, False)
return loader.load_module(fullname) return loader.load_module(fullname)
@ -25,7 +25,7 @@ class LoaderTests(abc.LoaderTests):
self.assertEqual(getattr(module, attr), value) self.assertEqual(getattr(module, attr), value)
self.assert_(ext_util.NAME in sys.modules) self.assert_(ext_util.NAME in sys.modules)
self.assert_(isinstance(module.__loader__, self.assert_(isinstance(module.__loader__,
importlib._ExtensionFileLoader)) _bootstrap._ExtensionFileLoader))
def test_package(self): def test_package(self):
# Extensions are not found in packages. # Extensions are not found in packages.

View file

@ -1,4 +1,4 @@
import importlib from importlib import _bootstrap
from . import util from . import util
import collections import collections
@ -14,7 +14,7 @@ class PathHookTests(unittest.TestCase):
# XXX Should it only work for directories containing an extension module? # XXX Should it only work for directories containing an extension module?
def hook(self, entry): def hook(self, entry):
return importlib.ExtensionFileFinder(entry) return _bootstrap._ExtensionFileFinder(entry)
def test_success(self): def test_success(self):
# Path hook should handle a directory where a known extension module # Path hook should handle a directory where a known extension module

View file

@ -1,5 +1,5 @@
"""Test case-sensitivity (PEP 235).""" """Test case-sensitivity (PEP 235)."""
import importlib from importlib import _bootstrap
from .. import util from .. import util
from . import util as source_util from . import util as source_util
import os import os
@ -19,7 +19,7 @@ class CaseSensitivityTest(unittest.TestCase):
assert name != name.lower() assert name != name.lower()
def find(self, path): def find(self, path):
finder = importlib.PyPycFileFinder(path) finder = _bootstrap._PyPycFileFinder(path)
return finder.find_module(self.name) return finder.find_module(self.name)
def sensitivity_test(self): def sensitivity_test(self):

View file

@ -1,4 +1,5 @@
import importlib import importlib
from importlib import _bootstrap
from .. import abc from .. import abc
from . import util as source_util from . import util as source_util
@ -19,7 +20,8 @@ class SimpleTest(unittest.TestCase):
# [basic] # [basic]
def test_module(self): def test_module(self):
with source_util.create_modules('_temp') as mapping: with source_util.create_modules('_temp') as mapping:
loader = importlib.PyPycFileLoader('_temp', mapping['_temp'], False) loader = _bootstrap._PyPycFileLoader('_temp', mapping['_temp'],
False)
module = loader.load_module('_temp') module = loader.load_module('_temp')
self.assert_('_temp' in sys.modules) self.assert_('_temp' in sys.modules)
check = {'__name__': '_temp', '__file__': mapping['_temp'], check = {'__name__': '_temp', '__file__': mapping['_temp'],
@ -29,7 +31,8 @@ class SimpleTest(unittest.TestCase):
def test_package(self): def test_package(self):
with source_util.create_modules('_pkg.__init__') as mapping: with source_util.create_modules('_pkg.__init__') as mapping:
loader = importlib.PyPycFileLoader('_pkg', mapping['_pkg.__init__'], loader = _bootstrap._PyPycFileLoader('_pkg',
mapping['_pkg.__init__'],
True) True)
module = loader.load_module('_pkg') module = loader.load_module('_pkg')
self.assert_('_pkg' in sys.modules) self.assert_('_pkg' in sys.modules)
@ -42,8 +45,8 @@ class SimpleTest(unittest.TestCase):
def test_lacking_parent(self): def test_lacking_parent(self):
with source_util.create_modules('_pkg.__init__', '_pkg.mod')as mapping: with source_util.create_modules('_pkg.__init__', '_pkg.mod')as mapping:
loader = importlib.PyPycFileLoader('_pkg.mod', mapping['_pkg.mod'], loader = _bootstrap._PyPycFileLoader('_pkg.mod',
False) mapping['_pkg.mod'], False)
module = loader.load_module('_pkg.mod') module = loader.load_module('_pkg.mod')
self.assert_('_pkg.mod' in sys.modules) self.assert_('_pkg.mod' in sys.modules)
check = {'__name__': '_pkg.mod', '__file__': mapping['_pkg.mod'], check = {'__name__': '_pkg.mod', '__file__': mapping['_pkg.mod'],
@ -57,7 +60,8 @@ class SimpleTest(unittest.TestCase):
def test_module_reuse(self): def test_module_reuse(self):
with source_util.create_modules('_temp') as mapping: with source_util.create_modules('_temp') as mapping:
loader = importlib.PyPycFileLoader('_temp', mapping['_temp'], False) loader = _bootstrap._PyPycFileLoader('_temp', mapping['_temp'],
False)
module = loader.load_module('_temp') module = loader.load_module('_temp')
module_id = id(module) module_id = id(module)
module_dict_id = id(module.__dict__) module_dict_id = id(module.__dict__)
@ -87,7 +91,8 @@ class SimpleTest(unittest.TestCase):
setattr(orig_module, attr, value) setattr(orig_module, attr, value)
with open(mapping[name], 'w') as file: with open(mapping[name], 'w') as file:
file.write('+++ bad syntax +++') file.write('+++ bad syntax +++')
loader = importlib.PyPycFileLoader('_temp', mapping['_temp'], False) loader = _bootstrap._PyPycFileLoader('_temp', mapping['_temp'],
False)
self.assertRaises(SyntaxError, loader.load_module, name) self.assertRaises(SyntaxError, loader.load_module, name)
for attr in attributes: for attr in attributes:
self.assertEqual(getattr(orig_module, attr), value) self.assertEqual(getattr(orig_module, attr), value)
@ -97,7 +102,8 @@ class SimpleTest(unittest.TestCase):
with source_util.create_modules('_temp') as mapping: with source_util.create_modules('_temp') as mapping:
with open(mapping['_temp'], 'w') as file: with open(mapping['_temp'], 'w') as file:
file.write('=') file.write('=')
loader = importlib.PyPycFileLoader('_temp', mapping['_temp'], False) loader = _bootstrap._PyPycFileLoader('_temp', mapping['_temp'],
False)
self.assertRaises(SyntaxError, loader.load_module, '_temp') self.assertRaises(SyntaxError, loader.load_module, '_temp')
self.assert_('_temp' not in sys.modules) self.assert_('_temp' not in sys.modules)
@ -116,7 +122,7 @@ class BadBytecodeTest(unittest.TestCase):
""" """
def import_(self, file, module_name): def import_(self, file, module_name):
loader = importlib.PyPycFileLoader(module_name, file, False) loader = _bootstrap._PyPycFileLoader(module_name, file, False)
module = loader.load_module(module_name) module = loader.load_module(module_name)
self.assert_(module_name in sys.modules) self.assert_(module_name in sys.modules)

View file

@ -1,4 +1,4 @@
import importlib from importlib import _bootstrap
from .. import abc from .. import abc
from . import util as source_util from . import util as source_util
import os import os
@ -32,7 +32,7 @@ class FinderTests(abc.FinderTests):
""" """
def import_(self, root, module): def import_(self, root, module):
finder = importlib.PyPycFileFinder(root) finder = _bootstrap._PyPycFileFinder(root)
return finder.find_module(module) return finder.find_module(module)
def run_test(self, test, create=None, *, compile_=None, unlink=None): def run_test(self, test, create=None, *, compile_=None, unlink=None):

View file

@ -1,4 +1,4 @@
import importlib from importlib import _bootstrap
from . import util as source_util from . import util as source_util
import unittest import unittest
@ -10,7 +10,7 @@ class PathHookTest(unittest.TestCase):
def test_success(self): def test_success(self):
# XXX Only work on existing directories? # XXX Only work on existing directories?
with source_util.create_modules('dummy') as mapping: with source_util.create_modules('dummy') as mapping:
self.assert_(hasattr(importlib.FileFinder(mapping['.root']), self.assert_(hasattr(_bootstrap._FileFinder(mapping['.root']),
'find_module')) 'find_module'))

View file

@ -1,4 +1,4 @@
import importlib from importlib import _bootstrap
from . import util as source_util from . import util as source_util
import codecs import codecs
@ -35,7 +35,7 @@ class EncodingTest(unittest.TestCase):
with source_util.create_modules(self.module_name) as mapping: with source_util.create_modules(self.module_name) as mapping:
with open(mapping[self.module_name], 'wb')as file: with open(mapping[self.module_name], 'wb')as file:
file.write(source) file.write(source)
loader = importlib.PyPycFileLoader(self.module_name, loader = _bootstrap._PyPycFileLoader(self.module_name,
mapping[self.module_name], False) mapping[self.module_name], False)
return loader.load_module(self.module_name) return loader.load_module(self.module_name)
@ -96,8 +96,8 @@ class LineEndingTest(unittest.TestCase):
with source_util.create_modules(module_name) as mapping: with source_util.create_modules(module_name) as mapping:
with open(mapping[module_name], 'wb') as file: with open(mapping[module_name], 'wb') as file:
file.write(source) file.write(source)
loader = importlib.PyPycFileLoader(module_name, mapping[module_name], loader = _bootstrap._PyPycFileLoader(module_name,
False) mapping[module_name], False)
return loader.load_module(module_name) return loader.load_module(module_name)
# [cr] # [cr]