DefStream 0.1.24__110-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 +17 -0
- DefStream/Broker/Connection.py +141 -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/Priority.py +26 -0
- DefStream/Broker/Protocol.py +54 -0
- DefStream/Broker/__init__.py +55 -0
- DefStream/Descriptor/DataObject.py +409 -0
- DefStream/Descriptor/Types.py +248 -0
- DefStream/Descriptor/Value.py +188 -0
- DefStream/Descriptor/__init__.py +172 -0
- DefStream/Inspector/Extension.py +69 -0
- DefStream/Inspector/Extensions/Metrics.py +316 -0
- DefStream/Inspector/Extensions/Ping.py +107 -0
- DefStream/Inspector/Extensions/Play.html +373 -0
- DefStream/Inspector/Extensions/Play.py +415 -0
- DefStream/Inspector/Extensions/Specifications.py +176 -0
- DefStream/Inspector/Extensions/Status.html +206 -0
- DefStream/Inspector/Extensions/Status.py +124 -0
- DefStream/Inspector/Extensions/__init__.py +13 -0
- DefStream/Inspector/Inspector.py +357 -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 +92 -0
- DefStream/Validator/Patterns/Compare.py +180 -0
- DefStream/Validator/Patterns/Condition.py +60 -0
- DefStream/Validator/Patterns/DataObject.py +93 -0
- DefStream/Validator/Patterns/DateTime.py +111 -0
- DefStream/Validator/Patterns/Number.py +43 -0
- DefStream/Validator/Patterns/Object.py +158 -0
- DefStream/Validator/Patterns/Size.py +110 -0
- DefStream/Validator/Patterns/String.py +92 -0
- DefStream/Validator/Patterns/Type.py +355 -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 +525 -0
- DefStream/Worker/Message.py +180 -0
- DefStream/Worker/Pool.py +282 -0
- DefStream/Worker/Run.py +357 -0
- DefStream/Worker/Specification.py +87 -0
- DefStream/Worker/Startup.py +174 -0
- DefStream/Worker/Worker.py +571 -0
- DefStream/Worker/__init__.py +47 -0
- DefStream/__init__.py +0 -0
- defstream-0.1.24.dist-info/METADATA +94 -0
- defstream-0.1.24.dist-info/RECORD +55 -0
- defstream-0.1.24.dist-info/WHEEL +6 -0
- defstream-0.1.24.dist-info/licenses/LICENSE +674 -0
- defstream-0.1.24.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,158 @@
|
|
|
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 (
|
|
9
|
+
Dict,
|
|
10
|
+
Mapping as TypingMapping,
|
|
11
|
+
Optional,
|
|
12
|
+
Sequence,
|
|
13
|
+
Union,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
__all__ = (
|
|
17
|
+
'IsRequiredIn',
|
|
18
|
+
'IsMappingOf',
|
|
19
|
+
'IsKeyOf',
|
|
20
|
+
'IsValueOf',
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class IsRequiredIn(Pattern):
|
|
25
|
+
def __init__(self, *args, error=None):
|
|
26
|
+
self.args = args
|
|
27
|
+
self.error = error
|
|
28
|
+
return
|
|
29
|
+
|
|
30
|
+
def __call__(self, parameter: Dict) -> Dict:
|
|
31
|
+
if not isinstance(parameter, Mapping):
|
|
32
|
+
if self.error:
|
|
33
|
+
raise self.error
|
|
34
|
+
raise TypeError('{} must be dict'.format(parameter))
|
|
35
|
+
keys = parameter.keys()
|
|
36
|
+
for arg in self.args:
|
|
37
|
+
if arg not in keys:
|
|
38
|
+
if self.error:
|
|
39
|
+
raise self.error
|
|
40
|
+
raise ValueError('{} is required in {}'.format(arg, parameter))
|
|
41
|
+
return parameter
|
|
42
|
+
|
|
43
|
+
def __repr__(self):
|
|
44
|
+
return '{}({})'.format(
|
|
45
|
+
self.__class__.__name__,
|
|
46
|
+
', '.join(
|
|
47
|
+
[repr(p) for p in self.args]
|
|
48
|
+
)
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class IsMappingOf(Pattern):
|
|
53
|
+
def __init__(
|
|
54
|
+
self,
|
|
55
|
+
mappings: TypingMapping[str, Union[Validator, Pattern, Sequence[Pattern]]] = {},
|
|
56
|
+
error: Optional[BaseException] = None,
|
|
57
|
+
):
|
|
58
|
+
self.mappings = self.__mapper__(mappings)
|
|
59
|
+
self.error = error
|
|
60
|
+
return
|
|
61
|
+
|
|
62
|
+
def __call__(self, parameter: Dict) -> Dict:
|
|
63
|
+
if not isinstance(parameter, Mapping):
|
|
64
|
+
if self.error:
|
|
65
|
+
raise self.error
|
|
66
|
+
raise TypeError('{} must be dict'.format(parameter))
|
|
67
|
+
if self.mappings:
|
|
68
|
+
for key, validator in self.mappings.items():
|
|
69
|
+
parameter[key] = validator(parameter[key] if key in parameter.keys() else None)
|
|
70
|
+
return parameter
|
|
71
|
+
|
|
72
|
+
def __mapper__(
|
|
73
|
+
self,
|
|
74
|
+
mappings: TypingMapping[str, Union[Validator, Pattern, Sequence[Pattern]]],
|
|
75
|
+
) -> Dict[str, Validator]:
|
|
76
|
+
mapped: Dict[str, Validator] = {}
|
|
77
|
+
for key, value in mappings.items():
|
|
78
|
+
if isinstance(value, Sequence):
|
|
79
|
+
mapped[key] = Validator(*value)
|
|
80
|
+
continue
|
|
81
|
+
if isinstance(value, Pattern):
|
|
82
|
+
mapped[key] = Validator(value)
|
|
83
|
+
continue
|
|
84
|
+
if isinstance(value, Validator):
|
|
85
|
+
mapped[key] = value
|
|
86
|
+
continue
|
|
87
|
+
raise ValueError('Invalid mapping table, {} must be dictionary or listable of Patterns, or callable based Pattern'.format(value))
|
|
88
|
+
return mapped
|
|
89
|
+
|
|
90
|
+
def __repr__(self) -> str:
|
|
91
|
+
return '{}({})'.format(
|
|
92
|
+
self.__class__.__name__,
|
|
93
|
+
', '.join(
|
|
94
|
+
['{}: {}'.format(k, repr(v)) for k, v in self.mappings.items()]
|
|
95
|
+
)
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class IsKeyOf(Pattern):
|
|
100
|
+
def __init__(self, *args, error=None):
|
|
101
|
+
self.patterns = args
|
|
102
|
+
self.error = error
|
|
103
|
+
return
|
|
104
|
+
|
|
105
|
+
def __call__(self, parameter: Dict) -> Dict:
|
|
106
|
+
if not isinstance(parameter, Mapping):
|
|
107
|
+
if self.error:
|
|
108
|
+
raise self.error
|
|
109
|
+
raise TypeError('{} must be dict'.format(parameter))
|
|
110
|
+
try:
|
|
111
|
+
for k, v in parameter.items():
|
|
112
|
+
for pattern in self.patterns:
|
|
113
|
+
k = pattern(k)
|
|
114
|
+
parameter[k] = v
|
|
115
|
+
return parameter
|
|
116
|
+
except Exception as e:
|
|
117
|
+
if self.error:
|
|
118
|
+
raise self.error
|
|
119
|
+
raise e
|
|
120
|
+
|
|
121
|
+
def __repr__(self) -> str:
|
|
122
|
+
return '{}({})'.format(
|
|
123
|
+
self.__class__.__name__,
|
|
124
|
+
', '.join(
|
|
125
|
+
[repr(p) for p in self.patterns]
|
|
126
|
+
)
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class IsValueOf(Pattern):
|
|
131
|
+
def __init__(self, *args, error=None):
|
|
132
|
+
self.patterns = args
|
|
133
|
+
self.error = error
|
|
134
|
+
return
|
|
135
|
+
|
|
136
|
+
def __call__(self, parameter: Dict) -> Dict:
|
|
137
|
+
if not isinstance(parameter, Mapping):
|
|
138
|
+
if self.error:
|
|
139
|
+
raise self.error
|
|
140
|
+
raise TypeError('{} must be dict'.format(parameter))
|
|
141
|
+
try:
|
|
142
|
+
for k, v in parameter.items():
|
|
143
|
+
for pattern in self.patterns:
|
|
144
|
+
v = pattern(v)
|
|
145
|
+
parameter[k] = v
|
|
146
|
+
return parameter
|
|
147
|
+
except Exception as e:
|
|
148
|
+
if self.error:
|
|
149
|
+
raise self.error
|
|
150
|
+
raise e
|
|
151
|
+
|
|
152
|
+
def __repr__(self) -> str:
|
|
153
|
+
return '{}({})'.format(
|
|
154
|
+
self.__class__.__name__,
|
|
155
|
+
', '.join(
|
|
156
|
+
[repr(p) for p in self.patterns]
|
|
157
|
+
)
|
|
158
|
+
)
|
|
@@ -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,92 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from ..Pattern import Pattern
|
|
4
|
+
|
|
5
|
+
from operator import eq
|
|
6
|
+
from typing import Optional
|
|
7
|
+
|
|
8
|
+
__all__ = (
|
|
9
|
+
'IsAlphabet',
|
|
10
|
+
'IsAlphaNumeric',
|
|
11
|
+
'IsNumeric',
|
|
12
|
+
'ToUpper',
|
|
13
|
+
'ToLower',
|
|
14
|
+
'IsSubString',
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class IsAlphabet(Pattern):
|
|
19
|
+
def __init__(self, error=None):
|
|
20
|
+
self.error = error
|
|
21
|
+
return
|
|
22
|
+
|
|
23
|
+
def __call__(self, parameter):
|
|
24
|
+
if not parameter.isalpha():
|
|
25
|
+
if self.error:
|
|
26
|
+
raise self.error
|
|
27
|
+
raise ValueError('{} must be alphabet'.format(parameter))
|
|
28
|
+
return parameter
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class IsAlphaNumeric(Pattern):
|
|
32
|
+
def __init__(self, error=None):
|
|
33
|
+
self.error = error
|
|
34
|
+
return
|
|
35
|
+
|
|
36
|
+
def __call__(self, parameter):
|
|
37
|
+
if not parameter.isalnum():
|
|
38
|
+
if self.error:
|
|
39
|
+
raise self.error
|
|
40
|
+
raise ValueError('{} must be alphanumeric'.format(parameter))
|
|
41
|
+
return parameter
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class IsNumeric(Pattern):
|
|
45
|
+
def __init__(self, error=None):
|
|
46
|
+
self.error = error
|
|
47
|
+
return
|
|
48
|
+
|
|
49
|
+
def __call__(self, parameter):
|
|
50
|
+
if not parameter.isnumeric():
|
|
51
|
+
if self.error:
|
|
52
|
+
raise self.error
|
|
53
|
+
raise ValueError('{} must be numeric'.format(parameter))
|
|
54
|
+
return parameter
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class ToUpper(Pattern):
|
|
58
|
+
def __call__(self, parameter):
|
|
59
|
+
return parameter.upper()
|
|
60
|
+
|
|
61
|
+
def __repr__(self):
|
|
62
|
+
return '{}()'.format(self.__class__.__name__)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class ToLower(Pattern):
|
|
66
|
+
def __call__(self, parameter):
|
|
67
|
+
return parameter.lower()
|
|
68
|
+
|
|
69
|
+
def __repr__(self):
|
|
70
|
+
return '{}()'.format(self.__class__.__name__)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class IsSubString(Pattern):
|
|
74
|
+
def __init__(
|
|
75
|
+
self,
|
|
76
|
+
match: str,
|
|
77
|
+
end: Optional[int] = None,
|
|
78
|
+
start: int = 0,
|
|
79
|
+
error=None,
|
|
80
|
+
):
|
|
81
|
+
self.error = error
|
|
82
|
+
self.match = match
|
|
83
|
+
self.start = start
|
|
84
|
+
self.end = end if end is not None else len(match)
|
|
85
|
+
return
|
|
86
|
+
|
|
87
|
+
def __call__(self, parameter):
|
|
88
|
+
if not eq(parameter[self.start:self.end], self.match):
|
|
89
|
+
if self.error:
|
|
90
|
+
raise self.error
|
|
91
|
+
raise ValueError('{} is not substring to {}'.format(parameter[self.start:self.end], self.match))
|
|
92
|
+
return parameter
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from ..Pattern import Pattern
|
|
4
|
+
from ast import literal_eval
|
|
5
|
+
from collections.abc import (
|
|
6
|
+
Iterable,
|
|
7
|
+
Mapping,
|
|
8
|
+
)
|
|
9
|
+
from builtins import type as type_of
|
|
10
|
+
from typing import (
|
|
11
|
+
Optional,
|
|
12
|
+
Sequence,
|
|
13
|
+
Type,
|
|
14
|
+
Union,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
__all__ = (
|
|
18
|
+
'IsTypeOf',
|
|
19
|
+
'IsBool',
|
|
20
|
+
'IsInteger',
|
|
21
|
+
'IsFloat',
|
|
22
|
+
'IsNumber',
|
|
23
|
+
'IsString',
|
|
24
|
+
'IsList',
|
|
25
|
+
'IsTuple',
|
|
26
|
+
'IsSet',
|
|
27
|
+
'IsArray',
|
|
28
|
+
'IsObject',
|
|
29
|
+
'IsByteString',
|
|
30
|
+
'IsByteArray',
|
|
31
|
+
'IsDecimal',
|
|
32
|
+
'IsDataObject',
|
|
33
|
+
'ToTypeOf',
|
|
34
|
+
'ToBool',
|
|
35
|
+
'ToInteger',
|
|
36
|
+
'ToFloat',
|
|
37
|
+
'ToString',
|
|
38
|
+
'ToList',
|
|
39
|
+
'ToTuple',
|
|
40
|
+
'ToSet',
|
|
41
|
+
'ToObject',
|
|
42
|
+
'ToByteString',
|
|
43
|
+
'ToByteArray',
|
|
44
|
+
'ToDecimal',
|
|
45
|
+
'ToDataObject',
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class IsTypeOf(Pattern):
|
|
50
|
+
def __init__(
|
|
51
|
+
self,
|
|
52
|
+
type: Union[Type, Sequence[Type]],
|
|
53
|
+
patterns: Sequence[Pattern] = (),
|
|
54
|
+
error: Optional[BaseException] = None,
|
|
55
|
+
):
|
|
56
|
+
self.type = type if isinstance(type, type_of) else tuple(type)
|
|
57
|
+
self.patterns = patterns if isinstance(patterns, Iterable) else (patterns,)
|
|
58
|
+
self.error = error
|
|
59
|
+
return
|
|
60
|
+
|
|
61
|
+
def __call__(self, parameter):
|
|
62
|
+
if isinstance(self.type, tuple):
|
|
63
|
+
matches = isinstance(parameter, self.type)
|
|
64
|
+
else:
|
|
65
|
+
matches = type(parameter) is self.type
|
|
66
|
+
if not matches:
|
|
67
|
+
if self.error:
|
|
68
|
+
raise self.error
|
|
69
|
+
expected = ', '.join(
|
|
70
|
+
item.__name__
|
|
71
|
+
for item in self.type
|
|
72
|
+
) if isinstance(self.type, tuple) else self.type.__name__
|
|
73
|
+
raise TypeError('{} must be {}'.format(
|
|
74
|
+
'\'{}\''.format(parameter) if isinstance(parameter, str) else parameter,
|
|
75
|
+
expected,
|
|
76
|
+
))
|
|
77
|
+
for pattern in self.patterns:
|
|
78
|
+
parameter = pattern(parameter)
|
|
79
|
+
return parameter
|
|
80
|
+
|
|
81
|
+
def __repr__(self):
|
|
82
|
+
return '{}({})'.format(
|
|
83
|
+
self.__class__.__name__,
|
|
84
|
+
', '.join(
|
|
85
|
+
p.__repr__()
|
|
86
|
+
for p in self.patterns
|
|
87
|
+
),
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class IsBool(IsTypeOf):
|
|
92
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
93
|
+
super().__init__(bool, patterns=args, error=error)
|
|
94
|
+
return
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class IsInteger(IsTypeOf):
|
|
98
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
99
|
+
super().__init__(int, patterns=args, error=error)
|
|
100
|
+
return
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class IsFloat(IsTypeOf):
|
|
104
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
105
|
+
super().__init__(float, patterns=args, error=error)
|
|
106
|
+
return
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class IsNumber(IsTypeOf):
|
|
110
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
111
|
+
super().__init__((int, float), patterns=args, error=error)
|
|
112
|
+
return
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class IsString(IsTypeOf):
|
|
116
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
117
|
+
super().__init__(str, patterns=args, error=error)
|
|
118
|
+
return
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
class IsList(IsTypeOf):
|
|
122
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
123
|
+
super().__init__(list, patterns=args, error=error)
|
|
124
|
+
return
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class IsTuple(IsTypeOf):
|
|
128
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
129
|
+
super().__init__(tuple, patterns=args, error=error)
|
|
130
|
+
return
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class IsSet(IsTypeOf):
|
|
134
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
135
|
+
super().__init__(set, patterns=args, error=error)
|
|
136
|
+
return
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class IsArray(Pattern):
|
|
140
|
+
def __init__(self, *args, error=None):
|
|
141
|
+
self.patterns = args
|
|
142
|
+
self.error = error
|
|
143
|
+
return
|
|
144
|
+
|
|
145
|
+
def __call__(self, parameter: Iterable) -> Iterable:
|
|
146
|
+
if not isinstance(parameter, Iterable) or isinstance(parameter, (str, bytes)):
|
|
147
|
+
if self.error:
|
|
148
|
+
raise self.error
|
|
149
|
+
raise TypeError('{} must be a non-string, non-bytes iterable'.format(parameter))
|
|
150
|
+
for pattern in self.patterns:
|
|
151
|
+
parameter = pattern(parameter)
|
|
152
|
+
return parameter
|
|
153
|
+
|
|
154
|
+
def __repr__(self):
|
|
155
|
+
return '{}({})'.format(
|
|
156
|
+
self.__class__.__name__,
|
|
157
|
+
', '.join([p.__repr__() for p in self.patterns])
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
class IsObject(IsTypeOf):
|
|
162
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
163
|
+
super().__init__(dict, patterns=args, error=error)
|
|
164
|
+
return
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
class IsByteString(IsTypeOf):
|
|
168
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
169
|
+
super().__init__(bytes, patterns=args, error=error)
|
|
170
|
+
return
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class IsByteArray(IsTypeOf):
|
|
174
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
175
|
+
super().__init__(bytearray, patterns=args, error=error)
|
|
176
|
+
return
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class IsDecimal(IsTypeOf):
|
|
180
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
181
|
+
from decimal import Decimal
|
|
182
|
+
super().__init__(Decimal, patterns=args, error=error)
|
|
183
|
+
return
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
class IsDataObject(Pattern):
|
|
187
|
+
def __init__(
|
|
188
|
+
self,
|
|
189
|
+
*patterns: Pattern,
|
|
190
|
+
error: Optional[BaseException] = None,
|
|
191
|
+
):
|
|
192
|
+
self.patterns = patterns if isinstance(patterns, Iterable) else (patterns,)
|
|
193
|
+
self.error = error
|
|
194
|
+
return
|
|
195
|
+
|
|
196
|
+
def __call__(self, parameter: object) -> object:
|
|
197
|
+
from dataclasses import is_dataclass
|
|
198
|
+
if not is_dataclass(parameter.__class__):
|
|
199
|
+
if self.error:
|
|
200
|
+
raise self.error
|
|
201
|
+
raise TypeError('{} must be dataclass'.format(
|
|
202
|
+
'\'{}\''.format(parameter) if isinstance(parameter, str) else parameter,
|
|
203
|
+
))
|
|
204
|
+
for pattern in self.patterns:
|
|
205
|
+
parameter = pattern(parameter)
|
|
206
|
+
return parameter
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
class ToTypeOf(Pattern):
|
|
210
|
+
def __init__(
|
|
211
|
+
self,
|
|
212
|
+
type : type,
|
|
213
|
+
patterns: Sequence[Pattern] = (),
|
|
214
|
+
error: Optional[BaseException] = None,
|
|
215
|
+
eval: bool = False,
|
|
216
|
+
):
|
|
217
|
+
self.type = type
|
|
218
|
+
self.patterns = patterns if isinstance(patterns, Iterable) else (patterns,)
|
|
219
|
+
self.error = error
|
|
220
|
+
self.eval = eval
|
|
221
|
+
return
|
|
222
|
+
|
|
223
|
+
def __call__(self, parameter):
|
|
224
|
+
try:
|
|
225
|
+
if self.eval:
|
|
226
|
+
parameter = self.type(
|
|
227
|
+
literal_eval(str(parameter))
|
|
228
|
+
)
|
|
229
|
+
else:
|
|
230
|
+
parameter = self.type(parameter)
|
|
231
|
+
except Exception as e:
|
|
232
|
+
if self.error:
|
|
233
|
+
raise self.error
|
|
234
|
+
raise ValueError('{} cannot be converted to {}'.format(
|
|
235
|
+
'\'{}\''.format(parameter) if isinstance(parameter, str) else parameter,
|
|
236
|
+
self.type.__name__,
|
|
237
|
+
))
|
|
238
|
+
for pattern in self.patterns:
|
|
239
|
+
parameter = pattern(parameter)
|
|
240
|
+
return parameter
|
|
241
|
+
|
|
242
|
+
def __repr__(self):
|
|
243
|
+
if issubclass(self.__class__, ToTypeOf):
|
|
244
|
+
return '{}({})'.format(
|
|
245
|
+
self.__class__.__name__,
|
|
246
|
+
', '.join([p.__repr__() for p in self.patterns]) if self.patterns and len(self.patterns) else ''
|
|
247
|
+
)
|
|
248
|
+
return '{}({}{})'.format(
|
|
249
|
+
self.__class__.__name__,
|
|
250
|
+
self.type.__name__,
|
|
251
|
+
', ({})'.format(
|
|
252
|
+
', '.join([p.__repr__() for p in self.patterns])
|
|
253
|
+
) if self.patterns and len(self.patterns) else ''
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
class ToBool(ToTypeOf):
|
|
258
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
259
|
+
super().__init__(bool, patterns=args, error=error, eval=True)
|
|
260
|
+
return
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
class ToInteger(ToTypeOf):
|
|
264
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
265
|
+
super().__init__(int, patterns=args, error=error, eval=True)
|
|
266
|
+
return
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
class ToFloat(ToTypeOf):
|
|
270
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
271
|
+
super().__init__(float, patterns=args, error=error, eval=True)
|
|
272
|
+
return
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
class ToString(ToTypeOf):
|
|
276
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
277
|
+
super().__init__(str, patterns=args, error=error)
|
|
278
|
+
return
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
class ToList(ToTypeOf):
|
|
282
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
283
|
+
super().__init__(list, patterns=args, error=error)
|
|
284
|
+
return
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
class ToTuple(ToTypeOf):
|
|
288
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
289
|
+
super().__init__(tuple, patterns=args, error=error)
|
|
290
|
+
return
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
class ToSet(ToTypeOf):
|
|
294
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
295
|
+
super().__init__(set, patterns=args, error=error)
|
|
296
|
+
return
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
class ToObject(ToTypeOf):
|
|
300
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
301
|
+
super().__init__(dict, patterns=args, error=error)
|
|
302
|
+
return
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
class ToByteString(ToTypeOf):
|
|
306
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
307
|
+
super().__init__(bytes, patterns=args, error=error)
|
|
308
|
+
return
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
class ToByteArray(ToTypeOf):
|
|
312
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
313
|
+
super().__init__(bytearray, patterns=args, error=error)
|
|
314
|
+
return
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
class ToDecimal(ToTypeOf):
|
|
318
|
+
def __init__(self, *args, error: Optional[BaseException] = None):
|
|
319
|
+
from decimal import Decimal
|
|
320
|
+
super().__init__(Decimal, patterns=args, error=error)
|
|
321
|
+
return
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
class ToDataObject(Pattern):
|
|
325
|
+
def __init__(
|
|
326
|
+
self,
|
|
327
|
+
*patterns: Pattern,
|
|
328
|
+
error: Optional[BaseException] = None,
|
|
329
|
+
):
|
|
330
|
+
self.patterns = patterns if isinstance(patterns, Iterable) else (patterns,)
|
|
331
|
+
self.error = error
|
|
332
|
+
return
|
|
333
|
+
|
|
334
|
+
def __call__(self, parameter: Mapping) -> object:
|
|
335
|
+
from dataclasses import is_dataclass, make_dataclass
|
|
336
|
+
try:
|
|
337
|
+
data_object = make_dataclass(
|
|
338
|
+
'DynamicDataClass',
|
|
339
|
+
[(key, type(value)) for key, value in parameter.items()]
|
|
340
|
+
)(**parameter)
|
|
341
|
+
except Exception as e:
|
|
342
|
+
if self.error:
|
|
343
|
+
raise self.error
|
|
344
|
+
raise ValueError('{} cannot be converted to dataclass'.format(
|
|
345
|
+
'\'{}\''.format(parameter) if isinstance(parameter, str) else parameter
|
|
346
|
+
))
|
|
347
|
+
if not is_dataclass(data_object.__class__):
|
|
348
|
+
if self.error:
|
|
349
|
+
raise self.error
|
|
350
|
+
raise TypeError('{} must be dataclass'.format(
|
|
351
|
+
'\'{}\''.format(data_object) if isinstance(data_object, str) else data_object,
|
|
352
|
+
))
|
|
353
|
+
for pattern in self.patterns:
|
|
354
|
+
data_object = pattern(data_object)
|
|
355
|
+
return data_object
|