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.
Files changed (55) hide show
  1. DefStream/Broker/Configuration.py +17 -0
  2. DefStream/Broker/Connection.py +141 -0
  3. DefStream/Broker/Consumer.py +59 -0
  4. DefStream/Broker/Errors.py +14 -0
  5. DefStream/Broker/Event.py +35 -0
  6. DefStream/Broker/Implements/__init__.py +1 -0
  7. DefStream/Broker/Priority.py +26 -0
  8. DefStream/Broker/Protocol.py +54 -0
  9. DefStream/Broker/__init__.py +55 -0
  10. DefStream/Descriptor/DataObject.py +409 -0
  11. DefStream/Descriptor/Types.py +248 -0
  12. DefStream/Descriptor/Value.py +188 -0
  13. DefStream/Descriptor/__init__.py +172 -0
  14. DefStream/Inspector/Extension.py +69 -0
  15. DefStream/Inspector/Extensions/Metrics.py +316 -0
  16. DefStream/Inspector/Extensions/Ping.py +107 -0
  17. DefStream/Inspector/Extensions/Play.html +373 -0
  18. DefStream/Inspector/Extensions/Play.py +415 -0
  19. DefStream/Inspector/Extensions/Specifications.py +176 -0
  20. DefStream/Inspector/Extensions/Status.html +206 -0
  21. DefStream/Inspector/Extensions/Status.py +124 -0
  22. DefStream/Inspector/Extensions/__init__.py +13 -0
  23. DefStream/Inspector/Inspector.py +357 -0
  24. DefStream/Inspector/Response.py +14 -0
  25. DefStream/Inspector/__init__.py +9 -0
  26. DefStream/Validator/Pattern.py +36 -0
  27. DefStream/Validator/Patterns/Array.py +30 -0
  28. DefStream/Validator/Patterns/Common.py +92 -0
  29. DefStream/Validator/Patterns/Compare.py +180 -0
  30. DefStream/Validator/Patterns/Condition.py +60 -0
  31. DefStream/Validator/Patterns/DataObject.py +93 -0
  32. DefStream/Validator/Patterns/DateTime.py +111 -0
  33. DefStream/Validator/Patterns/Number.py +43 -0
  34. DefStream/Validator/Patterns/Object.py +158 -0
  35. DefStream/Validator/Patterns/Size.py +110 -0
  36. DefStream/Validator/Patterns/String.py +92 -0
  37. DefStream/Validator/Patterns/Type.py +355 -0
  38. DefStream/Validator/Patterns/__init__.py +137 -0
  39. DefStream/Validator/Validate.py +29 -0
  40. DefStream/Validator/Validator.py +30 -0
  41. DefStream/Validator/__init__.py +11 -0
  42. DefStream/Worker/Executor.py +525 -0
  43. DefStream/Worker/Message.py +180 -0
  44. DefStream/Worker/Pool.py +282 -0
  45. DefStream/Worker/Run.py +357 -0
  46. DefStream/Worker/Specification.py +87 -0
  47. DefStream/Worker/Startup.py +174 -0
  48. DefStream/Worker/Worker.py +571 -0
  49. DefStream/Worker/__init__.py +47 -0
  50. DefStream/__init__.py +0 -0
  51. defstream-0.1.24.dist-info/METADATA +94 -0
  52. defstream-0.1.24.dist-info/RECORD +55 -0
  53. defstream-0.1.24.dist-info/WHEEL +6 -0
  54. defstream-0.1.24.dist-info/licenses/LICENSE +674 -0
  55. 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