omlish 0.0.0.dev218__py3-none-any.whl → 0.0.0.dev220__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- omlish/__about__.py +3 -3
- omlish/antlr/dot.py +13 -6
- omlish/dataclasses/__init__.py +1 -0
- omlish/dataclasses/impl/api.py +10 -0
- omlish/dataclasses/impl/fields.py +8 -1
- omlish/dataclasses/impl/init.py +1 -1
- omlish/dataclasses/impl/main.py +1 -1
- omlish/dataclasses/impl/metaclass.py +112 -29
- omlish/dataclasses/impl/overrides.py +53 -0
- omlish/dataclasses/impl/params.py +3 -0
- omlish/dataclasses/impl/reflect.py +17 -5
- omlish/dataclasses/impl/simple.py +0 -42
- omlish/http/coro/server.py +60 -40
- omlish/http/handlers.py +15 -0
- omlish/http/sessions.py +1 -1
- omlish/http/simple.py +101 -0
- omlish/io/fileno.py +11 -0
- omlish/lang/__init__.py +4 -1
- omlish/lang/cached.py +0 -1
- omlish/lang/classes/__init__.py +3 -1
- omlish/lang/classes/abstract.py +14 -1
- omlish/lang/classes/restrict.py +5 -5
- omlish/lang/classes/virtual.py +0 -1
- omlish/lang/clsdct.py +0 -1
- omlish/lang/contextmanagers.py +0 -8
- omlish/lang/descriptors.py +0 -1
- omlish/lang/maybes.py +0 -1
- omlish/lang/objects.py +0 -2
- omlish/secrets/__init__.py +0 -24
- omlish/secrets/all.py +16 -0
- omlish/secrets/secrets.py +6 -0
- omlish/secrets/ssl.py +9 -0
- omlish/secrets/tempssl.py +50 -0
- omlish/sockets/addresses.py +22 -10
- omlish/sockets/bind.py +26 -20
- omlish/sockets/handlers.py +7 -0
- omlish/sockets/server/handlers.py +39 -4
- omlish/sockets/server/server.py +25 -4
- omlish/sql/alchemy/secrets.py +1 -1
- omlish/sql/dbs.py +1 -1
- {omlish-0.0.0.dev218.dist-info → omlish-0.0.0.dev220.dist-info}/METADATA +3 -3
- {omlish-0.0.0.dev218.dist-info → omlish-0.0.0.dev220.dist-info}/RECORD +46 -40
- {omlish-0.0.0.dev218.dist-info → omlish-0.0.0.dev220.dist-info}/LICENSE +0 -0
- {omlish-0.0.0.dev218.dist-info → omlish-0.0.0.dev220.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev218.dist-info → omlish-0.0.0.dev220.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev218.dist-info → omlish-0.0.0.dev220.dist-info}/top_level.txt +0 -0
omlish/sockets/addresses.py
CHANGED
@@ -5,7 +5,7 @@ TODO:
|
|
5
5
|
- codification of https://docs.python.org/3/library/socket.html#socket-families
|
6
6
|
"""
|
7
7
|
import dataclasses as dc
|
8
|
-
import socket
|
8
|
+
import socket as socket_
|
9
9
|
import typing as ta
|
10
10
|
|
11
11
|
|
@@ -19,15 +19,15 @@ SocketAddress = ta.Any
|
|
19
19
|
class SocketAddressInfoArgs:
|
20
20
|
host: ta.Optional[str]
|
21
21
|
port: ta.Union[str, int, None]
|
22
|
-
family:
|
22
|
+
family: socket_.AddressFamily = socket_.AddressFamily.AF_UNSPEC
|
23
23
|
type: int = 0
|
24
24
|
proto: int = 0
|
25
|
-
flags:
|
25
|
+
flags: socket_.AddressInfo = socket_.AddressInfo(0)
|
26
26
|
|
27
27
|
|
28
28
|
@dc.dataclass(frozen=True)
|
29
29
|
class SocketAddressInfo:
|
30
|
-
family:
|
30
|
+
family: socket_.AddressFamily
|
31
31
|
type: int
|
32
32
|
proto: int
|
33
33
|
canonname: ta.Optional[str]
|
@@ -35,28 +35,40 @@ class SocketAddressInfo:
|
|
35
35
|
|
36
36
|
|
37
37
|
class SocketFamilyAndAddress(ta.NamedTuple):
|
38
|
-
family:
|
38
|
+
family: socket_.AddressFamily
|
39
39
|
address: SocketAddress
|
40
40
|
|
41
41
|
|
42
42
|
def get_best_socket_family(
|
43
43
|
host: ta.Optional[str],
|
44
44
|
port: ta.Union[str, int, None],
|
45
|
-
family: ta.Union[int,
|
45
|
+
family: ta.Union[int, socket_.AddressFamily] = socket_.AddressFamily.AF_UNSPEC,
|
46
46
|
) -> SocketFamilyAndAddress:
|
47
47
|
"""https://github.com/python/cpython/commit/f289084c83190cc72db4a70c58f007ec62e75247"""
|
48
48
|
|
49
|
-
infos =
|
49
|
+
infos = socket_.getaddrinfo(
|
50
50
|
host,
|
51
51
|
port,
|
52
52
|
family,
|
53
|
-
type=
|
54
|
-
flags=
|
53
|
+
type=socket_.SOCK_STREAM,
|
54
|
+
flags=socket_.AI_PASSIVE,
|
55
55
|
)
|
56
56
|
ai = SocketAddressInfo(*next(iter(infos)))
|
57
57
|
return SocketFamilyAndAddress(ai.family, ai.sockaddr)
|
58
58
|
|
59
59
|
|
60
60
|
class SocketAndAddress(ta.NamedTuple):
|
61
|
-
socket:
|
61
|
+
socket: socket_.socket
|
62
62
|
address: SocketAddress
|
63
|
+
|
64
|
+
def wrap_socket(self, fn: ta.Callable[[socket_.socket], socket_.socket]):
|
65
|
+
return self._replace(socket=fn(self.socket))
|
66
|
+
|
67
|
+
@classmethod
|
68
|
+
def socket_wrapper(
|
69
|
+
cls,
|
70
|
+
fn: ta.Callable[[socket_.socket], socket_.socket],
|
71
|
+
) -> ta.Callable[['SocketAndAddress'], 'SocketAndAddress']:
|
72
|
+
def inner(conn):
|
73
|
+
return conn.wrap_socket(fn)
|
74
|
+
return inner
|
omlish/sockets/bind.py
CHANGED
@@ -2,7 +2,10 @@
|
|
2
2
|
# @omlish-lite
|
3
3
|
"""
|
4
4
|
TODO:
|
5
|
+
- def parse: (<bind>)?:<port>, unix://, fd://
|
6
|
+
- unix chown/chgrp
|
5
7
|
- DupSocketBinder
|
8
|
+
- udp
|
6
9
|
"""
|
7
10
|
import abc
|
8
11
|
import dataclasses as dc
|
@@ -21,6 +24,9 @@ from omlish.sockets.addresses import SocketAndAddress
|
|
21
24
|
SocketBinderT = ta.TypeVar('SocketBinderT', bound='SocketBinder')
|
22
25
|
SocketBinderConfigT = ta.TypeVar('SocketBinderConfigT', bound='SocketBinder.Config')
|
23
26
|
|
27
|
+
CanSocketBinderConfig = ta.Union['SocketBinder.Config', int, ta.Tuple[str, int], str] # ta.TypeAlias
|
28
|
+
CanSocketBinder = ta.Union['SocketBinder', CanSocketBinderConfig] # ta.TypeAlias
|
29
|
+
|
24
30
|
|
25
31
|
##
|
26
32
|
|
@@ -38,33 +44,29 @@ class SocketBinder(abc.ABC, ta.Generic[SocketBinderConfigT]):
|
|
38
44
|
#
|
39
45
|
|
40
46
|
@classmethod
|
41
|
-
def
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
str,
|
47
|
-
],
|
48
|
-
) -> 'SocketBinder.Config':
|
49
|
-
if isinstance(target, int):
|
47
|
+
def of(cls, obj: CanSocketBinderConfig) -> 'SocketBinder.Config':
|
48
|
+
if isinstance(obj, SocketBinder.Config):
|
49
|
+
return obj
|
50
|
+
|
51
|
+
elif isinstance(obj, int):
|
50
52
|
return TcpSocketBinder.Config(
|
51
|
-
port=
|
53
|
+
port=obj,
|
52
54
|
)
|
53
55
|
|
54
|
-
elif isinstance(
|
55
|
-
host, port =
|
56
|
+
elif isinstance(obj, tuple):
|
57
|
+
host, port = obj
|
56
58
|
return TcpSocketBinder.Config(
|
57
59
|
host=host,
|
58
60
|
port=port,
|
59
61
|
)
|
60
62
|
|
61
|
-
elif isinstance(
|
63
|
+
elif isinstance(obj, str):
|
62
64
|
return UnixSocketBinder.Config(
|
63
|
-
file=
|
65
|
+
file=obj,
|
64
66
|
)
|
65
67
|
|
66
68
|
else:
|
67
|
-
raise TypeError(
|
69
|
+
raise TypeError(obj)
|
68
70
|
|
69
71
|
#
|
70
72
|
|
@@ -76,13 +78,16 @@ class SocketBinder(abc.ABC, ta.Generic[SocketBinderConfigT]):
|
|
76
78
|
#
|
77
79
|
|
78
80
|
@classmethod
|
79
|
-
def
|
81
|
+
def of(cls, obj: CanSocketBinder) -> 'SocketBinder':
|
82
|
+
if isinstance(obj, SocketBinder):
|
83
|
+
return obj
|
84
|
+
|
80
85
|
config: SocketBinder.Config
|
81
|
-
if isinstance(
|
82
|
-
config =
|
86
|
+
if isinstance(obj, SocketBinder.Config):
|
87
|
+
config = obj
|
83
88
|
|
84
89
|
else:
|
85
|
-
config = SocketBinder.Config.
|
90
|
+
config = SocketBinder.Config.of(obj)
|
86
91
|
|
87
92
|
if isinstance(config, TcpSocketBinder.Config):
|
88
93
|
return TcpSocketBinder(config)
|
@@ -307,7 +312,8 @@ class UnixSocketBinder(SocketBinder):
|
|
307
312
|
|
308
313
|
if self._config.unlink:
|
309
314
|
try:
|
310
|
-
os.
|
315
|
+
if stat.S_ISSOCK(os.stat(self._config.file).st_mode):
|
316
|
+
os.unlink(self._config.file)
|
311
317
|
except FileNotFoundError:
|
312
318
|
pass
|
313
319
|
|
omlish/sockets/handlers.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# ruff: noqa: UP006 UP007
|
2
2
|
# @omlish-lite
|
3
|
+
import abc
|
3
4
|
import typing as ta
|
4
5
|
|
5
6
|
from .addresses import SocketAddress
|
@@ -10,3 +11,9 @@ SocketHandler = ta.Callable[[SocketAddress, 'SocketIoPair'], None] # ta.TypeAli
|
|
10
11
|
|
11
12
|
|
12
13
|
##
|
14
|
+
|
15
|
+
|
16
|
+
class SocketHandler_(abc.ABC): # noqa
|
17
|
+
@abc.abstractmethod
|
18
|
+
def __call__(self, addr: SocketAddress, f: SocketIoPair) -> None:
|
19
|
+
raise NotImplementedError
|
@@ -1,5 +1,7 @@
|
|
1
|
-
# @omlish-lite
|
2
1
|
# ruff: noqa: UP006 UP007
|
2
|
+
# @omlish-lite
|
3
|
+
import abc
|
4
|
+
import concurrent.futures as cf
|
3
5
|
import dataclasses as dc
|
4
6
|
import socket
|
5
7
|
import typing as ta
|
@@ -16,8 +18,17 @@ SocketServerHandler = ta.Callable[[SocketAndAddress], None] # ta.TypeAlias
|
|
16
18
|
##
|
17
19
|
|
18
20
|
|
21
|
+
class SocketServerHandler_(abc.ABC): # noqa
|
22
|
+
@abc.abstractmethod
|
23
|
+
def __call__(self, conn: SocketAndAddress) -> None:
|
24
|
+
raise NotImplementedError
|
25
|
+
|
26
|
+
|
27
|
+
##
|
28
|
+
|
29
|
+
|
19
30
|
@dc.dataclass(frozen=True)
|
20
|
-
class StandardSocketServerHandler:
|
31
|
+
class StandardSocketServerHandler(SocketServerHandler_):
|
21
32
|
handler: SocketServerHandler
|
22
33
|
|
23
34
|
timeout: ta.Optional[float] = None
|
@@ -46,7 +57,7 @@ class StandardSocketServerHandler:
|
|
46
57
|
|
47
58
|
|
48
59
|
@dc.dataclass(frozen=True)
|
49
|
-
class CallbackWrappedSocketServerHandler:
|
60
|
+
class CallbackWrappedSocketServerHandler(SocketServerHandler_):
|
50
61
|
handler: SocketServerHandler
|
51
62
|
|
52
63
|
before_handle: ta.Optional[SocketServerHandler] = None
|
@@ -83,7 +94,7 @@ class CallbackWrappedSocketServerHandler:
|
|
83
94
|
|
84
95
|
|
85
96
|
@dc.dataclass(frozen=True)
|
86
|
-
class SocketHandlerSocketServerHandler:
|
97
|
+
class SocketHandlerSocketServerHandler(SocketServerHandler_):
|
87
98
|
handler: SocketHandler
|
88
99
|
|
89
100
|
r_buf_size: int = -1
|
@@ -97,3 +108,27 @@ class SocketHandlerSocketServerHandler:
|
|
97
108
|
)
|
98
109
|
|
99
110
|
self.handler(conn.address, fp)
|
111
|
+
|
112
|
+
|
113
|
+
#
|
114
|
+
|
115
|
+
|
116
|
+
@dc.dataclass(frozen=True)
|
117
|
+
class SocketWrappingSocketServerHandler(SocketServerHandler_):
|
118
|
+
handler: SocketServerHandler
|
119
|
+
wrapper: ta.Callable[[SocketAndAddress], SocketAndAddress]
|
120
|
+
|
121
|
+
def __call__(self, conn: SocketAndAddress) -> None:
|
122
|
+
wrapped_conn = self.wrapper(conn)
|
123
|
+
self.handler(wrapped_conn)
|
124
|
+
|
125
|
+
|
126
|
+
#
|
127
|
+
|
128
|
+
@dc.dataclass(frozen=True)
|
129
|
+
class ExecutorSocketServerHandler(SocketServerHandler_):
|
130
|
+
handler: SocketServerHandler
|
131
|
+
executor: cf.Executor
|
132
|
+
|
133
|
+
def __call__(self, conn: SocketAndAddress) -> None:
|
134
|
+
self.executor.submit(self.handler, conn)
|
omlish/sockets/server/server.py
CHANGED
@@ -2,11 +2,14 @@
|
|
2
2
|
# ruff: noqa: UP006 UP007
|
3
3
|
import abc
|
4
4
|
import contextlib
|
5
|
+
import logging
|
5
6
|
import selectors
|
6
7
|
import threading
|
7
8
|
import typing as ta
|
8
9
|
|
10
|
+
from ..addresses import SocketAndAddress
|
9
11
|
from ..bind import SocketBinder
|
12
|
+
from ..io import close_socket_immediately
|
10
13
|
from .handlers import SocketServerHandler
|
11
14
|
|
12
15
|
|
@@ -14,12 +17,15 @@ from .handlers import SocketServerHandler
|
|
14
17
|
|
15
18
|
|
16
19
|
class SocketServer(abc.ABC):
|
20
|
+
_DEFAULT_LOGGER = logging.getLogger('.'.join([__name__, 'SocketServer']))
|
21
|
+
|
17
22
|
def __init__(
|
18
23
|
self,
|
19
24
|
binder: SocketBinder,
|
20
25
|
handler: SocketServerHandler,
|
21
26
|
*,
|
22
|
-
on_error: ta.Optional[ta.Callable[[BaseException], None]] = None,
|
27
|
+
on_error: ta.Optional[ta.Callable[[BaseException, ta.Optional[SocketAndAddress]], None]] = None,
|
28
|
+
error_logger: ta.Optional[logging.Logger] = _DEFAULT_LOGGER,
|
23
29
|
poll_interval: float = .5,
|
24
30
|
shutdown_timeout: ta.Optional[float] = None,
|
25
31
|
) -> None:
|
@@ -28,6 +34,7 @@ class SocketServer(abc.ABC):
|
|
28
34
|
self._binder = binder
|
29
35
|
self._handler = handler
|
30
36
|
self._on_error = on_error
|
37
|
+
self._error_logger = error_logger
|
31
38
|
self._poll_interval = poll_interval
|
32
39
|
self._shutdown_timeout = shutdown_timeout
|
33
40
|
|
@@ -45,6 +52,15 @@ class SocketServer(abc.ABC):
|
|
45
52
|
|
46
53
|
#
|
47
54
|
|
55
|
+
def _handle_error(self, exc: BaseException, conn: ta.Optional[SocketAndAddress] = None) -> None:
|
56
|
+
if (error_logger := self._error_logger) is not None:
|
57
|
+
error_logger.exception('Error in socket server: %r', conn)
|
58
|
+
|
59
|
+
if (on_error := self._on_error) is not None:
|
60
|
+
on_error(exc, conn)
|
61
|
+
|
62
|
+
#
|
63
|
+
|
48
64
|
class SelectorProtocol(ta.Protocol):
|
49
65
|
def register(self, *args, **kwargs) -> None:
|
50
66
|
raise NotImplementedError
|
@@ -99,12 +115,17 @@ class SocketServer(abc.ABC):
|
|
99
115
|
conn = self._binder.accept()
|
100
116
|
|
101
117
|
except OSError as exc:
|
102
|
-
|
103
|
-
on_error(exc)
|
118
|
+
self._handle_error(exc)
|
104
119
|
|
105
120
|
return
|
106
121
|
|
107
|
-
|
122
|
+
try:
|
123
|
+
self._handler(conn)
|
124
|
+
|
125
|
+
except Exception as exc: # noqa
|
126
|
+
self._handle_error(exc, conn)
|
127
|
+
|
128
|
+
close_socket_immediately(conn.socket)
|
108
129
|
|
109
130
|
yield bool(ready)
|
110
131
|
|
omlish/sql/alchemy/secrets.py
CHANGED
omlish/sql/dbs.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: omlish
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev220
|
4
4
|
Summary: omlish
|
5
5
|
Author: wrmsr
|
6
6
|
License: BSD-3-Clause
|
@@ -18,7 +18,7 @@ Requires-Dist: sniffio~=1.3; extra == "all"
|
|
18
18
|
Requires-Dist: greenlet~=3.1; extra == "all"
|
19
19
|
Requires-Dist: trio~=0.27; extra == "all"
|
20
20
|
Requires-Dist: trio-asyncio~=0.15; extra == "all"
|
21
|
-
Requires-Dist: lz4~=4.
|
21
|
+
Requires-Dist: lz4~=4.4; extra == "all"
|
22
22
|
Requires-Dist: python-snappy~=0.7; extra == "all"
|
23
23
|
Requires-Dist: zstandard~=0.23; extra == "all"
|
24
24
|
Requires-Dist: brotli~=1.1; extra == "all"
|
@@ -57,7 +57,7 @@ Requires-Dist: greenlet~=3.1; extra == "async"
|
|
57
57
|
Requires-Dist: trio~=0.27; extra == "async"
|
58
58
|
Requires-Dist: trio-asyncio~=0.15; extra == "async"
|
59
59
|
Provides-Extra: compress
|
60
|
-
Requires-Dist: lz4~=4.
|
60
|
+
Requires-Dist: lz4~=4.4; extra == "compress"
|
61
61
|
Requires-Dist: python-snappy~=0.7; extra == "compress"
|
62
62
|
Requires-Dist: zstandard~=0.23; extra == "compress"
|
63
63
|
Requires-Dist: brotli~=1.1; extra == "compress"
|
@@ -1,5 +1,5 @@
|
|
1
1
|
omlish/.manifests.json,sha256=YGmAnUBszmosQQ_7Hh2wwtDiYdYZ4unNKYzOtALuels,7968
|
2
|
-
omlish/__about__.py,sha256=
|
2
|
+
omlish/__about__.py,sha256=4MxdtmyseRyrqsGb-8ZzKRlrqSzhp5cQ5hkCmiaDCZc,3380
|
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
|
@@ -15,7 +15,7 @@ omlish/subprocesses.py,sha256=c7arxsQ7JiaNCmK3GKqwRO6BwrvxeK7eez8A4SrvGBo,10199
|
|
15
15
|
omlish/sync.py,sha256=QJ79kxmIqDP9SeHDoZAf--DpFIhDQe1jACy8H4N0yZI,2928
|
16
16
|
omlish/antlr/__init__.py,sha256=88bMl_28cfSKslgOkMGYXqALgsHz3KC4LFvAVtzj7k8,89
|
17
17
|
omlish/antlr/delimit.py,sha256=3Byvh9_Ip8ftM_SeSEmMbnNo1jrxk-xm8HnHDp_nDaI,3466
|
18
|
-
omlish/antlr/dot.py,sha256=
|
18
|
+
omlish/antlr/dot.py,sha256=W9cgprtAZH6EjUkzWfSbx2XUUYRYLLxFofGWrUp-368,956
|
19
19
|
omlish/antlr/errors.py,sha256=foYz2109WReT1C7qZsIrb4zCAkZg4vM_UiDOAPC0AqQ,308
|
20
20
|
omlish/antlr/input.py,sha256=baeO279AIxR50pymya0eabtnc2A0bSdA5u7jvIGebzA,2090
|
21
21
|
omlish/antlr/parsing.py,sha256=kXxeGb5luiwhSyIcXO2mLLME7IJLF6-0XMuS4UcDbcw,1414
|
@@ -169,30 +169,31 @@ omlish/configs/processing/matching.py,sha256=R64RxpPB1uX5Ztvvk2dQ2xi_xwlaxkxQgZw
|
|
169
169
|
omlish/configs/processing/names.py,sha256=weHmaTclzgM9lUn3aBtw-kwZ3mc2N-CZlFg3Kd_UsKo,1093
|
170
170
|
omlish/configs/processing/rewriting.py,sha256=v7PfHtuTn5v_5Y6Au7oMN2Z0nxAMy1iYyO5CXnTvZhs,4226
|
171
171
|
omlish/configs/processing/strings.py,sha256=qFS2oh6z02IaM_q4lTKLdufzkJqAJ6J-Qjrz5S-QJoM,826
|
172
|
-
omlish/dataclasses/__init__.py,sha256=
|
172
|
+
omlish/dataclasses/__init__.py,sha256=D7I6ZJjEFeLN2re8oOZ_7JKWiG2plrPnaUFq3iEXYmQ,1553
|
173
173
|
omlish/dataclasses/utils.py,sha256=N2seT8cJtfOv-41D7F3E-q4us-FCTQmnxxPv3dt1OcI,3796
|
174
174
|
omlish/dataclasses/impl/LICENSE,sha256=Oy-B_iHRgcSZxZolbI4ZaEVdZonSaaqFNzv7avQdo78,13936
|
175
175
|
omlish/dataclasses/impl/__init__.py,sha256=zqGBC5gSbjJxaqG_zS1LL1PX-zAfhIua8UqOE4IwO2k,789
|
176
|
-
omlish/dataclasses/impl/api.py,sha256=
|
176
|
+
omlish/dataclasses/impl/api.py,sha256=RhU4f50GVdn-dxilia8NA3F7VIm2R5z78pFfpIVXPRQ,6635
|
177
177
|
omlish/dataclasses/impl/as_.py,sha256=CD-t7hkC1EP2F_jvZKIA_cVoDuwZ-Ln_xC4fJumPYX0,2598
|
178
178
|
omlish/dataclasses/impl/copy.py,sha256=Tn8_n6Vohs-w4otbGdubBEvhd3TsSTaM3EfNGdS2LYo,591
|
179
179
|
omlish/dataclasses/impl/descriptors.py,sha256=rEYE1Len99agTQCC25hSPMnM19BgPr0ZChABGi58Fdk,2476
|
180
180
|
omlish/dataclasses/impl/exceptions.py,sha256=-vqxZmfXVflymVuiM553XTlJProse5HEMktTpfdPCIY,1275
|
181
|
-
omlish/dataclasses/impl/fields.py,sha256=
|
181
|
+
omlish/dataclasses/impl/fields.py,sha256=8p7Uzvr0C4yBR0NqHzkq--OY2HXFQlGsb1HC3K17-7k,6985
|
182
182
|
omlish/dataclasses/impl/frozen.py,sha256=x87DSM8FIMZ3c_BIUE8NooCkExFjPsabeqIueEP5qKs,2988
|
183
183
|
omlish/dataclasses/impl/hashing.py,sha256=0Gr6XIRkKy4pr-mdHblIlQCy3mBxycjMqJk3oZDw43s,3215
|
184
|
-
omlish/dataclasses/impl/init.py,sha256=
|
184
|
+
omlish/dataclasses/impl/init.py,sha256=drt_-697uw2xp0FGj9AYlMbiuSfYRNV3-8JxTPzkP_w,6415
|
185
185
|
omlish/dataclasses/impl/internals.py,sha256=UvZYjrLT1S8ntyxJ_vRPIkPOF00K8HatGAygErgoXTU,2990
|
186
|
-
omlish/dataclasses/impl/main.py,sha256=
|
187
|
-
omlish/dataclasses/impl/metaclass.py,sha256=
|
186
|
+
omlish/dataclasses/impl/main.py,sha256=LyWr8IBfoL-bBfweR4OqJgi842REDw20WRYcGSYNfMg,2577
|
187
|
+
omlish/dataclasses/impl/metaclass.py,sha256=dOtNkMqAP_QyZUX0rUwY2c-bkFsTHWo6DhnuW6s1dXc,5103
|
188
188
|
omlish/dataclasses/impl/metadata.py,sha256=4veWwTr-aA0KP-Y1cPEeOcXHup9EKJTYNJ0ozIxtzD4,1401
|
189
189
|
omlish/dataclasses/impl/order.py,sha256=zWvWDkSTym8cc7vO1cLHqcBhhjOlucHOCUVJcdh4jt0,1369
|
190
|
-
omlish/dataclasses/impl/
|
190
|
+
omlish/dataclasses/impl/overrides.py,sha256=g9aCzaDDKyek8-yXRvtAcu1B1nCphWDYr4InHDlgbKk,1732
|
191
|
+
omlish/dataclasses/impl/params.py,sha256=9EHn7PxqPVtRPcNDNDCsbcmxvkezWR5LzLLxCua2Vok,2946
|
191
192
|
omlish/dataclasses/impl/processing.py,sha256=DFxyFjL_h3awRyF_5eyTnB8QkuApx7Zc4QFnVoltlao,459
|
192
|
-
omlish/dataclasses/impl/reflect.py,sha256
|
193
|
+
omlish/dataclasses/impl/reflect.py,sha256=1PTxx3ycsWhC3oAV71mW-ZquDRwa2-t9uIaKFO8ab8U,5468
|
193
194
|
omlish/dataclasses/impl/replace.py,sha256=wS9GHX4fIwaPv1JBJzIewdBfXyK3X3V7_t55Da87dYo,1217
|
194
195
|
omlish/dataclasses/impl/repr.py,sha256=oLXBTxqp88NKmz82HrJeGiTEiwK4l5LlXQT9Q0-tX3c,1605
|
195
|
-
omlish/dataclasses/impl/simple.py,sha256=
|
196
|
+
omlish/dataclasses/impl/simple.py,sha256=tr1WkNuUZ3upyrLBea6RV5Jb_2YsBxisSrGPN_XIlK8,1771
|
196
197
|
omlish/dataclasses/impl/slots.py,sha256=qXRLbtFWUs_2UV1fFUdv53_6fBLKJ_8McjNiP9YQlGM,5264
|
197
198
|
omlish/dataclasses/impl/utils.py,sha256=aER2iL3UAtgS1BdLuEvTr9Tr2wC28wk1kiOeO-jIymw,6138
|
198
199
|
omlish/diag/__init__.py,sha256=4S8v0myJM4Zld6_FV6cPe_nSv0aJb6kXftEit0HkiGE,1141
|
@@ -301,19 +302,20 @@ omlish/http/consts.py,sha256=7BJ4D1MdIvqBcepkgCfBFHolgTwbOlqsOEiee_IjxOA,2289
|
|
301
302
|
omlish/http/cookies.py,sha256=uuOYlHR6e2SC3GM41V0aozK10nef9tYg83Scqpn5-HM,6351
|
302
303
|
omlish/http/dates.py,sha256=Otgp8wRxPgNGyzx8LFowu1vC4EKJYARCiAwLFncpfHM,2875
|
303
304
|
omlish/http/encodings.py,sha256=w2WoKajpaZnQH8j-IBvk5ZFL2O2pAU_iBvZnkocaTlw,164
|
304
|
-
omlish/http/handlers.py,sha256=
|
305
|
+
omlish/http/handlers.py,sha256=Tv_ApQ0AM_Sls6VDtYn2Wejy6GGEKAsw7X6DM1rcs0M,1461
|
305
306
|
omlish/http/headers.py,sha256=ZMmjrEiYjzo0YTGyK0YsvjdwUazktGqzVVYorY4fd44,5081
|
306
307
|
omlish/http/json.py,sha256=9XwAsl4966Mxrv-1ytyCqhcE6lbBJw-0_tFZzGszgHE,7440
|
307
308
|
omlish/http/jwt.py,sha256=6Rigk1WrJ059DY4jDIKnxjnChWb7aFdermj2AI2DSvk,4346
|
308
309
|
omlish/http/multipart.py,sha256=R9ycpHsXRcmh0uoc43aYb7BdWL-8kSQHe7J-M81aQZM,2240
|
309
310
|
omlish/http/parsing.py,sha256=hxfd9nYaAAjYIivkTClFZXMRmiiCnxzeeEIGXw7-gt0,13992
|
310
|
-
omlish/http/sessions.py,sha256=
|
311
|
+
omlish/http/sessions.py,sha256=TfTJ_j-6c9PelG_RmijEwozfaVm3O7YzgtFvp8VzQqM,4799
|
312
|
+
omlish/http/simple.py,sha256=9WtpbQahiZE-UjRP3ZDni8DQTq_HkVSdwpui_y8mf1I,2867
|
311
313
|
omlish/http/sse.py,sha256=MDs9RvxQXoQliImcc6qK1ERajEYM7Q1l8xmr-9ceNBc,2315
|
312
314
|
omlish/http/versions.py,sha256=wSiOXPiClVjkVgSU_VmxkoD1SUYGaoPbP0U5Aw-Ufg8,409
|
313
315
|
omlish/http/wsgi.py,sha256=czZsVUX-l2YTlMrUjKN49wRoP4rVpS0qpeBn4O5BoMY,948
|
314
316
|
omlish/http/coro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
315
317
|
omlish/http/coro/fdio.py,sha256=ajj_lekRockGwQEw8m_mi6RO9-o6hnC9ITiwtZe3y-s,4017
|
316
|
-
omlish/http/coro/server.py,sha256=
|
318
|
+
omlish/http/coro/server.py,sha256=TgqBTOpniZMqRPoSP3xrAaD-TLSoPsknVr7D22-2zgo,19432
|
317
319
|
omlish/inject/__init__.py,sha256=n0RC9UDGsBQQ39cST39-XJqJPq2M0tnnh9yJubW9azo,1891
|
318
320
|
omlish/inject/binder.py,sha256=DAbc8TZi5w8Mna0TUtq0mT4jeDVA7i7SlBtOFrh2swc,4185
|
319
321
|
omlish/inject/bindings.py,sha256=pLXn2U3kvmAS-68IOG-tr77DbiI-wp9hGyy4lhG6_H8,525
|
@@ -347,6 +349,7 @@ omlish/inject/impl/scopes.py,sha256=hKnzNieB-fJSFEXDP_QG1mCfIKoVFIfFlf9LiIt5tk4,
|
|
347
349
|
omlish/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
348
350
|
omlish/io/abc.py,sha256=M40QB2udYpCEqmlxCcHv6FlJYJY6ymmJQBlaklYv0U8,1256
|
349
351
|
omlish/io/buffers.py,sha256=qo1hCqTfKvlbSmddneporqCtW0rZJ_Mv2GrQTI1Hbk0,5636
|
352
|
+
omlish/io/fileno.py,sha256=QiVuRfqJRqP1aoLS82AVHOo_rt0lijZHfM21s42uaTo,174
|
350
353
|
omlish/io/pyio.py,sha256=q4RBFVpBE5PYjnGPGT-_4pcZb7dFJmLJ4LtI8OoDRQY,95433
|
351
354
|
omlish/io/trampoline.py,sha256=oUKTQg1F5xQS1431Kt7MbK-NZpX509ubcXU-s86xJr8,7171
|
352
355
|
omlish/io/compress/__init__.py,sha256=fJFPT4ONfqxmsA4jR6qbMt2woIyyEgnc_qOWK9o1kII,247
|
@@ -377,31 +380,31 @@ omlish/iterators/iterators.py,sha256=ghI4dO6WPyyFOLTIIMaHQ_IOy2xXaFpGPqveZ5YGIBU
|
|
377
380
|
omlish/iterators/recipes.py,sha256=53mkexitMhkwXQZbL6DrhpT0WePQ_56uXd5Jaw3DfzI,467
|
378
381
|
omlish/iterators/tools.py,sha256=Pi4ybXytUXVZ3xwK89xpPImQfYYId9p1vIFQvVqVLqA,2551
|
379
382
|
omlish/iterators/unique.py,sha256=0jAX3kwzVfRNhe0Tmh7kVP_Q2WBIn8POo_O-rgFV0rQ,1390
|
380
|
-
omlish/lang/__init__.py,sha256=
|
381
|
-
omlish/lang/cached.py,sha256=
|
382
|
-
omlish/lang/clsdct.py,sha256=
|
383
|
+
omlish/lang/__init__.py,sha256=Jh-Zj9PTDcUTi-OokA8cCqtVTZtJtkOKjUOobE2iqRc,4117
|
384
|
+
omlish/lang/cached.py,sha256=tQaqMu1LID0q4NSTk5vPXsgxIBWSFAmjs5AhQoEHoCQ,7833
|
385
|
+
omlish/lang/clsdct.py,sha256=sJYadm-fwzti-gsi98knR5qQUxriBmOqQE_qz3RopNk,1743
|
383
386
|
omlish/lang/cmp.py,sha256=5vbzWWbqdzDmNKAGL19z6ZfUKe5Ci49e-Oegf9f4BsE,1346
|
384
|
-
omlish/lang/contextmanagers.py,sha256=
|
387
|
+
omlish/lang/contextmanagers.py,sha256=V-XRwj1Em17Pr92i9mSYeeElQs9pmfM_B4jTF732qIg,10400
|
385
388
|
omlish/lang/datetimes.py,sha256=ehI_DhQRM-bDxAavnp470XcekbbXc4Gdw9y1KpHDJT0,223
|
386
|
-
omlish/lang/descriptors.py,sha256=
|
389
|
+
omlish/lang/descriptors.py,sha256=njkYDS1gn5p4-3v1jr-s_srauC7tvvt571RjE7Q4LXE,6616
|
387
390
|
omlish/lang/exceptions.py,sha256=qJBo3NU1mOWWm-NhQUHCY5feYXR3arZVyEHinLsmRH4,47
|
388
391
|
omlish/lang/functions.py,sha256=t9nsnWwhsibG0w908VMx-_pRM5tZfruE3faPxrCWTbI,4160
|
389
392
|
omlish/lang/generators.py,sha256=5LX17j-Ej3QXhwBgZvRTm_dq3n9veC4IOUcVmvSu2vU,5243
|
390
393
|
omlish/lang/imports.py,sha256=oGigWiLkLog29mWWYdu7untyX--K1SueFmKzCpXdtug,9612
|
391
394
|
omlish/lang/iterables.py,sha256=HOjcxOwyI5bBApDLsxRAGGhTTmw7fdZl2kEckxRVl-0,1994
|
392
|
-
omlish/lang/maybes.py,sha256=
|
393
|
-
omlish/lang/objects.py,sha256=
|
395
|
+
omlish/lang/maybes.py,sha256=dAgrUoAhCgyrHRqa73CkaGnpXwGc-o9n-NIThrNXnbU,3416
|
396
|
+
omlish/lang/objects.py,sha256=65XsD7UtblRdNe2ID1-brn_QvRkJhBIk5nyZWcQNeqU,4574
|
394
397
|
omlish/lang/resolving.py,sha256=OuN2mDTPNyBUbcrswtvFKtj4xgH4H4WglgqSKv3MTy0,1606
|
395
398
|
omlish/lang/resources.py,sha256=N64KeVE-rYMxqBBRp91qzgVqpOVR2uX7k1WlS_bo5hM,2681
|
396
399
|
omlish/lang/strings.py,sha256=egdv8PxLNG40-5V93agP5j2rBUDIsahCx048zV7uEbU,4690
|
397
400
|
omlish/lang/sys.py,sha256=UoZz_PJYVKLQAKqYxxn-LHz1okK_38I__maZgnXMcxU,406
|
398
401
|
omlish/lang/timeouts.py,sha256=vECdWYhc_IZgcal1Ng1Y42wf2FV3KAx-i8As-MgGHIQ,1186
|
399
402
|
omlish/lang/typing.py,sha256=Zdad9Zv0sa-hIaUXPrzPidT7sDVpRcussAI7D-j-I1c,3296
|
400
|
-
omlish/lang/classes/__init__.py,sha256=
|
401
|
-
omlish/lang/classes/abstract.py,sha256=
|
402
|
-
omlish/lang/classes/restrict.py,sha256=
|
403
|
+
omlish/lang/classes/__init__.py,sha256=HY9UD3Tg8_sH59emZUKgP1Kb8-8r0GCw5hUOumxwKlM,658
|
404
|
+
omlish/lang/classes/abstract.py,sha256=bIcuAetV_aChhpSURypmjjcqP07xi20uVYPKh1kvQNU,3710
|
405
|
+
omlish/lang/classes/restrict.py,sha256=QvM-GqXvO8vpCONkcr0QpgVPfzZmgDo7o8d9kUwOzlo,3941
|
403
406
|
omlish/lang/classes/simple.py,sha256=XQ8b86WvQA0qtSYqlbMOJS7tHgE8sv9onda33uQmbkM,3294
|
404
|
-
omlish/lang/classes/virtual.py,sha256=
|
407
|
+
omlish/lang/classes/virtual.py,sha256=z0MYQD9Q5MkX8DzF325wDB4J9XoYbsB09jZ1omC62To,3366
|
405
408
|
omlish/lifecycles/__init__.py,sha256=1FjYceXs-4fc-S-C9zFYmc2axHs4znnQHcJVHdY7a6E,578
|
406
409
|
omlish/lifecycles/abstract.py,sha256=70CQyZy-c9a2o0ZJxPeUT7eYjWZTBrp2HpUBnrHdAOM,1109
|
407
410
|
omlish/lifecycles/base.py,sha256=ceXrNSzuv7iiTlX96UI1fvsQ70OgOmZl-UisDPyA3NA,1394
|
@@ -500,22 +503,25 @@ omlish/reflect/inspect.py,sha256=veJ424-9oZrqyvhVpvxOi7hcKW-PDBkdYL2yjrFlk4o,495
|
|
500
503
|
omlish/reflect/ops.py,sha256=RJ6jzrM4ieFsXzWyNXWV43O_WgzEaUvlHSc5N2ezW2A,2044
|
501
504
|
omlish/reflect/subst.py,sha256=g3q7NmNWsmc67mcchmCE3WFPCMDSBq-FXn4ah-DWL_U,3622
|
502
505
|
omlish/reflect/types.py,sha256=lYxK_hlC4kVDMKeDYJp0mymSth21quwuFAMAEFBznyE,9151
|
503
|
-
omlish/secrets/__init__.py,sha256=
|
506
|
+
omlish/secrets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
507
|
+
omlish/secrets/all.py,sha256=zRp3bYkcVG4Aez4hBHKBxc07s6u74IrGQVUB8cfrGxY,281
|
504
508
|
omlish/secrets/crypto.py,sha256=6CsLy0UEqCrBK8Xx_3-iFF6SKtu2GlEqUQ8-MliY3tk,3709
|
505
509
|
omlish/secrets/marshal.py,sha256=U9uSRTWzZmumfNZeh_dROwVdGrARsp155TylRbjilP8,2048
|
506
510
|
omlish/secrets/openssl.py,sha256=wxA_wIlxtuOUy71ABxAJgavh-UI_taOfm-A0dVlmSwM,6219
|
507
511
|
omlish/secrets/pwgen.py,sha256=v-5ztnOTHTAWXLGR-3H6HkMj2nPIZBMbo5xWR3q0rDY,1707
|
508
512
|
omlish/secrets/pwhash.py,sha256=Goktn-swmC6PXqfRBnDrH_Lr42vjckT712UyErPjzkw,4102
|
509
|
-
omlish/secrets/secrets.py,sha256=
|
513
|
+
omlish/secrets/secrets.py,sha256=QNgOmRcIRK2fx49bIbBBM2rYbe6IhhLgk8fKvq8guoI,7963
|
514
|
+
omlish/secrets/ssl.py,sha256=TvO1BJeCCBPsOLjO-QH7Q0DC-NS8onfmRxbl4ntOnd8,147
|
510
515
|
omlish/secrets/subprocesses.py,sha256=ffjfbgPbEE_Pwb_87vG4yYR2CGZy3I31mHNCo_0JtHw,1212
|
516
|
+
omlish/secrets/tempssl.py,sha256=8yFLb3Q19zVtciFZL7LEeK1LIXaYxvtSaxZX2L13Xx8,1048
|
511
517
|
omlish/sockets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
512
|
-
omlish/sockets/addresses.py,sha256=
|
513
|
-
omlish/sockets/bind.py,sha256=
|
514
|
-
omlish/sockets/handlers.py,sha256=
|
518
|
+
omlish/sockets/addresses.py,sha256=vbVeQBkzI513H4vRv-JS89QtRbr9U8v5zqkm3oODl_s,1869
|
519
|
+
omlish/sockets/bind.py,sha256=TnG5nm0pnuMxRA02TG2W40RbutrPA6tkOJtbZvBjDWU,8063
|
520
|
+
omlish/sockets/handlers.py,sha256=ux2cPzAWV8b-mQ0K08-b7qjVeIT8Js5_-tyVZs0fbwg,406
|
515
521
|
omlish/sockets/io.py,sha256=lfhTkB7NnAIx9kuQhAkwgsEUXY78Mp1_WtYrIQNS_k8,1408
|
516
522
|
omlish/sockets/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
517
|
-
omlish/sockets/server/handlers.py,sha256
|
518
|
-
omlish/sockets/server/server.py,sha256=
|
523
|
+
omlish/sockets/server/handlers.py,sha256=-5lH2Xg7gnZiPB4t2Asa_Vgblj1ZkHzLvyiC_K4XlNc,3295
|
524
|
+
omlish/sockets/server/server.py,sha256=mZmHPkCRPitous56_7FJdAsDLZag2wDqjj-LaYM8_Fg,4943
|
519
525
|
omlish/sockets/server/threading.py,sha256=YmW3Ym_p5j_F4SIH9BgRHIObywjq1HS39j9CGWIcMAY,2856
|
520
526
|
omlish/specs/__init__.py,sha256=zZwF8yXTEkSstYtORkDhVLK-_hWU8WOJCuBpognb_NY,118
|
521
527
|
omlish/specs/jmespath/LICENSE,sha256=IH-ZZlZkS8XMkf_ubNVD1aYHQ2l_wd0tmHtXrCcYpRU,1113
|
@@ -561,14 +567,14 @@ omlish/specs/openapi/openapi.py,sha256=y4h04jeB7ORJSVrcy7apaBdpwLjIyscv1Ub5SderH
|
|
561
567
|
omlish/sql/__init__.py,sha256=TpZLsEJKJzvJ0eMzuV8hwOJJbkxBCV1RZPUMLAVB6io,173
|
562
568
|
omlish/sql/abc.py,sha256=NfbcIlEvdEu6vn0TolhfYb2SO5uzUmY0kARCbg6uVAU,1879
|
563
569
|
omlish/sql/dbapi.py,sha256=5ghJH-HexsmDlYdWlhf00nCGQX2IC98_gxIxMkucOas,3195
|
564
|
-
omlish/sql/dbs.py,sha256=
|
570
|
+
omlish/sql/dbs.py,sha256=65e388987upJpsFX8bNL7uhiYv2sCsmk9Y04V0MXdsI,1873
|
565
571
|
omlish/sql/params.py,sha256=Z4VPet6GhNqD1T_MXSWSHkdy3cpUEhST-OplC4B_fYI,4433
|
566
572
|
omlish/sql/qualifiedname.py,sha256=rlW3gVmyucJbqwcxj_7BfK4X2HoXrMroZT2H45zPgJQ,2264
|
567
573
|
omlish/sql/alchemy/__init__.py,sha256=1ruDMiviH5fjevn2xVki-QspcE9O3VPy4hxOqpHjI2s,224
|
568
574
|
omlish/sql/alchemy/asyncs.py,sha256=MwZwWIaZsUCQLcTA8mdHUPZmR-pXEVSAsvd15FCm3W4,3692
|
569
575
|
omlish/sql/alchemy/duckdb.py,sha256=kr7pIhiBLNAuZrcigHDtFg9zHkVcrRW3LfryO9VJ4mk,3749
|
570
576
|
omlish/sql/alchemy/exprs.py,sha256=gO4Fj4xEY-PuDgV-N8hBMy55glZz7O-4H7v1LWabfZY,323
|
571
|
-
omlish/sql/alchemy/secrets.py,sha256=
|
577
|
+
omlish/sql/alchemy/secrets.py,sha256=WEeaec1ejQcE3Yaa7p5BSP9AMGEzy1lwr7QMSRL0VBw,180
|
572
578
|
omlish/sql/alchemy/sqlean.py,sha256=RbkuOuFIfM4fowwKk8-sQ6Dxk-tTUwxS94nY5Kxt52s,403
|
573
579
|
omlish/sql/queries/__init__.py,sha256=8wdq6PBf5YzqQWFu-CE8om6BN38sDAD9UEz9VzkojzM,1337
|
574
580
|
omlish/sql/queries/base.py,sha256=_8O3MbH_OEjBnhp2oIJUZ3ClaQ8l4Sj9BdPdsP0Ie-g,224
|
@@ -637,9 +643,9 @@ omlish/text/indent.py,sha256=YjtJEBYWuk8--b9JU_T6q4yxV85_TR7VEVr5ViRCFwk,1336
|
|
637
643
|
omlish/text/minja.py,sha256=jZC-fp3Xuhx48ppqsf2Sf1pHbC0t8XBB7UpUUoOk2Qw,5751
|
638
644
|
omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
|
639
645
|
omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
|
640
|
-
omlish-0.0.0.
|
641
|
-
omlish-0.0.0.
|
642
|
-
omlish-0.0.0.
|
643
|
-
omlish-0.0.0.
|
644
|
-
omlish-0.0.0.
|
645
|
-
omlish-0.0.0.
|
646
|
+
omlish-0.0.0.dev220.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
647
|
+
omlish-0.0.0.dev220.dist-info/METADATA,sha256=ipY89eJtdtOxzaJVqRlOxyjn-VVMv0fWU7P7qXeJo1Q,4176
|
648
|
+
omlish-0.0.0.dev220.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
649
|
+
omlish-0.0.0.dev220.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
|
650
|
+
omlish-0.0.0.dev220.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
|
651
|
+
omlish-0.0.0.dev220.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|