Merge pull request #9392 from bluetech/rm-7-deprecated
Remove deprecations scheduled for removal in pytest 7.1
This commit is contained in:
commit
c7be96dae4
|
@ -0,0 +1,15 @@
|
||||||
|
As per our policy, the following features have been deprecated in the 6.X series and are now
|
||||||
|
removed:
|
||||||
|
|
||||||
|
* ``pytest._fillfuncargs`` function.
|
||||||
|
|
||||||
|
* ``pytest_warning_captured`` hook - use ``pytest_warning_recorded`` instead.
|
||||||
|
|
||||||
|
* ``-k -foobar`` syntax - use ``-k 'not foobar'`` instead.
|
||||||
|
|
||||||
|
* ``-k foobar:`` syntax.
|
||||||
|
|
||||||
|
* ``pytest.collect`` module - import from ``pytest`` directly.
|
||||||
|
|
||||||
|
For more information consult
|
||||||
|
`Deprecations and Removals <https://docs.pytest.org/en/latest/deprecations.html>`__ in the docs.
|
|
@ -250,29 +250,42 @@ The ``yield_fixture`` function/decorator
|
||||||
It has been so for a very long time, so can be search/replaced safely.
|
It has been so for a very long time, so can be search/replaced safely.
|
||||||
|
|
||||||
|
|
||||||
|
Removed Features
|
||||||
|
----------------
|
||||||
|
|
||||||
|
As stated in our :ref:`backwards-compatibility` policy, deprecated features are removed only in major releases after
|
||||||
|
an appropriate period of deprecation has passed.
|
||||||
|
|
||||||
|
|
||||||
|
The ``pytest.collect`` module
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. deprecated:: 6.0
|
||||||
|
.. versionremoved:: 7.0
|
||||||
|
|
||||||
|
The ``pytest.collect`` module is no longer part of the public API, all its names
|
||||||
|
should now be imported from ``pytest`` directly instead.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The ``pytest_warning_captured`` hook
|
The ``pytest_warning_captured`` hook
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. deprecated:: 6.0
|
.. deprecated:: 6.0
|
||||||
|
.. versionremoved:: 7.0
|
||||||
|
|
||||||
This hook has an `item` parameter which cannot be serialized by ``pytest-xdist``.
|
This hook has an `item` parameter which cannot be serialized by ``pytest-xdist``.
|
||||||
|
|
||||||
Use the ``pytest_warning_recored`` hook instead, which replaces the ``item`` parameter
|
Use the ``pytest_warning_recored`` hook instead, which replaces the ``item`` parameter
|
||||||
by a ``nodeid`` parameter.
|
by a ``nodeid`` parameter.
|
||||||
|
|
||||||
The ``pytest.collect`` module
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
.. deprecated:: 6.0
|
|
||||||
|
|
||||||
The ``pytest.collect`` module is no longer part of the public API, all its names
|
|
||||||
should now be imported from ``pytest`` directly instead.
|
|
||||||
|
|
||||||
|
|
||||||
The ``pytest._fillfuncargs`` function
|
The ``pytest._fillfuncargs`` function
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. deprecated:: 6.0
|
.. deprecated:: 6.0
|
||||||
|
.. versionremoved:: 7.0
|
||||||
|
|
||||||
This function was kept for backward compatibility with an older plugin.
|
This function was kept for backward compatibility with an older plugin.
|
||||||
|
|
||||||
|
@ -281,12 +294,6 @@ it, use `function._request._fillfixtures()` instead, though note this is not
|
||||||
a public API and may break in the future.
|
a public API and may break in the future.
|
||||||
|
|
||||||
|
|
||||||
Removed Features
|
|
||||||
----------------
|
|
||||||
|
|
||||||
As stated in our :ref:`backwards-compatibility` policy, deprecated features are removed only in major releases after
|
|
||||||
an appropriate period of deprecation has passed.
|
|
||||||
|
|
||||||
``--no-print-logs`` command-line option
|
``--no-print-logs`` command-line option
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -51,9 +51,6 @@ Here is a little annotated list for some popular plugins:
|
||||||
* :pypi:`pytest-flakes`:
|
* :pypi:`pytest-flakes`:
|
||||||
check source code with pyflakes.
|
check source code with pyflakes.
|
||||||
|
|
||||||
* :pypi:`oejskit`:
|
|
||||||
a plugin to run javascript unittests in live browsers.
|
|
||||||
|
|
||||||
To see a complete list of all plugins with their latest testing
|
To see a complete list of all plugins with their latest testing
|
||||||
status against different pytest and Python versions, please visit
|
status against different pytest and Python versions, please visit
|
||||||
:ref:`plugin-list`.
|
:ref:`plugin-list`.
|
||||||
|
|
|
@ -758,7 +758,6 @@ Session related reporting hooks:
|
||||||
.. autofunction:: pytest_terminal_summary
|
.. autofunction:: pytest_terminal_summary
|
||||||
.. autofunction:: pytest_fixture_setup
|
.. autofunction:: pytest_fixture_setup
|
||||||
.. autofunction:: pytest_fixture_post_finalizer
|
.. autofunction:: pytest_fixture_post_finalizer
|
||||||
.. autofunction:: pytest_warning_captured
|
|
||||||
.. autofunction:: pytest_warning_recorded
|
.. autofunction:: pytest_warning_recorded
|
||||||
|
|
||||||
Central hook for reporting about test execution:
|
Central hook for reporting about test execution:
|
||||||
|
|
|
@ -1330,14 +1330,6 @@ class Config:
|
||||||
if records:
|
if records:
|
||||||
frame = sys._getframe(stacklevel - 1)
|
frame = sys._getframe(stacklevel - 1)
|
||||||
location = frame.f_code.co_filename, frame.f_lineno, frame.f_code.co_name
|
location = frame.f_code.co_filename, frame.f_lineno, frame.f_code.co_name
|
||||||
self.hook.pytest_warning_captured.call_historic(
|
|
||||||
kwargs=dict(
|
|
||||||
warning_message=records[0],
|
|
||||||
when="config",
|
|
||||||
item=None,
|
|
||||||
location=location,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
self.hook.pytest_warning_recorded.call_historic(
|
self.hook.pytest_warning_recorded.call_historic(
|
||||||
kwargs=dict(
|
kwargs=dict(
|
||||||
warning_message=records[0],
|
warning_message=records[0],
|
||||||
|
|
|
@ -11,7 +11,6 @@ in case of warnings which need to format their messages.
|
||||||
from warnings import warn
|
from warnings import warn
|
||||||
|
|
||||||
from _pytest.warning_types import PytestDeprecationWarning
|
from _pytest.warning_types import PytestDeprecationWarning
|
||||||
from _pytest.warning_types import PytestRemovedIn7Warning
|
|
||||||
from _pytest.warning_types import PytestRemovedIn8Warning
|
from _pytest.warning_types import PytestRemovedIn8Warning
|
||||||
from _pytest.warning_types import UnformattedWarning
|
from _pytest.warning_types import UnformattedWarning
|
||||||
|
|
||||||
|
@ -24,18 +23,6 @@ DEPRECATED_EXTERNAL_PLUGINS = {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
FILLFUNCARGS = UnformattedWarning(
|
|
||||||
PytestRemovedIn7Warning,
|
|
||||||
"{name} is deprecated, use "
|
|
||||||
"function._request._fillfixtures() instead if you cannot avoid reaching into internals.",
|
|
||||||
)
|
|
||||||
|
|
||||||
PYTEST_COLLECT_MODULE = UnformattedWarning(
|
|
||||||
PytestRemovedIn7Warning,
|
|
||||||
"pytest.collect.{name} was moved to pytest.{name}\n"
|
|
||||||
"Please update to the new name.",
|
|
||||||
)
|
|
||||||
|
|
||||||
# This can be* removed pytest 8, but it's harmless and common, so no rush to remove.
|
# This can be* removed pytest 8, but it's harmless and common, so no rush to remove.
|
||||||
# * If you're in the future: "could have been".
|
# * If you're in the future: "could have been".
|
||||||
YIELD_FIXTURE = PytestDeprecationWarning(
|
YIELD_FIXTURE = PytestDeprecationWarning(
|
||||||
|
@ -43,20 +30,6 @@ YIELD_FIXTURE = PytestDeprecationWarning(
|
||||||
"Use @pytest.fixture instead; they are the same."
|
"Use @pytest.fixture instead; they are the same."
|
||||||
)
|
)
|
||||||
|
|
||||||
MINUS_K_DASH = PytestRemovedIn7Warning(
|
|
||||||
"The `-k '-expr'` syntax to -k is deprecated.\nUse `-k 'not expr'` instead."
|
|
||||||
)
|
|
||||||
|
|
||||||
MINUS_K_COLON = PytestRemovedIn7Warning(
|
|
||||||
"The `-k 'expr:'` syntax to -k is deprecated.\n"
|
|
||||||
"Please open an issue if you use this and want a replacement."
|
|
||||||
)
|
|
||||||
|
|
||||||
WARNING_CAPTURED_HOOK = PytestRemovedIn7Warning(
|
|
||||||
"The pytest_warning_captured is deprecated and will be removed in a future release.\n"
|
|
||||||
"Please use pytest_warning_recorded instead."
|
|
||||||
)
|
|
||||||
|
|
||||||
WARNING_CMDLINE_PREPARSE_HOOK = PytestRemovedIn8Warning(
|
WARNING_CMDLINE_PREPARSE_HOOK = PytestRemovedIn8Warning(
|
||||||
"The pytest_cmdline_preparse hook is deprecated and will be removed in a future release. \n"
|
"The pytest_cmdline_preparse hook is deprecated and will be removed in a future release. \n"
|
||||||
"Please use pytest_load_initial_conftests hook instead."
|
"Please use pytest_load_initial_conftests hook instead."
|
||||||
|
|
|
@ -52,7 +52,6 @@ from _pytest.config import _PluggyPlugin
|
||||||
from _pytest.config import Config
|
from _pytest.config import Config
|
||||||
from _pytest.config.argparsing import Parser
|
from _pytest.config.argparsing import Parser
|
||||||
from _pytest.deprecated import check_ispytest
|
from _pytest.deprecated import check_ispytest
|
||||||
from _pytest.deprecated import FILLFUNCARGS
|
|
||||||
from _pytest.deprecated import YIELD_FIXTURE
|
from _pytest.deprecated import YIELD_FIXTURE
|
||||||
from _pytest.mark import Mark
|
from _pytest.mark import Mark
|
||||||
from _pytest.mark import ParameterSet
|
from _pytest.mark import ParameterSet
|
||||||
|
@ -73,7 +72,6 @@ if TYPE_CHECKING:
|
||||||
from _pytest.scope import _ScopeName
|
from _pytest.scope import _ScopeName
|
||||||
from _pytest.main import Session
|
from _pytest.main import Session
|
||||||
from _pytest.python import CallSpec2
|
from _pytest.python import CallSpec2
|
||||||
from _pytest.python import Function
|
|
||||||
from _pytest.python import Metafunc
|
from _pytest.python import Metafunc
|
||||||
|
|
||||||
|
|
||||||
|
@ -352,41 +350,6 @@ def reorder_items_atscope(
|
||||||
return items_done
|
return items_done
|
||||||
|
|
||||||
|
|
||||||
def _fillfuncargs(function: "Function") -> None:
|
|
||||||
"""Fill missing fixtures for a test function, old public API (deprecated)."""
|
|
||||||
warnings.warn(FILLFUNCARGS.format(name="pytest._fillfuncargs()"), stacklevel=2)
|
|
||||||
_fill_fixtures_impl(function)
|
|
||||||
|
|
||||||
|
|
||||||
def fillfixtures(function: "Function") -> None:
|
|
||||||
"""Fill missing fixtures for a test function (deprecated)."""
|
|
||||||
warnings.warn(
|
|
||||||
FILLFUNCARGS.format(name="_pytest.fixtures.fillfixtures()"), stacklevel=2
|
|
||||||
)
|
|
||||||
_fill_fixtures_impl(function)
|
|
||||||
|
|
||||||
|
|
||||||
def _fill_fixtures_impl(function: "Function") -> None:
|
|
||||||
"""Internal implementation to fill fixtures on the given function object."""
|
|
||||||
try:
|
|
||||||
request = function._request
|
|
||||||
except AttributeError:
|
|
||||||
# XXX this special code path is only expected to execute
|
|
||||||
# with the oejskit plugin. It uses classes with funcargs
|
|
||||||
# and we thus have to work a bit to allow this.
|
|
||||||
fm = function.session._fixturemanager
|
|
||||||
assert function.parent is not None
|
|
||||||
fi = fm.getfixtureinfo(function.parent, function.obj, None)
|
|
||||||
function._fixtureinfo = fi
|
|
||||||
request = function._request = FixtureRequest(function, _ispytest=True)
|
|
||||||
fm.session._setupstate.setup(function)
|
|
||||||
request._fillfixtures()
|
|
||||||
# Prune out funcargs for jstests.
|
|
||||||
function.funcargs = {name: function.funcargs[name] for name in fi.argnames}
|
|
||||||
else:
|
|
||||||
request._fillfixtures()
|
|
||||||
|
|
||||||
|
|
||||||
def get_direct_param_fixture_func(request):
|
def get_direct_param_fixture_func(request):
|
||||||
return request.param
|
return request.param
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,6 @@ from typing import Union
|
||||||
|
|
||||||
from pluggy import HookspecMarker
|
from pluggy import HookspecMarker
|
||||||
|
|
||||||
from _pytest.deprecated import WARNING_CAPTURED_HOOK
|
|
||||||
from _pytest.deprecated import WARNING_CMDLINE_PREPARSE_HOOK
|
from _pytest.deprecated import WARNING_CMDLINE_PREPARSE_HOOK
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
|
@ -777,41 +776,6 @@ def pytest_terminal_summary(
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
@hookspec(historic=True, warn_on_impl=WARNING_CAPTURED_HOOK)
|
|
||||||
def pytest_warning_captured(
|
|
||||||
warning_message: "warnings.WarningMessage",
|
|
||||||
when: "Literal['config', 'collect', 'runtest']",
|
|
||||||
item: Optional["Item"],
|
|
||||||
location: Optional[Tuple[str, int, str]],
|
|
||||||
) -> None:
|
|
||||||
"""(**Deprecated**) Process a warning captured by the internal pytest warnings plugin.
|
|
||||||
|
|
||||||
.. deprecated:: 6.0
|
|
||||||
|
|
||||||
This hook is considered deprecated and will be removed in a future pytest version.
|
|
||||||
Use :func:`pytest_warning_recorded` instead.
|
|
||||||
|
|
||||||
:param warnings.WarningMessage warning_message:
|
|
||||||
The captured warning. This is the same object produced by :py:func:`warnings.catch_warnings`, and contains
|
|
||||||
the same attributes as the parameters of :py:func:`warnings.showwarning`.
|
|
||||||
|
|
||||||
:param str when:
|
|
||||||
Indicates when the warning was captured. Possible values:
|
|
||||||
|
|
||||||
* ``"config"``: during pytest configuration/initialization stage.
|
|
||||||
* ``"collect"``: during test collection.
|
|
||||||
* ``"runtest"``: during test execution.
|
|
||||||
|
|
||||||
:param pytest.Item|None item:
|
|
||||||
The item being executed if ``when`` is ``"runtest"``, otherwise ``None``.
|
|
||||||
|
|
||||||
:param tuple location:
|
|
||||||
When available, holds information about the execution context of the captured
|
|
||||||
warning (filename, linenumber, function). ``function`` evaluates to <module>
|
|
||||||
when the execution context is at the module level.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
@hookspec(historic=True)
|
@hookspec(historic=True)
|
||||||
def pytest_warning_recorded(
|
def pytest_warning_recorded(
|
||||||
warning_message: "warnings.WarningMessage",
|
warning_message: "warnings.WarningMessage",
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
"""Generic mechanism for marking and selecting python functions."""
|
"""Generic mechanism for marking and selecting python functions."""
|
||||||
import warnings
|
|
||||||
from typing import AbstractSet
|
from typing import AbstractSet
|
||||||
from typing import Collection
|
from typing import Collection
|
||||||
from typing import List
|
from typing import List
|
||||||
|
@ -23,8 +22,6 @@ from _pytest.config import ExitCode
|
||||||
from _pytest.config import hookimpl
|
from _pytest.config import hookimpl
|
||||||
from _pytest.config import UsageError
|
from _pytest.config import UsageError
|
||||||
from _pytest.config.argparsing import Parser
|
from _pytest.config.argparsing import Parser
|
||||||
from _pytest.deprecated import MINUS_K_COLON
|
|
||||||
from _pytest.deprecated import MINUS_K_DASH
|
|
||||||
from _pytest.stash import StashKey
|
from _pytest.stash import StashKey
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
|
@ -189,27 +186,14 @@ def deselect_by_keyword(items: "List[Item]", config: Config) -> None:
|
||||||
if not keywordexpr:
|
if not keywordexpr:
|
||||||
return
|
return
|
||||||
|
|
||||||
if keywordexpr.startswith("-"):
|
|
||||||
# To be removed in pytest 8.0.0.
|
|
||||||
warnings.warn(MINUS_K_DASH, stacklevel=2)
|
|
||||||
keywordexpr = "not " + keywordexpr[1:]
|
|
||||||
selectuntil = False
|
|
||||||
if keywordexpr[-1:] == ":":
|
|
||||||
# To be removed in pytest 8.0.0.
|
|
||||||
warnings.warn(MINUS_K_COLON, stacklevel=2)
|
|
||||||
selectuntil = True
|
|
||||||
keywordexpr = keywordexpr[:-1]
|
|
||||||
|
|
||||||
expr = _parse_expression(keywordexpr, "Wrong expression passed to '-k'")
|
expr = _parse_expression(keywordexpr, "Wrong expression passed to '-k'")
|
||||||
|
|
||||||
remaining = []
|
remaining = []
|
||||||
deselected = []
|
deselected = []
|
||||||
for colitem in items:
|
for colitem in items:
|
||||||
if keywordexpr and not expr.evaluate(KeywordMatcher.from_item(colitem)):
|
if not expr.evaluate(KeywordMatcher.from_item(colitem)):
|
||||||
deselected.append(colitem)
|
deselected.append(colitem)
|
||||||
else:
|
else:
|
||||||
if selectuntil:
|
|
||||||
keywordexpr = None
|
|
||||||
remaining.append(colitem)
|
remaining.append(colitem)
|
||||||
|
|
||||||
if deselected:
|
if deselected:
|
||||||
|
|
|
@ -48,13 +48,6 @@ class PytestDeprecationWarning(PytestWarning, DeprecationWarning):
|
||||||
__module__ = "pytest"
|
__module__ = "pytest"
|
||||||
|
|
||||||
|
|
||||||
@final
|
|
||||||
class PytestRemovedIn7Warning(PytestDeprecationWarning):
|
|
||||||
"""Warning class for features that will be removed in pytest 7."""
|
|
||||||
|
|
||||||
__module__ = "pytest"
|
|
||||||
|
|
||||||
|
|
||||||
@final
|
@final
|
||||||
class PytestRemovedIn8Warning(PytestDeprecationWarning):
|
class PytestRemovedIn8Warning(PytestDeprecationWarning):
|
||||||
"""Warning class for features that will be removed in pytest 8."""
|
"""Warning class for features that will be removed in pytest 8."""
|
||||||
|
|
|
@ -49,8 +49,6 @@ def catch_warnings_for_item(
|
||||||
warnings.filterwarnings("always", category=DeprecationWarning)
|
warnings.filterwarnings("always", category=DeprecationWarning)
|
||||||
warnings.filterwarnings("always", category=PendingDeprecationWarning)
|
warnings.filterwarnings("always", category=PendingDeprecationWarning)
|
||||||
|
|
||||||
warnings.filterwarnings("error", category=pytest.PytestRemovedIn7Warning)
|
|
||||||
|
|
||||||
apply_warning_filters(config_filters, cmdline_filters)
|
apply_warning_filters(config_filters, cmdline_filters)
|
||||||
|
|
||||||
# apply filters from "filterwarnings" marks
|
# apply filters from "filterwarnings" marks
|
||||||
|
@ -63,14 +61,6 @@ def catch_warnings_for_item(
|
||||||
yield
|
yield
|
||||||
|
|
||||||
for warning_message in log:
|
for warning_message in log:
|
||||||
ihook.pytest_warning_captured.call_historic(
|
|
||||||
kwargs=dict(
|
|
||||||
warning_message=warning_message,
|
|
||||||
when=when,
|
|
||||||
item=item,
|
|
||||||
location=None,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
ihook.pytest_warning_recorded.call_historic(
|
ihook.pytest_warning_recorded.call_historic(
|
||||||
kwargs=dict(
|
kwargs=dict(
|
||||||
warning_message=warning_message,
|
warning_message=warning_message,
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
# PYTHON_ARGCOMPLETE_OK
|
# PYTHON_ARGCOMPLETE_OK
|
||||||
"""pytest: unit and functional testing with Python."""
|
"""pytest: unit and functional testing with Python."""
|
||||||
from . import collect
|
|
||||||
from _pytest import __version__
|
from _pytest import __version__
|
||||||
from _pytest import version_tuple
|
from _pytest import version_tuple
|
||||||
from _pytest._code import ExceptionInfo
|
from _pytest._code import ExceptionInfo
|
||||||
|
@ -19,7 +18,6 @@ from _pytest.config import UsageError
|
||||||
from _pytest.config.argparsing import OptionGroup
|
from _pytest.config.argparsing import OptionGroup
|
||||||
from _pytest.config.argparsing import Parser
|
from _pytest.config.argparsing import Parser
|
||||||
from _pytest.debugging import pytestPDB as __pytestPDB
|
from _pytest.debugging import pytestPDB as __pytestPDB
|
||||||
from _pytest.fixtures import _fillfuncargs
|
|
||||||
from _pytest.fixtures import fixture
|
from _pytest.fixtures import fixture
|
||||||
from _pytest.fixtures import FixtureLookupError
|
from _pytest.fixtures import FixtureLookupError
|
||||||
from _pytest.fixtures import FixtureRequest
|
from _pytest.fixtures import FixtureRequest
|
||||||
|
@ -68,7 +66,6 @@ from _pytest.warning_types import PytestCollectionWarning
|
||||||
from _pytest.warning_types import PytestConfigWarning
|
from _pytest.warning_types import PytestConfigWarning
|
||||||
from _pytest.warning_types import PytestDeprecationWarning
|
from _pytest.warning_types import PytestDeprecationWarning
|
||||||
from _pytest.warning_types import PytestExperimentalApiWarning
|
from _pytest.warning_types import PytestExperimentalApiWarning
|
||||||
from _pytest.warning_types import PytestRemovedIn7Warning
|
|
||||||
from _pytest.warning_types import PytestRemovedIn8Warning
|
from _pytest.warning_types import PytestRemovedIn8Warning
|
||||||
from _pytest.warning_types import PytestUnhandledCoroutineWarning
|
from _pytest.warning_types import PytestUnhandledCoroutineWarning
|
||||||
from _pytest.warning_types import PytestUnhandledThreadExceptionWarning
|
from _pytest.warning_types import PytestUnhandledThreadExceptionWarning
|
||||||
|
@ -81,14 +78,12 @@ set_trace = __pytestPDB.set_trace
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"__version__",
|
"__version__",
|
||||||
"_fillfuncargs",
|
|
||||||
"approx",
|
"approx",
|
||||||
"Cache",
|
"Cache",
|
||||||
"CallInfo",
|
"CallInfo",
|
||||||
"CaptureFixture",
|
"CaptureFixture",
|
||||||
"Class",
|
"Class",
|
||||||
"cmdline",
|
"cmdline",
|
||||||
"collect",
|
|
||||||
"Collector",
|
"Collector",
|
||||||
"CollectReport",
|
"CollectReport",
|
||||||
"Config",
|
"Config",
|
||||||
|
@ -129,7 +124,6 @@ __all__ = [
|
||||||
"PytestConfigWarning",
|
"PytestConfigWarning",
|
||||||
"PytestDeprecationWarning",
|
"PytestDeprecationWarning",
|
||||||
"PytestExperimentalApiWarning",
|
"PytestExperimentalApiWarning",
|
||||||
"PytestRemovedIn7Warning",
|
|
||||||
"PytestRemovedIn8Warning",
|
"PytestRemovedIn8Warning",
|
||||||
"Pytester",
|
"Pytester",
|
||||||
"PytestPluginManager",
|
"PytestPluginManager",
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
import sys
|
|
||||||
import warnings
|
|
||||||
from types import ModuleType
|
|
||||||
from typing import Any
|
|
||||||
from typing import List
|
|
||||||
|
|
||||||
import pytest
|
|
||||||
from _pytest.deprecated import PYTEST_COLLECT_MODULE
|
|
||||||
|
|
||||||
COLLECT_FAKEMODULE_ATTRIBUTES = [
|
|
||||||
"Collector",
|
|
||||||
"Module",
|
|
||||||
"Function",
|
|
||||||
"Session",
|
|
||||||
"Item",
|
|
||||||
"Class",
|
|
||||||
"File",
|
|
||||||
"_fillfuncargs",
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class FakeCollectModule(ModuleType):
|
|
||||||
def __init__(self) -> None:
|
|
||||||
super().__init__("pytest.collect")
|
|
||||||
self.__all__ = list(COLLECT_FAKEMODULE_ATTRIBUTES)
|
|
||||||
self.__pytest = pytest
|
|
||||||
|
|
||||||
def __dir__(self) -> List[str]:
|
|
||||||
return dir(super()) + self.__all__
|
|
||||||
|
|
||||||
def __getattr__(self, name: str) -> Any:
|
|
||||||
if name not in self.__all__:
|
|
||||||
raise AttributeError(name)
|
|
||||||
warnings.warn(PYTEST_COLLECT_MODULE.format(name=name), stacklevel=2)
|
|
||||||
return getattr(pytest, name)
|
|
||||||
|
|
||||||
|
|
||||||
sys.modules["pytest.collect"] = FakeCollectModule()
|
|
|
@ -2,7 +2,6 @@ import re
|
||||||
import sys
|
import sys
|
||||||
import warnings
|
import warnings
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from unittest import mock
|
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from _pytest import deprecated
|
from _pytest import deprecated
|
||||||
|
@ -11,13 +10,6 @@ from _pytest.pytester import Pytester
|
||||||
from pytest import PytestDeprecationWarning
|
from pytest import PytestDeprecationWarning
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("attribute", pytest.collect.__all__) # type: ignore
|
|
||||||
# false positive due to dynamic attribute
|
|
||||||
def test_pytest_collect_module_deprecated(attribute) -> None:
|
|
||||||
with pytest.warns(DeprecationWarning, match=attribute):
|
|
||||||
getattr(pytest.collect, attribute)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("plugin", sorted(deprecated.DEPRECATED_EXTERNAL_PLUGINS))
|
@pytest.mark.parametrize("plugin", sorted(deprecated.DEPRECATED_EXTERNAL_PLUGINS))
|
||||||
@pytest.mark.filterwarnings("default")
|
@pytest.mark.filterwarnings("default")
|
||||||
def test_external_plugins_integrated(pytester: Pytester, plugin) -> None:
|
def test_external_plugins_integrated(pytester: Pytester, plugin) -> None:
|
||||||
|
@ -28,54 +20,6 @@ def test_external_plugins_integrated(pytester: Pytester, plugin) -> None:
|
||||||
pytester.parseconfig("-p", plugin)
|
pytester.parseconfig("-p", plugin)
|
||||||
|
|
||||||
|
|
||||||
def test_fillfuncargs_is_deprecated() -> None:
|
|
||||||
with pytest.warns(
|
|
||||||
pytest.PytestDeprecationWarning,
|
|
||||||
match=re.escape(
|
|
||||||
"pytest._fillfuncargs() is deprecated, use "
|
|
||||||
"function._request._fillfixtures() instead if you cannot avoid reaching into internals."
|
|
||||||
),
|
|
||||||
):
|
|
||||||
pytest._fillfuncargs(mock.Mock())
|
|
||||||
|
|
||||||
|
|
||||||
def test_fillfixtures_is_deprecated() -> None:
|
|
||||||
import _pytest.fixtures
|
|
||||||
|
|
||||||
with pytest.warns(
|
|
||||||
pytest.PytestDeprecationWarning,
|
|
||||||
match=re.escape(
|
|
||||||
"_pytest.fixtures.fillfixtures() is deprecated, use "
|
|
||||||
"function._request._fillfixtures() instead if you cannot avoid reaching into internals."
|
|
||||||
),
|
|
||||||
):
|
|
||||||
_pytest.fixtures.fillfixtures(mock.Mock())
|
|
||||||
|
|
||||||
|
|
||||||
def test_minus_k_dash_is_deprecated(pytester: Pytester) -> None:
|
|
||||||
threepass = pytester.makepyfile(
|
|
||||||
test_threepass="""
|
|
||||||
def test_one(): assert 1
|
|
||||||
def test_two(): assert 1
|
|
||||||
def test_three(): assert 1
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
result = pytester.runpytest("-k=-test_two", threepass)
|
|
||||||
result.stdout.fnmatch_lines(["*The `-k '-expr'` syntax*deprecated*"])
|
|
||||||
|
|
||||||
|
|
||||||
def test_minus_k_colon_is_deprecated(pytester: Pytester) -> None:
|
|
||||||
threepass = pytester.makepyfile(
|
|
||||||
test_threepass="""
|
|
||||||
def test_one(): assert 1
|
|
||||||
def test_two(): assert 1
|
|
||||||
def test_three(): assert 1
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
result = pytester.runpytest("-k", "test_two:", threepass)
|
|
||||||
result.stdout.fnmatch_lines(["*The `-k 'expr:'` syntax*deprecated*"])
|
|
||||||
|
|
||||||
|
|
||||||
def test_fscollector_gethookproxy_isinitpath(pytester: Pytester) -> None:
|
def test_fscollector_gethookproxy_isinitpath(pytester: Pytester) -> None:
|
||||||
module = pytester.getmodulecol(
|
module = pytester.getmodulecol(
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -103,10 +103,6 @@ def test_getfuncargnames_staticmethod_partial():
|
||||||
|
|
||||||
@pytest.mark.pytester_example_path("fixtures/fill_fixtures")
|
@pytest.mark.pytester_example_path("fixtures/fill_fixtures")
|
||||||
class TestFillFixtures:
|
class TestFillFixtures:
|
||||||
def test_fillfuncargs_exposed(self):
|
|
||||||
# used by oejskit, kept for compatibility
|
|
||||||
assert pytest._fillfuncargs == fixtures._fillfuncargs
|
|
||||||
|
|
||||||
def test_funcarg_lookupfails(self, pytester: Pytester) -> None:
|
def test_funcarg_lookupfails(self, pytester: Pytester) -> None:
|
||||||
pytester.copy_example()
|
pytester.copy_example()
|
||||||
result = pytester.runpytest() # "--collect-only")
|
result = pytester.runpytest() # "--collect-only")
|
||||||
|
|
|
@ -1,84 +1,10 @@
|
||||||
from typing import Any
|
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from _pytest import runner
|
|
||||||
from _pytest._code import getfslineno
|
from _pytest._code import getfslineno
|
||||||
from _pytest.fixtures import getfixturemarker
|
from _pytest.fixtures import getfixturemarker
|
||||||
from _pytest.pytester import Pytester
|
from _pytest.pytester import Pytester
|
||||||
from _pytest.python import Function
|
from _pytest.python import Function
|
||||||
|
|
||||||
|
|
||||||
class TestOEJSKITSpecials:
|
|
||||||
def test_funcarg_non_pycollectobj(
|
|
||||||
self, pytester: Pytester, recwarn
|
|
||||||
) -> None: # rough jstests usage
|
|
||||||
pytester.makeconftest(
|
|
||||||
"""
|
|
||||||
import pytest
|
|
||||||
def pytest_pycollect_makeitem(collector, name, obj):
|
|
||||||
if name == "MyClass":
|
|
||||||
return MyCollector.from_parent(collector, name=name)
|
|
||||||
class MyCollector(pytest.Collector):
|
|
||||||
def reportinfo(self):
|
|
||||||
return self.path, 3, "xyz"
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
modcol = pytester.getmodulecol(
|
|
||||||
"""
|
|
||||||
import pytest
|
|
||||||
@pytest.fixture
|
|
||||||
def arg1(request):
|
|
||||||
return 42
|
|
||||||
class MyClass(object):
|
|
||||||
pass
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
# this hook finds funcarg factories
|
|
||||||
rep = runner.collect_one_node(collector=modcol)
|
|
||||||
# TODO: Don't treat as Any.
|
|
||||||
clscol: Any = rep.result[0]
|
|
||||||
clscol.obj = lambda arg1: None
|
|
||||||
clscol.funcargs = {}
|
|
||||||
pytest._fillfuncargs(clscol)
|
|
||||||
assert clscol.funcargs["arg1"] == 42
|
|
||||||
|
|
||||||
def test_autouse_fixture(
|
|
||||||
self, pytester: Pytester, recwarn
|
|
||||||
) -> None: # rough jstests usage
|
|
||||||
pytester.makeconftest(
|
|
||||||
"""
|
|
||||||
import pytest
|
|
||||||
def pytest_pycollect_makeitem(collector, name, obj):
|
|
||||||
if name == "MyClass":
|
|
||||||
return MyCollector.from_parent(collector, name=name)
|
|
||||||
class MyCollector(pytest.Collector):
|
|
||||||
def reportinfo(self):
|
|
||||||
return self.path, 3, "xyz"
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
modcol = pytester.getmodulecol(
|
|
||||||
"""
|
|
||||||
import pytest
|
|
||||||
@pytest.fixture(autouse=True)
|
|
||||||
def hello():
|
|
||||||
pass
|
|
||||||
@pytest.fixture
|
|
||||||
def arg1(request):
|
|
||||||
return 42
|
|
||||||
class MyClass(object):
|
|
||||||
pass
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
# this hook finds funcarg factories
|
|
||||||
rep = runner.collect_one_node(modcol)
|
|
||||||
# TODO: Don't treat as Any.
|
|
||||||
clscol: Any = rep.result[0]
|
|
||||||
clscol.obj = lambda: None
|
|
||||||
clscol.funcargs = {}
|
|
||||||
pytest._fillfuncargs(clscol)
|
|
||||||
assert not clscol.funcargs
|
|
||||||
|
|
||||||
|
|
||||||
def test_wrapped_getfslineno() -> None:
|
def test_wrapped_getfslineno() -> None:
|
||||||
def func():
|
def func():
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -823,25 +823,6 @@ class TestKeywordSelection:
|
||||||
assert len(dlist) == 1
|
assert len(dlist) == 1
|
||||||
assert dlist[0].items[0].name == "test_1"
|
assert dlist[0].items[0].name == "test_1"
|
||||||
|
|
||||||
def test_select_starton(self, pytester: Pytester) -> None:
|
|
||||||
threepass = pytester.makepyfile(
|
|
||||||
test_threepass="""
|
|
||||||
def test_one(): assert 1
|
|
||||||
def test_two(): assert 1
|
|
||||||
def test_three(): assert 1
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
reprec = pytester.inline_run(
|
|
||||||
"-Wignore::pytest.PytestRemovedIn7Warning", "-k", "test_two:", threepass
|
|
||||||
)
|
|
||||||
passed, skipped, failed = reprec.listoutcomes()
|
|
||||||
assert len(passed) == 2
|
|
||||||
assert not failed
|
|
||||||
dlist = reprec.getcalls("pytest_deselected")
|
|
||||||
assert len(dlist) == 1
|
|
||||||
item = dlist[0].items[0]
|
|
||||||
assert item.name == "test_one"
|
|
||||||
|
|
||||||
def test_keyword_extra(self, pytester: Pytester) -> None:
|
def test_keyword_extra(self, pytester: Pytester) -> None:
|
||||||
p = pytester.makepyfile(
|
p = pytester.makepyfile(
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -682,9 +682,7 @@ class TestTerminalFunctional:
|
||||||
pass
|
pass
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
result = pytester.runpytest(
|
result = pytester.runpytest("-k", "test_t", testpath)
|
||||||
"-Wignore::pytest.PytestRemovedIn7Warning", "-k", "test_two:", testpath
|
|
||||||
)
|
|
||||||
result.stdout.fnmatch_lines(
|
result.stdout.fnmatch_lines(
|
||||||
["collected 3 items / 1 deselected / 2 selected", "*test_deselected.py ..*"]
|
["collected 3 items / 1 deselected / 2 selected", "*test_deselected.py ..*"]
|
||||||
)
|
)
|
||||||
|
|
|
@ -239,7 +239,7 @@ def test_filterwarnings_mark_registration(pytester: Pytester) -> None:
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.filterwarnings("always::UserWarning")
|
@pytest.mark.filterwarnings("always::UserWarning")
|
||||||
def test_warning_captured_hook(pytester: Pytester) -> None:
|
def test_warning_recorded_hook(pytester: Pytester) -> None:
|
||||||
pytester.makeconftest(
|
pytester.makeconftest(
|
||||||
"""
|
"""
|
||||||
def pytest_configure(config):
|
def pytest_configure(config):
|
||||||
|
@ -276,9 +276,9 @@ def test_warning_captured_hook(pytester: Pytester) -> None:
|
||||||
expected = [
|
expected = [
|
||||||
("config warning", "config", ""),
|
("config warning", "config", ""),
|
||||||
("collect warning", "collect", ""),
|
("collect warning", "collect", ""),
|
||||||
("setup warning", "runtest", "test_warning_captured_hook.py::test_func"),
|
("setup warning", "runtest", "test_warning_recorded_hook.py::test_func"),
|
||||||
("call warning", "runtest", "test_warning_captured_hook.py::test_func"),
|
("call warning", "runtest", "test_warning_recorded_hook.py::test_func"),
|
||||||
("teardown warning", "runtest", "test_warning_captured_hook.py::test_func"),
|
("teardown warning", "runtest", "test_warning_recorded_hook.py::test_func"),
|
||||||
]
|
]
|
||||||
for index in range(len(expected)):
|
for index in range(len(expected)):
|
||||||
collected_result = collected[index]
|
collected_result = collected[index]
|
||||||
|
@ -517,6 +517,7 @@ class TestDeprecationWarningsByDefault:
|
||||||
assert WARNINGS_SUMMARY_HEADER not in result.stdout.str()
|
assert WARNINGS_SUMMARY_HEADER not in result.stdout.str()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skip("not relevant until pytest 8.0")
|
||||||
@pytest.mark.parametrize("change_default", [None, "ini", "cmdline"])
|
@pytest.mark.parametrize("change_default", [None, "ini", "cmdline"])
|
||||||
def test_removed_in_x_warning_as_error(pytester: Pytester, change_default) -> None:
|
def test_removed_in_x_warning_as_error(pytester: Pytester, change_default) -> None:
|
||||||
"""This ensures that PytestRemovedInXWarnings raised by pytest are turned into errors.
|
"""This ensures that PytestRemovedInXWarnings raised by pytest are turned into errors.
|
||||||
|
@ -528,7 +529,7 @@ def test_removed_in_x_warning_as_error(pytester: Pytester, change_default) -> No
|
||||||
"""
|
"""
|
||||||
import warnings, pytest
|
import warnings, pytest
|
||||||
def test():
|
def test():
|
||||||
warnings.warn(pytest.PytestRemovedIn7Warning("some warning"))
|
warnings.warn(pytest.PytestRemovedIn8Warning("some warning"))
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
if change_default == "ini":
|
if change_default == "ini":
|
||||||
|
@ -536,12 +537,12 @@ def test_removed_in_x_warning_as_error(pytester: Pytester, change_default) -> No
|
||||||
"""
|
"""
|
||||||
[pytest]
|
[pytest]
|
||||||
filterwarnings =
|
filterwarnings =
|
||||||
ignore::pytest.PytestRemovedIn7Warning
|
ignore::pytest.PytestRemovedIn8Warning
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
|
|
||||||
args = (
|
args = (
|
||||||
("-Wignore::pytest.PytestRemovedIn7Warning",)
|
("-Wignore::pytest.PytestRemovedIn8Warning",)
|
||||||
if change_default == "cmdline"
|
if change_default == "cmdline"
|
||||||
else ()
|
else ()
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue