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.
Files changed (46) hide show
  1. omlish/__about__.py +3 -3
  2. omlish/antlr/dot.py +13 -6
  3. omlish/dataclasses/__init__.py +1 -0
  4. omlish/dataclasses/impl/api.py +10 -0
  5. omlish/dataclasses/impl/fields.py +8 -1
  6. omlish/dataclasses/impl/init.py +1 -1
  7. omlish/dataclasses/impl/main.py +1 -1
  8. omlish/dataclasses/impl/metaclass.py +112 -29
  9. omlish/dataclasses/impl/overrides.py +53 -0
  10. omlish/dataclasses/impl/params.py +3 -0
  11. omlish/dataclasses/impl/reflect.py +17 -5
  12. omlish/dataclasses/impl/simple.py +0 -42
  13. omlish/http/coro/server.py +60 -40
  14. omlish/http/handlers.py +15 -0
  15. omlish/http/sessions.py +1 -1
  16. omlish/http/simple.py +101 -0
  17. omlish/io/fileno.py +11 -0
  18. omlish/lang/__init__.py +4 -1
  19. omlish/lang/cached.py +0 -1
  20. omlish/lang/classes/__init__.py +3 -1
  21. omlish/lang/classes/abstract.py +14 -1
  22. omlish/lang/classes/restrict.py +5 -5
  23. omlish/lang/classes/virtual.py +0 -1
  24. omlish/lang/clsdct.py +0 -1
  25. omlish/lang/contextmanagers.py +0 -8
  26. omlish/lang/descriptors.py +0 -1
  27. omlish/lang/maybes.py +0 -1
  28. omlish/lang/objects.py +0 -2
  29. omlish/secrets/__init__.py +0 -24
  30. omlish/secrets/all.py +16 -0
  31. omlish/secrets/secrets.py +6 -0
  32. omlish/secrets/ssl.py +9 -0
  33. omlish/secrets/tempssl.py +50 -0
  34. omlish/sockets/addresses.py +22 -10
  35. omlish/sockets/bind.py +26 -20
  36. omlish/sockets/handlers.py +7 -0
  37. omlish/sockets/server/handlers.py +39 -4
  38. omlish/sockets/server/server.py +25 -4
  39. omlish/sql/alchemy/secrets.py +1 -1
  40. omlish/sql/dbs.py +1 -1
  41. {omlish-0.0.0.dev218.dist-info → omlish-0.0.0.dev220.dist-info}/METADATA +3 -3
  42. {omlish-0.0.0.dev218.dist-info → omlish-0.0.0.dev220.dist-info}/RECORD +46 -40
  43. {omlish-0.0.0.dev218.dist-info → omlish-0.0.0.dev220.dist-info}/LICENSE +0 -0
  44. {omlish-0.0.0.dev218.dist-info → omlish-0.0.0.dev220.dist-info}/WHEEL +0 -0
  45. {omlish-0.0.0.dev218.dist-info → omlish-0.0.0.dev220.dist-info}/entry_points.txt +0 -0
  46. {omlish-0.0.0.dev218.dist-info → omlish-0.0.0.dev220.dist-info}/top_level.txt +0 -0
@@ -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: socket.AddressFamily = socket.AddressFamily.AF_UNSPEC
22
+ family: socket_.AddressFamily = socket_.AddressFamily.AF_UNSPEC
23
23
  type: int = 0
24
24
  proto: int = 0
25
- flags: socket.AddressInfo = socket.AddressInfo(0)
25
+ flags: socket_.AddressInfo = socket_.AddressInfo(0)
26
26
 
27
27
 
28
28
  @dc.dataclass(frozen=True)
29
29
  class SocketAddressInfo:
30
- family: socket.AddressFamily
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: socket.AddressFamily
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, socket.AddressFamily] = socket.AddressFamily.AF_UNSPEC,
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 = socket.getaddrinfo(
49
+ infos = socket_.getaddrinfo(
50
50
  host,
51
51
  port,
52
52
  family,
53
- type=socket.SOCK_STREAM,
54
- flags=socket.AI_PASSIVE,
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: socket.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 new(
42
- cls,
43
- target: ta.Union[
44
- int,
45
- ta.Tuple[str, int],
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=target,
53
+ port=obj,
52
54
  )
53
55
 
54
- elif isinstance(target, tuple):
55
- host, port = target
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(target, str):
63
+ elif isinstance(obj, str):
62
64
  return UnixSocketBinder.Config(
63
- file=target,
65
+ file=obj,
64
66
  )
65
67
 
66
68
  else:
67
- raise TypeError(target)
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 new(cls, target: ta.Any) -> 'SocketBinder':
81
+ def of(cls, obj: CanSocketBinder) -> 'SocketBinder':
82
+ if isinstance(obj, SocketBinder):
83
+ return obj
84
+
80
85
  config: SocketBinder.Config
81
- if isinstance(target, SocketBinder.Config):
82
- config = target
86
+ if isinstance(obj, SocketBinder.Config):
87
+ config = obj
83
88
 
84
89
  else:
85
- config = SocketBinder.Config.new(target)
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.unlink(self._config.file)
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
 
@@ -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)
@@ -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
- if (on_error := self._on_error) is not None:
103
- on_error(exc)
118
+ self._handle_error(exc)
104
119
 
105
120
  return
106
121
 
107
- self._handler(conn)
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
 
@@ -2,7 +2,7 @@
2
2
  TODO:
3
3
  - sync/async...
4
4
  """
5
- from ... import secrets as sec
5
+ from ..secrets import all as sec
6
6
 
7
7
 
8
8
  class SqlFunctionSecrets(sec.Secrets):
omlish/sql/dbs.py CHANGED
@@ -3,7 +3,7 @@ import urllib.parse
3
3
 
4
4
  from .. import dataclasses as dc
5
5
  from .. import lang
6
- from .. import secrets as sec
6
+ from ..secrets import all as sec
7
7
 
8
8
 
9
9
  ##
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: omlish
3
- Version: 0.0.0.dev218
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.3; extra == "all"
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.3; extra == "compress"
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=0BtXUJi7KSCGQMkzet9GL1mr4dSvaRR9Jv-gAz1olhc,3380
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=uH2X7-8xNLYDQNJ30uW8ssv1MLkZSm07GsalcRuunYI,817
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=4LYQCg0kqBNwexcXvK6drjxdi79sMvqa4augNhCBHLU,1543
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=p7W519_EnDAWlkOVS-4BpP4SxadWIiUzC3RldSoB28o,6431
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=4_5qMz9LlOS6U67cDKQ-oorTtSGGxR77I4hw88soM44,6878
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=5kYcMDlI6EVeLQ6RCTk1bvYjb-cwg0AYfVE9FPZJlYI,6365
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=Ti0PKbFKraKvfmoPuR-G7nLVNzRC8mvEuXhCuC-M2kc,2574
187
- omlish/dataclasses/impl/metaclass.py,sha256=_iBp9HZvgokKKCbe8GlrcJ9HRrx3DufgzbxJHUy1Axg,3241
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/params.py,sha256=MWRL0IhulYP0dycWnK3j-0ej0uTgeE_jIlKFiE9MnI0,2836
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=-yEkg30fOHmMf5LQbzy6DFuDpQjuljsfV517_a74VAc,5365
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=EovA-GpmQYtB_svItO2byTAWqbKGF4njz0MdQts3QBU,3157
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=twe1VYYlIX0e_unFNtt5moU-VbtG29IuTu4RWS1vrn4,1052
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=WVRTy2KjehwQiYTPn7r44gZ4Pqg8sDC_9-wiYON0344,4796
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=IhdBv-Cx09FG6ADNXfysJV6v7i1gU7dCHLx9Bt_BieM,18799
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=sY7YSgN772n48qWlR-mwuOOCOwRF5Fh421gZqZWxYlw,4042
381
- omlish/lang/cached.py,sha256=92TvRZQ6sWlm7dNn4hgl7aWKbX0J1XUEo3DRjBpgVQk,7834
382
- omlish/lang/clsdct.py,sha256=AjtIWLlx2E6D5rC97zQ3Lwq2SOMkbg08pdO_AxpzEHI,1744
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=NEwaTLQMfhKawD5x_0HgI2RpeLXbMa5r9NqWqfDnUXI,10408
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=RRBbkMgTzg82fFFE4D0muqobpM-ZZaOta6yB1lpX3s8,6617
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=1RN7chX_x2XvgUwryZRz0W7hAX-be3eEFcFub5vvf6M,3417
393
- omlish/lang/objects.py,sha256=LOC3JvX1g5hPxJ7Sv2TK9kNkAo9c8J-Jw2NmClR_rkA,4576
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=D3dn4FOQu5f50kW4_jLCI_zI0fTtADdYumirRdIqSuU,605
401
- omlish/lang/classes/abstract.py,sha256=19jsUEJUSTkQkXnMvjGbokfq-Z4jXFOd_tT76jSu5I0,3362
402
- omlish/lang/classes/restrict.py,sha256=pSK7ZT_kpwqS6lWRrxwuEe-tt07F0-uZVazgGh-HDco,3921
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=W-QJuKsDehOcrydwg6eMN0bFPTYbk3Tz84TSH3blb44,3367
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=SGB1KrlNrxlNpazEHYy95NTzteLi8ndoEgMhU7luBl8,420
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=cnDGBoPknVxsCN04_gqcJT_7Ebk3iO3VPkRZ2oMjkMw,7868
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=QGK-5smlg5owx3PEw9qSfSHQ5mkAYumUpbaVR4qvcpM,1442
513
- omlish/sockets/bind.py,sha256=F5PATao0xUEoZ0unZbro2tPTECDtj1B6lS3ygEvIxUs,7750
514
- omlish/sockets/handlers.py,sha256=cVMKG3dn_tJlz6aM0WUL1uQ03F7VQmmKn9yJlOwKE6g,226
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=aoWZtDKPboHj3YAR-qHblnEGpz_Nx8mEajV_LxXUBRw,2440
518
- omlish/sockets/server/server.py,sha256=ZLYjW_MmHfMGQ2qSMRFMKLwqPqGCCSf4ORiZjQd59MA,4144
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=lpdFmm2vTwLoBiVYGj9yPsVcTEYYNCxlYZZpjfChzkY,1870
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=EMfy4EfTbEvrlv_41oOhn8qsoF-eTkY7HciPenIE6rI,178
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.dev218.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
641
- omlish-0.0.0.dev218.dist-info/METADATA,sha256=-vMqTXr2Q_gjsOk2hxSEXQXb9eWwZ4vVabWD7mQjgD8,4176
642
- omlish-0.0.0.dev218.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
643
- omlish-0.0.0.dev218.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
644
- omlish-0.0.0.dev218.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
645
- omlish-0.0.0.dev218.dist-info/RECORD,,
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,,