ominfra 0.0.0.dev309__py3-none-any.whl → 0.0.0.dev311__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.
@@ -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.dev309
3
+ Version: 0.0.0.dev311
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.dev309
16
- Requires-Dist: omlish==0.0.0.dev309
15
+ Requires-Dist: omdev==0.0.0.dev311
16
+ Requires-Dist: omlish==0.0.0.dev311
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=pX5hD_O_oteVS4JdQP4n8NATQcVkGCQ1eyxio35ZjBw,171636
116
- ominfra/scripts/manage.py,sha256=Vzeo_UWOFsWhzwwRFcKG1vEcpeZgHTQXfF_Q_6-L7T8,381995
117
- ominfra/scripts/supervisor.py,sha256=exHXaTr8YApCuDldgCXwttMd8CGsqqf8eUb2Qn-K3sE,300275
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.dev309.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
160
- ominfra-0.0.0.dev309.dist-info/METADATA,sha256=F1ndaVYQdn6ddbu11uAowmRNq41D511FeDhOvTdFoSc,753
161
- ominfra-0.0.0.dev309.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
162
- ominfra-0.0.0.dev309.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
163
- ominfra-0.0.0.dev309.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
164
- ominfra-0.0.0.dev309.dist-info/RECORD,,
159
+ ominfra-0.0.0.dev311.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
160
+ ominfra-0.0.0.dev311.dist-info/METADATA,sha256=YZwLFQXaMectEkJLSKfnJLp7rDv9TY-_RmVgJ0e2hQw,753
161
+ ominfra-0.0.0.dev311.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
162
+ ominfra-0.0.0.dev311.dist-info/entry_points.txt,sha256=kgecQ2MgGrM9qK744BoKS3tMesaC3yjLnl9pa5CRczg,37
163
+ ominfra-0.0.0.dev311.dist-info/top_level.txt,sha256=E-b2OHkk_AOBLXHYZQ2EOFKl-_6uOGd8EjeG-Zy6h_w,8
164
+ ominfra-0.0.0.dev311.dist-info/RECORD,,