haiway 0.5.3__py3-none-any.whl → 0.6.0__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 +230 -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.0.dist-info}/METADATA +3 -2
- {haiway-0.5.3.dist-info → haiway-0.6.0.dist-info}/RECORD +17 -17
- {haiway-0.5.3.dist-info → haiway-0.6.0.dist-info}/LICENSE +0 -0
- {haiway-0.5.3.dist-info → haiway-0.6.0.dist-info}/WHEEL +0 -0
- {haiway-0.5.3.dist-info → haiway-0.6.0.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,106 @@
|
|
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
5
|
|
6
|
-
from haiway import types as _types
|
7
6
|
from haiway.state.attributes import AttributeAnnotation
|
7
|
+
from haiway.types import MISSING, Missing
|
8
8
|
|
9
9
|
__all__ = [
|
10
|
-
"
|
10
|
+
"attribute_validator",
|
11
11
|
]
|
12
12
|
|
13
13
|
|
14
|
-
def
|
14
|
+
def attribute_validator(
|
15
15
|
annotation: AttributeAnnotation,
|
16
16
|
/,
|
17
17
|
) -> Callable[[Any], Any]:
|
18
|
-
|
19
|
-
|
20
|
-
return _none_validator
|
18
|
+
if validator := VALIDATORS.get(annotation.origin):
|
19
|
+
return validator(annotation)
|
21
20
|
|
22
|
-
|
23
|
-
|
21
|
+
elif hasattr(annotation.origin, "__IMMUTABLE__"):
|
22
|
+
return _prepare_validator_of_type(annotation)
|
24
23
|
|
25
|
-
|
26
|
-
|
24
|
+
elif issubclass(annotation.origin, Protocol):
|
25
|
+
return _prepare_validator_of_type(annotation)
|
27
26
|
|
28
|
-
|
29
|
-
|
27
|
+
elif issubclass(annotation.origin, Enum):
|
28
|
+
return _prepare_validator_of_type(annotation)
|
30
29
|
|
31
|
-
|
32
|
-
|
30
|
+
else:
|
31
|
+
raise TypeError(f"Unsupported type annotation: {annotation}")
|
33
32
|
|
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
33
|
|
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'")
|
34
|
+
def _prepare_validator_of_any(
|
35
|
+
annotation: AttributeAnnotation,
|
36
|
+
/,
|
37
|
+
) -> Callable[[Any], Any]:
|
38
|
+
def validator(
|
39
|
+
value: Any,
|
40
|
+
) -> Any:
|
41
|
+
return value # any is always valid
|
54
42
|
|
43
|
+
return validator
|
55
44
|
|
56
|
-
def _missing_validator(
|
57
|
-
value: Any,
|
58
|
-
) -> Any:
|
59
|
-
match value:
|
60
|
-
case _types.Missing():
|
61
|
-
return _types.MISSING
|
62
45
|
|
63
|
-
|
64
|
-
|
46
|
+
def _prepare_validator_of_none(
|
47
|
+
annotation: AttributeAnnotation,
|
48
|
+
/,
|
49
|
+
) -> Callable[[Any], Any]:
|
50
|
+
def validator(
|
51
|
+
value: Any,
|
52
|
+
) -> Any:
|
53
|
+
if value is None:
|
54
|
+
return value
|
65
55
|
|
56
|
+
else:
|
57
|
+
raise TypeError(f"'{value}' is not matching expected type of 'None'")
|
66
58
|
|
67
|
-
|
68
|
-
value: Any,
|
69
|
-
) -> Any:
|
70
|
-
return value # any is always valid
|
59
|
+
return validator
|
71
60
|
|
72
61
|
|
73
|
-
def
|
74
|
-
|
62
|
+
def _prepare_validator_of_missing(
|
63
|
+
annotation: AttributeAnnotation,
|
75
64
|
/,
|
76
65
|
) -> Callable[[Any], Any]:
|
77
|
-
|
78
|
-
attribute_type_validator(alternative) for alternative in elements
|
79
|
-
]
|
80
|
-
|
81
|
-
def union_validator(
|
66
|
+
def validator(
|
82
67
|
value: Any,
|
83
68
|
) -> Any:
|
84
|
-
|
85
|
-
|
86
|
-
try:
|
87
|
-
return validator(value)
|
88
|
-
|
89
|
-
except Exception as exc:
|
90
|
-
errors.append(exc)
|
69
|
+
if value is MISSING:
|
70
|
+
return value
|
91
71
|
|
92
|
-
|
72
|
+
else:
|
73
|
+
raise TypeError(f"'{value}' is not matching expected type of 'Missing'")
|
93
74
|
|
94
|
-
return
|
75
|
+
return validator
|
95
76
|
|
96
77
|
|
97
|
-
def
|
98
|
-
|
78
|
+
def _prepare_validator_of_literal(
|
79
|
+
annotation: AttributeAnnotation,
|
99
80
|
/,
|
100
81
|
) -> Callable[[Any], Any]:
|
101
|
-
|
82
|
+
elements: list[Any] = annotation.arguments
|
83
|
+
formatted_type: str = str(annotation)
|
84
|
+
|
85
|
+
def validator(
|
102
86
|
value: Any,
|
103
87
|
) -> Any:
|
104
88
|
if value in elements:
|
105
89
|
return value
|
106
90
|
|
107
91
|
else:
|
108
|
-
raise ValueError(f"
|
92
|
+
raise ValueError(f"'{value}' is not matching expected values of '{formatted_type}'")
|
109
93
|
|
110
|
-
return
|
94
|
+
return validator
|
111
95
|
|
112
96
|
|
113
|
-
def
|
114
|
-
|
97
|
+
def _prepare_validator_of_type(
|
98
|
+
annotation: AttributeAnnotation,
|
115
99
|
/,
|
116
100
|
) -> Callable[[Any], Any]:
|
101
|
+
validated_type: type[Any] = annotation.origin
|
102
|
+
formatted_type: str = str(annotation)
|
103
|
+
|
117
104
|
def type_validator(
|
118
105
|
value: Any,
|
119
106
|
) -> Any:
|
@@ -122,28 +109,187 @@ def _prepare_type_validator(
|
|
122
109
|
return value
|
123
110
|
|
124
111
|
case _:
|
125
|
-
raise TypeError(
|
126
|
-
f"Type '{type(value)}' is not matching expected type '{validated_type}'"
|
127
|
-
)
|
112
|
+
raise TypeError(f"'{value}' is not matching expected type of '{formatted_type}'")
|
128
113
|
|
129
114
|
return type_validator
|
130
115
|
|
131
116
|
|
132
|
-
def
|
133
|
-
|
117
|
+
def _prepare_validator_of_set(
|
118
|
+
annotation: AttributeAnnotation,
|
119
|
+
/,
|
120
|
+
) -> Callable[[Any], Any]:
|
121
|
+
element_validator: Callable[[Any], Any] = attribute_validator(annotation.arguments[0])
|
122
|
+
formatted_type: str = str(annotation)
|
123
|
+
|
124
|
+
def validator(
|
125
|
+
value: Any,
|
126
|
+
) -> Any:
|
127
|
+
if isinstance(value, Set):
|
128
|
+
return frozenset(element_validator(element) for element in value) # pyright: ignore[reportUnknownVariableType]
|
129
|
+
|
130
|
+
else:
|
131
|
+
raise TypeError(f"'{value}' is not matching expected type of '{formatted_type}'")
|
132
|
+
|
133
|
+
return validator
|
134
|
+
|
135
|
+
|
136
|
+
def _prepare_validator_of_sequence(
|
137
|
+
annotation: AttributeAnnotation,
|
134
138
|
/,
|
135
139
|
) -> Callable[[Any], Any]:
|
136
|
-
|
140
|
+
element_validator: Callable[[Any], Any] = attribute_validator(annotation.arguments[0])
|
141
|
+
formatted_type: str = str(annotation)
|
142
|
+
|
143
|
+
def validator(
|
137
144
|
value: Any,
|
138
145
|
) -> Any:
|
139
146
|
match value:
|
140
|
-
case
|
141
|
-
|
142
|
-
return value # pyright: ignore[reportUnknownVariableType]
|
147
|
+
case [*elements]:
|
148
|
+
return tuple(element_validator(element) for element in elements)
|
143
149
|
|
144
150
|
case _:
|
145
|
-
raise TypeError(
|
146
|
-
|
151
|
+
raise TypeError(f"'{value}' is not matching expected type of '{formatted_type}'")
|
152
|
+
|
153
|
+
return validator
|
154
|
+
|
155
|
+
|
156
|
+
def _prepare_validator_of_mapping(
|
157
|
+
annotation: AttributeAnnotation,
|
158
|
+
/,
|
159
|
+
) -> Callable[[Any], Any]:
|
160
|
+
key_validator: Callable[[Any], Any] = attribute_validator(annotation.arguments[0])
|
161
|
+
value_validator: Callable[[Any], Any] = attribute_validator(annotation.arguments[1])
|
162
|
+
formatted_type: str = str(annotation)
|
163
|
+
|
164
|
+
def validator(
|
165
|
+
value: Any,
|
166
|
+
) -> Any:
|
167
|
+
match value:
|
168
|
+
case {**elements}:
|
169
|
+
return MappingProxyType(
|
170
|
+
{key_validator(key): value_validator(value) for key, value in elements}
|
147
171
|
)
|
148
172
|
|
149
|
-
|
173
|
+
case _:
|
174
|
+
raise TypeError(f"'{value}' is not matching expected type of '{formatted_type}'")
|
175
|
+
|
176
|
+
return validator
|
177
|
+
|
178
|
+
|
179
|
+
def _prepare_validator_of_tuple(
|
180
|
+
annotation: AttributeAnnotation,
|
181
|
+
/,
|
182
|
+
) -> Callable[[Any], Any]:
|
183
|
+
if annotation.arguments[-1].origin == Ellipsis:
|
184
|
+
element_validator: Callable[[Any], Any] = attribute_validator(annotation.arguments[0])
|
185
|
+
formatted_type: str = str(annotation)
|
186
|
+
|
187
|
+
def validator(
|
188
|
+
value: Any,
|
189
|
+
) -> Any:
|
190
|
+
match value:
|
191
|
+
case [*elements]:
|
192
|
+
return tuple(element_validator(element) for element in elements)
|
193
|
+
|
194
|
+
case _:
|
195
|
+
raise TypeError(
|
196
|
+
f"'{value}' is not matching expected type of '{formatted_type}'"
|
197
|
+
)
|
198
|
+
|
199
|
+
return validator
|
200
|
+
|
201
|
+
else:
|
202
|
+
element_validators: list[Callable[[Any], Any]] = [
|
203
|
+
attribute_validator(alternative) for alternative in annotation.arguments
|
204
|
+
]
|
205
|
+
elements_count: int = len(element_validators)
|
206
|
+
formatted_type: str = str(annotation)
|
207
|
+
|
208
|
+
def validator(
|
209
|
+
value: Any,
|
210
|
+
) -> Any:
|
211
|
+
match value:
|
212
|
+
case [*elements]:
|
213
|
+
if len(elements) != elements_count:
|
214
|
+
raise ValueError(
|
215
|
+
f"'{value}' is not matching expected type of '{formatted_type}'"
|
216
|
+
)
|
217
|
+
|
218
|
+
return tuple(
|
219
|
+
element_validators[idx](value) for idx, value in enumerate(elements)
|
220
|
+
)
|
221
|
+
|
222
|
+
case _:
|
223
|
+
raise TypeError(
|
224
|
+
f"'{value}' is not matching expected type of '{formatted_type}'"
|
225
|
+
)
|
226
|
+
|
227
|
+
return validator
|
228
|
+
|
229
|
+
|
230
|
+
def _prepare_validator_of_union(
|
231
|
+
annotation: AttributeAnnotation,
|
232
|
+
/,
|
233
|
+
) -> Callable[[Any], Any]:
|
234
|
+
validators: list[Callable[[Any], Any]] = [
|
235
|
+
attribute_validator(alternative) for alternative in annotation.arguments
|
236
|
+
]
|
237
|
+
formatted_type: str = str(annotation)
|
238
|
+
|
239
|
+
def validator(
|
240
|
+
value: Any,
|
241
|
+
) -> Any:
|
242
|
+
errors: list[Exception] = []
|
243
|
+
for validator in validators:
|
244
|
+
try:
|
245
|
+
return validator(value)
|
246
|
+
|
247
|
+
except Exception as exc:
|
248
|
+
errors.append(exc)
|
249
|
+
|
250
|
+
raise ExceptionGroup(
|
251
|
+
f"'{value}' is not matching expected type of '{formatted_type}'",
|
252
|
+
errors,
|
253
|
+
)
|
254
|
+
|
255
|
+
return validator
|
256
|
+
|
257
|
+
|
258
|
+
def _prepare_validator_of_callable(
|
259
|
+
annotation: AttributeAnnotation,
|
260
|
+
/,
|
261
|
+
) -> Callable[[Any], Any]:
|
262
|
+
formatted_type: str = str(annotation)
|
263
|
+
|
264
|
+
def validator(
|
265
|
+
value: Any,
|
266
|
+
) -> Any:
|
267
|
+
if callable(value):
|
268
|
+
return value
|
269
|
+
|
270
|
+
else:
|
271
|
+
raise TypeError(f"'{value}' is not matching expected type of '{formatted_type}'")
|
272
|
+
|
273
|
+
return validator
|
274
|
+
|
275
|
+
|
276
|
+
VALIDATORS: Mapping[Any, Callable[[AttributeAnnotation], Callable[[Any], Any]]] = {
|
277
|
+
Any: _prepare_validator_of_any,
|
278
|
+
NoneType: _prepare_validator_of_none,
|
279
|
+
Missing: _prepare_validator_of_missing,
|
280
|
+
type: _prepare_validator_of_type,
|
281
|
+
bool: _prepare_validator_of_type,
|
282
|
+
int: _prepare_validator_of_type,
|
283
|
+
float: _prepare_validator_of_type,
|
284
|
+
bytes: _prepare_validator_of_type,
|
285
|
+
str: _prepare_validator_of_type,
|
286
|
+
tuple: _prepare_validator_of_tuple,
|
287
|
+
frozenset: _prepare_validator_of_set,
|
288
|
+
Literal: _prepare_validator_of_literal,
|
289
|
+
Set: _prepare_validator_of_set,
|
290
|
+
Sequence: _prepare_validator_of_sequence,
|
291
|
+
Mapping: _prepare_validator_of_mapping,
|
292
|
+
Union: _prepare_validator_of_union,
|
293
|
+
UnionType: _prepare_validator_of_union,
|
294
|
+
Callable: _prepare_validator_of_callable,
|
295
|
+
}
|
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.0
|
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=YLLVkWvaaa0qCTo4a_K1WzHLiVEjo20NQjXpCX8cwQw,8204
|
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.0.dist-info/LICENSE,sha256=GehQEW_I1pkmxkkj3NEa7rCTQKYBn7vTPabpDYJlRuo,1063
|
33
|
+
haiway-0.6.0.dist-info/METADATA,sha256=9ij3EzDBXOeiRLTfn28eh3_0UGWkI5zDZQWaQSHWdtU,3898
|
34
|
+
haiway-0.6.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
35
|
+
haiway-0.6.0.dist-info/top_level.txt,sha256=_LdXVLzUzgkvAGQnQJj5kQfoFhpPW6EF4Kj9NapniLg,7
|
36
|
+
haiway-0.6.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|