From bf074b37a3192a454f8c156e116eebd0b4588d9e Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Thu, 13 Sep 2018 14:04:29 -0300 Subject: [PATCH] Show deprecation warnings for compat properties Fix #3616 --- changelog/3616.deprecation.rst | 8 ++++++++ doc/en/historical-notes.rst | 10 ++++++++++ src/_pytest/nodes.py | 13 ++++++++----- src/_pytest/python.py | 2 +- testing/deprecated_test.py | 17 +++++++++++++++++ 5 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 changelog/3616.deprecation.rst diff --git a/changelog/3616.deprecation.rst b/changelog/3616.deprecation.rst new file mode 100644 index 000000000..e02e83c20 --- /dev/null +++ b/changelog/3616.deprecation.rst @@ -0,0 +1,8 @@ +The following accesses have been documented as deprecated for years, but are now actually emitting deprecation warnings. + +* Access of ``Module``, ``Function``, ``Class``, ``Instance``, ``File`` and ``Item`` through ``Node`` instances. Now + users will this warning:: + + usage of Function.Module is deprecated, please use pytest.Module instead + + Users should just ``import pytest`` and access those objects using the ``pytest`` module. diff --git a/doc/en/historical-notes.rst b/doc/en/historical-notes.rst index 028ceff9b..9462d700f 100644 --- a/doc/en/historical-notes.rst +++ b/doc/en/historical-notes.rst @@ -175,3 +175,13 @@ Previous to version 2.4 to set a break point in code one needed to use ``pytest. This is no longer needed and one can use the native ``import pdb;pdb.set_trace()`` call directly. For more details see :ref:`breakpoints`. + +"compat" properties +------------------- + +.. deprecated:: 3.9 + +Access of ``Module``, ``Function``, ``Class``, ``Instance``, ``File`` and ``Item`` through ``Node`` instances have long +been documented as deprecated, but started to emit warnings from pytest ``3.9`` and onward. + +Users should just ``import pytest`` and access those objects using the ``pytest`` module. diff --git a/src/_pytest/nodes.py b/src/_pytest/nodes.py index 29d1f0a87..222059d8c 100644 --- a/src/_pytest/nodes.py +++ b/src/_pytest/nodes.py @@ -11,6 +11,7 @@ import _pytest._code from _pytest.compat import getfslineno from _pytest.mark.structures import NodeKeywords, MarkInfo +from _pytest.warning_types import RemovedInPytest4Warning SEP = "/" @@ -61,11 +62,13 @@ class _CompatProperty(object): if obj is None: return self - # TODO: reenable in the features branch - # warnings.warn( - # "usage of {owner!r}.{name} is deprecated, please use pytest.{name} instead".format( - # name=self.name, owner=type(owner).__name__), - # PendingDeprecationWarning, stacklevel=2) + warnings.warn( + "usage of {owner}.{name} is deprecated, please use pytest.{name} instead".format( + name=self.name, owner=owner.__name__ + ), + RemovedInPytest4Warning, + stacklevel=2, + ) return getattr(__import__("pytest"), self.name) diff --git a/src/_pytest/python.py b/src/_pytest/python.py index 051650272..dff7a6950 100644 --- a/src/_pytest/python.py +++ b/src/_pytest/python.py @@ -800,7 +800,7 @@ class Generator(FunctionMixin, PyCollector): "%r generated tests with non-unique name %r" % (self, name) ) seen[name] = True - values.append(self.Function(name, self, args=args, callobj=call)) + values.append(Function(name, self, args=args, callobj=call)) self.warn(deprecated.YIELD_TESTS) return values diff --git a/testing/deprecated_test.py b/testing/deprecated_test.py index fbaca4e30..d53f86e15 100644 --- a/testing/deprecated_test.py +++ b/testing/deprecated_test.py @@ -30,6 +30,23 @@ def test_yield_tests_deprecation(testdir): assert result.stdout.str().count("yield tests are deprecated") == 2 +def test_compat_properties_deprecation(testdir): + testdir.makepyfile( + """ + def test_foo(request): + print(request.node.Module) + """ + ) + result = testdir.runpytest() + result.stdout.fnmatch_lines( + [ + "*test_compat_properties_deprecation.py:2:*usage of Function.Module is deprecated, " + "please use pytest.Module instead*", + "*1 passed, 1 warnings in*", + ] + ) + + @pytest.mark.filterwarnings("default") def test_funcarg_prefix_deprecation(testdir): testdir.makepyfile(