ominfra 0.0.0.dev404__py3-none-any.whl → 0.0.0.dev406__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.
ominfra/scripts/manage.py CHANGED
@@ -102,6 +102,10 @@ CheckOnRaiseFn = ta.Callable[[Exception], None] # ta.TypeAlias
102
102
  CheckExceptionFactory = ta.Callable[..., Exception] # ta.TypeAlias
103
103
  CheckArgsRenderer = ta.Callable[..., ta.Optional[str]] # ta.TypeAlias
104
104
 
105
+ # ../../omlish/lite/contextmanagers.py
106
+ ExitStackedT = ta.TypeVar('ExitStackedT', bound='ExitStacked')
107
+ AsyncExitStackedT = ta.TypeVar('AsyncExitStackedT', bound='AsyncExitStacked')
108
+
105
109
  # ../../omlish/lite/maybes.py
106
110
  U = ta.TypeVar('U')
107
111
 
@@ -131,10 +135,6 @@ AwaitableT = ta.TypeVar('AwaitableT', bound=ta.Awaitable)
131
135
  # ../../omlish/configs/formats.py
132
136
  ConfigDataT = ta.TypeVar('ConfigDataT', bound='ConfigData')
133
137
 
134
- # ../../omlish/lite/contextmanagers.py
135
- ExitStackedT = ta.TypeVar('ExitStackedT', bound='ExitStacked')
136
- AsyncExitStackedT = ta.TypeVar('AsyncExitStackedT', bound='AsyncExitStacked')
137
-
138
138
  # ../../omlish/lite/inject.py
139
139
  InjectorKeyCls = ta.Union[type, ta.NewType]
140
140
  InjectorProviderFn = ta.Callable[['Injector'], ta.Any]
@@ -2910,6 +2910,201 @@ class Checks:
2910
2910
  check = Checks()
2911
2911
 
2912
2912
 
2913
+ ########################################
2914
+ # ../../../omlish/lite/contextmanagers.py
2915
+
2916
+
2917
+ ##
2918
+
2919
+
2920
+ class ExitStacked:
2921
+ def __init_subclass__(cls, **kwargs: ta.Any) -> None:
2922
+ super().__init_subclass__(**kwargs)
2923
+
2924
+ for a in ('__enter__', '__exit__'):
2925
+ for b in cls.__bases__:
2926
+ if b is ExitStacked:
2927
+ continue
2928
+ try:
2929
+ fn = getattr(b, a)
2930
+ except AttributeError:
2931
+ pass
2932
+ else:
2933
+ if fn is not getattr(ExitStacked, a):
2934
+ raise TypeError(f'ExitStacked subclass {cls} must not not override {a} via {b}')
2935
+
2936
+ _exit_stack: ta.Optional[contextlib.ExitStack] = None
2937
+
2938
+ @contextlib.contextmanager
2939
+ def _exit_stacked_init_wrapper(self) -> ta.Iterator[None]:
2940
+ """
2941
+ Overridable wrapper around __enter__ which deliberately does not have access to an _exit_stack yet. Intended for
2942
+ things like wrapping __enter__ in a lock.
2943
+ """
2944
+
2945
+ yield
2946
+
2947
+ @ta.final
2948
+ def __enter__(self: ExitStackedT) -> ExitStackedT:
2949
+ """
2950
+ Final because any contexts entered during this init must be exited if any exception is thrown, and user
2951
+ overriding would likely interfere with that. Override `_enter_contexts` for such init.
2952
+ """
2953
+
2954
+ with self._exit_stacked_init_wrapper():
2955
+ if self._exit_stack is not None:
2956
+ raise RuntimeError
2957
+ es = self._exit_stack = contextlib.ExitStack()
2958
+ es.__enter__()
2959
+ try:
2960
+ self._enter_contexts()
2961
+ except Exception: # noqa
2962
+ es.__exit__(*sys.exc_info())
2963
+ raise
2964
+ return self
2965
+
2966
+ @ta.final
2967
+ def __exit__(self, exc_type, exc_val, exc_tb):
2968
+ if (es := self._exit_stack) is None:
2969
+ return None
2970
+ try:
2971
+ self._exit_contexts()
2972
+ except Exception: # noqa
2973
+ es.__exit__(*sys.exc_info())
2974
+ raise
2975
+ return es.__exit__(exc_type, exc_val, exc_tb)
2976
+
2977
+ def _enter_contexts(self) -> None:
2978
+ pass
2979
+
2980
+ def _exit_contexts(self) -> None:
2981
+ pass
2982
+
2983
+ def _enter_context(self, cm: ta.ContextManager[T]) -> T:
2984
+ if (es := self._exit_stack) is None:
2985
+ raise RuntimeError
2986
+ return es.enter_context(cm)
2987
+
2988
+
2989
+ class AsyncExitStacked:
2990
+ def __init_subclass__(cls, **kwargs: ta.Any) -> None:
2991
+ super().__init_subclass__(**kwargs)
2992
+
2993
+ for a in ('__aenter__', '__aexit__'):
2994
+ for b in cls.__bases__:
2995
+ if b is AsyncExitStacked:
2996
+ continue
2997
+ try:
2998
+ fn = getattr(b, a)
2999
+ except AttributeError:
3000
+ pass
3001
+ else:
3002
+ if fn is not getattr(AsyncExitStacked, a):
3003
+ raise TypeError(f'AsyncExitStacked subclass {cls} must not not override {a} via {b}')
3004
+
3005
+ _exit_stack: ta.Optional[contextlib.AsyncExitStack] = None
3006
+
3007
+ @contextlib.asynccontextmanager
3008
+ async def _async_exit_stacked_init_wrapper(self) -> ta.AsyncGenerator[None, None]:
3009
+ yield
3010
+
3011
+ @ta.final
3012
+ async def __aenter__(self: AsyncExitStackedT) -> AsyncExitStackedT:
3013
+ async with self._async_exit_stacked_init_wrapper():
3014
+ if self._exit_stack is not None:
3015
+ raise RuntimeError
3016
+ es = self._exit_stack = contextlib.AsyncExitStack()
3017
+ await es.__aenter__()
3018
+ try:
3019
+ await self._async_enter_contexts()
3020
+ except Exception: # noqa
3021
+ await es.__aexit__(*sys.exc_info())
3022
+ raise
3023
+ return self
3024
+
3025
+ @ta.final
3026
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
3027
+ if (es := self._exit_stack) is None:
3028
+ return None
3029
+ try:
3030
+ await self._async_exit_contexts()
3031
+ except Exception: # noqa
3032
+ await es.__aexit__(*sys.exc_info())
3033
+ raise
3034
+ return await es.__aexit__(exc_type, exc_val, exc_tb)
3035
+
3036
+ async def _async_enter_contexts(self) -> None:
3037
+ pass
3038
+
3039
+ async def _async_exit_contexts(self) -> None:
3040
+ pass
3041
+
3042
+ def _enter_context(self, cm: ta.ContextManager[T]) -> T:
3043
+ if (es := self._exit_stack) is None:
3044
+ raise RuntimeError
3045
+ return es.enter_context(cm)
3046
+
3047
+ async def _enter_async_context(self, cm: ta.AsyncContextManager[T]) -> T:
3048
+ if (es := self._exit_stack) is None:
3049
+ raise RuntimeError
3050
+ return await es.enter_async_context(cm)
3051
+
3052
+
3053
+ ##
3054
+
3055
+
3056
+ @contextlib.contextmanager
3057
+ def defer(fn: ta.Callable, *args: ta.Any, **kwargs: ta.Any) -> ta.Generator[ta.Callable, None, None]:
3058
+ if args or kwargs:
3059
+ fn = functools.partial(fn, *args, **kwargs)
3060
+ try:
3061
+ yield fn
3062
+ finally:
3063
+ fn()
3064
+
3065
+
3066
+ @contextlib.asynccontextmanager
3067
+ async def adefer(fn: ta.Awaitable) -> ta.AsyncGenerator[ta.Awaitable, None]:
3068
+ try:
3069
+ yield fn
3070
+ finally:
3071
+ await fn
3072
+
3073
+
3074
+ ##
3075
+
3076
+
3077
+ @contextlib.contextmanager
3078
+ def attr_setting(obj, attr, val, *, default=None): # noqa
3079
+ not_set = object()
3080
+ orig = getattr(obj, attr, not_set)
3081
+ try:
3082
+ setattr(obj, attr, val)
3083
+ if orig is not not_set:
3084
+ yield orig
3085
+ else:
3086
+ yield default
3087
+ finally:
3088
+ if orig is not_set:
3089
+ delattr(obj, attr)
3090
+ else:
3091
+ setattr(obj, attr, orig)
3092
+
3093
+
3094
+ ##
3095
+
3096
+
3097
+ class aclosing(contextlib.AbstractAsyncContextManager): # noqa
3098
+ def __init__(self, thing):
3099
+ self.thing = thing
3100
+
3101
+ async def __aenter__(self):
3102
+ return self.thing
3103
+
3104
+ async def __aexit__(self, *exc_info):
3105
+ await self.thing.aclose()
3106
+
3107
+
2913
3108
  ########################################
