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

1"""Decorator for validating function calls.""" 

2 

3from __future__ import annotations as _annotations 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl

4 

5import functools 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl

6from typing import TYPE_CHECKING, Any, Callable, TypeVar, overload 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl

7 

8from ._internal import _typing_extra, _validate_call 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl

9 

10__all__ = ('validate_call',) 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl

11 

12if TYPE_CHECKING: 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl

13 from .config import ConfigDict 

14 

15 AnyCallableT = TypeVar('AnyCallableT', bound=Callable[..., Any]) 

16 

17 

18@overload 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl

19def validate_call( 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl

20 *, config: ConfigDict | None = None, validate_return: bool = False 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl

21) -> Callable[[AnyCallableT], AnyCallableT]: ... 1abcduvefghMNijkl

22 

23 

24@overload 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl

25def validate_call(func: AnyCallableT, /) -> AnyCallableT: ... 1mnopqrstabcduvwxyzABCDefghOPQRSTUVMNEFGHIJKLijkl

26 

27 

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/ 

36 

37 Returns a decorated wrapper around the function that validates the arguments and, optionally, the return value. 

38 

39 Usage may be either as a plain decorator `@validate_call` or with arguments `@validate_call(...)`. 

40 

41 Args: 

42 func: The function to be decorated. 

43 config: The configuration dictionary. 

44 validate_return: Whether to validate the return value. 

45 

46 Returns: 

47 The decorated function. 

48 """ 

49 local_ns = _typing_extra.parent_frame_namespace() 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl

50 

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

55 

56 validate_call_wrapper = _validate_call.ValidateCallWrapper(function, config, validate_return, local_ns) 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl

57 

58 @functools.wraps(function) 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl

59 def wrapper_function(*args, **kwargs): 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl

60 return validate_call_wrapper(*args, **kwargs) 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl

61 

62 wrapper_function.raw_function = function # type: ignore 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl

63 

64 return wrapper_function # type: ignore 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl

65 

66 if func: 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl

67 return validate(func) 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl

68 else: 

69 return validate 1mnopqrstabcduvwxyzABCDefghEFGHIJKLijkl