Coverage for pydantic/validate_call_decorator.py: 100.00%
20 statements
« prev ^ index » next coverage.py v7.5.4, created at 2024-07-03 19:29 +0000
« prev ^ index » next coverage.py v7.5.4, created at 2024-07-03 19:29 +0000
1"""Decorator for validating function calls."""
3from __future__ import annotations as _annotations 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl
5import functools 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl
6from typing import TYPE_CHECKING, Any, Callable, TypeVar, overload 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl
8from ._internal import _typing_extra, _validate_call 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl
10__all__ = ('validate_call',) 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl
12if TYPE_CHECKING: 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl
13 from .config import ConfigDict
15 AnyCallableT = TypeVar('AnyCallableT', bound=Callable[..., Any])
18@overload 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl
19def validate_call( 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl
20 *, config: ConfigDict | None = None, validate_return: bool = False 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl
21) -> Callable[[AnyCallableT], AnyCallableT]: ... 1abcduvefghMNijkl
24@overload 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl
25def validate_call(func: AnyCallableT, /) -> AnyCallableT: ... 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl
28def validate_call( 1mnopqrstabcdwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl
29 func: AnyCallableT | None = None,
30 /,
31 *,
32 config: ConfigDict | None = None,
33 validate_return: bool = False,
34) -> AnyCallableT | Callable[[AnyCallableT], AnyCallableT]:
35 """Usage docs: https://docs.pydantic.dev/2.8/concepts/validation_decorator/
37 Returns a decorated wrapper around the function that validates the arguments and, optionally, the return value.
39 Usage may be either as a plain decorator `@validate_call` or with arguments `@validate_call(...)`.
41 Args:
42 func: The function to be decorated.
43 config: The configuration dictionary.
44 validate_return: Whether to validate the return value.
46 Returns:
47 The decorated function.
48 """
49 local_ns = _typing_extra.parent_frame_namespace() 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl
51 def validate(function: AnyCallableT) -> AnyCallableT: 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl
52 if isinstance(function, (classmethod, staticmethod)): 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl
53 name = type(function).__name__ 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl
54 raise TypeError(f'The `@{name}` decorator should be applied after `@validate_call` (put `@{name}` on top)') 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl
56 validate_call_wrapper = _validate_call.ValidateCallWrapper(function, config, validate_return, local_ns) 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl
58 @functools.wraps(function) 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl
59 def wrapper_function(*args, **kwargs): 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl
60 return validate_call_wrapper(*args, **kwargs) 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl
62 wrapper_function.raw_function = function # type: ignore 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl
64 return wrapper_function # type: ignore 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl
66 if func: 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl
67 return validate(func) 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl
68 else:
69 return validate 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl