Merge pull request #7370 from bluetech/typing3
Some type annotations, doc improvements
This commit is contained in:
		
						commit
						b6fd89ef31
					
				| 
						 | 
					@ -287,7 +287,7 @@ Bug Fixes
 | 
				
			||||||
- `#6646 <https://github.com/pytest-dev/pytest/issues/6646>`_: Assertion rewriting hooks are (re)stored for the current item, which fixes them being still used after e.g. pytester's :func:`testdir.runpytest <_pytest.pytester.Testdir.runpytest>` etc.
 | 
					- `#6646 <https://github.com/pytest-dev/pytest/issues/6646>`_: Assertion rewriting hooks are (re)stored for the current item, which fixes them being still used after e.g. pytester's :func:`testdir.runpytest <_pytest.pytester.Testdir.runpytest>` etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- `#6660 <https://github.com/pytest-dev/pytest/issues/6660>`_: :func:`pytest.exit() <_pytest.outcomes.exit>` is handled when emitted from the :func:`pytest_sessionfinish <_pytest.hookspec.pytest_sessionfinish>` hook.  This includes quitting from a debugger.
 | 
					- `#6660 <https://github.com/pytest-dev/pytest/issues/6660>`_: :py:func:`pytest.exit` is handled when emitted from the :func:`pytest_sessionfinish <_pytest.hookspec.pytest_sessionfinish>` hook.  This includes quitting from a debugger.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- `#6752 <https://github.com/pytest-dev/pytest/issues/6752>`_: When :py:func:`pytest.raises` is used as a function (as opposed to a context manager),
 | 
					- `#6752 <https://github.com/pytest-dev/pytest/issues/6752>`_: When :py:func:`pytest.raises` is used as a function (as opposed to a context manager),
 | 
				
			||||||
| 
						 | 
					@ -399,7 +399,7 @@ Improvements
 | 
				
			||||||
- `#6231 <https://github.com/pytest-dev/pytest/issues/6231>`_: Improve check for misspelling of :ref:`pytest.mark.parametrize ref`.
 | 
					- `#6231 <https://github.com/pytest-dev/pytest/issues/6231>`_: Improve check for misspelling of :ref:`pytest.mark.parametrize ref`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- `#6257 <https://github.com/pytest-dev/pytest/issues/6257>`_: Handle :py:func:`_pytest.outcomes.exit` being used via :py:func:`~_pytest.hookspec.pytest_internalerror`, e.g. when quitting pdb from post mortem.
 | 
					- `#6257 <https://github.com/pytest-dev/pytest/issues/6257>`_: Handle :py:func:`pytest.exit` being used via :py:func:`~_pytest.hookspec.pytest_internalerror`, e.g. when quitting pdb from post mortem.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,41 +15,41 @@ Functions
 | 
				
			||||||
pytest.approx
 | 
					pytest.approx
 | 
				
			||||||
~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. autofunction:: _pytest.python_api.approx
 | 
					.. autofunction:: pytest.approx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pytest.fail
 | 
					pytest.fail
 | 
				
			||||||
~~~~~~~~~~~
 | 
					~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**Tutorial**: :ref:`skipping`
 | 
					**Tutorial**: :ref:`skipping`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. autofunction:: _pytest.outcomes.fail
 | 
					.. autofunction:: pytest.fail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pytest.skip
 | 
					pytest.skip
 | 
				
			||||||
~~~~~~~~~~~
 | 
					~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. autofunction:: _pytest.outcomes.skip(msg, [allow_module_level=False])
 | 
					.. autofunction:: pytest.skip(msg, [allow_module_level=False])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. _`pytest.importorskip ref`:
 | 
					.. _`pytest.importorskip ref`:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pytest.importorskip
 | 
					pytest.importorskip
 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. autofunction:: _pytest.outcomes.importorskip
 | 
					.. autofunction:: pytest.importorskip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pytest.xfail
 | 
					pytest.xfail
 | 
				
			||||||
