Skip to content

Commit

Permalink
proposed fix for issue pytest-dev#358
Browse files Browse the repository at this point in the history
  • Loading branch information
eachimei committed Aug 3, 2022
1 parent 70fde45 commit 51e8df2
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 2 deletions.
22 changes: 20 additions & 2 deletions src/pluggy/_hooks.py
Expand Up @@ -245,11 +245,29 @@ def varnames(func: object) -> Tuple[Tuple[str, ...], Tuple[str, ...]]:
return (), ()

try: # func MUST be a function or method here or we won't parse any args
spec = inspect.getfullargspec(func)
sig = inspect.signature(func.__func__ if inspect.ismethod(func) else func)
except TypeError:
return (), ()

args, defaults = tuple(spec.args), spec.defaults
_valid_param_kinds = (
inspect.Parameter.POSITIONAL_ONLY,
inspect.Parameter.POSITIONAL_OR_KEYWORD,
)
_valid_params = {
name: param
for name, param in sig.parameters.items()
if param.kind in _valid_param_kinds
}
args = tuple(_valid_params)
defaults = (
tuple(
param.default
for param in _valid_params.values()
if param.default is not param.empty
)
or None
)

if defaults:
index = -len(defaults)
args, kwargs = args[:index], tuple(args[index:])
Expand Down
16 changes: 16 additions & 0 deletions testing/test_helpers.py
@@ -1,3 +1,5 @@
from functools import wraps
from typing import Callable
from pluggy._hooks import varnames
from pluggy._manager import _formatdef

Expand Down Expand Up @@ -82,3 +84,17 @@ def function4(arg1, *args, **kwargs):
pass

assert _formatdef(function4) == "function4(arg1, *args, **kwargs)"


def test_varnames_decorator() -> None:
def my_decorator(func: Callable) -> Callable:
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper

@my_decorator
def example(a, b=123) -> None:
pass

assert varnames(example) == (("a",), ("b",))

0 comments on commit 51e8df2

Please sign in to comment.