From ed85c831548f4bae256b9ce90973ab74bf95c59f Mon Sep 17 00:00:00 2001 From: Zac Hatfield-Dodds Date: Tue, 25 Jun 2019 13:06:02 +1000 Subject: [PATCH] Deprecate funcargnames alias --- changelog/466.deprecation.rst | 2 ++ doc/en/deprecations.rst | 15 +++++++++++++++ src/_pytest/compat.py | 4 ++++ src/_pytest/deprecated.py | 5 +++++ src/_pytest/fixtures.py | 2 +- testing/python/fixtures.py | 11 +++++++---- testing/python/metafunc.py | 2 +- 7 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 changelog/466.deprecation.rst diff --git a/changelog/466.deprecation.rst b/changelog/466.deprecation.rst new file mode 100644 index 000000000..65775c386 --- /dev/null +++ b/changelog/466.deprecation.rst @@ -0,0 +1,2 @@ +The ``funcargnames`` attribute has been an alias for ``fixturenames`` since +pytest 2.3, and is now deprecated in code too. diff --git a/doc/en/deprecations.rst b/doc/en/deprecations.rst index 6b4f360b5..e2399dd41 100644 --- a/doc/en/deprecations.rst +++ b/doc/en/deprecations.rst @@ -19,6 +19,21 @@ Below is a complete list of all pytest features which are considered deprecated. :class:`_pytest.warning_types.PytestWarning` or subclasses, which can be filtered using :ref:`standard warning filters `. + +Removal of ``funcargnames`` alias for ``fixturenames`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. deprecated:: 5.0 + +The ``FixtureRequest``, ``Metafunc``, and ``Function`` classes track the names of +their associated fixtures, with the aptly-named ``fixturenames`` attribute. + +Prior to pytest 2.3, this attribute was named ``funcargnames``, and we have kept +that as an alias since. It is finally due for removal, as it is often confusing +in places where we or plugin authors must distinguish between fixture names and +names supplied by non-fixture things such as ``pytest.mark.parametrize``. + + .. _`raises message deprecated`: ``"message"`` parameter of ``pytest.raises`` diff --git a/src/_pytest/compat.py b/src/_pytest/compat.py index 2c964f473..d238061b4 100644 --- a/src/_pytest/compat.py +++ b/src/_pytest/compat.py @@ -325,4 +325,8 @@ class FuncargnamesCompatAttr: @property def funcargnames(self): """ alias attribute for ``fixturenames`` for pre-2.3 compatibility""" + import warnings + from _pytest.deprecated import FUNCARGNAMES + + warnings.warn(FUNCARGNAMES, stacklevel=2) return self.fixturenames diff --git a/src/_pytest/deprecated.py b/src/_pytest/deprecated.py index 1c544fd36..e31b9eb0e 100644 --- a/src/_pytest/deprecated.py +++ b/src/_pytest/deprecated.py @@ -40,6 +40,11 @@ GETFUNCARGVALUE = RemovedInPytest4Warning( "getfuncargvalue is deprecated, use getfixturevalue" ) +FUNCARGNAMES = PytestDeprecationWarning( + "The `funcargnames` attribute was an alias for `fixturenames`, " + "since pytest 2.3 - use the newer attribute instead." +) + RAISES_MESSAGE_PARAMETER = PytestDeprecationWarning( "The 'message' parameter is deprecated.\n" "(did you mean to use `match='some regex'` to check the exception message?)\n" diff --git a/src/_pytest/fixtures.py b/src/_pytest/fixtures.py index 0a792d11d..3262b65bb 100644 --- a/src/_pytest/fixtures.py +++ b/src/_pytest/fixtures.py @@ -654,7 +654,7 @@ class SubRequest(FixtureRequest): # if the executing fixturedef was not explicitly requested in the argument list (via # getfixturevalue inside the fixture call) then ensure this fixture def will be finished # first - if fixturedef.argname not in self.funcargnames: + if fixturedef.argname not in self.fixturenames: fixturedef.addfinalizer( functools.partial(self._fixturedef.finish, request=self) ) diff --git a/testing/python/fixtures.py b/testing/python/fixtures.py index 1d39079ea..c0c230ccf 100644 --- a/testing/python/fixtures.py +++ b/testing/python/fixtures.py @@ -793,12 +793,15 @@ class TestRequestBasic: """ import pytest def pytest_generate_tests(metafunc): - assert metafunc.funcargnames == metafunc.fixturenames + with pytest.warns(pytest.PytestDeprecationWarning): + assert metafunc.funcargnames == metafunc.fixturenames @pytest.fixture def fn(request): - assert request._pyfuncitem.funcargnames == \ - request._pyfuncitem.fixturenames - return request.funcargnames, request.fixturenames + with pytest.warns(pytest.PytestDeprecationWarning): + assert request._pyfuncitem.funcargnames == \ + request._pyfuncitem.fixturenames + with pytest.warns(pytest.PytestDeprecationWarning): + return request.funcargnames, request.fixturenames def test_hello(fn): assert fn[0] == fn[1] diff --git a/testing/python/metafunc.py b/testing/python/metafunc.py index df93d4ef5..542557252 100644 --- a/testing/python/metafunc.py +++ b/testing/python/metafunc.py @@ -1205,7 +1205,7 @@ class TestMetafuncFunctional: import pytest values = [] def pytest_generate_tests(metafunc): - if "arg" in metafunc.funcargnames: + if "arg" in metafunc.fixturenames: metafunc.parametrize("arg", [1,2], indirect=True, scope=%r) @pytest.fixture