Fix importlib.machinery.FrozenImporter.load_module() to set __package__
properly. Discovered by also moving the loader tests over to importlib.test.abc.LoaderTests.
This commit is contained in:
parent
e70485e7c1
commit
223a19d8b1
|
@ -3,7 +3,6 @@ to do
|
|||
|
||||
* Use test.abc.LoaderTests
|
||||
|
||||
+ frozen
|
||||
+ source
|
||||
|
||||
* Reorganize support code.
|
||||
|
|
|
@ -137,7 +137,12 @@ class FrozenImporter:
|
|||
"""Load a frozen module."""
|
||||
if cls.find_module(fullname) is None:
|
||||
raise ImportError("{0} is not a frozen module".format(fullname))
|
||||
return imp.init_frozen(fullname)
|
||||
module = imp.init_frozen(fullname)
|
||||
if hasattr(module, '__path__'):
|
||||
module.__package__ = module.__name__
|
||||
elif '.' in module.__name__:
|
||||
module.__package__ = module.__name__.rsplit('.', 1)[0]
|
||||
return module
|
||||
|
||||
|
||||
class ChainedImporter(object):
|
||||
|
|
|
@ -1,26 +1,59 @@
|
|||
from importlib import machinery
|
||||
from ..builtin import test_loader
|
||||
from .. import abc
|
||||
from .. import support
|
||||
|
||||
|
||||
class LoaderTests(test_loader.LoaderTests):
|
||||
class LoaderTests(abc.LoaderTests):
|
||||
|
||||
name = '__phello__'
|
||||
load_module = staticmethod(lambda name:
|
||||
machinery.FrozenImporter.load_module(name))
|
||||
verification = {'__name__': '__phello__', '__file__': '<frozen>',
|
||||
'__package__': None, '__path__': ['__phello__']}
|
||||
def test_module(self):
|
||||
with support.uncache('__hello__'):
|
||||
module = machinery.FrozenImporter.load_module('__hello__')
|
||||
check = {'__name__': '__hello__', '__file__': '<frozen>',
|
||||
'__package__': None}
|
||||
for attr, value in check.items():
|
||||
self.assertEqual(getattr(module, attr), value)
|
||||
|
||||
def test_package(self):
|
||||
with support.uncache('__phello__'):
|
||||
module = machinery.FrozenImporter.load_module('__phello__')
|
||||
check = {'__name__': '__phello__', '__file__': '<frozen>',
|
||||
'__package__': '__phello__', '__path__': ['__phello__']}
|
||||
for attr, value in check.items():
|
||||
attr_value = getattr(module, attr)
|
||||
self.assertEqual(attr_value, value,
|
||||
"for __phello__.%s, %r != %r" %
|
||||
(attr, attr_value, value))
|
||||
|
||||
class SubmoduleLoaderTests(LoaderTests):
|
||||
def test_lacking_parent(self):
|
||||
with support.uncache('__phello__', '__phello__.spam'):
|
||||
module = machinery.FrozenImporter.load_module('__phello__.spam')
|
||||
check = {'__name__': '__phello__.spam', '__file__': '<frozen>',
|
||||
'__package__': '__phello__'}
|
||||
for attr, value in check.items():
|
||||
attr_value = getattr(module, attr)
|
||||
self.assertEqual(attr_value, value,
|
||||
"for __phello__.spam.%s, %r != %r" %
|
||||
(attr, attr_value, value))
|
||||
|
||||
name = '__phello__.spam'
|
||||
verification = {'__name__': '__phello__.spam', '__file__': '<frozen>',
|
||||
'__package__': None}
|
||||
def test_module_reuse(self):
|
||||
with support.uncache('__hello__'):
|
||||
module1 = machinery.FrozenImporter.load_module('__hello__')
|
||||
module2 = machinery.FrozenImporter.load_module('__hello__')
|
||||
self.assert_(module1 is module2)
|
||||
|
||||
def test_state_after_failure(self):
|
||||
# No way to trigger an error in a frozen module.
|
||||
pass
|
||||
|
||||
def test_unloadable(self):
|
||||
assert machinery.FrozenImporter.find_module('_not_real') is None
|
||||
self.assertRaises(ImportError, machinery.FrozenImporter.load_module,
|
||||
'_not_real')
|
||||
|
||||
|
||||
def test_main():
|
||||
from test.support import run_unittest
|
||||
run_unittest(LoaderTests, SubmoduleLoaderTests)
|
||||
run_unittest(LoaderTests)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
|
Loading…
Reference in New Issue