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 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,107 @@
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
+ 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
- "attribute_type_validator",
11
+ "attribute_validator",
11
12
  ]
12
13
 
13
14
 
14
- def attribute_type_validator( # noqa: PLR0911
15
+ def attribute_validator(
15
16
  annotation: AttributeAnnotation,
16
17
  /,
17
18
  ) -> Callable[[Any], Any]:
18
- match annotation.origin:
19
- case types.NoneType:
20
- return _none_validator
19
+ if validator := VALIDATORS.get(annotation.origin):
20
+ return validator(annotation)
21
21
 
22
- case _types.Missing:
23
- return _missing_validator
22
+ elif hasattr(annotation.origin, "__IMMUTABLE__"):
23
+ return _prepare_validator_of_type(annotation)
24
24
 
25
- case types.UnionType:
26
- return _prepare_union_validator(annotation.arguments)
25
+ elif issubclass(annotation.origin, Protocol):
26
+ return _prepare_validator_of_type(annotation)
27
27
 
28
- case typing.Literal:
29
- return _prepare_literal_validator(annotation.arguments)
28
+ elif issubclass(annotation.origin, Enum):
29
+ return _prepare_validator_of_type(annotation)
30
30
 
31
- case typing.Any:
32
- return _any_validator
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
- 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'")
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
- case _:
64
- raise TypeError(f"Type '{type(value)}' is not matching expected type 'Missing'")
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
- def _any_validator(
68
- value: Any,
69
- ) -> Any:
70
- return value # any is always valid
60
+ return validator
71
61
 
72
62
 
73
- def _prepare_union_validator(
74
- elements: Sequence[AttributeAnnotation],
63
+ def _prepare_validator_of_missing(
64
+ annotation: AttributeAnnotation,
75
65
  /,
76
66
  ) -> Callable[[Any], Any]:
77
- validators: list[Callable[[Any], Any]] = [
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
- errors: list[Exception] = []
85
- for validator in validators:
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
- raise ExceptionGroup("Multiple errors", errors)
73
+ else:
74
+ raise TypeError(f"'{value}' is not matching expected type of 'Missing'")
93
75
 
94
- return union_validator
76
+ return validator
95
77
 
96
78
 
97
- def _prepare_literal_validator(
98
- elements: Sequence[Any],
79
+ def _prepare_validator_of_literal(
80
+ annotation: AttributeAnnotation,
99
81
  /,
100
82
  ) -> Callable[[Any], Any]:
101
- def literal_validator(
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"Value '{value}' is not matching expected '{elements}'")
93
+ raise ValueError(f"'{value}' is not matching expected values of '{formatted_type}'")
109
94
 
110
- return literal_validator
95
+ return validator
111
96
 
112
97
 
113
- def _prepare_type_validator(
114
- validated_type: type[Any],
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 _prepare_typed_dict_validator(
133
- validated_type: type[Any],
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
- def typed_dict_validator(
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 value if isinstance(value, dict):
141
- # for typed dicts check only if that is a dict
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
- f"Type '{type(value)}' is not matching expected type '{validated_type}'"
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
- return typed_dict_validator
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
@@ -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.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: 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=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=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.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