diff options
Diffstat (limited to 'Lib')
| -rw-r--r-- | Lib/importlib/_bootstrap.py | 9 | ||||
| -rw-r--r-- | Lib/test/test_importlib/import_/test___loader__.py | 44 | ||||
| -rw-r--r-- | Lib/test/test_importlib/test_util.py | 42 | 
3 files changed, 79 insertions, 16 deletions
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index c471b2f438..73aa0cad88 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -494,7 +494,7 @@ def set_loader(fxn):      """Set __loader__ on the returned module."""      def set_loader_wrapper(self, *args, **kwargs):          module = fxn(self, *args, **kwargs) -        if not hasattr(module, '__loader__'): +        if getattr(module, '__loader__', None) is None:              module.__loader__ = self          return module      _wrap(set_loader_wrapper, fxn) @@ -875,12 +875,9 @@ class _LoaderBasics:                  module.__cached__ = module.__file__          else:              module.__cached__ = module.__file__ -        module.__package__ = name          if self.is_package(name):              module.__path__ = [_path_split(module.__file__)[0]] -        else: -            module.__package__ = module.__package__.rpartition('.')[0] -        module.__loader__ = self +        # __package__ and __loader set by @module_for_loader.          _call_with_frames_removed(exec, code_object, module.__dict__)          return module @@ -1551,7 +1548,7 @@ def _find_and_load_unlocked(name, import_):          except AttributeError:              pass      # Set loader if need be. -    if not hasattr(module, '__loader__'): +    if getattr(module, '__loader__', None) is None:          try:              module.__loader__ = loader          except AttributeError: diff --git a/Lib/test/test_importlib/import_/test___loader__.py b/Lib/test/test_importlib/import_/test___loader__.py new file mode 100644 index 0000000000..0edbcc5404 --- /dev/null +++ b/Lib/test/test_importlib/import_/test___loader__.py @@ -0,0 +1,44 @@ +import imp +import sys +import unittest + +from .. import util +from . import util as import_util + + +class LoaderMock: + +    def find_module(self, fullname, path=None): +        return self + +    def load_module(self, fullname): +        sys.modules[fullname] = self.module +        return self.module + + +class LoaderAttributeTests(unittest.TestCase): + +    def test___loader___missing(self): +        module = imp.new_module('blah') +        try: +            del module.__loader__ +        except AttributeError: +            pass +        loader = LoaderMock() +        loader.module = module +        with util.uncache('blah'), util.import_state(meta_path=[loader]): +            module = import_util.import_('blah') +        self.assertEqual(loader, module.__loader__) + +    def test___loader___is_None(self): +        module = imp.new_module('blah') +        module.__loader__ = None +        loader = LoaderMock() +        loader.module = module +        with util.uncache('blah'), util.import_state(meta_path=[loader]): +            returned_module = import_util.import_('blah') +        self.assertEqual(loader, module.__loader__) + + +if __name__ == '__main__': +    unittest.main()
\ No newline at end of file diff --git a/Lib/test/test_importlib/test_util.py b/Lib/test/test_importlib/test_util.py index efc8977fb4..5f0871997b 100644 --- a/Lib/test/test_importlib/test_util.py +++ b/Lib/test/test_importlib/test_util.py @@ -162,6 +162,37 @@ class SetPackageTests(unittest.TestCase):          self.assertEqual(wrapped.__qualname__, fxn.__qualname__) +class SetLoaderTests(unittest.TestCase): + +    """Tests importlib.util.set_loader().""" + +    class DummyLoader: +        @util.set_loader +        def load_module(self, module): +            return self.module + +    def test_no_attribute(self): +        loader = self.DummyLoader() +        loader.module = imp.new_module('blah') +        try: +            del loader.module.__loader__ +        except AttributeError: +            pass +        self.assertEqual(loader, loader.load_module('blah').__loader__) + +    def test_attribute_is_None(self): +        loader = self.DummyLoader() +        loader.module = imp.new_module('blah') +        loader.module.__loader__ = None +        self.assertEqual(loader, loader.load_module('blah').__loader__) + +    def test_not_reset(self): +        loader = self.DummyLoader() +        loader.module = imp.new_module('blah') +        loader.module.__loader__ = 42 +        self.assertEqual(42, loader.load_module('blah').__loader__) + +  class ResolveNameTests(unittest.TestCase):      """Tests importlib.util.resolve_name().""" @@ -195,14 +226,5 @@ class ResolveNameTests(unittest.TestCase):              util.resolve_name('..bacon', 'spam') -def test_main(): -    from test import support -    support.run_unittest( -            ModuleForLoaderTests, -            SetPackageTests, -            ResolveNameTests -        ) - -  if __name__ == '__main__': -    test_main() +    unittest.main()  | 
