Add additional docs for uncooperative ctor deprecation (#9498)
* Add additional docs for uncooperative ctor deprecation Fixes #9488 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Break up long line * Recommend kwonly args Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
cd8bfa94ec
commit
396a7def75
|
@ -56,6 +56,10 @@ Plugins which implement custom items and collectors are encouraged to replace
|
||||||
``fspath`` parameters (``py.path.local``) with ``path`` parameters
|
``fspath`` parameters (``py.path.local``) with ``path`` parameters
|
||||||
(``pathlib.Path``), and drop any other usage of the ``py`` library if possible.
|
(``pathlib.Path``), and drop any other usage of the ``py`` library if possible.
|
||||||
|
|
||||||
|
If possible, plugins with custom items should use :ref:`cooperative
|
||||||
|
constructors <uncooperative-constructors-deprecated>` to avoid hardcoding
|
||||||
|
arguments they only pass on to the superclass.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
The name of the :class:`~_pytest.nodes.Node` arguments and attributes (the
|
The name of the :class:`~_pytest.nodes.Node` arguments and attributes (the
|
||||||
new attribute being ``path``) is **the opposite** of the situation for
|
new attribute being ``path``) is **the opposite** of the situation for
|
||||||
|
@ -191,6 +195,40 @@ Instead, a separate collector node should be used, which collects the item. See
|
||||||
.. _example pr fixing inheritance: https://github.com/asmeurer/pytest-flakes/pull/40/files
|
.. _example pr fixing inheritance: https://github.com/asmeurer/pytest-flakes/pull/40/files
|
||||||
|
|
||||||
|
|
||||||
|
.. _uncooperative-constructors-deprecated:
|
||||||
|
|
||||||
|
Constructors of custom :class:`pytest.Node` subclasses should take ``**kwargs``
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. deprecated:: 7.0
|
||||||
|
|
||||||
|
If custom subclasses of nodes like :class:`pytest.Item` override the
|
||||||
|
``__init__`` method, they should take ``**kwargs``. Thus,
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
class CustomItem(pytest.Item):
|
||||||
|
def __init__(self, name, parent, additional_arg):
|
||||||
|
super().__init__(name, parent)
|
||||||
|
self.additional_arg = additional_arg
|
||||||
|
|
||||||
|
should be turned into:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
class CustomItem(pytest.Item):
|
||||||
|
def __init__(self, *, additional_arg, **kwargs):
|
||||||
|
super().__init__(**kwargs)
|
||||||
|
self.additional_arg = additional_arg
|
||||||
|
|
||||||
|
to avoid hard-coding the arguments pytest can pass to the superclass.
|
||||||
|
See :ref:`non-python tests` for a full example.
|
||||||
|
|
||||||
|
For cases without conflicts, no deprecation warning is emitted. For cases with
|
||||||
|
conflicts (such as :class:`pytest.File` now taking ``path`` instead of
|
||||||
|
``fspath``, as :ref:`outlined above <node-ctor-fspath-deprecation>`), a
|
||||||
|
deprecation warning is now raised.
|
||||||
|
|
||||||
Backward compatibilities in ``Parser.addoption``
|
Backward compatibilities in ``Parser.addoption``
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -18,8 +18,8 @@ class YamlFile(pytest.File):
|
||||||
|
|
||||||
|
|
||||||
class YamlItem(pytest.Item):
|
class YamlItem(pytest.Item):
|
||||||
def __init__(self, name, parent, spec):
|
def __init__(self, *, spec, **kwargs):
|
||||||
super().__init__(name, parent)
|
super().__init__(**kwargs)
|
||||||
self.spec = spec
|
self.spec = spec
|
||||||
|
|
||||||
def runtest(self):
|
def runtest(self):
|
||||||
|
|
|
@ -145,7 +145,10 @@ class NodeMeta(type):
|
||||||
|
|
||||||
warnings.warn(
|
warnings.warn(
|
||||||
PytestDeprecationWarning(
|
PytestDeprecationWarning(
|
||||||
f"{self} is not using a cooperative constructor and only takes {set(known_kw)}"
|
f"{self} is not using a cooperative constructor and only takes {set(known_kw)}.\n"
|
||||||
|
"See https://docs.pytest.org/en/stable/deprecations.html"
|
||||||
|
"#constructors-of-custom-pytest-node-subclasses-should-take-kwargs "
|
||||||
|
"for more details."
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue