-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvalidators.py
More file actions
39 lines (33 loc) · 1.14 KB
/
Copy pathvalidators.py
File metadata and controls
39 lines (33 loc) · 1.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import functools
import logging
logger = logging.getLogger('python-utils-61')
class ValidationRegistry:
_validators = {}
@classmethod
def register(cls, func):
cls._validators[func.__name__] = func
return func
def robust_validate(default_fallback=False):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except (ValueError, TypeError, AttributeError) as e:
logger.warning(f"Validation edge case in {func.__name__}: {e}")
return default_fallback
except Exception as e:
logger.error(f"Unexpected corruption in {func.__name__}: {type(e).__name__}")
raise
return wrapper
return decorator
@ValidationRegistry.register
@robust_validate(default_fallback=False)
def validate_non_empty_string(value):
if not isinstance(value, str):
raise TypeError("Expected string input")
return len(value.strip()) > 0
@ValidationRegistry.register
@robust_validate(default_fallback=0)
def safe_cast_int(value):
return int(value)