mirror of https://github.com/python/cpython
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
|
* Use test.abc.LoaderTests
|
||||||
|
|
||||||
+ frozen
|
|
||||||
+ source
|
+ source
|
||||||
|
|
||||||
* Reorganize support code.
|
* Reorganize support code.
|
||||||
|
|
|
@ -137,7 +137,12 @@ class FrozenImporter:
|
||||||
"""Load a frozen module."""
|
"""Load a frozen module."""
|
||||||
if cls.find_module(fullname) is None:
|
if cls.find_module(fullname) is None:
|
||||||
raise ImportError("{0} is not a frozen module".format(fullname))
|
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):
|
class ChainedImporter(object):
|
||||||
|
|
|
@ -1,26 +1,59 @@
|
||||||
from importlib import machinery
|
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__'
|
def test_module(self):
|
||||||
load_module = staticmethod(lambda name:
|
with support.uncache('__hello__'):
|
||||||
machinery.FrozenImporter.load_module(name))
|
module = machinery.FrozenImporter.load_module('__hello__')
|
||||||
verification = {'__name__': '__phello__', '__file__': '<frozen>',
|
check = {'__name__': '__hello__', '__file__': '<frozen>',
|
||||||
'__package__': None, '__path__': ['__phello__']}
|
|
||||||
|
|
||||||
|
|
||||||
class SubmoduleLoaderTests(LoaderTests):
|
|
||||||
|
|
||||||
name = '__phello__.spam'
|
|
||||||
verification = {'__name__': '__phello__.spam', '__file__': '<frozen>',
|
|
||||||
'__package__': None}
|
'__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))
|
||||||
|
|
||||||
|
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))
|
||||||
|
|
||||||
|
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():
|
def test_main():
|
||||||
from test.support import run_unittest
|
from test.support import run_unittest
|
||||||
run_unittest(LoaderTests, SubmoduleLoaderTests)
|
run_unittest(LoaderTests)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
Loading…
Reference in New Issue