omlish 0.0.0.dev405__py3-none-any.whl → 0.0.0.dev406__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
omlish/.manifests.json CHANGED
@@ -5,9 +5,9 @@
5
5
  "file": "omlish/bootstrap/__main__.py",
6
6
  "line": 1,
7
7
  "value": {
8
- "$omdev.cli.types.CliModule": {
9
- "cmd_name": "bootstrap",
10
- "mod_name": "omlish.bootstrap.__main__"
8
+ "!omdev.cli.types.CliModule": {
9
+ "name": "bootstrap",
10
+ "module": "omlish.bootstrap.__main__"
11
11
  }
12
12
  }
13
13
  },
@@ -17,9 +17,9 @@
17
17
  "file": "omlish/diag/procfs.py",
18
18
  "line": 361,
19
19
  "value": {
20
- "$omdev.cli.types.CliModule": {
21
- "cmd_name": "procfs",
22
- "mod_name": "omlish.diag.procfs"
20
+ "!omdev.cli.types.CliModule": {
21
+ "name": "procfs",
22
+ "module": "omlish.diag.procfs"
23
23
  }
24
24
  }
25
25
  },
@@ -29,9 +29,9 @@
29
29
  "file": "omlish/formats/cbor.py",
30
30
  "line": 30,
31
31
  "value": {
32
- "$.codecs.base.LazyLoadedCodec": {
33
- "mod_name": "omlish.formats.cbor",
34
- "attr_name": "CBOR_CODEC",
32
+ "!.codecs.base.LazyLoadedCodec": {
33
+ "module": "omlish.formats.cbor",
34
+ "attr": "CBOR_CODEC",
35
35
  "name": "cbor",
36
36
  "aliases": null
37
37
  }
@@ -43,9 +43,9 @@
43
43
  "file": "omlish/formats/cloudpickle.py",
44
44
  "line": 30,
45
45
  "value": {
46
- "$.codecs.base.LazyLoadedCodec": {
47
- "mod_name": "omlish.formats.cloudpickle",
48
- "attr_name": "CLOUDPICKLE_CODEC",
46
+ "!.codecs.base.LazyLoadedCodec": {
47
+ "module": "omlish.formats.cloudpickle",
48
+ "attr": "CLOUDPICKLE_CODEC",
49
49
  "name": "cloudpickle",
50
50
  "aliases": null
51
51
  }
@@ -57,9 +57,9 @@
57
57
  "file": "omlish/formats/edn/codec.py",
58
58
  "line": 25,
59
59
  "value": {
60
- "$.codecs.base.LazyLoadedCodec": {
61
- "mod_name": "omlish.formats.edn.codec",
62
- "attr_name": "EDN_CODEC",
60
+ "!.codecs.base.LazyLoadedCodec": {
61
+ "module": "omlish.formats.edn.codec",
62
+ "attr": "EDN_CODEC",
63
63
  "name": "edn",
64
64
  "aliases": null
65
65
  }
@@ -71,9 +71,9 @@
71
71
  "file": "omlish/formats/ini/codec.py",
72
72
  "line": 25,
73
73
  "value": {
74
- "$.codecs.base.LazyLoadedCodec": {
75
- "mod_name": "omlish.formats.ini.codec",
76
- "attr_name": "INI_CODEC",
74
+ "!.codecs.base.LazyLoadedCodec": {
75
+ "module": "omlish.formats.ini.codec",
76
+ "attr": "INI_CODEC",
77
77
  "name": "ini",
78
78
  "aliases": null
79
79
  }
@@ -85,9 +85,9 @@
85
85
  "file": "omlish/formats/json/codecs.py",
86
86
  "line": 14,
87
87
  "value": {
88
- "$.codecs.base.LazyLoadedCodec": {
89
- "mod_name": "omlish.formats.json.codecs",
90
- "attr_name": "JSON_CODEC",
88
+ "!.codecs.base.LazyLoadedCodec": {
89
+ "module": "omlish.formats.json.codecs",
90
+ "attr": "JSON_CODEC",
91
91
  "name": "json",
92
92
  "aliases": null
93
93
  }
@@ -99,9 +99,9 @@
99
99
  "file": "omlish/formats/json/codecs.py",
100
100
  "line": 21,
101
101
  "value": {
102
- "$.codecs.base.LazyLoadedCodec": {
103
- "mod_name": "omlish.formats.json.codecs",
104
- "attr_name": "JSON_COMPACT_CODEC",
102
+ "!.codecs.base.LazyLoadedCodec": {
103
+ "module": "omlish.formats.json.codecs",
104
+ "attr": "JSON_COMPACT_CODEC",
105
105
  "name": "json-compact",
106
106
  "aliases": null
107
107
  }
@@ -113,9 +113,9 @@
113
113
  "file": "omlish/formats/json/codecs.py",
114
114
  "line": 28,
115
115
  "value": {
116
- "$.codecs.base.LazyLoadedCodec": {
117
- "mod_name": "omlish.formats.json.codecs",
118
- "attr_name": "JSON_PRETTY_CODEC",
116
+ "!.codecs.base.LazyLoadedCodec": {
117
+ "module": "omlish.formats.json.codecs",
118
+ "attr": "JSON_PRETTY_CODEC",
119
119
  "name": "json-pretty",
120
120
  "aliases": null
121
121
  }
@@ -127,9 +127,9 @@
127
127
  "file": "omlish/formats/json5/codec.py",
128
128
  "line": 73,
129
129
  "value": {
130
- "$.codecs.base.LazyLoadedCodec": {
131
- "mod_name": "omlish.formats.json5.codec",
132
- "attr_name": "JSON5_CODEC",
130
+ "!.codecs.base.LazyLoadedCodec": {
131
+ "module": "omlish.formats.json5.codec",
132
+ "attr": "JSON5_CODEC",
133
133
  "name": "json5",
134
134
  "aliases": null
135
135
  }
@@ -141,9 +141,9 @@
141
141
  "file": "omlish/formats/pickle.py",
142
142
  "line": 30,
143
143
  "value": {
144
- "$.codecs.base.LazyLoadedCodec": {
145
- "mod_name": "omlish.formats.pickle",
146
- "attr_name": "PICKLE_CODEC",
144
+ "!.codecs.base.LazyLoadedCodec": {
145
+ "module": "omlish.formats.pickle",
146
+ "attr": "PICKLE_CODEC",
147
147
  "name": "pickle",
148
148
  "aliases": null
149
149
  }
@@ -155,9 +155,9 @@
155
155
  "file": "omlish/formats/repr.py",
156
156
  "line": 24,
157
157
  "value": {
158
- "$.codecs.base.LazyLoadedCodec": {
159
- "mod_name": "omlish.formats.repr",
160
- "attr_name": "REPR_CODEC",
158
+ "!.codecs.base.LazyLoadedCodec": {
159
+ "module": "omlish.formats.repr",
160
+ "attr": "REPR_CODEC",
161
161
  "name": "repr",
162
162
  "aliases": null
163
163
  }
@@ -169,9 +169,9 @@
169
169
  "file": "omlish/formats/toml/codec.py",
170
170
  "line": 16,
171
171
  "value": {
172
- "$.codecs.base.LazyLoadedCodec": {
173
- "mod_name": "omlish.formats.toml.codec",
174
- "attr_name": "TOML_CODEC",
172
+ "!.codecs.base.LazyLoadedCodec": {
173
+ "module": "omlish.formats.toml.codec",
174
+ "attr": "TOML_CODEC",
175
175
  "name": "toml",
176
176
  "aliases": null
177
177
  }
@@ -183,9 +183,9 @@
183
183
  "file": "omlish/formats/yaml.py",
184
184
  "line": 255,
185
185
  "value": {
186
- "$.codecs.base.LazyLoadedCodec": {
187
- "mod_name": "omlish.formats.yaml",
188
- "attr_name": "YAML_CODEC",
186
+ "!.codecs.base.LazyLoadedCodec": {
187
+ "module": "omlish.formats.yaml",
188
+ "attr": "YAML_CODEC",
189
189
  "name": "yaml",
190
190
  "aliases": [
191
191
  "yml"
@@ -199,9 +199,9 @@
199
199
  "file": "omlish/formats/yaml.py",
200
200
  "line": 262,
201
201
  "value": {
202
- "$.codecs.base.LazyLoadedCodec": {
203
- "mod_name": "omlish.formats.yaml",
204
- "attr_name": "YAML_UNSAFE_CODEC",
202
+ "!.codecs.base.LazyLoadedCodec": {
203
+ "module": "omlish.formats.yaml",
204
+ "attr": "YAML_UNSAFE_CODEC",
205
205
  "name": "yaml-unsafe",
206
206
  "aliases": null
207
207
  }
@@ -213,9 +213,9 @@
213
213
  "file": "omlish/io/compress/brotli.py",
214
214
  "line": 46,
215
215
  "value": {
216
- "$.codecs.base.LazyLoadedCodec": {
217
- "mod_name": "omlish.io.compress.brotli",
218
- "attr_name": "BROTLI_CODEC",
216
+ "!.codecs.base.LazyLoadedCodec": {
217
+ "module": "omlish.io.compress.brotli",
218
+ "attr": "BROTLI_CODEC",
219
219
  "name": "brotli",
220
220
  "aliases": null
221
221
  }
@@ -227,9 +227,9 @@
227
227
  "file": "omlish/io/compress/bz2.py",
228
228
  "line": 60,
229
229
  "value": {
230
- "$.codecs.base.LazyLoadedCodec": {
231
- "mod_name": "omlish.io.compress.bz2",
232
- "attr_name": "BZ2_CODEC",
230
+ "!.codecs.base.LazyLoadedCodec": {
231
+ "module": "omlish.io.compress.bz2",
232
+ "attr": "BZ2_CODEC",
233
233
  "name": "bz2",
234
234
  "aliases": null
235
235
  }
@@ -241,9 +241,9 @@
241
241
  "file": "omlish/io/compress/gzip.py",
242
242
  "line": 349,
243
243
  "value": {
244
- "$.codecs.base.LazyLoadedCodec": {
245
- "mod_name": "omlish.io.compress.gzip",
246
- "attr_name": "GZIP_CODEC",
244
+ "!.codecs.base.LazyLoadedCodec": {
245
+ "module": "omlish.io.compress.gzip",
246
+ "attr": "GZIP_CODEC",
247
247
  "name": "gzip",
248
248
  "aliases": [
249
249
  "gz"
@@ -257,9 +257,9 @@
257
257
  "file": "omlish/io/compress/lz4.py",
258
258
  "line": 90,
259
259
  "value": {
260
- "$.codecs.base.LazyLoadedCodec": {
261
- "mod_name": "omlish.io.compress.lz4",
262
- "attr_name": "LZ4_CODEC",
260
+ "!.codecs.base.LazyLoadedCodec": {
261
+ "module": "omlish.io.compress.lz4",
262
+ "attr": "LZ4_CODEC",
263
263
  "name": "lz4",
264
264
  "aliases": null
265
265
  }
@@ -271,9 +271,9 @@
271
271
  "file": "omlish/io/compress/lzma.py",
272
272
  "line": 80,
273
273
  "value": {
274
- "$.codecs.base.LazyLoadedCodec": {
275
- "mod_name": "omlish.io.compress.lzma",
276
- "attr_name": "LZMA_CODEC",
274
+ "!.codecs.base.LazyLoadedCodec": {
275
+ "module": "omlish.io.compress.lzma",
276
+ "attr": "LZMA_CODEC",
277
277
  "name": "lzma",
278
278
  "aliases": null
279
279
  }
@@ -285,9 +285,9 @@
285
285
  "file": "omlish/io/compress/snappy.py",
286
286
  "line": 33,
287
287
  "value": {
288
- "$.codecs.base.LazyLoadedCodec": {
289
- "mod_name": "omlish.io.compress.snappy",
290
- "attr_name": "SNAPPY_CODEC",
288
+ "!.codecs.base.LazyLoadedCodec": {
289
+ "module": "omlish.io.compress.snappy",
290
+ "attr": "SNAPPY_CODEC",
291
291
  "name": "snappy",
292
292
  "aliases": null
293
293
  }
@@ -299,9 +299,9 @@
299
299
  "file": "omlish/io/compress/zlib.py",
300
300
  "line": 73,
301
301
  "value": {
302
- "$.codecs.base.LazyLoadedCodec": {
303
- "mod_name": "omlish.io.compress.zlib",
304
- "attr_name": "ZLIB_CODEC",
302
+ "!.codecs.base.LazyLoadedCodec": {
303
+ "module": "omlish.io.compress.zlib",
304
+ "attr": "ZLIB_CODEC",
305
305
  "name": "zlib",
306
306
  "aliases": null
307
307
  }
@@ -313,9 +313,9 @@
313
313
  "file": "omlish/io/compress/zstd.py",
314
314
  "line": 51,
315
315
  "value": {
316
- "$.codecs.base.LazyLoadedCodec": {
317
- "mod_name": "omlish.io.compress.zstd",
318
- "attr_name": "ZSTD_CODEC",
316
+ "!.codecs.base.LazyLoadedCodec": {
317
+ "module": "omlish.io.compress.zstd",
318
+ "attr": "ZSTD_CODEC",
319
319
  "name": "zstd",
320
320
  "aliases": null
321
321
  }
@@ -327,9 +327,9 @@
327
327
  "file": "omlish/os/pidfiles/__main__.py",
328
328
  "line": 1,
329
329
  "value": {
330
- "$omdev.cli.types.CliModule": {
331
- "cmd_name": "pidfiles",
332
- "mod_name": "omlish.os.pidfiles.__main__"
330
+ "!omdev.cli.types.CliModule": {
331
+ "name": "pidfiles",
332
+ "module": "omlish.os.pidfiles.__main__"
333
333
  }
334
334
  }
335
335
  },
@@ -339,9 +339,9 @@
339
339
  "file": "omlish/secrets/pwgen.py",
340
340
  "line": 78,
341
341
  "value": {
342
- "$omdev.cli.types.CliModule": {
343
- "cmd_name": "pwgen",
344
- "mod_name": "omlish.secrets.pwgen"
342
+ "!omdev.cli.types.CliModule": {
343
+ "name": "pwgen",
344
+ "module": "omlish.secrets.pwgen"
345
345
  }
346
346
  }
347
347
  },
@@ -351,12 +351,12 @@
351
351
  "file": "omlish/specs/jmespath/__main__.py",
352
352
  "line": 1,
353
353
  "value": {
354
- "$omdev.cli.types.CliModule": {
355
- "cmd_name": [
354
+ "!omdev.cli.types.CliModule": {
355
+ "name": [
356
356
  "jmespath",
357
357
  "jp"
358
358
  ],
359
- "mod_name": "omlish.specs.jmespath.__main__"
359
+ "module": "omlish.specs.jmespath.__main__"
360
360
  }
361
361
  }
362
362
  }
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev405'
2
- __revision__ = '2845f7bb7c8df0a75acb7e7dece1fc712a54aa05'
1
+ __version__ = '0.0.0.dev406'
2
+ __revision__ = '0862d2e5f3852ab4290573b9bea974cf1e8103a3'
3
3
 
4
4
 
5
5
  #
@@ -1,7 +1,7 @@
1
1
  # @omlish-manifest
2
- _CLI_MODULE = {'$omdev.cli.types.CliModule': {
3
- 'cmd_name': 'bootstrap',
4
- 'mod_name': __name__,
2
+ _CLI_MODULE = {'!omdev.cli.types.CliModule': {
3
+ 'name': 'bootstrap',
4
+ 'module': __name__,
5
5
  }}
6
6
 
7
7
 
omlish/codecs/base.py CHANGED
@@ -95,13 +95,13 @@ class LazyLoadedCodec(ModAttrManifest):
95
95
  @classmethod
96
96
  def new(
97
97
  cls,
98
- mod_name: str,
99
- attr_name: str,
98
+ module: str,
99
+ attr: str,
100
100
  codec: Codec,
101
101
  ) -> 'LazyLoadedCodec':
102
102
  return cls(
103
- mod_name=mod_name,
104
- attr_name=attr_name,
103
+ module=module,
104
+ attr=attr,
105
105
  name=codec.name,
106
106
  aliases=codec.aliases,
107
107
  )
omlish/diag/procfs.py CHANGED
@@ -359,9 +359,9 @@ def _main() -> None:
359
359
 
360
360
 
361
361
  # @omlish-manifest
362
- _CLI_MODULE = {'$omdev.cli.types.CliModule': {
363
- 'cmd_name': 'procfs',
364
- 'mod_name': __name__,
362
+ _CLI_MODULE = {'!omdev.cli.types.CliModule': {
363
+ 'name': 'procfs',
364
+ 'module': __name__,
365
365
  }}
366
366
 
367
367
 
omlish/formats/codecs.py CHANGED
@@ -85,12 +85,12 @@ def make_str_object_codec(
85
85
 
86
86
 
87
87
  def make_object_lazy_loaded_codec(
88
- mod_name: str,
89
- attr_name: str,
88
+ module: str,
89
+ attr: str,
90
90
  codec: ObjectCodec,
91
91
  ) -> codecs.LazyLoadedCodec:
92
92
  return codecs.LazyLoadedCodec.new(
93
- mod_name,
94
- attr_name,
93
+ module,
94
+ attr,
95
95
  codec,
96
96
  )
@@ -67,12 +67,12 @@ def make_compression_codec(
67
67
 
68
68
 
69
69
  def make_compression_lazy_loaded_codec(
70
- mod_name: str,
71
- attr_name: str,
70
+ module: str,
71
+ attr: str,
72
72
  codec: CompressionCodec,
73
73
  ) -> codecs.LazyLoadedCodec:
74
74
  return codecs.LazyLoadedCodec.new(
75
- mod_name,
76
- attr_name,
75
+ module,
76
+ attr,
77
77
  codec,
78
78
  )
omlish/manifests/base.py CHANGED
@@ -12,14 +12,14 @@ NameAliasesManifestT = ta.TypeVar('NameAliasesManifestT', bound='NameAliasesMani
12
12
 
13
13
  @dc.dataclass(frozen=True)
14
14
  class ModAttrManifest:
15
- mod_name: str
16
- attr_name: str
15
+ module: str
16
+ attr: str
17
17
 
18
18
  def load(self) -> ta.Any:
19
19
  import importlib # noqa
20
20
 
21
- mod = importlib.import_module(self.mod_name)
22
- return getattr(mod, self.attr_name)
21
+ mod = importlib.import_module(self.module)
22
+ return getattr(mod, self.attr)
23
23
 
24
24
 
25
25
  ##
@@ -31,35 +31,42 @@ class ManifestLoader:
31
31
  def __init__(
32
32
  self,
33
33
  package: 'ManifestLoader.LoadedPackage',
34
- manifest: Manifest,
34
+ resolved: 'ManifestLoader._ResolvedManifest',
35
35
  ) -> None:
36
36
  super().__init__()
37
37
 
38
38
  self._package = package
39
- self._manifest = manifest
40
-
41
- [(cls_key, value_dct)] = self._manifest.value.items() # noqa
42
- self._cls_key = cls_key
39
+ self._resolved = resolved
43
40
 
44
41
  def __repr__(self) -> str:
45
- return f'{self.__class__.__name__}@{id(self):x}(package={self._package!r}, class_key={self._cls_key!r})'
42
+ return (
43
+ f'{self.__class__.__name__}@{id(self):x}('
44
+ f'package={self._package.name!r}, '
45
+ f'module={self._resolved.module!r}, '
46
+ f'class_key={self._resolved.class_key!r}'
47
+ f')'
48
+ )
46
49
 
47
50
  @property
48
51
  def package(self) -> 'ManifestLoader.LoadedPackage':
49
52
  return self._package
50
53
 
54
+ @property
55
+ def module(self) -> str:
56
+ return self._resolved.module
57
+
58
+ @property
59
+ def class_key(self) -> str:
60
+ return self._resolved.class_key
61
+
51
62
  @property
52
63
  def manifest(self) -> Manifest:
53
- return self._manifest
64
+ return self._resolved.manifest
54
65
 
55
66
  @property
56
67
  def loader(self) -> 'ManifestLoader':
57
68
  return self._package.loader
58
69
 
59
- @property
60
- def class_key(self) -> str:
61
- return self._cls_key
62
-
63
70
  _value: ta.Any
64
71
 
65
72
  def value(self) -> ta.Any:
@@ -68,7 +75,7 @@ class ManifestLoader:
68
75
  except AttributeError:
69
76
  pass
70
77
 
71
- value = self.loader._instantiate_loaded_manifest(self) # noqa
78
+ value = self.loader._instantiate_resolved_manifest(self._resolved) # noqa
72
79
  self._value = value
73
80
  return value
74
81
 
@@ -86,7 +93,7 @@ class ManifestLoader:
86
93
  _manifests: ta.Sequence['ManifestLoader.LoadedManifest']
87
94
 
88
95
  def __repr__(self) -> str:
89
- return f'{self.__class__.__name__}(name={self._name!r})'
96
+ return f'{self.__class__.__name__}@{id(self):x}(name={self._name!r})'
90
97
 
91
98
  @property
92
99
  def loader(self) -> 'ManifestLoader':
@@ -287,14 +294,19 @@ class ManifestLoader:
287
294
 
288
295
  ##
289
296
 
297
+ @dc.dataclass()
290
298
  class ClassKeyError(Exception):
291
- pass
299
+ key: str
300
+ module: ta.Optional[str] = None
292
301
 
293
302
  def _load_class_uncached(self, key: str) -> type:
294
- if not key.startswith('$'):
303
+ if not key.startswith('!'):
295
304
  raise ManifestLoader.ClassKeyError(key)
296
305
 
297
306
  parts = key[1:].split('.')
307
+ if '' in parts:
308
+ raise ManifestLoader.ClassKeyError(key)
309
+
298
310
  pos = next(i for i, p in enumerate(parts) if p[0].isupper())
299
311
 
300
312
  mod_name = '.'.join(parts[:pos])
@@ -330,37 +342,79 @@ class ManifestLoader:
330
342
  raise TypeError(cls)
331
343
  mod_name = cls.__module__
332
344
  mod_name = self._module_reverse_remap.get(mod_name, mod_name)
333
- return f'${mod_name}.{cls.__qualname__}'
345
+ return f'!{mod_name}.{cls.__qualname__}'
346
+
347
+ ##
348
+
349
+ class _ResolvedManifest(ta.NamedTuple):
350
+ manifest: Manifest
351
+ package: str
352
+
353
+ module: str
354
+ class_key: str
355
+ value_dct: ta.Any
356
+
357
+ @classmethod
358
+ def _resolve_raw_manifest(
359
+ cls,
360
+ m: Manifest,
361
+ *,
362
+ package_name: str,
363
+ ) -> _ResolvedManifest:
364
+ # self._module = module
365
+ # self._class_key = class_key
366
+ if not m.module.startswith('.'):
367
+ raise NameError(m.module)
368
+
369
+ module = package_name + m.module
370
+
371
+ [(class_key, value_dct)] = m.value.items()
372
+
373
+ if not class_key.startswith('!'):
374
+ raise ManifestLoader.ClassKeyError(class_key, module=module)
375
+
376
+ if class_key.startswith('!.'):
377
+ class_key = f'!{package_name}{class_key[1:]}'
378
+
379
+ # FIXME: move to builder
380
+ # elif key.startswith('$.'):
381
+ # if module.startswith('.'):
382
+ # raise NameError(module)
383
+ # kl = key[1:].split('.')
384
+ # ml = module.split('.')
385
+ # lvl = len(kl) - kl[::-1].index('')
386
+ # if lvl >= len(ml):
387
+ # raise ManifestLoader.ClassKeyError(key, module=module)
388
+ # rn = '.'.join([*ml[:-lvl], *kl[lvl:]])
389
+ # return f'${rn}'
390
+
391
+ return ManifestLoader._ResolvedManifest(
392
+ manifest=m,
393
+ package=package_name,
394
+
395
+ module=module,
396
+ class_key=class_key,
397
+ value_dct=value_dct,
398
+ )
334
399
 
335
400
  ##
336
401
 
337
- def _deserialize_raw_manifests(self, obj: ta.Any, pkg_name: str) -> ta.Sequence[Manifest]:
402
+ @classmethod
403
+ def _deserialize_raw_manifests(cls, obj: ta.Any) -> ta.Sequence[Manifest]:
338
404
  if not isinstance(obj, (list, tuple)):
339
405
  raise TypeError(obj)
340
406
 
341
407
  lst: ta.List[Manifest] = []
342
408
  for e in obj:
343
- m = Manifest(**e)
344
-
345
- m = dc.replace(m, module=pkg_name + m.module)
346
-
347
- [(key, value_dct)] = m.value.items()
348
- if not key.startswith('$'):
349
- raise ManifestLoader.ClassKeyError(key)
350
- if key.startswith('$.'):
351
- key = f'${pkg_name}{key[1:]}'
352
- m = dc.replace(m, value={key: value_dct})
353
-
354
- lst.append(m)
409
+ lst.append(Manifest(**e))
355
410
 
356
411
  return lst
357
412
 
358
- #
359
-
360
- def _read_package_file_text(self, pkg_name: str, file_name: str) -> ta.Optional[str]:
413
+ @classmethod
414
+ def _read_package_file_text(cls, package_name: str, file_name: str) -> ta.Optional[str]:
361
415
  # importlib.resources.files actually imports the package - to avoid this, if possible, the file is read straight
362
416
  # off the filesystem.
363
- spec = importlib.util.find_spec(pkg_name)
417
+ spec = importlib.util.find_spec(package_name)
364
418
  if (
365
419
  spec is not None and
366
420
  isinstance(spec.loader, importlib.machinery.SourceFileLoader) and
@@ -375,17 +429,16 @@ class ManifestLoader:
375
429
  return f.read()
376
430
 
377
431
  from importlib import resources as importlib_resources # noqa
378
- t = importlib_resources.files(pkg_name).joinpath(file_name)
432
+ t = importlib_resources.files(package_name).joinpath(file_name)
379
433
  if not t.is_file():
380
434
  return None
381
435
  return t.read_text('utf-8')
382
436
 
383
- #
384
-
385
437
  MANIFESTS_FILE_NAME: ta.ClassVar[str] = '.manifests.json'
386
438
 
387
- def _load_package_uncached(self, pkg_name: str) -> ta.Optional[LoadedPackage]:
388
- src = self._read_package_file_text(pkg_name, self.MANIFESTS_FILE_NAME)
439
+ @classmethod
440
+ def _read_package_raw_manifests(cls, package_name: str) -> ta.Optional[ta.Sequence[Manifest]]:
441
+ src = cls._read_package_file_text(package_name, cls.MANIFESTS_FILE_NAME)
389
442
  if src is None:
390
443
  return None
391
444
 
@@ -393,13 +446,21 @@ class ManifestLoader:
393
446
  if not isinstance(obj, (list, tuple)):
394
447
  raise TypeError(obj)
395
448
 
396
- raw_lst = self._deserialize_raw_manifests(obj, pkg_name)
449
+ return cls._deserialize_raw_manifests(obj)
450
+
451
+ ##
452
+
453
+ def _load_package_uncached(self, package_name: str) -> ta.Optional[LoadedPackage]:
454
+ if (raw_lst := self._read_package_raw_manifests(package_name)) is None:
455
+ return None
397
456
 
398
- ld_pkg = ManifestLoader.LoadedPackage(self, pkg_name)
457
+ ld_pkg = ManifestLoader.LoadedPackage(self, package_name)
399
458
 
400
459
  ld_man_lst: ta.List[ManifestLoader.LoadedManifest] = []
401
460
  for raw in raw_lst:
402
- ld_man = ManifestLoader.LoadedManifest(ld_pkg, raw)
461
+ rsv = self._resolve_raw_manifest(raw, package_name=package_name)
462
+
463
+ ld_man = ManifestLoader.LoadedManifest(ld_pkg, rsv)
403
464
 
404
465
  ld_man_lst.append(ld_man)
405
466
 
@@ -407,19 +468,19 @@ class ManifestLoader:
407
468
 
408
469
  return ld_pkg
409
470
 
410
- def _load_package_locked(self, pkg_name: str) -> ta.Optional[LoadedPackage]:
471
+ def _load_package_locked(self, package_name: str) -> ta.Optional[LoadedPackage]:
411
472
  try:
412
- return self._loaded_packages[pkg_name]
473
+ return self._loaded_packages[package_name]
413
474
  except KeyError:
414
475
  pass
415
476
 
416
- pkg = self._load_package_uncached(pkg_name)
417
- self._loaded_packages[pkg_name] = pkg
477
+ pkg = self._load_package_uncached(package_name)
478
+ self._loaded_packages[package_name] = pkg
418
479
  return pkg
419
480
 
420
- def load_package(self, pkg_name: str) -> ta.Optional[LoadedPackage]:
481
+ def load_package(self, package_name: str) -> ta.Optional[LoadedPackage]:
421
482
  with self._lock:
422
- return self._load_package_locked(pkg_name)
483
+ return self._load_package_locked(package_name)
423
484
 
424
485
  ##
425
486
 
@@ -429,10 +490,9 @@ class ManifestLoader:
429
490
  else:
430
491
  return cls(**kwargs)
431
492
 
432
- def _instantiate_loaded_manifest(self, ld_man: LoadedManifest) -> ta.Any:
433
- [(cls_key, value_dct)] = ld_man.manifest.value.items()
434
- cls = self._load_class(cls_key)
435
- value = self._instantiate_value(cls, **value_dct)
493
+ def _instantiate_resolved_manifest(self, resolved: _ResolvedManifest) -> ta.Any:
494
+ cls = self._load_class(resolved.class_key)
495
+ value = self._instantiate_value(cls, **resolved.value_dct)
436
496
  return value
437
497
 
438
498
  ##
@@ -13,8 +13,8 @@ class StaticModAttrManifest(dc.Static, ModAttrManifest, abc.ABC):
13
13
  def __init_subclass__(cls, **kwargs: ta.Any) -> None:
14
14
  if (
15
15
  not (lang.is_abstract_class(cls) or abc.ABC in cls.__bases__) and
16
- 'mod_name' not in cls.__dict__
16
+ 'module' not in cls.__dict__
17
17
  ):
18
- setattr(cls, 'mod_name', cls.__module__)
18
+ setattr(cls, 'module', cls.__module__)
19
19
 
20
20
  super().__init_subclass__(**kwargs)
omlish/manifests/types.py CHANGED
@@ -9,7 +9,7 @@ import typing as ta
9
9
 
10
10
  @dc.dataclass(frozen=True)
11
11
  class ManifestOrigin:
12
- module: str
12
+ module: str # Always starts with exactly one '.'
13
13
  attr: ta.Optional[str] # None if inline
14
14
 
15
15
  file: str
@@ -18,4 +18,4 @@ class ManifestOrigin:
18
18
 
19
19
  @dc.dataclass(frozen=True)
20
20
  class Manifest(ManifestOrigin):
21
- value: ta.Any
21
+ value: ta.Any # [{class_key: value_dct}], where class_key is of the form `!.foo.bar.Class` or `!baz.quz.Class`
@@ -1,7 +1,7 @@
1
1
  # @omlish-manifest
2
- _CLI_MODULE = {'$omdev.cli.types.CliModule': {
3
- 'cmd_name': 'pidfiles',
4
- 'mod_name': __name__,
2
+ _CLI_MODULE = {'!omdev.cli.types.CliModule': {
3
+ 'name': 'pidfiles',
4
+ 'module': __name__,
5
5
  }}
6
6
 
7
7
 
omlish/secrets/pwgen.py CHANGED
@@ -76,9 +76,9 @@ def _main() -> None:
76
76
 
77
77
 
78
78
  # @omlish-manifest
79
- _CLI_MODULE = {'$omdev.cli.types.CliModule': {
80
- 'cmd_name': 'pwgen',
81
- 'mod_name': __name__,
79
+ _CLI_MODULE = {'!omdev.cli.types.CliModule': {
80
+ 'name': 'pwgen',
81
+ 'module': __name__,
82
82
  }}
83
83
 
84
84
 
@@ -1,7 +1,7 @@
1
1
  # @omlish-manifest
2
- _CLI_MODULE = {'$omdev.cli.types.CliModule': {
3
- 'cmd_name': ['jmespath', 'jp'],
4
- 'mod_name': __name__,
2
+ _CLI_MODULE = {'!omdev.cli.types.CliModule': {
3
+ 'name': ['jmespath', 'jp'],
4
+ 'module': __name__,
5
5
  }}
6
6
 
7
7
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev405
3
+ Version: 0.0.0.dev406
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -1,5 +1,5 @@
1
- omlish/.manifests.json,sha256=ftpXGlXqsqDmBh0eWXtndZBLj8Y6QVhS5g5lKgEAf3U,8587
2
- omlish/__about__.py,sha256=Zu2-AzTYNiCm8KVyeTpwqEU8oCTBUlyG8PBMsAwgeQI,3601
1
+ omlish/.manifests.json,sha256=uUbe0oz6BFhBWIVdOyiGxkVqyLfiT8LAeqlxAHWpZLY,8410
2
+ omlish/__about__.py,sha256=2BfLZ_Ga1VoW31FlBXVEirUy13Z-sUha0SeHaypArCM,3601
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=rer-TPOFDU6fYq_AWio_AmA-ckZ8JDY5shIzQ_yXfzA,8414
5
5
  omlish/cached.py,sha256=MLap_p0rdGoDIMVhXVHm1tsbcWobJF0OanoodV03Ju8,542
@@ -61,7 +61,7 @@ omlish/asyncs/ioproxy/proxier.py,sha256=dYXiVkDJVCzasMP4eMNSvSO1eNsd6CIRTtLyoa8Y
61
61
  omlish/asyncs/ioproxy/proxy.py,sha256=s9bnjVPkTVtW5dh_vcpKNwbzEhA2zZZKF-U1BWZ5LPo,3911
62
62
  omlish/asyncs/ioproxy/typing.py,sha256=ZM-9HRO4dpy-RqomSkyRha9s901ckL30bwjACi2TJ8s,2475
63
63
  omlish/bootstrap/__init__.py,sha256=JgP3xsEsCphIQs2jI4um2uPI0RN8nCPMXl6FuiPC1js,700
64
- omlish/bootstrap/__main__.py,sha256=4jCwsaogp0FrJjJZ85hzF4-WqluPeheHbfeoKynKvNs,194
64
+ omlish/bootstrap/__main__.py,sha256=GKhsZdPdJtzE4qnjt34-EvL07nLJVZD-d8nxfGl7EEI,188
65
65
  omlish/bootstrap/base.py,sha256=d8hqn4hp1XMMi5PgcJBQXPKmW47epu8CxBlqDZiRZb4,1073
66
66
  omlish/bootstrap/diag.py,sha256=nTHKrZBdyEYoTpctwOpwzSMbQ2dROGkxpdzWfoe2xZg,5353
67
67
  omlish/bootstrap/harness.py,sha256=BMFNTYG03V74WFW5zd6aaxIb6uzGeldiR3VX2alQwlU,1994
@@ -69,7 +69,7 @@ omlish/bootstrap/main.py,sha256=RQAQVb_Cbk_Lnu-hSGMAo-aVQVIJ-E_TW7ZLsPO-ECk,5909
69
69
  omlish/bootstrap/marshal.py,sha256=aKLeiOyPW6DelVK78dmw0axQzOMHX-ALrSqOOzYh05w,486
70
70
  omlish/bootstrap/sys.py,sha256=r06ZroT2Rv0CBHiEweqDV6oWaMGNhFc4u0XBMBv3nnY,8793
71
71
  omlish/codecs/__init__.py,sha256=-FDwRJFGagg-fZyQ8wup4GPuR6gHpmaChzthlykn-kY,876
72
- omlish/codecs/base.py,sha256=IVnJlduvhiH1imul4DPhl2gHBWS76774AV5h86dX0ls,2214
72
+ omlish/codecs/base.py,sha256=nKAQKF0985xosHIP0mAkUZnr8lfHFj66ShnxL0OfdQE,2193
73
73
  omlish/codecs/bytes.py,sha256=3DxyQQCvFcP3mQ5G93f_mygXEb-7I8buM8EyzUcx2Is,2155
74
74
  omlish/codecs/chain.py,sha256=nbkL2nz0ZqT2lxYwSXktHh1YFTQ4Iii1Hp-fWjis6rc,532
75
75
  omlish/codecs/funcs.py,sha256=or0Jogczuzk7csDTRl-HURMEjl8LXXqxxXYK45xcM5w,855
@@ -211,7 +211,7 @@ omlish/diag/asts.py,sha256=MWh9XAG3m9L10FIJCyoNT2aU4Eft6tun_x9K0riq6Dk,3332
211
211
  omlish/diag/debug.py,sha256=ClED7kKXeVMyKrjGIxcq14kXk9kvUJfytBQwK9y7c4Q,1637
212
212
  omlish/diag/lslocks.py,sha256=VuA4MNNqXTcnHWsJvulGM6pNJRKmlXFXUZTfXpY0V6g,1750
213
213
  omlish/diag/lsof.py,sha256=5N5aZQ7UqEBgV-hj3_a8QcvALOeLlVb8otqF2hvucxY,9107
214
- omlish/diag/procfs.py,sha256=KaGTAA2Gj8eEEp7MjClRe4aimwzd-HDABThFzvq2cBQ,9684
214
+ omlish/diag/procfs.py,sha256=L-n-U8s76QwWpzwkS4AP7CJp2_V-sy3QXvYKVTFxcAE,9678
215
215
  omlish/diag/procstats.py,sha256=EJEe2Zc58ykBoTfqMXro7H52aQa_pd6uC2hsIPFceso,825
216
216
  omlish/diag/ps.py,sha256=MEpMU6fbkh0bSWrOHh_okOa0JDTUSUQUVSYBdh1TGvE,1672
217
217
  omlish/diag/pycharm.py,sha256=9Mgn5T2ZdlEUL3VV-GzVmCBs_ZtIpLwaUzP6pgHEUEo,4712
@@ -249,7 +249,7 @@ omlish/dom/rendering.py,sha256=5cQK3A_uifh3Th5v3c0nx-tW8d1KyGL6C9tASPaNVNI,4336
249
249
  omlish/formats/__init__.py,sha256=T0AG1gFnqQ5JiHN0UPQjQ-7g5tnxMIG-mgOvMYExYAM,21
250
250
  omlish/formats/cbor.py,sha256=o_Hbe4kthO9CeXK-FySrw0dHVlrdyTo2Y8PpGRDfZ3c,514
251
251
  omlish/formats/cloudpickle.py,sha256=16si4yUp_pAdDWGECAWf6HLA2PwSANGGgDoMLGZUem8,579
252
- omlish/formats/codecs.py,sha256=HBQzco_BT73xshv2l8FrDTaAKTH-A8Y4vXiabXPELGY,1655
252
+ omlish/formats/codecs.py,sha256=n_02fv1Qk2ixG9vDkTZKdRHGWPKnvDBDdOMVKfnElOI,1641
253
253
  omlish/formats/dotenv.py,sha256=60RHhpNmLhqT7ISeA79MmSc7Sq8AxF5nKj7VPjdroZU,19320
254
254
  omlish/formats/pickle.py,sha256=jdp4E9WH9qVPBE3sSqbqDtUo18RbTSIiSpSzJ-IEVZw,529
255
255
  omlish/formats/props.py,sha256=rPycJ-_b76NSNc2b_dZ0F0zyKzuXK8v6K6fqcV8uCRQ,18933
@@ -403,7 +403,7 @@ omlish/io/compress/adapters.py,sha256=LJHhjwMHXstoLyX_q0QhGoBAcqyYGWfzhzQbGBXHzH
403
403
  omlish/io/compress/base.py,sha256=X-B9zC_JAJ84ozO4Vl_7mG3o6zkF6jZfcXO5JmDftGk,620
404
404
  omlish/io/compress/brotli.py,sha256=sNDX5HmEVqg9_xID5NTFPAWuvlNPw5ixfOnnIWwZf_o,1189
405
405
  omlish/io/compress/bz2.py,sha256=HtwBuBYHJ3MyWO9xJ0XhWpyIYTA3OszLrpu_J4kRRPA,1534
406
- omlish/io/compress/codecs.py,sha256=dpJKoELXy_xF5nLnQYGNu19tmHEaUPyyk7fVsOlXsWk,1790
406
+ omlish/io/compress/codecs.py,sha256=aN7XJnWdB-wCIaHVucTosdroQDfmNniXux5121MA5zg,1776
407
407
  omlish/io/compress/gzip.py,sha256=6nCWycCYo0_4cTMu4QMhu23MT1xbrwyf7E8sGGBkR_w,12199
408
408
  omlish/io/compress/lz4.py,sha256=qaze1yVXexjJyN18Adh8fbTm_5pEeyytx66KoMUNpCU,2759
409
409
  omlish/io/compress/lzma.py,sha256=qDyshBgBUSPcZpAyXiRXnqI7zx7x60UpPxn8K3nN8aM,2469
@@ -517,11 +517,11 @@ omlish/logs/standard.py,sha256=w0jS824YDvlzrGgAxKiPk9RoZ5V1b0ADiFsBEpKLuLY,3152
517
517
  omlish/logs/timing.py,sha256=qsQ3DB6swts1pxrFlmLWQzhH-3nzDrq1MUu7PxjjUyU,1519
518
518
  omlish/logs/utils.py,sha256=OkFWf1exmWImmT7BaSiIC7c0Fk9tAis-PRqo8H4ny3c,398
519
519
  omlish/manifests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
520
- omlish/manifests/base.py,sha256=Z5afzBJgI0tyTS8mPbYY4pYvoZu_xtdhRBOtZ3IIwzA,929
520
+ omlish/manifests/base.py,sha256=Dt44a3qppWaxkoi3naFFMetxbxw14qnz2naTKK93GNU,915
521
521
  omlish/manifests/globals.py,sha256=kVqQ-fT4kc7xWzLHoI731GviitFPv2v2yqw-p7t7Exs,2628
522
- omlish/manifests/loading.py,sha256=tnAxvyJRAncyKihaBH8oqcJmHKaunPXm1Y1OpAi3iQc,15870
523
- omlish/manifests/static.py,sha256=7YwOVh_Ek9_aTrWsWNO8kWS10_j4K7yv3TpXZSHsvDY,501
524
- omlish/manifests/types.py,sha256=5hQuY-WZ9VMqHZXr-9Dayg380JsnX2vJzXyw6vC6UDs,317
522
+ omlish/manifests/loading.py,sha256=guLx-3y4rqQ2YIgTtqlpCk59inePtcEUE19JrWDzleM,17639
523
+ omlish/manifests/static.py,sha256=9BaPBLkuzxHmg5A-5k9BjjBFINCdmFOIu06dMFgCfz4,497
524
+ omlish/manifests/types.py,sha256=NeOGuIVrcbqjCDbQ3MnCxxHAgHnw0CkWJsBzo230PWE,453
525
525
  omlish/marshal/.dataclasses.json,sha256=wXWUy_IR8AolAa2RQnqn_mo2QnmVcvUJmayIykdVl0I,22
526
526
  omlish/marshal/__init__.py,sha256=yquxGmP5r4ITDbR1_OCTy1y9Y5vU7SKL1gj467RVJkg,3554
527
527
  omlish/marshal/base.py,sha256=3GMrhJBcnVrVtlQRQLOMgvV66MciAYpHKEQi5Ns3dIk,11853
@@ -596,7 +596,7 @@ omlish/os/deathpacts/base.py,sha256=EGN3BWSXPv0s9kl_QLrWE31hTybDHCmsLc_w3U2VyHc,
596
596
  omlish/os/deathpacts/heartbeatfile.py,sha256=OybdvhM2kxBTuoJWOJJ5LcX-0lg3jTOvvD2HUunxDWU,1731
597
597
  omlish/os/deathpacts/pipe.py,sha256=mfN2UGsOaEmoh4jHi6D0vnjg420pNsyctb3ZTcNsdqI,3285
598
598
  omlish/os/pidfiles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
599
- omlish/os/pidfiles/__main__.py,sha256=AF8TwjK4xgHVnoLAP9dIWgKvT0vGhHJlfDW0tKZ7tx4,200
599
+ omlish/os/pidfiles/__main__.py,sha256=nfjVxFY9I2I7hfb81rCxX6zm2Rc3P87ySpUouy33vG8,194
600
600
  omlish/os/pidfiles/cli.py,sha256=dAKukx4mrarH8t7KZM4n_XSfTk3ycShGAFqRrirK5dw,2079
601
601
  omlish/os/pidfiles/manager.py,sha256=oOnL90ttOG5ba_k9XPJ18reP7M5S-_30ln4OAfYV5W8,2357
602
602
  omlish/os/pidfiles/pidfile.py,sha256=KlqrW7I-lYVDNJspFHE89i_A0HTTteT5B99b7vpTfNs,4400
@@ -611,7 +611,7 @@ omlish/secrets/all.py,sha256=xx1UyiokSFzdeR8c6Ro-Fi2XBUsQ2i0nR1foX12nH0c,464
611
611
  omlish/secrets/crypto.py,sha256=9D21lnvPhStwu8arD4ssT0ih0bDG-nlqIRdVgYL40xA,3708
612
612
  omlish/secrets/marshal.py,sha256=u90n1OfRfdpH1T2F0xK_pAPH1ENYL6acFt6XdVd3KvI,1986
613
613
  omlish/secrets/openssl.py,sha256=UT_dXJ4zA1s9e-UHoW_NLGHQO7iouUNPnJNkkpuw3JI,6213
614
- omlish/secrets/pwgen.py,sha256=5k7QMSysUfv9F65TDMdDlrhTIKy6QbMG3KT2HNVmnVg,1712
614
+ omlish/secrets/pwgen.py,sha256=Z5i1qMKK4idOZvWai5dXkI59gX7pYzFFlFYAj7qEmqA,1706
615
615
  omlish/secrets/pwhash.py,sha256=Jctv3QzcMvVPXJsWA3w3LDUlzmyUDGEWG9sLiJz1xaw,4107
616
616
  omlish/secrets/secrets.py,sha256=kGYUS0fyZEBdWyWhv_uroyZqz31bwuXwk9FAQMZIvdo,8012
617
617
  omlish/secrets/ssl.py,sha256=HnH5MS31X9Uid7Iw1CWqviaVwMLF1Ha8RxZiiE-_iF8,158
@@ -652,7 +652,7 @@ omlish/specs/irc/protocol/tags.py,sha256=M89vR2GgDNroEsiH2QNchVX2LmT6sMIXY7huTEv
652
652
  omlish/specs/irc/protocol/utils.py,sha256=tUbkShJov8oCsbg1KZE1EC5pCThXJTdXFcw0HBM5ApQ,692
653
653
  omlish/specs/jmespath/LICENSE,sha256=IH-ZZlZkS8XMkf_ubNVD1aYHQ2l_wd0tmHtXrCcYpRU,1113
654
654
  omlish/specs/jmespath/__init__.py,sha256=pppE1MqDU1mRchMZehpwLleMHDO-QGAGJKOKuAyuaiE,2187
655
- omlish/specs/jmespath/__main__.py,sha256=wIXm6bs08etNG_GZlN2rBkADPb0rKfL2HSkm8spnpxw,200
655
+ omlish/specs/jmespath/__main__.py,sha256=AkowPx7ASpK0E4EMq0MiwVarLDB7alConH-2mBOGYIA,194
656
656
  omlish/specs/jmespath/ast.py,sha256=qX8jiqyUZMSLtlmyORSEHM7jwMDTtoqCPM5tZPWtB6g,5648
657
657
  omlish/specs/jmespath/cli.py,sha256=oQ8u8sKM9kysB2rGChXrCl7RgsUgo6MNrWtzdLz4eIA,2147
658
658
  omlish/specs/jmespath/errors.py,sha256=sU0eqKUpgjnqNsk2UhiJRXTApMhLDfgvBaKE5RZFFIA,4440
@@ -908,9 +908,9 @@ omlish/typedvalues/marshal.py,sha256=AtBz7Jq-BfW8vwM7HSxSpR85JAXmxK2T0xDblmm1HI0
908
908
  omlish/typedvalues/of_.py,sha256=UXkxSj504WI2UrFlqdZJbu2hyDwBhL7XVrc2qdR02GQ,1309
909
909
  omlish/typedvalues/reflect.py,sha256=PAvKW6T4cW7u--iX80w3HWwZUS3SmIZ2_lQjT65uAyk,1026
910
910
  omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
911
- omlish-0.0.0.dev405.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
912
- omlish-0.0.0.dev405.dist-info/METADATA,sha256=y4Y668MaUQry-Qf4i3hWdu6-nugPJgTmu-hknnshYZI,18881
913
- omlish-0.0.0.dev405.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
914
- omlish-0.0.0.dev405.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
915
- omlish-0.0.0.dev405.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
916
- omlish-0.0.0.dev405.dist-info/RECORD,,
911
+ omlish-0.0.0.dev406.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
912
+ omlish-0.0.0.dev406.dist-info/METADATA,sha256=Pl8H4Xc-s6SxmB3XfirBXAfdyOb6tPhDnhR0h0zk6r0,18881
913
+ omlish-0.0.0.dev406.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
914
+ omlish-0.0.0.dev406.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
915
+ omlish-0.0.0.dev406.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
916
+ omlish-0.0.0.dev406.dist-info/RECORD,,