1- """
2- Utils.py
3- --------
4- """
1+ """Utils."""
52# -*- coding: utf-8 -*-
63
74# standard
118
129
1310class ValidationFailure (Exception ):
14- """
15- Exception class when validation failure occurs
16- """
11+ """Exception class when validation failure occurs."""
1712
1813 def __init__ (self , function : Callable [..., Any ], arg_dict : Dict [str , Any ]):
14+ """Initialize Validation Failure."""
1915 self .func = function
2016 self .__dict__ .update (arg_dict )
2117
2218 def __repr__ (self ) -> str :
19+ """Repr Validation Failure."""
2320 return (
2421 f"ValidationFailure(func={ self .func .__name__ } , "
2522 + f"args={ ({k : v for (k , v ) in self .__dict__ .items () if k != 'func' })} )"
2623 )
2724
2825 def __str__ (self ) -> str :
26+ """Str Validation Failure."""
2927 return repr (self )
3028
3129 def __bool__ (self ) -> Literal [False ]:
30+ """Bool Validation Failure."""
3231 return False
3332
3433
3534def _func_args_as_dict (func : Callable [..., Any ], * args : Any , ** kwargs : Any ) -> Dict [str , Any ]:
36- """
37- Return given function's positional and key value arguments as an ordered
38- dictionary.
39-
40- :param func: function to decorate
41- :param args: positional function arguments
42- :param kwargs: key value function arguments
43- """
44-
35+ """Return function's positional and key value arguments as an ordered dictionary."""
4536 # TODO: find more efficient way to do it
4637 return dict (
4738 list (zip (dict .fromkeys (chain (getfullargspec (func )[0 ], kwargs .keys ())), args ))
@@ -50,8 +41,7 @@ def _func_args_as_dict(func: Callable[..., Any], *args: Any, **kwargs: Any) -> D
5041
5142
5243def validator (func : Callable [..., Any ]) -> Callable [..., Union [Literal [True ], ValidationFailure ]]:
53- """
54- A decorator that makes given function validator.
44+ """A decorator that makes given function validator.
5545
5646 Whenever the given function is called and returns ``False`` value
5747 this decorator returns :class:`ValidationFailure` object.
@@ -63,14 +53,16 @@ def validator(func: Callable[..., Any]) -> Callable[..., Union[Literal[True], Va
6353 ... return not (value % 2)
6454
6555 >>> even(4)
66- True
56+ # Output: True
6757
6858 >>> even(5)
69- ValidationFailure(func=even, args={'value': 5})
59+ # Output: ValidationFailure(func=even, args={'value': 5})
60+
61+ Args:
62+ `func`: function which is to be decorated.
7063
71- :param func: function to decorate
72- :param args: positional function arguments
73- :param kwargs: key value function arguments
64+ Returns:
65+ Wrapper function as a decorator.
7466 """
7567
7668 def wrapper (* args : Any , ** kwargs : Any ) -> Union [Literal [True ], ValidationFailure ]:
@@ -79,5 +71,15 @@ def wrapper(*args: Any, **kwargs: Any) -> Union[Literal[True], ValidationFailure
7971 if func (* args , ** kwargs )
8072 else ValidationFailure (func , _func_args_as_dict (func , * args , ** kwargs ))
8173 )
74+ # try:
75+ # return (
76+ # True
77+ # if func(*args, **kwargs)
78+ # else ValidationFailure(func, _func_args_as_dict(func, *args, **kwargs))
79+ # )
80+ # except (AssertionError, TypeError) as err:
81+ # print(err)
82+ # finally:
83+ # return ValidationFailure(func, _func_args_as_dict(func, *args, **kwargs))
8284
8385 return wrapper
0 commit comments