Remove deprecated `Parser.addoption` backward compatibilities

This commit is contained in:
Ran Benita 2024-01-01 13:22:02 +02:00
parent 1f8b39ed32
commit 10fbb2325f
4 changed files with 14 additions and 68 deletions

View File

@ -374,18 +374,6 @@ Users expected in this case that the ``usefixtures`` mark would have its intende
Now pytest will issue a warning when it encounters this problem, and will raise an error in the future versions. Now pytest will issue a warning when it encounters this problem, and will raise an error in the future versions.
Backward compatibilities in ``Parser.addoption``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. deprecated:: 2.4
Several behaviors of :meth:`Parser.addoption <pytest.Parser.addoption>` are now
scheduled for removal in pytest 8 (deprecated since pytest 2.4.0):
- ``parser.addoption(..., help=".. %default ..")`` - use ``%(default)s`` instead.
- ``parser.addoption(..., type="int/string/float/complex")`` - use ``type=int`` etc. instead.
Using ``pytest.warns(None)`` Using ``pytest.warns(None)``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -457,6 +445,19 @@ an appropriate period of deprecation has passed.
Some breaking changes which could not be deprecated are also listed. Some breaking changes which could not be deprecated are also listed.
Backward compatibilities in ``Parser.addoption``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. deprecated:: 2.4
.. versionremoved:: 8.0
Several behaviors of :meth:`Parser.addoption <pytest.Parser.addoption>` are now
removed in pytest 8 (deprecated since pytest 2.4.0):
- ``parser.addoption(..., help=".. %default ..")`` - use ``%(default)s`` instead.
- ``parser.addoption(..., type="int/string/float/complex")`` - use ``type=int`` etc. instead.
The ``--strict`` command-line option The ``--strict`` command-line option
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -1,7 +1,6 @@
import argparse import argparse
import os import os
import sys import sys
import warnings
from gettext import gettext from gettext import gettext
from typing import Any from typing import Any
from typing import Callable from typing import Callable
@ -19,9 +18,6 @@ from typing import Union
import _pytest._io import _pytest._io
from _pytest.config.exceptions import UsageError from _pytest.config.exceptions import UsageError
from _pytest.deprecated import ARGUMENT_PERCENT_DEFAULT
from _pytest.deprecated import ARGUMENT_TYPE_STR
from _pytest.deprecated import ARGUMENT_TYPE_STR_CHOICE
from _pytest.deprecated import check_ispytest from _pytest.deprecated import check_ispytest
FILE_OR_DIR = "file_or_dir" FILE_OR_DIR = "file_or_dir"
@ -259,39 +255,15 @@ class Argument:
https://docs.python.org/3/library/optparse.html#optparse-standard-option-types https://docs.python.org/3/library/optparse.html#optparse-standard-option-types
""" """
_typ_map = {"int": int, "string": str, "float": float, "complex": complex}
def __init__(self, *names: str, **attrs: Any) -> None: def __init__(self, *names: str, **attrs: Any) -> None:
"""Store params in private vars for use in add_argument.""" """Store params in private vars for use in add_argument."""
self._attrs = attrs self._attrs = attrs
self._short_opts: List[str] = [] self._short_opts: List[str] = []
self._long_opts: List[str] = [] self._long_opts: List[str] = []
if "%default" in (attrs.get("help") or ""):
warnings.warn(ARGUMENT_PERCENT_DEFAULT, stacklevel=3)
try: try:
typ = attrs["type"] self.type = attrs["type"]
except KeyError: except KeyError:
pass pass
else:
# This might raise a keyerror as well, don't want to catch that.
if isinstance(typ, str):
if typ == "choice":
warnings.warn(
ARGUMENT_TYPE_STR_CHOICE.format(typ=typ, names=names),
stacklevel=4,
)
# argparse expects a type here take it from
# the type of the first element
attrs["type"] = type(attrs["choices"][0])
else:
warnings.warn(
ARGUMENT_TYPE_STR.format(typ=typ, names=names), stacklevel=4
)
attrs["type"] = Argument._typ_map[typ]
# Used in test_parseopt -> test_parse_defaultgetter.
self.type = attrs["type"]
else:
self.type = typ
try: try:
# Attribute existence is tested in Config._processopt. # Attribute existence is tested in Config._processopt.
self.default = attrs["default"] self.default = attrs["default"]
@ -322,11 +294,6 @@ class Argument:
self._attrs[attr] = getattr(self, attr) self._attrs[attr] = getattr(self, attr)
except AttributeError: except AttributeError:
pass pass
if self._attrs.get("help"):
a = self._attrs["help"]
a = a.replace("%default", "%(default)s")
# a = a.replace('%prog', '%(prog)s')
self._attrs["help"] = a
return self._attrs return self._attrs
def _set_opt_strings(self, opts: Sequence[str]) -> None: def _set_opt_strings(self, opts: Sequence[str]) -> None:

View File

@ -49,25 +49,6 @@ YIELD_FIXTURE = PytestDeprecationWarning(
# This deprecation is never really meant to be removed. # This deprecation is never really meant to be removed.
PRIVATE = PytestDeprecationWarning("A private pytest class or function was used.") PRIVATE = PytestDeprecationWarning("A private pytest class or function was used.")
ARGUMENT_PERCENT_DEFAULT = PytestRemovedIn8Warning(
'pytest now uses argparse. "%default" should be changed to "%(default)s"',
)
ARGUMENT_TYPE_STR_CHOICE = UnformattedWarning(
PytestRemovedIn8Warning,
"`type` argument to addoption() is the string {typ!r}."
" For choices this is optional and can be omitted, "
" but when supplied should be a type (for example `str` or `int`)."
" (options: {names})",
)
ARGUMENT_TYPE_STR = UnformattedWarning(
PytestRemovedIn8Warning,
"`type` argument to addoption() is the string {typ!r}, "
" but when supplied should be a type (for example `str` or `int`)."
" (options: {names})",
)
HOOK_LEGACY_PATH_ARG = UnformattedWarning( HOOK_LEGACY_PATH_ARG = UnformattedWarning(
PytestRemovedIn8Warning, PytestRemovedIn8Warning,

View File

@ -54,9 +54,6 @@ class TestParser:
assert argument.type is str assert argument.type is str
argument = parseopt.Argument("-t", dest="abc", type=float) argument = parseopt.Argument("-t", dest="abc", type=float)
assert argument.type is float assert argument.type is float
with pytest.warns(DeprecationWarning):
with pytest.raises(KeyError):
argument = parseopt.Argument("-t", dest="abc", type="choice")
argument = parseopt.Argument( argument = parseopt.Argument(
"-t", dest="abc", type=str, choices=["red", "blue"] "-t", dest="abc", type=str, choices=["red", "blue"]
) )