Merge branch 'main' into teardown_fixture_order
This commit is contained in:
commit
6e5a8fea11
|
@ -64,6 +64,7 @@ repos:
|
||||||
additional_dependencies:
|
additional_dependencies:
|
||||||
- iniconfig>=1.1.0
|
- iniconfig>=1.1.0
|
||||||
- attrs>=19.2.0
|
- attrs>=19.2.0
|
||||||
|
- pluggy
|
||||||
- packaging
|
- packaging
|
||||||
- tomli
|
- tomli
|
||||||
- types-pkg_resources
|
- types-pkg_resources
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
The :hook:`pytest_plugin_registered` hook has a new ``plugin_name`` parameter containing the name by which ``plugin`` is registered.
|
|
@ -3,7 +3,6 @@
|
||||||
.. sidebar:: Next Open Trainings and Events
|
.. sidebar:: Next Open Trainings and Events
|
||||||
|
|
||||||
- `Professional Testing with Python <https://python-academy.com/courses/python_course_testing.html>`_, via `Python Academy <https://www.python-academy.com/>`_ (3 day in-depth training):
|
- `Professional Testing with Python <https://python-academy.com/courses/python_course_testing.html>`_, via `Python Academy <https://www.python-academy.com/>`_ (3 day in-depth training):
|
||||||
* **March 5th to 7th 2024**, Leipzig, Germany / Remote
|
|
||||||
* **June 11th to 13th 2024**, Remote
|
* **June 11th to 13th 2024**, Remote
|
||||||
* **March 4th to 6th 2025**, Leipzig, Germany / Remote
|
* **March 4th to 6th 2025**, Leipzig, Germany / Remote
|
||||||
- `pytest development sprint <https://github.com/pytest-dev/pytest/discussions/11655>`_, June 2024 (`date poll <https://nuudel.digitalcourage.de/2tEsEpRcwMNcAXVO>`_)
|
- `pytest development sprint <https://github.com/pytest-dev/pytest/discussions/11655>`_, June 2024 (`date poll <https://nuudel.digitalcourage.de/2tEsEpRcwMNcAXVO>`_)
|
||||||
|
|
|
@ -490,15 +490,19 @@ class PytestPluginManager(PluginManager):
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return None
|
return None
|
||||||
ret: Optional[str] = super().register(plugin, name)
|
plugin_name = super().register(plugin, name)
|
||||||
if ret:
|
if plugin_name is not None:
|
||||||
self.hook.pytest_plugin_registered.call_historic(
|
self.hook.pytest_plugin_registered.call_historic(
|
||||||
kwargs=dict(plugin=plugin, manager=self)
|
kwargs=dict(
|
||||||
|
plugin=plugin,
|
||||||
|
plugin_name=plugin_name,
|
||||||
|
manager=self,
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if isinstance(plugin, types.ModuleType):
|
if isinstance(plugin, types.ModuleType):
|
||||||
self.consider_module(plugin)
|
self.consider_module(plugin)
|
||||||
return ret
|
return plugin_name
|
||||||
|
|
||||||
def getplugin(self, name: str):
|
def getplugin(self, name: str):
|
||||||
# Support deprecated naming because plugins (xdist e.g.) use it.
|
# Support deprecated naming because plugins (xdist e.g.) use it.
|
||||||
|
|
|
@ -1492,25 +1492,27 @@ class FixtureManager:
|
||||||
|
|
||||||
return FuncFixtureInfo(argnames, initialnames, names_closure, arg2fixturedefs)
|
return FuncFixtureInfo(argnames, initialnames, names_closure, arg2fixturedefs)
|
||||||
|
|
||||||
def pytest_plugin_registered(self, plugin: _PluggyPlugin) -> None:
|
def pytest_plugin_registered(self, plugin: _PluggyPlugin, plugin_name: str) -> None:
|
||||||
nodeid = None
|
# Fixtures defined in conftest plugins are only visible to within the
|
||||||
|
# conftest's directory. This is unlike fixtures in non-conftest plugins
|
||||||
|
# which have global visibility. So for conftests, construct the base
|
||||||
|
# nodeid from the plugin name (which is the conftest path).
|
||||||
|
if plugin_name and plugin_name.endswith("conftest.py"):
|
||||||
|
# Note: we explicitly do *not* use `plugin.__file__` here -- The
|
||||||
|
# difference is that plugin_name has the correct capitalization on
|
||||||
|
# case-insensitive systems (Windows) and other normalization issues
|
||||||
|
# (issue #11816).
|
||||||
|
conftestpath = absolutepath(plugin_name)
|
||||||
try:
|
try:
|
||||||
p = absolutepath(plugin.__file__) # type: ignore[attr-defined]
|
nodeid = str(conftestpath.parent.relative_to(self.config.rootpath))
|
||||||
except AttributeError:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
# Construct the base nodeid which is later used to check
|
|
||||||
# what fixtures are visible for particular tests (as denoted
|
|
||||||
# by their test id).
|
|
||||||
if p.name == "conftest.py":
|
|
||||||
try:
|
|
||||||
nodeid = str(p.parent.relative_to(self.config.rootpath))
|
|
||||||
except ValueError:
|
except ValueError:
|
||||||
nodeid = ""
|
nodeid = ""
|
||||||
if nodeid == ".":
|
if nodeid == ".":
|
||||||
nodeid = ""
|
nodeid = ""
|
||||||
if os.sep != nodes.SEP:
|
if os.sep != nodes.SEP:
|
||||||
nodeid = nodeid.replace(os.sep, nodes.SEP)
|
nodeid = nodeid.replace(os.sep, nodes.SEP)
|
||||||
|
else:
|
||||||
|
nodeid = None
|
||||||
|
|
||||||
self.parsefactories(plugin, nodeid)
|
self.parsefactories(plugin, nodeid)
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ def pytest_addhooks(pluginmanager: "PytestPluginManager") -> None:
|
||||||
"""Called at plugin registration time to allow adding new hooks via a call to
|
"""Called at plugin registration time to allow adding new hooks via a call to
|
||||||
:func:`pluginmanager.add_hookspecs(module_or_class, prefix) <pytest.PytestPluginManager.add_hookspecs>`.
|
:func:`pluginmanager.add_hookspecs(module_or_class, prefix) <pytest.PytestPluginManager.add_hookspecs>`.
|
||||||
|
|
||||||
:param pytest.PytestPluginManager pluginmanager: The pytest plugin manager.
|
:param pluginmanager: The pytest plugin manager.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
This hook is incompatible with hook wrappers.
|
This hook is incompatible with hook wrappers.
|
||||||
|
@ -63,12 +63,15 @@ def pytest_addhooks(pluginmanager: "PytestPluginManager") -> None:
|
||||||
|
|
||||||
@hookspec(historic=True)
|
@hookspec(historic=True)
|
||||||
def pytest_plugin_registered(
|
def pytest_plugin_registered(
|
||||||
plugin: "_PluggyPlugin", manager: "PytestPluginManager"
|
plugin: "_PluggyPlugin",
|
||||||
|
plugin_name: str,
|
||||||
|
manager: "PytestPluginManager",
|
||||||
) -> None:
|
) -> None:
|
||||||
"""A new pytest plugin got registered.
|
"""A new pytest plugin got registered.
|
||||||
|
|
||||||
:param plugin: The plugin module or instance.
|
:param plugin: The plugin module or instance.
|
||||||
:param pytest.PytestPluginManager manager: pytest plugin manager.
|
:param plugin_name: The name by which the plugin is registered.
|
||||||
|
:param manager: The pytest plugin manager.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
This hook is incompatible with hook wrappers.
|
This hook is incompatible with hook wrappers.
|
||||||
|
@ -86,13 +89,13 @@ def pytest_addoption(parser: "Parser", pluginmanager: "PytestPluginManager") ->
|
||||||
files situated at the tests root directory due to how pytest
|
files situated at the tests root directory due to how pytest
|
||||||
:ref:`discovers plugins during startup <pluginorder>`.
|
:ref:`discovers plugins during startup <pluginorder>`.
|
||||||
|
|
||||||
:param pytest.Parser parser:
|
:param parser:
|
||||||
To add command line options, call
|
To add command line options, call
|
||||||
:py:func:`parser.addoption(...) <pytest.Parser.addoption>`.
|
:py:func:`parser.addoption(...) <pytest.Parser.addoption>`.
|
||||||
To add ini-file values call :py:func:`parser.addini(...)
|
To add ini-file values call :py:func:`parser.addini(...)
|
||||||
<pytest.Parser.addini>`.
|
<pytest.Parser.addini>`.
|
||||||
|
|
||||||
:param pytest.PytestPluginManager pluginmanager:
|
:param pluginmanager:
|
||||||
The pytest plugin manager, which can be used to install :py:func:`~pytest.hookspec`'s
|
The pytest plugin manager, which can be used to install :py:func:`~pytest.hookspec`'s
|
||||||
or :py:func:`~pytest.hookimpl`'s and allow one plugin to call another plugin's hooks
|
or :py:func:`~pytest.hookimpl`'s and allow one plugin to call another plugin's hooks
|
||||||
to change how command line options are added.
|
to change how command line options are added.
|
||||||
|
@ -127,7 +130,7 @@ def pytest_configure(config: "Config") -> None:
|
||||||
.. note::
|
.. note::
|
||||||
This hook is incompatible with hook wrappers.
|
This hook is incompatible with hook wrappers.
|
||||||
|
|
||||||
:param pytest.Config config: The pytest config object.
|
:param config: The pytest config object.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@ -156,18 +159,6 @@ def pytest_cmdline_parse(
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
@hookspec(firstresult=True)
|
|
||||||
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.
|
|
||||||
|
|
||||||
Stops at first non-None result, see :ref:`firstresult`.
|
|
||||||
|
|
||||||
:param config: The pytest config object.
|
|
||||||
:returns: The exit code.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
def pytest_load_initial_conftests(
|
def pytest_load_initial_conftests(
|
||||||
early_config: "Config", parser: "Parser", args: List[str]
|
early_config: "Config", parser: "Parser", args: List[str]
|
||||||
) -> None:
|
) -> None:
|
||||||
|
@ -183,6 +174,20 @@ def pytest_load_initial_conftests(
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@hookspec(firstresult=True)
|
||||||
|
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
|
||||||
|
:hook:`pytest_runtestloop`.
|
||||||
|
|
||||||
|
Stops at first non-None result, see :ref:`firstresult`.
|
||||||
|
|
||||||
|
:param config: The pytest config object.
|
||||||
|
:returns: The exit code.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
# collection hooks
|
# collection hooks
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
@ -435,7 +440,7 @@ def pytest_make_parametrize_id(
|
||||||
|
|
||||||
:param config: The pytest config object.
|
:param config: The pytest config object.
|
||||||
:param val: The parametrized value.
|
:param val: The parametrized value.
|
||||||
:param str argname: The automatic parameter name produced by pytest.
|
:param argname: The automatic parameter name produced by pytest.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue