These files are a subset of the python-2.7.2.tgz distribution from python.org. Changed files from PyMod-2.7.2 have been copied into the corresponding directories of this tree, replacing the original files in the distribution. Signed-off-by: daryl.mcdaniel@intel.com git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13197 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			177 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import contextlib
 | 
						|
import imp
 | 
						|
import importlib
 | 
						|
import sys
 | 
						|
import unittest
 | 
						|
 | 
						|
 | 
						|
@contextlib.contextmanager
 | 
						|
def uncache(*names):
 | 
						|
    """Uncache a module from sys.modules.
 | 
						|
 | 
						|
    A basic sanity check is performed to prevent uncaching modules that either
 | 
						|
    cannot/shouldn't be uncached.
 | 
						|
 | 
						|
    """
 | 
						|
    for name in names:
 | 
						|
        if name in ('sys', 'marshal', 'imp'):
 | 
						|
            raise ValueError(
 | 
						|
                "cannot uncache {0} as it will break _importlib".format(name))
 | 
						|
        try:
 | 
						|
            del sys.modules[name]
 | 
						|
        except KeyError:
 | 
						|
            pass
 | 
						|
    try:
 | 
						|
        yield
 | 
						|
    finally:
 | 
						|
        for name in names:
 | 
						|
            try:
 | 
						|
                del sys.modules[name]
 | 
						|
            except KeyError:
 | 
						|
                pass
 | 
						|
 | 
						|
 | 
						|
@contextlib.contextmanager
 | 
						|
def import_state(**kwargs):
 | 
						|
    """Context manager to manage the various importers and stored state in the
 | 
						|
    sys module.
 | 
						|
 | 
						|
    The 'modules' attribute is not supported as the interpreter state stores a
 | 
						|
    pointer to the dict that the interpreter uses internally;
 | 
						|
    reassigning to sys.modules does not have the desired effect.
 | 
						|
 | 
						|
    """
 | 
						|
    originals = {}
 | 
						|
    try:
 | 
						|
        for attr, default in (('meta_path', []), ('path', []),
 | 
						|
                              ('path_hooks', []),
 | 
						|
                              ('path_importer_cache', {})):
 | 
						|
            originals[attr] = getattr(sys, attr)
 | 
						|
            if attr in kwargs:
 | 
						|
                new_value = kwargs[attr]
 | 
						|
                del kwargs[attr]
 | 
						|
            else:
 | 
						|
                new_value = default
 | 
						|
            setattr(sys, attr, new_value)
 | 
						|
        if len(kwargs):
 | 
						|
            raise ValueError(
 | 
						|
                    'unrecognized arguments: {0}'.format(kwargs.keys()))
 | 
						|
        yield
 | 
						|
    finally:
 | 
						|
        for attr, value in originals.items():
 | 
						|
            setattr(sys, attr, value)
 | 
						|
 | 
						|
 | 
						|
class mock_modules(object):
 | 
						|
 | 
						|
    """A mock importer/loader."""
 | 
						|
 | 
						|
    def __init__(self, *names):
 | 
						|
        self.modules = {}
 | 
						|
        for name in names:
 | 
						|
            if not name.endswith('.__init__'):
 | 
						|
                import_name = name
 | 
						|
            else:
 | 
						|
                import_name = name[:-len('.__init__')]
 | 
						|
            if '.' not in name:
 | 
						|
                package = None
 | 
						|
            elif import_name == name:
 | 
						|
                package = name.rsplit('.', 1)[0]
 | 
						|
            else:
 | 
						|
                package = import_name
 | 
						|
            module = imp.new_module(import_name)
 | 
						|
            module.__loader__ = self
 | 
						|
            module.__file__ = '<mock __file__>'
 | 
						|
            module.__package__ = package
 | 
						|
            module.attr = name
 | 
						|
            if import_name != name:
 | 
						|
                module.__path__ = ['<mock __path__>']
 | 
						|
            self.modules[import_name] = module
 | 
						|
 | 
						|
    def __getitem__(self, name):
 | 
						|
        return self.modules[name]
 | 
						|
 | 
						|
    def find_module(self, fullname, path=None):
 | 
						|
        if fullname not in self.modules:
 | 
						|
            return None
 | 
						|
        else:
 | 
						|
            return self
 | 
						|
 | 
						|
    def load_module(self, fullname):
 | 
						|
        if fullname not in self.modules:
 | 
						|
            raise ImportError
 | 
						|
        else:
 | 
						|
            sys.modules[fullname] = self.modules[fullname]
 | 
						|
            return self.modules[fullname]
 | 
						|
 | 
						|
    def __enter__(self):
 | 
						|
        self._uncache = uncache(*self.modules.keys())
 | 
						|
        self._uncache.__enter__()
 | 
						|
        return self
 | 
						|
 | 
						|
    def __exit__(self, *exc_info):
 | 
						|
        self._uncache.__exit__(None, None, None)
 | 
						|
 | 
						|
 | 
						|
 | 
						|
