1
1
import sys
2
+ import re
2
3
from abc import ABCMeta , abstractmethod
3
4
from pyvalid import accepts
4
- from collections import Iterable , Container , Callable
5
+ from collections import Iterable , Container , Callable , Sized
5
6
from six import with_metaclass
6
7
7
8
@@ -26,30 +27,24 @@ class AbstractValidator(with_metaclass(ABCMeta, Validator)):
26
27
def checkers (self ):
27
28
raise NotImplementedError
28
29
29
- @property
30
- @abstractmethod
31
- def settings (self ):
32
- raise NotImplementedError
33
-
34
- @settings .setter
35
- @abstractmethod
36
- def settings (self , value ):
37
- raise NotImplementedError
38
-
39
30
@abstractmethod
40
31
def __call__ (self , val ):
41
32
raise NotImplementedError
42
33
43
34
def __init__ (self ):
44
- for key , val in list (self .settings .items ()):
45
- if (key not in self .checkers ) or (val is None ):
46
- del self .settings [key ]
35
+ Validator .__init__ (self , self )
36
+ for checker_func , checker_args in list (self .checkers .items ()):
37
+ try :
38
+ to_del = checker_args [0 ] is None
39
+ except :
40
+ to_del = True
41
+ if to_del :
42
+ del self .checkers [checker_func ]
47
43
48
44
def _check (self , val ):
49
45
valid = True
50
- for checker_name , checker_arg in self .settings .items ():
51
- checker = self .checkers [checker_name ]
52
- valid = checker (val , checker_arg )
46
+ for checker_func , checker_args in self .checkers .items ():
47
+ valid = checker_func (val , * checker_args )
53
48
if not valid :
54
49
break
55
50
return valid
@@ -85,14 +80,6 @@ def in_range_checker(cls, val, in_range):
85
80
def not_in_range_checker (cls , val , not_in_range ):
86
81
return not cls .in_range_checker (val , not_in_range )
87
82
88
- @property
89
- def settings (self ):
90
- return self .__settings
91
-
92
- @settings .setter
93
- def settings (self , value ):
94
- self .__settings = value
95
-
96
83
@property
97
84
def checkers (self ):
98
85
return self .__checkers
@@ -102,12 +89,13 @@ def checkers(self):
102
89
in_range = [Iterable , Container ], not_in_range = [Iterable , Container ]
103
90
)
104
91
def __init__ (self , ** kwargs ):
105
- self .__settings = kwargs
106
92
self .__checkers = {
107
- 'min_val' : NumberValidator .min_val_checker ,
108
- 'max_val' : NumberValidator .max_val_checker ,
109
- 'in_range' : NumberValidator .in_range_checker ,
110
- 'not_in_range' : NumberValidator .not_in_range_checker
93
+ NumberValidator .min_val_checker : [kwargs .get ('min_val' , None )],
94
+ NumberValidator .max_val_checker : [kwargs .get ('max_val' , None )],
95
+ NumberValidator .in_range_checker : [kwargs .get ('in_range' , None )],
96
+ NumberValidator .not_in_range_checker : [
97
+ kwargs .get ('not_in_range' , None )
98
+ ]
111
99
}
112
100
AbstractValidator .__init__ (self )
113
101
@@ -143,29 +131,35 @@ def in_range_checker(cls, val, in_range):
143
131
def not_in_range_checker (cls , val , not_in_range ):
144
132
return not cls .in_range_checker (val , not_in_range )
145
133
146
- @property
147
- def settings (self ):
148
- return self .__settings
149
-
150
- @settings .setter
151
- def settings (self , value ):
152
- self .__settings = value
134
+ @classmethod
135
+ def re_checker (cls , val , pattern , flags = 0 ):
136
+ try :
137
+ match_obj = re .match (pattern , val , flags )
138
+ is_valid = match_obj is not None
139
+ except re .error :
140
+ is_valid = False
141
+ return is_valid
153
142
154
143
@property
155
144
def checkers (self ):
156
145
return self .__checkers
157
146
158
147
@accepts (
159
148
object , min_len = int , max_len = int ,
160
- in_range = [Iterable , Container ], not_in_range = [Iterable , Container ]
149
+ in_range = [Iterable , Container ], not_in_range = [Iterable , Container ],
150
+ re_pattern = str , re_flags = int
161
151
)
162
152
def __init__ (self , ** kwargs ):
163
- self .__settings = kwargs
164
153
self .__checkers = {
165
- 'min_len' : StringValidator .min_len_checker ,
166
- 'max_len' : StringValidator .max_len_checker ,
167
- 'in_range' : StringValidator .in_range_checker ,
168
- 'not_in_range' : StringValidator .not_in_range_checker
154
+ StringValidator .min_len_checker : [kwargs .get ('min_len' , None )],
155
+ StringValidator .max_len_checker : [kwargs .get ('max_len' , None )],
156
+ StringValidator .in_range_checker : [kwargs .get ('in_range' , None )],
157
+ StringValidator .not_in_range_checker : [
158
+ kwargs .get ('not_in_range' , None )
159
+ ],
160
+ StringValidator .re_checker : [
161
+ kwargs .get ('re_pattern' , None ), kwargs .get ('re_flags' , 0 )
162
+ ]
169
163
}
170
164
AbstractValidator .__init__ (self )
171
165
0 commit comments