omlish 0.0.0.dev97__py3-none-any.whl → 0.0.0.dev99__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.dev97'
2
- __revision__ = '4adbb70454ff03be6ca98d986f768deff72e6e7f'
1
+ __version__ = '0.0.0.dev99'
2
+ __revision__ = '68bd172d5acce0086e88d20a01fe294fc1fc390c'
3
3
 
4
4
 
5
5
  #
@@ -47,7 +47,7 @@ class Project(ProjectBase):
47
47
 
48
48
  'python-snappy ~= 0.7',
49
49
 
50
- 'zstd ~= 1.5',
50
+ 'zstandard ~= 0.23',
51
51
  ],
52
52
 
53
53
  'diag': [
@@ -67,7 +67,7 @@ class Project(ProjectBase):
67
67
 
68
68
  'cbor2 ~= 5.6',
69
69
 
70
- 'cloudpickle ~= 3.0',
70
+ 'cloudpickle ~= 3.1',
71
71
  ],
72
72
 
73
73
  'http': [
omlish/cached.py CHANGED
@@ -1,3 +1,14 @@
1
+ """
2
+ This module solely exists for import convenience - tools will tend to resolve the imported 'property' as if it were from
3
+ builtins and thus not distinguish it from a normal property.
4
+
5
+ from omlish import cached
6
+
7
+ class C:
8
+ @cached.property
9
+ def p(self) -> str: ...
10
+
11
+ """
1
12
  from .lang.cached import _CachedProperty # noqa
2
13
  from .lang.cached import cached_function
3
14
 
@@ -37,6 +37,13 @@ from .frozen import ( # noqa
37
37
  frozenlist,
38
38
  )
39
39
 
40
+ from .hasheq import ( # noqa
41
+ HashEq,
42
+ HashEqMap,
43
+ HashEq_,
44
+ hash_eq,
45
+ )
46
+
40
47
  from .identity import ( # noqa
41
48
  IdentityKeyDict,
42
49
  IdentitySet,
@@ -0,0 +1,155 @@
1
+ """
2
+ TODO:
3
+ - order preserving / linked list?
4
+ - ItemsView
5
+ """
6
+ import abc
7
+ import dataclasses as dc
8
+ import typing as ta
9
+
10
+ from .. import lang
11
+ from .mappings import yield_dict_init
12
+
13
+
14
+ K = ta.TypeVar('K')
15
+ V = ta.TypeVar('V')
16
+ K2 = ta.TypeVar('K2')
17
+ V2 = ta.TypeVar('V2')
18
+
19
+
20
+ class HashEq(lang.Abstract, ta.Generic[K]):
21
+ @abc.abstractmethod
22
+ def hash(self, k: K) -> int:
23
+ raise NotImplementedError
24
+
25
+ @abc.abstractmethod
26
+ def eq(self, l: K, r: K) -> bool:
27
+ raise NotImplementedError
28
+
29
+
30
+ @lang.unabstract_class([
31
+ ('hash', '_hash'),
32
+ ('eq', '_eq'),
33
+ ])
34
+ @dc.dataclass(frozen=True)
35
+ class HashEq_(ta.Generic[K]): # noqa
36
+ hash: ta.Callable[[K], int]
37
+ eq: ta.Callable[[K, K], bool]
38
+
39
+ def _hash(self, k: K) -> int:
40
+ return self.hash(k)
41
+
42
+ def _eq(self, l: K, r: K) -> bool:
43
+ return self.eq(l, r)
44
+
45
+
46
+ class hash_eq(HashEq[K], lang.NotInstantiable, lang.Final): # noqa
47
+ """Workaround for PEP 695 support."""
48
+
49
+ def __new__( # type: ignore[misc]
50
+ cls,
51
+ hash: ta.Callable[[K], int], # noqa
52
+ eq: ta.Callable[[K, K], bool],
53
+ ) -> HashEq[K]:
54
+ return HashEq_(hash, eq) # type: ignore
55
+
56
+ def hash(self, k: K) -> int:
57
+ raise TypeError
58
+
59
+ def eq(self, l: K, r: K) -> bool:
60
+ raise TypeError
61
+
62
+
63
+ class HashEqMap(ta.Mapping[K, V]):
64
+ class _Node(ta.NamedTuple, ta.Generic[K2, V2]):
65
+ k: K2
66
+ v: V2
67
+ h: int
68
+
69
+ def __init__(self, hash_eq: HashEq[K], *args: ta.Any, **kwargs: ta.Any) -> None:
70
+ super().__init__()
71
+
72
+ self._hash_eq = hash_eq
73
+ self._dct: dict[int, list[HashEqMap._Node[K, V]]] = {}
74
+ self._len = 0
75
+
76
+ for k, v in yield_dict_init(*args, **kwargs):
77
+ self[k] = v
78
+
79
+ def __len__(self) -> int:
80
+ return self._len
81
+
82
+ def __contains__(self, k: K) -> bool: # type: ignore[override]
83
+ h = self._hash_eq.hash(k)
84
+ try:
85
+ l = self._dct[h]
86
+ except KeyError:
87
+ return False
88
+ return any(self._hash_eq.eq(k, e.k) for e in l)
89
+
90
+ def __getitem__(self, k: K) -> V:
91
+ h = self._hash_eq.hash(k)
92
+ l = self._dct[h]
93
+ for e in l:
94
+ if self._hash_eq.eq(k, e.k):
95
+ return e.v
96
+ raise KeyError(k)
97
+
98
+ def __setitem__(self, k: K, v: V) -> None:
99
+ h = self._hash_eq.hash(k)
100
+ n = HashEqMap._Node(k, v, h)
101
+
102
+ try:
103
+ l = self._dct[h]
104
+ except KeyError:
105
+ l = [n]
106
+ self._dct[h] = l
107
+ self._len += 1
108
+ return
109
+
110
+ for i, e in enumerate(l):
111
+ if self._hash_eq.eq(k, e.k):
112
+ l[i] = n
113
+ return
114
+
115
+ l.append(n)
116
+ self._len += 1
117
+
118
+ def __delitem__(self, k: K) -> None:
119
+ h = self._hash_eq.hash(k)
120
+ l = self._dct[h]
121
+ for i, e in enumerate(l):
122
+ if self._hash_eq.eq(k, e.k):
123
+ del l[i]
124
+ self._len -= 1
125
+ return
126
+ raise KeyError(k)
127
+
128
+ def __iter__(self) -> ta.Iterator[K]:
129
+ return self.iterkeys()
130
+
131
+ def iterkeys(self) -> ta.Iterator[K]:
132
+ for l in self._dct.values():
133
+ for e in l:
134
+ yield e.k
135
+
136
+ def itervalues(self) -> ta.Iterator[V]:
137
+ for l in self._dct.values():
138
+ for e in l:
139
+ yield e.v
140
+
141
+ def iteritems(self) -> ta.Iterator[tuple[K, V]]:
142
+ for l in self._dct.values():
143
+ for e in l:
144
+ yield (e.k, e.v)
145
+
146
+ # FIXME:
147
+
148
+ def keys(self) -> ta.Iterable[K]: # type: ignore[override]
149
+ return lang.itergen(self.iterkeys)
150
+
151
+ def values(self) -> ta.Iterable[V]: # type: ignore[override]
152
+ return lang.itergen(self.itervalues)
153
+
154
+ def items(self) -> ta.Iterable[tuple[K, V]]: # type: ignore[override]
155
+ return lang.itergen(self.iteritems)
omlish/fnpairs.py CHANGED
@@ -38,7 +38,7 @@ if ta.TYPE_CHECKING:
38
38
  import lz4.frame as _lz4_frame
39
39
  import snappy as _snappy
40
40
  import yaml as _yaml
41
- import zstd as _zstd
41
+ import zstandard as _zstandard
42
42
 
43
43
  else:
44
44
  _bz2 = lang.proxy_import('bz2')
@@ -55,7 +55,7 @@ else:
55
55
  _lz4_frame = lang.proxy_import('lz4.frame')
56
56
  _snappy = lang.proxy_import('snappy')
57
57
  _yaml = lang.proxy_import('yaml')
58
- _zstd = lang.proxy_import('zstd')
58
+ _zstandard = lang.proxy_import('zstandard')
59
59
 
60
60
 
61
61
  ##
@@ -92,6 +92,10 @@ class FnPair(ta.Generic[F, T], abc.ABC):
92
92
  ##
93
93
 
94
94
 
95
+ @lang.unabstract_class([
96
+ ('forward', '_forward'),
97
+ ('backward', 'backward'),
98
+ ])
95
99
  @dc.dataclass(frozen=True)
96
100
  class Simple(FnPair[F, T]):
97
101
  forward: ta.Callable[[F], T] # type: ignore
@@ -104,12 +108,6 @@ class Simple(FnPair[F, T]):
104
108
  return self.backward(t)
105
109
 
106
110
 
107
- # HACK: ABC workaround. Our dataclasses handle this with `override=True` but we don't want to dep that in here.
108
- Simple.forward = Simple._forward # type: ignore # noqa
109
- Simple.backward = Simple._backward # type: ignore # noqa
110
- Simple.__abstractmethods__ = frozenset() # noqa
111
-
112
-
113
111
  of = Simple
114
112
 
115
113
  NOP: FnPair[ta.Any, ta.Any] = of(lang.identity, lang.identity)
@@ -356,10 +354,10 @@ class Snappy(Compression):
356
354
  @_register_extension('zstd')
357
355
  class Zstd(Compression):
358
356
  def forward(self, f: bytes) -> bytes:
359
- return _zstd.compress(f)
357
+ return _zstandard.compress(f)
360
358
 
361
359
  def backward(self, t: bytes) -> bytes:
362
- return _zstd.decompress(t)
360
+ return _zstandard.decompress(t)
363
361
 
364
362
 
365
363
  ##
omlish/lang/__init__.py CHANGED
@@ -31,6 +31,7 @@ from .classes import ( # noqa
31
31
  is_abstract_method,
32
32
  make_abstract,
33
33
  no_bool,
34
+ unabstract_class,
34
35
  virtual_check,
35
36
  )
36
37
 
@@ -4,6 +4,7 @@ from .abstract import ( # noqa
4
4
  is_abstract_class,
5
5
  is_abstract_method,
6
6
  make_abstract,
7
+ unabstract_class,
7
8
  )
8
9
 
9
10
  from .restrict import ( # noqa
@@ -72,3 +72,16 @@ def is_abstract_class(obj: ta.Any) -> bool:
72
72
 
73
73
  def is_abstract(obj: ta.Any) -> bool:
74
74
  return is_abstract_method(obj) or is_abstract_class(obj)
75
+
76
+
77
+ def unabstract_class(
78
+ impls: ta.Iterable[tuple[str, ta.Any]],
79
+ ) -> ta.Callable[[type[T]], type[T]]:
80
+ def inner(cls):
81
+ for name, impl in impls:
82
+ if isinstance(impl, str):
83
+ impl = getattr(cls, impl)
84
+ setattr(cls, name, impl)
85
+ setattr(cls, '__abstractmethods__', frozenset())
86
+ return cls
87
+ return inner
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev97
3
+ Version: 0.0.0.dev99
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -20,7 +20,7 @@ Requires-Dist: trio ~=0.27 ; extra == 'all'
20
20
  Requires-Dist: trio-asyncio ~=0.15 ; extra == 'all'
21
21
  Requires-Dist: lz4 ~=4.3 ; extra == 'all'
22
22
  Requires-Dist: python-snappy ~=0.7 ; extra == 'all'
23
- Requires-Dist: zstd ~=1.5 ; extra == 'all'
23
+ Requires-Dist: zstandard ~=0.23 ; extra == 'all'
24
24
  Requires-Dist: asttokens ~=2.4 ; extra == 'all'
25
25
  Requires-Dist: executing ~=2.1 ; extra == 'all'
26
26
  Requires-Dist: psutil ~=6.0 ; extra == 'all'
@@ -29,7 +29,7 @@ Requires-Dist: ujson ~=5.10 ; extra == 'all'
29
29
  Requires-Dist: json5 ~=0.9 ; extra == 'all'
30
30
  Requires-Dist: pyyaml ~=6.0 ; extra == 'all'
31
31
  Requires-Dist: cbor2 ~=5.6 ; extra == 'all'
32
- Requires-Dist: cloudpickle ~=3.0 ; extra == 'all'
32
+ Requires-Dist: cloudpickle ~=3.1 ; extra == 'all'
33
33
  Requires-Dist: httpx[http2] ~=0.27 ; extra == 'all'
34
34
  Requires-Dist: wrapt ~=1.14 ; extra == 'all'
35
35
  Requires-Dist: cryptography ~=43.0 ; extra == 'all'
@@ -52,7 +52,7 @@ Requires-Dist: trio-asyncio ~=0.15 ; extra == 'async'
52
52
  Provides-Extra: compress
53
53
  Requires-Dist: lz4 ~=4.3 ; extra == 'compress'
54
54
  Requires-Dist: python-snappy ~=0.7 ; extra == 'compress'
55
- Requires-Dist: zstd ~=1.5 ; extra == 'compress'
55
+ Requires-Dist: zstandard ~=0.23 ; extra == 'compress'
56
56
  Provides-Extra: diag
57
57
  Requires-Dist: asttokens ~=2.4 ; extra == 'diag'
58
58
  Requires-Dist: executing ~=2.1 ; extra == 'diag'
@@ -63,7 +63,7 @@ Requires-Dist: ujson ~=5.10 ; extra == 'formats'
63
63
  Requires-Dist: json5 ~=0.9 ; extra == 'formats'
64
64
  Requires-Dist: pyyaml ~=6.0 ; extra == 'formats'
65
65
  Requires-Dist: cbor2 ~=5.6 ; extra == 'formats'
66
- Requires-Dist: cloudpickle ~=3.0 ; extra == 'formats'
66
+ Requires-Dist: cloudpickle ~=3.1 ; extra == 'formats'
67
67
  Provides-Extra: http
68
68
  Requires-Dist: httpx[http2] ~=0.27 ; extra == 'http'
69
69
  Provides-Extra: misc
@@ -1,14 +1,14 @@
1
1
  omlish/.manifests.json,sha256=hTFp9tvE72BxKloIq1s1SS0LRQlIsvMtO69Sbc47rKg,1704
2
- omlish/__about__.py,sha256=eIwAtZZmvmulh4BBWUEeTYaDxG6LjN2S_3Q71pIDNfI,3345
2
+ omlish/__about__.py,sha256=6713nqxxPtA38L0r9uYNrMgouxInTcm_aUGG-SmXVbI,3351
3
3
  omlish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  omlish/argparse.py,sha256=Dc73G8lyoQBLvXhMYUbzQUh4SJu_OTvKUXjSUxq_ang,7499
5
5
  omlish/c3.py,sha256=4vogWgwPb8TbNS2KkZxpoWbwjj7MuHG2lQG-hdtkvjI,8062
6
- omlish/cached.py,sha256=UAizxlH4eMWHPzQtmItmyE6FEpFEUFzIkxaO2BHWZ5s,196
6
+ omlish/cached.py,sha256=vn3ZiKy0d3NW_kzoXCi_Fg_s5vUcH0LQ1idfKBcQhzk,489
7
7
  omlish/check.py,sha256=rZFEn6IHiMq4KGCYxlUGcUCJP12pPPUs_-AG0aouPM8,10540
8
8
  omlish/datetimes.py,sha256=HajeM1kBvwlTa-uR1TTZHmZ3zTPnnUr1uGGQhiO1XQ0,2152
9
9
  omlish/defs.py,sha256=T3bq_7h_tO3nDB5RAFBn7DkdeQgqheXzkFColbOHZko,4890
10
10
  omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
11
- omlish/fnpairs.py,sha256=wHm1AUt-bwDCGnWrKrE2ppJav5OBm39lTyeHGaMTLBo,10885
11
+ omlish/fnpairs.py,sha256=vCuZqLz2IAM3PDaJQE3r1A4EjyrCyUNoCOjoa_SmKCU,10723
12
12
  omlish/fnpipes.py,sha256=AJkgz9nvRRm7oqw7ZgYyz21klu276LWi54oYCLg-vOg,2196
13
13
  omlish/genmachine.py,sha256=RlU-y_dt2nRdvoo7Z3HsUELlBn3KuyI4qUnqLVbChRI,2450
14
14
  omlish/iterators.py,sha256=GGLC7RIT86uXMjhIIIqnff_Iu5SI_b9rXYywYGFyzmo,7292
@@ -94,12 +94,13 @@ omlish/bootstrap/harness.py,sha256=VW8YP-yENGyXIuJ8GL_xintArF13nafwpz-iAghPt34,1
94
94
  omlish/bootstrap/main.py,sha256=yZhOHDDlj4xB5a89dRdT8z58FsqqnpoBg1-tvY2CJe4,5903
95
95
  omlish/bootstrap/marshal.py,sha256=ZxdAeMNd2qXRZ1HUK89HmEhz8tqlS9OduW34QBscKw0,516
96
96
  omlish/bootstrap/sys.py,sha256=iLHUNIuIPv-k-Mc6aHj5sSET78olCVt7t0HquFDO4iQ,8762
97
- omlish/collections/__init__.py,sha256=tGUzvS_ZjiqALsLRy7JX3h4KZRQX2CmtdAfTRD7UwMk,1677
97
+ omlish/collections/__init__.py,sha256=JFphLT_jEe-h_YBKyjrI0RT4KgNvjPXRErebBHwIHfY,1763
98
98
  omlish/collections/_abc.py,sha256=sP7BpTVhx6s6C59mTFeosBi4rHOWC6tbFBYbxdZmvh0,2365
99
99
  omlish/collections/_io_abc.py,sha256=Cxs8KB1B_69rxpUYxI-MTsilAmNooJJn3w07DKqYKkE,1255
100
100
  omlish/collections/coerce.py,sha256=o11AMrUiyoadd8WkdqeKPIpXf2xd0LyylzNCyJivCLU,7036
101
101
  omlish/collections/exceptions.py,sha256=shcS-NCnEUudF8qC_SmO2TQyjivKlS4TDjaz_faqQ0c,44
102
102
  omlish/collections/frozen.py,sha256=DGxemj_pVID85tSBm-Wns_x4ov0wOEIT6X5bVgJtmkA,4152
103
+ omlish/collections/hasheq.py,sha256=UXgZQycBTgPLtwt4onBlNzmjy1zuAw32xuUvOwpwM6g,3813
103
104
  omlish/collections/identity.py,sha256=jhEpC8tnfh3Sg-MJff1Fp9eMydt150wits_UeVdctUk,2723
104
105
  omlish/collections/indexed.py,sha256=tFQsIWH4k9QqsF5VB7DsIVNsRThiQNx-ooRF36X_PnU,2203
105
106
  omlish/collections/mappings.py,sha256=eEifLZez-BWunTuj6974bGxBFfNRODZpu6Oa7_2ME94,3190
@@ -256,7 +257,7 @@ omlish/inject/impl/privates.py,sha256=alpCYyk5VJ9lJknbRH2nLVNFYVvFhkj-VC1Vco3zCF
256
257
  omlish/inject/impl/providers.py,sha256=QnwhsujJFIHC0JTgd2Wlo1kP53i3CWTrj1nKU2DNxwg,2375
257
258
  omlish/inject/impl/proxy.py,sha256=1ko0VaKqzu9UG8bIldp9xtUrAVUOFTKWKTjOCqIGr4s,1636
258
259
  omlish/inject/impl/scopes.py,sha256=ASfULXgP_ETlsAqFJfrZmyEaZt64Zr8tNn5ScA-EoXk,5900
259
- omlish/lang/__init__.py,sha256=pCZoKj7wnFeyl_f7AKBg3Ajl1vrInkqP7miRcjIy6tI,3666
260
+ omlish/lang/__init__.py,sha256=pKAxhQe2qbN9pDXPOz9_MRxTKJPPWHZyAkWoAaZ9P4M,3688
260
261
  omlish/lang/cached.py,sha256=92TvRZQ6sWlm7dNn4hgl7aWKbX0J1XUEo3DRjBpgVQk,7834
261
262
  omlish/lang/clsdct.py,sha256=AjtIWLlx2E6D5rC97zQ3Lwq2SOMkbg08pdO_AxpzEHI,1744
262
263
  omlish/lang/cmp.py,sha256=5vbzWWbqdzDmNKAGL19z6ZfUKe5Ci49e-Oegf9f4BsE,1346
@@ -275,8 +276,8 @@ omlish/lang/strings.py,sha256=BsciSYnckD4vGtC6kmtnugR9IN6CIHdcjO4nZu-pSAw,3898
275
276
  omlish/lang/sys.py,sha256=UoZz_PJYVKLQAKqYxxn-LHz1okK_38I__maZgnXMcxU,406
276
277
  omlish/lang/timeouts.py,sha256=vECdWYhc_IZgcal1Ng1Y42wf2FV3KAx-i8As-MgGHIQ,1186
277
278
  omlish/lang/typing.py,sha256=lJ2NGe4Pmb61I0Tx4A_rOqXNFTws1XHOzafg2knRUio,4155
278
- omlish/lang/classes/__init__.py,sha256=h9QXrvAKD17_pIog0uF-7BCqZbSpJZYxL7kzVzvljp0,583
279
- omlish/lang/classes/abstract.py,sha256=IRnjuLLNwpxvEJsp8fwoQdCIpw0MDAd0TiQfoDMgsn4,2306
279
+ omlish/lang/classes/__init__.py,sha256=D3dn4FOQu5f50kW4_jLCI_zI0fTtADdYumirRdIqSuU,605
280
+ omlish/lang/classes/abstract.py,sha256=oleeYCMVbmFAy8aNLNKeb18Jmmgzfolymdw31m4tejQ,2679
280
281
  omlish/lang/classes/restrict.py,sha256=pSK7ZT_kpwqS6lWRrxwuEe-tt07F0-uZVazgGh-HDco,3921
281
282
  omlish/lang/classes/simple.py,sha256=XQ8b86WvQA0qtSYqlbMOJS7tHgE8sv9onda33uQmbkM,3294
282
283
  omlish/lang/classes/virtual.py,sha256=W-QJuKsDehOcrydwg6eMN0bFPTYbk3Tz84TSH3blb44,3367
@@ -457,9 +458,9 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
457
458
  omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
458
459
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
459
460
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
460
- omlish-0.0.0.dev97.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
461
- omlish-0.0.0.dev97.dist-info/METADATA,sha256=wmMErtqPFPYd69wceqTe57xiockAvRmzLhdroKiURz4,3987
462
- omlish-0.0.0.dev97.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
463
- omlish-0.0.0.dev97.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
464
- omlish-0.0.0.dev97.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
465
- omlish-0.0.0.dev97.dist-info/RECORD,,
461
+ omlish-0.0.0.dev99.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
462
+ omlish-0.0.0.dev99.dist-info/METADATA,sha256=dlvMKXrg8JClykUv0QJZisR5FWrEFVDWqr5W07gAKP0,3999
463
+ omlish-0.0.0.dev99.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
464
+ omlish-0.0.0.dev99.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
465
+ omlish-0.0.0.dev99.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
466
+ omlish-0.0.0.dev99.dist-info/RECORD,,