DefEssential 0.1.8__25-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 (104) hide show
  1. DefEssential/Adapter/Implements/Gunicorn/Server.py +152 -0
  2. DefEssential/Adapter/Implements/Gunicorn/Transport.py +171 -0
  3. DefEssential/Adapter/Implements/Gunicorn/__init__.py +5 -0
  4. DefEssential/Adapter/Implements/Python/Server.py +273 -0
  5. DefEssential/Adapter/Implements/Python/__init__.py +5 -0
  6. DefEssential/Adapter/Implements/Uvicorn/HTTP.py +256 -0
  7. DefEssential/Adapter/Implements/Uvicorn/Portal.py +65 -0
  8. DefEssential/Adapter/Implements/Uvicorn/Server.py +137 -0
  9. DefEssential/Adapter/Implements/Uvicorn/WebSocket.py +222 -0
  10. DefEssential/Adapter/Implements/Uvicorn/__init__.py +5 -0
  11. DefEssential/Adapter/Implements/__init__.py +3 -0
  12. DefEssential/Adapter/RequestHandler.py +109 -0
  13. DefEssential/Adapter/Server.py +54 -0
  14. DefEssential/Adapter/WSGI.py +219 -0
  15. DefEssential/Adapter/__init__.py +5 -0
  16. DefEssential/Application.py +657 -0
  17. DefEssential/Body.py +50 -0
  18. DefEssential/Content.py +18 -0
  19. DefEssential/Credentials.py +245 -0
  20. DefEssential/CrossOriginResourceSharing.py +107 -0
  21. DefEssential/Descriptor/DataObject.py +409 -0
  22. DefEssential/Descriptor/Types.py +248 -0
  23. DefEssential/Descriptor/Value.py +188 -0
  24. DefEssential/Descriptor/__init__.py +172 -0
  25. DefEssential/Error.py +66 -0
  26. DefEssential/Extension.py +191 -0
  27. DefEssential/Extensions/File.py +95 -0
  28. DefEssential/Extensions/FileSystem.py +195 -0
  29. DefEssential/Extensions/Metrics.py +511 -0
  30. DefEssential/Extensions/Ping.py +93 -0
  31. DefEssential/Extensions/Specifications.py +342 -0
  32. DefEssential/Extensions/Status.html +207 -0
  33. DefEssential/Extensions/Status.py +110 -0
  34. DefEssential/Extensions/Swagger.html +77 -0
  35. DefEssential/Extensions/Swagger.py +117 -0
  36. DefEssential/Extensions/Utils/Routes.py +42 -0
  37. DefEssential/Extensions/Utils/__init__.py +43 -0
  38. DefEssential/Extensions/__init__.py +21 -0
  39. DefEssential/IO/Readers/ChunkedStream.py +106 -0
  40. DefEssential/IO/Readers/ContentReader.py +36 -0
  41. DefEssential/IO/Readers/ContentReaders.py +241 -0
  42. DefEssential/IO/Readers/__init__.py +25 -0
  43. DefEssential/IO/RequestReader.py +125 -0
  44. DefEssential/IO/ResponseWriter.py +242 -0
  45. DefEssential/IO/WebSocket/WebSocket.py +288 -0
  46. DefEssential/IO/WebSocket/WebSocketError.py +17 -0
  47. DefEssential/IO/WebSocket/WebSocketFrame.py +68 -0
  48. DefEssential/IO/WebSocket/WebSocketFrameReader.py +98 -0
  49. DefEssential/IO/WebSocket/WebSocketHandshake.py +94 -0
  50. DefEssential/IO/WebSocket/__init__.py +13 -0
  51. DefEssential/IO/Writers/ChunkedStreamWriter.py +19 -0
  52. DefEssential/IO/Writers/ServerSentEvents.py +41 -0
  53. DefEssential/IO/Writers/ServerSentEventsWriter.py +67 -0
  54. DefEssential/IO/Writers/StreamWriter.py +57 -0
  55. DefEssential/IO/Writers/__init__.py +11 -0
  56. DefEssential/IO/__init__.py +7 -0
  57. DefEssential/Request.py +110 -0
  58. DefEssential/RequestRunner.py +261 -0
  59. DefEssential/Response.py +89 -0
  60. DefEssential/ResponseSpecification.py +23 -0
  61. DefEssential/Responses/ResponseFile.py +108 -0
  62. DefEssential/Responses/__init__.py +63 -0
  63. DefEssential/Route.py +55 -0
  64. DefEssential/Router.py +48 -0
  65. DefEssential/Runners/RunExtension.py +116 -0
  66. DefEssential/Runners/RunFactory.py +26 -0
  67. DefEssential/Runners/RunOptions.py +77 -0
  68. DefEssential/Runners/RunRequest.py +198 -0
  69. DefEssential/Runners/__init__.py +5 -0
  70. DefEssential/Startup.py +104 -0
  71. DefEssential/Utils/FileSystemObject/Configuration.py +15 -0
  72. DefEssential/Utils/FileSystemObject/Connection.py +57 -0
  73. DefEssential/Utils/FileSystemObject/File.py +41 -0
  74. DefEssential/Utils/FileSystemObject/Implements/FileSystem/Configuration.py +15 -0
  75. DefEssential/Utils/FileSystemObject/Implements/FileSystem/Connection.py +115 -0
  76. DefEssential/Utils/FileSystemObject/Implements/FileSystem/File.py +77 -0
  77. DefEssential/Utils/FileSystemObject/Implements/FileSystem/__init__.py +11 -0
  78. DefEssential/Utils/FileSystemObject/Implements/__init__.py +3 -0
  79. DefEssential/Utils/FileSystemObject/__init__.py +11 -0
  80. DefEssential/Utils/Loader.py +81 -0
  81. DefEssential/Utils/__init__.py +3 -0
  82. DefEssential/Validator/Pattern.py +36 -0
  83. DefEssential/Validator/Patterns/Array.py +30 -0
  84. DefEssential/Validator/Patterns/Common.py +92 -0
  85. DefEssential/Validator/Patterns/Compare.py +180 -0
  86. DefEssential/Validator/Patterns/Condition.py +60 -0
  87. DefEssential/Validator/Patterns/DataObject.py +85 -0
  88. DefEssential/Validator/Patterns/DateTime.py +111 -0
  89. DefEssential/Validator/Patterns/Number.py +43 -0
  90. DefEssential/Validator/Patterns/Object.py +150 -0
  91. DefEssential/Validator/Patterns/Size.py +110 -0
  92. DefEssential/Validator/Patterns/String.py +85 -0
  93. DefEssential/Validator/Patterns/Type.py +350 -0
  94. DefEssential/Validator/Patterns/__init__.py +137 -0
  95. DefEssential/Validator/Validate.py +29 -0
  96. DefEssential/Validator/Validator.py +30 -0
  97. DefEssential/Validator/__init__.py +11 -0
  98. DefEssential/Validators.py +255 -0
  99. DefEssential/__init__.py +83 -0
  100. defessential-0.1.8.dist-info/METADATA +86 -0
  101. defessential-0.1.8.dist-info/RECORD +104 -0
  102. defessential-0.1.8.dist-info/WHEEL +6 -0
  103. defessential-0.1.8.dist-info/licenses/LICENSE +674 -0
  104. defessential-0.1.8.dist-info/top_level.txt +1 -0
