Merge pull request #2011 from nicoddemus/false-rewrite-warnings
Fix false-positive warnings from assertion rewrite hook
This commit is contained in:
		
						commit
						35d154f580
					
				|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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,6 +181,8 @@ 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: | ||||||
|  |             for name in names: | ||||||
|  |                 if name not in self._rewritten_names: | ||||||
|                     self._warn_already_imported(already_imported) |                     self._warn_already_imported(already_imported) | ||||||
|         self._must_rewrite.update(names) |         self._must_rewrite.update(names) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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): | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue