haiway 0.25.1__py3-none-any.whl → 0.26.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 +2 -4
- haiway/context/__init__.py +2 -2
- haiway/context/access.py +152 -198
- haiway/context/presets.py +104 -86
- haiway/context/state.py +2 -42
- haiway/helpers/__init__.py +0 -2
- haiway/helpers/concurrent.py +8 -9
- haiway/helpers/files.py +4 -4
- {haiway-0.25.1.dist-info → haiway-0.26.1.dist-info}/METADATA +1 -1
- {haiway-0.25.1.dist-info → haiway-0.26.1.dist-info}/RECORD +12 -13
- haiway/helpers/tracing.py +0 -185
- {haiway-0.25.1.dist-info → haiway-0.26.1.dist-info}/WHEEL +0 -0
- {haiway-0.25.1.dist-info → haiway-0.26.1.dist-info}/licenses/LICENSE +0 -0
haiway/context/presets.py
CHANGED
@@ -1,32 +1,32 @@
|
|
1
|
+
from asyncio import gather
|
1
2
|
from collections.abc import Collection, Iterable, Mapping
|
2
3
|
from contextvars import ContextVar, Token
|
3
4
|
from types import TracebackType
|
4
5
|
from typing import ClassVar, Protocol, Self, cast
|
5
6
|
|
6
7
|
from haiway.context.disposables import Disposable, Disposables
|
8
|
+
from haiway.context.state import StateContext
|
7
9
|
from haiway.state import Immutable, State
|
8
|
-
from haiway.types.default import Default
|
9
10
|
|
10
11
|
__all__ = (
|
11
|
-
"
|
12
|
-
"
|
13
|
-
"ContextPresetsRegistryContext",
|
12
|
+
"ContextPreset",
|
13
|
+
"ContextPresetRegistryContext",
|
14
14
|
)
|
15
15
|
|
16
16
|
|
17
|
-
class
|
17
|
+
class ContextPresetStatePreparing(Protocol):
|
18
18
|
async def __call__(self) -> Iterable[State] | State: ...
|
19
19
|
|
20
20
|
|
21
|
-
class
|
21
|
+
class ContextPresetDisposablesPreparing(Protocol):
|
22
22
|
async def __call__(self) -> Iterable[Disposable] | Disposable: ...
|
23
23
|
|
24
24
|
|
25
|
-
class
|
25
|
+
class ContextPreset(Immutable):
|
26
26
|
"""
|
27
27
|
A configuration preset for context scopes.
|
28
28
|
|
29
|
-
|
29
|
+
ContextPreset allows you to define reusable combinations of state and disposables
|
30
30
|
that can be applied to scopes by name. This provides a convenient way to manage
|
31
31
|
complex application configurations and resource setups.
|
32
32
|
|
@@ -43,15 +43,15 @@ class ContextPresets(Immutable):
|
|
43
43
|
Basic preset with static state:
|
44
44
|
|
45
45
|
>>> from haiway import State
|
46
|
-
>>> from haiway.context import
|
46
|
+
>>> from haiway.context import ContextPreset
|
47
47
|
>>>
|
48
48
|
>>> class DatabaseConfig(State):
|
49
49
|
... connection_string: str
|
50
50
|
... pool_size: int = 10
|
51
51
|
>>>
|
52
|
-
>>> db_preset =
|
52
|
+
>>> db_preset = ContextPreset(
|
53
53
|
... name="database",
|
54
|
-
...
|
54
|
+
... state=[DatabaseConfig(connection_string="postgresql://localhost/app")]
|
55
55
|
... )
|
56
56
|
|
57
57
|
Preset with dynamic state factory:
|
@@ -60,9 +60,9 @@ class ContextPresets(Immutable):
|
|
60
60
|
... # Load configuration from environment or config file
|
61
61
|
... return DatabaseConfig(connection_string=os.getenv("DB_URL"))
|
62
62
|
>>>
|
63
|
-
>>> dynamic_preset =
|
63
|
+
>>> dynamic_preset = ContextPreset(
|
64
64
|
... name="dynamic_db",
|
65
|
-
...
|
65
|
+
... state=[load_config]
|
66
66
|
... )
|
67
67
|
|
68
68
|
Preset with disposables:
|
@@ -80,10 +80,10 @@ class ContextPresets(Immutable):
|
|
80
80
|
>>> async def connection_factory():
|
81
81
|
... return database_connection()
|
82
82
|
>>>
|
83
|
-
>>> db_preset =
|
83
|
+
>>> db_preset = ContextPreset(
|
84
84
|
... name="database",
|
85
|
-
...
|
86
|
-
...
|
85
|
+
... state=[DatabaseConfig(connection_string="...")],
|
86
|
+
... disposables=[connection_factory]
|
87
87
|
... )
|
88
88
|
|
89
89
|
Using presets:
|
@@ -97,8 +97,31 @@ class ContextPresets(Immutable):
|
|
97
97
|
"""
|
98
98
|
|
99
99
|
name: str
|
100
|
-
_state: Collection[
|
101
|
-
_disposables: Collection[
|
100
|
+
_state: Collection[ContextPresetStatePreparing | State]
|
101
|
+
_disposables: Collection[ContextPresetDisposablesPreparing]
|
102
|
+
|
103
|
+
def __init__(
|
104
|
+
self,
|
105
|
+
name: str,
|
106
|
+
*,
|
107
|
+
state: Collection[ContextPresetStatePreparing | State] = (),
|
108
|
+
disposables: Collection[ContextPresetDisposablesPreparing] = (),
|
109
|
+
) -> None:
|
110
|
+
object.__setattr__(
|
111
|
+
self,
|
112
|
+
"name",
|
113
|
+
name,
|
114
|
+
)
|
115
|
+
object.__setattr__(
|
116
|
+
self,
|
117
|
+
"_state",
|
118
|
+
state,
|
119
|
+
)
|
120
|
+
object.__setattr__(
|
121
|
+
self,
|
122
|
+
"_disposables",
|
123
|
+
disposables,
|
124
|
+
)
|
102
125
|
|
103
126
|
def extended(
|
104
127
|
self,
|
@@ -114,38 +137,38 @@ class ContextPresets(Immutable):
|
|
114
137
|
Parameters
|
115
138
|
----------
|
116
139
|
other : Self
|
117
|
-
Another
|
140
|
+
Another ContextPreset instance to merge with this one.
|
118
141
|
|
119
142
|
Returns
|
120
143
|
-------
|
121
144
|
Self
|
122
|
-
A new
|
145
|
+
A new ContextPreset instance with combined state and disposables.
|
123
146
|
"""
|
124
147
|
return self.__class__(
|
125
148
|
name=self.name,
|
126
|
-
|
127
|
-
|
149
|
+
state=(*self._state, *other._state),
|
150
|
+
disposables=(*self._disposables, *other._disposables),
|
128
151
|
)
|
129
152
|
|
130
153
|
def with_state(
|
131
154
|
self,
|
132
|
-
*state:
|
155
|
+
*state: ContextPresetStatePreparing | State,
|
133
156
|
) -> Self:
|
134
157
|
"""
|
135
158
|
Create a new preset with additional state.
|
136
159
|
|
137
|
-
Returns a new
|
160
|
+
Returns a new ContextPreset instance with the provided state objects
|
138
161
|
or state factories added to the existing state collection.
|
139
162
|
|
140
163
|
Parameters
|
141
164
|
----------
|
142
|
-
*state :
|
165
|
+
*state : ContextPresetStatePreparing | State
|
143
166
|
Additional state objects or state factory functions to include.
|
144
167
|
|
145
168
|
Returns
|
146
169
|
-------
|
147
170
|
Self
|
148
|
-
A new
|
171
|
+
A new ContextPreset instance with the additional state, or the
|
149
172
|
same instance if no state was provided.
|
150
173
|
"""
|
151
174
|
if not state:
|
@@ -153,29 +176,29 @@ class ContextPresets(Immutable):
|
|
153
176
|
|
154
177
|
return self.__class__(
|
155
178
|
name=self.name,
|
156
|
-
|
157
|
-
|
179
|
+
state=(*self._state, *state),
|
180
|
+
disposables=self._disposables,
|
158
181
|
)
|
159
182
|
|
160
183
|
def with_disposable(
|
161
184
|
self,
|
162
|
-
*disposable:
|
185
|
+
*disposable: ContextPresetDisposablesPreparing,
|
163
186
|
) -> Self:
|
164
187
|
"""
|
165
188
|
Create a new preset with additional disposables.
|
166
189
|
|
167
|
-
Returns a new
|
190
|
+
Returns a new ContextPreset instance with the provided disposable
|
168
191
|
factory functions added to the existing disposables collection.
|
169
192
|
|
170
193
|
Parameters
|
171
194
|
----------
|
172
|
-
*disposable :
|
195
|
+
*disposable : ContextPresetDisposablesPreparing
|
173
196
|
Additional disposable factory functions to include.
|
174
197
|
|
175
198
|
Returns
|
176
199
|
-------
|
177
200
|
Self
|
178
|
-
A new
|
201
|
+
A new ContextPreset instance with the additional disposables, or the
|
179
202
|
same instance if no disposables were provided.
|
180
203
|
"""
|
181
204
|
if not disposable:
|
@@ -183,8 +206,8 @@ class ContextPresets(Immutable):
|
|
183
206
|
|
184
207
|
return self.__class__(
|
185
208
|
name=self.name,
|
186
|
-
|
187
|
-
|
209
|
+
state=self._state,
|
210
|
+
disposables=(*self._disposables, *disposable),
|
188
211
|
)
|
189
212
|
|
190
213
|
async def prepare(self) -> Disposables:
|
@@ -210,37 +233,48 @@ class ContextPresets(Immutable):
|
|
210
233
|
This method is called automatically when using presets with ctx.scope(),
|
211
234
|
so you typically don't need to call it directly.
|
212
235
|
"""
|
213
|
-
|
214
|
-
|
236
|
+
collected_state: Collection[State] = await self._collect_state()
|
237
|
+
|
238
|
+
collected_disposables: Collection[Disposable]
|
239
|
+
if collected_state:
|
240
|
+
# use available state immediately when preparing disposables
|
241
|
+
with StateContext.updated(collected_state):
|
242
|
+
collected_disposables = (
|
243
|
+
DisposableState(_state=collected_state),
|
244
|
+
*await self._collect_disposables(),
|
245
|
+
)
|
246
|
+
|
247
|
+
else:
|
248
|
+
collected_disposables = await self._collect_disposables()
|
249
|
+
|
250
|
+
return Disposables(*collected_disposables)
|
251
|
+
|
252
|
+
async def _collect_state(self) -> Collection[State]:
|
253
|
+
collected_state: list[State] = []
|
215
254
|
for state in self._state:
|
216
255
|
if isinstance(state, State):
|
217
|
-
|
256
|
+
collected_state.append(state)
|
257
|
+
|
218
258
|
else:
|
219
259
|
resolved_state: Iterable[State] | State = await state()
|
220
260
|
if isinstance(resolved_state, State):
|
221
|
-
|
261
|
+
collected_state.append(resolved_state)
|
222
262
|
|
223
263
|
else:
|
224
|
-
|
225
|
-
|
226
|
-
collected_disposables: list[Disposable]
|
227
|
-
if collected_states:
|
228
|
-
collected_disposables = [DisposableState(_state=collected_states)]
|
264
|
+
collected_state.extend(resolved_state)
|
229
265
|
|
230
|
-
|
231
|
-
collected_disposables = []
|
266
|
+
return collected_state
|
232
267
|
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
collected_disposables.append(cast(Disposable, resolved_disposable))
|
268
|
+
async def _collect_disposables(self) -> Collection[Disposable]:
|
269
|
+
collected_disposables: list[Disposable] = []
|
270
|
+
for disposable in await gather(*(factory() for factory in self._disposables)):
|
271
|
+
if hasattr(disposable, "__aenter__") and hasattr(disposable, "__aexit__"):
|
272
|
+
collected_disposables.append(cast(Disposable, disposable))
|
239
273
|
|
240
274
|
else:
|
241
|
-
collected_disposables.extend(cast(Iterable[Disposable],
|
275
|
+
collected_disposables.extend(cast(Iterable[Disposable], disposable))
|
242
276
|
|
243
|
-
return
|
277
|
+
return collected_disposables
|
244
278
|
|
245
279
|
|
246
280
|
class DisposableState(Immutable):
|
@@ -258,55 +292,32 @@ class DisposableState(Immutable):
|
|
258
292
|
pass
|
259
293
|
|
260
294
|
|
261
|
-
class
|
262
|
-
|
263
|
-
|
264
|
-
def __init__(
|
265
|
-
self,
|
266
|
-
presets: Collection[ContextPresets],
|
267
|
-
) -> None:
|
268
|
-
object.__setattr__(
|
269
|
-
self,
|
270
|
-
"_presets",
|
271
|
-
{preset.name: preset for preset in presets},
|
272
|
-
)
|
273
|
-
|
274
|
-
def select(
|
275
|
-
self,
|
276
|
-
name: str,
|
277
|
-
/,
|
278
|
-
) -> ContextPresets | None:
|
279
|
-
return self._presets.get(name)
|
280
|
-
|
281
|
-
|
282
|
-
class ContextPresetsRegistryContext(Immutable):
|
283
|
-
_context: ClassVar[ContextVar[ContextPresetsRegistry]] = ContextVar[ContextPresetsRegistry](
|
284
|
-
"ContextPresetsRegistryContext"
|
285
|
-
)
|
295
|
+
class ContextPresetRegistryContext(Immutable):
|
296
|
+
_context: ClassVar[ContextVar[Self]] = ContextVar[Self]("ContextPresetRegistryContext")
|
286
297
|
|
287
298
|
@classmethod
|
288
299
|
def select(
|
289
300
|
cls,
|
290
301
|
name: str,
|
291
302
|
/,
|
292
|
-
) ->
|
303
|
+
) -> ContextPreset | None:
|
293
304
|
try:
|
294
|
-
return cls._context.get().
|
305
|
+
return cls._context.get().preset(name)
|
295
306
|
|
296
307
|
except LookupError:
|
297
308
|
return None # no presets
|
298
309
|
|
299
|
-
_registry:
|
300
|
-
_token: Token[
|
310
|
+
_registry: Mapping[str, ContextPreset]
|
311
|
+
_token: Token[Self] | None = None
|
301
312
|
|
302
313
|
def __init__(
|
303
314
|
self,
|
304
|
-
|
315
|
+
presets: Iterable[ContextPreset],
|
305
316
|
) -> None:
|
306
317
|
object.__setattr__(
|
307
318
|
self,
|
308
319
|
"_registry",
|
309
|
-
|
320
|
+
{preset.name: preset for preset in presets},
|
310
321
|
)
|
311
322
|
object.__setattr__(
|
312
323
|
self,
|
@@ -314,12 +325,19 @@ class ContextPresetsRegistryContext(Immutable):
|
|
314
325
|
None,
|
315
326
|
)
|
316
327
|
|
328
|
+
def preset(
|
329
|
+
self,
|
330
|
+
name: str,
|
331
|
+
/,
|
332
|
+
) -> ContextPreset | None:
|
333
|
+
return self._registry.get(name)
|
334
|
+
|
317
335
|
def __enter__(self) -> None:
|
318
336
|
assert self._token is None, "Context reentrance is not allowed" # nosec: B101
|
319
337
|
object.__setattr__(
|
320
338
|
self,
|
321
339
|
"_token",
|
322
|
-
|
340
|
+
ContextPresetRegistryContext._context.set(self),
|
323
341
|
)
|
324
342
|
|
325
343
|
def __exit__(
|
@@ -329,7 +347,7 @@ class ContextPresetsRegistryContext(Immutable):
|
|
329
347
|
exc_tb: TracebackType | None,
|
330
348
|
) -> None:
|
331
349
|
assert self._token is not None, "Unbalanced context enter/exit" # nosec: B101
|
332
|
-
|
350
|
+
ContextPresetRegistryContext._context.reset(self._token) # pyright: ignore[reportArgumentType]
|
333
351
|
object.__setattr__(
|
334
352
|
self,
|
335
353
|
"_token",
|
haiway/context/state.py
CHANGED
@@ -1,13 +1,11 @@
|
|
1
|
-
from
|
2
|
-
from collections.abc import Callable, Collection, Coroutine, Iterable, MutableMapping
|
1
|
+
from collections.abc import Collection, Iterable, MutableMapping
|
3
2
|
from contextvars import ContextVar, Token
|
4
3
|
from threading import Lock
|
5
4
|
from types import TracebackType
|
6
|
-
from typing import
|
5
|
+
from typing import ClassVar, Self, cast
|
7
6
|
|
8
7
|
from haiway.context.types import MissingContext, MissingState
|
9
8
|
from haiway.state import Immutable, State
|
10
|
-
from haiway.utils.mimic import mimic_function
|
11
9
|
|
12
10
|
__all__ = (
|
13
11
|
"ScopeState",
|
@@ -356,41 +354,3 @@ class StateContext(Immutable):
|
|
356
354
|
"_token",
|
357
355
|
None,
|
358
356
|
)
|
359
|
-
|
360
|
-
@overload
|
361
|
-
def __call__[Result, **Arguments](
|
362
|
-
self,
|
363
|
-
function: Callable[Arguments, Coroutine[Any, Any, Result]],
|
364
|
-
) -> Callable[Arguments, Coroutine[Any, Any, Result]]: ...
|
365
|
-
|
366
|
-
@overload
|
367
|
-
def __call__[Result, **Arguments](
|
368
|
-
self,
|
369
|
-
function: Callable[Arguments, Result],
|
370
|
-
) -> Callable[Arguments, Result]: ...
|
371
|
-
|
372
|
-
def __call__[Result, **Arguments](
|
373
|
-
self,
|
374
|
-
function: Callable[Arguments, Coroutine[Any, Any, Result]] | Callable[Arguments, Result],
|
375
|
-
) -> Callable[Arguments, Coroutine[Any, Any, Result]] | Callable[Arguments, Result]:
|
376
|
-
if iscoroutinefunction(function):
|
377
|
-
|
378
|
-
async def async_context(
|
379
|
-
*args: Arguments.args,
|
380
|
-
**kwargs: Arguments.kwargs,
|
381
|
-
) -> Result:
|
382
|
-
with self:
|
383
|
-
return await function(*args, **kwargs)
|
384
|
-
|
385
|
-
return mimic_function(function, within=async_context)
|
386
|
-
|
387
|
-
else:
|
388
|
-
|
389
|
-
def sync_context(
|
390
|
-
*args: Arguments.args,
|
391
|
-
**kwargs: Arguments.kwargs,
|
392
|
-
) -> Result:
|
393
|
-
with self:
|
394
|
-
return function(*args, **kwargs) # pyright: ignore[reportReturnType]
|
395
|
-
|
396
|
-
return mimic_function(function, within=sync_context) # pyright: ignore[reportReturnType]
|
haiway/helpers/__init__.py
CHANGED
@@ -10,7 +10,6 @@ from haiway.helpers.observability import LoggerObservability
|
|
10
10
|
from haiway.helpers.retries import retry
|
11
11
|
from haiway.helpers.throttling import throttle
|
12
12
|
from haiway.helpers.timeouting import timeout
|
13
|
-
from haiway.helpers.tracing import traced
|
14
13
|
|
15
14
|
__all__ = (
|
16
15
|
"CacheMakeKey",
|
@@ -27,5 +26,4 @@ __all__ = (
|
|
27
26
|
"stream_concurrently",
|
28
27
|
"throttle",
|
29
28
|
"timeout",
|
30
|
-
"traced",
|
31
29
|
)
|
haiway/helpers/concurrent.py
CHANGED
@@ -3,8 +3,8 @@ from collections.abc import (
|
|
3
3
|
AsyncIterable,
|
4
4
|
AsyncIterator,
|
5
5
|
Callable,
|
6
|
-
Collection,
|
7
6
|
Coroutine,
|
7
|
+
Iterable,
|
8
8
|
MutableSequence,
|
9
9
|
Sequence,
|
10
10
|
)
|
@@ -20,7 +20,7 @@ __all__ = (
|
|
20
20
|
|
21
21
|
|
22
22
|
async def process_concurrently[Element]( # noqa: C901, PLR0912
|
23
|
-
source:
|
23
|
+
source: AsyncIterable[Element],
|
24
24
|
/,
|
25
25
|
handler: Callable[[Element], Coroutine[Any, Any, None]],
|
26
26
|
*,
|
@@ -80,8 +80,7 @@ async def process_concurrently[Element]( # noqa: C901, PLR0912
|
|
80
80
|
assert concurrent_tasks > 0 # nosec: B101
|
81
81
|
running: set[Task[None]] = set()
|
82
82
|
try:
|
83
|
-
|
84
|
-
element: Element = await anext(source)
|
83
|
+
async for element in source:
|
85
84
|
running.add(ctx.spawn(handler, element))
|
86
85
|
if len(running) < concurrent_tasks:
|
87
86
|
continue # keep spawning tasks
|
@@ -132,7 +131,7 @@ async def process_concurrently[Element]( # noqa: C901, PLR0912
|
|
132
131
|
async def execute_concurrently[Element, Result](
|
133
132
|
handler: Callable[[Element], Coroutine[Any, Any, Result]],
|
134
133
|
/,
|
135
|
-
elements:
|
134
|
+
elements: Iterable[Element],
|
136
135
|
*,
|
137
136
|
concurrent_tasks: int = 2,
|
138
137
|
) -> Sequence[Result]: ...
|
@@ -142,7 +141,7 @@ async def execute_concurrently[Element, Result](
|
|
142
141
|
async def execute_concurrently[Element, Result](
|
143
142
|
handler: Callable[[Element], Coroutine[Any, Any, Result]],
|
144
143
|
/,
|
145
|
-
elements:
|
144
|
+
elements: Iterable[Element],
|
146
145
|
*,
|
147
146
|
concurrent_tasks: int = 2,
|
148
147
|
return_exceptions: Literal[True],
|
@@ -152,7 +151,7 @@ async def execute_concurrently[Element, Result](
|
|
152
151
|
async def execute_concurrently[Element, Result]( # noqa: C901
|
153
152
|
handler: Callable[[Element], Coroutine[Any, Any, Result]],
|
154
153
|
/,
|
155
|
-
elements:
|
154
|
+
elements: Iterable[Element],
|
156
155
|
*,
|
157
156
|
concurrent_tasks: int = 2,
|
158
157
|
return_exceptions: bool = False,
|
@@ -175,8 +174,8 @@ async def execute_concurrently[Element, Result]( # noqa: C901
|
|
175
174
|
----------
|
176
175
|
handler : Callable[[Element], Coroutine[Any, Any, Result]]
|
177
176
|
A coroutine function that processes each element and returns a result.
|
178
|
-
elements :
|
179
|
-
A
|
177
|
+
elements : Iterable[Element]
|
178
|
+
A source of elements to process. The source size determines
|
180
179
|
the result sequence length.
|
181
180
|
concurrent_tasks : int, default=2
|
182
181
|
Maximum number of concurrent tasks. Must be greater than 0. Higher
|
haiway/helpers/files.py
CHANGED
@@ -188,7 +188,7 @@ class FileAccessing(Protocol):
|
|
188
188
|
locking, and resource management.
|
189
189
|
"""
|
190
190
|
|
191
|
-
|
191
|
+
def __call__(
|
192
192
|
self,
|
193
193
|
path: Path | str,
|
194
194
|
create: bool,
|
@@ -275,7 +275,7 @@ def _close_file_handle(
|
|
275
275
|
os.close(file_handle)
|
276
276
|
|
277
277
|
|
278
|
-
|
278
|
+
def _file_access_context(
|
279
279
|
path: Path | str,
|
280
280
|
create: bool,
|
281
281
|
exclusive: bool,
|
@@ -375,7 +375,7 @@ class FileAccess(State):
|
|
375
375
|
"""
|
376
376
|
|
377
377
|
@classmethod
|
378
|
-
|
378
|
+
def open(
|
379
379
|
cls,
|
380
380
|
path: Path | str,
|
381
381
|
create: bool = False,
|
@@ -412,7 +412,7 @@ class FileAccess(State):
|
|
412
412
|
If the file cannot be opened with the specified parameters, or if
|
413
413
|
a file is already open in the current context scope
|
414
414
|
"""
|
415
|
-
return
|
415
|
+
return ctx.state(cls).accessing(
|
416
416
|
path,
|
417
417
|
create=create,
|
418
418
|
exclusive=exclusive,
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: haiway
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.26.1
|
4
4
|
Summary: Framework for dependency injection and state management within structured concurrency model.
|
5
5
|
Project-URL: Homepage, https://miquido.com
|
6
6
|
Project-URL: Repository, https://github.com/miquido/haiway.git
|
@@ -1,24 +1,23 @@
|
|
1
|
-
haiway/__init__.py,sha256=
|
1
|
+
haiway/__init__.py,sha256=tJpU6TzK-o-Pt8joGrJah5eC08STVoRzvhXeLn3oTKo,2095
|
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=DKcf1AHGEqLWF8Kki30YKQ07GjonUjpAA8I51P4AxAg,1296
|
4
|
+
haiway/context/access.py,sha256=g8WdrKNvg6sO3X7Km_9X9syafxS0Shm_EP-JKqRLyxI,31367
|
5
5
|
haiway/context/disposables.py,sha256=7Jo-5qzS3UQvZUf4yOqUgfnueMg8I65jwHDp-4g6w54,7998
|
6
6
|
haiway/context/identifier.py,sha256=ps7YM1ZnUrj66SPVyxqMhTRMaYOMNSb82J3FfMRVHm4,4690
|
7
7
|
haiway/context/observability.py,sha256=rZoZT7g4ZM5_OKIFV0uA0rJodHxondw8X2bMSf_W6_s,20244
|
8
|
-
haiway/context/presets.py,sha256=
|
9
|
-
haiway/context/state.py,sha256=
|
8
|
+
haiway/context/presets.py,sha256=NVRv-PzuzonxdzIEJmt8SRMRO0lUgKb-jR-2ixUtkzI,10760
|
9
|
+
haiway/context/state.py,sha256=1oeON23_vaX7IgyckPcA5jWMXije93TNuSh0l9dQqNE,9920
|
10
10
|
haiway/context/tasks.py,sha256=0LdoxkQW0op4-QhAA-IDQO0PQr6Q3Vp4mO5ssEFbclU,4930
|
11
11
|
haiway/context/types.py,sha256=LoW8238TTdbUgmxyHDi0LVc8M8ZwTHLWKkAPttTsTeg,746
|
12
|
-
haiway/helpers/__init__.py,sha256=
|
12
|
+
haiway/helpers/__init__.py,sha256=gyKM1mWyuQwSx_2ajpI0UF1nA8l5D7wrzZOt9XUkWJA,780
|
13
13
|
haiway/helpers/asynchrony.py,sha256=Ddj8UdXhVczAbAC-rLpyhWa4RJ_W2Eolo45Veorq7_4,5362
|
14
14
|
haiway/helpers/caching.py,sha256=BqgcUGQSAmXsuLi5V8EwlZzuGyutHOn1V4k7BHsGKeg,14347
|
15
|
-
haiway/helpers/concurrent.py,sha256=
|
16
|
-
haiway/helpers/files.py,sha256=
|
15
|
+
haiway/helpers/concurrent.py,sha256=kTcm_wLAKqVQOKgTHIKwbkMX5hJ5GIXOAc5RRIUvbo4,13063
|
16
|
+
haiway/helpers/files.py,sha256=MzGR-GF8FpBzSihDeen7wdxmX2R-JjAT1MB9aMW-8-g,11626
|
17
17
|
haiway/helpers/observability.py,sha256=R4md41g7iTslzvtRaY5W9pgXqmuzJuGByjFb6vsO4W4,10994
|
18
18
|
haiway/helpers/retries.py,sha256=OH__I9e-PUFxcSwuQLIzJ9F1MwXgbz1Ur4jEjJiOmjQ,8974
|
19
19
|
haiway/helpers/throttling.py,sha256=KBWUSHdKVMC5_nRMmmoPNwfp-3AcerQ6OczJa9gNLM0,5796
|
20
20
|
haiway/helpers/timeouting.py,sha256=GQ8-btb36f0Jq7TnorAPYXyKScNmf0nxHXCYxqGl-o8,3949
|
21
|
-
haiway/helpers/tracing.py,sha256=NHipA5UlngwFcAaKhXg1jTuJ-ti6AqSNxE7u7-92vWo,5409
|
22
21
|
haiway/opentelemetry/__init__.py,sha256=TV-1C14mDAtcHhFZ29ActFQdrGH6x5KuGV9w-JlKYJg,91
|
23
22
|
haiway/opentelemetry/observability.py,sha256=uFgSuvwOgW7IbffROY6Kc4ZRJGoQV6rEWqIQltU_Iho,27365
|
24
23
|
haiway/state/__init__.py,sha256=mtYgg2TojOBNjFsfoRjYkfZPDhKV5sPJXxDGFBvB8-0,417
|
@@ -41,7 +40,7 @@ haiway/utils/mimic.py,sha256=xaZiUKp096QFfdSw7cNIKEWt2UIS7vf880KF54gny38,1831
|
|
41
40
|
haiway/utils/noop.py,sha256=U8ocfoCgt-pY0owJDPtrRrj53cabeIXH9qCKWMQnoRk,1336
|
42
41
|
haiway/utils/queue.py,sha256=6v2u3pA6A44IuCCTOjmCt3yLyOcm7PCRnrIGo25j-1o,6402
|
43
42
|
haiway/utils/stream.py,sha256=lXaeveTY0-AYG5xVzcQYaiC6SUD5fUtHoMXiQcrQAAM,5723
|
44
|
-
haiway-0.
|
45
|
-
haiway-0.
|
46
|
-
haiway-0.
|
47
|
-
haiway-0.
|
43
|
+
haiway-0.26.1.dist-info/METADATA,sha256=IEiaciUkopUmCqO7MxJZdfjUrELAI_tDRGBvFL8jUCg,4919
|
44
|
+
haiway-0.26.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
45
|
+
haiway-0.26.1.dist-info/licenses/LICENSE,sha256=3phcpHVNBP8jsi77gOO0E7rgKeDeu99Pi7DSnK9YHoQ,1069
|
46
|
+
haiway-0.26.1.dist-info/RECORD,,
|