ominfra 0.0.0.dev148__py3-none-any.whl → 0.0.0.dev150__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.
Files changed (36) hide show
  1. ominfra/clouds/aws/auth.py +7 -9
  2. ominfra/clouds/aws/cli.py +1 -1
  3. ominfra/clouds/aws/journald2aws/driver.py +4 -4
  4. ominfra/clouds/aws/logs.py +4 -5
  5. ominfra/clouds/gcp/auth.py +1 -1
  6. ominfra/configs.py +3 -4
  7. ominfra/journald/messages.py +3 -3
  8. ominfra/journald/tailer.py +2 -2
  9. ominfra/manage/commands/base.py +2 -2
  10. ominfra/manage/commands/interp.py +3 -3
  11. ominfra/manage/commands/subprocess.py +3 -4
  12. ominfra/manage/deploy/paths.py +12 -15
  13. ominfra/manage/main.py +72 -75
  14. ominfra/manage/remote/_main.py +6 -7
  15. ominfra/manage/remote/execution.py +7 -10
  16. ominfra/manage/remote/spawning.py +3 -3
  17. ominfra/scripts/journald2aws.py +508 -147
  18. ominfra/scripts/manage.py +772 -183
  19. ominfra/scripts/supervisor.py +1144 -783
  20. ominfra/supervisor/dispatchers.py +1 -1
  21. ominfra/supervisor/groupsimpl.py +2 -2
  22. ominfra/supervisor/http.py +7 -7
  23. ominfra/supervisor/inject.py +4 -4
  24. ominfra/supervisor/io.py +1 -1
  25. ominfra/supervisor/main.py +1 -1
  26. ominfra/supervisor/processimpl.py +2 -2
  27. ominfra/supervisor/spawningimpl.py +9 -10
  28. ominfra/supervisor/supervisor.py +3 -3
  29. ominfra/supervisor/types.py +1 -1
  30. ominfra/tailscale/cli.py +1 -1
  31. {ominfra-0.0.0.dev148.dist-info → ominfra-0.0.0.dev150.dist-info}/METADATA +3 -3
  32. {ominfra-0.0.0.dev148.dist-info → ominfra-0.0.0.dev150.dist-info}/RECORD +36 -36
  33. {ominfra-0.0.0.dev148.dist-info → ominfra-0.0.0.dev150.dist-info}/LICENSE +0 -0
  34. {ominfra-0.0.0.dev148.dist-info → ominfra-0.0.0.dev150.dist-info}/WHEEL +0 -0
  35. {ominfra-0.0.0.dev148.dist-info → ominfra-0.0.0.dev150.dist-info}/entry_points.txt +0 -0
  36. {ominfra-0.0.0.dev148.dist-info → ominfra-0.0.0.dev150.dist-info}/top_level.txt +0 -0
@@ -7,6 +7,7 @@
7
7
  import abc
8
8
  import argparse
9
9
  import base64
10
+ import collections
10
11
  import collections.abc
11
12
  import contextlib
12
13
  import dataclasses as dc
@@ -62,6 +63,11 @@ CallableT = ta.TypeVar('CallableT', bound=ta.Callable)
62
63
 
63
64
  # ../../../../omlish/lite/check.py
64
65
  SizedT = ta.TypeVar('SizedT', bound=ta.Sized)
66
+ CheckMessage = ta.Union[str, ta.Callable[..., ta.Optional[str]], None] # ta.TypeAlias
67
+ CheckLateConfigureFn = ta.Callable[['Checks'], None]
68
+ CheckOnRaiseFn = ta.Callable[[Exception], None] # ta.TypeAlias
69
+ CheckExceptionFactory = ta.Callable[..., Exception] # ta.TypeAlias
70
+ CheckArgsRenderer = ta.Callable[..., ta.Optional[str]] # ta.TypeAlias
65
71
 
66
72
  # ../../../../omlish/lite/contextmanagers.py
67
73
  ExitStackedT = ta.TypeVar('ExitStackedT', bound='ExitStacked')
@@ -952,99 +958,454 @@ def async_cached_nullary(fn): # ta.Callable[..., T]) -> ta.Callable[..., T]:
952
958
 
953
959
  ########################################
954
960
  # ../../../../../omlish/lite/check.py
