omlish 0.0.0.dev162__py3-none-any.whl → 0.0.0.dev163__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.
@@ -0,0 +1,58 @@
1
+ import dataclasses as dc
2
+ import typing as ta
3
+
4
+ from ... import codecs
5
+ from .base import Compression
6
+
7
+
8
+ ##
9
+
10
+
11
+ @dc.dataclass(frozen=True)
12
+ class CompressionEagerCodec(codecs.EagerCodec[bytes, bytes]):
13
+ compression: Compression
14
+
15
+ def encode(self, i: bytes) -> bytes:
16
+ return self.compression.compress(i)
17
+
18
+ def decode(self, o: bytes) -> bytes:
19
+ return self.compression.decompress(o)
20
+
21
+
22
+ ##
23
+
24
+
25
+ class CompressionCodec(codecs.Codec):
26
+ pass
27
+
28
+
29
+ def make_compression_codec(
30
+ name: str,
31
+ cls: type[Compression],
32
+ *,
33
+ aliases: ta.Collection[str] | None = None,
34
+ ) -> CompressionCodec:
35
+ return CompressionCodec(
36
+ name=name,
37
+ aliases=aliases,
38
+
39
+ input=bytes,
40
+ output=bytes,
41
+
42
+ new=lambda *args, **kwargs: CompressionEagerCodec(cls(*args, **kwargs)),
43
+ )
44
+
45
+
46
+ ##
47
+
48
+
49
+ def make_compression_lazy_loaded_codec(
50
+ mod_name: str,
51
+ attr_name: str,
52
+ codec: CompressionCodec,
53
+ ) -> codecs.LazyLoadedCodec:
54
+ return codecs.LazyLoadedCodec.new(
55
+ mod_name,
56
+ attr_name,
57
+ codec,
58
+ )
@@ -48,6 +48,8 @@ from ..generators import BytesSteppedReaderGenerator
48
48
  from ..generators.readers import PrependableBytesGeneratorReader
49
49
  from .base import Compression
50
50
  from .base import IncrementalCompression
51
+ from .codecs import make_compression_codec
52
+ from .codecs import make_compression_lazy_loaded_codec
51
53
 
52
54
 
53
55
  if ta.TYPE_CHECKING:
@@ -337,3 +339,12 @@ class IncrementalGzipDecompressor:
337
339
  stream_size += len(uncompress)
338
340
  pos += len(uncompress)
339
341
  check.none((yield uncompress))
342
+
343
+
344
+ ##
345
+
346
+
347
+ GZIP_CODEC = make_compression_codec('gzip', GzipCompression, aliases=['gz'])
348
+
349
+ # @omlish-manifest
350
+ _GZIP_LAZY_CODEC = make_compression_lazy_loaded_codec(__name__, 'GZIP_CODEC', GZIP_CODEC)
omlish/io/compress/lz4.py CHANGED
@@ -6,6 +6,8 @@ from ... import lang
6
6
  from ..generators import BytesSteppedGenerator
7
7
  from .base import Compression
8
8
  from .base import IncrementalCompression
9
+ from .codecs import make_compression_codec
10
+ from .codecs import make_compression_lazy_loaded_codec
9
11
 
10
12
 
11
13
  if ta.TYPE_CHECKING:
@@ -14,6 +16,9 @@ else:
14
16
  lz4_frame = lang.proxy_import('lz4.frame')
15
17
 
16
18
 
19
+ ##
20
+
21
+
17
22
  @dc.dataclass(frozen=True, kw_only=True)
18
23
  class Lz4Compression(Compression, IncrementalCompression):
19
24
  level: int = 0
@@ -75,3 +80,12 @@ class Lz4Compression(Compression, IncrementalCompression):
75
80
  return
76
81
  if (o := decompressor.decompress(i)):
77
82
  yield o
83
+
84
+
85
+ ##
86
+
87
+
88
+ LZ4_CODEC = make_compression_codec('lz4', Lz4Compression)
89
+
90
+ # @omlish-manifest
91
+ _LZ4_LAZY_CODEC = make_compression_lazy_loaded_codec(__name__, 'LZ4_CODEC', LZ4_CODEC)
@@ -9,6 +9,8 @@ from .adapters import CompressorObjectIncrementalAdapter
9
9
  from .adapters import DecompressorObjectIncrementalAdapter
10
10
  from .base import Compression
11
11
  from .base import IncrementalCompression
12
+ from .codecs import make_compression_codec
13
+ from .codecs import make_compression_lazy_loaded_codec
12
14
 
13
15
 
14
16
  if ta.TYPE_CHECKING:
@@ -17,6 +19,9 @@ else:
17
19
  lzma = lang.proxy_import('lzma')
18
20
 
19
21
 
22
+ ##
23
+
24
+
20
25
  @dc.dataclass(frozen=True, kw_only=True)
21
26
  class LzmaCompression(Compression, IncrementalCompression):
22
27
  format: int | None = None
@@ -65,3 +70,12 @@ class LzmaCompression(Compression, IncrementalCompression):
65
70
  ),
66
71
  trailing_error=lzma.LZMAError,
67
72
  )()
73
+
74
+
75
+ ##
76
+
77
+
78
+ LZMA_CODEC = make_compression_codec('lzma', LzmaCompression)
79
+
80
+ # @omlish-manifest
81
+ _LZMA_LAZY_CODEC = make_compression_lazy_loaded_codec(__name__, 'LZMA_CODEC', LZMA_CODEC)
@@ -3,6 +3,8 @@ import typing as ta
3
3
 
4
4
  from ... import lang
5
5
  from .base import Compression
6
+ from .codecs import make_compression_codec
7
+ from .codecs import make_compression_lazy_loaded_codec
6
8
 
7
9
 
8
10
  if ta.TYPE_CHECKING:
@@ -11,6 +13,9 @@ else:
11
13
  snappy = lang.proxy_import('snappy')
12
14
 
13
15
 
16
+ ##
17
+
18
+
14
19
  @dc.dataclass(frozen=True)
15
20
  class SnappyCompression(Compression):
16
21
  def compress(self, d: bytes) -> bytes:
@@ -18,3 +23,12 @@ class SnappyCompression(Compression):
18
23
 
19
24
  def decompress(self, d: bytes) -> bytes:
20
25
  return snappy.decompress(d)
26
+
27
+
28
+ ##
29
+
30
+
31
+ SNAPPY_CODEC = make_compression_codec('snappy', SnappyCompression)
32
+
33
+ # @omlish-manifest
34
+ _SNAPPY_LAZY_CODEC = make_compression_lazy_loaded_codec(__name__, 'SNAPPY_CODEC', SNAPPY_CODEC)
@@ -9,6 +9,8 @@ from .adapters import CompressorObjectIncrementalAdapter
9
9
  from .adapters import DecompressorObjectIncrementalAdapter
10
10
  from .base import Compression
11
11
  from .base import IncrementalCompression
12
+ from .codecs import make_compression_codec
13
+ from .codecs import make_compression_lazy_loaded_codec
12
14
 
13
15
 
14
16
  if ta.TYPE_CHECKING:
@@ -17,6 +19,9 @@ else:
17
19
  zlib = lang.proxy_import('zlib')
18
20
 
19
21
 
22
+ ##
23
+
24
+
20
25
  @dc.dataclass(frozen=True, kw_only=True)
21
26
  class ZlibCompression(Compression, IncrementalCompression):
22
27
  level: int = 9
@@ -58,3 +63,12 @@ class ZlibCompression(Compression, IncrementalCompression):
58
63
  ),
59
64
  trailing_error=OSError,
60
65
  )()
66
+
67
+
68
+ ##
69
+
70
+
71
+ ZLIB_CODEC = make_compression_codec('zlib', ZlibCompression)
72
+
73
+ # @omlish-manifest
74
+ _ZLIB_LAZY_CODEC = make_compression_lazy_loaded_codec(__name__, 'ZLIB_CODEC', ZLIB_CODEC)
@@ -3,6 +3,8 @@ import typing as ta
3
3
 
4
4
  from ... import lang
5
5
  from .base import Compression
6
+ from .codecs import make_compression_codec
7
+ from .codecs import make_compression_lazy_loaded_codec
6
8
 
7
9
 
8
10
  if ta.TYPE_CHECKING:
@@ -11,6 +13,9 @@ else:
11
13
  zstandard = lang.proxy_import('zstandard')
12
14
 
13
15
 
16
+ ##
17
+
18
+
14
19
  @dc.dataclass(frozen=True, kw_only=True)
15
20
  class ZstdCompression(Compression):
16
21
  level: int | None = None
@@ -28,3 +33,12 @@ class ZstdCompression(Compression):
28
33
  d,
29
34
  max_output_size=self.max_output_size,
30
35
  )
36
+
37
+
38
+ ##
39
+
40
+
41
+ ZSTD_CODEC = make_compression_codec('zstd', ZstdCompression)
42
+
43
+ # @omlish-manifest
44
+ _ZSTD_LAZY_CODEC = make_compression_lazy_loaded_codec(__name__, 'ZSTD_CODEC', ZSTD_CODEC)
omlish/lang/__init__.py CHANGED
@@ -112,6 +112,7 @@ from .functions import ( # noqa
112
112
  issubclass_of,
113
113
  maybe_call,
114
114
  opt_coalesce,
115
+ opt_fn,
115
116
  periodically,
116
117
  raise_,
117
118
  raising,
omlish/lang/functions.py CHANGED
@@ -4,6 +4,7 @@ import time
4
4
  import typing as ta
5
5
 
6
6
 
7
+ F = ta.TypeVar('F')
7
8
  T = ta.TypeVar('T')
8
9
  P = ta.ParamSpec('P')
9
10
  CallableT = ta.TypeVar('CallableT', bound=ta.Callable)
@@ -81,6 +82,16 @@ def identity(obj: T) -> T:
81
82
  return obj
82
83
 
83
84
 
85
+ def opt_fn(fn: ta.Callable[[F], T]) -> ta.Callable[[F | None], T | None]:
86
+ @functools.wraps(fn)
87
+ def inner(v: F | None) -> T | None:
88
+ if v is not None:
89
+ return fn(v)
90
+ else:
91
+ return None
92
+ return inner
93
+
94
+
84
95
  class constant(ta.Generic[T]): # noqa
85
96
  def __init__(self, obj: T) -> None:
86
97
  super().__init__()
omlish/manifests/load.py CHANGED
@@ -9,6 +9,7 @@ import dataclasses as dc
9
9
  import importlib.machinery
10
10
  import importlib.resources
11
11
  import json
12
+ import threading
12
13
  import typing as ta
13
14
 
14
15
  from .types import Manifest
@@ -25,6 +26,8 @@ class ManifestLoader:
25
26
  ) -> None:
26
27
  super().__init__()
27
28
 
29
+ self._lock = threading.RLock()
30
+
28
31
  self._module_remap = module_remap or {}
29
32
  self._module_reverse_remap = {v: k for k, v in self._module_remap.items()}
30
33
 
@@ -56,7 +59,7 @@ class ManifestLoader:
56
59
 
57
60
  #
58
61
 
59
- def load_cls(self, key: str) -> type:
62
+ def _load_cls(self, key: str) -> type:
60
63
  try:
61
64
  return self._cls_cache[key]
62
65
  except KeyError:
@@ -83,7 +86,13 @@ class ManifestLoader:
83
86
  self._cls_cache[key] = cls
84
87
  return cls
85
88
 
86
- def load_contents(self, obj: ta.Any, pkg_name: str) -> ta.Sequence[Manifest]:
89
+ def load_cls(self, key: str) -> type:
90
+ with self._lock:
91
+ return self._load_cls(key)
92
+
93
+ #
94
+
95
+ def _load_contents(self, obj: ta.Any, pkg_name: str) -> ta.Sequence[Manifest]:
87
96
  if not isinstance(obj, (list, tuple)):
88
97
  raise TypeError(obj)
89
98
 
@@ -104,7 +113,13 @@ class ManifestLoader:
104
113
 
105
114
  return lst
106
115
 
107
- def load_raw(self, pkg_name: str) -> ta.Optional[ta.Sequence[Manifest]]:
116
+ def load_contents(self, obj: ta.Any, pkg_name: str) -> ta.Sequence[Manifest]:
117
+ with self._lock:
118
+ return self.load_contents(obj, pkg_name)
119
+
120
+ #
121
+
122
+ def _load_raw(self, pkg_name: str) -> ta.Optional[ta.Sequence[Manifest]]:
108
123
  try:
109
124
  return self._raw_cache[pkg_name]
110
125
  except KeyError:
@@ -120,12 +135,18 @@ class ManifestLoader:
120
135
  if not isinstance(obj, (list, tuple)):
121
136
  raise TypeError(obj)
122
137
 
123
- lst = self.load_contents(obj, pkg_name)
138
+ lst = self._load_contents(obj, pkg_name)
124
139
 
125
140
  self._raw_cache[pkg_name] = lst
126
141
  return lst
127
142
 
