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 CHANGED
@@ -43,16 +43,23 @@ from haiway.utils import (
43
43
  )
44
44
 
45
45
  __all__ = [
46
- "always",
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",
@@ -4,10 +4,10 @@ from haiway.context.metrics import ScopeMetrics
4
4
  from haiway.context.types import MissingContext, MissingState
5
5
 
6
6
  __all__ = [
7
- "ctx",
8
7
  "Disposable",
9
8
  "Disposables",
10
9
  "MissingContext",
11
10
  "MissingState",
12
11
  "ScopeMetrics",
12
+ "ctx",
13
13
  ]
haiway/context/access.py CHANGED
@@ -1,8 +1,4 @@
1
- from asyncio import (
2
- CancelledError,
3
- Task,
4
- current_task,
5
- )
1
+ from asyncio import CancelledError, Task, current_task
6
2
  from collections.abc import (
7
3
  AsyncGenerator,
8
4
  AsyncIterator,
@@ -7,9 +7,9 @@ from haiway.helpers.tracing import ArgumentsTrace, ResultTrace, traced
7
7
 
8
8
  __all__ = [
9
9
  "ArgumentsTrace",
10
+ "ResultTrace",
10
11
  "asynchronous",
11
12
  "cache",
12
- "ResultTrace",
13
13
  "retry",
14
14
  "throttle",
15
15
  "timeout",
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: tuple[Any, ...] | Missing
37
- kwargs: dict[str, Any] | Missing
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
@@ -2,7 +2,7 @@ from haiway.state.attributes import AttributeAnnotation, attribute_annotations
2
2
  from haiway.state.structure import State
3
3
 
4
4
  __all__ = [
5
- "attribute_annotations",
6
5
  "AttributeAnnotation",
7
6
  "State",
7
+ "attribute_annotations",
8
8
  ]
@@ -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 attribute_type_validator
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=attribute_type_validator(annotation),
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__(
@@ -1,119 +1,106 @@
1
- import types
2
- import typing
3
- from collections.abc import Callable, Sequence
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
- "attribute_type_validator",
10
+ "attribute_validator",
11
11
  ]
12
12
 
13
13
 
14
- def attribute_type_validator( # noqa: PLR0911
14
+ def attribute_validator(
15
15
  annotation: AttributeAnnotation,
16
16
  /,
17
17
  ) -> Callable[[Any], Any]:
18
- match annotation.origin:
19
- case types.NoneType:
20
- return _none_validator
18
+ if validator := VALIDATORS.get(annotation.origin):
19
+ return validator(annotation)
21
20
 
22
- case _types.Missing:
23
- return _missing_validator
21
+ elif hasattr(annotation.origin, "__IMMUTABLE__"):
22
+ return _prepare_validator_of_type(annotation)
24
23
 
25
- case types.UnionType:
26
- return _prepare_union_validator(annotation.arguments)
24
+ elif issubclass(annotation.origin, Protocol):
25
+ return _prepare_validator_of_type(annotation)
27
26
 
28
- case typing.Literal:
29
- return _prepare_literal_validator(annotation.arguments)
27
+ elif issubclass(annotation.origin, Enum):
28
+ return _prepare_validator_of_type(annotation)
30
29
 
31
- case typing.Any:
32
- return _any_validator
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
- case type() as other_type:
39
- return _prepare_type_validator(other_type)
40
-
41
- case other:
42
- raise TypeError(f"Unsupported type annotation: {other}")
43
-
44
-
45
- def _none_validator(
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
- case _:
64
- raise TypeError(f"Type '{type(value)}' is not matching expected type 'Missing'")
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
- def _any_validator(
68
- value: Any,
69
- ) -> Any:
70
- return value # any is always valid
59
+ return validator
71
60
 
72
61
 
73
- def _prepare_union_validator(
74
- elements: Sequence[AttributeAnnotation],
62
+ def _prepare_validator_of_missing(
63
+ annotation: AttributeAnnotation,
75
64
  /,
76
65
  ) -> Callable[[Any], Any]:
77
- validators: list[Callable[[Any], Any]] = [
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
- errors: list[Exception] = []
85
- for validator in validators:
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
- raise ExceptionGroup("Multiple errors", errors)
72
+ else:
73
+ raise TypeError(f"'{value}' is not matching expected type of 'Missing'")
93
74
 
94
- return union_validator
75
+ return validator
95
76
 
96
77
 
97
- def _prepare_literal_validator(
98
- elements: Sequence[Any],
78
+ def _prepare_validator_of_literal(
79
+ annotation: AttributeAnnotation,
99
80
  /,
100
81
  ) -> Callable[[Any], Any]:
101
- def literal_validator(
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"Value '{value}' is not matching expected '{elements}'")
92
+ raise ValueError(f"'{value}' is not matching expected values of '{formatted_type}'")
109
93
 
110
- return literal_validator
94
+ return validator
111
95
 
112
96
 
113
- def _prepare_type_validator(
114
- validated_type: type[Any],
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 _prepare_typed_dict_validator(
133
- validated_type: type[Any],
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
- def typed_dict_validator(
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 value if isinstance(value, dict):
141
- # for typed dicts check only if that is a dict
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
- f"Type '{type(value)}' is not matching expected type '{validated_type}'"
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
- return typed_dict_validator
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
@@ -7,10 +7,10 @@ from haiway.utils.noop import async_noop, noop
7
7
  from haiway.utils.queue import AsyncQueue
8
8
 
9
9
  __all__ = [
10
+ "AsyncQueue",
10
11
  "always",
11
12
  "async_always",
12
13
  "async_noop",
13
- "AsyncQueue",
14
14
  "freeze",
15
15
  "getenv_bool",
16
16
  "getenv_float",
haiway/utils/env.py CHANGED
@@ -3,8 +3,8 @@ from typing import overload
3
3
 
4
4
  __all__ = [
5
5
  "getenv_bool",
6
- "getenv_int",
7
6
  "getenv_float",
7
+ "getenv_int",
8
8
  "getenv_str",
9
9
  "load_env",
10
10
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: haiway
3
- Version: 0.5.3
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: ruff~=0.5.0; extra == "dev"
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=ll2vI5w5LYylT0jdTE8_clfQJ2rpL4GKh8tR3Lr80j0,1301
1
+ haiway/__init__.py,sha256=QksN9EkQrmsYuOhkrKNYr-RMLDT7hixuplkLmJntIfc,1301
2
2
  haiway/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- haiway/context/__init__.py,sha256=21Y3zvRo1bHASZD6B_FNkU28k1-g88RdmUyqxvYXJxg,336
4
- haiway/context/access.py,sha256=zPQcQBp5XMlNuszbxhtzi-5mNpDLpZ6PT-gVFDBH0dA,14115
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=ZKa1_xreEVRcYrPTuPn5MRe-WrVFZ_FojswEtMqD5Qw,473
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=yiK8MdDyX_fmpK9Zu5-IiZae5E8ReKQtRBBenXIPVqQ,3326
17
- haiway/state/__init__.py,sha256=dh7l_ZImy0uHHDGD-fzMhQFmz_ej8WU8WEE2OmIoyVM,204
18
- haiway/state/attributes.py,sha256=kkIYNlvWCM1NkgiCbE6gZDwgBVOk_TkmqWv67MmU0to,13399
19
- haiway/state/structure.py,sha256=l8iYMCLEg5v1JVMwZ4R-YAXoQQZWkbWZyN6LcnzKqPQ,7237
20
- haiway/state/validation.py,sha256=Z6kp_KjTnnP9eVWsLmzKkEQLZkhFCOSphjdbr6VxLFQ,3628
21
- haiway/types/__init__.py,sha256=cAJQzDgFi8AKRqpzY3HWrutaPR69tnJqeJK_mQVtYUk,252
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=UA9h8YDvYI5rYujvsIS9t5Q-SWYImmk30uhR_42flqs,608
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=lKPOBZWyRD_gQariDGBjVLYTm0740nytPCSQpK2oRyE,3136
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.5.3.dist-info/LICENSE,sha256=GehQEW_I1pkmxkkj3NEa7rCTQKYBn7vTPabpDYJlRuo,1063
33
- haiway-0.5.3.dist-info/METADATA,sha256=EIKsHf3PK90WS36SFw_O25suR9ko6Te59KooRXCQFf8,3860
34
- haiway-0.5.3.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
35
- haiway-0.5.3.dist-info/top_level.txt,sha256=_LdXVLzUzgkvAGQnQJj5kQfoFhpPW6EF4Kj9NapniLg,7
36
- haiway-0.5.3.dist-info/RECORD,,
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