omlish 0.0.0.dev162__py3-none-any.whl → 0.0.0.dev163__py3-none-any.whl

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