-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvalidation.py
89 lines (64 loc) · 2.41 KB
/
validation.py
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import re
from abc import ABC
from abc import abstractmethod
class Validatable(ABC):
@abstractmethod
def validate(self, item):
pass
class Validator(ABC):
def __init__(self, *validators):
self.__validators = validators
def validate(self, item):
return all(map(lambda x: x.validate(item), self.__validators))
class TypeValidator(Validatable):
def __init__(self, item_type):
self.__item_type = item_type
def validate(self, item):
if not isinstance(item, self.__item_type):
raise TypeError(f"must be a {self.__item_type.__name__}")
return True
class LengthValidator(Validatable):
def __init__(self, item_len, compare_fct=lambda x, y: x == y):
self.__item_len = item_len
self.__compare_fct = compare_fct
def validate(self, item):
if not self.__compare_fct(len(item), self.__item_len):
raise ValueError(f"length is invalid")
return True
class AlphaValidator(Validatable):
def validate(self, item):
if not str(item).isalpha():
raise ValueError("must be alphabetical")
return True
class UniqueValuesValidator(Validatable):
def __init__(self, nb_unique, case_sensitive=False):
self.__nb_unique = nb_unique
self.__case_sensitive = case_sensitive
def validate(self, item):
if not self.__case_sensitive:
item = str(item).lower()
if len(set(item)) != self.__nb_unique:
raise ValueError(f"must composed of {self.__nb_unique} unique values")
return True
class RegexValidator(Validatable):
def __init__(self, regex):
self.__regex = re.compile(regex)
def validate(self, item):
if not self.__regex.match(item):
raise ValueError(f"must match with regex {self.__regex}")
return True
class RangeValidator(Validatable):
def __init__(self, min_range, max_range, inclusive=True):
self.__min_range = min_range
self.__max_range = max_range
self.__inclusive = inclusive
def validate(self, item):
if self.__inclusive:
valid_range = self.__min_range <= item <= self.__max_range
else:
valid_range = self.__min_range < item < self.__max_range
if not valid_range:
raise ValueError(f"must be between {self.__min_range} and {self.__max_range}")
return True
if __name__ == "__main__":
pass