ominfra 0.0.0.dev309__py3-none-any.whl → 0.0.0.dev310__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/journald2aws.py +101 -0
- ominfra/scripts/manage.py +101 -0
- ominfra/scripts/supervisor.py +101 -0
- {ominfra-0.0.0.dev309.dist-info → ominfra-0.0.0.dev310.dist-info}/METADATA +3 -3
- {ominfra-0.0.0.dev309.dist-info → ominfra-0.0.0.dev310.dist-info}/RECORD +9 -9
- {ominfra-0.0.0.dev309.dist-info → ominfra-0.0.0.dev310.dist-info}/WHEEL +0 -0
- {ominfra-0.0.0.dev309.dist-info → ominfra-0.0.0.dev310.dist-info}/entry_points.txt +0 -0
- {ominfra-0.0.0.dev309.dist-info → ominfra-0.0.0.dev310.dist-info}/licenses/LICENSE +0 -0
- {ominfra-0.0.0.dev309.dist-info → ominfra-0.0.0.dev310.dist-info}/top_level.txt +0 -0
ominfra/scripts/supervisor.py
CHANGED
@@ -825,29 +825,37 @@ class TomlFlags:
|
|
825
825
|
def set(self, key: TomlKey, flag: int, *, recursive: bool) -> None: # noqa: A003
|
826
826
|
cont = self._flags
|
827
827
|
key_parent, key_stem = key[:-1], key[-1]
|
828
|
+
|
828
829
|
for k in key_parent:
|
829
830
|
if k not in cont:
|
830
831
|
cont[k] = {'flags': set(), 'recursive_flags': set(), 'nested': {}}
|
831
832
|
cont = cont[k]['nested']
|
833
|
+
|
832
834
|
if key_stem not in cont:
|
833
835
|
cont[key_stem] = {'flags': set(), 'recursive_flags': set(), 'nested': {}}
|
836
|
+
|
834
837
|
cont[key_stem]['recursive_flags' if recursive else 'flags'].add(flag)
|
835
838
|
|
836
839
|
def is_(self, key: TomlKey, flag: int) -> bool:
|
837
840
|
if not key:
|
838
841
|
return False # document root has no flags
|
842
|
+
|
839
843
|
cont = self._flags
|
840
844
|
for k in key[:-1]:
|
841
845
|
if k not in cont:
|
842
846
|
return False
|
847
|
+
|
843
848
|
inner_cont = cont[k]
|
844
849
|
if flag in inner_cont['recursive_flags']:
|
845
850
|
return True
|
851
|
+
|
846
852
|
cont = inner_cont['nested']
|
853
|
+
|
847
854
|
key_stem = key[-1]
|
848
855
|
if key_stem in cont:
|
849
856
|
cont = cont[key_stem]
|
850
857
|
return flag in cont['flags'] or flag in cont['recursive_flags']
|
858
|
+
|
851
859
|
return False
|
852
860
|
|
853
861
|
|
@@ -865,24 +873,31 @@ class TomlNestedDict:
|
|
865
873
|
access_lists: bool = True,
|
866
874
|
) -> dict:
|
867
875
|
cont: ta.Any = self.dict
|
876
|
+
|
868
877
|
for k in key:
|
869
878
|
if k not in cont:
|
870
879
|
cont[k] = {}
|
880
|
+
|
871
881
|
cont = cont[k]
|
882
|
+
|
872
883
|
if access_lists and isinstance(cont, list):
|
873
884
|
cont = cont[-1]
|
885
|
+
|
874
886
|
if not isinstance(cont, dict):
|
875
887
|
raise KeyError('There is no nest behind this key')
|
888
|
+
|
876
889
|
return cont
|
877
890
|
|
878
891
|
def append_nest_to_list(self, key: TomlKey) -> None:
|
879
892
|
cont = self.get_or_create_nest(key[:-1])
|
893
|
+
|
880
894
|
last_key = key[-1]
|
881
895
|
if last_key in cont:
|
882
896
|
list_ = cont[last_key]
|
883
897
|
if not isinstance(list_, list):
|
884
898
|
raise KeyError('An object other than list found behind this key')
|
885
899
|
list_.append({})
|
900
|
+
|
886
901
|
else:
|
887
902
|
cont[last_key] = [{}]
|
888
903
|
|
@@ -952,23 +967,30 @@ class TomlParser:
|
|
952
967
|
char = self.src[self.pos]
|
953
968
|
except IndexError:
|
954
969
|
break
|
970
|
+
|
955
971
|
if char == '\n':
|
956
972
|
self.pos += 1
|
957
973
|
continue
|
974
|
+
|
958
975
|
if char in self.KEY_INITIAL_CHARS:
|
959
976
|
self.key_value_rule(header)
|
960
977
|
self.skip_chars(self.WS)
|
978
|
+
|
961
979
|
elif char == '[':
|
962
980
|
try:
|
963
981
|
second_char: ta.Optional[str] = self.src[self.pos + 1]
|
964
982
|
except IndexError:
|
965
983
|
second_char = None
|
984
|
+
|
966
985
|
self.flags.finalize_pending()
|
986
|
+
|
967
987
|
if second_char == '[':
|
968
988
|
header = self.create_list_rule()
|
969
989
|
else:
|
970
990
|
header = self.create_dict_rule()
|
991
|
+
|
971
992
|
self.skip_chars(self.WS)
|
993
|
+
|
972
994
|
elif char != '#':
|
973
995
|
raise self.suffixed_err('Invalid statement')
|
974
996
|
|
@@ -980,8 +1002,10 @@ class TomlParser:
|
|
980
1002
|
char = self.src[self.pos]
|
981
1003
|
except IndexError:
|
982
1004
|
break
|
1005
|
+
|
983
1006
|
if char != '\n':
|
984
1007
|
raise self.suffixed_err('Expected newline or end of document after a statement')
|
1008
|
+
|
985
1009
|
self.pos += 1
|
986
1010
|
|
987
1011
|
return self.data.dict
|
@@ -1010,7 +1034,9 @@ class TomlParser:
|
|
1010
1034
|
if not error_on.isdisjoint(self.src[self.pos:new_pos]):
|
1011
1035
|
while self.src[self.pos] not in error_on:
|
1012
1036
|
self.pos += 1
|
1037
|
+
|
1013
1038
|
raise self.suffixed_err(f'Found invalid character {self.src[self.pos]!r}')
|
1039
|
+
|
1014
1040
|
self.pos = new_pos
|
1015
1041
|
|
1016
1042
|
def skip_comment(self) -> None:
|
@@ -1018,6 +1044,7 @@ class TomlParser:
|
|
1018
1044
|
char: ta.Optional[str] = self.src[self.pos]
|
1019
1045
|
except IndexError:
|
1020
1046
|
char = None
|
1047
|
+
|
1021
1048
|
if char == '#':
|
1022
1049
|
self.pos += 1
|
1023
1050
|
self.skip_until(
|
@@ -1041,7 +1068,9 @@ class TomlParser:
|
|
1041
1068
|
|
1042
1069
|
if self.flags.is_(key, TomlFlags.EXPLICIT_NEST) or self.flags.is_(key, TomlFlags.FROZEN):
|
1043
1070
|
raise self.suffixed_err(f'Cannot declare {key} twice')
|
1071
|
+
|
1044
1072
|
self.flags.set(key, TomlFlags.EXPLICIT_NEST, recursive=False)
|
1073
|
+
|
1045
1074
|
try:
|
1046
1075
|
self.data.get_or_create_nest(key)
|
1047
1076
|
except KeyError:
|
@@ -1049,20 +1078,25 @@ class TomlParser:
|
|
1049
1078
|
|
1050
1079
|
if not self.src.startswith(']', self.pos):
|
1051
1080
|
raise self.suffixed_err("Expected ']' at the end of a table declaration")
|
1081
|
+
|
1052
1082
|
self.pos += 1
|
1053
1083
|
return key
|
1054
1084
|
|
1055
1085
|
def create_list_rule(self) -> TomlKey:
|
1056
1086
|
self.pos += 2 # Skip "[["
|
1057
1087
|
self.skip_chars(self.WS)
|
1088
|
+
|
1058
1089
|
key = self.parse_key()
|
1059
1090
|
|
1060
1091
|
if self.flags.is_(key, TomlFlags.FROZEN):
|
1061
1092
|
raise self.suffixed_err(f'Cannot mutate immutable namespace {key}')
|
1093
|
+
|
1062
1094
|
# Free the namespace now that it points to another empty list item...
|
1063
1095
|
self.flags.unset_all(key)
|
1096
|
+
|
1064
1097
|
# ...but this key precisely is still prohibited from table declaration
|
1065
1098
|
self.flags.set(key, TomlFlags.EXPLICIT_NEST, recursive=False)
|
1099
|
+
|
1066
1100
|
try:
|
1067
1101
|
self.data.append_nest_to_list(key)
|
1068
1102
|
except KeyError:
|
@@ -1070,6 +1104,7 @@ class TomlParser:
|
|
1070
1104
|
|
1071
1105
|
if not self.src.startswith(']]', self.pos):
|
1072
1106
|
raise self.suffixed_err("Expected ']]' at the end of an array declaration")
|
1107
|
+
|
1073
1108
|
self.pos += 2
|
1074
1109
|
return key
|
1075
1110
|
|
@@ -1083,6 +1118,7 @@ class TomlParser:
|
|
1083
1118
|
# Check that dotted key syntax does not redefine an existing table
|
1084
1119
|
if self.flags.is_(cont_key, TomlFlags.EXPLICIT_NEST):
|
1085
1120
|
raise self.suffixed_err(f'Cannot redefine namespace {cont_key}')
|
1121
|
+
|
1086
1122
|
# Containers in the relative path can't be opened with the table syntax or dotted key/value syntax in
|
1087
1123
|
# following table sections.
|
1088
1124
|
self.flags.add_pending(cont_key, TomlFlags.EXPLICIT_NEST)
|
@@ -1094,41 +1130,54 @@ class TomlParser:
|
|
1094
1130
|
nest = self.data.get_or_create_nest(abs_key_parent)
|
1095
1131
|
except KeyError:
|
1096
1132
|
raise self.suffixed_err('Cannot overwrite a value') from None
|
1133
|
+
|
1097
1134
|
if key_stem in nest:
|
1098
1135
|
raise self.suffixed_err('Cannot overwrite a value')
|
1136
|
+
|
1099
1137
|
# Mark inline table and array namespaces recursively immutable
|
1100
1138
|
if isinstance(value, (dict, list)):
|
1101
1139
|
self.flags.set(header + key, TomlFlags.FROZEN, recursive=True)
|
1140
|
+
|
1102
1141
|
nest[key_stem] = value
|
1103
1142
|
|
1104
1143
|
def parse_key_value_pair(self) -> ta.Tuple[TomlKey, ta.Any]:
|
1105
1144
|
key = self.parse_key()
|
1145
|
+
|
1106
1146
|
try:
|
1107
1147
|
char: ta.Optional[str] = self.src[self.pos]
|
1108
1148
|
except IndexError:
|
1109
1149
|
char = None
|
1150
|
+
|
1110
1151
|
if char != '=':
|
1111
1152
|
raise self.suffixed_err("Expected '=' after a key in a key/value pair")
|
1153
|
+
|
1112
1154
|
self.pos += 1
|
1113
1155
|
self.skip_chars(self.WS)
|
1156
|
+
|
1114
1157
|
value = self.parse_value()
|
1115
1158
|
return key, value
|
1116
1159
|
|
1117
1160
|
def parse_key(self) -> TomlKey:
|
1118
1161
|
key_part = self.parse_key_part()
|
1119
1162
|
key: TomlKey = (key_part,)
|
1163
|
+
|
1120
1164
|
self.skip_chars(self.WS)
|
1165
|
+
|
1121
1166
|
while True:
|
1122
1167
|
try:
|
1123
1168
|
char: ta.Optional[str] = self.src[self.pos]
|
1124
1169
|
except IndexError:
|
1125
1170
|
char = None
|
1171
|
+
|
1126
1172
|
if char != '.':
|
1127
1173
|
return key
|
1174
|
+
|
1128
1175
|
self.pos += 1
|
1129
1176
|
self.skip_chars(self.WS)
|
1177
|
+
|
1130
1178
|
key_part = self.parse_key_part()
|
1131
1179
|
key += (key_part,)
|
1180
|
+
|
1132
1181
|
self.skip_chars(self.WS)
|
1133
1182
|
|
1134
1183
|
def parse_key_part(self) -> str:
|
@@ -1136,14 +1185,18 @@ class TomlParser:
|
|
1136
1185
|
char: ta.Optional[str] = self.src[self.pos]
|
1137
1186
|
except IndexError:
|
1138
1187
|
char = None
|
1188
|
+
|
1139
1189
|
if char in self.BARE_KEY_CHARS:
|
1140
1190
|
start_pos = self.pos
|
1141
1191
|
self.skip_chars(self.BARE_KEY_CHARS)
|
1142
1192
|
return self.src[start_pos:self.pos]
|
1193
|
+
|
1143
1194
|
if char == "'":
|
1144
1195
|
return self.parse_literal_str()
|
1196
|
+
|
1145
1197
|
if char == '"':
|
1146
1198
|
return self.parse_one_line_basic_str()
|
1199
|
+
|
1147
1200
|
raise self.suffixed_err('Invalid initial character for a key part')
|
1148
1201
|
|
1149
1202
|
def parse_one_line_basic_str(self) -> str:
|
@@ -1158,6 +1211,7 @@ class TomlParser:
|
|
1158
1211
|
if self.src.startswith(']', self.pos):
|
1159
1212
|
self.pos += 1
|
1160
1213
|
return array
|
1214
|
+
|
1161
1215
|
while True:
|
1162
1216
|
val = self.parse_value()
|
1163
1217
|
array.append(val)
|
@@ -1167,11 +1221,14 @@ class TomlParser:
|
|
1167
1221
|
if c == ']':
|
1168
1222
|
self.pos += 1
|
1169
1223
|
return array
|
1224
|
+
|
1170
1225
|
if c != ',':
|
1171
1226
|
raise self.suffixed_err('Unclosed array')
|
1227
|
+
|
1172
1228
|
self.pos += 1
|
1173
1229
|
|
1174
1230
|
self.skip_comments_and_array_ws()
|
1231
|
+
|
1175
1232
|
if self.src.startswith(']', self.pos):
|
1176
1233
|
self.pos += 1
|
1177
1234
|
return array
|
@@ -1182,54 +1239,72 @@ class TomlParser:
|
|
1182
1239
|
flags = TomlFlags()
|
1183
1240
|
|
1184
1241
|
self.skip_chars(self.WS)
|
1242
|
+
|
1185
1243
|
if self.src.startswith('}', self.pos):
|
1186
1244
|
self.pos += 1
|
1187
1245
|
return nested_dict.dict
|
1246
|
+
|
1188
1247
|
while True:
|
1189
1248
|
key, value = self.parse_key_value_pair()
|
1190
1249
|
key_parent, key_stem = key[:-1], key[-1]
|
1250
|
+
|
1191
1251
|
if flags.is_(key, TomlFlags.FROZEN):
|
1192
1252
|
raise self.suffixed_err(f'Cannot mutate immutable namespace {key}')
|
1253
|
+
|
1193
1254
|
try:
|
1194
1255
|
nest = nested_dict.get_or_create_nest(key_parent, access_lists=False)
|
1195
1256
|
except KeyError:
|
1196
1257
|
raise self.suffixed_err('Cannot overwrite a value') from None
|
1258
|
+
|
1197
1259
|
if key_stem in nest:
|
1198
1260
|
raise self.suffixed_err(f'Duplicate inline table key {key_stem!r}')
|
1261
|
+
|
1199
1262
|
nest[key_stem] = value
|
1200
1263
|
self.skip_chars(self.WS)
|
1264
|
+
|
1201
1265
|
c = self.src[self.pos:self.pos + 1]
|
1202
1266
|
if c == '}':
|
1203
1267
|
self.pos += 1
|
1204
1268
|
return nested_dict.dict
|
1269
|
+
|
1205
1270
|
if c != ',':
|
1206
1271
|
raise self.suffixed_err('Unclosed inline table')
|
1272
|
+
|
1207
1273
|
if isinstance(value, (dict, list)):
|
1208
1274
|
flags.set(key, TomlFlags.FROZEN, recursive=True)
|
1275
|
+
|
1209
1276
|
self.pos += 1
|
1210
1277
|
self.skip_chars(self.WS)
|
1211
1278
|
|
1212
1279
|
def parse_basic_str_escape(self, multiline: bool = False) -> str:
|
1213
1280
|
escape_id = self.src[self.pos:self.pos + 2]
|
1214
1281
|
self.pos += 2
|
1282
|
+
|
1215
1283
|
if multiline and escape_id in {'\\ ', '\\\t', '\\\n'}:
|
1216
1284
|
# Skip whitespace until next non-whitespace character or end of the doc. Error if non-whitespace is found
|
1217
1285
|
# before newline.
|
1218
1286
|
if escape_id != '\\\n':
|
1219
1287
|
self.skip_chars(self.WS)
|
1288
|
+
|
1220
1289
|
try:
|
1221
1290
|
char = self.src[self.pos]
|
1222
1291
|
except IndexError:
|
1223
1292
|
return ''
|
1293
|
+
|
1224
1294
|
if char != '\n':
|
1225
1295
|
raise self.suffixed_err("Unescaped '\\' in a string")
|
1296
|
+
|
1226
1297
|
self.pos += 1
|
1298
|
+
|
1227
1299
|
self.skip_chars(self.WS_AND_NEWLINE)
|
1228
1300
|
return ''
|
1301
|
+
|
1229
1302
|
if escape_id == '\\u':
|
1230
1303
|
return self.parse_hex_char(4)
|
1304
|
+
|
1231
1305
|
if escape_id == '\\U':
|
1232
1306
|
return self.parse_hex_char(8)
|
1307
|
+
|
1233
1308
|
try:
|
1234
1309
|
return self.BASIC_STR_ESCAPE_REPLACEMENTS[escape_id]
|
1235
1310
|
except KeyError:
|
@@ -1244,12 +1319,16 @@ class TomlParser:
|
|
1244
1319
|
|
1245
1320
|
def parse_hex_char(self, hex_len: int) -> str:
|
1246
1321
|
hex_str = self.src[self.pos:self.pos + hex_len]
|
1322
|
+
|
1247
1323
|
if len(hex_str) != hex_len or not self.HEXDIGIT_CHARS.issuperset(hex_str):
|
1248
1324
|
raise self.suffixed_err('Invalid hex value')
|
1325
|
+
|
1249
1326
|
self.pos += hex_len
|
1250
1327
|
hex_int = int(hex_str, 16)
|
1328
|
+
|
1251
1329
|
if not self.is_unicode_scalar_value(hex_int):
|
1252
1330
|
raise self.suffixed_err('Escaped character is not a Unicode scalar value')
|
1331
|
+
|
1253
1332
|
return chr(hex_int)
|
1254
1333
|
|
1255
1334
|
def parse_literal_str(self) -> str:
|
@@ -1275,6 +1354,7 @@ class TomlParser:
|
|
1275
1354
|
)
|
1276
1355
|
result = self.src[start_pos:self.pos]
|
1277
1356
|
self.pos += 3
|
1357
|
+
|
1278
1358
|
else:
|
1279
1359
|
delim = '"'
|
1280
1360
|
result = self.parse_basic_str(multiline=True)
|
@@ -1282,9 +1362,11 @@ class TomlParser:
|
|
1282
1362
|
# Add at maximum two extra apostrophes/quotes if the end sequence is 4 or 5 chars long instead of just 3.
|
1283
1363
|
if not self.src.startswith(delim, self.pos):
|
1284
1364
|
return result
|
1365
|
+
|
1285
1366
|
self.pos += 1
|
1286
1367
|
if not self.src.startswith(delim, self.pos):
|
1287
1368
|
return result + delim
|
1369
|
+
|
1288
1370
|
self.pos += 1
|
1289
1371
|
return result + (delim * 2)
|
1290
1372
|
|
@@ -1295,6 +1377,7 @@ class TomlParser:
|
|
1295
1377
|
else:
|
1296
1378
|
error_on = self.ILLEGAL_BASIC_STR_CHARS
|
1297
1379
|
parse_escapes = self.parse_basic_str_escape
|
1380
|
+
|
1298
1381
|
result = ''
|
1299
1382
|
start_pos = self.pos
|
1300
1383
|
while True:
|
@@ -1302,25 +1385,31 @@ class TomlParser:
|
|
1302
1385
|
char = self.src[self.pos]
|
1303
1386
|
except IndexError:
|
1304
1387
|
raise self.suffixed_err('Unterminated string') from None
|
1388
|
+
|
1305
1389
|
if char == '"':
|
1306
1390
|
if not multiline:
|
1307
1391
|
end_pos = self.pos
|
1308
1392
|
self.pos += 1
|
1309
1393
|
return result + self.src[start_pos:end_pos]
|
1394
|
+
|
1310
1395
|
if self.src.startswith('"""', self.pos):
|
1311
1396
|
end_pos = self.pos
|
1312
1397
|
self.pos += 3
|
1313
1398
|
return result + self.src[start_pos:end_pos]
|
1399
|
+
|
1314
1400
|
self.pos += 1
|
1315
1401
|
continue
|
1402
|
+
|
1316
1403
|
if char == '\\':
|
1317
1404
|
result += self.src[start_pos:self.pos]
|
1318
1405
|
parsed_escape = parse_escapes()
|
1319
1406
|
result += parsed_escape
|
1320
1407
|
start_pos = self.pos
|
1321
1408
|
continue
|
1409
|
+
|
1322
1410
|
if char in error_on:
|
1323
1411
|
raise self.suffixed_err(f'Illegal character {char!r}')
|
1412
|
+
|
1324
1413
|
self.pos += 1
|
1325
1414
|
|
1326
1415
|
def parse_value(self) -> ta.Any: # noqa: C901
|
@@ -1348,6 +1437,7 @@ class TomlParser:
|
|
1348
1437
|
if self.src.startswith('true', self.pos):
|
1349
1438
|
self.pos += 4
|
1350
1439
|
return True
|
1440
|
+
|
1351
1441
|
if char == 'f':
|
1352
1442
|
if self.src.startswith('false', self.pos):
|
1353
1443
|
self.pos += 5
|
@@ -1368,8 +1458,10 @@ class TomlParser:
|
|
1368
1458
|
datetime_obj = self.match_to_datetime(datetime_match)
|
1369
1459
|
except ValueError as e:
|
1370
1460
|
raise self.suffixed_err('Invalid date or datetime') from e
|
1461
|
+
|
1371
1462
|
self.pos = datetime_match.end()
|
1372
1463
|
return datetime_obj
|
1464
|
+
|
1373
1465
|
localtime_match = self.RE_LOCALTIME.match(self.src, self.pos)
|
1374
1466
|
if localtime_match:
|
1375
1467
|
self.pos = localtime_match.end()
|
@@ -1387,6 +1479,7 @@ class TomlParser:
|
|
1387
1479
|
if first_three in {'inf', 'nan'}:
|
1388
1480
|
self.pos += 3
|
1389
1481
|
return self.parse_float(first_three)
|
1482
|
+
|
1390
1483
|
first_four = self.src[self.pos:self.pos + 4]
|
1391
1484
|
if first_four in {'-inf', '+inf', '-nan', '+nan'}:
|
1392
1485
|
self.pos += 4
|
@@ -1397,11 +1490,13 @@ class TomlParser:
|
|
1397
1490
|
def coord_repr(self, pos: TomlPos) -> str:
|
1398
1491
|
if pos >= len(self.src):
|
1399
1492
|
return 'end of document'
|
1493
|
+
|
1400
1494
|
line = self.src.count('\n', 0, pos) + 1
|
1401
1495
|
if line == 1:
|
1402
1496
|
column = pos + 1
|
1403
1497
|
else:
|
1404
1498
|
column = pos - self.src.rindex('\n', 0, pos)
|
1499
|
+
|
1405
1500
|
return f'line {line}, column {column}'
|
1406
1501
|
|
1407
1502
|
def suffixed_err(self, msg: str, *, pos: ta.Optional[TomlPos] = None) -> TomlDecodeError:
|
@@ -1468,11 +1563,16 @@ class TomlParser:
|
|
1468
1563
|
offset_hour_str,
|
1469
1564
|
offset_minute_str,
|
1470
1565
|
) = match.groups()
|
1566
|
+
|
1471
1567
|
year, month, day = int(year_str), int(month_str), int(day_str)
|
1568
|
+
|
1472
1569
|
if hour_str is None:
|
1473
1570
|
return datetime.date(year, month, day)
|
1571
|
+
|
1474
1572
|
hour, minute, sec = int(hour_str), int(minute_str), int(sec_str)
|
1573
|
+
|
1475
1574
|
micros = int(micros_str.ljust(6, '0')) if micros_str else 0
|
1575
|
+
|
1476
1576
|
if offset_sign_str:
|
1477
1577
|
tz: ta.Optional[datetime.tzinfo] = toml_cached_tz(
|
1478
1578
|
offset_hour_str, offset_minute_str, offset_sign_str,
|
@@ -1481,6 +1581,7 @@ class TomlParser:
|
|
1481
1581
|
tz = datetime.UTC
|
1482
1582
|
else: # local date-time
|
1483
1583
|
tz = None
|
1584
|
+
|
1484
1585
|
return datetime.datetime(year, month, day, hour, minute, sec, micros, tzinfo=tz)
|
1485
1586
|
|
1486
1587
|
@classmethod
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ominfra
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev310
|
4
4
|
Summary: ominfra
|
5
5
|
Author: wrmsr
|
6
6
|
License: BSD-3-Clause
|
@@ -12,8 +12,8 @@ Classifier: Operating System :: OS Independent
|
|
12
12
|
Classifier: Operating System :: POSIX
|
13
13
|
Requires-Python: >=3.12
|
14
14
|
License-File: LICENSE
|
15
|
-
Requires-Dist: omdev==0.0.0.
|
16
|
-
Requires-Dist: omlish==0.0.0.
|
15
|
+
Requires-Dist: omdev==0.0.0.dev310
|
16
|
+
Requires-Dist: omlish==0.0.0.dev310
|
17
17
|
Provides-Extra: all
|
18
18
|
Requires-Dist: paramiko~=3.5; extra == "all"
|
19
19
|
Requires-Dist: asyncssh~=2.21; extra == "all"
|
@@ -112,9 +112,9 @@ ominfra/manage/targets/connection.py,sha256=rVI1YJxFClcF-sdttqWyIz9_XjPI01GUdwxY
|
|
112
112
|
ominfra/manage/targets/inject.py,sha256=P4597xWM-V3I_gCt2O71OLhYQkkXtuJvkYRsIbhhMcE,1561
|
113
113
|
ominfra/manage/targets/targets.py,sha256=7GP6UAZyJFEhpkJN6UQdpr_WN3p7C76v-s445y-WB6U,1885
|
114
114
|
ominfra/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
115
|
-
ominfra/scripts/journald2aws.py,sha256=
|
116
|
-
ominfra/scripts/manage.py,sha256=
|
117
|
-
ominfra/scripts/supervisor.py,sha256=
|
115
|
+
ominfra/scripts/journald2aws.py,sha256=dV6pWFzAY6U7K2N6Gtoydu8y6wC5I9C4b_Uhcg4PX0E,171737
|
116
|
+
ominfra/scripts/manage.py,sha256=Tn3o5IVguQLEFJfbG6hTmsItemFLSIp0YaV-OcvPQ5A,382096
|
117
|
+
ominfra/scripts/supervisor.py,sha256=Ths5j3GmbPoQlSVrr9XlIld_0N8swtgvxRolTT5JG5Q,300376
|
118
118
|
ominfra/supervisor/LICENSE.txt,sha256=ZrHY15PVR98y26Yg6iQfa-SXnUaYTDhrUsPVcEO5OKM,1874
|
119
119
|
ominfra/supervisor/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
120
120
|
ominfra/supervisor/__main__.py,sha256=I0yFw-C08OOiZ3BF6lF1Oiv789EQXu-_j6whDhQUTEA,66
|
@@ -156,9 +156,9 @@ ominfra/tailscale/api.py,sha256=C5-t_b6jZXUWcy5k8bXm7CFnk73pSdrlMOgGDeGVrpw,1370
|
|
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=auGP1LlbBJSFKUWNvQo_UzA8IsBNZBTMwEkFFRJ4FX4,6185
|
159
|
-
ominfra-0.0.0.
|
160
|
-
ominfra-0.0.0.
|
161
|
-
ominfra-0.0.0.
|
162
|
-
ominfra-0.0.0.
|
163
|
-
ominfra-0.0.0.
|
164
|
-
ominfra-0.0.0.
|
159
|
+
ominfra-0.0.0.dev310.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
160
|
+
ominfra-0.0.0.dev310.dist-info/METADATA,sha256=RXvsyEN3Eh95wLdX_cEWGaQDbhPjFs32Y2t75BZeYY8,753
|
161
|
+
ominfra-0.0.0.dev310.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
|
162
|
+
ominfra-0.0.0.dev310.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
|
163
|
+
ominfra-0.0.0.dev310.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
|
164
|
+
ominfra-0.0.0.dev310.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|