mirror of
https://github.com/python/cpython.git
synced 2025-07-10 04:45:36 +00:00
Issue #19413: Restore pre-3.3 reload() semantics of re-finding modules.
This commit is contained in:
parent
dcdd05b0b4
commit
cdf601281f
5 changed files with 642 additions and 507 deletions
|
@ -1,8 +1,10 @@
|
|||
from . import util
|
||||
|
||||
frozen_init, source_init = util.import_importlib('importlib')
|
||||
frozen_util, source_util = util.import_importlib('importlib.util')
|
||||
frozen_machinery, source_machinery = util.import_importlib('importlib.machinery')
|
||||
|
||||
import os.path
|
||||
import sys
|
||||
from test import support
|
||||
import types
|
||||
|
@ -190,11 +192,129 @@ class ReloadTests:
|
|||
self.assertEqual(actual.spam, 3)
|
||||
self.assertEqual(reloaded.spam, 3)
|
||||
|
||||
def test_reload_missing_loader(self):
|
||||
with support.CleanImport('types'):
|
||||
import types
|
||||
loader = types.__loader__
|
||||
del types.__loader__
|
||||
reloaded = self.init.reload(types)
|
||||
|
||||
self.assertIs(reloaded, types)
|
||||
self.assertIs(sys.modules['types'], types)
|
||||
self.assertEqual(reloaded.__loader__.path, loader.path)
|
||||
|
||||
def test_reload_loader_replaced(self):
|
||||
with support.CleanImport('types'):
|
||||
import types
|
||||
types.__loader__ = None
|
||||
self.init.invalidate_caches()
|
||||
reloaded = self.init.reload(types)
|
||||
|
||||
self.assertIsNot(reloaded.__loader__, None)
|
||||
self.assertIs(reloaded, types)
|
||||
self.assertIs(sys.modules['types'], types)
|
||||
|
||||
def test_reload_location_changed(self):
|
||||
name = 'spam'
|
||||
with support.temp_cwd(None) as cwd:
|
||||
with util.uncache('spam'):
|
||||
with support.DirsOnSysPath(cwd):
|
||||
self.init.invalidate_caches()
|
||||
path = os.path.join(cwd, name + '.py')
|
||||
cached = self.util.cache_from_source(path)
|
||||
expected = {'__name__': name,
|
||||
'__package__': '',
|
||||
'__file__': path,
|
||||
'__cached__': cached,
|
||||
'__doc__': None,
|
||||
'__builtins__': __builtins__,
|
||||
}
|
||||
support.create_empty_file(path)
|
||||
module = self.init.import_module(name)
|
||||
ns = vars(module)
|
||||
del ns['__initializing__']
|
||||
loader = ns.pop('__loader__')
|
||||
self.assertEqual(loader.path, path)
|
||||
self.assertEqual(ns, expected)
|
||||
|
||||
self.init.invalidate_caches()
|
||||
init_path = os.path.join(cwd, name, '__init__.py')
|
||||
cached = self.util.cache_from_source(init_path)
|
||||
expected = {'__name__': name,
|
||||
'__package__': name,
|
||||
'__file__': init_path,
|
||||
'__cached__': cached,
|
||||
'__path__': [os.path.dirname(init_path)],
|
||||
'__doc__': None,
|
||||
'__builtins__': __builtins__,
|
||||
}
|
||||
os.mkdir(name)
|
||||
os.rename(path, init_path)
|
||||
reloaded = self.init.reload(module)
|
||||
ns = vars(reloaded)
|
||||
del ns['__initializing__']
|
||||
loader = ns.pop('__loader__')
|
||||
self.assertIs(reloaded, module)
|
||||
self.assertEqual(loader.path, init_path)
|
||||
self.assertEqual(ns, expected)
|
||||
|
||||
def test_reload_namespace_changed(self):
|
||||
self.maxDiff = None
|
||||
name = 'spam'
|
||||
with support.temp_cwd(None) as cwd:
|
||||
with util.uncache('spam'):
|
||||
with support.DirsOnSysPath(cwd):
|
||||
self.init.invalidate_caches()
|
||||
bad_path = os.path.join(cwd, name, '__init.py')
|
||||
cached = self.util.cache_from_source(bad_path)
|
||||
expected = {'__name__': name,
|
||||
'__package__': name,
|
||||
'__doc__': None,
|
||||
}
|
||||
os.mkdir(name)
|
||||
with open(bad_path, 'w') as init_file:
|
||||
init_file.write('eggs = None')
|
||||
module = self.init.import_module(name)
|
||||
ns = vars(module)
|
||||
del ns['__initializing__']
|
||||
loader = ns.pop('__loader__')
|
||||
path = ns.pop('__path__')
|
||||
self.assertEqual(list(path),
|
||||
[os.path.dirname(bad_path)] * 2)
|
||||
with self.assertRaises(AttributeError):
|
||||
# a NamespaceLoader
|
||||
loader.path
|
||||
self.assertEqual(ns, expected)
|
||||
|
||||
self.init.invalidate_caches()
|
||||
init_path = os.path.join(cwd, name, '__init__.py')
|
||||
cached = self.util.cache_from_source(init_path)
|
||||
expected = {'__name__': name,
|
||||
'__package__': name,
|
||||
'__file__': init_path,
|
||||
'__cached__': cached,
|
||||
'__path__': [os.path.dirname(init_path)],
|
||||
'__doc__': None,
|
||||
'__builtins__': __builtins__,
|
||||
'eggs': None,
|
||||
}
|
||||
os.rename(bad_path, init_path)
|
||||
reloaded = self.init.reload(module)
|
||||
ns = vars(reloaded)
|
||||
del ns['__initializing__']
|
||||
loader = ns.pop('__loader__')
|
||||
self.assertIs(reloaded, module)
|
||||
self.assertEqual(loader.path, init_path)
|
||||
self.assertEqual(ns, expected)
|
||||
|
||||
|
||||
class Frozen_ReloadTests(ReloadTests, unittest.TestCase):
|
||||
init = frozen_init
|
||||
util = frozen_util
|
||||
|
||||
class Source_ReloadTests(ReloadTests, unittest.TestCase):
|
||||
init = source_init
|
||||
util = source_util
|
||||
|
||||
|
||||
class InvalidateCacheTests:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue