Remove deprecated `pytest.warns(None)`
This commit is contained in:
parent
10fbb2325f
commit
4147c92b21
|
@ -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.
|
||||||
|
|
||||||
|
|
||||||
Using ``pytest.warns(None)``
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
.. deprecated:: 7.0
|
|
||||||
|
|
||||||
:func:`pytest.warns(None) <pytest.warns>` is now deprecated because it was frequently misused.
|
|
||||||
Its correct usage was checking that the code emits at least one warning of any type - like ``pytest.warns()``
|
|
||||||
or ``pytest.warns(Warning)``.
|
|
||||||
|
|
||||||
See :ref:`warns use cases` for examples.
|
|
||||||
|
|
||||||
|
|
||||||
Returning non-None value in test functions
|
Returning non-None value in test functions
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
@ -445,6 +433,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.
|
||||||
|
|
||||||
|
|
||||||
|
Using ``pytest.warns(None)``
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. deprecated:: 7.0
|
||||||
|
.. versionremoved:: 8.0
|
||||||
|
|
||||||
|
:func:`pytest.warns(None) <pytest.warns>` is now deprecated because it was frequently misused.
|
||||||
|
Its correct usage was checking that the code emits at least one warning of any type - like ``pytest.warns()``
|
||||||
|
or ``pytest.warns(Warning)``.
|
||||||
|
|
||||||
|
See :ref:`warns use cases` for examples.
|
||||||
|
|
||||||
|
|
||||||
Backward compatibilities in ``Parser.addoption``
|
Backward compatibilities in ``Parser.addoption``
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -65,13 +65,6 @@ NODE_CTOR_FSPATH_ARG = UnformattedWarning(
|
||||||
"#fspath-argument-for-node-constructors-replaced-with-pathlib-path",
|
"#fspath-argument-for-node-constructors-replaced-with-pathlib-path",
|
||||||
)
|
)
|
||||||
|
|
||||||
WARNS_NONE_ARG = PytestRemovedIn8Warning(
|
|
||||||
"Passing None has been deprecated.\n"
|
|
||||||
"See https://docs.pytest.org/en/latest/how-to/capture-warnings.html"
|
|
||||||
"#additional-use-cases-of-warnings-in-tests"
|
|
||||||
" for alternatives in common use cases."
|
|
||||||
)
|
|
||||||
|
|
||||||
KEYWORD_MSG_ARG = UnformattedWarning(
|
KEYWORD_MSG_ARG = UnformattedWarning(
|
||||||
PytestRemovedIn8Warning,
|
PytestRemovedIn8Warning,
|
||||||
"pytest.{func}(msg=...) is now deprecated, use pytest.{func}(reason=...) instead",
|
"pytest.{func}(msg=...) is now deprecated, use pytest.{func}(reason=...) instead",
|
||||||
|
|
|
@ -18,7 +18,6 @@ from typing import TypeVar
|
||||||
from typing import Union
|
from typing import Union
|
||||||
|
|
||||||
from _pytest.deprecated import check_ispytest
|
from _pytest.deprecated import check_ispytest
|
||||||
from _pytest.deprecated import WARNS_NONE_ARG
|
|
||||||
from _pytest.fixtures import fixture
|
from _pytest.fixtures import fixture
|
||||||
from _pytest.outcomes import fail
|
from _pytest.outcomes import fail
|
||||||
|
|
||||||
|
@ -264,9 +263,7 @@ class WarningsRecorder(warnings.catch_warnings): # type:ignore[type-arg]
|
||||||
class WarningsChecker(WarningsRecorder):
|
class WarningsChecker(WarningsRecorder):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
expected_warning: Optional[
|
expected_warning: Union[Type[Warning], Tuple[Type[Warning], ...]] = Warning,
|
||||||
Union[Type[Warning], Tuple[Type[Warning], ...]]
|
|
||||||
] = Warning,
|
|
||||||
match_expr: Optional[Union[str, Pattern[str]]] = None,
|
match_expr: Optional[Union[str, Pattern[str]]] = None,
|
||||||
*,
|
*,
|
||||||
_ispytest: bool = False,
|
_ispytest: bool = False,
|
||||||
|
@ -275,15 +272,14 @@ class WarningsChecker(WarningsRecorder):
|
||||||
super().__init__(_ispytest=True)
|
super().__init__(_ispytest=True)
|
||||||
|
|
||||||
msg = "exceptions must be derived from Warning, not %s"
|
msg = "exceptions must be derived from Warning, not %s"
|
||||||
if expected_warning is None:
|
if isinstance(expected_warning, tuple):
|
||||||
warnings.warn(WARNS_NONE_ARG, stacklevel=4)
|
|
||||||
expected_warning_tup = None
|
|
||||||
elif isinstance(expected_warning, tuple):
|
|
||||||
for exc in expected_warning:
|
for exc in expected_warning:
|
||||||
if not issubclass(exc, Warning):
|
if not issubclass(exc, Warning):
|
||||||
raise TypeError(msg % type(exc))
|
raise TypeError(msg % type(exc))
|
||||||
expected_warning_tup = expected_warning
|
expected_warning_tup = expected_warning
|
||||||
elif issubclass(expected_warning, Warning):
|
elif isinstance(expected_warning, type) and issubclass(
|
||||||
|
expected_warning, Warning
|
||||||
|
):
|
||||||
expected_warning_tup = (expected_warning,)
|
expected_warning_tup = (expected_warning,)
|
||||||
else:
|
else:
|
||||||
raise TypeError(msg % type(expected_warning))
|
raise TypeError(msg % type(expected_warning))
|
||||||
|
@ -307,10 +303,6 @@ class WarningsChecker(WarningsRecorder):
|
||||||
|
|
||||||
__tracebackhide__ = True
|
__tracebackhide__ = True
|
||||||
|
|
||||||
if self.expected_warning is None:
|
|
||||||
# nothing to do in this deprecated case, see WARNS_NONE_ARG above
|
|
||||||
return
|
|
||||||
|
|
||||||
def found_str():
|
def found_str():
|
||||||
return pformat([record.message for record in self], indent=2)
|
return pformat([record.message for record in self], indent=2)
|
||||||
|
|
||||||
|
|
|
@ -120,20 +120,6 @@ def test_hookproxy_warnings_for_pathlib(tmp_path, hooktype, request):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_warns_none_is_deprecated():
|
|
||||||
with pytest.warns(
|
|
||||||
PytestDeprecationWarning,
|
|
||||||
match=re.escape(
|
|
||||||
"Passing None has been deprecated.\n"
|
|
||||||
"See https://docs.pytest.org/en/latest/how-to/capture-warnings.html"
|
|
||||||
"#additional-use-cases-of-warnings-in-tests"
|
|
||||||
" for alternatives in common use cases."
|
|
||||||
),
|
|
||||||
):
|
|
||||||
with pytest.warns(None): # type: ignore[call-overload]
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class TestSkipMsgArgumentDeprecated:
|
class TestSkipMsgArgumentDeprecated:
|
||||||
def test_skip_with_msg_is_deprecated(self, pytester: Pytester) -> None:
|
def test_skip_with_msg_is_deprecated(self, pytester: Pytester) -> None:
|
||||||
p = pytester.makepyfile(
|
p = pytester.makepyfile(
|
||||||
|
|
|
@ -345,17 +345,9 @@ class TestWarns:
|
||||||
assert str(record[0].message) == "user"
|
assert str(record[0].message) == "user"
|
||||||
assert str(record[1].message) == "runtime"
|
assert str(record[1].message) == "runtime"
|
||||||
|
|
||||||
def test_record_only_none_deprecated_warn(self) -> None:
|
def test_record_only_none_type_error(self) -> None:
|
||||||
# This should become an error when WARNS_NONE_ARG is removed in Pytest 8.0
|
with pytest.raises(TypeError):
|
||||||
with warnings.catch_warnings():
|
pytest.warns(None) # type: ignore[call-overload]
|
||||||
warnings.simplefilter("ignore")
|
|
||||||
with pytest.warns(None) as record: # type: ignore[call-overload]
|
|
||||||
warnings.warn("user", UserWarning)
|
|
||||||
warnings.warn("runtime", RuntimeWarning)
|
|
||||||
|
|
||||||
assert len(record) == 2
|
|
||||||
assert str(record[0].message) == "user"
|
|
||||||
assert str(record[1].message) == "runtime"
|
|
||||||
|
|
||||||
def test_record_by_subclass(self) -> None:
|
def test_record_by_subclass(self) -> None:
|
||||||
with pytest.warns(Warning) as record:
|
with pytest.warns(Warning) as record:
|
||||||
|
|
|
@ -530,13 +530,11 @@ class TestRmRf:
|
||||||
assert fn.is_file()
|
assert fn.is_file()
|
||||||
|
|
||||||
# ignored function
|
# ignored function
|
||||||
with warnings.catch_warnings():
|
with warnings.catch_warnings(record=True) as w:
|
||||||
warnings.simplefilter("ignore")
|
|
||||||
with pytest.warns(None) as warninfo: # type: ignore[call-overload]
|
|
||||||
exc_info4 = PermissionError()
|
exc_info4 = PermissionError()
|
||||||
on_rm_rf_error(os.open, str(fn), exc_info4, start_path=tmp_path)
|
on_rm_rf_error(os.open, str(fn), exc_info4, start_path=tmp_path)
|
||||||
assert fn.is_file()
|
assert fn.is_file()
|
||||||
assert not [x.message for x in warninfo]
|
assert not [x.message for x in w]
|
||||||
|
|
||||||
exc_info5 = PermissionError()
|
exc_info5 = PermissionError()
|
||||||
on_rm_rf_error(os.unlink, str(fn), exc_info5, start_path=tmp_path)
|
on_rm_rf_error(os.unlink, str(fn), exc_info5, start_path=tmp_path)
|
||||||
|
|
Loading…
Reference in New Issue