Merge pull request #12227 from bluetech/deprecate-legacy-path-impls
hookspec: deprecate hookimpls requesting py.path parameters
This commit is contained in:
commit
3617ef1c79
|
@ -34,7 +34,7 @@ repos:
|
||||||
additional_dependencies:
|
additional_dependencies:
|
||||||
- iniconfig>=1.1.0
|
- iniconfig>=1.1.0
|
||||||
- attrs>=19.2.0
|
- attrs>=19.2.0
|
||||||
- pluggy>=1.4.0
|
- pluggy>=1.5.0
|
||||||
- packaging
|
- packaging
|
||||||
- tomli
|
- tomli
|
||||||
- types-pkg_resources
|
- types-pkg_resources
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
A deprecation warning is now raised when implementations of one of the following hooks request a deprecated ``py.path.local`` parameter instead of the ``pathlib.Path`` parameter which replaced it:
|
||||||
|
|
||||||
|
- :hook:`pytest_ignore_collect` - the ``path`` parameter - use ``collection_path`` instead.
|
||||||
|
- :hook:`pytest_collect_file` - the ``path`` parameter - use ``file_path`` instead.
|
||||||
|
- :hook:`pytest_pycollect_makemodule` - the ``path`` parameter - use ``module_path`` instead.
|
||||||
|
- :hook:`pytest_report_header` - the ``startdir`` parameter - use ``start_path`` instead.
|
||||||
|
- :hook:`pytest_report_collectionfinish` - the ``startdir`` parameter - use ``start_path`` instead.
|
||||||
|
|
||||||
|
The replacement parameters are available since pytest 7.0.0.
|
||||||
|
The old parameters will be removed in pytest 9.0.0.
|
||||||
|
|
||||||
|
See :ref:`legacy-path-hooks-deprecated` for more details.
|
|
@ -0,0 +1 @@
|
||||||
|
``pluggy>=1.5.0`` is now required.
|
|
@ -1,5 +1,5 @@
|
||||||
pallets-sphinx-themes
|
pallets-sphinx-themes
|
||||||
pluggy>=1.2.0
|
pluggy>=1.5.0
|
||||||
pygments-pytest>=2.3.0
|
pygments-pytest>=2.3.0
|
||||||
sphinx-removed-in>=0.2.0
|
sphinx-removed-in>=0.2.0
|
||||||
sphinx>=7
|
sphinx>=7
|
||||||
|
|
|
@ -43,7 +43,7 @@ dependencies = [
|
||||||
'exceptiongroup>=1.0.0rc8; python_version < "3.11"',
|
'exceptiongroup>=1.0.0rc8; python_version < "3.11"',
|
||||||
"iniconfig",
|
"iniconfig",
|
||||||
"packaging",
|
"packaging",
|
||||||
"pluggy<2.0,>=1.4",
|
"pluggy<2.0,>=1.5",
|
||||||
'tomli>=1; python_version < "3.11"',
|
'tomli>=1; python_version < "3.11"',
|
||||||
]
|
]
|
||||||
[project.optional-dependencies]
|
[project.optional-dependencies]
|
||||||
|
|
|
@ -15,6 +15,8 @@ from typing import Union
|
||||||
|
|
||||||
from pluggy import HookspecMarker
|
from pluggy import HookspecMarker
|
||||||
|
|
||||||
|
from .deprecated import HOOK_LEGACY_PATH_ARG
|
||||||
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
import pdb
|
import pdb
|
||||||
|
@ -297,7 +299,14 @@ def pytest_collection_finish(session: "Session") -> None:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
@hookspec(firstresult=True)
|
@hookspec(
|
||||||
|
firstresult=True,
|
||||||
|
warn_on_impl_args={
|
||||||
|
"path": HOOK_LEGACY_PATH_ARG.format(
|
||||||
|
pylib_path_arg="path", pathlib_path_arg="collection_path"
|
||||||
|
),
|
||||||
|
},
|
||||||
|
)
|
||||||
def pytest_ignore_collect(
|
def pytest_ignore_collect(
|
||||||
collection_path: Path, path: "LEGACY_PATH", config: "Config"
|
collection_path: Path, path: "LEGACY_PATH", config: "Config"
|
||||||
) -> Optional[bool]:
|
) -> Optional[bool]:
|
||||||
|
@ -356,6 +365,13 @@ def pytest_collect_directory(path: Path, parent: "Collector") -> "Optional[Colle
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@hookspec(
|
||||||
|
warn_on_impl_args={
|
||||||
|
"path": HOOK_LEGACY_PATH_ARG.format(
|
||||||
|
pylib_path_arg="path", pathlib_path_arg="file_path"
|
||||||
|
),
|
||||||
|
},
|
||||||
|
)
|
||||||
def pytest_collect_file(
|
def pytest_collect_file(
|
||||||
file_path: Path, path: "LEGACY_PATH", parent: "Collector"
|
file_path: Path, path: "LEGACY_PATH", parent: "Collector"
|
||||||
) -> "Optional[Collector]":
|
) -> "Optional[Collector]":
|
||||||
|
@ -468,7 +484,14 @@ def pytest_make_collect_report(collector: "Collector") -> "Optional[CollectRepor
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
@hookspec(firstresult=True)
|
@hookspec(
|
||||||
|
firstresult=True,
|
||||||
|
warn_on_impl_args={
|
||||||
|
"path": HOOK_LEGACY_PATH_ARG.format(
|
||||||
|
pylib_path_arg="path", pathlib_path_arg="module_path"
|
||||||
|
),
|
||||||
|
},
|
||||||
|
)
|
||||||
def pytest_pycollect_makemodule(
|
def pytest_pycollect_makemodule(
|
||||||
module_path: Path, path: "LEGACY_PATH", parent
|
module_path: Path, path: "LEGACY_PATH", parent
|
||||||
) -> Optional["Module"]:
|
) -> Optional["Module"]:
|
||||||
|
@ -994,6 +1017,13 @@ def pytest_assertion_pass(item: "Item", lineno: int, orig: str, expl: str) -> No
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
@hookspec(
|
||||||
|
warn_on_impl_args={
|
||||||
|
"startdir": HOOK_LEGACY_PATH_ARG.format(
|
||||||
|
pylib_path_arg="startdir", pathlib_path_arg="start_path"
|
||||||
|
),
|
||||||
|
},
|
||||||
|
)
|
||||||
def pytest_report_header( # type:ignore[empty-body]
|
def pytest_report_header( # type:ignore[empty-body]
|
||||||
config: "Config", start_path: Path, startdir: "LEGACY_PATH"
|
config: "Config", start_path: Path, startdir: "LEGACY_PATH"
|
||||||
) -> Union[str, List[str]]:
|
) -> Union[str, List[str]]:
|
||||||
|
@ -1022,6 +1052,13 @@ def pytest_report_header( # type:ignore[empty-body]
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@hookspec(
|
||||||
|
warn_on_impl_args={
|
||||||
|
"startdir": HOOK_LEGACY_PATH_ARG.format(
|
||||||
|
pylib_path_arg="startdir", pathlib_path_arg="start_path"
|
||||||
|
),
|
||||||
|
},
|
||||||
|
)
|
||||||
def pytest_report_collectionfinish( # type:ignore[empty-body]
|
def pytest_report_collectionfinish( # type:ignore[empty-body]
|
||||||
config: "Config",
|
config: "Config",
|
||||||
start_path: Path,
|
start_path: Path,
|
||||||
|
|
|
@ -121,6 +121,32 @@ def test_hookproxy_warnings_for_pathlib(tmp_path, hooktype, request):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_hookimpl_warnings_for_pathlib() -> None:
|
||||||
|
class Plugin:
|
||||||
|
def pytest_ignore_collect(self, path: object) -> None:
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def pytest_collect_file(self, path: object) -> None:
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def pytest_pycollect_makemodule(self, path: object) -> None:
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def pytest_report_header(self, startdir: object) -> str:
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def pytest_report_collectionfinish(self, startdir: object) -> str:
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
pm = pytest.PytestPluginManager()
|
||||||
|
with pytest.warns(
|
||||||
|
pytest.PytestRemovedIn9Warning,
|
||||||
|
match=r"py\.path\.local.* argument is deprecated",
|
||||||
|
) as wc:
|
||||||
|
pm.register(Plugin())
|
||||||
|
assert len(wc.list) == 5
|
||||||
|
|
||||||
|
|
||||||
def test_node_ctor_fspath_argument_is_deprecated(pytester: Pytester) -> None:
|
def test_node_ctor_fspath_argument_is_deprecated(pytester: Pytester) -> None:
|
||||||
mod = pytester.getmodulecol("")
|
mod = pytester.getmodulecol("")
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue