omlish 0.0.0.dev97__py3-none-any.whl → 0.0.0.dev99__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/__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,,