Fix `reload()` with modules handled via `python_files`
If a module exists in `sys.modules` already, `load_module` has to return it. Fixes https://bitbucket.org/pytest-dev/pytest/issue/435 --HG-- branch : fix-reload
This commit is contained in:
parent
41e6b04f0b
commit
c629f6b18b
|
@ -146,6 +146,12 @@ class AssertionRewritingHook(object):
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def load_module(self, name):
|
def load_module(self, name):
|
||||||
|
# If there is an existing module object named 'fullname' in
|
||||||
|
# sys.modules, the loader must use that existing module. (Otherwise,
|
||||||
|
# the reload() builtin will not work correctly.)
|
||||||
|
if name in sys.modules:
|
||||||
|
return sys.modules[name]
|
||||||
|
|
||||||
co, pyc = self.modules.pop(name)
|
co, pyc = self.modules.pop(name)
|
||||||
# I wish I could just call imp.load_compiled here, but __file__ has to
|
# I wish I could just call imp.load_compiled here, but __file__ has to
|
||||||
# be set properly. In Python 3.2+, this all would be handled correctly
|
# be set properly. In Python 3.2+, this all would be handled correctly
|
||||||
|
|
|
@ -641,3 +641,27 @@ class TestAssertionRewriteHookDetails(object):
|
||||||
pyc.write(contents[:strip_bytes], mode='wb')
|
pyc.write(contents[:strip_bytes], mode='wb')
|
||||||
|
|
||||||
assert _read_pyc(source, str(pyc)) is None # no error
|
assert _read_pyc(source, str(pyc)) is None # no error
|
||||||
|
|
||||||
|
def test_reload_is_same(self, testdir):
|
||||||
|
# A file that will be picked up during collecting.
|
||||||
|
testdir.tmpdir.join("file.py").ensure()
|
||||||
|
testdir.tmpdir.join("pytest.ini").write(py.std.textwrap.dedent("""
|
||||||
|
[pytest]
|
||||||
|
python_files = *.py
|
||||||
|
"""))
|
||||||
|
|
||||||
|
testdir.makepyfile(test_fun="""
|
||||||
|
import sys
|
||||||
|
try:
|
||||||
|
from imp import reload
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_loader():
|
||||||
|
import file
|
||||||
|
assert sys.modules["file"] is reload(file)
|
||||||
|
""")
|
||||||
|
result = testdir.runpytest('-s')
|
||||||
|
result.stdout.fnmatch_lines([
|
||||||
|
"* 1 passed*",
|
||||||
|
])
|
||||||
|
|
Loading…
Reference in New Issue