Skip to content

Commit

Permalink
address pytest-dev#8361 - introduce hook caller wrappers that enable …
Browse files Browse the repository at this point in the history
…backward compat
  • Loading branch information
RonnyPfannschmidt committed Mar 18, 2021
1 parent 35df3e6 commit 30f1b81
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 2 deletions.
4 changes: 3 additions & 1 deletion src/_pytest/config/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -917,8 +917,10 @@ def __init__(
:type: PytestPluginManager
"""

from .compat import PathAwareHookProxy

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._override_ini: Sequence[str] = ()
self._opt2dest: Dict[str, str] = {}
Expand Down
41 changes: 41 additions & 0 deletions src/_pytest/config/compat.py
Original file line number Diff line number Diff line change
@@ -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
4 changes: 3 additions & 1 deletion src/_pytest/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -551,7 +551,9 @@ def gethookproxy(self, fspath: "os.PathLike[str]"):
remove_mods = pm._conftest_plugins.difference(my_conftestmodules)
if remove_mods:
# 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:
# All plugins are active for this fspath.
proxy = self.config.hook
Expand Down

0 comments on commit 30f1b81

Please sign in to comment.