DefStream 0.1.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- DefStream/Broker/Configuration.py +18 -0
- DefStream/Broker/Connection.py +97 -0
- DefStream/Broker/Consumer.py +59 -0
- DefStream/Broker/Errors.py +14 -0
- DefStream/Broker/Event.py +35 -0
- DefStream/Broker/Implements/__init__.py +1 -0
- DefStream/Broker/Policies.py +25 -0
- DefStream/Broker/Protocol.py +45 -0
- DefStream/Broker/__init__.py +47 -0
- DefStream/Descriptor/DataObject.py +384 -0
- DefStream/Descriptor/Types.py +229 -0
- DefStream/Descriptor/Value.py +132 -0
- DefStream/Descriptor/__init__.py +172 -0
- DefStream/Inspector/Extension.py +69 -0
- DefStream/Inspector/Extensions/Console.html +373 -0
- DefStream/Inspector/Extensions/Console.py +396 -0
- DefStream/Inspector/Extensions/Dashboard.html +206 -0
- DefStream/Inspector/Extensions/Dashboard.py +114 -0
- DefStream/Inspector/Extensions/HealthCheck.py +92 -0
- DefStream/Inspector/Extensions/Metrics.py +281 -0
- DefStream/Inspector/Extensions/Specifications.py +160 -0
- DefStream/Inspector/Extensions/__init__.py +13 -0
- DefStream/Inspector/Inspector.py +216 -0
- DefStream/Inspector/Response.py +14 -0
- DefStream/Inspector/__init__.py +9 -0
- DefStream/Validator/Pattern.py +36 -0
- DefStream/Validator/Patterns/Array.py +30 -0
- DefStream/Validator/Patterns/Common.py +93 -0
- DefStream/Validator/Patterns/Compare.py +180 -0
- DefStream/Validator/Patterns/Condition.py +60 -0
- DefStream/Validator/Patterns/DataObject.py +85 -0
- DefStream/Validator/Patterns/DateTime.py +111 -0
- DefStream/Validator/Patterns/Number.py +43 -0
- DefStream/Validator/Patterns/Object.py +150 -0
- DefStream/Validator/Patterns/Size.py +110 -0
- DefStream/Validator/Patterns/String.py +85 -0
- DefStream/Validator/Patterns/Type.py +350 -0
- DefStream/Validator/Patterns/__init__.py +137 -0
- DefStream/Validator/Validate.py +29 -0
- DefStream/Validator/Validator.py +30 -0
- DefStream/Validator/__init__.py +11 -0
- DefStream/Worker/Executor.py +298 -0
- DefStream/Worker/Message.py +103 -0
- DefStream/Worker/Pool.py +203 -0
- DefStream/Worker/Run.py +187 -0
- DefStream/Worker/Specification.py +91 -0
- DefStream/Worker/Worker.py +321 -0
- DefStream/Worker/__init__.py +49 -0
- DefStream/__init__.py +0 -0
- defstream-0.1.2.dist-info/METADATA +1197 -0
- defstream-0.1.2.dist-info/RECORD +54 -0
- defstream-0.1.2.dist-info/WHEEL +5 -0
- defstream-0.1.2.dist-info/licenses/LICENSE +674 -0
- defstream-0.1.2.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from ..Pattern import Pattern
|
|
4
|
+
from ..Validator import Validator
|
|
5
|
+
|
|
6
|
+
from dataclasses import is_dataclass
|
|
7
|
+
|
|
8
|
+
from typing import Dict, Union, Sequence
|
|
9
|
+
|
|
10
|
+
__all__ = (
|
|
11
|
+
'IsRequiredIn',
|
|
12
|
+
'IsMappingOf',
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class IsRequiredIn(Pattern):
|
|
17
|
+
def __init__(self, *args, error=None):
|
|
18
|
+
self.args = args
|
|
19
|
+
self.error = error
|
|
20
|
+
return
|
|
21
|
+
|
|
22
|
+
def __call__(self, parameter: object) -> object:
|
|
23
|
+
if not is_dataclass(parameter.__class__):
|
|
24
|
+
if self.error:
|
|
25
|
+
raise self.error
|
|
26
|
+
raise TypeError('{} must be dataclass'.format(parameter))
|
|
27
|
+
for arg in self.args:
|
|
28
|
+
if not hasattr(parameter, arg):
|
|
29
|
+
if self.error:
|
|
30
|
+
raise self.error
|
|
31
|
+
raise ValueError('{} is required in {}'.format(arg, parameter))
|
|
32
|
+
return parameter
|
|
33
|
+
|
|
34
|
+
def __repr__(self) -> str:
|
|
35
|
+
return '{}({})'.format(
|
|
36
|
+
self.__class__.__name__,
|
|
37
|
+
', '.join(
|
|
38
|
+
[repr(p) for p in self.args]
|
|
39
|
+
)
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class IsMappingOf(Pattern):
|
|
44
|
+
def __init__(
|
|
45
|
+
self,
|
|
46
|
+
mappings: Dict[str, Union[Validator, Pattern, Sequence[Pattern]]] = {},
|
|
47
|
+
error: BaseException = None
|
|
48
|
+
):
|
|
49
|
+
self.mappings = self.__mapper__(mappings)
|
|
50
|
+
self.error = error
|
|
51
|
+
return
|
|
52
|
+
|
|
53
|
+
def __call__(self, parameter: object) -> object:
|
|
54
|
+
if not is_dataclass(parameter.__class__):
|
|
55
|
+
if self.error:
|
|
56
|
+
raise self.error
|
|
57
|
+
raise TypeError('{} must be dataclass'.format(parameter))
|
|
58
|
+
if self.mappings:
|
|
59
|
+
for key, validator in self.mappings.items():
|
|
60
|
+
setattr(parameter, key, validator(getattr(parameter, key) if hasattr(parameter, key) else None))
|
|
61
|
+
return parameter
|
|
62
|
+
|
|
63
|
+
def __mapper__(self, mappings: Dict[str, Validator]) -> Dict[str, Validator]:
|
|
64
|
+
if not isinstance(mappings, dict):
|
|
65
|
+
raise TypeError('{} must be dict'.format(mappings))
|
|
66
|
+
for key, value in mappings.items():
|
|
67
|
+
if isinstance(value, Sequence):
|
|
68
|
+
mappings[key] = Validator(*value)
|
|
69
|
+
continue
|
|
70
|
+
if isinstance(value, Pattern):
|
|
71
|
+
mappings[key] = Validator(value)
|
|
72
|
+
continue
|
|
73
|
+
if isinstance(value, Validator):
|
|
74
|
+
mappings[key] = value
|
|
75
|
+
continue
|
|
76
|
+
raise ValueError('Invalid mapping table, {} must be dictionary or listable of Patterns, or callable based Pattern'.format(value))
|
|
77
|
+
return mappings
|
|
78
|
+
|
|
79
|
+
def __repr__(self) -> str:
|
|
80
|
+
return '{}({})'.format(
|
|
81
|
+
self.__class__.__name__,
|
|
82
|
+
', '.join(
|
|
83
|
+
['{}: {}'.format(k, repr(v)) for k, v in self.mappings.items()]
|
|
84
|
+
)
|
|
85
|
+
)
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from ..Pattern import Pattern
|
|
4
|
+
|
|
5
|
+
from datetime import datetime, date, time
|
|
6
|
+
|
|
7
|
+
__all__ = (
|
|
8
|
+
'IsDateTime',
|
|
9
|
+
'IsDate',
|
|
10
|
+
'IsTime',
|
|
11
|
+
'ToDateTime',
|
|
12
|
+
'ToDate',
|
|
13
|
+
'ToTime',
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class IsDateTime(Pattern):
|
|
18
|
+
def __init__(self, *args, error=None):
|
|
19
|
+
self.patterns = args
|
|
20
|
+
self.error = error
|
|
21
|
+
return
|
|
22
|
+
|
|
23
|
+
def __call__(self, parameter):
|
|
24
|
+
if not isinstance(parameter, datetime):
|
|
25
|
+
if self.error:
|
|
26
|
+
raise self.error
|
|
27
|
+
raise TypeError('{} must be datetime'.format(parameter))
|
|
28
|
+
for pattern in self.patterns:
|
|
29
|
+
parameter = pattern(parameter)
|
|
30
|
+
return parameter
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class IsDate(Pattern):
|
|
34
|
+
def __init__(self, *args, error=None):
|
|
35
|
+
self.patterns = args
|
|
36
|
+
self.error = error
|
|
37
|
+
return
|
|
38
|
+
|
|
39
|
+
def __call__(self, parameter):
|
|
40
|
+
if not isinstance(parameter, date):
|
|
41
|
+
if self.error:
|
|
42
|
+
raise self.error
|
|
43
|
+
raise TypeError('{} must be date'.format(parameter))
|
|
44
|
+
for pattern in self.patterns:
|
|
45
|
+
parameter = pattern(parameter)
|
|
46
|
+
return parameter
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class IsTime(Pattern):
|
|
50
|
+
def __init__(self, *args, error=None):
|
|
51
|
+
self.patterns = args
|
|
52
|
+
self.error = error
|
|
53
|
+
return
|
|
54
|
+
|
|
55
|
+
def __call__(self, parameter):
|
|
56
|
+
if not isinstance(parameter, time):
|
|
57
|
+
if self.error:
|
|
58
|
+
raise self.error
|
|
59
|
+
raise TypeError('{} must be time'.format(parameter))
|
|
60
|
+
for pattern in self.patterns:
|
|
61
|
+
parameter = pattern(parameter)
|
|
62
|
+
return parameter
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class ToDateTime(Pattern):
|
|
66
|
+
def __init__(self, isoformat=True, error=None):
|
|
67
|
+
self.isoformat = isoformat
|
|
68
|
+
self.error = error
|
|
69
|
+
return
|
|
70
|
+
def __call__(self, parameter):
|
|
71
|
+
try:
|
|
72
|
+
if self.isoformat:
|
|
73
|
+
return datetime.fromisoformat(parameter)
|
|
74
|
+
return datetime.strptime(parameter, '%Y-%m-%d %H:%M:%S')
|
|
75
|
+
except:
|
|
76
|
+
if self.error:
|
|
77
|
+
raise self.error
|
|
78
|
+
raise ValueError('{} is not datetime'.format(parameter))
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class ToDate(Pattern):
|
|
82
|
+
def __init__(self, isoformat=True, error=None):
|
|
83
|
+
self.isoformat = isoformat
|
|
84
|
+
self.error = error
|
|
85
|
+
return
|
|
86
|
+
|
|
87
|
+
def __call__(self, parameter):
|
|
88
|
+
try:
|
|
89
|
+
if self.isoformat:
|
|
90
|
+
return date.fromisoformat(parameter)
|
|
91
|
+
return datetime.strptime(parameter, '%Y-%m-%d').date()
|
|
92
|
+
except:
|
|
93
|
+
if self.error:
|
|
94
|
+
raise self.error
|
|
95
|
+
raise ValueError('{} is not date'.format(parameter))
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class ToTime(Pattern):
|
|
99
|
+
def __init__(self, isoformat=True, error=None):
|
|
100
|
+
self.isoformat = isoformat
|
|
101
|
+
self.error = error
|
|
102
|
+
return
|
|
103
|
+
def __call__(self, parameter):
|
|
104
|
+
try:
|
|
105
|
+
if self.isoformat:
|
|
106
|
+
return time.fromisoformat(parameter)
|
|
107
|
+
return datetime.strptime(parameter, '%H:%M:%S').time()
|
|
108
|
+
except:
|
|
109
|
+
if self.error:
|
|
110
|
+
raise self.error
|
|
111
|
+
raise ValueError('{} is not time'.format(parameter))
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from ..Pattern import Pattern
|
|
4
|
+
|
|
5
|
+
__all__ = (
|
|
6
|
+
'IsRange',
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class IsRange(Pattern):
|
|
11
|
+
def __init__(self, start, stop=None, step=None, error=None):
|
|
12
|
+
self.range = [start]
|
|
13
|
+
if stop:
|
|
14
|
+
self.range.append(stop)
|
|
15
|
+
if step:
|
|
16
|
+
self.range.append(step)
|
|
17
|
+
self.start = start
|
|
18
|
+
self.stop = stop
|
|
19
|
+
self.step = step
|
|
20
|
+
self.error = error
|
|
21
|
+
return
|
|
22
|
+
|
|
23
|
+
def __call__(self, parameter):
|
|
24
|
+
if parameter not in [v for v in range(*self.range)]:
|
|
25
|
+
if self.error:
|
|
26
|
+
raise self.error
|
|
27
|
+
raise ValueError('{} must be in the range {}'.format(
|
|
28
|
+
parameter,
|
|
29
|
+
'between {} to {}{}'.format(
|
|
30
|
+
self.start if self.stop else 0,
|
|
31
|
+
self.stop if self.stop else self.start,
|
|
32
|
+
', in increments of {}'.format(self.step) if self.step else ''
|
|
33
|
+
),
|
|
34
|
+
))
|
|
35
|
+
return parameter
|
|
36
|
+
|
|
37
|
+
def __repr__(self):
|
|
38
|
+
return '{}(start={}, stop={}, step={})'.format(
|
|
39
|
+
self.__class__.__name__,
|
|
40
|
+
self.start,
|
|
41
|
+
self.stop,
|
|
42
|
+
self.step,
|
|
43
|
+
)
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from ..Pattern import Pattern
|
|
4
|
+
from ..Validator import Validator
|
|
5
|
+
|
|
6
|
+
from collections.abc import Mapping
|
|
7
|
+
|
|
8
|
+
from typing import Dict, Union, Sequence
|
|
9
|
+
|
|
10
|
+
__all__ = (
|
|
11
|
+
'IsRequiredIn',
|
|
12
|
+
'IsMappingOf',
|
|
13
|
+
'IsKeyOf',
|
|
14
|
+
'IsValueOf',
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class IsRequiredIn(Pattern):
|
|
19
|
+
def __init__(self, *args, error=None):
|
|
20
|
+
self.args = args
|
|
21
|
+
self.error = error
|
|
22
|
+
return
|
|
23
|
+
|
|
24
|
+
def __call__(self, parameter: Dict) -> Dict:
|
|
25
|
+
if not isinstance(parameter, Mapping):
|
|
26
|
+
if self.error:
|
|
27
|
+
raise self.error
|
|
28
|
+
raise TypeError('{} must be dict'.format(parameter))
|
|
29
|
+
keys = parameter.keys()
|
|
30
|
+
for arg in self.args:
|
|
31
|
+
if arg not in keys:
|
|
32
|
+
if self.error:
|
|
33
|
+
raise self.error
|
|
34
|
+
raise ValueError('{} is required in {}'.format(arg, parameter))
|
|
35
|
+
return parameter
|
|
36
|
+
|
|
37
|
+
def __repr__(self):
|
|
38
|
+
return '{}({})'.format(
|
|
39
|
+
self.__class__.__name__,
|
|
40
|
+
', '.join(
|
|
41
|
+
[repr(p) for p in self.args]
|
|
42
|
+
)
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class IsMappingOf(Pattern):
|
|
47
|
+
def __init__(
|
|
48
|
+
self,
|
|
49
|
+
mappings: Dict[str, Union[Validator, Pattern, Sequence[Pattern]]] = {},
|
|
50
|
+
error: BaseException = None
|
|
51
|
+
):
|
|
52
|
+
self.mappings = self.__mapper__(mappings)
|
|
53
|
+
self.error = error
|
|
54
|
+
return
|
|
55
|
+
|
|
56
|
+
def __call__(self, parameter: Dict) -> Dict:
|
|
57
|
+
if not isinstance(parameter, Mapping):
|
|
58
|
+
if self.error:
|
|
59
|
+
raise self.error
|
|
60
|
+
raise TypeError('{} must be dict'.format(parameter))
|
|
61
|
+
if self.mappings:
|
|
62
|
+
for key, validator in self.mappings.items():
|
|
63
|
+
parameter[key] = validator(parameter[key] if key in parameter.keys() else None)
|
|
64
|
+
return parameter
|
|
65
|
+
|
|
66
|
+
def __mapper__(self, mappings: Dict[str, Validator]) -> Dict[str, Validator]:
|
|
67
|
+
if not isinstance(mappings, dict):
|
|
68
|
+
raise TypeError('{} must be dict'.format(mappings))
|
|
69
|
+
for key, value in mappings.items():
|
|
70
|
+
if isinstance(value, Sequence):
|
|
71
|
+
mappings[key] = Validator(*value)
|
|
72
|
+
continue
|
|
73
|
+
if isinstance(value, Pattern):
|
|
74
|
+
mappings[key] = Validator(value)
|
|
75
|
+
continue
|
|
76
|
+
if isinstance(value, Validator):
|
|
77
|
+
mappings[key] = value
|
|
78
|
+
continue
|
|
79
|
+
raise ValueError('Invalid mapping table, {} must be dictionary or listable of Patterns, or callable based Pattern'.format(value))
|
|
80
|
+
return mappings
|
|
81
|
+
|
|
82
|
+
def __repr__(self) -> str:
|
|
83
|
+
return '{}({})'.format(
|
|
84
|
+
self.__class__.__name__,
|
|
85
|
+
', '.join(
|
|
86
|
+
['{}: {}'.format(k, repr(v)) for k, v in self.mappings.items()]
|
|
87
|
+
)
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class IsKeyOf(Pattern):
|
|
92
|
+
def __init__(self, *args, error=None):
|
|
93
|
+
self.patterns = args
|
|
94
|
+
self.error = error
|
|
95
|
+
return
|
|
96
|
+
|
|
97
|
+
def __call__(self, parameter: Dict) -> Dict:
|
|
98
|
+
if not isinstance(parameter, Mapping):
|
|
99
|
+
if self.error:
|
|
100
|
+
raise self.error
|
|
101
|
+
raise TypeError('{} must be dict'.format(parameter))
|
|
102
|
+
try:
|
|
103
|
+
for k, v in parameter.items():
|
|
104
|
+
for pattern in self.patterns:
|
|
105
|
+
k = pattern(k)
|
|
106
|
+
parameter[k] = v
|
|
107
|
+
return parameter
|
|
108
|
+
except Exception as e:
|
|
109
|
+
if self.error:
|
|
110
|
+
raise self.error
|
|
111
|
+
raise e
|
|
112
|
+
|
|
113
|
+
def __repr__(self) -> str:
|
|
114
|
+
return '{}({})'.format(
|
|
115
|
+
self.__class__.__name__,
|
|
116
|
+
', '.join(
|
|
117
|
+
[repr(p) for p in self.patterns]
|
|
118
|
+
)
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class IsValueOf(Pattern):
|
|
123
|
+
def __init__(self, *args, error=None):
|
|
124
|
+
self.patterns = args
|
|
125
|
+
self.error = error
|
|
126
|
+
return
|
|
127
|
+
|
|
128
|
+
def __call__(self, parameter: Dict) -> Dict:
|
|
129
|
+
if not isinstance(parameter, Mapping):
|
|
130
|
+
if self.error:
|
|
131
|
+
raise self.error
|
|
132
|
+
raise TypeError('{} must be dict'.format(parameter))
|
|
133
|
+
try:
|
|
134
|
+
for k, v in parameter.items():
|
|
135
|
+
for pattern in self.patterns:
|
|
136
|
+
v = pattern(v)
|
|
137
|
+
parameter[k] = v
|
|
138
|
+
return parameter
|
|
139
|
+
except Exception as e:
|
|
140
|
+
if self.error:
|
|
141
|
+
raise self.error
|
|
142
|
+
raise e
|
|
143
|
+
|
|
144
|
+
def __repr__(self) -> str:
|
|
145
|
+
return '{}({})'.format(
|
|
146
|
+
self.__class__.__name__,
|
|
147
|
+
', '.join(
|
|
148
|
+
[repr(p) for p in self.patterns]
|
|
149
|
+
)
|
|
150
|
+
)
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from ..Pattern import Pattern
|
|
4
|
+
|
|
5
|
+
from operator import ne, le, ge, gt, lt
|
|
6
|
+
|
|
7
|
+
__all__ = (
|
|
8
|
+
'IsSizeOf',
|
|
9
|
+
'IsSizeIn',
|
|
10
|
+
'IsMaxSizeOf',
|
|
11
|
+
'IsMinSizeOf',
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class IsSizeOf(Pattern):
|
|
16
|
+
def __init__(self, size : int, error=None):
|
|
17
|
+
self.size = size
|
|
18
|
+
self.error = error
|
|
19
|
+
return
|
|
20
|
+
|
|
21
|
+
def __call__(self, parameter):
|
|
22
|
+
if ne(len(parameter), self.size):
|
|
23
|
+
if self.error:
|
|
24
|
+
raise self.error
|
|
25
|
+
raise ValueError(
|
|
26
|
+
'{} must be size of {}'.format(
|
|
27
|
+
parameter,
|
|
28
|
+
self.size
|
|
29
|
+
)
|
|
30
|
+
)
|
|
31
|
+
return parameter
|
|
32
|
+
|
|
33
|
+
def __repr__(self):
|
|
34
|
+
return '{}({})'.format(
|
|
35
|
+
self.__class__.__name__,
|
|
36
|
+
self.size
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class IsSizeIn(Pattern):
|
|
41
|
+
def __init__(self, size : int, min : int = 0, error=None):
|
|
42
|
+
self.size = size
|
|
43
|
+
self.min = min
|
|
44
|
+
self.error = error
|
|
45
|
+
return
|
|
46
|
+
|
|
47
|
+
def __call__(self, parameter):
|
|
48
|
+
if lt(len(parameter), self.min) or gt(len(parameter), self.size):
|
|
49
|
+
if self.error:
|
|
50
|
+
raise self.error
|
|
51
|
+
raise ValueError(
|
|
52
|
+
'{} must be size from {} to {}'.format(
|
|
53
|
+
parameter,
|
|
54
|
+
self.min,
|
|
55
|
+
self.size,
|
|
56
|
+
)
|
|
57
|
+
)
|
|
58
|
+
return parameter
|
|
59
|
+
|
|
60
|
+
def __repr__(self):
|
|
61
|
+
return '{}({})'.format(
|
|
62
|
+
self.__class__.__name__,
|
|
63
|
+
self.size
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class IsMaxSizeOf(Pattern):
|
|
68
|
+
def __init__(self, size : int, error=None):
|
|
69
|
+
self.size = size
|
|
70
|
+
self.error = error
|
|
71
|
+
return
|
|
72
|
+
|
|
73
|
+
def __call__(self, parameter):
|
|
74
|
+
if gt(len(parameter), self.size):
|
|
75
|
+
if self.error:
|
|
76
|
+
raise self.error
|
|
77
|
+
raise ValueError('{} must be maxium size of {}'.format(
|
|
78
|
+
parameter,
|
|
79
|
+
self.size
|
|
80
|
+
))
|
|
81
|
+
return parameter
|
|
82
|
+
|
|
83
|
+
def __repr__(self):
|
|
84
|
+
return '{}({})'.format(
|
|
85
|
+
self.__class__.__name__,
|
|
86
|
+
self.size
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class IsMinSizeOf(Pattern):
|
|
91
|
+
def __init__(self, size : int, error=None):
|
|
92
|
+
self.size = size
|
|
93
|
+
self.error = error
|
|
94
|
+
return
|
|
95
|
+
|
|
96
|
+
def __call__(self, parameter):
|
|
97
|
+
if lt(len(parameter), self.size):
|
|
98
|
+
if self.error:
|
|
99
|
+
raise self.error
|
|
100
|
+
raise ValueError('{} must be minium size of {}'.format(
|
|
101
|
+
parameter,
|
|
102
|
+
self.size
|
|
103
|
+
))
|
|
104
|
+
return parameter
|
|
105
|
+
|
|
106
|
+
def __repr__(self):
|
|
107
|
+
return '{}({})'.format(
|
|
108
|
+
self.__class__.__name__,
|
|
109
|
+
self.size
|
|
110
|
+
)
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from ..Pattern import Pattern
|
|
4
|
+
|
|
5
|
+
from operator import eq
|
|
6
|
+
|
|
7
|
+
__all__ = (
|
|
8
|
+
'IsAlphabet',
|
|
9
|
+
'IsAlphaNumeric',
|
|
10
|
+
'IsNumeric',
|
|
11
|
+
'ToUpper',
|
|
12
|
+
'ToLower',
|
|
13
|
+
'IsSubString',
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class IsAlphabet(Pattern):
|
|
18
|
+
def __init__(self, error=None):
|
|
19
|
+
self.error = error
|
|
20
|
+
return
|
|
21
|
+
|
|
22
|
+
def __call__(self, parameter):
|
|
23
|
+
if not parameter.isalpha():
|
|
24
|
+
if self.error:
|
|
25
|
+
raise self.error
|
|
26
|
+
raise ValueError('{} must be alphabet'.format(parameter))
|
|
27
|
+
return parameter
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class IsAlphaNumeric(Pattern):
|
|
31
|
+
def __init__(self, error=None):
|
|
32
|
+
self.error = error
|
|
33
|
+
return
|
|
34
|
+
|
|
35
|
+
def __call__(self, parameter):
|
|
36
|
+
if not parameter.isalnum():
|
|
37
|
+
if self.error:
|
|
38
|
+
raise self.error
|
|
39
|
+
raise ValueError('{} must be alphanumeric'.format(parameter))
|
|
40
|
+
return parameter
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class IsNumeric(Pattern):
|
|
44
|
+
def __init__(self, error=None):
|
|
45
|
+
self.error = error
|
|
46
|
+
return
|
|
47
|
+
|
|
48
|
+
def __call__(self, parameter):
|
|
49
|
+
if not parameter.isnumeric():
|
|
50
|
+
if self.error:
|
|
51
|
+
raise self.error
|
|
52
|
+
raise ValueError('{} must be numeric'.format(parameter))
|
|
53
|
+
return parameter
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class ToUpper(Pattern):
|
|
57
|
+
def __call__(self, parameter):
|
|
58
|
+
return parameter.upper()
|
|
59
|
+
|
|
60
|
+
def __repr__(self):
|
|
61
|
+
return '{}()'.format(self.__class__.__name__)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class ToLower(Pattern):
|
|
65
|
+
def __call__(self, parameter):
|
|
66
|
+
return parameter.lower()
|
|
67
|
+
|
|
68
|
+
def __repr__(self):
|
|
69
|
+
return '{}()'.format(self.__class__.__name__)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class IsSubString(Pattern):
|
|
73
|
+
def __init__(self, match: str, end: int = None, start: int = 0, error=None):
|
|
74
|
+
self.error = error
|
|
75
|
+
self.match = match
|
|
76
|
+
self.start = start
|
|
77
|
+
self.end = end if end is not None else len(match)
|
|
78
|
+
return
|
|
79
|
+
|
|
80
|
+
def __call__(self, parameter):
|
|
81
|
+
if not eq(parameter[self.start:self.end], self.match):
|
|
82
|
+
if self.error:
|
|
83
|
+
raise self.error
|
|
84
|
+
raise ValueError('{} is not substring to {}'.format(parameter[self.start:self.end], self.match))
|
|
85
|
+
return parameter
|