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.
Files changed (54) hide show
  1. DefStream/Broker/Configuration.py +18 -0
  2. DefStream/Broker/Connection.py +97 -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/Policies.py +25 -0
  8. DefStream/Broker/Protocol.py +45 -0
  9. DefStream/Broker/__init__.py +47 -0
  10. DefStream/Descriptor/DataObject.py +384 -0
  11. DefStream/Descriptor/Types.py +229 -0
  12. DefStream/Descriptor/Value.py +132 -0
  13. DefStream/Descriptor/__init__.py +172 -0
  14. DefStream/Inspector/Extension.py +69 -0
  15. DefStream/Inspector/Extensions/Console.html +373 -0
  16. DefStream/Inspector/Extensions/Console.py +396 -0
  17. DefStream/Inspector/Extensions/Dashboard.html +206 -0
  18. DefStream/Inspector/Extensions/Dashboard.py +114 -0
  19. DefStream/Inspector/Extensions/HealthCheck.py +92 -0
  20. DefStream/Inspector/Extensions/Metrics.py +281 -0
  21. DefStream/Inspector/Extensions/Specifications.py +160 -0
  22. DefStream/Inspector/Extensions/__init__.py +13 -0
  23. DefStream/Inspector/Inspector.py +216 -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 +93 -0
  29. DefStream/Validator/Patterns/Compare.py +180 -0
  30. DefStream/Validator/Patterns/Condition.py +60 -0
  31. DefStream/Validator/Patterns/DataObject.py +85 -0
  32. DefStream/Validator/Patterns/DateTime.py +111 -0
  33. DefStream/Validator/Patterns/Number.py +43 -0
  34. DefStream/Validator/Patterns/Object.py +150 -0
  35. DefStream/Validator/Patterns/Size.py +110 -0
  36. DefStream/Validator/Patterns/String.py +85 -0
  37. DefStream/Validator/Patterns/Type.py +350 -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 +298 -0
  43. DefStream/Worker/Message.py +103 -0
  44. DefStream/Worker/Pool.py +203 -0
  45. DefStream/Worker/Run.py +187 -0
  46. DefStream/Worker/Specification.py +91 -0
  47. DefStream/Worker/Worker.py +321 -0
  48. DefStream/Worker/__init__.py +49 -0
  49. DefStream/__init__.py +0 -0
  50. defstream-0.1.2.dist-info/METADATA +1197 -0
  51. defstream-0.1.2.dist-info/RECORD +54 -0
  52. defstream-0.1.2.dist-info/WHEEL +5 -0
  53. defstream-0.1.2.dist-info/licenses/LICENSE +674 -0
  54. 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