class ImportModuleTests(unittest.TestCase):
 | 
						|
 | 
						|
    """Test importlib.import_module."""
 | 
						|
 | 
						|
    def test_module_import(self):
 | 
						|
        # Test importing a top-level module.
 | 
						|
        with mock_modules('top_level') as mock:
 | 
						|
            with import_state(meta_path=[mock]):
 | 
						|
                module = importlib.import_module('top_level')
 | 
						|
                self.assertEqual(module.__name__, 'top_level')
 | 
						|
 | 
						|
    def test_absolute_package_import(self):
 | 
						|
        # Test importing a module from a package with an absolute name.
 | 
						|
        pkg_name = 'pkg'
 | 
						|
        pkg_long_name = '{0}.__init__'.format(pkg_name)
 | 
						|
        name = '{0}.mod'.format(pkg_name)
 | 
						|
        with mock_modules(pkg_long_name, name) as mock:
 | 
						|
            with import_state(meta_path=[mock]):
 | 
						|
                module = importlib.import_module(name)
 | 
						|
                self.assertEqual(module.__name__, name)
 | 
						|
 | 
						|
    def test_shallow_relative_package_import(self):
 | 
						|
        modules = ['a.__init__', 'a.b.__init__', 'a.b.c.__init__', 'a.b.c.d']
 | 
						|
        with mock_modules(*modules) as mock:
 | 
						|
            with import_state(meta_path=[mock]):
 | 
						|
                module = importlib.import_module('.d', 'a.b.c')
 | 
						|
                self.assertEqual(module.__name__, 'a.b.c.d')
 | 
						|
 | 
						|
    def test_deep_relative_package_import(self):
 | 
						|
        # Test importing a module from a package through a relatve import.
 | 
						|
        modules = ['a.__init__', 'a.b.__init__', 'a.c']
 | 
						|
        with mock_modules(*modules) as mock:
 | 
						|
            with import_state(meta_path=[mock]):
 | 
						|
                module = importlib.import_module('..c', 'a.b')
 | 
						|
                self.assertEqual(module.__name__, 'a.c')
 | 
						|
 | 
						|
    def test_absolute_import_with_package(self):
 | 
						|
        # Test importing a module from a package with an absolute name with
 | 
						|
        # the 'package' argument given.
 | 
						|
        pkg_name = 'pkg'
 | 
						|
        pkg_long_name = '{0}.__init__'.format(pkg_name)
 | 
						|
        name = '{0}.mod'.format(pkg_name)
 | 
						|
        with mock_modules(pkg_long_name, name) as mock:
 | 
						|
            with import_state(meta_path=[mock]):
 | 
						|
                module = importlib.import_module(name, pkg_name)
 | 
						|
                self.assertEqual(module.__name__, name)
 | 
						|
 | 
						|
    def test_relative_import_wo_package(self):
 | 
						|
        # Relative imports cannot happen without the 'package' argument being
 | 
						|
        # set.
 | 
						|
        self.assertRaises(TypeError, importlib.import_module, '.support')
 | 
						|
 | 
						|
 | 
						|
def test_main():
 | 
						|
    from test.test_support import run_unittest
 | 
						|
    run_unittest(ImportModuleTests)
 | 
						|
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    test_main()
 |