2914
3109
  # ../../../omlish/lite/json.py
2915
3110
 
@@ -6116,196 +6311,6 @@ DEFAULT_CONFIG_RENDERERS: ta.Sequence[ConfigRenderer] = [
6116
6311
  DEFAULT_CONFIG_RENDERER = SwitchedConfigRenderer(DEFAULT_CONFIG_RENDERERS)
6117
6312
 
6118
6313
 
6119
- ########################################
6120
- # ../../../omlish/lite/contextmanagers.py
6121
-
6122
-
6123
- ##
6124
-
6125
-
6126
- class ExitStacked:
6127
- def __init_subclass__(cls, **kwargs: ta.Any) -> None:
6128
- super().__init_subclass__(**kwargs)
6129
-
6130
- for a in ('__enter__', '__exit__'):
6131
- for b in cls.__bases__:
6132
- if b is ExitStacked:
6133
- continue
6134
- try:
6135
- fn = getattr(b, a)
6136
- except AttributeError:
6137
- pass
6138
- else:
6139
- if fn is not getattr(ExitStacked, a):
6140
- raise TypeError(f'ExitStacked subclass {cls} must not not override {a} via {b}')
6141
-
6142
- _exit_stack: ta.Optional[contextlib.ExitStack] = None
6143
-
6144
- @contextlib.contextmanager
6145
- def _exit_stacked_init_wrapper(self) -> ta.Iterator[None]:
6146
- """
6147
- Overridable wrapper around __enter__ which deliberately does not have access to an _exit_stack yet. Intended for
6148
- things like wrapping __enter__ in a lock.
6149
- """
6150
-
6151
- yield
6152
-
6153
- @ta.final
6154
- def __enter__(self: ExitStackedT) -> ExitStackedT:
6155
- """
6156
- Final because any contexts entered during this init must be exited if any exception is thrown, and user
6157
- overriding would likely interfere with that. Override `_enter_contexts` for such init.
6158
- """
6159
-
6160
- with self._exit_stacked_init_wrapper():
6161
- check.state(self._exit_stack is None)
6162
- es = self._exit_stack = contextlib.ExitStack()
6163
- es.__enter__()
6164
- try:
6165
- self._enter_contexts()
6166
- except Exception: # noqa
6167
- es.__exit__(*sys.exc_info())
6168
- raise
6169
- return self
6170
-
6171
- @ta.final
6172
- def __exit__(self, exc_type, exc_val, exc_tb):
6173
- if (es := self._exit_stack) is None:
6174
- return None
6175
- try:
6176
- self._exit_contexts()
6177
- except Exception: # noqa
6178
- es.__exit__(*sys.exc_info())
6179
- raise
6180
- return es.__exit__(exc_type, exc_val, exc_tb)
6181
-
6182
- def _enter_contexts(self) -> None:
6183
- pass
6184
-
6185
- def _exit_contexts(self) -> None:
6186
- pass
6187
-
6188
- def _enter_context(self, cm: ta.ContextManager[T]) -> T:
6189
- es = check.not_none(self._exit_stack)
6190
- return es.enter_context(cm)
6191
-
6192
-
6193
- class AsyncExitStacked:
6194
- def __init_subclass__(cls, **kwargs: ta.Any) -> None:
6195
- super().__init_subclass__(**kwargs)
6196
-
6197
- for a in ('__aenter__', '__aexit__'):
6198
- for b in cls.__bases__:
6199
- if b is AsyncExitStacked:
6200
- continue
6201
- try:
6202
- fn = getattr(b, a)
6203
- except AttributeError:
6204
- pass
6205
- else:
6206
- if fn is not getattr(AsyncExitStacked, a):
6207
- raise TypeError(f'AsyncExitStacked subclass {cls} must not not override {a} via {b}')
6208
-
6209
- _exit_stack: ta.Optional[contextlib.AsyncExitStack] = None
6210
-
6211
- @contextlib.asynccontextmanager
6212
- async def _async_exit_stacked_init_wrapper(self) -> ta.AsyncGenerator[None, None]:
6213
- yield
6214
-
6215
- @ta.final
6216
- async def __aenter__(self: AsyncExitStackedT) -> AsyncExitStackedT:
6217
- async with self._async_exit_stacked_init_wrapper():
6218
- check.state(self._exit_stack is None)
6219
- es = self._exit_stack = contextlib.AsyncExitStack()
6220
- await es.__aenter__()
6221
- try:
6222
- await self._async_enter_contexts()
6223
- except Exception: # noqa
6224
- await es.__aexit__(*sys.exc_info())
6225
- raise
6226
- return self
6227
-
6228
- @ta.final
6229
- async def __aexit__(self, exc_type, exc_val, exc_tb):
6230
- if (es := self._exit_stack) is None:
6231
- return None
6232
- try:
6233
- await self._async_exit_contexts()
6234
- except Exception: # noqa
6235
- await es.__aexit__(*sys.exc_info())
6236
- raise
6237
- return await es.__aexit__(exc_type, exc_val, exc_tb)
6238
-
6239
- async def _async_enter_contexts(self) -> None:
6240
- pass
6241
-
6242
- async def _async_exit_contexts(self) -> None:
6243
- pass
6244
-
6245
- def _enter_context(self, cm: ta.ContextManager[T]) -> T:
6246
- es = check.not_none(self._exit_stack)
6247
- return es.enter_context(cm)
6248
-
6249
- async def _enter_async_context(self, cm: ta.AsyncContextManager[T]) -> T:
6250
- es = check.not_none(self._exit_stack)
6251
- return await es.enter_async_context(cm)
6252
-
6253
-
6254
- ##
6255
-
6256
-
6257
- @contextlib.contextmanager
6258
- def defer(fn: ta.Callable, *args: ta.Any, **kwargs: ta.Any) -> ta.Generator[ta.Callable, None, None]:
6259
- if args or kwargs:
6260
- fn = functools.partial(fn, *args, **kwargs)
6261
- try:
6262
- yield fn
6263
- finally:
6264
- fn()
6265
-
6266
-
6267
- @contextlib.asynccontextmanager
6268
- async def adefer(fn: ta.Awaitable) -> ta.AsyncGenerator[ta.Awaitable, None]:
6269
- try:
6270
- yield fn
6271
- finally:
6272
- await fn
6273
-
6274
-
6275
- ##
6276
-
6277
-
6278
- @contextlib.contextmanager
6279
- def attr_setting(obj, attr, val, *, default=None): # noqa
6280
- not_set = object()
6281
- orig = getattr(obj, attr, not_set)
6282
- try:
6283
- setattr(obj, attr, val)
6284
- if orig is not not_set:
6285
- yield orig
6286
- else:
6287
- yield default
6288
- finally:
6289
- if orig is not_set:
6290
- delattr(obj, attr)
6291
- else:
6292
- setattr(obj, attr, orig)
6293
-
6294
-
6295
- ##
6296
-
6297
-
6298
- class aclosing(contextlib.AbstractAsyncContextManager): # noqa
6299
- def __init__(self, thing):
6300
- self.thing = thing
6301
-
6302
- async def __aenter__(self):
6303
- return self.thing
6304
-
6305
- async def __aexit__(self, *exc_info):
6306
- await self.thing.aclose()
6307
-
6308
-
6309
6314
  ########################################
6310
6315
  # ../../../omlish/lite/inject.py
6311
6316
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ominfra
3
- Version: 0.0.0.dev404
3
+ Version: 0.0.0.dev406
4
4
  Summary: ominfra
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,8 +14,8 @@ Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: omdev==0.0.0.dev404
18
- Requires-Dist: omlish==0.0.0.dev404
17
+ Requires-Dist: omdev==0.0.0.dev406
18
+ Requires-Dist: omlish==0.0.0.dev406
19
19
  Provides-Extra: all
20
20
  Requires-Dist: paramiko~=4.0; extra == "all"
21
21
  Requires-Dist: asyncssh~=2.21; extra == "all"
@@ -1,4 +1,4 @@
1
- ominfra/.manifests.json,sha256=8KREXxMAlsilZOktXPYru1ND3V5hFI22vnrp6hT3bio,589
1
+ ominfra/.manifests.json,sha256=sN48-JQtCfdTxhbjsptBC3imaHlipvaKH9UT5KaYzHI,577
2
2
  ominfra/__about__.py,sha256=vHKd5RbDqb9vdcETBCcWeMkYqMNfJMdY_yFxtT3Hglw,705
3
3
  ominfra/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  ominfra/pyremote.py,sha256=hCoh0m-yxAoHOTB_tG8nwqq_CEXxIF0MTZ0A5eaZcSM,16529
@@ -112,8 +112,8 @@ ominfra/manage/targets/connection.py,sha256=Ut-R_PvQN9tPBacZD0ODmLIYvLsgS51qvOGr
112
112
  ominfra/manage/targets/inject.py,sha256=3M4wBkxtvymq_yhiotHlTN8iydELMjVCndyp9Bq-4eo,1572
113
113
  ominfra/manage/targets/targets.py,sha256=WmasYmL6xfAI7F0XvDhScFdBVxkqPkmo_gRgABmmkGA,1891
114
114
  ominfra/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
- ominfra/scripts/journald2aws.py,sha256=SGfMhosQGBfWmqJSmXa7NtL2f9gdyGSkGNDw7bCbHl0,174005
116
- ominfra/scripts/manage.py,sha256=ZiudBacqJpMFLlILtoRtjiu16UvJqTTtRmd6RTbJY8w,396911
115
+ ominfra/scripts/journald2aws.py,sha256=BN2_tKSqLqZtxaK8XcIQ9Ql2LLTG0-Pc5QilQRJeNnI,174155
116
+ ominfra/scripts/manage.py,sha256=QC2o539EVnSfNwMPfaRVVS8UHgKwPB7hfg6GbcIWZv8,397061
117
117
  ominfra/scripts/supervisor.py,sha256=_2WAFBsYuFrQ6eg2_8dZOIbmue0SeBZizIiNhBff3rg,306666
118
118
  ominfra/supervisor/LICENSE.txt,sha256=ZrHY15PVR98y26Yg6iQfa-SXnUaYTDhrUsPVcEO5OKM,1874
119
119
  ominfra/supervisor/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
@@ -156,9 +156,9 @@ ominfra/tailscale/api.py,sha256=XASv9C_CWI-u-yX5jVzhJrkJhlwQRkYQWQQG1uJwAd8,1375
156
156
  ominfra/tailscale/cli.py,sha256=zRV7-tKB7kBah1oTVZlol-vwx1FBlnfzYAPGkeU5jX4,3543
157
157
  ominfra/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
158
158
  ominfra/tools/listresources.py,sha256=ePmo7cUAiBZARkM_3K4GKYZXxV73An_aioS1m-AAJis,6181
159
- ominfra-0.0.0.dev404.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
160
- ominfra-0.0.0.dev404.dist-info/METADATA,sha256=4AUeyQjAzXq65B-5bP5u80OK4F6RZxsDNsxxgoghtR4,2377
161
- ominfra-0.0.0.dev404.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
162
- ominfra-0.0.0.dev404.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
163
- ominfra-0.0.0.dev404.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
164
- ominfra-0.0.0.dev404.dist-info/RECORD,,
159
+ ominfra-0.0.0.dev406.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
160
+ ominfra-0.0.0.dev406.dist-info/METADATA,sha256=mwtEK8cLrFU8fVhCKpz2s85DtngKzTcWoLvhLvINQ9Y,2377
161
+ ominfra-0.0.0.dev406.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
162
+ ominfra-0.0.0.dev406.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
163
+ ominfra-0.0.0.dev406.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
164
+ ominfra-0.0.0.dev406.dist-info/RECORD,,