haiway 0.5.3__py3-none-any.whl → 0.6.1__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.
- haiway/__init__.py +11 -11
- haiway/context/__init__.py +1 -1
- haiway/context/access.py +1 -5
- haiway/helpers/__init__.py +1 -1
- haiway/helpers/tracing.py +4 -4
- haiway/state/__init__.py +1 -1
- haiway/state/attributes.py +6 -1
- haiway/state/structure.py +4 -3
- haiway/state/validation.py +232 -84
- haiway/types/__init__.py +2 -2
- haiway/utils/__init__.py +1 -1
- haiway/utils/env.py +1 -1
- {haiway-0.5.3.dist-info → haiway-0.6.1.dist-info}/METADATA +3 -2
- {haiway-0.5.3.dist-info → haiway-0.6.1.dist-info}/RECORD +17 -17
- {haiway-0.5.3.dist-info → haiway-0.6.1.dist-info}/LICENSE +0 -0
- {haiway-0.5.3.dist-info → haiway-0.6.1.dist-info}/WHEEL +0 -0
- {haiway-0.5.3.dist-info → haiway-0.6.1.dist-info}/top_level.txt +0 -0
haiway/__init__.py
CHANGED
@@ -43,16 +43,23 @@ from haiway.utils import (
|
|
43
43
|
)
|
44
44
|
|
45
45
|
__all__ = [
|
46
|
-
"
|
46
|
+
"MISSING",
|
47
47
|
"ArgumentsTrace",
|
48
|
+
"AsyncQueue",
|
49
|
+
"Disposable",
|
50
|
+
"Disposables",
|
51
|
+
"Missing",
|
52
|
+
"MissingContext",
|
53
|
+
"MissingState",
|
54
|
+
"ResultTrace",
|
55
|
+
"ScopeMetrics",
|
56
|
+
"State",
|
57
|
+
"always",
|
48
58
|
"async_always",
|
49
59
|
"async_noop",
|
50
60
|
"asynchronous",
|
51
|
-
"AsyncQueue",
|
52
61
|
"cache",
|
53
62
|
"ctx",
|
54
|
-
"Disposable",
|
55
|
-
"Disposables",
|
56
63
|
"freeze",
|
57
64
|
"frozenlist",
|
58
65
|
"getenv_bool",
|
@@ -62,17 +69,10 @@ __all__ = [
|
|
62
69
|
"is_missing",
|
63
70
|
"load_env",
|
64
71
|
"mimic_function",
|
65
|
-
"Missing",
|
66
|
-
"MISSING",
|
67
|
-
"MissingContext",
|
68
|
-
"MissingState",
|
69
72
|
"noop",
|
70
73
|
"not_missing",
|
71
|
-
"ResultTrace",
|
72
74
|
"retry",
|
73
|
-
"ScopeMetrics",
|
74
75
|
"setup_logging",
|
75
|
-
"State",
|
76
76
|
"throttle",
|
77
77
|
"timeout",
|
78
78
|
"traced",
|
haiway/context/__init__.py
CHANGED
haiway/context/access.py
CHANGED
haiway/helpers/__init__.py
CHANGED
haiway/helpers/tracing.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
from asyncio import iscoroutinefunction
|
2
|
-
from collections.abc import Callable, Coroutine
|
2
|
+
from collections.abc import Callable, Coroutine, Mapping, Sequence
|
3
3
|
from typing import Any, Self, cast
|
4
4
|
|
5
5
|
from haiway.context import ctx
|
@@ -8,9 +8,9 @@ from haiway.types import MISSING, Missing
|
|
8
8
|
from haiway.utils import mimic_function
|
9
9
|
|
10
10
|
__all__ = [
|
11
|
-
"traced",
|
12
11
|
"ArgumentsTrace",
|
13
12
|
"ResultTrace",
|
13
|
+
"traced",
|
14
14
|
]
|
15
15
|
|
16
16
|
|
@@ -33,8 +33,8 @@ class ArgumentsTrace(State):
|
|
33
33
|
kwargs=MISSING,
|
34
34
|
)
|
35
35
|
|
36
|
-
args:
|
37
|
-
kwargs:
|
36
|
+
args: Sequence[Any] | Missing
|
37
|
+
kwargs: Mapping[str, Any] | Missing
|
38
38
|
|
39
39
|
|
40
40
|
class ResultTrace(State):
|
haiway/state/__init__.py
CHANGED
haiway/state/attributes.py
CHANGED
@@ -17,8 +17,8 @@ from typing import (
|
|
17
17
|
)
|
18
18
|
|
19
19
|
__all__ = [
|
20
|
-
"attribute_annotations",
|
21
20
|
"AttributeAnnotation",
|
21
|
+
"attribute_annotations",
|
22
22
|
]
|
23
23
|
|
24
24
|
|
@@ -42,6 +42,11 @@ class AttributeAnnotation:
|
|
42
42
|
and self.arguments == other.arguments
|
43
43
|
)
|
44
44
|
|
45
|
+
def __str__(self) -> str:
|
46
|
+
return f"{getattr(self.origin, "__name__", str(self.origin))}" + (
|
47
|
+
("[" + ", ".join(str(arg) for arg in self.arguments) + "]") if self.arguments else ""
|
48
|
+
)
|
49
|
+
|
45
50
|
|
46
51
|
def attribute_annotations(
|
47
52
|
cls: type[Any],
|
haiway/state/structure.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
from collections.abc import Callable
|
2
2
|
from copy import deepcopy
|
3
|
-
from types import GenericAlias
|
3
|
+
from types import EllipsisType, GenericAlias
|
4
4
|
from typing import (
|
5
5
|
Any,
|
6
6
|
ClassVar,
|
@@ -15,7 +15,7 @@ from typing import (
|
|
15
15
|
from weakref import WeakValueDictionary
|
16
16
|
|
17
17
|
from haiway.state.attributes import AttributeAnnotation, attribute_annotations
|
18
|
-
from haiway.state.validation import
|
18
|
+
from haiway.state.validation import attribute_validator
|
19
19
|
from haiway.types import MISSING, Missing, not_missing
|
20
20
|
|
21
21
|
__all__ = [
|
@@ -80,7 +80,7 @@ class StateMeta(type):
|
|
80
80
|
attributes[key] = StateAttribute(
|
81
81
|
annotation=annotation,
|
82
82
|
default=getattr(state_type, key, MISSING),
|
83
|
-
validator=
|
83
|
+
validator=attribute_validator(annotation),
|
84
84
|
)
|
85
85
|
|
86
86
|
state_type.__ATTRIBUTES__ = attributes # pyright: ignore[reportAttributeAccessIssue]
|
@@ -104,6 +104,7 @@ class State(metaclass=StateMeta):
|
|
104
104
|
Base class for immutable data structures.
|
105
105
|
"""
|
106
106
|
|
107
|
+
__IMMUTABLE__: ClassVar[EllipsisType] = ...
|
107
108
|
__ATTRIBUTES__: ClassVar[dict[str, StateAttribute[Any]]]
|
108
109
|
|
109
110
|
def __class_getitem__(
|
haiway/state/validation.py
CHANGED
@@ -1,119 +1,107 @@
|
|
1
|
-
import
|
2
|
-
import
|
3
|
-
from
|
4
|
-
from typing import Any
|
1
|
+
from collections.abc import Callable, Mapping, Sequence, Set
|
2
|
+
from enum import Enum
|
3
|
+
from types import MappingProxyType, NoneType, UnionType
|
4
|
+
from typing import Any, Literal, Protocol, Union
|
5
|
+
from uuid import UUID
|
5
6
|
|
6
|
-
from haiway import types as _types
|
7
7
|
from haiway.state.attributes import AttributeAnnotation
|
8
|
+
from haiway.types import MISSING, Missing
|
8
9
|
|
9
10
|
__all__ = [
|
10
|
-
"
|
11
|
+
"attribute_validator",
|
11
12
|
]
|
12
13
|
|
13
14
|
|
14
|
-
def
|
15
|
+
def attribute_validator(
|
15
16
|
annotation: AttributeAnnotation,
|
16
17
|
/,
|
17
18
|
) -> Callable[[Any], Any]:
|
18
|
-
|
19
|
-
|
20
|
-
return _none_validator
|
19
|
+
if validator := VALIDATORS.get(annotation.origin):
|
20
|
+
return validator(annotation)
|
21
21
|
|
22
|
-
|
23
|
-
|
22
|
+
elif hasattr(annotation.origin, "__IMMUTABLE__"):
|
23
|
+
return _prepare_validator_of_type(annotation)
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
elif issubclass(annotation.origin, Protocol):
|
26
|
+
return _prepare_validator_of_type(annotation)
|
27
27
|
|
28
|
-
|
29
|
-
|
28
|
+
elif issubclass(annotation.origin, Enum):
|
29
|
+
return _prepare_validator_of_type(annotation)
|
30
30
|
|
31
|
-
|
32
|
-
|
31
|
+
else:
|
32
|
+
raise TypeError(f"Unsupported type annotation: {annotation}")
|
33
33
|
|
34
|
-
# typed dicts fail on type checks
|
35
|
-
case typed_dict if typing.is_typeddict(typed_dict):
|
36
|
-
return _prepare_typed_dict_validator(typed_dict)
|
37
34
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
value: Any,
|
47
|
-
) -> Any:
|
48
|
-
match value:
|
49
|
-
case None:
|
50
|
-
return None
|
51
|
-
|
52
|
-
case _:
|
53
|
-
raise TypeError(f"Type '{type(value)}' is not matching expected type 'None'")
|
35
|
+
def _prepare_validator_of_any(
|
36
|
+
annotation: AttributeAnnotation,
|
37
|
+
/,
|
38
|
+
) -> Callable[[Any], Any]:
|
39
|
+
def validator(
|
40
|
+
value: Any,
|
41
|
+
) -> Any:
|
42
|
+
return value # any is always valid
|
54
43
|
|
44
|
+
return validator
|
55
45
|
|
56
|
-
def _missing_validator(
|
57
|
-
value: Any,
|
58
|
-
) -> Any:
|
59
|
-
match value:
|
60
|
-
case _types.Missing():
|
61
|
-
return _types.MISSING
|
62
46
|
|
63
|
-
|
64
|
-
|
47
|
+
def _prepare_validator_of_none(
|
48
|
+
annotation: AttributeAnnotation,
|
49
|
+
/,
|
50
|
+
) -> Callable[[Any], Any]:
|
51
|
+
def validator(
|
52
|
+
value: Any,
|
53
|
+
) -> Any:
|
54
|
+
if value is None:
|
55
|
+
return value
|
65
56
|
|
57
|
+
else:
|
58
|
+
raise TypeError(f"'{value}' is not matching expected type of 'None'")
|
66
59
|
|
67
|
-
|
68
|
-
value: Any,
|
69
|
-
) -> Any:
|
70
|
-
return value # any is always valid
|
60
|
+
return validator
|
71
61
|
|
72
62
|
|
73
|
-
def
|
74
|
-
|
63
|
+
def _prepare_validator_of_missing(
|
64
|
+
annotation: AttributeAnnotation,
|
75
65
|
/,
|
76
66
|
) -> Callable[[Any], Any]:
|
77
|
-
|
78
|
-
attribute_type_validator(alternative) for alternative in elements
|
79
|
-
]
|
80
|
-
|
81
|
-
def union_validator(
|
67
|
+
def validator(
|
82
68
|
value: Any,
|
83
69
|
) -> Any:
|
84
|
-
|
85
|
-
|
86
|
-
try:
|
87
|
-
return validator(value)
|
88
|
-
|
89
|
-
except Exception as exc:
|
90
|
-
errors.append(exc)
|
70
|
+
if value is MISSING:
|
71
|
+
return value
|
91
72
|
|
92
|
-
|
73
|
+
else:
|
74
|
+
raise TypeError(f"'{value}' is not matching expected type of 'Missing'")
|
93
75
|
|
94
|
-
return
|
76
|
+
return validator
|
95
77
|
|
96
78
|
|
97
|
-
def
|
98
|
-
|
79
|
+
def _prepare_validator_of_literal(
|
80
|
+
annotation: AttributeAnnotation,
|
99
81
|
/,
|
100
82
|
) -> Callable[[Any], Any]:
|
101
|
-
|
83
|
+
elements: list[Any] = annotation.arguments
|
84
|
+
formatted_type: str = str(annotation)
|
85
|
+
|
86
|
+
def validator(
|
102
87
|
value: Any,
|
103
88
|
) -> Any:
|
104
89
|
if value in elements:
|
105
90
|
return value
|
106
91
|
|
107
92
|
else:
|
108
|
-
raise ValueError(f"
|
93
|
+
raise ValueError(f"'{value}' is not matching expected values of '{formatted_type}'")
|
109
94
|
|
110
|
-
return
|
95
|
+
return validator
|
111
96
|
|
112
97
|
|
113
|
-
def
|
114
|
-
|
98
|
+
def _prepare_validator_of_type(
|
99
|
+
annotation: AttributeAnnotation,
|
115
100
|
/,
|
116
101
|
) -> Callable[[Any], Any]:
|
102
|
+
validated_type: type[Any] = annotation.origin
|
103
|
+
formatted_type: str = str(annotation)
|
104
|
+
|
117
105
|
def type_validator(
|
118
106
|
value: Any,
|
119
107
|
) -> Any:
|
@@ -122,28 +110,188 @@ def _prepare_type_validator(
|
|
122
110
|
return value
|
123
111
|
|
124
112
|
case _:
|
125
|
-
raise TypeError(
|
126
|
-
f"Type '{type(value)}' is not matching expected type '{validated_type}'"
|
127
|
-
)
|
113
|
+
raise TypeError(f"'{value}' is not matching expected type of '{formatted_type}'")
|
128
114
|
|
129
115
|
return type_validator
|
130
116
|
|
131
117
|
|
132
|
-
def
|
133
|
-
|
118
|
+
def _prepare_validator_of_set(
|
119
|
+
annotation: AttributeAnnotation,
|
120
|
+
/,
|
121
|
+
) -> Callable[[Any], Any]:
|
122
|
+
element_validator: Callable[[Any], Any] = attribute_validator(annotation.arguments[0])
|
123
|
+
formatted_type: str = str(annotation)
|
124
|
+
|
125
|
+
def validator(
|
126
|
+
value: Any,
|
127
|
+
) -> Any:
|
128
|
+
if isinstance(value, Set):
|
129
|
+
return frozenset(element_validator(element) for element in value) # pyright: ignore[reportUnknownVariableType]
|
130
|
+
|
131
|
+
else:
|
132
|
+
raise TypeError(f"'{value}' is not matching expected type of '{formatted_type}'")
|
133
|
+
|
134
|
+
return validator
|
135
|
+
|
136
|
+
|
137
|
+
def _prepare_validator_of_sequence(
|
138
|
+
annotation: AttributeAnnotation,
|
134
139
|
/,
|
135
140
|
) -> Callable[[Any], Any]:
|
136
|
-
|
141
|
+
element_validator: Callable[[Any], Any] = attribute_validator(annotation.arguments[0])
|
142
|
+
formatted_type: str = str(annotation)
|
143
|
+
|
144
|
+
def validator(
|
137
145
|
value: Any,
|
138
146
|
) -> Any:
|
139
147
|
match value:
|
140
|
-
case
|
141
|
-
|
142
|
-
return value # pyright: ignore[reportUnknownVariableType]
|
148
|
+
case [*elements]:
|
149
|
+
return tuple(element_validator(element) for element in elements)
|
143
150
|
|
144
151
|
case _:
|
145
|
-
raise TypeError(
|
146
|
-
|
152
|
+
raise TypeError(f"'{value}' is not matching expected type of '{formatted_type}'")
|
153
|
+
|
154
|
+
return validator
|
155
|
+
|
156
|
+
|
157
|
+
def _prepare_validator_of_mapping(
|
158
|
+
annotation: AttributeAnnotation,
|
159
|
+
/,
|
160
|
+
) -> Callable[[Any], Any]:
|
161
|
+
key_validator: Callable[[Any], Any] = attribute_validator(annotation.arguments[0])
|
162
|
+
value_validator: Callable[[Any], Any] = attribute_validator(annotation.arguments[1])
|
163
|
+
formatted_type: str = str(annotation)
|
164
|
+
|
165
|
+
def validator(
|
166
|
+
value: Any,
|
167
|
+
) -> Any:
|
168
|
+
match value:
|
169
|
+
case {**elements}:
|
170
|
+
return MappingProxyType(
|
171
|
+
{key_validator(key): value_validator(value) for key, value in elements}
|
147
172
|
)
|
148
173
|
|
149
|
-
|
174
|
+
case _:
|
175
|
+
raise TypeError(f"'{value}' is not matching expected type of '{formatted_type}'")
|
176
|
+
|
177
|
+
return validator
|
178
|
+
|
179
|
+
|
180
|
+
def _prepare_validator_of_tuple(
|
181
|
+
annotation: AttributeAnnotation,
|
182
|
+
/,
|
183
|
+
) -> Callable[[Any], Any]:
|
184
|
+
if annotation.arguments[-1].origin == Ellipsis:
|
185
|
+
element_validator: Callable[[Any], Any] = attribute_validator(annotation.arguments[0])
|
186
|
+
formatted_type: str = str(annotation)
|
187
|
+
|
188
|
+
def validator(
|
189
|
+
value: Any,
|
190
|
+
) -> Any:
|
191
|
+
match value:
|
192
|
+
case [*elements]:
|
193
|
+
return tuple(element_validator(element) for element in elements)
|
194
|
+
|
195
|
+
case _:
|
196
|
+
raise TypeError(
|
197
|
+
f"'{value}' is not matching expected type of '{formatted_type}'"
|
198
|
+
)
|
199
|
+
|
200
|
+
return validator
|
201
|
+
|
202
|
+
else:
|
203
|
+
element_validators: list[Callable[[Any], Any]] = [
|
204
|
+
attribute_validator(alternative) for alternative in annotation.arguments
|
205
|
+
]
|
206
|
+
elements_count: int = len(element_validators)
|
207
|
+
formatted_type: str = str(annotation)
|
208
|
+
|
209
|
+
def validator(
|
210
|
+
value: Any,
|
211
|
+
) -> Any:
|
212
|
+
match value:
|
213
|
+
case [*elements]:
|
214
|
+
if len(elements) != elements_count:
|
215
|
+
raise ValueError(
|
216
|
+
f"'{value}' is not matching expected type of '{formatted_type}'"
|
217
|
+
)
|
218
|
+
|
219
|
+
return tuple(
|
220
|
+
element_validators[idx](value) for idx, value in enumerate(elements)
|
221
|
+
)
|
222
|
+
|
223
|
+
case _:
|
224
|
+
raise TypeError(
|
225
|
+
f"'{value}' is not matching expected type of '{formatted_type}'"
|
226
|
+
)
|
227
|
+
|
228
|
+
return validator
|
229
|
+
|
230
|
+
|
231
|
+
def _prepare_validator_of_union(
|
232
|
+
annotation: AttributeAnnotation,
|
233
|
+
/,
|
234
|
+
) -> Callable[[Any], Any]:
|
235
|
+
validators: list[Callable[[Any], Any]] = [
|
236
|
+
attribute_validator(alternative) for alternative in annotation.arguments
|
237
|
+
]
|
238
|
+
formatted_type: str = str(annotation)
|
239
|
+
|
240
|
+
def validator(
|
241
|
+
value: Any,
|
242
|
+
) -> Any:
|
243
|
+
errors: list[Exception] = []
|
244
|
+
for validator in validators:
|
245
|
+
try:
|
246
|
+
return validator(value)
|
247
|
+
|
248
|
+
except Exception as exc:
|
249
|
+
errors.append(exc)
|
250
|
+
|
251
|
+
raise ExceptionGroup(
|
252
|
+
f"'{value}' is not matching expected type of '{formatted_type}'",
|
253
|
+
errors,
|
254
|
+
)
|
255
|
+
|
256
|
+
return validator
|
257
|
+
|
258
|
+
|
259
|
+
def _prepare_validator_of_callable(
|
260
|
+
annotation: AttributeAnnotation,
|
261
|
+
/,
|
262
|
+
) -> Callable[[Any], Any]:
|
263
|
+
formatted_type: str = str(annotation)
|
264
|
+
|
265
|
+
def validator(
|
266
|
+
value: Any,
|
267
|
+
) -> Any:
|
268
|
+
if callable(value):
|
269
|
+
return value
|
270
|
+
|
271
|
+
else:
|
272
|
+
raise TypeError(f"'{value}' is not matching expected type of '{formatted_type}'")
|
273
|
+
|
274
|
+
return validator
|
275
|
+
|
276
|
+
|
277
|
+
VALIDATORS: Mapping[Any, Callable[[AttributeAnnotation], Callable[[Any], Any]]] = {
|
278
|
+
Any: _prepare_validator_of_any,
|
279
|
+
NoneType: _prepare_validator_of_none,
|
280
|
+
Missing: _prepare_validator_of_missing,
|
281
|
+
type: _prepare_validator_of_type,
|
282
|
+
bool: _prepare_validator_of_type,
|
283
|
+
int: _prepare_validator_of_type,
|
284
|
+
float: _prepare_validator_of_type,
|
285
|
+
bytes: _prepare_validator_of_type,
|
286
|
+
str: _prepare_validator_of_type,
|
287
|
+
tuple: _prepare_validator_of_tuple,
|
288
|
+
frozenset: _prepare_validator_of_set,
|
289
|
+
Literal: _prepare_validator_of_literal,
|
290
|
+
Set: _prepare_validator_of_set,
|
291
|
+
Sequence: _prepare_validator_of_sequence,
|
292
|
+
Mapping: _prepare_validator_of_mapping,
|
293
|
+
UUID: _prepare_validator_of_type,
|
294
|
+
Union: _prepare_validator_of_union,
|
295
|
+
UnionType: _prepare_validator_of_union,
|
296
|
+
Callable: _prepare_validator_of_callable,
|
297
|
+
}
|
haiway/types/__init__.py
CHANGED
@@ -2,10 +2,10 @@ from haiway.types.frozen import frozenlist
|
|
2
2
|
from haiway.types.missing import MISSING, Missing, is_missing, not_missing, when_missing
|
3
3
|
|
4
4
|
__all__ = [
|
5
|
+
"MISSING",
|
6
|
+
"Missing",
|
5
7
|
"frozenlist",
|
6
8
|
"is_missing",
|
7
|
-
"Missing",
|
8
|
-
"MISSING",
|
9
9
|
"not_missing",
|
10
10
|
"when_missing",
|
11
11
|
]
|
haiway/utils/__init__.py
CHANGED
haiway/utils/env.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: haiway
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.6.1
|
4
4
|
Summary: Framework for dependency injection and state management within structured concurrency model.
|
5
5
|
Maintainer-email: Kacper Kaliński <kacper.kalinski@miquido.com>
|
6
6
|
License: MIT License
|
@@ -36,7 +36,8 @@ Requires-Python: >=3.12
|
|
36
36
|
Description-Content-Type: text/markdown
|
37
37
|
License-File: LICENSE
|
38
38
|
Provides-Extra: dev
|
39
|
-
Requires-Dist:
|
39
|
+
Requires-Dist: haiway; extra == "dev"
|
40
|
+
Requires-Dist: ruff~=0.8.0; extra == "dev"
|
40
41
|
Requires-Dist: pyright~=1.1; extra == "dev"
|
41
42
|
Requires-Dist: bandit~=1.7; extra == "dev"
|
42
43
|
Requires-Dist: pytest~=7.4; extra == "dev"
|
@@ -1,36 +1,36 @@
|
|
1
|
-
haiway/__init__.py,sha256=
|
1
|
+
haiway/__init__.py,sha256=QksN9EkQrmsYuOhkrKNYr-RMLDT7hixuplkLmJntIfc,1301
|
2
2
|
haiway/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
|
-
haiway/context/__init__.py,sha256=
|
4
|
-
haiway/context/access.py,sha256=
|
3
|
+
haiway/context/__init__.py,sha256=ZgQoQFUqfPDqeIbhS898C3dP02QzOCRmClVQpHaPTBA,336
|
4
|
+
haiway/context/access.py,sha256=CB-F9Yd6EAoJIqzMQGid9szww7aFiti5z6x0T79LV7k,14098
|
5
5
|
haiway/context/disposables.py,sha256=DZjnMp-wMfF-em2Wjhbm1MvXubNpuzFBT70BQNIxC7M,2019
|
6
6
|
haiway/context/metrics.py,sha256=z5p5ItzXhrYoF8lgC8u179oABBy66mPeCEJR_GKmrLg,10882
|
7
7
|
haiway/context/state.py,sha256=GxGwPQTK8FdSprBd83lQbA9veubp0o93_1Yk3gb7HMc,3000
|
8
8
|
haiway/context/tasks.py,sha256=xXtXIUwXOra0EePTdkcEbMOmpWwFcO3hCRfR_IfvAHk,1978
|
9
9
|
haiway/context/types.py,sha256=VvJA7wAPZ3ISpgyThVguioYUXqhHf0XkPfRd0M1ERiQ,142
|
10
|
-
haiway/helpers/__init__.py,sha256=
|
10
|
+
haiway/helpers/__init__.py,sha256=iiFTjGnVf6dB7Gry5FuS5SFiU1lGI09JBTGoa3sozLI,473
|
11
11
|
haiway/helpers/asynchrony.py,sha256=rh_Hwo0MQHfKnw5dLUCFTAm3Fk3SVS8Or8cTcQFdPA8,6042
|
12
12
|
haiway/helpers/caching.py,sha256=Ok_WE5Whe7XqnIuLZo4rNNBFeWap-aUWX799s4b1JAQ,9536
|
13
13
|
haiway/helpers/retries.py,sha256=gIkyUlqJLDYaxIZd3qzeqGFY9y5Gp8dgZLlZ6hs8hoc,7538
|
14
14
|
haiway/helpers/throttling.py,sha256=zo0OwFq64si5KUwhd58cFHLmGAmYwRbFRJMbv9suhPs,3844
|
15
15
|
haiway/helpers/timeouted.py,sha256=1xU09hQnFdj6p48BwZl5xUvtIr3zC0ZUXehkdrduCjs,3074
|
16
|
-
haiway/helpers/tracing.py,sha256=
|
17
|
-
haiway/state/__init__.py,sha256=
|
18
|
-
haiway/state/attributes.py,sha256=
|
19
|
-
haiway/state/structure.py,sha256=
|
20
|
-
haiway/state/validation.py,sha256=
|
21
|
-
haiway/types/__init__.py,sha256=
|
16
|
+
haiway/helpers/tracing.py,sha256=eQpkIoGSB51jRF8RcLaihvHX3VzJIRdyRxTx3I14Pzg,3346
|
17
|
+
haiway/state/__init__.py,sha256=nPVHBySLuOdIL1VSIs-mo64s53xYHIbieELhw8mQgyc,204
|
18
|
+
haiway/state/attributes.py,sha256=gS4sEp50bDLAb3Y477BvagobvgMekUkiZZ64ZX6Avac,13613
|
19
|
+
haiway/state/structure.py,sha256=r8q2d3ro3C0kKYrdx9IE-bY2mKMVRwYC7d5Oeazj83Y,7289
|
20
|
+
haiway/state/validation.py,sha256=3vCXvr6dBBOS5W482PsLLY801jq2NMgEc-EVkg6LzUA,8264
|
21
|
+
haiway/types/__init__.py,sha256=00Ulp2BxcIWm9vWXKQPodpFEwE8hpqj6OYgrNxelp5s,252
|
22
22
|
haiway/types/frozen.py,sha256=CZhFCXnWAKEhuWSfILxA8smfdpMd5Ku694ycfLh98R8,76
|
23
23
|
haiway/types/missing.py,sha256=JiXo5xdi7H-PbIJr0fuK5wpOuQZhjrDYUkMlfIFcsaE,1705
|
24
|
-
haiway/utils/__init__.py,sha256=
|
24
|
+
haiway/utils/__init__.py,sha256=2-qlRK876IIfLIn24SxZ_8zKvkmTmBimurNOQLN9rNw,608
|
25
25
|
haiway/utils/always.py,sha256=2abp8Lm9rQkrfS3rm1Iqhb-IcWyVfH1BULab3KMxgOw,1234
|
26
|
-
haiway/utils/env.py,sha256=
|
26
|
+
haiway/utils/env.py,sha256=lhJZphHhb32jgbTrMO58g-tK_UDTulAP-rhpJMFdfGQ,3136
|
27
27
|
haiway/utils/immutable.py,sha256=K34ZIMzbkpgkHKH-KF73plEbXExsajNRkRTYp9nJEf4,620
|
28
28
|
haiway/utils/logs.py,sha256=oDsc1ZdqKDjlTlctLbDcp9iX98Acr-1tdw-Pyg3DElo,1577
|
29
29
|
haiway/utils/mimic.py,sha256=BkVjTVP2TxxC8GChPGyDV6UXVwJmiRiSWeOYZNZFHxs,1828
|
30
30
|
haiway/utils/noop.py,sha256=qgbZlOKWY6_23Zs43OLukK2HagIQKRyR04zrFVm5rWI,344
|
31
31
|
haiway/utils/queue.py,sha256=oQ3GXCJ-PGNtMEr6EPdgqAvYZoj8lAa7Z2drBKBEoBM,2345
|
32
|
-
haiway-0.
|
33
|
-
haiway-0.
|
34
|
-
haiway-0.
|
35
|
-
haiway-0.
|
36
|
-
haiway-0.
|
32
|
+
haiway-0.6.1.dist-info/LICENSE,sha256=GehQEW_I1pkmxkkj3NEa7rCTQKYBn7vTPabpDYJlRuo,1063
|
33
|
+
haiway-0.6.1.dist-info/METADATA,sha256=IGAF9VfS0SEIyN8N6JUnuCcpPQNY7A9fovFapfJ6_ck,3898
|
34
|
+
haiway-0.6.1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
35
|
+
haiway-0.6.1.dist-info/top_level.txt,sha256=_LdXVLzUzgkvAGQnQJj5kQfoFhpPW6EF4Kj9NapniLg,7
|
36
|
+
haiway-0.6.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|