omlish 0.0.0.dev60__py3-none-any.whl → 0.0.0.dev62__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev60'
2
- __revision__ = 'eb96b2408cdf5b153541f194ea5ab7bba1c2524b'
1
+ __version__ = '0.0.0.dev62'
2
+ __revision__ = 'a5ef2d1548d1cdfb856b4a7ff99fe61080ab791e'
3
3
 
4
4
 
5
5
  #
omlish/bootstrap/diag.py CHANGED
@@ -17,6 +17,7 @@ if ta.TYPE_CHECKING:
17
17
  import cProfile # noqa
18
18
  import pstats
19
19
 
20
+ from ..diag import debug as ddbg
20
21
  from ..diag import pycharm as diagpc
21
22
  from ..diag import replserver as diagrs
22
23
  from ..diag import threads as diagt
@@ -25,6 +26,7 @@ else:
25
26
  cProfile = lang.proxy_import('cProfile') # noqa
26
27
  pstats = lang.proxy_import('pstats')
27
28
 
29
+ ddbg = lang.proxy_import('..diag.debug', __package__)
28
30
  diagpc = lang.proxy_import('..diag.pycharm', __package__)
29
31
  diagrs = lang.proxy_import('..diag.replserver', __package__)
30
32
  diagt = lang.proxy_import('..diag.threads', __package__)
@@ -200,3 +202,20 @@ class ReplServerBootstrap(ContextBootstrap['ReplServerBootstrap.Config']):
200
202
  thread.start()
201
203
 
202
204
  yield
205
+
206
+
207
+ ##
208
+
209
+
210
+ class DebugBootstrap(ContextBootstrap['DebugBootstrap.Config']):
211
+ @dc.dataclass(frozen=True)
212
+ class Config(Bootstrap.Config):
213
+ enable: bool = False
214
+
215
+ @contextlib.contextmanager
216
+ def enter(self) -> ta.Iterator[None]:
217
+ if not self._config.enable:
218
+ return
219
+
220
+ with ddbg.debugging_on_exception():
221
+ yield
@@ -16,8 +16,6 @@ TODO diag:
16
16
 
17
17
 
18
18
  TODO new items:
19
- - debugging / pdb
20
- - https://github.com/inducer/pudb
21
19
  - packaging fixups
22
20
  - daemonize ( https://github.com/thesharp/daemonize/blob/master/daemonize.py )
23
21
  """
omlish/bootstrap/main.py CHANGED
@@ -1,13 +1,15 @@
1
1
  """
2
2
  TODO:
3
3
  - -x / --exec - os.exec entrypoint
4
- - refuse to install non-exec-relevant Bootstraps when chosen
4
+ - refuse to install non-exec-relevant Bootstraps when chosen
5
5
  """
6
6
  # ruff: noqa: UP006 UP007
7
7
  import argparse
8
8
  import dataclasses as dc
9
9
  import io
10
10
  import itertools
11
+ import os
12
+ import shutil
11
13
  import sys
12
14
  import typing as ta
13
15
 
@@ -152,18 +154,36 @@ def _main() -> int:
152
154
  _add_arguments(parser)
153
155
 
154
156
  parser.add_argument('-m', '--module', action='store_true')
157
+ parser.add_argument('-c', '--code', action='store_true')
158
+ parser.add_argument('-x', '--exec', action='store_true')
155
159
  parser.add_argument('target')
156
160
  parser.add_argument('args', nargs=argparse.REMAINDER)
157
161
 
158
162
  args = parser.parse_args()
163
+
164
+ if len([a for a in ('module', 'code', 'exec') if getattr(args, a)]) > 1:
165
+ raise Exception('Multiple exec mode specified')
166
+
159
167
  cfgs = _process_arguments(args)
160
168
 
161
169
  with bootstrap(*cfgs):
162
170
  tgt = args.target
163
171
 
172
+ if args.exec:
173
+ exe = shutil.which(tgt)
174
+ if exe is None:
175
+ raise FileNotFoundError(exe)
176
+
177
+ os.execl(exe, exe, *args.args)
178
+
179
+ return 0 # type: ignore # noqa
180
+
164
181
  sys.argv = [tgt, *(args.args or ())]
165
182
 
166
- if args.module:
183
+ if args.code:
184
+ exec(tgt, {}, {})
185
+
186
+ elif args.module:
167
187
  runpy._run_module_as_main(tgt) # type: ignore # noqa
168
188
 
169
189
  else:
omlish/diag/debug.py ADDED
@@ -0,0 +1,26 @@
1
+ """
2
+ TODO:
3
+ - select best debugger: ipdb, pudb,
4
+ """
5
+ import contextlib
6
+ import sys
7
+ import traceback
8
+ import typing as ta
9
+
10
+
11
+ @contextlib.contextmanager
12
+ def debugging_on_exception(
13
+ *,
14
+ silent: bool = False,
15
+ ) -> ta.Iterator[None]:
16
+ import pdb # noqa
17
+
18
+ try:
19
+ yield
20
+ except Exception:
21
+ if not silent:
22
+ traceback.print_exc()
23
+
24
+ pdb.post_mortem(sys.exc_info()[2])
25
+
26
+ raise
omlish/marshal/base.py CHANGED
@@ -164,9 +164,12 @@ class BaseContext(lang.Abstract):
164
164
  options: col.TypeMap[Option] = col.TypeMap()
165
165
 
166
166
  def _reflect(self, o: ta.Any) -> rfl.Type:
167
- if (ovr := self.registry.get_of(o, ReflectOverride)):
168
- return ovr[-1].rty
169
- return rfl.type_(o)
167
+ def override(o):
168
+ if (ovr := self.registry.get_of(o, ReflectOverride)):
169
+ return ovr[-1].rty
170
+ return None
171
+
172
+ return rfl.Reflector(override=override).type(o)
170
173
 
171
174
 
172
175
  @dc.dataclass(frozen=True)
@@ -1,18 +1,6 @@
1
- from .types import ( # noqa
2
- ANY,
3
- Annotated,
4
- Any,
5
- Generic,
6
- NewType,
7
- TYPES,
8
- Type,
9
- Union,
10
- get_orig_bases,
11
- get_orig_class,
12
- get_params,
13
- is_type,
14
- is_union_type,
15
- type_,
1
+ from .isinstance import ( # noqa
2
+ KNOWN_ISINSTANCE_GENERICS,
3
+ isinstance_of,
16
4
  )
17
5
 
18
6
  from .ops import ( # noqa
@@ -24,11 +12,6 @@ from .ops import ( # noqa
24
12
  types_equivalent,
25
13
  )
26
14
 
27
- from .isinstance import ( # noqa
28
- KNOWN_ISINSTANCE_GENERICS,
29
- isinstance_of,
30
- )
31
-
32
15
  from .subst import ( # noqa
33
16
  ALIAS_UPDATING_GENERIC_SUBSTITUTION,
34
17
  DEFAULT_GENERIC_SUBSTITUTION,
@@ -38,3 +21,22 @@ from .subst import ( # noqa
38
21
  get_type_var_replacements,
39
22
  replace_type_vars,
40
23
  )
24
+
25
+ from .types import ( # noqa
26
+ ANY,
27
+ Annotated,
28
+ Any,
29
+ DEFAULT_REFLECTOR,
30
+ Generic,
31
+ NewType,
32
+ Reflector,
33
+ TYPES,
34
+ Type,
35
+ Union,
36
+ get_orig_bases,
37
+ get_orig_class,
38
+ get_params,
39
+ is_type,
40
+ is_union_type,
41
+ type_,
42
+ )
omlish/reflect/types.py CHANGED
@@ -195,92 +195,111 @@ TYPES: tuple[type, ...] = (
195
195
  ##
196
196
 
197
197
 
198
- def is_type(obj: ta.Any) -> bool:
199
- if isinstance(obj, (Union, Generic, ta.TypeVar, NewType, Any)): # noqa
200
- return True
198
+ class Reflector:
199
+ def __init__(
200
+ self,
201
+ *,
202
+ override: ta.Callable[[ta.Any], ta.Any] | None = None,
203
+ ) -> None:
204
+ super().__init__()
201
205
 
202
- oty = type(obj)
206
+ self._override = override
203
207
 
204
- return (
205
- oty is _UnionGenericAlias or oty is types.UnionType or # noqa
208
+ def is_type(self, obj: ta.Any) -> bool:
209
+ if isinstance(obj, (Union, Generic, ta.TypeVar, NewType, Any)): # noqa
210
+ return True
206
211
 
207
- isinstance(obj, ta.NewType) or # noqa
212
+ oty = type(obj)
208
213
 
209
- (
210
- is_simple_generic_alias_type(oty) or
211
- oty is _CallableGenericAlias
212
- ) or
214
+ return (
215
+ oty is _UnionGenericAlias or oty is types.UnionType or # noqa
213
216
 
214
- isinstance(obj, type) or
217
+ isinstance(obj, ta.NewType) or # noqa
215
218
 
216
- isinstance(obj, _SpecialGenericAlias)
217
- )
219
+ (
220
+ is_simple_generic_alias_type(oty) or
221
+ oty is _CallableGenericAlias
222
+ ) or
218
223
 
224
+ isinstance(obj, type) or
219
225
 
220
- def type_(obj: ta.Any) -> Type:
221
- if obj is ta.Any:
222
- return ANY
226
+ isinstance(obj, _SpecialGenericAlias)
227
+ )
223
228
 
224
- if isinstance(obj, (Union, Generic, ta.TypeVar, NewType, Any)): # noqa
225
- return obj
229
+ def type(self, obj: ta.Any) -> Type:
230
+ if self._override is not None:
231
+ if (ovr := self._override(obj)) is not None:
232
+ return ovr
226
233
 
227
- oty = type(obj)
234
+ if obj is ta.Any:
235
+ return ANY
228
236
 
229
- if oty is _UnionGenericAlias or oty is types.UnionType:
230
- return Union(frozenset(type_(a) for a in ta.get_args(obj)))
231
-
232
- if isinstance(obj, ta.NewType): # noqa
233
- return NewType(obj)
234
-
235
- if (
236
- is_simple_generic_alias_type(oty) or
237
- oty is _CallableGenericAlias
238
- ):
239
- origin = ta.get_origin(obj)
240
- args = ta.get_args(obj)
241
- if oty is _CallableGenericAlias:
242
- p, r = args
243
- if p is Ellipsis or isinstance(p, ta.ParamSpec):
244
- raise TypeError(f'Callable argument not yet supported for {obj=}')
245
- args = (*p, r)
246
- params = _KNOWN_SPECIAL_TYPE_VARS[:len(args)]
247
- elif origin is ta.Generic:
248
- params = args
249
- else:
250
- params = get_params(origin)
251
- if len(args) != len(params):
252
- raise TypeError(f'Mismatched {args=} and {params=} for {obj=}')
253
- return Generic(
254
- origin,
255
- tuple(type_(a) for a in args),
256
- params,
257
- obj,
258
- )
237
+ if isinstance(obj, (Union, Generic, ta.TypeVar, NewType, Any)): # noqa
238
+ return obj
259
239
 
260
- if isinstance(obj, type):
261
- if issubclass(obj, ta.Generic): # type: ignore
262
- params = get_params(obj)
263
- if params:
240
+ oty = type(obj)
241
+
242
+ if oty is _UnionGenericAlias or oty is types.UnionType:
243
+ return Union(frozenset(self.type(a) for a in ta.get_args(obj)))
244
+
245
+ if isinstance(obj, ta.NewType): # noqa
246
+ return NewType(obj)
247
+
248
+ if (
249
+ is_simple_generic_alias_type(oty) or
250
+ oty is _CallableGenericAlias
251
+ ):
252
+ origin = ta.get_origin(obj)
253
+ args = ta.get_args(obj)
254
+ if oty is _CallableGenericAlias:
255
+ p, r = args
256
+ if p is Ellipsis or isinstance(p, ta.ParamSpec):
257
+ raise TypeError(f'Callable argument not yet supported for {obj=}')
258
+ args = (*p, r)
259
+ params = _KNOWN_SPECIAL_TYPE_VARS[:len(args)]
260
+ elif origin is ta.Generic:
261
+ params = args
262
+ else:
263
+ params = get_params(origin)
264
+ if len(args) != len(params):
265
+ raise TypeError(f'Mismatched {args=} and {params=} for {obj=}')
266
+ return Generic(
267
+ origin,
268
+ tuple(self.type(a) for a in args),
269
+ params,
270
+ obj,
271
+ )
272
+
273
+ if isinstance(obj, type):
274
+ if issubclass(obj, ta.Generic): # type: ignore
275
+ params = get_params(obj)
276
+ if params:
277
+ return Generic(
278
+ obj,
279
+ params,
280
+ params,
281
+ obj,
282
+ )
283
+ return obj
284
+
285
+ if isinstance(obj, _SpecialGenericAlias):
286
+ if (ks := _KNOWN_SPECIALS_BY_ALIAS.get(obj)) is not None:
287
+ params = _KNOWN_SPECIAL_TYPE_VARS[:ks.nparams]
264
288
  return Generic(
265
- obj,
289
+ ks.origin,
266
290
  params,
267
291
  params,
268
292
  obj,
269
293
  )
270
- return obj
271
294
 
272
- if isinstance(obj, _SpecialGenericAlias):
273
- if (ks := _KNOWN_SPECIALS_BY_ALIAS.get(obj)) is not None:
274
- params = _KNOWN_SPECIAL_TYPE_VARS[:ks.nparams]
275
- return Generic(
276
- ks.origin,
277
- params,
278
- params,
279
- obj,
280
- )
295
+ if isinstance(obj, _AnnotatedAlias):
296
+ o = ta.get_args(obj)[0]
297
+ return Annotated(self.type(o), md=obj.__metadata__, obj=obj)
281
298
 
282
- if isinstance(obj, _AnnotatedAlias):
283
- o = ta.get_args(obj)[0]
284
- return Annotated(type_(o), md=obj.__metadata__, obj=obj)
299
+ raise TypeError(obj)
285
300
 
286
- raise TypeError(obj)
301
+
302
+ DEFAULT_REFLECTOR = Reflector()
303
+
304
+ is_type = DEFAULT_REFLECTOR.is_type
305
+ type_ = DEFAULT_REFLECTOR.type
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev60
3
+ Version: 0.0.0.dev62
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=jvyoQ7x8UJ9lpRgkh7eElwJ8qnzyG5aUGameT9Yk8GM,1419
2
- omlish/__about__.py,sha256=FBKxqP5dW_gNqz7t1xG_3WdV2AUAJW3mxH9f6_99dok,3420
2
+ omlish/__about__.py,sha256=u-gRUFmrAMM8C-1-u6UfjGvA_1qc3iVQiZLYnMGHQxg,3420
3
3
  omlish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  omlish/argparse.py,sha256=Vr70_85EVLJLgEkRtwOr264tMRtqtlN7ncFfXRUk5aM,6914
5
5
  omlish/c3.py,sha256=4vogWgwPb8TbNS2KkZxpoWbwjj7MuHG2lQG-hdtkvjI,8062
@@ -89,9 +89,9 @@ omlish/asyncs/trio_asyncio.py,sha256=oqdOHy0slj9PjVxaDf3gJkq9AAgg7wYZbB469jOftVw
89
89
  omlish/bootstrap/__init__.py,sha256=-Rtsg7uPQNhh1dIT9nqrz96XlqizwoLnWf-FwOEstJI,730
90
90
  omlish/bootstrap/__main__.py,sha256=4jCwsaogp0FrJjJZ85hzF4-WqluPeheHbfeoKynKvNs,194
91
91
  omlish/bootstrap/base.py,sha256=d8hqn4hp1XMMi5PgcJBQXPKmW47epu8CxBlqDZiRZb4,1073
92
- omlish/bootstrap/diag.py,sha256=x_BKS_uhfW8QFk1NeH_VIocHif-A6FVTZ37262qCgZ0,5052
93
- omlish/bootstrap/harness.py,sha256=vDnpM0ZLSJaylxQNA4u2lwQwiU-KXZDb7MlkrhchFJY,2022
94
- omlish/bootstrap/main.py,sha256=u-TfxO4GkAK3LbRweQERogtO4kT0z3gqXRjnXvtJzC8,5328
92
+ omlish/bootstrap/diag.py,sha256=LADLhusbJ1tKxVD8-gmia1HShX1VeszRO1OApIQhSpI,5507
93
+ omlish/bootstrap/harness.py,sha256=VW8YP-yENGyXIuJ8GL_xintArF13nafwpz-iAghPt34,1967
94
+ omlish/bootstrap/main.py,sha256=ripSWAlYz3LVyv6S_Js9MWYO3QNKgBSaFQv3gqGjuRM,5885
95
95
  omlish/bootstrap/marshal.py,sha256=ZxdAeMNd2qXRZ1HUK89HmEhz8tqlS9OduW34QBscKw0,516
96
96
  omlish/bootstrap/sys.py,sha256=i6veZeE83wO0HTl9b6ykj_pEN05fqu0enoAv4sw5Ayc,8742
97
97
  omlish/collections/__init__.py,sha256=tGUzvS_ZjiqALsLRy7JX3h4KZRQX2CmtdAfTRD7UwMk,1677
@@ -151,6 +151,7 @@ omlish/dataclasses/impl/slots.py,sha256=_sm-x9v1tPnXEHBHNUMTHZocgVyhZaPdvamIPPBU
151
151
  omlish/dataclasses/impl/utils.py,sha256=aER2iL3UAtgS1BdLuEvTr9Tr2wC28wk1kiOeO-jIymw,6138
152
152
  omlish/diag/__init__.py,sha256=BYQoq12W2qU0O7m2Z-RLCX6YLIYEW9MmfN7_i9--Yk0,132
153
153
  omlish/diag/asts.py,sha256=BveUUNUcaAm4Hg55f4ZxGSI313E4L8cCZ5XjHpEkKVI,3325
154
+ omlish/diag/debug.py,sha256=YPzQXiBAJMYHYpBKzx0QhlLMZokjR5kkAVLodA3yddQ,424
154
155
  omlish/diag/procfs.py,sha256=vBovaMvAUKdl7FbtFq3TNsSmdhs8DaYfhoEsKeWYta8,9704
155
156
  omlish/diag/procstats.py,sha256=UkqxREqfd-38xPYZ9T1SIJISz5ARQCEhTtOZrxtm2dE,777
156
157
  omlish/diag/ps.py,sha256=1JWxZen3fVG-20R6ZZ8BtO_gpzw_5bhHZiKdoHkgxoU,1004
@@ -288,7 +289,7 @@ omlish/logs/noisy.py,sha256=Ubc-eTH6ZbGYsLfUUi69JAotwuUwzb-SJBeGo_0dIZI,348
288
289
  omlish/logs/utils.py,sha256=MgGovbP0zUrZ3FGD3qYNQWn-l0jy0Y0bStcQvv5BOmQ,391
289
290
  omlish/marshal/__init__.py,sha256=G0MDeBStBjz9Njq-rt5C6WbuCik6c8st7cipwMVw668,2139
290
291
  omlish/marshal/any.py,sha256=e82OyYK3Emm1P1ClnsnxP7fIWC2iNVyW0H5nK4mLmWM,779
291
- omlish/marshal/base.py,sha256=I7IOzFGn_DFeBRFCH8F0ONBa-NzM4mmMDld6bmoW-rc,6501
292
+ omlish/marshal/base.py,sha256=_ZKSSuv6p9r86sja_jaxI09WYpjCBFi0KTsOiZCYyk0,6587
292
293
  omlish/marshal/base64.py,sha256=F-3ogJdcFCtWINRgJgWT0rErqgx6f4qahhcg8OrkqhE,1089
293
294
  omlish/marshal/dataclasses.py,sha256=G6Uh8t4vvNBAx2BhzH8ksj8Hq_bo6npFphQhyF298VU,6892
294
295
  omlish/marshal/datetimes.py,sha256=0ffg8cEvx9SMKIXZGD9b7MqpLfmgw0uKKdn6YTfoqok,3714
@@ -318,11 +319,11 @@ omlish/math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
318
319
  omlish/math/bits.py,sha256=yip1l8agOYzT7bFyMGc0RR3XlnGCfHMpjw_SECLLh1I,3477
319
320
  omlish/math/floats.py,sha256=UimhOT7KRl8LXTzOI5cQWoX_9h6WNWe_3vcOuO7-h_8,327
320
321
  omlish/math/stats.py,sha256=MegzKVsmv2kra4jDWLOUgV0X7Ee2Tbl5u6ql1v4-dEY,10053
321
- omlish/reflect/__init__.py,sha256=8t2955chuWPzj8yiV7R_jlREAezSz6CVTJ0HKY58Vpk,687
322
+ omlish/reflect/__init__.py,sha256=eJzSLlCWcjGWn7NGzIR66vANvxiHQym73YJeMwB7mCw,725
322
323
  omlish/reflect/isinstance.py,sha256=x5T9S2634leinBT4hl3CZZkRttvdvvlxChkC_x9Qu2s,1176
323
324
  omlish/reflect/ops.py,sha256=RJ6jzrM4ieFsXzWyNXWV43O_WgzEaUvlHSc5N2ezW2A,2044
324
325
  omlish/reflect/subst.py,sha256=JM2RGv2-Rcex8wCqhmgvRG59zD242P9jM3O2QLjKWWo,3586
325
- omlish/reflect/types.py,sha256=Zkcp8nx_vFNH7pBZ5pU5P0wIgQCauj5Nic3BZb5cRik,7030
326
+ omlish/reflect/types.py,sha256=8EhhLU-ko-Uepk3Xa0v22w8LBS7MbjPwJ4HNM_Dtf5g,7779
326
327
  omlish/secrets/__init__.py,sha256=SGB1KrlNrxlNpazEHYy95NTzteLi8ndoEgMhU7luBl8,420
327
328
  omlish/secrets/crypto.py,sha256=6CsLy0UEqCrBK8Xx_3-iFF6SKtu2GlEqUQ8-MliY3tk,3709
328
329
  omlish/secrets/marshal.py,sha256=U9uSRTWzZmumfNZeh_dROwVdGrARsp155TylRbjilP8,2048
@@ -407,9 +408,9 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
407
408
  omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
408
409
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
409
410
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
410
- omlish-0.0.0.dev60.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
411
- omlish-0.0.0.dev60.dist-info/METADATA,sha256=ywbae2f6yzK7ZJn0W83KHW9L1sTuH-Y7h4sf8pAl95k,4167
412
- omlish-0.0.0.dev60.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
413
- omlish-0.0.0.dev60.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
414
- omlish-0.0.0.dev60.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
415
- omlish-0.0.0.dev60.dist-info/RECORD,,
411
+ omlish-0.0.0.dev62.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
412
+ omlish-0.0.0.dev62.dist-info/METADATA,sha256=mt0fT8Bk_wKy64eUKY_AYPNxHg-yruiGNd2EYcnYUPw,4167
413
+ omlish-0.0.0.dev62.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
414
+ omlish-0.0.0.dev62.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
415
+ omlish-0.0.0.dev62.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
416
+ omlish-0.0.0.dev62.dist-info/RECORD,,