~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. autofunction:: _pytest.outcomes.xfail
 | 
					.. autofunction:: pytest.xfail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pytest.exit
 | 
					pytest.exit
 | 
				
			||||||
~~~~~~~~~~~
 | 
					~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. autofunction:: _pytest.outcomes.exit
 | 
					.. autofunction:: pytest.exit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pytest.main
 | 
					pytest.main
 | 
				
			||||||
~~~~~~~~~~~
 | 
					~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. autofunction:: _pytest.config.main
 | 
					.. autofunction:: pytest.main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pytest.param
 | 
					pytest.param
 | 
				
			||||||
~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~
 | 
				
			||||||
| 
						 | 
					@ -644,31 +644,6 @@ Initialization hooks called for plugins and ``conftest.py`` files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. autofunction:: pytest_plugin_registered
 | 
					.. autofunction:: pytest_plugin_registered
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Test running hooks
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
All runtest related hooks receive a :py:class:`pytest.Item <_pytest.main.Item>` object.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.. autofunction:: pytest_runtestloop
 | 
					 | 
				
			||||||
.. autofunction:: pytest_runtest_protocol
 | 
					 | 
				
			||||||
.. autofunction:: pytest_runtest_logstart
 | 
					 | 
				
			||||||
.. autofunction:: pytest_runtest_logfinish
 | 
					 | 
				
			||||||
.. autofunction:: pytest_runtest_setup
 | 
					 | 
				
			||||||
.. autofunction:: pytest_runtest_call
 | 
					 | 
				
			||||||
.. autofunction:: pytest_runtest_teardown
 | 
					 | 
				
			||||||
.. autofunction:: pytest_runtest_makereport
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
For deeper understanding you may look at the default implementation of
 | 
					 | 
				
			||||||
these hooks in :py:mod:`_pytest.runner` and maybe also
 | 
					 | 
				
			||||||
in :py:mod:`_pytest.pdb` which interacts with :py:mod:`_pytest.capture`
 | 
					 | 
				
			||||||
and its input/output capturing in order to immediately drop
 | 
					 | 
				
			||||||
into interactive debugging when a test failure occurs.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The :py:mod:`_pytest.terminal` reported specifically uses
 | 
					 | 
				
			||||||
the reporting hook to print information about a test run.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.. autofunction:: pytest_pyfunc_call
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Collection hooks
 | 
					Collection hooks
 | 
				
			||||||
~~~~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -694,6 +669,28 @@ items, delete or otherwise amend the test items:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. autofunction:: pytest_collection_finish
 | 
					.. autofunction:: pytest_collection_finish
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Test running (runtest) hooks
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					All runtest related hooks receive a :py:class:`pytest.Item <_pytest.main.Item>` object.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. autofunction:: pytest_runtestloop
 | 
				
			||||||
 | 
					.. autofunction:: pytest_runtest_protocol
 | 
				
			||||||
 | 
					.. autofunction:: pytest_runtest_logstart
 | 
				
			||||||
 | 
					.. autofunction:: pytest_runtest_logfinish
 | 
				
			||||||
 | 
					.. autofunction:: pytest_runtest_setup
 | 
				
			||||||
 | 
					.. autofunction:: pytest_runtest_call
 | 
				
			||||||
 | 
					.. autofunction:: pytest_runtest_teardown
 | 
				
			||||||
 | 
					.. autofunction:: pytest_runtest_makereport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For deeper understanding you may look at the default implementation of
 | 
				
			||||||
 | 
					these hooks in :py:mod:`_pytest.runner` and maybe also
 | 
				
			||||||
 | 
					in :py:mod:`_pytest.pdb` which interacts with :py:mod:`_pytest.capture`
 | 
				
			||||||
 | 
					and its input/output capturing in order to immediately drop
 | 
				
			||||||
 | 
					into interactive debugging when a test failure occurs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. autofunction:: pytest_pyfunc_call
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Reporting hooks
 | 
					Reporting hooks
 | 
				
			||||||
