address #8361 - introduce hook caller wrappers that enable backward compat

This commit is contained in:
Ronny Pfannschmidt 2021-03-18 23:08:03 +01:00
parent 35df3e68d5
commit 30f1b81eb2
3 changed files with 47 additions and 2 deletions

View File

@ -917,8 +917,10 @@ class Config:
:type: PytestPluginManager :type: PytestPluginManager
""" """
from .compat import PathAwareHookProxy
self.trace = self.pluginmanager.trace.root.get("config") self.trace = self.pluginmanager.trace.root.get("config")
self.hook = self.pluginmanager.hook self.hook = PathAwareHookProxy(self.pluginmanager.hook)
self._inicache: Dict[str, Any] = {} self._inicache: Dict[str, Any] = {}
self._override_ini: Sequence[str] = () self._override_ini: Sequence[str] = ()
self._opt2dest: Dict[str, str] = {} self._opt2dest: Dict[str, str] = {}

View File

@ -0,0 +1,41 @@
from typing import TYPE_CHECKING
from _pytest.nodes import _imply_path
if TYPE_CHECKING:
from ..compat import LEGACY_PATH
import functools
# hookname: (Path, LEGACY_PATH)
imply_paths_hooks = {
"pytest_ignore_collect": ("fspath", "path"),
"pytest_collect_file": ("fspath", "path"),
"pytest_pycollect_makemodule": ("fspath", "path"),
"pytest_report_header": ("startpath", "startdir"),
"pytest_report_collectionfinish": ("startpath", "startdir"),
}
class PathAwareHookProxy:
def __init__(self, hook_caller):
self.__hook_caller = hook_caller
def __getattr__(self, key):
if key not in imply_paths_hooks:
return getattr(self.__hook_caller, key)
else:
hook = getattr(self.__hook_caller, key)
path_var, fspath_var = imply_paths_hooks[key]
@functools.wraps(hook)
def fixed_hook(**kw):
path_value = kw.pop(path_var, None)
fspath_value: "LEGACY_PATH" = kw.pop(fspath_var, None)
path_value, fspath_value = _imply_path(path_value, fspath_value)
kw[path_var] = path_value
kw[fspath_var] = fspath_value
return hook(**kw)
return fixed_hook

View File

@ -551,7 +551,9 @@ class Session(nodes.FSCollector):
remove_mods = pm._conftest_plugins.difference(my_conftestmodules) remove_mods = pm._conftest_plugins.difference(my_conftestmodules)
if remove_mods: if remove_mods:
# One or more conftests are not in use at this fspath. # One or more conftests are not in use at this fspath.
proxy = FSHookProxy(pm, remove_mods) from .config.compat import PathAwareHookProxy
proxy = PathAwareHookProxy(FSHookProxy(pm, remove_mods))
else: else:
# All plugins are active for this fspath. # All plugins are active for this fspath.
proxy = self.config.hook proxy = self.config.hook