Move code about 'pytest_plugins' error to a more appropriate place
It is no longer deprecated, but part of the normal code for 'config'
This commit is contained in:
		
							parent
							
								
									683b2632b4
								
							
						
					
					
						commit
						647d89c444
					
				|  | @ -204,6 +204,19 @@ def _prepareconfig(args=None, plugins=None): | ||||||
|         raise |         raise | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | def _fail_on_non_top_pytest_plugins(conftestpath, confcutdir): | ||||||
|  |     msg = ( | ||||||
|  |         "Defining 'pytest_plugins' in a non-top-level conftest is no longer supported:\n" | ||||||
|  |         "It affects the entire test suite instead of just below the conftest as expected.\n" | ||||||
|  |         "  {}\n" | ||||||
|  |         "Please move it to a top level conftest file at the rootdir:\n" | ||||||
|  |         "  {}\n" | ||||||
|  |         "For more information, visit:\n" | ||||||
|  |         "  https://docs.pytest.org/en/latest/deprecations.html#pytest-plugins-in-non-top-level-conftest-files" | ||||||
|  |     ) | ||||||
|  |     fail(msg.format(conftestpath, confcutdir), pytrace=False) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class PytestPluginManager(PluginManager): | class PytestPluginManager(PluginManager): | ||||||
|     """ |     """ | ||||||
|     Overwrites :py:class:`pluggy.PluginManager <pluggy.PluginManager>` to add pytest-specific |     Overwrites :py:class:`pluggy.PluginManager <pluggy.PluginManager>` to add pytest-specific | ||||||
|  | @ -424,16 +437,7 @@ class PytestPluginManager(PluginManager): | ||||||
|                     and self._configured |                     and self._configured | ||||||
|                     and not self._using_pyargs |                     and not self._using_pyargs | ||||||
|                 ): |                 ): | ||||||
|                     from _pytest.deprecated import ( |                     _fail_on_non_top_pytest_plugins(conftestpath, self._confcutdir) | ||||||
|                         PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST, |  | ||||||
|                     ) |  | ||||||
| 
 |  | ||||||
|                     fail( |  | ||||||
|                         PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST.format( |  | ||||||
|                             conftestpath, self._confcutdir |  | ||||||
|                         ), |  | ||||||
|                         pytrace=False, |  | ||||||
|                     ) |  | ||||||
|             except Exception: |             except Exception: | ||||||
|                 raise ConftestImportFailure(conftestpath, sys.exc_info()) |                 raise ConftestImportFailure(conftestpath, sys.exc_info()) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -48,16 +48,6 @@ RESULT_LOG = PytestDeprecationWarning( | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST = ( |  | ||||||
|     "Defining 'pytest_plugins' in a non-top-level conftest is no longer supported " |  | ||||||
|     "because it affects the entire directory tree in a non-explicit way.\n" |  | ||||||
|     "  {}\n" |  | ||||||
|     "Please move it to a top level conftest file at the rootdir:\n" |  | ||||||
|     "  {}\n" |  | ||||||
|     "For more information, visit:\n" |  | ||||||
|     "  https://docs.pytest.org/en/latest/deprecations.html#pytest-plugins-in-non-top-level-conftest-files" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| PYTEST_CONFIG_GLOBAL = PytestDeprecationWarning( | PYTEST_CONFIG_GLOBAL = PytestDeprecationWarning( | ||||||
|     "the `pytest.config` global is deprecated.  Please use `request.config` " |     "the `pytest.config` global is deprecated.  Please use `request.config` " | ||||||
|     "or `pytest_configure` (if you're a pytest plugin) instead." |     "or `pytest_configure` (if you're a pytest plugin) instead." | ||||||
|  |  | ||||||
|  | @ -1,8 +1,5 @@ | ||||||
| import os |  | ||||||
| 
 |  | ||||||
| import pytest | import pytest | ||||||
| from _pytest import deprecated | from _pytest import deprecated | ||||||
| from _pytest.warnings import SHOW_PYTEST_WARNINGS_ARG |  | ||||||
| 
 | 
 | ||||||
| pytestmark = pytest.mark.pytester_example_path("deprecated") | pytestmark = pytest.mark.pytester_example_path("deprecated") | ||||||
| 
 | 
 | ||||||
|  | @ -75,121 +72,6 @@ def test_external_plugins_integrated(testdir, plugin): | ||||||
|         testdir.parseconfig("-p", plugin) |         testdir.parseconfig("-p", plugin) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def test_pytest_plugins_in_non_top_level_conftest_deprecated(testdir): |  | ||||||
|     from _pytest.deprecated import PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST |  | ||||||
| 
 |  | ||||||
|     testdir.makepyfile( |  | ||||||
|         **{ |  | ||||||
|             "subdirectory/conftest.py": """ |  | ||||||
|         pytest_plugins=['capture'] |  | ||||||
|     """ |  | ||||||
|         } |  | ||||||
|     ) |  | ||||||
|     testdir.makepyfile( |  | ||||||
|         """ |  | ||||||
|         def test_func(): |  | ||||||
|             pass |  | ||||||
|     """ |  | ||||||
|     ) |  | ||||||
|     res = testdir.runpytest(SHOW_PYTEST_WARNINGS_ARG) |  | ||||||
|     assert res.ret == 2 |  | ||||||
|     msg = str(PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST).splitlines()[0] |  | ||||||
|     res.stdout.fnmatch_lines( |  | ||||||
|         ["*{msg}*".format(msg=msg), "*subdirectory{sep}conftest.py*".format(sep=os.sep)] |  | ||||||
|     ) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @pytest.mark.parametrize("use_pyargs", [True, False]) |  | ||||||
| def test_pytest_plugins_in_non_top_level_conftest_unsupported_pyargs( |  | ||||||
|     testdir, use_pyargs |  | ||||||
| ): |  | ||||||
|     """When using --pyargs, do not emit the warning about non-top-level conftest warnings (#4039, #4044)""" |  | ||||||
|     from _pytest.deprecated import PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST |  | ||||||
| 
 |  | ||||||
|     files = { |  | ||||||
|         "src/pkg/__init__.py": "", |  | ||||||
|         "src/pkg/conftest.py": "", |  | ||||||
|         "src/pkg/test_root.py": "def test(): pass", |  | ||||||
|         "src/pkg/sub/__init__.py": "", |  | ||||||
|         "src/pkg/sub/conftest.py": "pytest_plugins=['capture']", |  | ||||||
|         "src/pkg/sub/test_bar.py": "def test(): pass", |  | ||||||
|     } |  | ||||||
|     testdir.makepyfile(**files) |  | ||||||
|     testdir.syspathinsert(testdir.tmpdir.join("src")) |  | ||||||
| 
 |  | ||||||
|     args = ("--pyargs", "pkg") if use_pyargs else () |  | ||||||
|     args += (SHOW_PYTEST_WARNINGS_ARG,) |  | ||||||
|     res = testdir.runpytest(*args) |  | ||||||
|     assert res.ret == (0 if use_pyargs else 2) |  | ||||||
|     msg = str(PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST).splitlines()[0] |  | ||||||
|     if use_pyargs: |  | ||||||
|         assert msg not in res.stdout.str() |  | ||||||
|     else: |  | ||||||
|         res.stdout.fnmatch_lines(["*{msg}*".format(msg=msg)]) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def test_pytest_plugins_in_non_top_level_conftest_unsupported_no_top_level_conftest( |  | ||||||
|     testdir |  | ||||||
| ): |  | ||||||
|     from _pytest.deprecated import PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST |  | ||||||
| 
 |  | ||||||
|     subdirectory = testdir.tmpdir.join("subdirectory") |  | ||||||
|     subdirectory.mkdir() |  | ||||||
|     testdir.makeconftest( |  | ||||||
|         """ |  | ||||||
|         pytest_plugins=['capture'] |  | ||||||
|     """ |  | ||||||
|     ) |  | ||||||
|     testdir.tmpdir.join("conftest.py").move(subdirectory.join("conftest.py")) |  | ||||||
| 
 |  | ||||||
|     testdir.makepyfile( |  | ||||||
|         """ |  | ||||||
|         def test_func(): |  | ||||||
|             pass |  | ||||||
|     """ |  | ||||||
|     ) |  | ||||||
| 
 |  | ||||||
|     res = testdir.runpytest_subprocess() |  | ||||||
|     assert res.ret == 2 |  | ||||||
|     msg = str(PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST).splitlines()[0] |  | ||||||
|     res.stdout.fnmatch_lines( |  | ||||||
|         ["*{msg}*".format(msg=msg), "*subdirectory{sep}conftest.py*".format(sep=os.sep)] |  | ||||||
|     ) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def test_pytest_plugins_in_non_top_level_conftest_unsupported_no_false_positives( |  | ||||||
|     testdir |  | ||||||
| ): |  | ||||||
|     from _pytest.deprecated import PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST |  | ||||||
| 
 |  | ||||||
|     subdirectory = testdir.tmpdir.join("subdirectory") |  | ||||||
|     subdirectory.mkdir() |  | ||||||
|     testdir.makeconftest( |  | ||||||
|         """ |  | ||||||
|         pass |  | ||||||
|     """ |  | ||||||
|     ) |  | ||||||
|     testdir.tmpdir.join("conftest.py").move(subdirectory.join("conftest.py")) |  | ||||||
| 
 |  | ||||||
|     testdir.makeconftest( |  | ||||||
|         """ |  | ||||||
|         import warnings |  | ||||||
|         warnings.filterwarnings('always', category=DeprecationWarning) |  | ||||||
|         pytest_plugins=['capture'] |  | ||||||
|     """ |  | ||||||
|     ) |  | ||||||
|     testdir.makepyfile( |  | ||||||
|         """ |  | ||||||
|         def test_func(): |  | ||||||
|             pass |  | ||||||
|     """ |  | ||||||
|     ) |  | ||||||
|     res = testdir.runpytest_subprocess() |  | ||||||
|     assert res.ret == 0 |  | ||||||
|     msg = str(PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST).splitlines()[0] |  | ||||||
|     assert msg not in res.stdout.str() |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def test_fixture_named_request(testdir): | def test_fixture_named_request(testdir): | ||||||
|     testdir.copy_example() |     testdir.copy_example() | ||||||
|     result = testdir.runpytest() |     result = testdir.runpytest() | ||||||
|  |  | ||||||
|  | @ -1,3 +1,4 @@ | ||||||
|  | import os | ||||||
| import sys | import sys | ||||||
| import textwrap | import textwrap | ||||||
| 
 | 
 | ||||||
|  | @ -1242,3 +1243,116 @@ def test_config_blocked_default_plugins(testdir, plugin): | ||||||
|         result.stdout.fnmatch_lines(["* 1 failed in *"]) |         result.stdout.fnmatch_lines(["* 1 failed in *"]) | ||||||
|     else: |     else: | ||||||
|         assert result.stdout.lines == [""] |         assert result.stdout.lines == [""] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class TestPytestPluginsVariable: | ||||||
|  |     def test_pytest_plugins_in_non_top_level_conftest_unsupported(self, testdir): | ||||||
|  |         testdir.makepyfile( | ||||||
|  |             **{ | ||||||
|  |                 "subdirectory/conftest.py": """ | ||||||
|  |             pytest_plugins=['capture'] | ||||||
|  |         """ | ||||||
|  |             } | ||||||
|  |         ) | ||||||
|  |         testdir.makepyfile( | ||||||
|  |             """ | ||||||
|  |             def test_func(): | ||||||
|  |                 pass | ||||||
|  |         """ | ||||||
|  |         ) | ||||||
|  |         res = testdir.runpytest() | ||||||
|  |         assert res.ret == 2 | ||||||
|  |         msg = "Defining 'pytest_plugins' in a non-top-level conftest is no longer supported" | ||||||
|  |         res.stdout.fnmatch_lines( | ||||||
|  |             [ | ||||||
|  |                 "*{msg}*".format(msg=msg), | ||||||
|  |                 "*subdirectory{sep}conftest.py*".format(sep=os.sep), | ||||||
|  |             ] | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |     @pytest.mark.parametrize("use_pyargs", [True, False]) | ||||||
|  |     def test_pytest_plugins_in_non_top_level_conftest_unsupported_pyargs( | ||||||
|  |         self, testdir, use_pyargs | ||||||
|  |     ): | ||||||
|  |         """When using --pyargs, do not emit the warning about non-top-level conftest warnings (#4039, #4044)""" | ||||||
|  | 
 | ||||||
|  |         files = { | ||||||
|  |             "src/pkg/__init__.py": "", | ||||||
|  |             "src/pkg/conftest.py": "", | ||||||
|  |             "src/pkg/test_root.py": "def test(): pass", | ||||||
|  |             "src/pkg/sub/__init__.py": "", | ||||||
|  |             "src/pkg/sub/conftest.py": "pytest_plugins=['capture']", | ||||||
|  |             "src/pkg/sub/test_bar.py": "def test(): pass", | ||||||
|  |         } | ||||||
|  |         testdir.makepyfile(**files) | ||||||
|  |         testdir.syspathinsert(testdir.tmpdir.join("src")) | ||||||
|  | 
 | ||||||
|  |         args = ("--pyargs", "pkg") if use_pyargs else () | ||||||
|  |         res = testdir.runpytest(*args) | ||||||
|  |         assert res.ret == (0 if use_pyargs else 2) | ||||||
|  |         msg = ( | ||||||
|  |             msg | ||||||
|  |         ) = "Defining 'pytest_plugins' in a non-top-level conftest is no longer supported" | ||||||
|  |         if use_pyargs: | ||||||
|  |             assert msg not in res.stdout.str() | ||||||
|  |         else: | ||||||
|  |             res.stdout.fnmatch_lines(["*{msg}*".format(msg=msg)]) | ||||||
|  | 
 | ||||||
|  |     def test_pytest_plugins_in_non_top_level_conftest_unsupported_no_top_level_conftest( | ||||||
|  |         self, testdir | ||||||
|  |     ): | ||||||
|  |         subdirectory = testdir.tmpdir.join("subdirectory") | ||||||
|  |         subdirectory.mkdir() | ||||||
|  |         testdir.makeconftest( | ||||||
|  |             """ | ||||||
|  |             pytest_plugins=['capture'] | ||||||
|  |         """ | ||||||
|  |         ) | ||||||
|  |         testdir.tmpdir.join("conftest.py").move(subdirectory.join("conftest.py")) | ||||||
|  | 
 | ||||||
|  |         testdir.makepyfile( | ||||||
|  |             """ | ||||||
|  |             def test_func(): | ||||||
|  |                 pass | ||||||
|  |         """ | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |         res = testdir.runpytest_subprocess() | ||||||
|  |         assert res.ret == 2 | ||||||
|  |         msg = "Defining 'pytest_plugins' in a non-top-level conftest is no longer supported" | ||||||
|  |         res.stdout.fnmatch_lines( | ||||||
|  |             [ | ||||||
|  |                 "*{msg}*".format(msg=msg), | ||||||
|  |                 "*subdirectory{sep}conftest.py*".format(sep=os.sep), | ||||||
|  |             ] | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |     def test_pytest_plugins_in_non_top_level_conftest_unsupported_no_false_positives( | ||||||
|  |         self, testdir | ||||||
|  |     ): | ||||||
|  |         subdirectory = testdir.tmpdir.join("subdirectory") | ||||||
|  |         subdirectory.mkdir() | ||||||
|  |         testdir.makeconftest( | ||||||
|  |             """ | ||||||
|  |             pass | ||||||
|  |         """ | ||||||
|  |         ) | ||||||
|  |         testdir.tmpdir.join("conftest.py").move(subdirectory.join("conftest.py")) | ||||||
|  | 
 | ||||||
|  |         testdir.makeconftest( | ||||||
|  |             """ | ||||||
|  |             import warnings | ||||||
|  |             warnings.filterwarnings('always', category=DeprecationWarning) | ||||||
|  |             pytest_plugins=['capture'] | ||||||
|  |         """ | ||||||
|  |         ) | ||||||
|  |         testdir.makepyfile( | ||||||
|  |             """ | ||||||
|  |             def test_func(): | ||||||
|  |                 pass | ||||||
|  |         """ | ||||||
|  |         ) | ||||||
|  |         res = testdir.runpytest_subprocess() | ||||||
|  |         assert res.ret == 0 | ||||||
|  |         msg = "Defining 'pytest_plugins' in a non-top-level conftest is no longer supported" | ||||||
|  |         assert msg not in res.stdout.str() | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue