Merge pull request #2011 from nicoddemus/false-rewrite-warnings

Fix false-positive warnings from assertion rewrite hook
This commit is contained in:
Ronny Pfannschmidt 2016-10-24 12:19:23 +02:00 committed by GitHub
commit 35d154f580
3 changed files with 32 additions and 2 deletions

View File

@ -12,6 +12,15 @@
* When loading plugins, import errors which contain non-ascii messages are now properly handled in Python 2 (`#1998`_). * When loading plugins, import errors which contain non-ascii messages are now properly handled in Python 2 (`#1998`_).
Thanks `@nicoddemus`_ for the PR. Thanks `@nicoddemus`_ for the PR.
* Fixed false-positives warnings from assertion rewrite hook for modules that were rewritten but
were later marked explicitly by ``pytest.register_assert_rewrite``
or implicitly as a plugin (`#2005`_).
Thanks `@RonnyPfannschmidt`_ for the report and `@nicoddemus`_ for the PR.
*
*
* *
@ -21,7 +30,7 @@
.. _#1976: https://github.com/pytest-dev/pytest/issues/1976 .. _#1976: https://github.com/pytest-dev/pytest/issues/1976
.. _#1998: https://github.com/pytest-dev/pytest/issues/1998 .. _#1998: https://github.com/pytest-dev/pytest/issues/1998
.. _#2004: https://github.com/pytest-dev/pytest/issues/2004 .. _#2004: https://github.com/pytest-dev/pytest/issues/2004
.. _#2005: https://github.com/pytest-dev/pytest/issues/2005
3.0.3 3.0.3

View File

@ -51,6 +51,7 @@ class AssertionRewritingHook(object):
self.fnpats = config.getini("python_files") self.fnpats = config.getini("python_files")
self.session = None self.session = None
self.modules = {} self.modules = {}
self._rewritten_names = set()
self._register_with_pkg_resources() self._register_with_pkg_resources()
self._must_rewrite = set() self._must_rewrite = set()
@ -92,6 +93,8 @@ class AssertionRewritingHook(object):
if not self._should_rewrite(name, fn_pypath, state): if not self._should_rewrite(name, fn_pypath, state):
return None return None
self._rewritten_names.add(name)
# The requested module looks like a test file, so rewrite it. This is # The requested module looks like a test file, so rewrite it. This is
# the most magical part of the process: load the source, rewrite the # the most magical part of the process: load the source, rewrite the
# asserts, and load the rewritten source. We also cache the rewritten # asserts, and load the rewritten source. We also cache the rewritten
@ -178,7 +181,9 @@ class AssertionRewritingHook(object):
""" """
already_imported = set(names).intersection(set(sys.modules)) already_imported = set(names).intersection(set(sys.modules))
if already_imported: if already_imported:
self._warn_already_imported(already_imported) for name in names:
if name not in self._rewritten_names:
self._warn_already_imported(already_imported)
self._must_rewrite.update(names) self._must_rewrite.update(names)
def _warn_already_imported(self, names): def _warn_already_imported(self, names):

View File

@ -543,6 +543,22 @@ def test_rewritten():
''') ''')
assert testdir.runpytest_subprocess().ret == 0 assert testdir.runpytest_subprocess().ret == 0
def test_remember_rewritten_modules(self, pytestconfig, testdir, monkeypatch):
"""
AssertionRewriteHook should remember rewritten modules so it
doesn't give false positives (#2005).
"""
monkeypatch.syspath_prepend(testdir.tmpdir)
testdir.makepyfile(test_remember_rewritten_modules='')
warnings = []
hook = AssertionRewritingHook(pytestconfig)
monkeypatch.setattr(hook.config, 'warn', lambda code, msg: warnings.append(msg))
hook.find_module('test_remember_rewritten_modules')
hook.load_module('test_remember_rewritten_modules')
hook.mark_rewrite('test_remember_rewritten_modules')
hook.mark_rewrite('test_remember_rewritten_modules')
assert warnings == []
class TestAssertionRewriteHookDetails(object): class TestAssertionRewriteHookDetails(object):
def test_loader_is_package_false_for_module(self, testdir): def test_loader_is_package_false_for_module(self, testdir):