@@ -0,0 +1,180 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ from ..Pattern import Pattern
4
+
5
+ from operator import eq, ne, gt, ge, lt, le
6
+
7
+ __all__ = (
8
+ 'IsIn',
9
+ 'IsNotIn',
10
+ 'IsEqualTo',
11
+ 'IsNotEqualTo',
12
+ 'IsGreaterThan',
13
+ 'IsGreaterEqualTo',
14
+ 'IsLessThan',
15
+ 'IsLessEqualTo',
16
+ )
17
+
18
+
19
+ class IsIn(Pattern):
20
+ def __init__(self, *args, error=None):
21
+ self.compares = args
22
+ self.error = error
23
+ return
24
+
25
+ def __call__(self, parameter):
26
+ if parameter not in self.compares:
27
+ if self.error:
28
+ raise self.error
29
+ raise ValueError('{} must be in {}'.format(parameter, self.compares))
30
+ return parameter
31
+
32
+ def __repr__(self):
33
+ return '{}({})'.format(
34
+ self.__class__.__name__,
35
+ ', '.join(
36
+ [repr(c) for c in self.compares]
37
+ )
38
+ )
39
+
40
+
41
+ class IsNotIn(Pattern):
42
+ def __init__(self, *args, error=None):
43
+ self.compares = args
44
+ self.error = error
45
+ return
46
+
47
+ def __call__(self, parameter):
48
+ if parameter in self.compares:
49
+ if self.error:
50
+ raise self.error
51
+ raise ValueError('{} must be not in {}'.format(parameter, self.compares))
52
+ return parameter
53
+
54
+ def __repr__(self):
55
+ return '{}({})'.format(
56
+ self.__class__.__name__,
57
+ ', '.join(
58
+ [repr(c) for c in self.compares]
59
+ )
60
+ )
61
+
62
+
63
+ class IsEqualTo(Pattern):
64
+ def __init__(self, equal, error=None):
65
+ self.equal = equal
66
+ self.error = error
67
+ return
68
+
69
+ def __call__(self, parameter):
70
+ if not eq(parameter, self.equal):
71
+ if self.error:
72
+ raise self.error
73
+ raise ValueError('{} must equal to {}'.format(parameter, self.equal))
74
+ return parameter
75
+
76
+ def __repr__(self):
77
+ return '{}({})'.format(
78
+ self.__class__.__name__,
79
+ self.equal
80
+ )
81
+
82
+
83
+ class IsNotEqualTo(Pattern):
84
+ def __init__(self, equal, error=None):
85
+ self.equal = equal
86
+ self.error = error
87
+ return
88
+
89
+ def __call__(self, parameter):
90
+ if not ne(parameter, self.equal):
91
+ if self.error:
92
+ raise self.error
93
+ raise ValueError('{} must not equal to {}'.format(parameter, self.equal))
94
+ return parameter
95
+
96
+ def __repr__(self):
97
+ return '{}({})'.format(
98
+ self.__class__.__name__,
99
+ self.equal
100
+ )
101
+
102
+
103
+ class IsGreaterEqualTo(Pattern):
104
+ def __init__(self, compare, error=None):
105
+ self.compare = compare
106
+ self.error = error
107
+ return
108
+
109
+ def __call__(self, parameter):
110
+ if not ge(parameter, self.compare):
111
+ if self.error:
112
+ raise self.error
113
+ raise ValueError('{} must be greater equal to {}'.format(parameter, self.compare))
114
+ return parameter
115
+
116
+ def __repr__(self):
117
+ return '{}({})'.format(
118
+ self.__class__.__name__,
119
+ self.compare
120
+ )
121
+
122
+
123
+ class IsGreaterThan(Pattern):
124
+ def __init__(self, compare, error=None):
125
+ self.compare = compare
126
+ self.error = error
127
+ return
128
+
129
+ def __call__(self, parameter):
130
+ if not gt(parameter, self.compare):
131
+ if self.error:
132
+ raise self.error
133
+ raise ValueError('{} must be greater than {}'.format(parameter, self.compare))
134
+ return parameter
135
+
136
+ def __repr__(self):
137
+ return '{}({})'.format(
138
+ self.__class__.__name__,
139
+ self.compare
140
+ )
141
+
142
+
143
+ class IsLessEqualTo(Pattern):
144
+ def __init__(self, compare, error=None):
145
+ self.compare = compare
146
+ self.error = error
147
+ return
148
+
149
+ def __call__(self, parameter):
150
+ if not le(parameter, self.compare):
151
+ if self.error:
152
+ raise self.error
153
+ raise ValueError('{} must be less equal to {}'.format(parameter, self.compare))
154
+ return parameter
155
+
156
+ def __repr__(self):
157
+ return '{}({})'.format(
158
+ self.__class__.__name__,
159
+ self.compare
160
+ )
161
+
162
+
163
+ class IsLessThan(Pattern):
164
+ def __init__(self, compare, error=None):
165
+ self.compare = compare
166
+ self.error = error
167
+ return
168
+
169
+ def __call__(self, parameter):
170
+ if not lt(parameter, self.compare):
171
+ if self.error:
172
+ raise self.error
173
+ raise ValueError('{} must be less than {}'.format(parameter, self.compare))
174
+ return parameter
175
+
176
+ def __repr__(self):
177
+ return '{}({})'.format(
178
+ self.__class__.__name__,
179
+ self.compare
180
+ )
@@ -0,0 +1,60 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ from ..Pattern import Pattern
4
+
5
+ __all__ = (
6
+ 'All',
7
+ 'Any',
8
+ )
9
+
10
+
11
+ class All(Pattern):
12
+ def __init__(self, *args, error=None) -> None:
13
+ self.patterns = args
14
+ self.error = error
15
+ return
16
+
17
+ def __call__(self, parameter):
18
+ try:
19
+ for pattern in self.patterns:
20
+ parameter = pattern(parameter)
21
+ return parameter
22
+ except Exception as e:
23
+ if self.error:
24
+ raise self.error
25
+ raise e
26
+
27
+ def __repr__(self):
28
+ return '{}({})'.format(
29
+ self.__class__.__name__,
30
+ ', '.join(
31
+ [p.__repr__() for p in self.patterns]
32
+ )
33
+ )
34
+
35
+
36
+ class Any(Pattern):
37
+ def __init__(self, *args, error=None) -> None:
38
+ self.patterns = args
39
+ self.error = error
40
+ return
41
+
42
+ def __call__(self, parameter):
43
+ for pattern in self.patterns:
44
+ try:
45
+ parameter = pattern(parameter)
46
+ return parameter
47
+ except Exception:
48
+ pass
49
+ if self.error:
50
+ raise self.error
51
+ raise ValueError('{} must be validated in {}'.format(
52
+ parameter,
53
+ ', '.join([p.__repr__() for p in self.patterns])
54
+ ))
55
+
56
+ def __repr__(self):
57
+ return '{}({})'.format(
58
+ self.__class__.__name__,
59
+ ', '.join([p.__repr__() for p in self.patterns])
60
+ )
@@ -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
+ )