961
+ """
962
+ TODO:
963
+ - def maybe(v: lang.Maybe[T])
964
+ - patch / override lite.check ?
965
+ - checker interface?
966
+ """
967
+
968
+
969
+ ##
970
+
971
+
972
+ class Checks:
973
+ def __init__(self) -> None:
974
+ super().__init__()
975
+
976
+ self._config_lock = threading.RLock()
977
+ self._on_raise_fns: ta.Sequence[CheckOnRaiseFn] = []
978
+ self._exception_factory: CheckExceptionFactory = Checks.default_exception_factory
979
+ self._args_renderer: ta.Optional[CheckArgsRenderer] = None
980
+ self._late_configure_fns: ta.Sequence[CheckLateConfigureFn] = []
981
+
982
+ @staticmethod
983
+ def default_exception_factory(exc_cls: ta.Type[Exception], *args, **kwargs) -> Exception:
984
+ return exc_cls(*args, **kwargs) # noqa
985
+
986
+ #
987
+
988
+ def register_on_raise(self, fn: CheckOnRaiseFn) -> None:
989
+ with self._config_lock:
990
+ self._on_raise_fns = [*self._on_raise_fns, fn]
991
+
992
+ def unregister_on_raise(self, fn: CheckOnRaiseFn) -> None:
993
+ with self._config_lock:
994
+ self._on_raise_fns = [e for e in self._on_raise_fns if e != fn]
995
+
996
+ #
997
+
998
+ def set_exception_factory(self, factory: CheckExceptionFactory) -> None:
999
+ self._exception_factory = factory
1000
+
1001
+ def set_args_renderer(self, renderer: ta.Optional[CheckArgsRenderer]) -> None:
1002
+ self._args_renderer = renderer
1003
+
1004
+ #
1005
+
1006
+ def register_late_configure(self, fn: CheckLateConfigureFn) -> None:
1007
+ with self._config_lock:
1008
+ self._late_configure_fns = [*self._late_configure_fns, fn]
1009
+
1010
+ def _late_configure(self) -> None:
1011
+ if not self._late_configure_fns:
1012
+ return
1013
+
1014
+ with self._config_lock:
1015
+ if not (lc := self._late_configure_fns):
1016
+ return
1017
+
1018
+ for fn in lc:
1019
+ fn(self)
1020
+
1021
+ self._late_configure_fns = []
1022
+
1023
+ #
1024
+
1025
+ class _ArgsKwargs:
1026
+ def __init__(self, *args, **kwargs):
1027
+ self.args = args
1028
+ self.kwargs = kwargs
1029
+
1030
+ def _raise(
1031
+ self,
1032
+ exception_type: ta.Type[Exception],
1033
+ default_message: str,
1034
+ message: CheckMessage,
1035
+ ak: _ArgsKwargs = _ArgsKwargs(),
1036
+ *,
1037
+ render_fmt: ta.Optional[str] = None,
1038
+ ) -> ta.NoReturn:
1039
+ exc_args = ()
1040
+ if callable(message):
1041
+ message = ta.cast(ta.Callable, message)(*ak.args, **ak.kwargs)
1042
+ if isinstance(message, tuple):
1043
+ message, *exc_args = message # type: ignore
1044
+
1045
+ if message is None:
1046
+ message = default_message
1047
+
1048
+ self._late_configure()
1049
+
1050
+ if render_fmt is not None and (af := self._args_renderer) is not None:
1051
+ rendered_args = af(render_fmt, *ak.args)
1052
+ if rendered_args is not None:
1053
+ message = f'{message} : {rendered_args}'
1054
+
1055
+ exc = self._exception_factory(
1056
+ exception_type,
1057
+ message,
1058
+ *exc_args,
1059
+ *ak.args,
1060
+ **ak.kwargs,
1061
+ )
1062
+
1063
+ for fn in self._on_raise_fns:
1064
+ fn(exc)
1065
+
1066
+ raise exc
1067
+
1068
+ #
1069
+
1070
+ def _unpack_isinstance_spec(self, spec: ta.Any) -> tuple:
1071
+ if isinstance(spec, type):
1072
+ return (spec,)
1073
+ if not isinstance(spec, tuple):
1074
+ spec = (spec,)
1075
+ if None in spec:
1076
+ spec = tuple(filter(None, spec)) + (None.__class__,) # noqa
1077
+ if ta.Any in spec:
1078
+ spec = (object,)
1079
+ return spec
1080
+
1081
+ def isinstance(self, v: ta.Any, spec: ta.Union[ta.Type[T], tuple], msg: CheckMessage = None) -> T: # noqa
1082
+ if not isinstance(v, self._unpack_isinstance_spec(spec)):
1083
+ self._raise(
1084
+ TypeError,
1085
+ 'Must be instance',
1086
+ msg,
1087
+ Checks._ArgsKwargs(v, spec),
1088
+ render_fmt='not isinstance(%s, %s)',
1089
+ )
1090
+
1091
+ return v
1092
+
1093
+ def of_isinstance(self, spec: ta.Union[ta.Type[T], tuple], msg: CheckMessage = None) -> ta.Callable[[ta.Any], T]:
1094
+ def inner(v):
1095
+ return self.isinstance(v, self._unpack_isinstance_spec(spec), msg)
1096
+
1097
+ return inner
1098
+
1099
+ def cast(self, v: ta.Any, cls: ta.Type[T], msg: CheckMessage = None) -> T: # noqa
1100
+ if not isinstance(v, cls):
1101
+ self._raise(
1102
+ TypeError,
1103
+ 'Must be instance',
1104
+ msg,
1105
+ Checks._ArgsKwargs(v, cls),
1106
+ )
1107
+
1108
+ return v
1109
+
1110
+ def of_cast(self, cls: ta.Type[T], msg: CheckMessage = None) -> ta.Callable[[T], T]:
1111
+ def inner(v):
1112
+ return self.cast(v, cls, msg)
1113
+
1114
+ return inner
1115
+
1116
+ def not_isinstance(self, v: T, spec: ta.Any, msg: CheckMessage = None) -> T: # noqa
1117
+ if isinstance(v, self._unpack_isinstance_spec(spec)):
1118
+ self._raise(
1119
+ TypeError,
1120
+ 'Must not be instance',
1121
+ msg,
1122
+ Checks._ArgsKwargs(v, spec),
1123
+ render_fmt='isinstance(%s, %s)',
1124
+ )
1125
+
1126
+ return v
955
1127
 
1128
+ def of_not_isinstance(self, spec: ta.Any, msg: CheckMessage = None) -> ta.Callable[[T], T]:
1129
+ def inner(v):
1130
+ return self.not_isinstance(v, self._unpack_isinstance_spec(spec), msg)
956
1131
 
957
- def check_isinstance(v: ta.Any, spec: ta.Union[ta.Type[T], tuple]) -> T:
958
- if not isinstance(v, spec):
959
- raise TypeError(v)
960
- return v
1132
+ return inner
961
1133
 
1134
+ ##
962
1135
 
963
- def check_not_isinstance(v: T, spec: ta.Union[type, tuple]) -> T:
964
- if isinstance(v, spec):
965
- raise TypeError(v)
966
- return v
1136
+ def issubclass(self, v: ta.Type[T], spec: ta.Any, msg: CheckMessage = None) -> ta.Type[T]: # noqa
1137
+ if not issubclass(v, spec):
1138
+ self._raise(
1139
+ TypeError,
1140
+ 'Must be subclass',
1141
+ msg,
1142
+ Checks._ArgsKwargs(v, spec),
1143
+ render_fmt='not issubclass(%s, %s)',
1144
+ )
1145
+
1146
+ return v
1147
+
1148
+ def not_issubclass(self, v: ta.Type[T], spec: ta.Any, msg: CheckMessage = None) -> ta.Type[T]: # noqa
1149
+ if issubclass(v, spec):
1150
+ self._raise(
1151
+ TypeError,
1152
+ 'Must not be subclass',
1153
+ msg,
1154
+ Checks._ArgsKwargs(v, spec),
1155
+ render_fmt='issubclass(%s, %s)',
1156
+ )
1157
+
1158
+ return v
1159
+
1160
+ #
1161
+
1162
+ def in_(self, v: T, c: ta.Container[T], msg: CheckMessage = None) -> T:
1163
+ if v not in c:
1164
+ self._raise(
1165
+ ValueError,
1166
+ 'Must be in',
1167
+ msg,
1168
+ Checks._ArgsKwargs(v, c),
1169
+ render_fmt='%s not in %s',
1170
+ )
1171
+
1172
+ return v
1173
+
1174
+ def not_in(self, v: T, c: ta.Container[T], msg: CheckMessage = None) -> T:
1175
+ if v in c:
1176
+ self._raise(
1177
+ ValueError,
1178
+ 'Must not be in',
1179
+ msg,
1180
+ Checks._ArgsKwargs(v, c),
1181
+ render_fmt='%s in %s',
1182
+ )
1183
+
1184
+ return v
1185
+
1186
+ def empty(self, v: SizedT, msg: CheckMessage = None) -> SizedT:
1187
+ if len(v) != 0:
1188
+ self._raise(
1189
+ ValueError,
1190
+ 'Must be empty',
1191
+ msg,
1192
+ Checks._ArgsKwargs(v),
1193
+ render_fmt='%s',
1194
+ )
1195
+
1196
+ return v
1197
+
1198
+ def iterempty(self, v: ta.Iterable[T], msg: CheckMessage = None) -> ta.Iterable[T]:
1199
+ it = iter(v)
1200
+ try:
1201
+ next(it)
1202
+ except StopIteration:
1203
+ pass
1204
+ else:
1205
+ self._raise(
1206
+ ValueError,
1207
+ 'Must be empty',
1208
+ msg,
1209
+ Checks._ArgsKwargs(v),
1210
+ render_fmt='%s',
1211
+ )
1212
+
1213
+ return v
1214
+
1215
+ def not_empty(self, v: SizedT, msg: CheckMessage = None) -> SizedT:
1216
+ if len(v) == 0:
1217
+ self._raise(
1218
+ ValueError,
1219
+ 'Must not be empty',
1220
+ msg,
1221
+ Checks._ArgsKwargs(v),
1222
+ render_fmt='%s',
1223
+ )
1224
+
1225
+ return v
1226
+
1227
+ def unique(self, it: ta.Iterable[T], msg: CheckMessage = None) -> ta.Iterable[T]:
1228
+ dupes = [e for e, c in collections.Counter(it).items() if c > 1]
1229
+ if dupes:
1230
+ self._raise(
1231
+ ValueError,
1232
+ 'Must be unique',
1233
+ msg,
1234
+ Checks._ArgsKwargs(it, dupes),
1235
+ )
967
1236
 
1237
+ return it
968
1238
 
969
- def check_none(v: T) -> None:
970
- if v is not None:
971
- raise ValueError(v)
1239
+ def single(self, obj: ta.Iterable[T], message: CheckMessage = None) -> T:
1240
+ try:
1241
+ [value] = obj
1242
+ except ValueError:
1243
+ self._raise(
1244
+ ValueError,
1245
+ 'Must be single',
1246
+ message,
1247
+ Checks._ArgsKwargs(obj),
1248
+ render_fmt='%s',
1249
+ )
972
1250
 
1251
+ return value
973
1252
 
974
- def check_not_none(v: ta.Optional[T]) -> T:
975
- if v is None:
976
- raise ValueError
977
- return v
1253
+ def opt_single(self, obj: ta.Iterable[T], message: CheckMessage = None) -> ta.Optional[T]:
1254
+ it = iter(obj)
1255
+ try:
1256
+ value = next(it)
1257
+ except StopIteration:
1258
+ return None
978
1259
 
1260
+ try:
1261
+ next(it)
1262
+ except StopIteration:
1263
+ return value # noqa
1264
+
1265
+ self._raise(
1266
+ ValueError,
1267
+ 'Must be empty or single',
1268
+ message,
1269
+ Checks._ArgsKwargs(obj),
1270
+ render_fmt='%s',
1271
+ )
979
1272
 
980
- def check_not(v: ta.Any) -> None:
981
- if v:
982
- raise ValueError(v)
983
- return v
1273
+ raise RuntimeError # noqa
984
1274
 
1275
+ #
985
1276
 
986
- def check_non_empty_str(v: ta.Optional[str]) -> str:
987
- if not v:
988
- raise ValueError
989
- return v
1277
+ def none(self, v: ta.Any, msg: CheckMessage = None) -> None:
1278
+ if v is not None:
1279
+ self._raise(
1280
+ ValueError,
1281
+ 'Must be None',
1282
+ msg,
1283
+ Checks._ArgsKwargs(v),
1284
+ render_fmt='%s',
1285
+ )
990
1286
 
1287
+ def not_none(self, v: ta.Optional[T], msg: CheckMessage = None) -> T:
1288
+ if v is None:
1289
+ self._raise(
1290
+ ValueError,
1291
+ 'Must not be None',
1292
+ msg,
1293
+ Checks._ArgsKwargs(v),
1294
+ render_fmt='%s',
1295
+ )
991
1296
 
992
- def check_state(v: bool, msg: str = 'Illegal state') -> None:
993
- if not v:
994
- raise ValueError(msg)
1297
+ return v
995
1298
 
1299
+ #
996
1300
 
997
- def check_equal(l: T, r: T) -> T:
998
- if l != r:
999
- raise ValueError(l, r)
1000
- return l
1301
+ def equal(self, v: T, o: ta.Any, msg: CheckMessage = None) -> T:
1302
+ if o != v:
1303
+ self._raise(
1304
+ ValueError,
1305
+ 'Must be equal',
1306
+ msg,
1307
+ Checks._ArgsKwargs(v, o),
1308
+ render_fmt='%s != %s',
1309
+ )
1001
1310
 
1311
+ return v
1002
1312
 
1003
- def check_not_equal(l: T, r: T) -> T:
1004
- if l == r:
1005
- raise ValueError(l, r)
1006
- return l
1313
+ def is_(self, v: T, o: ta.Any, msg: CheckMessage = None) -> T:
1314
+ if o is not v:
1315
+ self._raise(
1316
+ ValueError,
1317
+ 'Must be the same',
1318
+ msg,
1319
+ Checks._ArgsKwargs(v, o),
1320
+ render_fmt='%s is not %s',
1321
+ )
1007
1322
 
1323
+ return v
1008
1324
 
1009
- def check_is(l: T, r: T) -> T:
1010
- if l is not r:
1011
- raise ValueError(l, r)
1012
- return l
1325
+ def is_not(self, v: T, o: ta.Any, msg: CheckMessage = None) -> T:
1326
+ if o is v:
1327
+ self._raise(
1328
+ ValueError,
1329
+ 'Must not be the same',
1330
+ msg,
1331
+ Checks._ArgsKwargs(v, o),
1332
+ render_fmt='%s is %s',
1333
+ )
1013
1334
 
1335
+ return v
1014
1336
 
1015
- def check_is_not(l: T, r: ta.Any) -> T:
1016
- if l is r:
1017
- raise ValueError(l, r)
1018
- return l
1337
+ def callable(self, v: T, msg: CheckMessage = None) -> T: # noqa
1338
+ if not callable(v):
1339
+ self._raise(
1340
+ TypeError,
1341
+ 'Must be callable',
1342
+ msg,
1343
+ Checks._ArgsKwargs(v),
1344
+ render_fmt='%s',
1345
+ )
1019
1346
 
1347
+ return v # type: ignore
1020
1348
 
1021
- def check_in(v: T, c: ta.Container[T]) -> T:
1022
- if v not in c:
1023
- raise ValueError(v, c)
1024
- return v
1349
+ def non_empty_str(self, v: ta.Optional[str], msg: CheckMessage = None) -> str:
1350
+ if not isinstance(v, str) or not v:
1351
+ self._raise(
1352
+ ValueError,
1353
+ 'Must be non-empty str',
1354
+ msg,
1355
+ Checks._ArgsKwargs(v),
1356
+ render_fmt='%s',
1357
+ )
1025
1358
 
1359
+ return v
1026
1360
 
1027
- def check_not_in(v: T, c: ta.Container[T]) -> T:
1028
- if v in c:
1029
- raise ValueError(v, c)
1030
- return v
1361
+ def replacing(self, expected: ta.Any, old: ta.Any, new: T, msg: CheckMessage = None) -> T:
1362
+ if old != expected:
1363
+ self._raise(
1364
+ ValueError,
1365
+ 'Must be replacing',
1366
+ msg,
1367
+ Checks._ArgsKwargs(expected, old, new),
1368
+ render_fmt='%s -> %s -> %s',
1369
+ )
1031
1370
 
1371
+ return new
1032
1372
 
1033
- def check_single(vs: ta.Iterable[T]) -> T:
1034
- [v] = vs
1035
- return v
1373
+ def replacing_none(self, old: ta.Any, new: T, msg: CheckMessage = None) -> T:
1374
+ if old is not None:
1375
+ self._raise(
1376
+ ValueError,
1377
+ 'Must be replacing None',
1378
+ msg,
1379
+ Checks._ArgsKwargs(old, new),
1380
+ render_fmt='%s -> %s',
1381
+ )
1036
1382
 
1383
+ return new
1037
1384
 
1038
- def check_empty(v: SizedT) -> SizedT:
1039
- if len(v):
1040
- raise ValueError(v)
1041
- return v
1385
+ #
1042
1386
 
1387
+ def arg(self, v: bool, msg: CheckMessage = None) -> None:
1388
+ if not v:
1389
+ self._raise(
1390
+ RuntimeError,
1391
+ 'Argument condition not met',
1392
+ msg,
1393
+ Checks._ArgsKwargs(v),
1394
+ render_fmt='%s',
1395
+ )
1396
+
1397
+ def state(self, v: bool, msg: CheckMessage = None) -> None:
1398
+ if not v:
1399
+ self._raise(
1400
+ RuntimeError,
1401
+ 'State condition not met',
1402
+ msg,
1403
+ Checks._ArgsKwargs(v),
1404
+ render_fmt='%s',
1405
+ )
1043
1406
 
1044
- def check_non_empty(v: SizedT) -> SizedT:
1045
- if not len(v):
1046
- raise ValueError(v)
1047
- return v
1407
+
1408
+ check = Checks()
1048
1409
 
1049
1410
 
1050
1411
  ########################################
@@ -1319,7 +1680,7 @@ class AwsSigner:
1319
1680
  @staticmethod
1320
1681
  def _host_from_url(url: str) -> str:
1321
1682
  url_parts = urllib.parse.urlsplit(url)
1322
- host = check_non_empty_str(url_parts.hostname)
1683
+ host = check.non_empty_str(url_parts.hostname)
1323
1684
  default_ports = {
1324
1685
  'http': 80,
1325
1686
  'https': 443,
@@ -1333,7 +1694,7 @@ class AwsSigner:
1333
1694
  def _lower_case_http_map(d: ta.Mapping[str, ta.Sequence[str]]) -> ta.Mapping[str, ta.Sequence[str]]:
1334
1695
  o: ta.Dict[str, ta.List[str]] = {}
1335
1696
  for k, vs in d.items():
1336
- o.setdefault(k.lower(), []).extend(check_not_isinstance(vs, str))
1697
+ o.setdefault(k.lower(), []).extend(check.not_isinstance(vs, str))
1337
1698
  return o
1338
1699
 
1339
1700
  #
@@ -1366,12 +1727,12 @@ class AwsSigner:
1366
1727
  ])
1367
1728
 
1368
1729
  def _validate_request(self, req: Request) -> None:
1369
- check_non_empty_str(req.method)
1370
- check_equal(req.method.upper(), req.method)
1730
+ check.non_empty_str(req.method)
1731
+ check.equal(req.method.upper(), req.method)
1371
1732
  for k, vs in req.headers.items():
1372
- check_equal(k.strip(), k)
1733
+ check.equal(k.strip(), k)
1373
1734
  for v in vs:
1374
- check_equal(v.strip(), v)
1735
+ check.equal(v.strip(), v)
1375
1736
 
1376
1737
 
1377
1738
  AwsSigner._EMPTY_SHA256 = AwsSigner._sha256(b'') # noqa
@@ -1630,65 +1991,7 @@ class AwsDataclassMeta:
1630
1991
 
1631
1992
 
1632
1993
  ########################################
1633
- # ../../../../../omlish/lite/contextmanagers.py
1634
-
1635
-
1636
- ##
1637
-
1638
-
1639
- class ExitStacked:
1640
- _exit_stack: ta.Optional[contextlib.ExitStack] = None
1641
-
1642
- def __enter__(self: ExitStackedT) -> ExitStackedT:
1643
- check_state(self._exit_stack is None)
1644
- es = self._exit_stack = contextlib.ExitStack()
1645
- es.__enter__()
1646
- return self
1647
-
1648
- def __exit__(self, exc_type, exc_val, exc_tb):
1649
- if (es := self._exit_stack) is None:
1650
- return None
1651
- self._exit_contexts()
1652
- return es.__exit__(exc_type, exc_val, exc_tb)
1653
-
1654
- def _exit_contexts(self) -> None:
1655
- pass
1656
-
1657
- def _enter_context(self, cm: ta.ContextManager[T]) -> T:
1658
- es = check_not_none(self._exit_stack)
1659
- return es.enter_context(cm)
1660
-
1661
-
1662
- ##
1663
-
1664
-
1665
- @contextlib.contextmanager
1666
- def defer(fn: ta.Callable) -> ta.Generator[ta.Callable, None, None]:
1667
- try:
1668
- yield fn
1669
- finally:
1670
- fn()
1671
-
1672
-
1673
- @contextlib.contextmanager
1674
- def attr_setting(obj, attr, val, *, default=None): # noqa
1675
- not_set = object()
1676
- orig = getattr(obj, attr, not_set)
1677
- try:
1678
- setattr(obj, attr, val)
1679
- if orig is not not_set:
1680
- yield orig
1681
- else:
1682
- yield default
1683
- finally:
1684
- if orig is not_set:
1685
- delattr(obj, attr)
1686
- else:
1687
- setattr(obj, attr, orig)
1688
-
1689
-
1690
- ########################################
1691
- # ../../../../../omlish/lite/io.py
1994
+ # ../../../../../omlish/io/buffers.py
1692
1995
 
1693
1996
 
1694
1997
  class DelimitingBuffer:
@@ -1722,7 +2025,7 @@ class DelimitingBuffer:
1722
2025
  ) -> None:
1723
2026
  super().__init__()
1724
2027
 
1725
- self._delimiters = frozenset(check_isinstance(d, int) for d in delimiters)
2028
+ self._delimiters = frozenset(check.isinstance(d, int) for d in delimiters)
1726
2029
  self._keep_ends = keep_ends
1727
2030
  self._max_size = max_size
1728
2031
 
@@ -1753,7 +2056,7 @@ class DelimitingBuffer:
1753
2056
  return r
1754
2057
 
1755
2058
  def _append_and_reset(self, chunk: bytes) -> bytes:
1756
- buf = check_not_none(self._buf)
2059
+ buf = check.not_none(self._buf)
1757
2060
  if not buf.tell():
1758
2061
  return chunk
1759
2062
 
@@ -1875,7 +2178,7 @@ class IncrementalWriteBuffer:
1875
2178
  ) -> None:
1876
2179
  super().__init__()
1877
2180
 
1878
- check_non_empty(data)
2181
+ check.not_empty(data)
1879
2182
  self._len = len(data)
1880
2183
  self._write_size = write_size
1881
2184
 
@@ -1890,11 +2193,11 @@ class IncrementalWriteBuffer:
1890
2193
  return self._len - self._pos
1891
2194
 
1892
2195
  def write(self, fn: ta.Callable[[bytes], int]) -> int:
1893
- lst = check_non_empty(self._lst)
2196
+ lst = check.not_empty(self._lst)
1894
2197
 
1895
2198
  t = 0
1896
2199
  for i, d in enumerate(lst): # noqa
1897
- n = fn(check_non_empty(d))
2200
+ n = fn(check.not_empty(d))
1898
2201
  if not n:
1899
2202
  break
1900
2203
  t += n
@@ -1909,6 +2212,64 @@ class IncrementalWriteBuffer:
1909
2212
  return t
1910
2213
 
1911
2214
 
2215
+ ########################################
2216
+ # ../../../../../omlish/lite/contextmanagers.py
2217
+
2218
+
2219
+ ##
2220
+
2221
+
2222
+ class ExitStacked:
2223
+ _exit_stack: ta.Optional[contextlib.ExitStack] = None
2224
+
2225
+ def __enter__(self: ExitStackedT) -> ExitStackedT:
2226
+ check.state(self._exit_stack is None)
2227
+ es = self._exit_stack = contextlib.ExitStack()
2228
+ es.__enter__()
2229
+ return self
2230
+
2231
+ def __exit__(self, exc_type, exc_val, exc_tb):
2232
+ if (es := self._exit_stack) is None:
2233
+ return None
2234
+ self._exit_contexts()
2235
+ return es.__exit__(exc_type, exc_val, exc_tb)
2236
+
2237
+ def _exit_contexts(self) -> None:
2238
+ pass
2239
+
2240
+ def _enter_context(self, cm: ta.ContextManager[T]) -> T:
2241
+ es = check.not_none(self._exit_stack)
2242
+ return es.enter_context(cm)
2243
+
2244
+
2245
+ ##
2246
+
2247
+
2248
+ @contextlib.contextmanager
2249
+ def defer(fn: ta.Callable) -> ta.Generator[ta.Callable, None, None]:
2250
+ try:
2251
+ yield fn
2252
+ finally:
2253
+ fn()
2254
+
2255
+
2256
+ @contextlib.contextmanager
2257
+ def attr_setting(obj, attr, val, *, default=None): # noqa
2258
+ not_set = object()
2259
+ orig = getattr(obj, attr, not_set)
2260
+ try:
2261
+ setattr(obj, attr, val)
2262
+ if orig is not not_set:
2263
+ yield orig
2264
+ else:
2265
+ yield default
2266
+ finally:
2267
+ if orig is not_set:
2268
+ delattr(obj, attr)
2269
+ else:
2270
+ setattr(obj, attr, orig)
2271
+
2272
+
1912
2273
  ########################################
1913
2274
  # ../../../../../omlish/lite/logs.py
1914
2275
  """
@@ -2220,10 +2581,10 @@ class ProxyObjMarshaler(ObjMarshaler):
2220
2581
  m: ta.Optional[ObjMarshaler] = None
2221
2582
 
2222
2583
  def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
2223
- return check_not_none(self.m).marshal(o, ctx)
2584
+ return check.not_none(self.m).marshal(o, ctx)
2224
2585
 
2225
2586
  def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
2226
- return check_not_none(self.m).unmarshal(o, ctx)
2587
+ return check.not_none(self.m).unmarshal(o, ctx)
2227
2588
 
2228
2589
 
2229
2590
  @dc.dataclass(frozen=True)
@@ -2382,19 +2743,19 @@ class DatetimeObjMarshaler(ObjMarshaler):
2382
2743
 
2383
2744
  class DecimalObjMarshaler(ObjMarshaler):
2384
2745
  def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
2385
- return str(check_isinstance(o, decimal.Decimal))
2746
+ return str(check.isinstance(o, decimal.Decimal))
2386
2747
 
2387
2748
  def unmarshal(self, v: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
2388
- return decimal.Decimal(check_isinstance(v, str))
2749
+ return decimal.Decimal(check.isinstance(v, str))
2389
2750
 
2390
2751
 
2391
2752
  class FractionObjMarshaler(ObjMarshaler):
2392
2753
  def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
2393
- fr = check_isinstance(o, fractions.Fraction)
2754
+ fr = check.isinstance(o, fractions.Fraction)
2394
2755
  return [fr.numerator, fr.denominator]
2395
2756
 
2396
2757
  def unmarshal(self, v: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
2397
- num, denom = check_isinstance(v, list)
2758
+ num, denom = check.isinstance(v, list)
2398
2759
  return fractions.Fraction(num, denom)
2399
2760
 
2400
2761
 
@@ -2770,8 +3131,8 @@ class AwsLogMessageBuilder:
2770
3131
  ) -> None:
2771
3132
  super().__init__()
2772
3133
 
2773
- self._log_group_name = check_non_empty_str(log_group_name)
2774
- self._log_stream_name = check_non_empty_str(log_stream_name)
3134
+ self._log_group_name = check.non_empty_str(log_group_name)
3135
+ self._log_stream_name = check.non_empty_str(log_stream_name)
2775
3136
 
2776
3137
  if url is None:
2777
3138
  url = self.DEFAULT_URL.format(region_name=region_name)
@@ -2845,7 +3206,7 @@ class AwsLogMessageBuilder:
2845
3206
 
2846
3207
  post = AwsLogMessageBuilder.Post(
2847
3208
  url=self._url,
2848
- headers={k: check_single(v) for k, v in sig_req.headers.items()},
3209
+ headers={k: check.single(v) for k, v in sig_req.headers.items()},
2849
3210
  data=sig_req.payload,
2850
3211
  )
2851
3212
 
@@ -2913,7 +3274,7 @@ def build_config_named_children(
2913
3274
  lst: ta.List[ConfigMapping] = []
2914
3275
  if isinstance(o, ta.Mapping):
2915
3276
  for k, v in o.items():
2916
- check_isinstance(v, ta.Mapping)
3277
+ check.isinstance(v, ta.Mapping)
2917
3278
  if name_key in v:
2918
3279
  n = v[name_key]
2919
3280
  if k != n:
@@ -2923,7 +3284,7 @@ def build_config_named_children(
2923
3284
  lst.append({name_key: k, **v})
2924
3285
 
2925
3286
  else:
2926
- check_not_isinstance(o, str)
3287
+ check.not_isinstance(o, str)
2927
3288
  lst.extend(o)
2928
3289
 
2929
3290
  seen = set()
@@ -3005,7 +3366,7 @@ class JournalctlMessageBuilder:
3005
3366
  def feed(self, data: bytes) -> ta.Sequence[JournalctlMessage]:
3006
3367
  ret: ta.List[JournalctlMessage] = []
3007
3368
  for line in self._buf.feed(data):
3008
- ret.append(self._make_message(check_isinstance(line, bytes)))
3369
+ ret.append(self._make_message(check.isinstance(line, bytes)))
3009
3370
  return ret
3010
3371
 
3011
3372
 
@@ -3943,7 +4304,7 @@ class JournalctlTailerWorker(ThreadWorker):
3943
4304
  stdout=subprocess.PIPE,
3944
4305
  ) as self._proc:
3945
4306
  try:
3946
- stdout = check_not_none(self._proc.stdout)
4307
+ stdout = check.not_none(self._proc.stdout)
3947
4308
 
3948
4309
  fd = stdout.fileno()
3949
4310
  fl = fcntl.fcntl(fd, fcntl.F_GETFL)
@@ -4075,15 +4436,15 @@ class JournalctlToAwsDriver(ExitStacked):
4075
4436
  return None
4076
4437
 
4077
4438
  return AwsSigner.Credentials(
4078
- access_key_id=check_non_empty_str(self._config.aws_access_key_id),
4079
- secret_access_key=check_non_empty_str(self._config.aws_secret_access_key),
4439
+ access_key_id=check.non_empty_str(self._config.aws_access_key_id),
4440
+ secret_access_key=check.non_empty_str(self._config.aws_secret_access_key),
4080
4441
  )
4081
4442
 
4082
4443
  @cached_nullary
4083
4444
  def _aws_log_message_builder(self) -> AwsLogMessageBuilder:
4084
4445
  return AwsLogMessageBuilder(
4085
4446
  log_group_name=self._config.aws_log_group_name,
4086
- log_stream_name=check_non_empty_str(self._config.aws_log_stream_name),
4447
+ log_stream_name=check.non_empty_str(self._config.aws_log_stream_name),
4087
4448
  region_name=self._config.aws_region_name,
4088
4449
  credentials=self._aws_credentials(),
4089
4450
  )