omlish 0.0.0.dev484__py3-none-any.whl → 0.0.0.dev506__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.
Potentially problematic release.
This version of omlish might be problematic. Click here for more details.
- omlish/CODESTYLE.md +345 -0
- omlish/README.md +199 -0
- omlish/__about__.py +12 -5
- omlish/_check.cc +209 -0
- omlish/check.py +11 -0
- omlish/dataclasses/__init__.py +4 -0
- omlish/dataclasses/impl/concerns/frozen.py +4 -1
- omlish/dataclasses/impl/generation/plans.py +2 -17
- omlish/dataclasses/impl/generation/processor.py +2 -2
- omlish/dataclasses/impl/processing/driving.py +13 -1
- omlish/dataclasses/tools/replace.py +27 -0
- omlish/diag/_pycharm/runhack.py +1 -1
- omlish/dispatch/functions.py +1 -1
- omlish/formats/json/stream/lexing.py +13 -5
- omlish/formats/json/stream/parsing.py +1 -1
- omlish/inject/README.md +430 -0
- omlish/inject/__init__.py +20 -11
- omlish/inject/_dataclasses.py +1545 -1383
- omlish/inject/binder.py +7 -4
- omlish/inject/eagers.py +2 -4
- omlish/inject/elements.py +4 -0
- omlish/inject/helpers/late.py +76 -0
- omlish/inject/{managed.py → helpers/managed.py} +37 -34
- omlish/inject/impl/elements.py +7 -4
- omlish/inject/impl/injector.py +14 -26
- omlish/inject/impl/inspect.py +0 -8
- omlish/inject/impl/origins.py +1 -0
- omlish/inject/impl/privates.py +2 -6
- omlish/inject/impl/providers.py +0 -4
- omlish/inject/impl/scopes.py +14 -18
- omlish/inject/inspect.py +10 -1
- omlish/inject/multis.py +0 -3
- omlish/inject/scopes.py +7 -5
- omlish/io/buffers.py +35 -8
- omlish/lang/__init__.py +10 -0
- omlish/lang/classes/simple.py +2 -1
- omlish/lang/iterables.py +6 -0
- omlish/lang/objects.py +13 -0
- omlish/lang/outcomes.py +1 -1
- omlish/lang/recursion.py +1 -1
- omlish/lang/sequences.py +33 -0
- omlish/lifecycles/README.md +30 -0
- omlish/lifecycles/__init__.py +87 -13
- omlish/lifecycles/_dataclasses.py +1388 -0
- omlish/lifecycles/base.py +178 -64
- omlish/lifecycles/contextmanagers.py +113 -4
- omlish/lifecycles/controller.py +150 -87
- omlish/lifecycles/injection.py +143 -0
- omlish/lifecycles/listeners.py +56 -0
- omlish/lifecycles/managed.py +142 -0
- omlish/lifecycles/manager.py +218 -93
- omlish/lifecycles/states.py +2 -0
- omlish/lifecycles/transitions.py +3 -0
- omlish/lifecycles/unwrap.py +57 -0
- omlish/lite/maybes.py +7 -0
- omlish/lite/typing.py +33 -0
- omlish/logs/_amalg.py +1 -1
- omlish/logs/all.py +36 -11
- omlish/logs/asyncs.py +73 -0
- omlish/logs/base.py +101 -12
- omlish/logs/bisync.py +99 -0
- omlish/logs/contexts.py +4 -1
- omlish/logs/lists.py +125 -0
- omlish/logs/modules.py +19 -1
- omlish/logs/std/loggers.py +6 -1
- omlish/logs/std/noisy.py +11 -9
- omlish/logs/{standard.py → std/standard.py} +3 -4
- omlish/logs/utils.py +16 -1
- omlish/marshal/_dataclasses.py +813 -813
- omlish/reflect/__init__.py +43 -26
- omlish/reflect/ops.py +10 -1
- omlish/specs/jmespath/_dataclasses.py +597 -597
- omlish/specs/jsonschema/keywords/_dataclasses.py +244 -244
- omlish/sql/__init__.py +24 -5
- omlish/sql/api/dbapi.py +1 -1
- omlish/sql/dbapi/__init__.py +15 -0
- omlish/sql/{dbapi.py → dbapi/drivers.py} +2 -2
- omlish/sql/queries/__init__.py +3 -0
- omlish/testing/pytest/plugins/asyncs/plugin.py +2 -0
- omlish/text/docwrap/cli.py +5 -0
- omlish/typedvalues/_collection.cc +500 -0
- omlish/typedvalues/collection.py +159 -62
- omlish/typedvalues/generic.py +5 -4
- omlish/typedvalues/values.py +6 -0
- {omlish-0.0.0.dev484.dist-info → omlish-0.0.0.dev506.dist-info}/METADATA +14 -9
- {omlish-0.0.0.dev484.dist-info → omlish-0.0.0.dev506.dist-info}/RECORD +92 -77
- omlish/lifecycles/abstract.py +0 -86
- /omlish/inject/{impl → helpers}/proxy.py +0 -0
- /omlish/sql/{abc.py → dbapi/abc.py} +0 -0
- {omlish-0.0.0.dev484.dist-info → omlish-0.0.0.dev506.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev484.dist-info → omlish-0.0.0.dev506.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev484.dist-info → omlish-0.0.0.dev506.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev484.dist-info → omlish-0.0.0.dev506.dist-info}/top_level.txt +0 -0
omlish/lifecycles/base.py
CHANGED
|
@@ -1,103 +1,217 @@
|
|
|
1
1
|
import typing as ta
|
|
2
2
|
|
|
3
|
+
from .. import check
|
|
3
4
|
from .. import dataclasses as dc
|
|
4
5
|
from .. import lang
|
|
6
|
+
from .states import LifecycleState
|
|
5
7
|
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
##
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Lifecycle(lang.Abstract):
|
|
13
|
+
def __init_subclass__(cls, **kwargs: ta.Any) -> None:
|
|
14
|
+
super().__init_subclass__(**kwargs)
|
|
15
|
+
|
|
16
|
+
try:
|
|
17
|
+
async_lifecycle_cls = AsyncLifecycle
|
|
18
|
+
except NameError:
|
|
19
|
+
pass
|
|
20
|
+
else:
|
|
21
|
+
check.not_issubclass(cls, async_lifecycle_cls)
|
|
22
|
+
|
|
23
|
+
def lifecycle_state(self, state: LifecycleState) -> None:
|
|
24
|
+
"""
|
|
25
|
+
This method is not intended for actual work - this is intended solely for safe bookkeeping. Only do real work in
|
|
26
|
+
the explicit per-state methods.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def lifecycle_construct(self) -> None:
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
def lifecycle_start(self) -> None:
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
def lifecycle_stop(self) -> None:
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
def lifecycle_destroy(self) -> None:
|
|
39
|
+
pass
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class AsyncLifecycle(lang.Abstract):
|
|
43
|
+
def __init_subclass__(cls, **kwargs: ta.Any) -> None:
|
|
44
|
+
super().__init_subclass__(**kwargs)
|
|
45
|
+
|
|
46
|
+
check.not_issubclass(cls, Lifecycle)
|
|
47
|
+
|
|
48
|
+
async def lifecycle_state(self, state: LifecycleState) -> None:
|
|
49
|
+
"""
|
|
50
|
+
This method is not intended for actual work - this is intended solely for safe bookkeeping. Only do real work in
|
|
51
|
+
the explicit per-state methods.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
async def lifecycle_construct(self) -> None:
|
|
55
|
+
pass
|
|
56
|
+
|
|
57
|
+
async def lifecycle_start(self) -> None:
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
async def lifecycle_stop(self) -> None:
|
|
61
|
+
pass
|
|
8
62
|
|
|
9
|
-
|
|
10
|
-
|
|
63
|
+
async def lifecycle_destroy(self) -> None:
|
|
64
|
+
pass
|
|
11
65
|
|
|
12
|
-
LifecycleT = ta.TypeVar('LifecycleT', bound='Lifecycle')
|
|
13
|
-
LifecycleCallback: ta.TypeAlias = ta.Callable[[LifecycleT], R]
|
|
14
66
|
|
|
15
|
-
|
|
16
|
-
|
|
67
|
+
AnyLifecycle: ta.TypeAlias = Lifecycle | AsyncLifecycle
|
|
68
|
+
|
|
69
|
+
ANY_LIFECYCLE_TYPES: tuple[type[Lifecycle | AsyncLifecycle], ...] = (Lifecycle, AsyncLifecycle)
|
|
17
70
|
|
|
18
71
|
|
|
19
72
|
##
|
|
20
73
|
|
|
21
74
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
75
|
+
@ta.final
|
|
76
|
+
@dc.dataclass(frozen=True)
|
|
77
|
+
class _SyncToAsyncLifecycle(AsyncLifecycle, lang.Final):
|
|
78
|
+
lifecycle: Lifecycle
|
|
79
|
+
|
|
80
|
+
async def lifecycle_state(self, state: LifecycleState) -> None:
|
|
81
|
+
self.lifecycle.lifecycle_state(state)
|
|
82
|
+
|
|
83
|
+
async def lifecycle_construct(self) -> None:
|
|
84
|
+
self.lifecycle.lifecycle_construct()
|
|
85
|
+
|
|
86
|
+
async def lifecycle_start(self) -> None:
|
|
87
|
+
self.lifecycle.lifecycle_start()
|
|
88
|
+
|
|
89
|
+
async def lifecycle_stop(self) -> None:
|
|
90
|
+
self.lifecycle.lifecycle_stop()
|
|
91
|
+
|
|
92
|
+
async def lifecycle_destroy(self) -> None:
|
|
93
|
+
self.lifecycle.lifecycle_destroy()
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def sync_to_async_lifecycle(lifecycle: Lifecycle) -> AsyncLifecycle:
|
|
97
|
+
return _SyncToAsyncLifecycle(lifecycle)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def as_async_lifecycle(lifecycle: Lifecycle | AsyncLifecycle) -> AsyncLifecycle:
|
|
101
|
+
if isinstance(lifecycle, Lifecycle):
|
|
102
|
+
return sync_to_async_lifecycle(lifecycle)
|
|
103
|
+
|
|
104
|
+
elif isinstance(lifecycle, AsyncLifecycle):
|
|
105
|
+
return lifecycle
|
|
106
|
+
|
|
107
|
+
else:
|
|
108
|
+
raise TypeError(lifecycle)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@ta.final
|
|
112
|
+
@dc.dataclass(frozen=True)
|
|
113
|
+
class _AsyncToSyncLifecycle(Lifecycle, lang.Final):
|
|
114
|
+
lifecycle: AsyncLifecycle
|
|
115
|
+
|
|
116
|
+
def lifecycle_state(self, state: LifecycleState) -> None:
|
|
117
|
+
lang.sync_await(self.lifecycle.lifecycle_state(state))
|
|
118
|
+
|
|
119
|
+
def lifecycle_construct(self) -> None:
|
|
120
|
+
lang.sync_await(self.lifecycle.lifecycle_construct())
|
|
25
121
|
|
|
26
|
-
def lifecycle_start(self) ->
|
|
27
|
-
|
|
122
|
+
def lifecycle_start(self) -> None:
|
|
123
|
+
lang.sync_await(self.lifecycle.lifecycle_start())
|
|
28
124
|
|
|
29
|
-
def lifecycle_stop(self) ->
|
|
30
|
-
|
|
125
|
+
def lifecycle_stop(self) -> None:
|
|
126
|
+
lang.sync_await(self.lifecycle.lifecycle_stop())
|
|
31
127
|
|
|
32
|
-
def lifecycle_destroy(self) ->
|
|
33
|
-
|
|
128
|
+
def lifecycle_destroy(self) -> None:
|
|
129
|
+
lang.sync_await(self.lifecycle.lifecycle_destroy())
|
|
34
130
|
|
|
35
131
|
|
|
132
|
+
def async_to_sync_lifecycle(lifecycle: AsyncLifecycle) -> Lifecycle:
|
|
133
|
+
return _AsyncToSyncLifecycle(lifecycle)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def as_sync_lifecycle(lifecycle: Lifecycle | AsyncLifecycle) -> Lifecycle:
|
|
137
|
+
if isinstance(lifecycle, Lifecycle):
|
|
138
|
+
return lifecycle
|
|
139
|
+
|
|
140
|
+
elif isinstance(lifecycle, AsyncLifecycle):
|
|
141
|
+
return async_to_sync_lifecycle(lifecycle)
|
|
142
|
+
|
|
143
|
+
else:
|
|
144
|
+
raise TypeError(lifecycle)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
##
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
@ta.final
|
|
36
151
|
@dc.dataclass(frozen=True, kw_only=True)
|
|
37
|
-
class
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
ta.
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
152
|
+
class CallbackLifecycle(Lifecycle, lang.Final):
|
|
153
|
+
on_state: ta.Callable[[LifecycleState], None] | None = None
|
|
154
|
+
on_construct: ta.Callable[[], None] | None = None
|
|
155
|
+
on_start: ta.Callable[[], None] | None = None
|
|
156
|
+
on_stop: ta.Callable[[], None] | None = None
|
|
157
|
+
on_destroy: ta.Callable[[], None] | None = None
|
|
158
|
+
|
|
159
|
+
@ta.override
|
|
160
|
+
def lifecycle_state(self, state: LifecycleState) -> None:
|
|
161
|
+
if self.on_state is not None:
|
|
162
|
+
self.on_state(state)
|
|
46
163
|
|
|
47
164
|
@ta.override
|
|
48
|
-
def lifecycle_construct(self) ->
|
|
165
|
+
def lifecycle_construct(self) -> None:
|
|
49
166
|
if self.on_construct is not None:
|
|
50
|
-
|
|
51
|
-
else:
|
|
52
|
-
return None
|
|
167
|
+
self.on_construct()
|
|
53
168
|
|
|
54
169
|
@ta.override
|
|
55
|
-
def lifecycle_start(self) ->
|
|
170
|
+
def lifecycle_start(self) -> None:
|
|
56
171
|
if self.on_start is not None:
|
|
57
|
-
|
|
58
|
-
else:
|
|
59
|
-
return None
|
|
172
|
+
self.on_start()
|
|
60
173
|
|
|
61
174
|
@ta.override
|
|
62
|
-
def lifecycle_stop(self) ->
|
|
175
|
+
def lifecycle_stop(self) -> None:
|
|
63
176
|
if self.on_stop is not None:
|
|
64
|
-
|
|
65
|
-
else:
|
|
66
|
-
return None
|
|
177
|
+
self.on_stop()
|
|
67
178
|
|
|
68
179
|
@ta.override
|
|
69
|
-
def lifecycle_destroy(self) ->
|
|
180
|
+
def lifecycle_destroy(self) -> None:
|
|
70
181
|
if self.on_destroy is not None:
|
|
71
|
-
|
|
72
|
-
else:
|
|
73
|
-
return None
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
##
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
class Lifecycle(AnyLifecycle[None]):
|
|
80
|
-
pass
|
|
182
|
+
self.on_destroy()
|
|
81
183
|
|
|
82
184
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
ta.
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
185
|
+
@ta.final
|
|
186
|
+
@dc.dataclass(frozen=True, kw_only=True)
|
|
187
|
+
class CallbackAsyncLifecycle(AsyncLifecycle, lang.Final):
|
|
188
|
+
on_state: ta.Callable[[LifecycleState], ta.Awaitable[None]] | None = None
|
|
189
|
+
on_construct: ta.Callable[[], ta.Awaitable[None]] | None = None
|
|
190
|
+
on_start: ta.Callable[[], ta.Awaitable[None]] | None = None
|
|
191
|
+
on_stop: ta.Callable[[], ta.Awaitable[None]] | None = None
|
|
192
|
+
on_destroy: ta.Callable[[], ta.Awaitable[None]] | None = None
|
|
90
193
|
|
|
91
|
-
|
|
194
|
+
@ta.override
|
|
195
|
+
async def lifecycle_state(self, state: LifecycleState) -> None:
|
|
196
|
+
if self.on_state is not None:
|
|
197
|
+
await self.on_state(state)
|
|
92
198
|
|
|
199
|
+
@ta.override
|
|
200
|
+
async def lifecycle_construct(self) -> None:
|
|
201
|
+
if self.on_construct is not None:
|
|
202
|
+
await self.on_construct()
|
|
93
203
|
|
|
94
|
-
|
|
95
|
-
|
|
204
|
+
@ta.override
|
|
205
|
+
async def lifecycle_start(self) -> None:
|
|
206
|
+
if self.on_start is not None:
|
|
207
|
+
await self.on_start()
|
|
96
208
|
|
|
209
|
+
@ta.override
|
|
210
|
+
async def lifecycle_stop(self) -> None:
|
|
211
|
+
if self.on_stop is not None:
|
|
212
|
+
await self.on_stop()
|
|
97
213
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
):
|
|
103
|
-
pass
|
|
214
|
+
@ta.override
|
|
215
|
+
async def lifecycle_destroy(self) -> None:
|
|
216
|
+
if self.on_destroy is not None:
|
|
217
|
+
await self.on_destroy()
|
|
@@ -1,21 +1,33 @@
|
|
|
1
|
+
import contextlib
|
|
1
2
|
import types
|
|
2
3
|
import typing as ta
|
|
3
4
|
|
|
5
|
+
from .. import check
|
|
4
6
|
from .. import dataclasses as dc
|
|
5
7
|
from .. import lang
|
|
8
|
+
from .base import AsyncLifecycle
|
|
6
9
|
from .base import Lifecycle
|
|
10
|
+
from .controller import AsyncLifecycleController
|
|
7
11
|
from .controller import LifecycleController
|
|
8
12
|
from .states import LifecycleState
|
|
9
13
|
from .states import LifecycleStates
|
|
14
|
+
from .unwrap import unwrap_async_lifecycle
|
|
15
|
+
from .unwrap import unwrap_lifecycle
|
|
10
16
|
|
|
11
17
|
|
|
12
|
-
|
|
18
|
+
T = ta.TypeVar('T')
|
|
19
|
+
|
|
13
20
|
ContextManagerT = ta.TypeVar('ContextManagerT', bound=ta.ContextManager)
|
|
21
|
+
AsyncContextManagerT = ta.TypeVar('AsyncContextManagerT', bound=ta.AsyncContextManager)
|
|
22
|
+
|
|
23
|
+
LifecycleT = ta.TypeVar('LifecycleT', bound=Lifecycle)
|
|
24
|
+
AsyncLifecycleT = ta.TypeVar('AsyncLifecycleT', bound=AsyncLifecycle)
|
|
14
25
|
|
|
15
26
|
|
|
16
27
|
##
|
|
17
28
|
|
|
18
29
|
|
|
30
|
+
@ta.final
|
|
19
31
|
@dc.dataclass(frozen=True)
|
|
20
32
|
class ContextManagerLifecycle(Lifecycle, lang.Final, ta.Generic[ContextManagerT]):
|
|
21
33
|
cm: ContextManagerT
|
|
@@ -29,7 +41,25 @@ class ContextManagerLifecycle(Lifecycle, lang.Final, ta.Generic[ContextManagerT]
|
|
|
29
41
|
self.cm.__exit__(None, None, None)
|
|
30
42
|
|
|
31
43
|
|
|
32
|
-
|
|
44
|
+
@ta.final
|
|
45
|
+
@dc.dataclass(frozen=True)
|
|
46
|
+
class AsyncContextManagerLifecycle(AsyncLifecycle, lang.Final, ta.Generic[AsyncContextManagerT]):
|
|
47
|
+
cm: AsyncContextManagerT
|
|
48
|
+
|
|
49
|
+
@ta.override
|
|
50
|
+
async def lifecycle_start(self) -> None:
|
|
51
|
+
await self.cm.__aenter__()
|
|
52
|
+
|
|
53
|
+
@ta.override
|
|
54
|
+
async def lifecycle_stop(self) -> None:
|
|
55
|
+
await self.cm.__aexit__(None, None, None)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
##
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@ta.final
|
|
62
|
+
class LifecycleContextManager(lang.Final, ta.Generic[LifecycleT]):
|
|
33
63
|
def __init__(self, lifecycle: LifecycleT) -> None:
|
|
34
64
|
super().__init__()
|
|
35
65
|
|
|
@@ -38,6 +68,8 @@ class LifecycleContextManager(ta.Generic[LifecycleT]):
|
|
|
38
68
|
|
|
39
69
|
__repr__ = lang.attr_ops(lambda o: (o.lifecycle, o.state)).repr
|
|
40
70
|
|
|
71
|
+
#
|
|
72
|
+
|
|
41
73
|
@property
|
|
42
74
|
def lifecycle(self) -> LifecycleT:
|
|
43
75
|
return self._lifecycle
|
|
@@ -50,14 +82,16 @@ class LifecycleContextManager(ta.Generic[LifecycleT]):
|
|
|
50
82
|
def state(self) -> LifecycleState:
|
|
51
83
|
return self._controller.state
|
|
52
84
|
|
|
53
|
-
|
|
85
|
+
#
|
|
86
|
+
|
|
87
|
+
def __enter__(self) -> LifecycleT:
|
|
54
88
|
try:
|
|
55
89
|
self._controller.lifecycle_construct()
|
|
56
90
|
self._controller.lifecycle_start()
|
|
57
91
|
except Exception:
|
|
58
92
|
self._controller.lifecycle_destroy()
|
|
59
93
|
raise
|
|
60
|
-
return self
|
|
94
|
+
return self._lifecycle
|
|
61
95
|
|
|
62
96
|
def __exit__(
|
|
63
97
|
self,
|
|
@@ -74,3 +108,78 @@ class LifecycleContextManager(ta.Generic[LifecycleT]):
|
|
|
74
108
|
else:
|
|
75
109
|
self._controller.lifecycle_destroy()
|
|
76
110
|
return None
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
@ta.final
|
|
114
|
+
class AsyncLifecycleContextManager(lang.Final, ta.Generic[AsyncLifecycleT]):
|
|
115
|
+
def __init__(self, lifecycle: AsyncLifecycleT) -> None:
|
|
116
|
+
super().__init__()
|
|
117
|
+
|
|
118
|
+
self._lifecycle = lifecycle
|
|
119
|
+
self._controller = lifecycle if isinstance(lifecycle, AsyncLifecycleController) else AsyncLifecycleController(lifecycle) # noqa
|
|
120
|
+
|
|
121
|
+
__repr__ = lang.attr_ops(lambda o: (o.lifecycle, o.state)).repr
|
|
122
|
+
|
|
123
|
+
#
|
|
124
|
+
|
|
125
|
+
@property
|
|
126
|
+
def lifecycle(self) -> AsyncLifecycleT:
|
|
127
|
+
return self._lifecycle
|
|
128
|
+
|
|
129
|
+
@property
|
|
130
|
+
def controller(self) -> AsyncLifecycleController:
|
|
131
|
+
return self._controller
|
|
132
|
+
|
|
133
|
+
@property
|
|
134
|
+
def state(self) -> LifecycleState:
|
|
135
|
+
return self._controller.state
|
|
136
|
+
|
|
137
|
+
#
|
|
138
|
+
|
|
139
|
+
async def __aenter__(self) -> AsyncLifecycleT:
|
|
140
|
+
try:
|
|
141
|
+
await self._controller.lifecycle_construct()
|
|
142
|
+
await self._controller.lifecycle_start()
|
|
143
|
+
except Exception:
|
|
144
|
+
await self._controller.lifecycle_destroy()
|
|
145
|
+
raise
|
|
146
|
+
return self._lifecycle
|
|
147
|
+
|
|
148
|
+
async def __aexit__(
|
|
149
|
+
self,
|
|
150
|
+
exc_type: type[BaseException] | None,
|
|
151
|
+
exc_val: BaseException | None,
|
|
152
|
+
exc_tb: types.TracebackType | None,
|
|
153
|
+
) -> bool | None:
|
|
154
|
+
try:
|
|
155
|
+
if self._controller.state is LifecycleStates.STARTED:
|
|
156
|
+
await self._controller.lifecycle_stop()
|
|
157
|
+
except Exception:
|
|
158
|
+
await self._controller.lifecycle_destroy()
|
|
159
|
+
raise
|
|
160
|
+
else:
|
|
161
|
+
await self._controller.lifecycle_destroy()
|
|
162
|
+
return None
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
##
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def lifecycle_context_manage(obj: T) -> ta.ContextManager[T]:
|
|
169
|
+
@contextlib.contextmanager
|
|
170
|
+
def inner():
|
|
171
|
+
lc = check.not_none(unwrap_lifecycle(obj))
|
|
172
|
+
with LifecycleContextManager(lc):
|
|
173
|
+
yield obj
|
|
174
|
+
|
|
175
|
+
return inner()
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def async_lifecycle_context_manage(obj: T) -> ta.AsyncContextManager[T]:
|
|
179
|
+
@contextlib.asynccontextmanager
|
|
180
|
+
async def inner():
|
|
181
|
+
lc = check.not_none(unwrap_async_lifecycle(obj))
|
|
182
|
+
async with AsyncLifecycleContextManager(lc):
|
|
183
|
+
yield obj
|
|
184
|
+
|
|
185
|
+
return inner()
|