ominfra 0.0.0.dev148__py3-none-any.whl → 0.0.0.dev150__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
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
  )