128
- def load(
143
+ def load_raw(self, pkg_name: str) -> ta.Optional[ta.Sequence[Manifest]]:
144
+ with self._lock:
145
+ return self._load_raw(pkg_name)
146
+
147
+ #
148
+
149
+ def _load(
129
150
  self,
130
151
  *pkg_names: str,
131
152
  only: ta.Optional[ta.Iterable[type]] = None,
@@ -149,7 +170,7 @@ class ManifestLoader:
149
170
  if only_keys is not None and key not in only_keys:
150
171
  continue
151
172
 
152
- cls = self.load_cls(key)
173
+ cls = self._load_cls(key)
153
174
  value = cls(**value_dct)
154
175
 
155
176
  manifest = dc.replace(manifest, value=value)
@@ -157,6 +178,17 @@ class ManifestLoader:
157
178
 
158
179
  return lst
159
180
 
181
+ def load(
182
+ self,
183
+ *pkg_names: str,
184
+ only: ta.Optional[ta.Iterable[type]] = None,
185
+ ) -> ta.Sequence[Manifest]:
186
+ with self._lock:
187
+ return self._load(
188
+ *pkg_names,
189
+ only=only,
190
+ )
191
+
160
192
  #
161
193
 
162
194
  ENTRY_POINT_GROUP = 'omlish.manifests'
@@ -169,3 +201,9 @@ class ManifestLoader:
169
201
  ep.value
170
202
  for ep in importlib.metadata.entry_points(group=self.ENTRY_POINT_GROUP)
171
203
  ]
204
+
205
+
206
+ ##
207
+
208
+
209
+ MANIFEST_LOADER = ManifestLoader()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev162
3
+ Version: 0.0.0.dev163
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
- omlish/.manifests.json,sha256=RX24SRc6DCEg77PUVnaXOKCWa5TF_c9RQJdGIf7gl9c,1135
2
- omlish/__about__.py,sha256=RGH11TXe-0tI-c-75Cmj5Em5DfZ8d1t-Xincc1SM3bE,3409
1
+ omlish/.manifests.json,sha256=Z-OzsisX-uiidgvNIQIrN92nEPRucZUOhM5lIc52LMY,6568
2
+ omlish/__about__.py,sha256=Y07EsFN7CjY1AAm1qpNSzRY2us9VYdNOAdlHXLTfjcs,3409
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=ubu7lHwss5V4UznbejAI0qXhXahrU01MysuHOZI9C4U,8116
5
5
  omlish/cached.py,sha256=UI-XTFBwA6YXWJJJeBn-WkwBkfzDjLBBaZf4nIJA9y0,510
@@ -109,6 +109,14 @@ omlish/bootstrap/harness.py,sha256=VW8YP-yENGyXIuJ8GL_xintArF13nafwpz-iAghPt34,1
109
109
  omlish/bootstrap/main.py,sha256=yZhOHDDlj4xB5a89dRdT8z58FsqqnpoBg1-tvY2CJe4,5903
110
110
  omlish/bootstrap/marshal.py,sha256=ZxdAeMNd2qXRZ1HUK89HmEhz8tqlS9OduW34QBscKw0,516
111
111
  omlish/bootstrap/sys.py,sha256=aqMzxZa_lPj78cgz4guYZAkjT6En32e2LptfEo20NIM,8769
112
+ omlish/codecs/__init__.py,sha256=dtDRfvZRLM6KSfT0y9GRRPu8kjkMaBM1ItrfQTa84Vk,854
113
+ omlish/codecs/base.py,sha256=90e4PJKtBj9AFw0IXlhVLM1jlrDgJmDD-Zy0GFkth1c,2078
114
+ omlish/codecs/bytes.py,sha256=jlZ87OmZ52HhQDNyL87R3OIviK2qV5iU2jZYOTOLWjk,2157
115
+ omlish/codecs/chain.py,sha256=DrBi5vbaFfObfoppo6alwOmyW2XbrH2051cjExwr2Gs,527
116
+ omlish/codecs/funcs.py,sha256=bMcARQUziSiGocaERbfCR71sVw-BcmKfQEns30y_bEc,590
117
+ omlish/codecs/registry.py,sha256=8ySUG-kwGJoUN1HCRnz8VjcykB0wlIzoWF5WTAE1ny0,3860
118
+ omlish/codecs/standard.py,sha256=eiZ4u9ep0XrA4Z_D1zJI0vmWyuN8HLrX4Se_r_Cq_ZM,60
119
+ omlish/codecs/text.py,sha256=D8uy-3_XFwUSlygPQsHP8c2t5ZCgebQS0hv5CWoDXCI,5728
112
120
  omlish/collections/__init__.py,sha256=zeUvcAz073ekko37QKya6sElTMfKTuF1bKrdbMtaRpI,2142
113
121
  omlish/collections/abc.py,sha256=sP7BpTVhx6s6C59mTFeosBi4rHOWC6tbFBYbxdZmvh0,2365
114
122
  omlish/collections/coerce.py,sha256=g68ROb_-5HgH-vI8612mU2S0FZ8-wp2ZHK5_Zy_kVC0,7037
@@ -195,11 +203,17 @@ omlish/docker/hub.py,sha256=7LIuJGdA-N1Y1dmo50ynKM1KUTcnQM_5XbtPbdT_QLU,3940
195
203
  omlish/docker/manifests.py,sha256=LR4FpOGNUT3bZQ-gTjB6r_-1C3YiG30QvevZjrsVUQM,7068
196
204
  omlish/docker/timebomb.py,sha256=A_pgIDaXKsQwPiikrCTgIJl91gwYqkPGFY6j-Naq07Q,342
197
205
  omlish/formats/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
206
+ omlish/formats/cbor.py,sha256=o_Hbe4kthO9CeXK-FySrw0dHVlrdyTo2Y8PpGRDfZ3c,514
207
+ omlish/formats/codecs.py,sha256=6AbKIz_gl_om36-7qsutybYzK8cJP3LzwC9YJlwCPOA,1590
198
208
  omlish/formats/dotenv.py,sha256=qoDG4Ayu7B-8LjBBhcmNiLZW0_9LgCi3Ri2aPo9DEQ8,19314
209
+ omlish/formats/json5.py,sha256=odpZIShlUpv19aACWe58SoMPcv0AHKIa6zSMjlKgaMI,515
210
+ omlish/formats/pickle.py,sha256=jdp4E9WH9qVPBE3sSqbqDtUo18RbTSIiSpSzJ-IEVZw,529
199
211
  omlish/formats/props.py,sha256=cek3JLFLIrpE76gvs8rs_B8yF4SpY8ooDH8apWsquwE,18953
212
+ omlish/formats/toml.py,sha256=AhpVNAy87eBohBCsvIvwH2ucASWxnWXMEsMH8zB7rpI,340
200
213
  omlish/formats/xml.py,sha256=ggiOwSERt4d9XmZwLZiDIh5qnFJS4jdmow9m9_9USps,1491
201
- omlish/formats/yaml.py,sha256=wTW8ECG9jyA7qIFUqKZUro4KAKpN4IvcW_qhlrKveXM,6836
214
+ omlish/formats/yaml.py,sha256=2-ULW2fm82cA2L14UNbSHZwYr7b6W3CxjAbIiNnfHz8,7185
202
215
  omlish/formats/json/__init__.py,sha256=y7T-Jm-7FuQFzb-6uedky0ZhBaKtCKzcu291juXfiWI,669
216
+ omlish/formats/json/codecs.py,sha256=0eRmbHPDq1XELuPcgl_vTqJoaHMuCoUitd0GYCntpTY,800
203
217
  omlish/formats/json/consts.py,sha256=A0cTAGGLyjo-gcYIQrL4JIaardI0yPMhQoNmh42BaRg,387
204
218
  omlish/formats/json/encoding.py,sha256=O4iIWle7W_-RwpOvJNlqOfkbnDyiQHexV5Za4hlrFzw,497
205
219
  omlish/formats/json/json.py,sha256=Mdqv2vdMi7gp96eV0BIYH5UdWpjWfsh-tSMZeywG-08,331
@@ -293,14 +307,15 @@ omlish/io/compress/__init__.py,sha256=qV-aDfPWykTMYcoQmE8THZ4KFDRzqwN3QPPNEJVarX
293
307
  omlish/io/compress/abc.py,sha256=P9YoQX8XYoq2UfBsinKLUuwwqV1ODUIJzjTraRWGF1M,3090
294
308
  omlish/io/compress/adapters.py,sha256=DQvbiqTiaVE-GsawpOpUTX07Gjg125Iuwd6IhjuSaxE,6180
295
309
  omlish/io/compress/base.py,sha256=yx8ifzs_j8y66gMCQcssjZ936NNBFhYn_kBRwNh3SWQ,647
296
- omlish/io/compress/brotli.py,sha256=LEgrU59fPl6wvnKlxRcWeb28gqGUYSQxg7z9TI6xwP0,889
297
- omlish/io/compress/bz2.py,sha256=SwOwxhaTav05NlR_Dv-1cABUV0nbaILKWu-eyJ5E8sU,1291
298
- omlish/io/compress/gzip.py,sha256=Ko6wdh2sYHIXoH5xv8XfOdtURVV1rVk3jx3jSZp9VIo,11989
299
- omlish/io/compress/lz4.py,sha256=06Rg0NC7coUj5aMLEO_g7mjyJZwPI6K3_gJSl7v8n6k,2515
300
- omlish/io/compress/lzma.py,sha256=8qxi7TniLN00LyJIJLyp6W7UUU50JBaPxxoXYg2j2XQ,2220
301
- omlish/io/compress/snappy.py,sha256=kCPgZ7PTBAxAnmYzpQCq4HKUIJ4APeAEXsU3Vg2CaDU,411
302
- omlish/io/compress/zlib.py,sha256=MtnVGfzDlRU1LPl2J8Sa3wwgqnTVBx2uclZygWpH9xI,2115
303
- omlish/io/compress/zstd.py,sha256=LrYWVHzk-TqWJA_Bnci2i8QOtrqnFFpppLQhLqanDWM,668
310
+ omlish/io/compress/brotli.py,sha256=Q2t9uRqBEgRyJCSPsTaJv5w7d-rhsjDMluA4VRBHa_A,1182
311
+ omlish/io/compress/bz2.py,sha256=2ULaZwcpAkHKV-JargrLoXgL9G-gxrVnPqE_pGqNUrg,1566
312
+ omlish/io/compress/codecs.py,sha256=e6jCYVfUbanUzvkWW9IHDK6SbG6dwRLAztTADCWnWEQ,1076
313
+ omlish/io/compress/gzip.py,sha256=ZKZdg0wg_nIgFdkfemOv8xZpHneBXZAiCH0n6gIibWY,12281
314
+ omlish/io/compress/lz4.py,sha256=4kppXZCXpSAQw6wJvCs9LLHFzukekENja7RiwmN8uMc,2790
315
+ omlish/io/compress/lzma.py,sha256=4bWNKk7uTFiRT_HogW2ZldgaNy1IukmqfVDVkf5M2Ok,2501
316
+ omlish/io/compress/snappy.py,sha256=JFoH_9l0Tr9AGaQ0jHRiP4TsFnG071l27mprCBcqt4c,704
317
+ omlish/io/compress/zlib.py,sha256=BQ0BvX-wEN-0NwktcqFECYHTGwVe-VHCVCNarspGQ8o,2396
318
+ omlish/io/compress/zstd.py,sha256=wik_HWLq_8fGAJgGyMGq9fhFQovot1aCH4lwMpihQmg,949
304
319
  omlish/io/fdio/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
305
320
  omlish/io/fdio/handlers.py,sha256=OOQhiazbhNMwxLwyzf8KUQrBQSuHIm-UqAMpXmmHGFQ,1344
306
321
  omlish/io/fdio/kqueue.py,sha256=YgGBQibkAUYODYDiGl7Enjtx1oQsJXuDsBLBXgqlLQw,3832
@@ -311,7 +326,7 @@ omlish/io/generators/consts.py,sha256=4r6IMLBMic6MJHVn9UiORIkkPAuxsqtzFT3KV0fatC
311
326
  omlish/io/generators/direct.py,sha256=A9VJB1rNKU3l-NatpYIwyCLI3R_ybGglmdx6sAtoTo4,324
312
327
  omlish/io/generators/readers.py,sha256=MolTFCzcnD5XoP0su0YUNHJ0xlHC3KTihvWAi75y8Bo,4336
313
328
  omlish/io/generators/stepped.py,sha256=wk4vDqOKi_Tr4qMY_FxIGO5dF3Ob-3Uh8UcV_9UYrAg,4677
314
- omlish/lang/__init__.py,sha256=VKwnXpiH2GQNg29DbvCKrkmwXQDlqPpvWGbotpvxIKU,3936
329
+ omlish/lang/__init__.py,sha256=wMfsQjBFNsZ_Y4352iEr0DlEnNebf26JmR4ETtDsQow,3948
315
330
  omlish/lang/cached.py,sha256=92TvRZQ6sWlm7dNn4hgl7aWKbX0J1XUEo3DRjBpgVQk,7834
316
331
  omlish/lang/clsdct.py,sha256=AjtIWLlx2E6D5rC97zQ3Lwq2SOMkbg08pdO_AxpzEHI,1744
317
332
  omlish/lang/cmp.py,sha256=5vbzWWbqdzDmNKAGL19z6ZfUKe5Ci49e-Oegf9f4BsE,1346
@@ -319,7 +334,7 @@ omlish/lang/contextmanagers.py,sha256=NEwaTLQMfhKawD5x_0HgI2RpeLXbMa5r9NqWqfDnUX
319
334
  omlish/lang/datetimes.py,sha256=ehI_DhQRM-bDxAavnp470XcekbbXc4Gdw9y1KpHDJT0,223
320
335
  omlish/lang/descriptors.py,sha256=RRBbkMgTzg82fFFE4D0muqobpM-ZZaOta6yB1lpX3s8,6617
321
336
  omlish/lang/exceptions.py,sha256=qJBo3NU1mOWWm-NhQUHCY5feYXR3arZVyEHinLsmRH4,47
322
- omlish/lang/functions.py,sha256=tUqeqBNHtJtrwimbG6Kc1SjZQDDhqqC1o-8ANpXWn9E,3893
337
+ omlish/lang/functions.py,sha256=t9nsnWwhsibG0w908VMx-_pRM5tZfruE3faPxrCWTbI,4160
323
338
  omlish/lang/generators.py,sha256=5LX17j-Ej3QXhwBgZvRTm_dq3n9veC4IOUcVmvSu2vU,5243
324
339
  omlish/lang/imports.py,sha256=TXLbj2F53LsmozlM05bQhvow9kEgWJOi9qYKsnm2D18,9258
325
340
  omlish/lang/iterables.py,sha256=mE-XyhqMe9LztBf5Y36SDSO0Gtu8rIKmE-hcNvhhOX8,2085
@@ -375,7 +390,7 @@ omlish/logs/proxy.py,sha256=A-ROPUUAlF397qTbEqhel6YhQMstNuXL3Xmts7w9dAo,2347
375
390
  omlish/logs/standard.py,sha256=BVFn8pFyafxuco1sjA5COYxX5Q0Wv80_OE9zo6uDp2Q,3164
376
391
  omlish/logs/utils.py,sha256=mzHrZ9ji75p5A8qR29eUr05CBAHMb8J753MSkID_VaQ,393
377
392
  omlish/manifests/__init__.py,sha256=P2B0dpT8D7l5lJwRGPA92IcQj6oeXfd90X5-q9BJrKg,51
378
- omlish/manifests/load.py,sha256=8R-S5CyQpAbxDHt5wcNF6mAYri8bGndn6R2uEVOh52Y,4809
393
+ omlish/manifests/load.py,sha256=LrWAvBfdzDkFdLuVwfw2RwFvLjxx-rvfkpU9eBsWeIc,5626
379
394
  omlish/manifests/types.py,sha256=d8bv5tknCJqclRfxCpao_8XxHo2yofhLpVHQTB-MfNw,260
380
395
  omlish/marshal/__init__.py,sha256=iVA7n31L08Bdub6HKPvYOXVvDhk2CMA6rPeKDL_u1to,2298
381
396
  omlish/marshal/any.py,sha256=e82OyYK3Emm1P1ClnsnxP7fIWC2iNVyW0H5nK4mLmWM,779
@@ -535,9 +550,9 @@ omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,329
535
550
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
536
551
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
537
552
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
538
- omlish-0.0.0.dev162.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
539
- omlish-0.0.0.dev162.dist-info/METADATA,sha256=thW6t3ofpA5bodN1Uc7hDhNjXOwZd68S1SqJZuv4hIw,4264
540
- omlish-0.0.0.dev162.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
541
- omlish-0.0.0.dev162.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
542
- omlish-0.0.0.dev162.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
543
- omlish-0.0.0.dev162.dist-info/RECORD,,
553
+ omlish-0.0.0.dev163.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
554
+ omlish-0.0.0.dev163.dist-info/METADATA,sha256=CbI3Uq6iTFyvnBAKSWdpADOUvmHFsUkfMV5rnHiOOio,4264
555
+ omlish-0.0.0.dev163.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
556
+ omlish-0.0.0.dev163.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
557
+ omlish-0.0.0.dev163.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
558
+ omlish-0.0.0.dev163.dist-info/RECORD,,