~~~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -762,6 +759,14 @@ Collector
 | 
				
			||||||
    :members:
 | 
					    :members:
 | 
				
			||||||
    :show-inheritance:
 | 
					    :show-inheritance:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CollectReport
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. autoclass:: _pytest.reports.CollectReport()
 | 
				
			||||||
 | 
					    :members:
 | 
				
			||||||
 | 
					    :show-inheritance:
 | 
				
			||||||
 | 
					    :inherited-members:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Config
 | 
					Config
 | 
				
			||||||
~~~~~~
 | 
					~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -881,7 +886,7 @@ Session
 | 
				
			||||||
TestReport
 | 
					TestReport
 | 
				
			||||||
~~~~~~~~~~
 | 
					~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. autoclass:: _pytest.runner.TestReport()
 | 
					.. autoclass:: _pytest.reports.TestReport()
 | 
				
			||||||
    :members:
 | 
					    :members:
 | 
				
			||||||
    :show-inheritance:
 | 
					    :show-inheritance:
 | 
				
			||||||
    :inherited-members:
 | 
					    :inherited-members:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -361,18 +361,28 @@ def pytest_make_parametrize_id(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# -------------------------------------------------------------------------
 | 
					# -------------------------------------------------------------------------
 | 
				
			||||||
# generic runtest related hooks
 | 
					# runtest related hooks
 | 
				
			||||||
# -------------------------------------------------------------------------
 | 
					# -------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@hookspec(firstresult=True)
 | 
					@hookspec(firstresult=True)
 | 
				
			||||||
def pytest_runtestloop(session: "Session") -> Optional[object]:
 | 
					def pytest_runtestloop(session: "Session") -> Optional[object]:
 | 
				
			||||||
    """ called for performing the main runtest loop
 | 
					    """Performs the main runtest loop (after collection finished).
 | 
				
			||||||
    (after collection finished).
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Stops at first non-None result, see :ref:`firstresult`
 | 
					    The default hook implementation performs the runtest protocol for all items
 | 
				
			||||||
 | 
					    collected in the session (``session.items``), unless the collection failed
 | 
				
			||||||
 | 
					    or the ``collectonly`` pytest option is set.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    :param _pytest.main.Session session: the pytest session object
 | 
					    If at any point :py:func:`pytest.exit` is called, the loop is
 | 
				
			||||||
 | 
					    terminated immediately.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    If at any point ``session.shouldfail`` or ``session.shouldstop`` are set, the
 | 
				
			||||||
 | 
					    loop is terminated after the runtest protocol for the current item is finished.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    :param _pytest.main.Session session: The pytest session object.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Stops at first non-None result, see :ref:`firstresult`.
 | 
				
			||||||
 | 
					    The return value is not used, but only stops further processing.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -380,56 +390,91 @@ def pytest_runtestloop(session: "Session") -> Optional[object]:
 | 
				
			||||||
def pytest_runtest_protocol(
 | 
					def pytest_runtest_protocol(
 | 
				
			||||||
    item: "Item", nextitem: "Optional[Item]"
 | 
					    item: "Item", nextitem: "Optional[Item]"
 | 
				
			||||||
) -> Optional[object]:
 | 
					) -> Optional[object]:
 | 
				
			||||||
    """ implements the runtest_setup/call/teardown protocol for
 | 
					    """Performs the runtest protocol for a single test item.
 | 
				
			||||||
    the given test item, including capturing exceptions and calling
 | 
					 | 
				
			||||||
    reporting hooks.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    :arg item: test item for which the runtest protocol is performed.
 | 
					    The default runtest protocol is this (see individual hooks for full details):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    :arg nextitem: the scheduled-to-be-next test item (or None if this
 | 
					    - ``pytest_runtest_logstart(nodeid, location)``
 | 
				
			||||||
                   is the end my friend).  This argument is passed on to
 | 
					 | 
				
			||||||
                   :py:func:`pytest_runtest_teardown`.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    :return boolean: True if no further hook implementations should be invoked.
 | 
					    - Setup phase:
 | 
				
			||||||
 | 
					        - ``call = pytest_runtest_setup(item)`` (wrapped in ``CallInfo(when="setup")``)
 | 
				
			||||||
 | 
					        - ``report = pytest_runtest_makereport(item, call)``
 | 
				
			||||||
 | 
					        - ``pytest_runtest_logreport(report)``
 | 
				
			||||||
 | 
					        - ``pytest_exception_interact(call, report)`` if an interactive exception occurred
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Call phase, if the the setup passed and the ``setuponly`` pytest option is not set:
 | 
				
			||||||
 | 
					        - ``call = pytest_runtest_call(item)`` (wrapped in ``CallInfo(when="call")``)
 | 
				
			||||||
 | 
					        - ``report = pytest_runtest_makereport(item, call)``
 | 
				
			||||||
 | 
					        - ``pytest_runtest_logreport(report)``
 | 
				
			||||||
 | 
					        - ``pytest_exception_interact(call, report)`` if an interactive exception occurred
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Stops at first non-None result, see :ref:`firstresult` """
 | 
					    - Teardown phase:
 | 
				
			||||||
 | 
					        - ``call = pytest_runtest_teardown(item, nextitem)`` (wrapped in ``CallInfo(when="teardown")``)
 | 
				
			||||||
 | 
					        - ``report = pytest_runtest_makereport(item, call)``
 | 
				
			||||||
 | 
					        - ``pytest_runtest_logreport(report)``
 | 
				
			||||||
 | 
					        - ``pytest_exception_interact(call, report)`` if an interactive exception occurred
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - ``pytest_runtest_logfinish(nodeid, location)``
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def pytest_runtest_logstart(nodeid, location):
 | 
					    :arg item: Test item for which the runtest protocol is performed.
 | 
				
			||||||
    """ signal the start of running a single test item.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    This hook will be called **before** :func:`pytest_runtest_setup`, :func:`pytest_runtest_call` and
 | 
					    :arg nextitem: The scheduled-to-be-next test item (or None if this is the end my friend).
 | 
				
			||||||
    :func:`pytest_runtest_teardown` hooks.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    :param str nodeid: full id of the item
 | 
					    Stops at first non-None result, see :ref:`firstresult`.
 | 
				
			||||||
    :param location: a triple of ``(filename, linenum, testname)``
 | 
					    The return value is not used, but only stops further processing.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def pytest_runtest_logfinish(nodeid, location):
 | 
					def pytest_runtest_logstart(
 | 
				
			||||||
    """ signal the complete finish of running a single test item.
 | 
					    nodeid: str, location: Tuple[str, Optional[int], str]
 | 
				
			||||||
 | 
					) -> None:
 | 
				
			||||||
 | 
					    """Called at the start of running the runtest protocol for a single item.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    This hook will be called **after** :func:`pytest_runtest_setup`, :func:`pytest_runtest_call` and
 | 
					    See :func:`pytest_runtest_protocol` for a description of the runtest protocol.
 | 
				
			||||||
    :func:`pytest_runtest_teardown` hooks.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    :param str nodeid: full id of the item
 | 
					    :param str nodeid: Full node ID of the item.
 | 
				
			||||||
    :param location: a triple of ``(filename, linenum, testname)``
 | 
					    :param location: A triple of ``(filename, lineno, testname)``.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def pytest_runtest_logfinish(
 | 
				
			||||||
 | 
					    nodeid: str, location: Tuple[str, Optional[int], str]
 | 
				
			||||||
 | 
					) -> None:
 | 
				
			||||||
 | 
					    """Called at the end of running the runtest protocol for a single item.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    See :func:`pytest_runtest_protocol` for a description of the runtest protocol.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    :param str nodeid: Full node ID of the item.
 | 
				
			||||||
 | 
					    :param location: A triple of ``(filename, lineno, testname)``.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def pytest_runtest_setup(item: "Item") -> None:
 | 
					def pytest_runtest_setup(item: "Item") -> None:
 | 
				
			||||||
    """ called before ``pytest_runtest_call(item)``. """
 | 
					    """Called to perform the setup phase for a test item.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    The default implementation runs ``setup()`` on ``item`` and all of its
 | 
				
			||||||
 | 
					    parents (which haven't been setup yet). This includes obtaining the
 | 
				
			||||||
 | 
					    values of fixtures required by the item (which haven't been obtained
 | 
				
			||||||
 | 
					    yet).
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def pytest_runtest_call(item: "Item") -> None:
 | 
					def pytest_runtest_call(item: "Item") -> None:
 | 
				
			||||||
    """ called to execute the test ``item``. """
 | 
					    """Called to run the test for test item (the call phase).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    The default implementation calls ``item.runtest()``.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def pytest_runtest_teardown(item: "Item", nextitem: "Optional[Item]") -> None:
 | 
					def pytest_runtest_teardown(item: "Item", nextitem: "Optional[Item]") -> None:
 | 
				
			||||||
    """ called after ``pytest_runtest_call``.
 | 
					    """Called to perform the teardown phase for a test item.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    :arg nextitem: the scheduled-to-be-next test item (None if no further
 | 
					    The default implementation runs the finalizers and calls ``teardown()``
 | 
				
			||||||
 | 
					    on ``item`` and all of its parents (which need to be torn down). This
 | 
				
			||||||
 | 
					    includes running the teardown phase of fixtures required by the item (if
 | 
				
			||||||
 | 
					    they go out of scope).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    :arg nextitem: The scheduled-to-be-next test item (None if no further
 | 
				
			||||||
                   test item is scheduled).  This argument can be used to
 | 
					                   test item is scheduled).  This argument can be used to
 | 
				
			||||||
                   perform exact teardowns, i.e. calling just enough finalizers
 | 
					                   perform exact teardowns, i.e. calling just enough finalizers
 | 
				
			||||||
                   so that nextitem only needs to call setup-functions.
 | 
					                   so that nextitem only needs to call setup-functions.
 | 
				
			||||||
| 
						 | 
					@ -437,17 +482,26 @@ def pytest_runtest_teardown(item: "Item", nextitem: "Optional[Item]") -> None:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@hookspec(firstresult=True)
 | 
					@hookspec(firstresult=True)
 | 
				
			||||||
def pytest_runtest_makereport(item: "Item", call: "CallInfo[None]") -> Optional[object]:
 | 
					def pytest_runtest_makereport(
 | 
				
			||||||
    """ return a :py:class:`_pytest.runner.TestReport` object
 | 
					    item: "Item", call: "CallInfo[None]"
 | 
				
			||||||
    for the given :py:class:`pytest.Item <_pytest.main.Item>` and
 | 
					) -> Optional["TestReport"]:
 | 
				
			||||||
    :py:class:`_pytest.runner.CallInfo`.
 | 
					    """Called to create a :py:class:`_pytest.reports.TestReport` for each of
 | 
				
			||||||
 | 
					    the setup, call and teardown runtest phases of a test item.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Stops at first non-None result, see :ref:`firstresult` """
 | 
					    See :func:`pytest_runtest_protocol` for a description of the runtest protocol.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    :param CallInfo[None] call: The ``CallInfo`` for the phase.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Stops at first non-None result, see :ref:`firstresult`.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def pytest_runtest_logreport(report: "TestReport") -> None:
 | 
					def pytest_runtest_logreport(report: "TestReport") -> None:
 | 
				
			||||||
    """ process a test setup/call/teardown report relating to
 | 
					    """Process the :py:class:`_pytest.reports.TestReport` produced for each
 | 
				
			||||||
    the respective phase of executing a test. """
 | 
					    of the setup, call and teardown runtest phases of an item.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    See :func:`pytest_runtest_protocol` for a description of the runtest protocol.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@hookspec(firstresult=True)
 | 
					@hookspec(firstresult=True)
 | 
				
			||||||
| 
						 | 
					@ -779,11 +833,17 @@ def pytest_keyboard_interrupt(
 | 
				
			||||||
def pytest_exception_interact(
 | 
					def pytest_exception_interact(
 | 
				
			||||||
    node: "Node", call: "CallInfo[object]", report: "Union[CollectReport, TestReport]"
 | 
					    node: "Node", call: "CallInfo[object]", report: "Union[CollectReport, TestReport]"
 | 
				
			||||||
) -> None:
 | 
					) -> None:
 | 
				
			||||||
    """called when an exception was raised which can potentially be
 | 
					    """Called when an exception was raised which can potentially be
 | 
				
			||||||
    interactively handled.
 | 
					    interactively handled.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    This hook is only called if an exception was raised
 | 
					    May be called during collection (see :py:func:`pytest_make_collect_report`),
 | 
				
			||||||
    that is not an internal exception like ``skip.Exception``.
 | 
					    in which case ``report`` is a :py:class:`_pytest.reports.CollectReport`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    May be called during runtest of an item (see :py:func:`pytest_runtest_protocol`),
 | 
				
			||||||
 | 
					    in which case ``report`` is a :py:class:`_pytest.reports.TestReport`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This hook is not called if the exception that was raised is an internal
 | 
				
			||||||
 | 
					    exception like ``skip.Exception``.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -653,12 +653,12 @@ class LoggingPlugin:
 | 
				
			||||||
                yield  # run all the tests
 | 
					                yield  # run all the tests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @pytest.hookimpl
 | 
					    @pytest.hookimpl
 | 
				
			||||||
    def pytest_runtest_logstart(self):
 | 
					    def pytest_runtest_logstart(self) -> None:
 | 
				
			||||||
        self.log_cli_handler.reset()
 | 
					        self.log_cli_handler.reset()
 | 
				
			||||||
        self.log_cli_handler.set_when("start")
 | 
					        self.log_cli_handler.set_when("start")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @pytest.hookimpl
 | 
					    @pytest.hookimpl
 | 
				
			||||||
    def pytest_runtest_logreport(self):
 | 
					    def pytest_runtest_logreport(self) -> None:
 | 
				
			||||||
        self.log_cli_handler.set_when("logreport")
 | 
					        self.log_cli_handler.set_when("logreport")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _runtest_for(self, item: nodes.Item, when: str) -> Generator[None, None, None]:
 | 
					    def _runtest_for(self, item: nodes.Item, when: str) -> Generator[None, None, None]:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -335,6 +335,8 @@ class TestReport(BaseReport):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class CollectReport(BaseReport):
 | 
					class CollectReport(BaseReport):
 | 
				
			||||||
 | 
					    """Collection report object."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    when = "collect"
 | 
					    when = "collect"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(
 | 
					    def __init__(
 | 
				
			||||||
| 
						 | 
					@ -346,11 +348,24 @@ class CollectReport(BaseReport):
 | 
				
			||||||
        sections: Iterable[Tuple[str, str]] = (),
 | 
					        sections: Iterable[Tuple[str, str]] = (),
 | 
				
			||||||
        **extra
 | 
					        **extra
 | 
				
			||||||
    ) -> None:
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        #: normalized collection node id
 | 
				
			||||||
        self.nodeid = nodeid
 | 
					        self.nodeid = nodeid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #: test outcome, always one of "passed", "failed", "skipped".
 | 
				
			||||||
        self.outcome = outcome
 | 
					        self.outcome = outcome
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #: None or a failure representation.
 | 
				
			||||||
        self.longrepr = longrepr
 | 
					        self.longrepr = longrepr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #: The collected items and collection nodes.
 | 
				
			||||||
        self.result = result or []
 | 
					        self.result = result or []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #: list of pairs ``(str, str)`` of extra information which needs to
 | 
				
			||||||
 | 
					        #: marshallable. Used by pytest to add captured text
 | 
				
			||||||
 | 
					        #: from ``stdout`` and ``stderr``, but may be used by other plugins
 | 
				
			||||||
 | 
					        #: to add arbitrary information to reports.
 | 
				
			||||||
        self.sections = list(sections)
 | 
					        self.sections = list(sections)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.__dict__.update(extra)
 | 
					        self.__dict__.update(extra)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -502,7 +502,9 @@ class TerminalReporter:
 | 
				
			||||||
    def pytest_deselected(self, items) -> None:
 | 
					    def pytest_deselected(self, items) -> None:
 | 
				
			||||||
        self._add_stats("deselected", items)
 | 
					        self._add_stats("deselected", items)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def pytest_runtest_logstart(self, nodeid, location) -> None:
 | 
					    def pytest_runtest_logstart(
 | 
				
			||||||
 | 
					        self, nodeid: str, location: Tuple[str, Optional[int], str]
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
        # ensure that the path is printed before the
 | 
					        # ensure that the path is printed before the
 | 
				
			||||||
        # 1st test of a module starts running
 | 
					        # 1st test of a module starts running
 | 
				
			||||||
        if self.showlongtestinfo:
 | 
					        if self.showlongtestinfo:
 | 
				
			||||||
| 
						 | 
					@ -569,7 +571,7 @@ class TerminalReporter:
 | 
				
			||||||
        assert self._session is not None
 | 
					        assert self._session is not None
 | 
				
			||||||
        return len(self._progress_nodeids_reported) == self._session.testscollected
 | 
					        return len(self._progress_nodeids_reported) == self._session.testscollected
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def pytest_runtest_logfinish(self, nodeid) -> None:
 | 
					    def pytest_runtest_logfinish(self, nodeid: str) -> None:
 | 
				
			||||||
        assert self._session
 | 
					        assert self._session
 | 
				
			||||||
        if self.verbosity <= 0 and self._show_progress_info:
 | 
					        if self.verbosity <= 0 and self._show_progress_info:
 | 
				
			||||||
            if self._show_progress_info == "count":
 | 
					            if self._show_progress_info == "count":
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,8 @@
 | 
				
			||||||
import sys
 | 
					import sys
 | 
				
			||||||
import warnings
 | 
					import warnings
 | 
				
			||||||
from types import ModuleType
 | 
					from types import ModuleType
 | 
				
			||||||
 | 
					from typing import Any
 | 
				
			||||||
 | 
					from typing import List
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import pytest
 | 
					import pytest
 | 
				
			||||||
from _pytest.deprecated import PYTEST_COLLECT_MODULE
 | 
					from _pytest.deprecated import PYTEST_COLLECT_MODULE
 | 
				
			||||||
| 
						 | 
					@ -20,15 +22,15 @@ COLLECT_FAKEMODULE_ATTRIBUTES = [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FakeCollectModule(ModuleType):
 | 
					class FakeCollectModule(ModuleType):
 | 
				
			||||||
    def __init__(self):
 | 
					    def __init__(self) -> None:
 | 
				
			||||||
        super().__init__("pytest.collect")
 | 
					        super().__init__("pytest.collect")
 | 
				
			||||||
        self.__all__ = list(COLLECT_FAKEMODULE_ATTRIBUTES)
 | 
					        self.__all__ = list(COLLECT_FAKEMODULE_ATTRIBUTES)
 | 
				
			||||||
        self.__pytest = pytest
 | 
					        self.__pytest = pytest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __dir__(self):
 | 
					    def __dir__(self) -> List[str]:
 | 
				
			||||||
        return dir(super()) + self.__all__
 | 
					        return dir(super()) + self.__all__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __getattr__(self, name):
 | 
					    def __getattr__(self, name: str) -> Any:
 | 
				
			||||||
        if name not in self.__all__:
 | 
					        if name not in self.__all__:
 | 
				
			||||||
            raise AttributeError(name)
 | 
					            raise AttributeError(name)
 | 
				
			||||||
        warnings.warn(PYTEST_COLLECT_MODULE.format(name=name), stacklevel=2)
 | 
					        warnings.warn(PYTEST_COLLECT_MODULE.format(name=name), stacklevel=2)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue