Type annotate some hookspecs & impls
Annotate some "easy" arguments of hooks that repeat in a lot of internal plugins. Not all of the arguments are annotated fully for now.
This commit is contained in:
		
							parent
							
								
									ff8b7884e8
								
							
						
					
					
						commit
						0fb081aec6
					
				| 
						 | 
				
			
			@ -13,12 +13,13 @@ from _pytest.assertion.rewrite import assertstate_key
 | 
			
		|||
from _pytest.compat import TYPE_CHECKING
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config import hookimpl
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
 | 
			
		||||
if TYPE_CHECKING:
 | 
			
		||||
    from _pytest.main import Session
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("debugconfig")
 | 
			
		||||
    group.addoption(
 | 
			
		||||
        "--assert",
 | 
			
		||||
| 
						 | 
				
			
			@ -167,7 +168,7 @@ def pytest_runtest_protocol(item):
 | 
			
		|||
    util._reprcompare, util._assertion_pass = saved_assert_hooks
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_sessionfinish(session):
 | 
			
		||||
def pytest_sessionfinish(session: "Session") -> None:
 | 
			
		||||
    assertstate = session.config._store.get(assertstate_key, None)
 | 
			
		||||
    if assertstate:
 | 
			
		||||
        if assertstate.hook is not None:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,6 +11,7 @@ from typing import Generator
 | 
			
		|||
from typing import List
 | 
			
		||||
from typing import Optional
 | 
			
		||||
from typing import Set
 | 
			
		||||
from typing import Union
 | 
			
		||||
 | 
			
		||||
import attr
 | 
			
		||||
import py
 | 
			
		||||
| 
						 | 
				
			
			@ -24,6 +25,8 @@ from _pytest import nodes
 | 
			
		|||
from _pytest._io import TerminalWriter
 | 
			
		||||
from _pytest.compat import order_preserving_dict
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config import ExitCode
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.main import Session
 | 
			
		||||
from _pytest.python import Module
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -329,11 +332,12 @@ class LFPlugin:
 | 
			
		|||
            else:
 | 
			
		||||
                self._report_status += "not deselecting items."
 | 
			
		||||
 | 
			
		||||
    def pytest_sessionfinish(self, session):
 | 
			
		||||
    def pytest_sessionfinish(self, session: Session) -> None:
 | 
			
		||||
        config = self.config
 | 
			
		||||
        if config.getoption("cacheshow") or hasattr(config, "slaveinput"):
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        assert config.cache is not None
 | 
			
		||||
        saved_lastfailed = config.cache.get("cache/lastfailed", {})
 | 
			
		||||
        if saved_lastfailed != self.lastfailed:
 | 
			
		||||
            config.cache.set("cache/lastfailed", self.lastfailed)
 | 
			
		||||
| 
						 | 
				
			
			@ -382,7 +386,7 @@ class NFPlugin:
 | 
			
		|||
        config.cache.set("cache/nodeids", sorted(self.cached_nodeids))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("general")
 | 
			
		||||
    group.addoption(
 | 
			
		||||
        "--lf",
 | 
			
		||||
| 
						 | 
				
			
			@ -440,16 +444,18 @@ def pytest_addoption(parser):
 | 
			
		|||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_cmdline_main(config):
 | 
			
		||||
def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]:
 | 
			
		||||
    if config.option.cacheshow:
 | 
			
		||||
        from _pytest.main import wrap_session
 | 
			
		||||
 | 
			
		||||
        return wrap_session(config, cacheshow)
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.hookimpl(tryfirst=True)
 | 
			
		||||
def pytest_configure(config: Config) -> None:
 | 
			
		||||
    config.cache = Cache.for_config(config)
 | 
			
		||||
    # Type ignored: pending mechanism to store typed objects scoped to config.
 | 
			
		||||
    config.cache = Cache.for_config(config)  # type: ignore # noqa: F821
 | 
			
		||||
    config.pluginmanager.register(LFPlugin(config), "lfplugin")
 | 
			
		||||
    config.pluginmanager.register(NFPlugin(config), "nfplugin")
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,6 +16,7 @@ from typing import Tuple
 | 
			
		|||
import pytest
 | 
			
		||||
from _pytest.compat import TYPE_CHECKING
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
 | 
			
		||||
if TYPE_CHECKING:
 | 
			
		||||
    from typing_extensions import Literal
 | 
			
		||||
| 
						 | 
				
			
			@ -23,7 +24,7 @@ if TYPE_CHECKING:
 | 
			
		|||
    _CaptureMethod = Literal["fd", "sys", "no", "tee-sys"]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("general")
 | 
			
		||||
    group._addoption(
 | 
			
		||||
        "--capture",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -407,7 +407,7 @@ class PytestPluginManager(PluginManager):
 | 
			
		|||
        """Return True if the plugin with the given name is registered."""
 | 
			
		||||
        return bool(self.get_plugin(name))
 | 
			
		||||
 | 
			
		||||
    def pytest_configure(self, config):
 | 
			
		||||
    def pytest_configure(self, config: "Config") -> None:
 | 
			
		||||
        # XXX now that the pluginmanager exposes hookimpl(tryfirst...)
 | 
			
		||||
        # we should remove tryfirst/trylast as markers
 | 
			
		||||
        config.addinivalue_line(
 | 
			
		||||
| 
						 | 
				
			
			@ -868,7 +868,9 @@ class Config:
 | 
			
		|||
    def get_terminal_writer(self):
 | 
			
		||||
        return self.pluginmanager.get_plugin("terminalreporter")._tw
 | 
			
		||||
 | 
			
		||||
    def pytest_cmdline_parse(self, pluginmanager, args):
 | 
			
		||||
    def pytest_cmdline_parse(
 | 
			
		||||
        self, pluginmanager: PytestPluginManager, args: List[str]
 | 
			
		||||
    ) -> object:
 | 
			
		||||
        try:
 | 
			
		||||
            self.parse(args)
 | 
			
		||||
        except UsageError:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,8 +4,11 @@ import functools
 | 
			
		|||
import sys
 | 
			
		||||
 | 
			
		||||
from _pytest import outcomes
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config import ConftestImportFailure
 | 
			
		||||
from _pytest.config import hookimpl
 | 
			
		||||
from _pytest.config import PytestPluginManager
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.config.exceptions import UsageError
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -20,7 +23,7 @@ def _validate_usepdb_cls(value):
 | 
			
		|||
    return (modname, classname)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("general")
 | 
			
		||||
    group._addoption(
 | 
			
		||||
        "--pdb",
 | 
			
		||||
| 
						 | 
				
			
			@ -44,7 +47,7 @@ def pytest_addoption(parser):
 | 
			
		|||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_configure(config):
 | 
			
		||||
def pytest_configure(config: Config) -> None:
 | 
			
		||||
    import pdb
 | 
			
		||||
 | 
			
		||||
    if config.getvalue("trace"):
 | 
			
		||||
| 
						 | 
				
			
			@ -74,8 +77,8 @@ def pytest_configure(config):
 | 
			
		|||
class pytestPDB:
 | 
			
		||||
    """ Pseudo PDB that defers to the real pdb. """
 | 
			
		||||
 | 
			
		||||
    _pluginmanager = None
 | 
			
		||||
    _config = None
 | 
			
		||||
    _pluginmanager = None  # type: PytestPluginManager
 | 
			
		||||
    _config = None  # type: Config
 | 
			
		||||
    _saved = []  # type: list
 | 
			
		||||
    _recursive_debug = 0
 | 
			
		||||
    _wrapped_pdb_cls = None
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,6 +23,7 @@ from _pytest._code.code import TerminalRepr
 | 
			
		|||
from _pytest._io import TerminalWriter
 | 
			
		||||
from _pytest.compat import safe_getattr
 | 
			
		||||
from _pytest.compat import TYPE_CHECKING
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.fixtures import FixtureRequest
 | 
			
		||||
from _pytest.outcomes import OutcomeException
 | 
			
		||||
from _pytest.python_api import approx
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +53,7 @@ RUNNER_CLASS = None
 | 
			
		|||
CHECKER_CLASS = None  # type: Optional[Type[doctest.OutputChecker]]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    parser.addini(
 | 
			
		||||
        "doctest_optionflags",
 | 
			
		||||
        "option flags for doctests",
 | 
			
		||||
| 
						 | 
				
			
			@ -102,7 +103,7 @@ def pytest_addoption(parser):
 | 
			
		|||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_unconfigure():
 | 
			
		||||
def pytest_unconfigure() -> None:
 | 
			
		||||
    global RUNNER_CLASS
 | 
			
		||||
 | 
			
		||||
    RUNNER_CLASS = None
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,13 +4,15 @@ import sys
 | 
			
		|||
from typing import TextIO
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.store import StoreKey
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
fault_handler_stderr_key = StoreKey[TextIO]()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    help = (
 | 
			
		||||
        "Dump the traceback of all threads if a test takes "
 | 
			
		||||
        "more than TIMEOUT seconds to finish."
 | 
			
		||||
| 
						 | 
				
			
			@ -18,7 +20,7 @@ def pytest_addoption(parser):
 | 
			
		|||
    parser.addini("faulthandler_timeout", help, default=0.0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_configure(config):
 | 
			
		||||
def pytest_configure(config: Config) -> None:
 | 
			
		||||
    import faulthandler
 | 
			
		||||
 | 
			
		||||
    if not faulthandler.is_enabled():
 | 
			
		||||
| 
						 | 
				
			
			@ -46,14 +48,14 @@ class FaultHandlerHooks:
 | 
			
		|||
    """Implements hooks that will actually install fault handler before tests execute,
 | 
			
		||||
    as well as correctly handle pdb and internal errors."""
 | 
			
		||||
 | 
			
		||||
    def pytest_configure(self, config):
 | 
			
		||||
    def pytest_configure(self, config: Config) -> None:
 | 
			
		||||
        import faulthandler
 | 
			
		||||
 | 
			
		||||
        stderr_fd_copy = os.dup(self._get_stderr_fileno())
 | 
			
		||||
        config._store[fault_handler_stderr_key] = open(stderr_fd_copy, "w")
 | 
			
		||||
        faulthandler.enable(file=config._store[fault_handler_stderr_key])
 | 
			
		||||
 | 
			
		||||
    def pytest_unconfigure(self, config):
 | 
			
		||||
    def pytest_unconfigure(self, config: Config) -> None:
 | 
			
		||||
        import faulthandler
 | 
			
		||||
 | 
			
		||||
        faulthandler.disable()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,6 +29,7 @@ from _pytest.compat import NOTSET
 | 
			
		|||
from _pytest.compat import order_preserving_dict
 | 
			
		||||
from _pytest.compat import safe_getattr
 | 
			
		||||
from _pytest.compat import TYPE_CHECKING
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.deprecated import FILLFUNCARGS
 | 
			
		||||
from _pytest.deprecated import FIXTURE_POSITIONAL_ARGUMENTS
 | 
			
		||||
from _pytest.deprecated import FUNCARGNAMES
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +50,7 @@ class PseudoFixtureDef:
 | 
			
		|||
    scope = attr.ib()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_sessionstart(session: "Session"):
 | 
			
		||||
def pytest_sessionstart(session: "Session") -> None:
 | 
			
		||||
    import _pytest.python
 | 
			
		||||
    import _pytest.nodes
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1202,7 +1203,7 @@ def pytestconfig(request):
 | 
			
		|||
    return request.config
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    parser.addini(
 | 
			
		||||
        "usefixtures",
 | 
			
		||||
        type="args",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,11 +2,16 @@
 | 
			
		|||
import os
 | 
			
		||||
import sys
 | 
			
		||||
from argparse import Action
 | 
			
		||||
from typing import Optional
 | 
			
		||||
from typing import Union
 | 
			
		||||
 | 
			
		||||
import py
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config import ExitCode
 | 
			
		||||
from _pytest.config import PrintHelp
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class HelpAction(Action):
 | 
			
		||||
| 
						 | 
				
			
			@ -36,7 +41,7 @@ class HelpAction(Action):
 | 
			
		|||
            raise PrintHelp
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("debugconfig")
 | 
			
		||||
    group.addoption(
 | 
			
		||||
        "--version",
 | 
			
		||||
| 
						 | 
				
			
			@ -109,7 +114,7 @@ def pytest_cmdline_parse():
 | 
			
		|||
        undo_tracing = config.pluginmanager.enable_tracing()
 | 
			
		||||
        sys.stderr.write("writing pytestdebug information to %s\n" % path)
 | 
			
		||||
 | 
			
		||||
        def unset_tracing():
 | 
			
		||||
        def unset_tracing() -> None:
 | 
			
		||||
            debugfile.close()
 | 
			
		||||
            sys.stderr.write("wrote pytestdebug information to %s\n" % debugfile.name)
 | 
			
		||||
            config.trace.root.setwriter(None)
 | 
			
		||||
| 
						 | 
				
			
			@ -133,7 +138,7 @@ def showversion(config):
 | 
			
		|||
        sys.stderr.write("pytest {}\n".format(pytest.__version__))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_cmdline_main(config):
 | 
			
		||||
def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]:
 | 
			
		||||
    if config.option.version > 0:
 | 
			
		||||
        showversion(config)
 | 
			
		||||
        return 0
 | 
			
		||||
| 
						 | 
				
			
			@ -142,9 +147,10 @@ def pytest_cmdline_main(config):
 | 
			
		|||
        showhelp(config)
 | 
			
		||||
        config._ensure_unconfigure()
 | 
			
		||||
        return 0
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def showhelp(config):
 | 
			
		||||
def showhelp(config: Config) -> None:
 | 
			
		||||
    import textwrap
 | 
			
		||||
 | 
			
		||||
    reporter = config.pluginmanager.get_plugin("terminalreporter")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
""" hook specifications for pytest plugins, invoked from main.py and builtin plugins.  """
 | 
			
		||||
from typing import Any
 | 
			
		||||
from typing import List
 | 
			
		||||
from typing import Mapping
 | 
			
		||||
from typing import Optional
 | 
			
		||||
from typing import Tuple
 | 
			
		||||
| 
						 | 
				
			
			@ -14,10 +15,14 @@ from _pytest.compat import TYPE_CHECKING
 | 
			
		|||
if TYPE_CHECKING:
 | 
			
		||||
    import warnings
 | 
			
		||||
    from _pytest.config import Config
 | 
			
		||||
    from _pytest.config import ExitCode
 | 
			
		||||
    from _pytest.config import PytestPluginManager
 | 
			
		||||
    from _pytest.config import _PluggyPlugin
 | 
			
		||||
    from _pytest.config.argparsing import Parser
 | 
			
		||||
    from _pytest.main import Session
 | 
			
		||||
    from _pytest.python import Metafunc
 | 
			
		||||
    from _pytest.reports import BaseReport
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
hookspec = HookspecMarker("pytest")
 | 
			
		||||
 | 
			
		||||
# -------------------------------------------------------------------------
 | 
			
		||||
| 
						 | 
				
			
			@ -26,7 +31,7 @@ hookspec = HookspecMarker("pytest")
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@hookspec(historic=True)
 | 
			
		||||
def pytest_addhooks(pluginmanager):
 | 
			
		||||
def pytest_addhooks(pluginmanager: "PytestPluginManager") -> None:
 | 
			
		||||
    """called at plugin registration time to allow adding new hooks via a call to
 | 
			
		||||
    ``pluginmanager.add_hookspecs(module_or_class, prefix)``.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -39,7 +44,9 @@ def pytest_addhooks(pluginmanager):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@hookspec(historic=True)
 | 
			
		||||
def pytest_plugin_registered(plugin, manager):
 | 
			
		||||
def pytest_plugin_registered(
 | 
			
		||||
    plugin: "_PluggyPlugin", manager: "PytestPluginManager"
 | 
			
		||||
) -> None:
 | 
			
		||||
    """ a new pytest plugin got registered.
 | 
			
		||||
 | 
			
		||||
    :param plugin: the plugin module or instance
 | 
			
		||||
| 
						 | 
				
			
			@ -51,7 +58,7 @@ def pytest_plugin_registered(plugin, manager):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@hookspec(historic=True)
 | 
			
		||||
def pytest_addoption(parser, pluginmanager):
 | 
			
		||||
def pytest_addoption(parser: "Parser", pluginmanager: "PytestPluginManager") -> None:
 | 
			
		||||
    """register argparse-style options and ini-style config values,
 | 
			
		||||
    called once at the beginning of a test run.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -89,7 +96,7 @@ def pytest_addoption(parser, pluginmanager):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@hookspec(historic=True)
 | 
			
		||||
def pytest_configure(config):
 | 
			
		||||
def pytest_configure(config: "Config") -> None:
 | 
			
		||||
    """
 | 
			
		||||
    Allows plugins and conftest files to perform initial configuration.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -113,7 +120,9 @@ def pytest_configure(config):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@hookspec(firstresult=True)
 | 
			
		||||
def pytest_cmdline_parse(pluginmanager, args):
 | 
			
		||||
def pytest_cmdline_parse(
 | 
			
		||||
    pluginmanager: "PytestPluginManager", args: List[str]
 | 
			
		||||
) -> Optional[object]:
 | 
			
		||||
    """return initialized config object, parsing the specified args.
 | 
			
		||||
 | 
			
		||||
    Stops at first non-None result, see :ref:`firstresult`
 | 
			
		||||
| 
						 | 
				
			
			@ -127,7 +136,7 @@ def pytest_cmdline_parse(pluginmanager, args):
 | 
			
		|||
    """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_cmdline_preparse(config, args):
 | 
			
		||||
def pytest_cmdline_preparse(config: "Config", args: List[str]) -> None:
 | 
			
		||||
    """(**Deprecated**) modify command line arguments before option parsing.
 | 
			
		||||
 | 
			
		||||
    This hook is considered deprecated and will be removed in a future pytest version. Consider
 | 
			
		||||
| 
						 | 
				
			
			@ -142,7 +151,7 @@ def pytest_cmdline_preparse(config, args):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@hookspec(firstresult=True)
 | 
			
		||||
def pytest_cmdline_main(config):
 | 
			
		||||
def pytest_cmdline_main(config: "Config") -> "Optional[Union[ExitCode, int]]":
 | 
			
		||||
    """ called for performing the main command line action. The default
 | 
			
		||||
    implementation will invoke the configure hooks and runtest_mainloop.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -155,7 +164,9 @@ def pytest_cmdline_main(config):
 | 
			
		|||
    """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_load_initial_conftests(early_config, parser, args):
 | 
			
		||||
def pytest_load_initial_conftests(
 | 
			
		||||
    early_config: "Config", parser: "Parser", args: List[str]
 | 
			
		||||
) -> None:
 | 
			
		||||
    """ implements the loading of initial conftest files ahead
 | 
			
		||||
    of command line option parsing.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -198,7 +209,7 @@ def pytest_collection(session: "Session") -> Optional[Any]:
 | 
			
		|||
    """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_collection_modifyitems(session, config, items):
 | 
			
		||||
def pytest_collection_modifyitems(session: "Session", config: "Config", items):
 | 
			
		||||
    """ called after collection has been performed, may filter or re-order
 | 
			
		||||
    the items in-place.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -208,7 +219,7 @@ def pytest_collection_modifyitems(session, config, items):
 | 
			
		|||
    """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_collection_finish(session):
 | 
			
		||||
def pytest_collection_finish(session: "Session"):
 | 
			
		||||
    """ called after collection has been performed and modified.
 | 
			
		||||
 | 
			
		||||
    :param _pytest.main.Session session: the pytest session object
 | 
			
		||||
| 
						 | 
				
			
			@ -216,7 +227,7 @@ def pytest_collection_finish(session):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@hookspec(firstresult=True)
 | 
			
		||||
def pytest_ignore_collect(path, config):
 | 
			
		||||
def pytest_ignore_collect(path, config: "Config"):
 | 
			
		||||
    """ return True to prevent considering this path for collection.
 | 
			
		||||
    This hook is consulted for all files and directories prior to calling
 | 
			
		||||
    more specific hooks.
 | 
			
		||||
| 
						 | 
				
			
			@ -304,12 +315,12 @@ def pytest_pyfunc_call(pyfuncitem):
 | 
			
		|||
    Stops at first non-None result, see :ref:`firstresult` """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_generate_tests(metafunc):
 | 
			
		||||
def pytest_generate_tests(metafunc: "Metafunc") -> None:
 | 
			
		||||
    """ generate (multiple) parametrized calls to a test function."""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@hookspec(firstresult=True)
 | 
			
		||||
def pytest_make_parametrize_id(config, val, argname):
 | 
			
		||||
def pytest_make_parametrize_id(config: "Config", val, argname) -> Optional[str]:
 | 
			
		||||
    """Return a user-friendly string representation of the given ``val`` that will be used
 | 
			
		||||
    by @pytest.mark.parametrize calls. Return None if the hook doesn't know about ``val``.
 | 
			
		||||
    The parameter name is available as ``argname``, if required.
 | 
			
		||||
| 
						 | 
				
			
			@ -328,7 +339,7 @@ def pytest_make_parametrize_id(config, val, argname):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@hookspec(firstresult=True)
 | 
			
		||||
def pytest_runtestloop(session):
 | 
			
		||||
def pytest_runtestloop(session: "Session"):
 | 
			
		||||
    """ called for performing the main runtest loop
 | 
			
		||||
    (after collection finished).
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -411,7 +422,7 @@ def pytest_runtest_logreport(report):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@hookspec(firstresult=True)
 | 
			
		||||
def pytest_report_to_serializable(config, report):
 | 
			
		||||
def pytest_report_to_serializable(config: "Config", report):
 | 
			
		||||
    """
 | 
			
		||||
    Serializes the given report object into a data structure suitable for sending
 | 
			
		||||
    over the wire, e.g. converted to JSON.
 | 
			
		||||
| 
						 | 
				
			
			@ -419,7 +430,7 @@ def pytest_report_to_serializable(config, report):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@hookspec(firstresult=True)
 | 
			
		||||
def pytest_report_from_serializable(config, data):
 | 
			
		||||
def pytest_report_from_serializable(config: "Config", data):
 | 
			
		||||
    """
 | 
			
		||||
    Restores a report object previously serialized with pytest_report_to_serializable().
 | 
			
		||||
    """
 | 
			
		||||
| 
						 | 
				
			
			@ -456,7 +467,7 @@ def pytest_fixture_post_finalizer(fixturedef, request):
 | 
			
		|||
# -------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_sessionstart(session):
 | 
			
		||||
def pytest_sessionstart(session: "Session") -> None:
 | 
			
		||||
    """ called after the ``Session`` object has been created and before performing collection
 | 
			
		||||
    and entering the run test loop.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -464,7 +475,9 @@ def pytest_sessionstart(session):
 | 
			
		|||
    """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_sessionfinish(session, exitstatus):
 | 
			
		||||
def pytest_sessionfinish(
 | 
			
		||||
    session: "Session", exitstatus: "Union[int, ExitCode]"
 | 
			
		||||
) -> None:
 | 
			
		||||
    """ called after whole test run finished, right before returning the exit status to the system.
 | 
			
		||||
 | 
			
		||||
    :param _pytest.main.Session session: the pytest session object
 | 
			
		||||
| 
						 | 
				
			
			@ -472,7 +485,7 @@ def pytest_sessionfinish(session, exitstatus):
 | 
			
		|||
    """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_unconfigure(config):
 | 
			
		||||
def pytest_unconfigure(config: "Config") -> None:
 | 
			
		||||
    """ called before test process is exited.
 | 
			
		||||
 | 
			
		||||
    :param _pytest.config.Config config: pytest config object
 | 
			
		||||
| 
						 | 
				
			
			@ -484,7 +497,7 @@ def pytest_unconfigure(config):
 | 
			
		|||
# -------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_assertrepr_compare(config, op, left, right):
 | 
			
		||||
def pytest_assertrepr_compare(config: "Config", op, left, right):
 | 
			
		||||
    """return explanation for comparisons in failing assert expressions.
 | 
			
		||||
 | 
			
		||||
    Return None for no custom explanation, otherwise return a list
 | 
			
		||||
| 
						 | 
				
			
			@ -539,7 +552,7 @@ def pytest_assertion_pass(item, lineno, orig, expl):
 | 
			
		|||
# -------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_report_header(config, startdir):
 | 
			
		||||
def pytest_report_header(config: "Config", startdir):
 | 
			
		||||
    """ return a string or list of strings to be displayed as header info for terminal reporting.
 | 
			
		||||
 | 
			
		||||
    :param _pytest.config.Config config: pytest config object
 | 
			
		||||
| 
						 | 
				
			
			@ -560,7 +573,7 @@ def pytest_report_header(config, startdir):
 | 
			
		|||
    """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_report_collectionfinish(config, startdir, items):
 | 
			
		||||
def pytest_report_collectionfinish(config: "Config", startdir, items):
 | 
			
		||||
    """
 | 
			
		||||
    .. versionadded:: 3.2
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -610,7 +623,7 @@ def pytest_report_teststatus(
 | 
			
		|||
    """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_terminal_summary(terminalreporter, exitstatus, config):
 | 
			
		||||
def pytest_terminal_summary(terminalreporter, exitstatus, config: "Config"):
 | 
			
		||||
    """Add a section to terminal summary reporting.
 | 
			
		||||
 | 
			
		||||
    :param _pytest.terminal.TerminalReporter terminalreporter: the internal terminal reporter object
 | 
			
		||||
| 
						 | 
				
			
			@ -723,7 +736,7 @@ def pytest_exception_interact(node, call, report):
 | 
			
		|||
    """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_enter_pdb(config, pdb):
 | 
			
		||||
def pytest_enter_pdb(config: "Config", pdb):
 | 
			
		||||
    """ called upon pdb.set_trace(), can be used by plugins to take special
 | 
			
		||||
    action just before the python debugger enters in interactive mode.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -732,7 +745,7 @@ def pytest_enter_pdb(config, pdb):
 | 
			
		|||
    """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_leave_pdb(config, pdb):
 | 
			
		||||
def pytest_leave_pdb(config: "Config", pdb):
 | 
			
		||||
    """ called when leaving pdb (e.g. with continue after pdb.set_trace()).
 | 
			
		||||
 | 
			
		||||
    Can be used by plugins to take special action just after the python
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,9 @@ import pytest
 | 
			
		|||
from _pytest import deprecated
 | 
			
		||||
from _pytest import nodes
 | 
			
		||||
from _pytest import timing
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config import filename_arg
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.store import StoreKey
 | 
			
		||||
from _pytest.warnings import _issue_warning_captured
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -361,7 +363,7 @@ def record_testsuite_property(request):
 | 
			
		|||
    return record_func
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("terminal reporting")
 | 
			
		||||
    group.addoption(
 | 
			
		||||
        "--junitxml",
 | 
			
		||||
| 
						 | 
				
			
			@ -406,7 +408,7 @@ def pytest_addoption(parser):
 | 
			
		|||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_configure(config):
 | 
			
		||||
def pytest_configure(config: Config) -> None:
 | 
			
		||||
    xmlpath = config.option.xmlpath
 | 
			
		||||
    # prevent opening xmllog on slave nodes (xdist)
 | 
			
		||||
    if xmlpath and not hasattr(config, "slaveinput"):
 | 
			
		||||
| 
						 | 
				
			
			@ -426,7 +428,7 @@ def pytest_configure(config):
 | 
			
		|||
        config.pluginmanager.register(config._store[xml_key])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_unconfigure(config):
 | 
			
		||||
def pytest_unconfigure(config: Config) -> None:
 | 
			
		||||
    xml = config._store.get(xml_key, None)
 | 
			
		||||
    if xml:
 | 
			
		||||
        del config._store[xml_key]
 | 
			
		||||
| 
						 | 
				
			
			@ -624,10 +626,10 @@ class LogXML:
 | 
			
		|||
        reporter.attrs.update(classname="pytest", name="internal")
 | 
			
		||||
        reporter._add_simple(Junit.error, "internal error", excrepr)
 | 
			
		||||
 | 
			
		||||
    def pytest_sessionstart(self):
 | 
			
		||||
    def pytest_sessionstart(self) -> None:
 | 
			
		||||
        self.suite_start_time = timing.time()
 | 
			
		||||
 | 
			
		||||
    def pytest_sessionfinish(self):
 | 
			
		||||
    def pytest_sessionfinish(self) -> None:
 | 
			
		||||
        dirname = os.path.dirname(os.path.abspath(self.logfile))
 | 
			
		||||
        if not os.path.isdir(dirname):
 | 
			
		||||
            os.makedirs(dirname)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,7 @@ from _pytest.compat import nullcontext
 | 
			
		|||
from _pytest.config import _strtobool
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config import create_terminal_writer
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.pathlib import Path
 | 
			
		||||
from _pytest.store import StoreKey
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -180,7 +181,7 @@ def get_option_ini(config, *names):
 | 
			
		|||
            return ret
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    """Add options to control log capturing."""
 | 
			
		||||
    group = parser.getgroup("logging")
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -478,7 +479,7 @@ def get_log_level_for_setting(config: Config, *setting_names: str) -> Optional[i
 | 
			
		|||
 | 
			
		||||
# run after terminalreporter/capturemanager are configured
 | 
			
		||||
@pytest.hookimpl(trylast=True)
 | 
			
		||||
def pytest_configure(config):
 | 
			
		||||
def pytest_configure(config: Config) -> None:
 | 
			
		||||
    config.pluginmanager.register(LoggingPlugin(config), "logging-plugin")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -601,7 +602,7 @@ class LoggingPlugin:
 | 
			
		|||
        return True
 | 
			
		||||
 | 
			
		||||
    @pytest.hookimpl(hookwrapper=True, tryfirst=True)
 | 
			
		||||
    def pytest_sessionstart(self):
 | 
			
		||||
    def pytest_sessionstart(self) -> Generator[None, None, None]:
 | 
			
		||||
        self.log_cli_handler.set_when("sessionstart")
 | 
			
		||||
 | 
			
		||||
        with catching_logs(self.log_cli_handler, level=self.log_cli_level):
 | 
			
		||||
| 
						 | 
				
			
			@ -679,7 +680,7 @@ class LoggingPlugin:
 | 
			
		|||
        self.log_cli_handler.set_when("finish")
 | 
			
		||||
 | 
			
		||||
    @pytest.hookimpl(hookwrapper=True, tryfirst=True)
 | 
			
		||||
    def pytest_sessionfinish(self):
 | 
			
		||||
    def pytest_sessionfinish(self) -> Generator[None, None, None]:
 | 
			
		||||
        self.log_cli_handler.set_when("sessionfinish")
 | 
			
		||||
 | 
			
		||||
        with catching_logs(self.log_cli_handler, level=self.log_cli_level):
 | 
			
		||||
| 
						 | 
				
			
			@ -687,7 +688,7 @@ class LoggingPlugin:
 | 
			
		|||
                yield
 | 
			
		||||
 | 
			
		||||
    @pytest.hookimpl
 | 
			
		||||
    def pytest_unconfigure(self):
 | 
			
		||||
    def pytest_unconfigure(self) -> None:
 | 
			
		||||
        # Close the FileHandler explicitly.
 | 
			
		||||
        # (logging.shutdown might have lost the weakref?!)
 | 
			
		||||
        self.log_file_handler.close()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,8 +18,10 @@ from .structures import MarkGenerator
 | 
			
		|||
from .structures import ParameterSet
 | 
			
		||||
from _pytest.compat import TYPE_CHECKING
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config import ExitCode
 | 
			
		||||
from _pytest.config import hookimpl
 | 
			
		||||
from _pytest.config import UsageError
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.deprecated import MINUS_K_COLON
 | 
			
		||||
from _pytest.deprecated import MINUS_K_DASH
 | 
			
		||||
from _pytest.store import StoreKey
 | 
			
		||||
| 
						 | 
				
			
			@ -27,6 +29,7 @@ from _pytest.store import StoreKey
 | 
			
		|||
if TYPE_CHECKING:
 | 
			
		||||
    from _pytest.nodes import Item
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
__all__ = ["Mark", "MarkDecorator", "MarkGenerator", "get_empty_parameterset_mark"]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -57,7 +60,7 @@ def param(
 | 
			
		|||
    return ParameterSet.param(*values, marks=marks, id=id)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("general")
 | 
			
		||||
    group._addoption(
 | 
			
		||||
        "-k",
 | 
			
		||||
| 
						 | 
				
			
			@ -100,7 +103,7 @@ def pytest_addoption(parser):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@hookimpl(tryfirst=True)
 | 
			
		||||
def pytest_cmdline_main(config):
 | 
			
		||||
def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]:
 | 
			
		||||
    import _pytest.config
 | 
			
		||||
 | 
			
		||||
    if config.option.markers:
 | 
			
		||||
| 
						 | 
				
			
			@ -116,6 +119,8 @@ def pytest_cmdline_main(config):
 | 
			
		|||
        config._ensure_unconfigure()
 | 
			
		||||
        return 0
 | 
			
		||||
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@attr.s(slots=True)
 | 
			
		||||
class KeywordMatcher:
 | 
			
		||||
| 
						 | 
				
			
			@ -254,7 +259,7 @@ def pytest_collection_modifyitems(items, config: Config) -> None:
 | 
			
		|||
    deselect_by_mark(items, config)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_configure(config):
 | 
			
		||||
def pytest_configure(config: Config) -> None:
 | 
			
		||||
    config._store[old_mark_config_key] = MARK_GEN._config
 | 
			
		||||
    MARK_GEN._config = config
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -267,5 +272,5 @@ def pytest_configure(config):
 | 
			
		|||
        )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_unconfigure(config):
 | 
			
		||||
def pytest_unconfigure(config: Config) -> None:
 | 
			
		||||
    MARK_GEN._config = config._store.get(old_mark_config_key, None)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -374,7 +374,7 @@ class MarkGenerator:
 | 
			
		|||
    applies a 'slowtest' :class:`Mark` on ``test_function``.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    _config = None
 | 
			
		||||
    _config = None  # type: Optional[Config]
 | 
			
		||||
    _markers = set()  # type: Set[str]
 | 
			
		||||
 | 
			
		||||
    def __getattr__(self, name: str) -> MarkDecorator:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -123,7 +123,7 @@ class Node(metaclass=NodeMeta):
 | 
			
		|||
 | 
			
		||||
        #: the pytest config object
 | 
			
		||||
        if config:
 | 
			
		||||
            self.config = config
 | 
			
		||||
            self.config = config  # type: Config
 | 
			
		||||
        else:
 | 
			
		||||
            if not parent:
 | 
			
		||||
                raise TypeError("config or parent must be provided")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,13 +4,15 @@ from io import StringIO
 | 
			
		|||
from typing import IO
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.store import StoreKey
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
pastebinfile_key = StoreKey[IO[bytes]]()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("terminal reporting")
 | 
			
		||||
    group._addoption(
 | 
			
		||||
        "--pastebin",
 | 
			
		||||
| 
						 | 
				
			
			@ -24,7 +26,7 @@ def pytest_addoption(parser):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@pytest.hookimpl(trylast=True)
 | 
			
		||||
def pytest_configure(config):
 | 
			
		||||
def pytest_configure(config: Config) -> None:
 | 
			
		||||
    if config.option.pastebin == "all":
 | 
			
		||||
        tr = config.pluginmanager.getplugin("terminalreporter")
 | 
			
		||||
        # if no terminal reporter plugin is present, nothing we can do here;
 | 
			
		||||
| 
						 | 
				
			
			@ -44,7 +46,7 @@ def pytest_configure(config):
 | 
			
		|||
            tr._tw.write = tee_write
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_unconfigure(config):
 | 
			
		||||
def pytest_unconfigure(config: Config) -> None:
 | 
			
		||||
    if pastebinfile_key in config._store:
 | 
			
		||||
        pastebinfile = config._store[pastebinfile_key]
 | 
			
		||||
        # get terminal contents and delete file
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,6 +31,7 @@ from _pytest.compat import TYPE_CHECKING
 | 
			
		|||
from _pytest.config import _PluggyPlugin
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config import ExitCode
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.fixtures import FixtureRequest
 | 
			
		||||
from _pytest.main import Session
 | 
			
		||||
from _pytest.monkeypatch import MonkeyPatch
 | 
			
		||||
| 
						 | 
				
			
			@ -53,7 +54,7 @@ IGNORE_PAM = [  # filenames added when obtaining details about the current user
 | 
			
		|||
]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    parser.addoption(
 | 
			
		||||
        "--lsof",
 | 
			
		||||
        action="store_true",
 | 
			
		||||
| 
						 | 
				
			
			@ -78,7 +79,7 @@ def pytest_addoption(parser):
 | 
			
		|||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_configure(config):
 | 
			
		||||
def pytest_configure(config: Config) -> None:
 | 
			
		||||
    if config.getvalue("lsof"):
 | 
			
		||||
        checker = LsofFdLeakChecker()
 | 
			
		||||
        if checker.matching_platform():
 | 
			
		||||
| 
						 | 
				
			
			@ -938,7 +939,7 @@ class Testdir:
 | 
			
		|||
            rec = []
 | 
			
		||||
 | 
			
		||||
            class Collect:
 | 
			
		||||
                def pytest_configure(x, config):
 | 
			
		||||
                def pytest_configure(x, config: Config) -> None:
 | 
			
		||||
                    rec.append(self.make_hook_recorder(config.pluginmanager))
 | 
			
		||||
 | 
			
		||||
            plugins.append(Collect())
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,6 +16,7 @@ from typing import Dict
 | 
			
		|||
from typing import Iterable
 | 
			
		||||
from typing import List
 | 
			
		||||
from typing import Optional
 | 
			
		||||
from typing import Set
 | 
			
		||||
from typing import Tuple
 | 
			
		||||
from typing import Union
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -42,9 +43,12 @@ from _pytest.compat import safe_getattr
 | 
			
		|||
from _pytest.compat import safe_isclass
 | 
			
		||||
from _pytest.compat import STRING_TYPES
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config import ExitCode
 | 
			
		||||
from _pytest.config import hookimpl
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.deprecated import FUNCARGNAMES
 | 
			
		||||
from _pytest.fixtures import FuncFixtureInfo
 | 
			
		||||
from _pytest.main import Session
 | 
			
		||||
from _pytest.mark import MARK_GEN
 | 
			
		||||
from _pytest.mark import ParameterSet
 | 
			
		||||
from _pytest.mark.structures import get_unpacked_marks
 | 
			
		||||
| 
						 | 
				
			
			@ -57,7 +61,7 @@ from _pytest.warning_types import PytestCollectionWarning
 | 
			
		|||
from _pytest.warning_types import PytestUnhandledCoroutineWarning
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("general")
 | 
			
		||||
    group.addoption(
 | 
			
		||||
        "--fixtures",
 | 
			
		||||
| 
						 | 
				
			
			@ -112,13 +116,14 @@ def pytest_addoption(parser):
 | 
			
		|||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_cmdline_main(config):
 | 
			
		||||
def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]:
 | 
			
		||||
    if config.option.showfixtures:
 | 
			
		||||
        showfixtures(config)
 | 
			
		||||
        return 0
 | 
			
		||||
    if config.option.show_fixtures_per_test:
 | 
			
		||||
        show_fixtures_per_test(config)
 | 
			
		||||
        return 0
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_generate_tests(metafunc: "Metafunc") -> None:
 | 
			
		||||
| 
						 | 
				
			
			@ -127,7 +132,7 @@ def pytest_generate_tests(metafunc: "Metafunc") -> None:
 | 
			
		|||
        metafunc.parametrize(*marker.args, **marker.kwargs, _param_mark=marker)  # type: ignore[misc]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_configure(config):
 | 
			
		||||
def pytest_configure(config: Config) -> None:
 | 
			
		||||
    config.addinivalue_line(
 | 
			
		||||
        "markers",
 | 
			
		||||
        "parametrize(argnames, argvalues): call a test function multiple "
 | 
			
		||||
| 
						 | 
				
			
			@ -1308,13 +1313,13 @@ def _show_fixtures_per_test(config, session):
 | 
			
		|||
        write_item(session_item)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def showfixtures(config):
 | 
			
		||||
def showfixtures(config: Config) -> Union[int, ExitCode]:
 | 
			
		||||
    from _pytest.main import wrap_session
 | 
			
		||||
 | 
			
		||||
    return wrap_session(config, _showfixtures_main)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _showfixtures_main(config, session):
 | 
			
		||||
def _showfixtures_main(config: Config, session: Session) -> None:
 | 
			
		||||
    import _pytest.config
 | 
			
		||||
 | 
			
		||||
    session.perform_collect()
 | 
			
		||||
| 
						 | 
				
			
			@ -1325,7 +1330,7 @@ def _showfixtures_main(config, session):
 | 
			
		|||
    fm = session._fixturemanager
 | 
			
		||||
 | 
			
		||||
    available = []
 | 
			
		||||
    seen = set()
 | 
			
		||||
    seen = set()  # type: Set[Tuple[str, str]]
 | 
			
		||||
 | 
			
		||||
    for argname, fixturedefs in fm._arg2fixturedefs.items():
 | 
			
		||||
        assert fixturedefs is not None
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,13 +5,15 @@ import os
 | 
			
		|||
 | 
			
		||||
import py
 | 
			
		||||
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.store import StoreKey
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
resultlog_key = StoreKey["ResultLog"]()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("terminal reporting", "resultlog plugin options")
 | 
			
		||||
    group.addoption(
 | 
			
		||||
        "--resultlog",
 | 
			
		||||
| 
						 | 
				
			
			@ -23,7 +25,7 @@ def pytest_addoption(parser):
 | 
			
		|||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_configure(config):
 | 
			
		||||
def pytest_configure(config: Config) -> None:
 | 
			
		||||
    resultlog = config.option.resultlog
 | 
			
		||||
    # prevent opening resultlog on slave nodes (xdist)
 | 
			
		||||
    if resultlog and not hasattr(config, "slaveinput"):
 | 
			
		||||
| 
						 | 
				
			
			@ -40,7 +42,7 @@ def pytest_configure(config):
 | 
			
		|||
        _issue_warning_captured(RESULT_LOG, config.hook, stacklevel=2)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_unconfigure(config):
 | 
			
		||||
def pytest_unconfigure(config: Config) -> None:
 | 
			
		||||
    resultlog = config._store.get(resultlog_key, None)
 | 
			
		||||
    if resultlog:
 | 
			
		||||
        resultlog.logfile.close()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,6 +17,7 @@ from _pytest import timing
 | 
			
		|||
from _pytest._code.code import ExceptionChainRepr
 | 
			
		||||
from _pytest._code.code import ExceptionInfo
 | 
			
		||||
from _pytest.compat import TYPE_CHECKING
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.nodes import Collector
 | 
			
		||||
from _pytest.nodes import Node
 | 
			
		||||
from _pytest.outcomes import Exit
 | 
			
		||||
| 
						 | 
				
			
			@ -27,11 +28,13 @@ if TYPE_CHECKING:
 | 
			
		|||
    from typing import Type
 | 
			
		||||
    from typing_extensions import Literal
 | 
			
		||||
 | 
			
		||||
    from _pytest.main import Session
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# pytest plugin hooks
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("terminal reporting", "reporting", after="general")
 | 
			
		||||
    group.addoption(
 | 
			
		||||
        "--durations",
 | 
			
		||||
| 
						 | 
				
			
			@ -75,11 +78,11 @@ def pytest_terminal_summary(terminalreporter):
 | 
			
		|||
        tr.write_line("{:02.2f}s {:<8} {}".format(rep.duration, rep.when, rep.nodeid))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_sessionstart(session):
 | 
			
		||||
def pytest_sessionstart(session: "Session") -> None:
 | 
			
		||||
    session._setupstate = SetupState()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_sessionfinish(session):
 | 
			
		||||
def pytest_sessionfinish(session: "Session") -> None:
 | 
			
		||||
    session._setupstate.teardown_all()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,14 @@
 | 
			
		|||
from typing import Optional
 | 
			
		||||
from typing import Union
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
from _pytest._io.saferepr import saferepr
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config import ExitCode
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("debugconfig")
 | 
			
		||||
    group.addoption(
 | 
			
		||||
        "--setuponly",
 | 
			
		||||
| 
						 | 
				
			
			@ -76,6 +82,7 @@ def _show_fixture_action(fixturedef, msg):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@pytest.hookimpl(tryfirst=True)
 | 
			
		||||
def pytest_cmdline_main(config):
 | 
			
		||||
def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]:
 | 
			
		||||
    if config.option.setuponly:
 | 
			
		||||
        config.option.setupshow = True
 | 
			
		||||
    return None
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,13 @@
 | 
			
		|||
from typing import Optional
 | 
			
		||||
from typing import Union
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config import ExitCode
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("debugconfig")
 | 
			
		||||
    group.addoption(
 | 
			
		||||
        "--setupplan",
 | 
			
		||||
| 
						 | 
				
			
			@ -19,10 +25,12 @@ def pytest_fixture_setup(fixturedef, request):
 | 
			
		|||
        my_cache_key = fixturedef.cache_key(request)
 | 
			
		||||
        fixturedef.cached_result = (None, my_cache_key, None)
 | 
			
		||||
        return fixturedef.cached_result
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.hookimpl(tryfirst=True)
 | 
			
		||||
def pytest_cmdline_main(config):
 | 
			
		||||
def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]:
 | 
			
		||||
    if config.option.setupplan:
 | 
			
		||||
        config.option.setuponly = True
 | 
			
		||||
        config.option.setupshow = True
 | 
			
		||||
    return None
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,7 @@
 | 
			
		|||
""" support for skip/xfail functions and markers. """
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config import hookimpl
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.mark.evaluate import MarkEvaluator
 | 
			
		||||
from _pytest.outcomes import fail
 | 
			
		||||
from _pytest.outcomes import skip
 | 
			
		||||
| 
						 | 
				
			
			@ -12,7 +14,7 @@ evalxfail_key = StoreKey[MarkEvaluator]()
 | 
			
		|||
unexpectedsuccess_key = StoreKey[str]()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("general")
 | 
			
		||||
    group.addoption(
 | 
			
		||||
        "--runxfail",
 | 
			
		||||
| 
						 | 
				
			
			@ -31,7 +33,7 @@ def pytest_addoption(parser):
 | 
			
		|||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_configure(config):
 | 
			
		||||
def pytest_configure(config: Config) -> None:
 | 
			
		||||
    if config.option.runxfail:
 | 
			
		||||
        # yay a hack
 | 
			
		||||
        import pytest
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +44,7 @@ def pytest_configure(config):
 | 
			
		|||
        def nop(*args, **kwargs):
 | 
			
		||||
            pass
 | 
			
		||||
 | 
			
		||||
        nop.Exception = xfail.Exception
 | 
			
		||||
        nop.Exception = xfail.Exception  # type: ignore[attr-defined] # noqa: F821
 | 
			
		||||
        setattr(pytest, "xfail", nop)
 | 
			
		||||
 | 
			
		||||
    config.addinivalue_line(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,10 @@
 | 
			
		|||
import pytest
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.main import Session
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("general")
 | 
			
		||||
    group.addoption(
 | 
			
		||||
        "--sw",
 | 
			
		||||
| 
						 | 
				
			
			@ -19,7 +22,7 @@ def pytest_addoption(parser):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@pytest.hookimpl
 | 
			
		||||
def pytest_configure(config):
 | 
			
		||||
def pytest_configure(config: Config) -> None:
 | 
			
		||||
    config.pluginmanager.register(StepwisePlugin(config), "stepwiseplugin")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -34,7 +37,7 @@ class StepwisePlugin:
 | 
			
		|||
            self.lastfailed = config.cache.get("cache/stepwise", None)
 | 
			
		||||
            self.skip = config.getvalue("stepwise_skip")
 | 
			
		||||
 | 
			
		||||
    def pytest_sessionstart(self, session):
 | 
			
		||||
    def pytest_sessionstart(self, session: Session) -> None:
 | 
			
		||||
        self.session = session
 | 
			
		||||
 | 
			
		||||
    def pytest_collection_modifyitems(self, session, config, items):
 | 
			
		||||
| 
						 | 
				
			
			@ -100,7 +103,7 @@ class StepwisePlugin:
 | 
			
		|||
        if self.active and self.config.getoption("verbose") >= 0 and self.report_status:
 | 
			
		||||
            return "stepwise: %s" % self.report_status
 | 
			
		||||
 | 
			
		||||
    def pytest_sessionfinish(self, session):
 | 
			
		||||
    def pytest_sessionfinish(self, session: Session) -> None:
 | 
			
		||||
        if self.active:
 | 
			
		||||
            self.config.cache.set("cache/stepwise", self.lastfailed)
 | 
			
		||||
        else:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,6 +17,7 @@ from typing import Mapping
 | 
			
		|||
from typing import Optional
 | 
			
		||||
from typing import Set
 | 
			
		||||
from typing import Tuple
 | 
			
		||||
from typing import Union
 | 
			
		||||
 | 
			
		||||
import attr
 | 
			
		||||
import pluggy
 | 
			
		||||
| 
						 | 
				
			
			@ -29,8 +30,10 @@ from _pytest import timing
 | 
			
		|||
from _pytest._io import TerminalWriter
 | 
			
		||||
from _pytest._io.wcwidth import wcswidth
 | 
			
		||||
from _pytest.compat import order_preserving_dict
 | 
			
		||||
from _pytest.config import _PluggyPlugin
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config import ExitCode
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.deprecated import TERMINALWRITER_WRITER
 | 
			
		||||
from _pytest.main import Session
 | 
			
		||||
from _pytest.reports import CollectReport
 | 
			
		||||
| 
						 | 
				
			
			@ -77,7 +80,7 @@ class MoreQuietAction(argparse.Action):
 | 
			
		|||
        namespace.quiet = getattr(namespace, "quiet", 0) + 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("terminal reporting", "reporting", after="general")
 | 
			
		||||
    group._addoption(
 | 
			
		||||
        "-v",
 | 
			
		||||
| 
						 | 
				
			
			@ -423,7 +426,7 @@ class TerminalReporter:
 | 
			
		|||
        )
 | 
			
		||||
        self._add_stats("warnings", [warning_report])
 | 
			
		||||
 | 
			
		||||
    def pytest_plugin_registered(self, plugin):
 | 
			
		||||
    def pytest_plugin_registered(self, plugin: _PluggyPlugin) -> None:
 | 
			
		||||
        if self.config.option.traceconfig:
 | 
			
		||||
            msg = "PLUGIN registered: {}".format(plugin)
 | 
			
		||||
            # XXX this event may happen during setup/teardown time
 | 
			
		||||
| 
						 | 
				
			
			@ -717,7 +720,7 @@ class TerminalReporter:
 | 
			
		|||
                            self._tw.line("{}{}".format(indent + "  ", line))
 | 
			
		||||
 | 
			
		||||
    @pytest.hookimpl(hookwrapper=True)
 | 
			
		||||
    def pytest_sessionfinish(self, session: Session, exitstatus: ExitCode):
 | 
			
		||||
    def pytest_sessionfinish(self, session: Session, exitstatus: Union[int, ExitCode]):
 | 
			
		||||
        outcome = yield
 | 
			
		||||
        outcome.get_result()
 | 
			
		||||
        self._tw.line("")
 | 
			
		||||
| 
						 | 
				
			
			@ -752,10 +755,10 @@ class TerminalReporter:
 | 
			
		|||
        # Display any extra warnings from teardown here (if any).
 | 
			
		||||
        self.summary_warnings()
 | 
			
		||||
 | 
			
		||||
    def pytest_keyboard_interrupt(self, excinfo):
 | 
			
		||||
    def pytest_keyboard_interrupt(self, excinfo) -> None:
 | 
			
		||||
        self._keyboardinterrupt_memo = excinfo.getrepr(funcargs=True)
 | 
			
		||||
 | 
			
		||||
    def pytest_unconfigure(self):
 | 
			
		||||
    def pytest_unconfigure(self) -> None:
 | 
			
		||||
        if hasattr(self, "_keyboardinterrupt_memo"):
 | 
			
		||||
            self._report_keyboardinterrupt()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,6 +8,8 @@ from typing import Tuple
 | 
			
		|||
 | 
			
		||||
import pytest
 | 
			
		||||
from _pytest.compat import TYPE_CHECKING
 | 
			
		||||
from _pytest.config import Config
 | 
			
		||||
from _pytest.config.argparsing import Parser
 | 
			
		||||
from _pytest.main import Session
 | 
			
		||||
 | 
			
		||||
if TYPE_CHECKING:
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +51,7 @@ def _parse_filter(
 | 
			
		|||
    return (action, message, category, module, lineno)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_addoption(parser):
 | 
			
		||||
def pytest_addoption(parser: Parser) -> None:
 | 
			
		||||
    group = parser.getgroup("pytest-warnings")
 | 
			
		||||
    group.addoption(
 | 
			
		||||
        "-W",
 | 
			
		||||
| 
						 | 
				
			
			@ -66,7 +68,7 @@ def pytest_addoption(parser):
 | 
			
		|||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def pytest_configure(config):
 | 
			
		||||
def pytest_configure(config: Config) -> None:
 | 
			
		||||
    config.addinivalue_line(
 | 
			
		||||
        "markers",
 | 
			
		||||
        "filterwarnings(warning): add a warning filter to the given test. "
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue