omlish 0.0.0.dev103__py3-none-any.whl → 0.0.0.dev104__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- omlish/__about__.py +2 -2
- omlish/concurrent/threadlets.py +3 -0
- omlish/fnpairs.py +22 -12
- omlish/formats/json/cli/cli.py +35 -1
- omlish/formats/json/cli/formats.py +7 -0
- omlish/formats/json/cli/io.py +74 -0
- omlish/http/consts.py +2 -0
- omlish/http/jwt.py +179 -0
- omlish/io/__init__.py +3 -0
- omlish/io/pyio.py +2757 -0
- omlish/io/trampoline.py +293 -0
- omlish/lite/marshal.py +71 -28
- omlish/specs/__init__.py +2 -0
- omlish/sync.py +55 -0
- {omlish-0.0.0.dev103.dist-info → omlish-0.0.0.dev104.dist-info}/METADATA +1 -1
- {omlish-0.0.0.dev103.dist-info → omlish-0.0.0.dev104.dist-info}/RECORD +20 -15
- {omlish-0.0.0.dev103.dist-info → omlish-0.0.0.dev104.dist-info}/LICENSE +0 -0
- {omlish-0.0.0.dev103.dist-info → omlish-0.0.0.dev104.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev103.dist-info → omlish-0.0.0.dev104.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev103.dist-info → omlish-0.0.0.dev104.dist-info}/top_level.txt +0 -0
omlish/io/trampoline.py
ADDED
@@ -0,0 +1,293 @@
|
|
1
|
+
"""
|
2
|
+
TODO:
|
3
|
+
- https://docs.python.org/3/library/zlib.html#zlib.compressobj
|
4
|
+
"""
|
5
|
+
import abc
|
6
|
+
import contextlib
|
7
|
+
import io
|
8
|
+
import typing as ta
|
9
|
+
|
10
|
+
from .. import check
|
11
|
+
from .. import lang
|
12
|
+
from ..concurrent import threadlets as tls
|
13
|
+
from ..sync import ConditionDeque
|
14
|
+
|
15
|
+
|
16
|
+
if ta.TYPE_CHECKING:
|
17
|
+
import threading
|
18
|
+
|
19
|
+
from . import pyio # noqa
|
20
|
+
|
21
|
+
else:
|
22
|
+
threading = lang.proxy_import('threading')
|
23
|
+
|
24
|
+
pyio = lang.proxy_import('.pyio', __package__)
|
25
|
+
|
26
|
+
|
27
|
+
T = ta.TypeVar('T')
|
28
|
+
|
29
|
+
BytesLike: ta.TypeAlias = ta.Any
|
30
|
+
|
31
|
+
BufferedReader = io.BufferedReader
|
32
|
+
# BufferedReader = pyio.BufferedReader
|
33
|
+
|
34
|
+
|
35
|
+
##
|
36
|
+
|
37
|
+
|
38
|
+
class ProxyReadFile:
|
39
|
+
def __init__(self, read: ta.Callable[[int], bytes | BaseException]) -> None:
|
40
|
+
super().__init__()
|
41
|
+
|
42
|
+
self._read = read
|
43
|
+
self._eof = False
|
44
|
+
self._closed = False
|
45
|
+
|
46
|
+
#
|
47
|
+
|
48
|
+
def read(self, n: int, /) -> bytes:
|
49
|
+
if self._closed:
|
50
|
+
raise RuntimeError('Closed')
|
51
|
+
if self._eof:
|
52
|
+
return b''
|
53
|
+
d = self._read(n)
|
54
|
+
if isinstance(d, BaseException):
|
55
|
+
raise d
|
56
|
+
if not d:
|
57
|
+
self._eof = True
|
58
|
+
return d
|
59
|
+
|
60
|
+
def readall(self, *args, **kwargs):
|
61
|
+
raise TypeError # FIXME
|
62
|
+
|
63
|
+
def readinto(self, b: BytesLike) -> int | None:
|
64
|
+
d = self.read(len(b))
|
65
|
+
if d:
|
66
|
+
b[:len(d)] = d
|
67
|
+
return len(d)
|
68
|
+
|
69
|
+
#
|
70
|
+
|
71
|
+
def readable(self) -> bool:
|
72
|
+
return not (self._eof or self._closed)
|
73
|
+
|
74
|
+
@property
|
75
|
+
def closed(self) -> bool:
|
76
|
+
return self._closed
|
77
|
+
|
78
|
+
def close(self) -> None:
|
79
|
+
self._closed = True
|
80
|
+
|
81
|
+
#
|
82
|
+
|
83
|
+
def flush(self) -> None:
|
84
|
+
pass
|
85
|
+
|
86
|
+
def seekable(self) -> bool:
|
87
|
+
return False
|
88
|
+
|
89
|
+
def seek(self, n: int, /) -> ta.Any:
|
90
|
+
raise TypeError
|
91
|
+
|
92
|
+
|
93
|
+
##
|
94
|
+
|
95
|
+
|
96
|
+
class NeedMore(lang.Marker):
|
97
|
+
pass
|
98
|
+
|
99
|
+
|
100
|
+
class Exited(lang.Marker):
|
101
|
+
pass
|
102
|
+
|
103
|
+
|
104
|
+
class Shutdown(BaseException): # noqa
|
105
|
+
pass
|
106
|
+
|
107
|
+
|
108
|
+
IoTrampolineTarget: ta.TypeAlias = ta.Callable[[io.BufferedReader], ta.ContextManager[ta.Callable[[], bytes]]]
|
109
|
+
|
110
|
+
|
111
|
+
class IoTrampoline(lang.Abstract):
|
112
|
+
def __init__(
|
113
|
+
self,
|
114
|
+
target: IoTrampolineTarget,
|
115
|
+
*,
|
116
|
+
buffer_size: int | None = None,
|
117
|
+
) -> None:
|
118
|
+
super().__init__()
|
119
|
+
|
120
|
+
self._target = target
|
121
|
+
self._buffer_size = buffer_size
|
122
|
+
|
123
|
+
def _make_buffered_reader(self, raw: ta.Any) -> io.BufferedReader:
|
124
|
+
return io.BufferedReader(
|
125
|
+
raw,
|
126
|
+
**(dict(buffer_size=self._buffer_size) if self._buffer_size is not None else {}),
|
127
|
+
)
|
128
|
+
|
129
|
+
@abc.abstractmethod
|
130
|
+
def close(self, timeout: float | None = None) -> None:
|
131
|
+
raise NotImplementedError
|
132
|
+
|
133
|
+
@abc.abstractmethod
|
134
|
+
def __enter__(self) -> ta.Self:
|
135
|
+
raise NotImplementedError
|
136
|
+
|
137
|
+
@abc.abstractmethod
|
138
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
139
|
+
raise NotImplementedError
|
140
|
+
|
141
|
+
@abc.abstractmethod
|
142
|
+
def feed(self, *data: bytes) -> ta.Iterable[bytes]:
|
143
|
+
raise NotImplementedError
|
144
|
+
|
145
|
+
|
146
|
+
#
|
147
|
+
|
148
|
+
|
149
|
+
class ThreadIoTrampoline(IoTrampoline):
|
150
|
+
def __init__(self, target: IoTrampolineTarget, **kwargs: ta.Any) -> None:
|
151
|
+
super().__init__(target, **kwargs)
|
152
|
+
|
153
|
+
self._in: ConditionDeque[bytes | BaseException] = ConditionDeque()
|
154
|
+
self._out: ConditionDeque[
|
155
|
+
bytes | # noqa
|
156
|
+
type[NeedMore] |
|
157
|
+
type[Exited] |
|
158
|
+
BaseException
|
159
|
+
] = ConditionDeque()
|
160
|
+
|
161
|
+
self._proxy = ProxyReadFile(self._read)
|
162
|
+
|
163
|
+
self._thread = threading.Thread(target=self._thread_proc, daemon=True)
|
164
|
+
|
165
|
+
#
|
166
|
+
|
167
|
+
def close(self, timeout: float | None = None) -> None:
|
168
|
+
if not self._thread.is_alive():
|
169
|
+
return
|
170
|
+
self._out.push(Shutdown())
|
171
|
+
self._thread.join(timeout)
|
172
|
+
if self._thread.is_alive():
|
173
|
+
if timeout is not None:
|
174
|
+
raise TimeoutError
|
175
|
+
else:
|
176
|
+
raise RuntimeError('Failed to join thread')
|
177
|
+
|
178
|
+
#
|
179
|
+
|
180
|
+
def __enter__(self) -> ta.Self:
|
181
|
+
self._thread.start()
|
182
|
+
return self
|
183
|
+
|
184
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
185
|
+
self.close()
|
186
|
+
|
187
|
+
#
|
188
|
+
|
189
|
+
def _read(self, n: int, /) -> bytes | BaseException:
|
190
|
+
return self._in.pop(if_empty=lambda: self._out.push(NeedMore))
|
191
|
+
|
192
|
+
def _thread_proc(self) -> None:
|
193
|
+
try:
|
194
|
+
with contextlib.closing(self._make_buffered_reader(self._proxy)) as bf: # noqa
|
195
|
+
with self._target(bf) as read:
|
196
|
+
while out := read():
|
197
|
+
self._out.push(out)
|
198
|
+
self._out.push(out)
|
199
|
+
except BaseException as e:
|
200
|
+
self._out.push(e)
|
201
|
+
raise
|
202
|
+
finally:
|
203
|
+
self._out.push(Exited)
|
204
|
+
|
205
|
+
def feed(self, *data: bytes) -> ta.Iterable[bytes]:
|
206
|
+
self._in.push(*data)
|
207
|
+
while True:
|
208
|
+
e = self._out.pop()
|
209
|
+
if e is NeedMore:
|
210
|
+
break
|
211
|
+
elif isinstance(e, BaseException):
|
212
|
+
raise e
|
213
|
+
elif e is Exited:
|
214
|
+
raise RuntimeError('IO thread exited')
|
215
|
+
elif isinstance(e, bytes):
|
216
|
+
yield e
|
217
|
+
if not e:
|
218
|
+
return
|
219
|
+
else:
|
220
|
+
raise TypeError(e)
|
221
|
+
|
222
|
+
|
223
|
+
#
|
224
|
+
|
225
|
+
|
226
|
+
class ThreadletIoTrampoline(IoTrampoline):
|
227
|
+
def __init__(
|
228
|
+
self,
|
229
|
+
target: IoTrampolineTarget,
|
230
|
+
threadlets: tls.Threadlets = tls.GREENLET_THREADLETS,
|
231
|
+
** kwargs: ta.Any,
|
232
|
+
) -> None:
|
233
|
+
super().__init__(target, **kwargs)
|
234
|
+
|
235
|
+
self._proxy = ProxyReadFile(self._read)
|
236
|
+
self._tl: tls.Threadlet = threadlets.spawn(self._g_proc)
|
237
|
+
|
238
|
+
#
|
239
|
+
|
240
|
+
def close(self, timeout: float | None = None) -> None:
|
241
|
+
if self._tl.dead:
|
242
|
+
return
|
243
|
+
out = self._tl.switch(Shutdown())
|
244
|
+
if out is not Exited or not self._tl.dead:
|
245
|
+
raise RuntimeError
|
246
|
+
|
247
|
+
#
|
248
|
+
|
249
|
+
def __enter__(self) -> ta.Self:
|
250
|
+
out = self._tl.switch()
|
251
|
+
if out is not NeedMore:
|
252
|
+
raise RuntimeError
|
253
|
+
return self
|
254
|
+
|
255
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
256
|
+
self.close()
|
257
|
+
|
258
|
+
#
|
259
|
+
|
260
|
+
def _read(self, n: int, /) -> bytes:
|
261
|
+
out = check.not_none(self._tl.parent).switch(NeedMore)
|
262
|
+
return out
|
263
|
+
|
264
|
+
def _g_proc(self) -> ta.Any:
|
265
|
+
try:
|
266
|
+
with contextlib.closing(self._make_buffered_reader(self._proxy)) as bf: # noqa
|
267
|
+
with self._target(bf) as read:
|
268
|
+
while out := read():
|
269
|
+
e = check.not_none(self._tl.parent).switch(out)
|
270
|
+
if e is not NeedMore:
|
271
|
+
raise TypeError(e) # noqa
|
272
|
+
e = check.not_none(self._tl.parent).switch(out)
|
273
|
+
if not isinstance(e, Shutdown):
|
274
|
+
raise TypeError(e) # noqa
|
275
|
+
return Exited
|
276
|
+
except BaseException as e:
|
277
|
+
check.not_none(self._tl.parent).throw(e)
|
278
|
+
raise
|
279
|
+
|
280
|
+
def feed(self, *data: bytes) -> ta.Iterable[bytes]:
|
281
|
+
i: bytes | type[NeedMore]
|
282
|
+
for i in data:
|
283
|
+
while True:
|
284
|
+
e = self._tl.switch(i)
|
285
|
+
i = NeedMore
|
286
|
+
if e is NeedMore:
|
287
|
+
break
|
288
|
+
elif isinstance(e, bytes):
|
289
|
+
yield e
|
290
|
+
if not e:
|
291
|
+
return
|
292
|
+
else:
|
293
|
+
raise TypeError(e)
|
omlish/lite/marshal.py
CHANGED
@@ -12,6 +12,8 @@ import datetime
|
|
12
12
|
import decimal
|
13
13
|
import enum
|
14
14
|
import fractions
|
15
|
+
import functools
|
16
|
+
import threading
|
15
17
|
import typing as ta
|
16
18
|
import uuid
|
17
19
|
import weakref # noqa
|
@@ -210,7 +212,10 @@ class UuidObjMarshaler(ObjMarshaler):
|
|
210
212
|
return uuid.UUID(o)
|
211
213
|
|
212
214
|
|
213
|
-
|
215
|
+
##
|
216
|
+
|
217
|
+
|
218
|
+
_DEFAULT_OBJ_MARSHALERS: ta.Dict[ta.Any, ObjMarshaler] = {
|
214
219
|
**{t: NopObjMarshaler() for t in (type(None),)},
|
215
220
|
**{t: CastObjMarshaler(t) for t in (int, float, str, bool)},
|
216
221
|
**{t: Base64ObjMarshaler(t) for t in (bytes, bytearray)},
|
@@ -239,20 +244,19 @@ _OBJ_MARSHALER_GENERIC_ITERABLE_TYPES: ta.Dict[ta.Any, type] = {
|
|
239
244
|
}
|
240
245
|
|
241
246
|
|
242
|
-
def
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
def _make_obj_marshaler(ty: ta.Any) -> ObjMarshaler:
|
247
|
+
def _make_obj_marshaler(
|
248
|
+
ty: ta.Any,
|
249
|
+
rec: ta.Callable[[ta.Any], ObjMarshaler],
|
250
|
+
*,
|
251
|
+
nonstrict_dataclasses: bool = False,
|
252
|
+
) -> ObjMarshaler:
|
249
253
|
if isinstance(ty, type):
|
250
254
|
if abc.ABC in ty.__bases__:
|
251
255
|
impls = [ # type: ignore
|
252
256
|
PolymorphicObjMarshaler.Impl(
|
253
257
|
ity,
|
254
258
|
ity.__qualname__,
|
255
|
-
|
259
|
+
rec(ity),
|
256
260
|
)
|
257
261
|
for ity in deep_subclasses(ty)
|
258
262
|
if abc.ABC not in ity.__bases__
|
@@ -268,7 +272,8 @@ def _make_obj_marshaler(ty: ta.Any) -> ObjMarshaler:
|
|
268
272
|
if dc.is_dataclass(ty):
|
269
273
|
return DataclassObjMarshaler(
|
270
274
|
ty,
|
271
|
-
{f.name:
|
275
|
+
{f.name: rec(f.type) for f in dc.fields(ty)},
|
276
|
+
nonstrict=nonstrict_dataclasses,
|
272
277
|
)
|
273
278
|
|
274
279
|
if is_generic_alias(ty):
|
@@ -278,7 +283,7 @@ def _make_obj_marshaler(ty: ta.Any) -> ObjMarshaler:
|
|
278
283
|
pass
|
279
284
|
else:
|
280
285
|
k, v = ta.get_args(ty)
|
281
|
-
return MappingObjMarshaler(mt,
|
286
|
+
return MappingObjMarshaler(mt, rec(k), rec(v))
|
282
287
|
|
283
288
|
try:
|
284
289
|
st = _OBJ_MARSHALER_GENERIC_ITERABLE_TYPES[ta.get_origin(ty)]
|
@@ -286,33 +291,71 @@ def _make_obj_marshaler(ty: ta.Any) -> ObjMarshaler:
|
|
286
291
|
pass
|
287
292
|
else:
|
288
293
|
[e] = ta.get_args(ty)
|
289
|
-
return IterableObjMarshaler(st,
|
294
|
+
return IterableObjMarshaler(st, rec(e))
|
290
295
|
|
291
296
|
if is_union_alias(ty):
|
292
|
-
return OptionalObjMarshaler(
|
297
|
+
return OptionalObjMarshaler(rec(get_optional_alias_arg(ty)))
|
293
298
|
|
294
299
|
raise TypeError(ty)
|
295
300
|
|
296
301
|
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
p.m = m
|
302
|
+
##
|
303
|
+
|
304
|
+
|
305
|
+
_OBJ_MARSHALERS_LOCK = threading.RLock()
|
306
|
+
|
307
|
+
_OBJ_MARSHALERS: ta.Dict[ta.Any, ObjMarshaler] = dict(_DEFAULT_OBJ_MARSHALERS)
|
308
|
+
|
309
|
+
_OBJ_MARSHALER_PROXIES: ta.Dict[ta.Any, ProxyObjMarshaler] = {}
|
310
|
+
|
311
|
+
|
312
|
+
def register_opj_marshaler(ty: ta.Any, m: ObjMarshaler) -> None:
|
313
|
+
with _OBJ_MARSHALERS_LOCK:
|
314
|
+
if ty in _OBJ_MARSHALERS:
|
315
|
+
raise KeyError(ty)
|
312
316
|
_OBJ_MARSHALERS[ty] = m
|
317
|
+
|
318
|
+
|
319
|
+
def get_obj_marshaler(
|
320
|
+
ty: ta.Any,
|
321
|
+
*,
|
322
|
+
no_cache: bool = False,
|
323
|
+
**kwargs: ta.Any,
|
324
|
+
) -> ObjMarshaler:
|
325
|
+
with _OBJ_MARSHALERS_LOCK:
|
326
|
+
if not no_cache:
|
327
|
+
try:
|
328
|
+
return _OBJ_MARSHALERS[ty]
|
329
|
+
except KeyError:
|
330
|
+
pass
|
331
|
+
|
332
|
+
try:
|
333
|
+
return _OBJ_MARSHALER_PROXIES[ty]
|
334
|
+
except KeyError:
|
335
|
+
pass
|
336
|
+
|
337
|
+
rec = functools.partial(
|
338
|
+
get_obj_marshaler,
|
339
|
+
no_cache=no_cache,
|
340
|
+
**kwargs,
|
341
|
+
)
|
342
|
+
|
343
|
+
p = ProxyObjMarshaler()
|
344
|
+
_OBJ_MARSHALER_PROXIES[ty] = p
|
345
|
+
try:
|
346
|
+
m = _make_obj_marshaler(ty, rec, **kwargs)
|
347
|
+
finally:
|
348
|
+
del _OBJ_MARSHALER_PROXIES[ty]
|
349
|
+
p.m = m
|
350
|
+
|
351
|
+
if not no_cache:
|
352
|
+
_OBJ_MARSHALERS[ty] = m
|
313
353
|
return m
|
314
354
|
|
315
355
|
|
356
|
+
##
|
357
|
+
|
358
|
+
|
316
359
|
def marshal_obj(o: ta.Any, ty: ta.Any = None) -> ta.Any:
|
317
360
|
return get_obj_marshaler(ty if ty is not None else type(o)).marshal(o)
|
318
361
|
|
omlish/specs/__init__.py
CHANGED
omlish/sync.py
CHANGED
@@ -3,6 +3,7 @@ TODO:
|
|
3
3
|
- sync (lol) w/ asyncs.anyio
|
4
4
|
- atomics
|
5
5
|
"""
|
6
|
+
import collections
|
6
7
|
import threading
|
7
8
|
import typing as ta
|
8
9
|
|
@@ -68,3 +69,57 @@ class LazyFn(ta.Generic[T]):
|
|
68
69
|
self._v = lang.just(self._fn())
|
69
70
|
self._once.do(do)
|
70
71
|
return self._v.must()
|
72
|
+
|
73
|
+
|
74
|
+
class ConditionDeque(ta.Generic[T]):
|
75
|
+
def __init__(
|
76
|
+
self,
|
77
|
+
*,
|
78
|
+
cond: ta.Optional['threading.Condition'] = None,
|
79
|
+
deque: collections.deque[T] | None = None,
|
80
|
+
|
81
|
+
lock: ta.Optional['threading.RLock'] = None,
|
82
|
+
maxlen: int | None = None,
|
83
|
+
init: ta.Iterable[T] | None = None,
|
84
|
+
) -> None:
|
85
|
+
super().__init__()
|
86
|
+
|
87
|
+
if cond is None:
|
88
|
+
cond = threading.Condition(lock=lock)
|
89
|
+
if deque is None:
|
90
|
+
deque = collections.deque(maxlen=maxlen)
|
91
|
+
if init:
|
92
|
+
deque.extend(init)
|
93
|
+
|
94
|
+
self._cond = cond
|
95
|
+
self._deque = deque
|
96
|
+
|
97
|
+
@property
|
98
|
+
def cond(self) -> 'threading.Condition':
|
99
|
+
return self._cond
|
100
|
+
|
101
|
+
@property
|
102
|
+
def deque(self) -> collections.deque[T]:
|
103
|
+
return self._deque
|
104
|
+
|
105
|
+
def push(
|
106
|
+
self,
|
107
|
+
*items: T,
|
108
|
+
n: int = 1,
|
109
|
+
) -> None:
|
110
|
+
with self.cond:
|
111
|
+
self.deque.extend(items)
|
112
|
+
self.cond.notify(n)
|
113
|
+
|
114
|
+
def pop(
|
115
|
+
self,
|
116
|
+
timeout: float | None = None,
|
117
|
+
*,
|
118
|
+
if_empty: ta.Callable[[], None] | None = None,
|
119
|
+
) -> T:
|
120
|
+
with self.cond:
|
121
|
+
if not self.deque and if_empty is not None:
|
122
|
+
if_empty()
|
123
|
+
while not self.deque:
|
124
|
+
self.cond.wait(timeout)
|
125
|
+
return self.deque.popleft()
|
@@ -1,5 +1,5 @@
|
|
1
1
|
omlish/.manifests.json,sha256=hTFp9tvE72BxKloIq1s1SS0LRQlIsvMtO69Sbc47rKg,1704
|
2
|
-
omlish/__about__.py,sha256=
|
2
|
+
omlish/__about__.py,sha256=eXMJ1X3ac5DhIwcFjhLaDOtcyXblPwi6wDohYlBKyHc,3352
|
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
|
@@ -8,7 +8,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=
|
11
|
+
omlish/fnpairs.py,sha256=hLCjbwZ0cVGPmTaw_NMpMau0KpjYEB6kKzI_mNgoKnk,10778
|
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
|
@@ -17,7 +17,7 @@ omlish/matchfns.py,sha256=I1IlQGfEyk_AcFSy6ulVS3utC-uwyZM2YfUXYHc9Bw0,6152
|
|
17
17
|
omlish/multiprocessing.py,sha256=QZT4C7I-uThCAjaEY3xgUYb-5GagUlnE4etN01LDyU4,5186
|
18
18
|
omlish/os.py,sha256=5nJ-a9JKSMoaZVZ1eOa5BAbfL7o7CF7ue_PyJwufnwY,1460
|
19
19
|
omlish/runmodule.py,sha256=PWvuAaJ9wQQn6bx9ftEL3_d04DyotNn8dR_twm2pgw0,700
|
20
|
-
omlish/sync.py,sha256=
|
20
|
+
omlish/sync.py,sha256=QJ79kxmIqDP9SeHDoZAf--DpFIhDQe1jACy8H4N0yZI,2928
|
21
21
|
omlish/term.py,sha256=BXJSE9gfM461bh4z_gysx0oavZSafqcQs5ayZK-kTUo,9284
|
22
22
|
omlish/antlr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
23
23
|
omlish/antlr/_runtime/BufferedTokenStream.py,sha256=1Rnhm62MZCWSuQeRs7lRUbdtdyo7Gyg8r4gAETjv-cE,10793
|
@@ -119,7 +119,7 @@ omlish/collections/cache/types.py,sha256=yNjwd6CGyTJQdxN2CQxFqqBAlcs1Z7vvNV-aU1K
|
|
119
119
|
omlish/concurrent/__init__.py,sha256=9p-s8MvBEYDqHIoYU3OYoe-Nni22QdkW7nhZGEukJTM,197
|
120
120
|
omlish/concurrent/executors.py,sha256=FYKCDYYuj-OgMa8quLsA47SfFNX3KDJvRENVk8NDsrA,1292
|
121
121
|
omlish/concurrent/futures.py,sha256=J2s9wYURUskqRJiBbAR0PNEAp1pXbIMYldOVBTQduQY,4239
|
122
|
-
omlish/concurrent/threadlets.py,sha256=
|
122
|
+
omlish/concurrent/threadlets.py,sha256=JfirbTDJgy9Ouokz_VmHeAAPS7cih8qMUJrN-owwXD4,2423
|
123
123
|
omlish/configs/__init__.py,sha256=3uh09ezodTwkMI0nRmAMP0eEuJ_0VdF-LYyNmPjHiCE,77
|
124
124
|
omlish/configs/classes.py,sha256=GLbB8xKjHjjoUQRCUQm3nEjM8z1qNTx9gPV7ODSt5dg,1317
|
125
125
|
omlish/configs/flattening.py,sha256=AOlRpBHm449MxwMp3CiIRGunStOC1DUNs1f3CLou0wc,4731
|
@@ -198,8 +198,9 @@ omlish/formats/json/backends/std.py,sha256=PM00Kh9ZR2XzollHMEvdo35Eml1N-zFfRW-LO
|
|
198
198
|
omlish/formats/json/backends/ujson.py,sha256=BNJCU4kluGHdqTUKLJEuHhE2m2TmqR7HEN289S0Eokg,2278
|
199
199
|
omlish/formats/json/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
200
200
|
omlish/formats/json/cli/__main__.py,sha256=1wxxKZVkj_u7HCcewwMIbGuZj_Wph95yrUbm474Op9M,188
|
201
|
-
omlish/formats/json/cli/cli.py,sha256=
|
202
|
-
omlish/formats/json/cli/formats.py,sha256=
|
201
|
+
omlish/formats/json/cli/cli.py,sha256=RoyZPSoIZ5aJxWeMQlUom_MhqwE58Vcg9HV8AIRNot8,8113
|
202
|
+
omlish/formats/json/cli/formats.py,sha256=FUZ0ptn3n0ljei2_o0t5UtmZkMB3_5p1pE-hgDD3-ak,1721
|
203
|
+
omlish/formats/json/cli/io.py,sha256=IoJ5asjS_gUan5TcrGgS0KpJaiSE5YQgEGljFMCcDto,1427
|
203
204
|
omlish/formats/json/stream/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
204
205
|
omlish/formats/json/stream/build.py,sha256=6deXBxTx1toFAPShz2Jo5OiXxH5Y4ppG8gDPRFoUgjA,2461
|
205
206
|
omlish/formats/json/stream/lex.py,sha256=_JYoWFRpo3_dQmT7xXCWGFNoBT4M8m97G9oGzwPZeo4,6483
|
@@ -217,12 +218,13 @@ omlish/graphs/dot/utils.py,sha256=_FMwn77WfiiAfLsRTOKWm4IYbNv5kQN22YJ5psw6CWg,80
|
|
217
218
|
omlish/http/__init__.py,sha256=OqCovZi_jv1Mnk975idaXA8FCGy4laoQIvNZ3hdKpRQ,722
|
218
219
|
omlish/http/asgi.py,sha256=wXhBZ21bEl32Kv9yBrRwUR_7pHEgVtHP8ZZwbasQ6-4,3307
|
219
220
|
omlish/http/clients.py,sha256=WRtCNIt9Y790xpem69HiXJY9W-vPlpGPKZwpHusa2EE,6280
|
220
|
-
omlish/http/consts.py,sha256=
|
221
|
+
omlish/http/consts.py,sha256=s-3GgSt1-mJLdQYe8nZ3-OwycMSPj3aCTLSukZcPjXs,2216
|
221
222
|
omlish/http/cookies.py,sha256=uuOYlHR6e2SC3GM41V0aozK10nef9tYg83Scqpn5-HM,6351
|
222
223
|
omlish/http/dates.py,sha256=Otgp8wRxPgNGyzx8LFowu1vC4EKJYARCiAwLFncpfHM,2875
|
223
224
|
omlish/http/encodings.py,sha256=w2WoKajpaZnQH8j-IBvk5ZFL2O2pAU_iBvZnkocaTlw,164
|
224
225
|
omlish/http/headers.py,sha256=ZMmjrEiYjzo0YTGyK0YsvjdwUazktGqzVVYorY4fd44,5081
|
225
226
|
omlish/http/json.py,sha256=9XwAsl4966Mxrv-1ytyCqhcE6lbBJw-0_tFZzGszgHE,7440
|
227
|
+
omlish/http/jwt.py,sha256=6Rigk1WrJ059DY4jDIKnxjnChWb7aFdermj2AI2DSvk,4346
|
226
228
|
omlish/http/multipart.py,sha256=R9ycpHsXRcmh0uoc43aYb7BdWL-8kSQHe7J-M81aQZM,2240
|
227
229
|
omlish/http/sessions.py,sha256=VZ_WS5uiQG5y7i3u8oKuQMqf8dPKUOjFm_qk_0OvI8c,4793
|
228
230
|
omlish/http/sse.py,sha256=MDs9RvxQXoQliImcc6qK1ERajEYM7Q1l8xmr-9ceNBc,2315
|
@@ -257,6 +259,9 @@ omlish/inject/impl/privates.py,sha256=alpCYyk5VJ9lJknbRH2nLVNFYVvFhkj-VC1Vco3zCF
|
|
257
259
|
omlish/inject/impl/providers.py,sha256=QnwhsujJFIHC0JTgd2Wlo1kP53i3CWTrj1nKU2DNxwg,2375
|
258
260
|
omlish/inject/impl/proxy.py,sha256=1ko0VaKqzu9UG8bIldp9xtUrAVUOFTKWKTjOCqIGr4s,1636
|
259
261
|
omlish/inject/impl/scopes.py,sha256=ASfULXgP_ETlsAqFJfrZmyEaZt64Zr8tNn5ScA-EoXk,5900
|
262
|
+
omlish/io/__init__.py,sha256=aaIEsXTSfytW-oEkUWczdUJ_ifFY7ihIpyidIbfjkwY,56
|
263
|
+
omlish/io/pyio.py,sha256=YB3g6yg64MzcFwbzKBo4adnbsbZ3FZMlOZfjNtWmYoc,95316
|
264
|
+
omlish/io/trampoline.py,sha256=pOwCtwPtLiwdA3JAN5vopv2ZlzKOhllrXg1ltvaEVAc,7249
|
260
265
|
omlish/lang/__init__.py,sha256=1BTfyRGPq8ahztMT3xP34EcN2zV3bInCqc1XrUygZh8,3704
|
261
266
|
omlish/lang/cached.py,sha256=92TvRZQ6sWlm7dNn4hgl7aWKbX0J1XUEo3DRjBpgVQk,7834
|
262
267
|
omlish/lang/clsdct.py,sha256=AjtIWLlx2E6D5rC97zQ3Lwq2SOMkbg08pdO_AxpzEHI,1744
|
@@ -296,7 +301,7 @@ omlish/lite/contextmanagers.py,sha256=_n6a9xhn06BD8H6A_SDtcipMrSBpzBqcxI0Ob2juom
|
|
296
301
|
omlish/lite/io.py,sha256=lcpI1cS_Kn90tvYMg8ZWkSlYloS4RFqXCk-rKyclhdg,3148
|
297
302
|
omlish/lite/json.py,sha256=7-02Ny4fq-6YAu5ynvqoijhuYXWpLmfCI19GUeZnb1c,740
|
298
303
|
omlish/lite/logs.py,sha256=vkFkSX0Izb2P-NNMqqNLSec0BzeLOtHoQWgdXwQuDPU,6007
|
299
|
-
omlish/lite/marshal.py,sha256=
|
304
|
+
omlish/lite/marshal.py,sha256=SyYMsJ-TaGO9FX7LykBB0WtqsqetX9eLBotPiz3M_xg,9478
|
300
305
|
omlish/lite/pidfile.py,sha256=PRSDOAXmNkNwxh-Vwif0Nrs8RAmWroiNhLKIbdjwzBc,1723
|
301
306
|
omlish/lite/reflect.py,sha256=9QYJwdINraq1JNMEgvoqeSlVvRRgOXpxAkpgX8EgRXc,1307
|
302
307
|
omlish/lite/runtime.py,sha256=VUhmNQvwf8QzkWSKj4Q0ReieJA_PzHaJNRBivfTseow,452
|
@@ -356,7 +361,7 @@ omlish/secrets/pwgen.py,sha256=v-5ztnOTHTAWXLGR-3H6HkMj2nPIZBMbo5xWR3q0rDY,1707
|
|
356
361
|
omlish/secrets/pwhash.py,sha256=3r-vEK6Gp6aq4L5Csnd06QnrjO9xfzHJP-g_7I9W_ao,4101
|
357
362
|
omlish/secrets/secrets.py,sha256=cnDGBoPknVxsCN04_gqcJT_7Ebk3iO3VPkRZ2oMjkMw,7868
|
358
363
|
omlish/secrets/subprocesses.py,sha256=EcnKlHHtnUMHGrBWXDfu8tv28wlgZx4P4GOiuPW9Vo8,1105
|
359
|
-
omlish/specs/__init__.py,sha256=
|
364
|
+
omlish/specs/__init__.py,sha256=zZwF8yXTEkSstYtORkDhVLK-_hWU8WOJCuBpognb_NY,118
|
360
365
|
omlish/specs/jmespath/LICENSE,sha256=IH-ZZlZkS8XMkf_ubNVD1aYHQ2l_wd0tmHtXrCcYpRU,1113
|
361
366
|
omlish/specs/jmespath/__init__.py,sha256=Lz8JO0vP-pwrBtq9Y94y6LrOA7o1u1kCdPmMf_4lJBY,1918
|
362
367
|
omlish/specs/jmespath/__main__.py,sha256=wIXm6bs08etNG_GZlN2rBkADPb0rKfL2HSkm8spnpxw,200
|
@@ -458,9 +463,9 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
|
|
458
463
|
omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
|
459
464
|
omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
|
460
465
|
omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
|
461
|
-
omlish-0.0.0.
|
462
|
-
omlish-0.0.0.
|
463
|
-
omlish-0.0.0.
|
464
|
-
omlish-0.0.0.
|
465
|
-
omlish-0.0.0.
|
466
|
-
omlish-0.0.0.
|
466
|
+
omlish-0.0.0.dev104.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
467
|
+
omlish-0.0.0.dev104.dist-info/METADATA,sha256=vPlEUQb7V6eq66MyHSmmlwUQ342OOUE6jdSxnzBolxw,4000
|
468
|
+
omlish-0.0.0.dev104.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
|
469
|
+
omlish-0.0.0.dev104.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
|
470
|
+
omlish-0.0.0.dev104.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
|
471
|
+
omlish-0.0.0.dev104.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|