omlish 0.0.0.dev222__py3-none-any.whl → 0.0.0.dev224__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. omlish/__about__.py +4 -4
  2. omlish/asyncs/asyncio/subprocesses.py +15 -23
  3. omlish/dynamic.py +1 -1
  4. omlish/funcs/genmachine.py +1 -1
  5. omlish/http/coro/fdio.py +3 -3
  6. omlish/http/coro/server.py +1 -1
  7. omlish/http/handlers.py +65 -0
  8. omlish/http/parsing.py +13 -0
  9. omlish/lite/marshal.py +22 -6
  10. omlish/lite/timing.py +8 -0
  11. omlish/logs/timing.py +58 -0
  12. omlish/secrets/tempssl.py +43 -21
  13. omlish/specs/irc/messages/__init__.py +0 -0
  14. omlish/specs/irc/messages/base.py +49 -0
  15. omlish/specs/irc/messages/formats.py +92 -0
  16. omlish/specs/irc/messages/messages.py +774 -0
  17. omlish/specs/irc/messages/parsing.py +98 -0
  18. omlish/specs/irc/numerics/numerics.py +57 -0
  19. omlish/subprocesses.py +107 -0
  20. {omlish-0.0.0.dev222.dist-info → omlish-0.0.0.dev224.dist-info}/METADATA +5 -5
  21. {omlish-0.0.0.dev222.dist-info → omlish-0.0.0.dev224.dist-info}/RECORD +35 -28
  22. /omlish/specs/irc/{format → protocol}/LICENSE +0 -0
  23. /omlish/specs/irc/{format → protocol}/__init__.py +0 -0
  24. /omlish/specs/irc/{format → protocol}/consts.py +0 -0
  25. /omlish/specs/irc/{format → protocol}/errors.py +0 -0
  26. /omlish/specs/irc/{format → protocol}/message.py +0 -0
  27. /omlish/specs/irc/{format → protocol}/nuh.py +0 -0
  28. /omlish/specs/irc/{format → protocol}/parsing.py +0 -0
  29. /omlish/specs/irc/{format → protocol}/rendering.py +0 -0
  30. /omlish/specs/irc/{format → protocol}/tags.py +0 -0
  31. /omlish/specs/irc/{format → protocol}/utils.py +0 -0
  32. {omlish-0.0.0.dev222.dist-info → omlish-0.0.0.dev224.dist-info}/LICENSE +0 -0
  33. {omlish-0.0.0.dev222.dist-info → omlish-0.0.0.dev224.dist-info}/WHEEL +0 -0
  34. {omlish-0.0.0.dev222.dist-info → omlish-0.0.0.dev224.dist-info}/entry_points.txt +0 -0
  35. {omlish-0.0.0.dev222.dist-info → omlish-0.0.0.dev224.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,98 @@
1
+ import typing as ta
2
+
3
+ from .... import dataclasses as dc
4
+ from .base import Message
5
+ from .formats import MessageFormat
6
+
7
+
8
+ ##
9
+
10
+
11
+ class ParseError(Exception):
12
+ pass
13
+
14
+
15
+ def parse_message(cls: type[Message], params: ta.Sequence[str]) -> Message:
16
+ mf = cls.FORMAT
17
+
18
+ kws: dict = {}
19
+ i = 0
20
+ for fp in mf.params:
21
+ if isinstance(fp, MessageFormat.KwargParam):
22
+ if i >= len(params):
23
+ if not fp.optional:
24
+ raise ParseError(f'Missing param: {fp.name}')
25
+ continue
26
+
27
+ kv: ta.Any
28
+ if (ar := fp.arity) is MessageFormat.KwargParam.Arity.SINGLE:
29
+ kv = params[i]
30
+ i += 1
31
+
32
+ elif ar is MessageFormat.KwargParam.Arity.VARIADIC:
33
+ kv = params[i:]
34
+ i = len(params)
35
+
36
+ elif ar is MessageFormat.KwargParam.Arity.COMMA_LIST:
37
+ kv = params[i].split(',')
38
+ i += 1
39
+
40
+ else:
41
+ raise TypeError(ar)
42
+
43
+ kws[fp.name] = kv
44
+
45
+ elif isinstance(fp, MessageFormat.LiteralParam):
46
+ if i >= len(params):
47
+ raise ParseError('Missing literal param')
48
+
49
+ pv = params[i]
50
+ if fp.text != pv:
51
+ raise ParseError(f'Unexpected literal: {pv}')
52
+ i += 1
53
+
54
+ else:
55
+ raise TypeError(fp)
56
+
57
+ if i != len(params):
58
+ raise ParseError('Unconsumed params')
59
+
60
+ if (up := mf.unpack_params) is not None:
61
+ kws = dict(up(kws))
62
+
63
+ return cls(**kws)
64
+
65
+
66
+ ##
67
+
68
+
69
+ class UnparsedMessage(ta.NamedTuple):
70
+ name: str
71
+ params: ta.Sequence[str]
72
+
73
+
74
+ def unparse_message(msg: Message) -> UnparsedMessage:
75
+ mf = msg.FORMAT
76
+
77
+ kws = {k: v for k, v in dc.asdict(msg).items() if v is not None}
78
+
79
+ if (up := mf.unpack_params) is not None:
80
+ kws = dict(up.backward(kws))
81
+
82
+ params = []
83
+
84
+ for fp in mf.params:
85
+ if isinstance(fp, MessageFormat.KwargParam):
86
+ # FIXME
87
+ raise NotImplementedError
88
+
89
+ elif isinstance(fp, MessageFormat.LiteralParam):
90
+ params.append(fp.text)
91
+
92
+ else:
93
+ raise TypeError(fp)
94
+
95
+ return UnparsedMessage(
96
+ name=mf.name,
97
+ params=params,
98
+ )
@@ -47,6 +47,7 @@ RPL_MYINFO = _register_numeric_reply(
47
47
  'RPL_MYINFO',
48
48
  4,
49
49
  '<client> <servername> <version> <available user modes> <available channel modes> [<channel modes with a parameter>]', # noqa
50
+ # noqa
50
51
  )
51
52
 
52
53
  RPL_ISUPPORT = _register_numeric_reply(
@@ -61,12 +62,30 @@ RPL_BOUNCE = _register_numeric_reply(
61
62
  '<client> <hostname> <port> :<info>',
62
63
  )
63
64
 
65
+ RPL_STATSLINKINFO = _register_numeric_reply(
66
+ 'RPL_STATSLINKINFO',
67
+ 211,
68
+ '<linkname> <sendq> <sent messages> <sent Kbytes> <received messages> <received Kbytes> <time open>',
69
+ )
70
+
64
71
  RPL_STATSCOMMANDS = _register_numeric_reply(
65
72
  'RPL_STATSCOMMANDS',
66
73
  212,
67
74
  '<client> <command> <count> [<byte count> <remote count>]',
68
75
  )
69
76
 
77
+ RPL_STATSCLINE = _register_numeric_reply('RPL_STATSCLINE', 213)
78
+
79
+ RPL_STATSNLINE = _register_numeric_reply('RPL_STATSNLINE', 214)
80
+
81
+ RPL_STATSILINE = _register_numeric_reply('RPL_STATSILINE', 215)
82
+
83
+ RPL_STATSKLINE = _register_numeric_reply('RPL_STATSKLINE', 216)
84
+
85
+ RPL_STATSQLINE = _register_numeric_reply('RPL_STATSQLINE', 217)
86
+
87
+ RPL_STATSYLINE = _register_numeric_reply('RPL_STATSYLINE', 218)
88
+
70
89
  RPL_ENDOFSTATS = _register_numeric_reply(
71
90
  'RPL_ENDOFSTATS',
72
91
  219,
@@ -79,12 +98,30 @@ RPL_UMODEIS = _register_numeric_reply(
79
98
  '<client> <user modes>',
80
99
  )
81
100
 
101
+ RPL_STATSVLINE = _register_numeric_reply('RPL_STATSVLINE', 240)
102
+
103
+ RPL_STATSLLINE = _register_numeric_reply('RPL_STATSLLINE', 241)
104
+
82
105
  RPL_STATSUPTIME = _register_numeric_reply(
83
106
  'RPL_STATSUPTIME',
84
107
  242,
85
108
  '<client> :Server Up <days> days <hours>:<minutes>:<seconds>',
86
109
  )
87
110
 
111
+ RPL_STATSOLINE = _register_numeric_reply(
112
+ 'RPL_STATSOLINE',
113
+ 243,
114
+ 'O <hostmask> * <name>',
115
+ )
116
+
117
+ RPL_STATSHLINE = _register_numeric_reply('RPL_STATSHLINE', 244)
118
+
119
+ RPL_STATSPING = _register_numeric_reply('RPL_STATSPING', 246)
120
+
121
+ RPL_STATSBLINE = _register_numeric_reply('RPL_STATSBLINE', 247)
122
+
123
+ RPL_STATSDLINE = _register_numeric_reply('RPL_STATSDLINE', 250)
124
+
88
125
  RPL_LUSERCLIENT = _register_numeric_reply(
89
126
  'RPL_LUSERCLIENT',
90
127
  251,
@@ -512,6 +549,12 @@ ERR_WASNOSUCHNICK = _register_numeric_reply(
512
549
  '<client> <nickname> :There was no such nickname',
513
550
  )
514
551
 
552
+ ERR_TOOMANYTARGETS = _register_numeric_reply(
553
+ 'ERR_TOOMANYTARGETS',
554
+ 407,
555
+ '<target> :<error code> recipients. <abort message>',
556
+ )
557
+
515
558
  ERR_NOORIGIN = _register_numeric_reply(
516
559
  'ERR_NOORIGIN',
517
560
  409,
@@ -530,6 +573,18 @@ ERR_NOTEXTTOSEND = _register_numeric_reply(
530
573
  '<client> :No text to send',
531
574
  )
532
575
 
576
+ ERR_NOTOPLEVEL = _register_numeric_reply(
577
+ 'ERR_NOTOPLEVEL',
578
+ 413,
579
+ '<mask> :No toplevel domain specified',
580
+ )
581
+
582
+ ERR_WILDTOPLEVEL = _register_numeric_reply(
583
+ 'ERR_WILDTOPLEVEL',
584
+ 414,
585
+ '<mask> :Wildcard in toplevel domain',
586
+ )
587
+
533
588
  ERR_INPUTTOOLONG = _register_numeric_reply(
534
589
  'ERR_INPUTTOOLONG',
535
590
  417,
@@ -680,6 +735,8 @@ ERR_NOOPERHOST = _register_numeric_reply(
680
735
  '<client> :No O-lines for your host',
681
736
  )
682
737
 
738
+ ERR_NOSERVICEHOST = _register_numeric_reply('ERR_NOSERVICEHOST', 492)
739
+
683
740
  ERR_UMODEUNKNOWNFLAG = _register_numeric_reply(
684
741
  'ERR_UMODEUNKNOWNFLAG',
685
742
  501,
omlish/subprocesses.py CHANGED
@@ -2,6 +2,7 @@
2
2
  # @omlish-lite
3
3
  import abc
4
4
  import contextlib
5
+ import dataclasses as dc
5
6
  import logging
6
7
  import os
7
8
  import shlex
@@ -255,7 +256,70 @@ class BaseSubprocesses(abc.ABC): # noqa
255
256
  ##
256
257
 
257
258
 
259
+ @dc.dataclass(frozen=True)
260
+ class SubprocessRun:
261
+ cmd: ta.Sequence[str]
262
+ input: ta.Any = None
263
+ timeout: ta.Optional[float] = None
264
+ check: bool = False
265
+ capture_output: ta.Optional[bool] = None
266
+ kwargs: ta.Optional[ta.Mapping[str, ta.Any]] = None
267
+
268
+ @classmethod
269
+ def of(
270
+ cls,
271
+ *cmd: str,
272
+ input: ta.Any = None, # noqa
273
+ timeout: ta.Optional[float] = None,
274
+ check: bool = False,
275
+ capture_output: ta.Optional[bool] = None,
276
+ **kwargs: ta.Any,
277
+ ) -> 'SubprocessRun':
278
+ return cls(
279
+ cmd=cmd,
280
+ input=input,
281
+ timeout=timeout,
282
+ check=check,
283
+ capture_output=capture_output,
284
+ kwargs=kwargs,
285
+ )
286
+
287
+
288
+ @dc.dataclass(frozen=True)
289
+ class SubprocessRunOutput(ta.Generic[T]):
290
+ proc: T
291
+
292
+ returncode: int # noqa
293
+
294
+ stdout: ta.Optional[bytes] = None
295
+ stderr: ta.Optional[bytes] = None
296
+
297
+
258
298
  class AbstractSubprocesses(BaseSubprocesses, abc.ABC):
299
+ @abc.abstractmethod
300
+ def run_(self, run: SubprocessRun) -> SubprocessRunOutput:
301
+ raise NotImplementedError
302
+
303
+ def run(
304
+ self,
305
+ *cmd: str,
306
+ input: ta.Any = None, # noqa
307
+ timeout: ta.Optional[float] = None,
308
+ check: bool = False,
309
+ capture_output: ta.Optional[bool] = None,
310
+ **kwargs: ta.Any,
311
+ ) -> SubprocessRunOutput:
312
+ return self.run_(SubprocessRun(
313
+ cmd=cmd,
314
+ input=input,
315
+ timeout=timeout,
316
+ check=check,
317
+ capture_output=capture_output,
318
+ kwargs=kwargs,
319
+ ))
320
+
321
+ #
322
+
259
323
  @abc.abstractmethod
260
324
  def check_call(
261
325
  self,
@@ -319,6 +383,25 @@ class AbstractSubprocesses(BaseSubprocesses, abc.ABC):
319
383
 
320
384
 
321
385
  class Subprocesses(AbstractSubprocesses):
386
+ def run_(self, run: SubprocessRun) -> SubprocessRunOutput[subprocess.CompletedProcess]:
387
+ proc = subprocess.run(
388
+ run.cmd,
389
+ input=run.input,
390
+ timeout=run.timeout,
391
+ check=run.check,
392
+ capture_output=run.capture_output or False,
393
+ **(run.kwargs or {}),
394
+ )
395
+
396
+ return SubprocessRunOutput(
397
+ proc=proc,
398
+
399
+ returncode=proc.returncode,
400
+
401
+ stdout=proc.stdout, # noqa
402
+ stderr=proc.stderr, # noqa
403
+ )
404
+
322
405
  def check_call(
323
406
  self,
324
407
  *cmd: str,
@@ -344,6 +427,30 @@ subprocesses = Subprocesses()
344
427
 
345
428
 
346
429
  class AbstractAsyncSubprocesses(BaseSubprocesses):
430
+ @abc.abstractmethod
431
+ async def run_(self, run: SubprocessRun) -> SubprocessRunOutput:
432
+ raise NotImplementedError
433
+
434
+ def run(
435
+ self,
436
+ *cmd: str,
437
+ input: ta.Any = None, # noqa
438
+ timeout: ta.Optional[float] = None,
439
+ check: bool = False,
440
+ capture_output: ta.Optional[bool] = None,
441
+ **kwargs: ta.Any,
442
+ ) -> ta.Awaitable[SubprocessRunOutput]:
443
+ return self.run_(SubprocessRun(
444
+ cmd=cmd,
445
+ input=input,
446
+ timeout=timeout,
447
+ check=check,
448
+ capture_output=capture_output,
449
+ kwargs=kwargs,
450
+ ))
451
+
452
+ #
453
+
347
454
  @abc.abstractmethod
348
455
  async def check_call(
349
456
  self,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: omlish
3
- Version: 0.0.0.dev222
3
+ Version: 0.0.0.dev224
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -37,11 +37,11 @@ Requires-Dist: sqlalchemy[asyncio]~=2.0; extra == "all"
37
37
  Requires-Dist: pg8000~=1.31; extra == "all"
38
38
  Requires-Dist: pymysql~=1.1; extra == "all"
39
39
  Requires-Dist: aiomysql~=0.2; extra == "all"
40
- Requires-Dist: aiosqlite~=0.20; extra == "all"
40
+ Requires-Dist: aiosqlite~=0.21; extra == "all"
41
41
  Requires-Dist: asyncpg~=0.30; extra == "all"
42
42
  Requires-Dist: apsw~=3.47; extra == "all"
43
43
  Requires-Dist: sqlean.py~=3.45; extra == "all"
44
- Requires-Dist: duckdb~=1.1; extra == "all"
44
+ Requires-Dist: duckdb~=1.2; extra == "all"
45
45
  Requires-Dist: pytest~=8.0; extra == "all"
46
46
  Requires-Dist: anyio~=4.8; extra == "all"
47
47
  Requires-Dist: sniffio~=1.3; extra == "all"
@@ -83,11 +83,11 @@ Provides-Extra: sqldrivers
83
83
  Requires-Dist: pg8000~=1.31; extra == "sqldrivers"
84
84
  Requires-Dist: pymysql~=1.1; extra == "sqldrivers"
85
85
  Requires-Dist: aiomysql~=0.2; extra == "sqldrivers"
86
- Requires-Dist: aiosqlite~=0.20; extra == "sqldrivers"
86
+ Requires-Dist: aiosqlite~=0.21; extra == "sqldrivers"
87
87
  Requires-Dist: asyncpg~=0.30; extra == "sqldrivers"
88
88
  Requires-Dist: apsw~=3.47; extra == "sqldrivers"
89
89
  Requires-Dist: sqlean.py~=3.45; extra == "sqldrivers"
90
- Requires-Dist: duckdb~=1.1; extra == "sqldrivers"
90
+ Requires-Dist: duckdb~=1.2; extra == "sqldrivers"
91
91
  Provides-Extra: testing
92
92
  Requires-Dist: pytest~=8.0; extra == "testing"
93
93
  Provides-Extra: plus
@@ -1,17 +1,17 @@
1
1
  omlish/.manifests.json,sha256=YGmAnUBszmosQQ_7Hh2wwtDiYdYZ4unNKYzOtALuels,7968
2
- omlish/__about__.py,sha256=qi9D_c4g4GLU0jkkVIC7_HYbKv2ZTrFCeMEs9eP0aPU,3380
2
+ omlish/__about__.py,sha256=S2Ri9mbwlQ-KusjCoVjZBcGHhAJnlWUTzvhVU8dKD9Q,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
6
6
  omlish/check.py,sha256=THqm6jD1a0skAO5EC8SOVg58yq96Vk5wcuruBkCYxyU,2016
7
7
  omlish/datetimes.py,sha256=HajeM1kBvwlTa-uR1TTZHmZ3zTPnnUr1uGGQhiO1XQ0,2152
8
8
  omlish/defs.py,sha256=9uUjJuVIbCBL3g14fyzAp-9gH935MFofvlfOGwcBIaM,4913
9
- omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
9
+ omlish/dynamic.py,sha256=kIZokHHid8a0pIAPXMNiXrVJvJJyBnY49WP1a2m-HUQ,6525
10
10
  omlish/libc.py,sha256=8r7Ejyhttk9ruCfBkxNTrlzir5WPbDE2vmY7VPlceMA,15362
11
11
  omlish/outcome.py,sha256=ABIE0zjjTyTNtn-ZqQ_9_mUzLiBQ3sDAyqc9JVD8N2k,7852
12
12
  omlish/runmodule.py,sha256=PWvuAaJ9wQQn6bx9ftEL3_d04DyotNn8dR_twm2pgw0,700
13
13
  omlish/shlex.py,sha256=bsW2XUD8GiMTUTDefJejZ5AyqT1pTgWMPD0BMoF02jE,248
14
- omlish/subprocesses.py,sha256=c7arxsQ7JiaNCmK3GKqwRO6BwrvxeK7eez8A4SrvGBo,10199
14
+ omlish/subprocesses.py,sha256=CKWBnuliVfeIcQjPuIZMMk6uY2bk8LpCW9egMVA059E,13013
15
15
  omlish/sync.py,sha256=QJ79kxmIqDP9SeHDoZAf--DpFIhDQe1jACy8H4N0yZI,2928
16
16
  omlish/algorithm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  omlish/algorithm/all.py,sha256=FudUHwoaRLNNmqYM3jhP2Yd2BpmYhNBRPaVZzARMoSc,194
@@ -102,7 +102,7 @@ omlish/asyncs/asyncio/all.py,sha256=KpTanEtpTlc3rqv5SyiJaJGb_DXBzp_WKLhlRq6lrhY,
102
102
  omlish/asyncs/asyncio/asyncio.py,sha256=3BMhVIF-QTjsFRGDtNYlRbBqKPCA3_AwJsjJoIWdM8k,1783
103
103
  omlish/asyncs/asyncio/channels.py,sha256=ZbmsEmdK1fV96liHdcVpRqA2dAMkXJt4Q3rFAg3YOIw,1074
104
104
  omlish/asyncs/asyncio/streams.py,sha256=Uc9PCWSfBqrK2kdVtfjjQU1eaYTWYmZm8QISDj2xiuw,1004
105
- omlish/asyncs/asyncio/subprocesses.py,sha256=XlIWwSxpVB7sMVc75-f7dI6r08JkdipNFRWXUKS8zAw,6960
105
+ omlish/asyncs/asyncio/subprocesses.py,sha256=JyVOGmuk1pD2SfCreMOIUPp-8SZny6v5rmJwbUSKw-4,6813
106
106
  omlish/asyncs/asyncio/timeouts.py,sha256=Rj5OU9BIAPcVZZKp74z7SzUXF5xokh4dgsWkUqOy1aE,355
107
107
  omlish/asyncs/bluelet/LICENSE,sha256=VHf3oPQihOHnWyIR8LcXX0dpONa1lgyJnjWC2qVuRR0,559
108
108
  omlish/asyncs/bluelet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -283,7 +283,7 @@ omlish/formats/toml/codec.py,sha256=5HFGWEPd9IFxPlRMRheX8FEDlRIzLe1moHEOj2_PFKU,
283
283
  omlish/formats/toml/parser.py,sha256=3QN3rqdJ_zlHfFtsDn-A9pl-BTwdVMUUpUV5-lGWCKc,29342
284
284
  omlish/formats/toml/writer.py,sha256=HIp6XvriXaPTLqyLe-fkIiEf1Pyhsp0TcOg5rFBpO3g,3226
285
285
  omlish/funcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
286
- omlish/funcs/genmachine.py,sha256=EY2k-IFNKMEmHo9CmGRptFvhEMZVOWzZhn0wdQGeaFM,2476
286
+ omlish/funcs/genmachine.py,sha256=jvctDOJd3X-S2_8C83sgWYz2llYlyhHN7P19-WsanOs,2506
287
287
  omlish/funcs/match.py,sha256=gMLZn1enNiFvQaWrQubY300M1BrmdKWzeePihBS7Ywc,6153
288
288
  omlish/funcs/pairs.py,sha256=VCkZjDmJGtR76BsejsHNfb4TcpHCtkkmak-zWDFchAo,3904
289
289
  omlish/funcs/pipes.py,sha256=E7Sz8Aj8ke_vCs5AMNwg1I36kRdHVGTnzxVQaDyn43U,2490
@@ -304,19 +304,19 @@ omlish/http/consts.py,sha256=7BJ4D1MdIvqBcepkgCfBFHolgTwbOlqsOEiee_IjxOA,2289
304
304
  omlish/http/cookies.py,sha256=uuOYlHR6e2SC3GM41V0aozK10nef9tYg83Scqpn5-HM,6351
305
305
  omlish/http/dates.py,sha256=Otgp8wRxPgNGyzx8LFowu1vC4EKJYARCiAwLFncpfHM,2875
306
306
  omlish/http/encodings.py,sha256=w2WoKajpaZnQH8j-IBvk5ZFL2O2pAU_iBvZnkocaTlw,164
307
- omlish/http/handlers.py,sha256=Tv_ApQ0AM_Sls6VDtYn2Wejy6GGEKAsw7X6DM1rcs0M,1461
307
+ omlish/http/handlers.py,sha256=l6JLDuK9XhYvF1IudnPz5hWTZW1dXRjUBSO4Uyck0LE,3365
308
308
  omlish/http/headers.py,sha256=ZMmjrEiYjzo0YTGyK0YsvjdwUazktGqzVVYorY4fd44,5081
309
309
  omlish/http/json.py,sha256=9XwAsl4966Mxrv-1ytyCqhcE6lbBJw-0_tFZzGszgHE,7440
310
310
  omlish/http/jwt.py,sha256=6Rigk1WrJ059DY4jDIKnxjnChWb7aFdermj2AI2DSvk,4346
311
311
  omlish/http/multipart.py,sha256=R9ycpHsXRcmh0uoc43aYb7BdWL-8kSQHe7J-M81aQZM,2240
312
- omlish/http/parsing.py,sha256=hxfd9nYaAAjYIivkTClFZXMRmiiCnxzeeEIGXw7-gt0,13992
312
+ omlish/http/parsing.py,sha256=Kz1n-2SwqSbRtPk1nlImf655c2YtGLW4WlTI82o3c1w,14356
313
313
  omlish/http/sessions.py,sha256=TfTJ_j-6c9PelG_RmijEwozfaVm3O7YzgtFvp8VzQqM,4799
314
314
  omlish/http/sse.py,sha256=MDs9RvxQXoQliImcc6qK1ERajEYM7Q1l8xmr-9ceNBc,2315
315
315
  omlish/http/versions.py,sha256=wSiOXPiClVjkVgSU_VmxkoD1SUYGaoPbP0U5Aw-Ufg8,409
316
316
  omlish/http/wsgi.py,sha256=czZsVUX-l2YTlMrUjKN49wRoP4rVpS0qpeBn4O5BoMY,948
317
317
  omlish/http/coro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
318
- omlish/http/coro/fdio.py,sha256=ajj_lekRockGwQEw8m_mi6RO9-o6hnC9ITiwtZe3y-s,4017
319
- omlish/http/coro/server.py,sha256=q5HlGMXNrKBRMoHSNFcqsQL1GEVyjoMC8GgRMbdJ96s,19648
318
+ omlish/http/coro/fdio.py,sha256=bd9K4EYVWbXV3e3npDPXI9DuDAruJiyDmrgFpgNcjzY,4035
319
+ omlish/http/coro/server.py,sha256=yNceytLNRArIS_GcRh2ppNEReqACR7Rpg8vCBxc311k,19707
320
320
  omlish/http/coro/simple.py,sha256=Y1wJGAfdr0qz3gGpqpdpigbtquFUdksQi2dQGu8K1Z0,2872
321
321
  omlish/inject/__init__.py,sha256=n0RC9UDGsBQQ39cST39-XJqJPq2M0tnnh9yJubW9azo,1891
322
322
  omlish/inject/binder.py,sha256=DAbc8TZi5w8Mna0TUtq0mT4jeDVA7i7SlBtOFrh2swc,4185
@@ -424,7 +424,7 @@ omlish/lite/dataclasses.py,sha256=k1588egoF3h_Kb21tuQb8WyJ9wxhT06EztFvaKOHzNU,11
424
424
  omlish/lite/inject.py,sha256=qBUftFeXMiRgANYbNS2e7TePMYyFAcuLgsJiLyMTW5o,28769
425
425
  omlish/lite/json.py,sha256=7-02Ny4fq-6YAu5ynvqoijhuYXWpLmfCI19GUeZnb1c,740
426
426
  omlish/lite/logs.py,sha256=CWFG0NKGhqNeEgryF5atN2gkPYbUdTINEw_s1phbINM,51
427
- omlish/lite/marshal.py,sha256=4E78R-XzncjCClHsOdE-g1ocs5mhA91oFy1LYkaEjHs,18042
427
+ omlish/lite/marshal.py,sha256=UMwSLEM-QvkvnSHmcChJVkIXkGp9WAyMYyZMB-NZefw,18463
428
428
  omlish/lite/maybes.py,sha256=7OlHJ8Q2r4wQ-aRbZSlJY7x0e8gDvufFdlohGEIJ3P4,833
429
429
  omlish/lite/pycharm.py,sha256=pUOJevrPClSqTCEOkQBO11LKX2003tfDcp18a03QFrc,1163
430
430
  omlish/lite/reflect.py,sha256=pzOY2PPuHH0omdtglkN6DheXDrGopdL3PtTJnejyLFU,2189
@@ -432,6 +432,7 @@ omlish/lite/resources.py,sha256=YNSmX1Ohck1aoWRs55a-o5ChVbFJIQhtbqE-XwF55Oc,326
432
432
  omlish/lite/runtime.py,sha256=XQo408zxTdJdppUZqOWHyeUR50VlCpNIExNGHz4U6O4,459
433
433
  omlish/lite/secrets.py,sha256=3Mz3V2jf__XU9qNHcH56sBSw95L3U2UPL24bjvobG0c,816
434
434
  omlish/lite/strings.py,sha256=QGxT1Yh4oI8ycsfeobxnjEhvDob_GiAKLeIhZwo1j24,1986
435
+ omlish/lite/timing.py,sha256=aVu3hEDB_jyTF_ryZI7iU-xg4q8CNwqpp9Apfru_iwY,196
435
436
  omlish/lite/types.py,sha256=fP5EMyBdEp2LmDxcHjUDtwAMdR06ISr9lKOL7smWfHM,140
436
437
  omlish/lite/typing.py,sha256=U3-JaEnkDSYxK4tsu_MzUn3RP6qALBe5FXQXpD-licE,1090
437
438
  omlish/logs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -447,6 +448,7 @@ omlish/logs/noisy.py,sha256=Ubc-eTH6ZbGYsLfUUi69JAotwuUwzb-SJBeGo_0dIZI,348
447
448
  omlish/logs/protocol.py,sha256=NzyCeNBN-fyKpJinhECfjUQSd5MxZLiYbuLCTtW6QUU,4500
448
449
  omlish/logs/proxy.py,sha256=A-ROPUUAlF397qTbEqhel6YhQMstNuXL3Xmts7w9dAo,2347
449
450
  omlish/logs/standard.py,sha256=FbKdF2Z4Na5i2TNwKn0avLJXyICe2JKsPufjvKCHGn0,3162
451
+ omlish/logs/timing.py,sha256=XrFUHIPT4EHDujLKbGs9fGFMmoM3NEP8xPRaESJr7bQ,1513
450
452
  omlish/logs/utils.py,sha256=mzHrZ9ji75p5A8qR29eUr05CBAHMb8J753MSkID_VaQ,393
451
453
  omlish/manifests/__init__.py,sha256=P2B0dpT8D7l5lJwRGPA92IcQj6oeXfd90X5-q9BJrKg,51
452
454
  omlish/manifests/load.py,sha256=LrWAvBfdzDkFdLuVwfw2RwFvLjxx-rvfkpU9eBsWeIc,5626
@@ -515,7 +517,7 @@ omlish/secrets/pwhash.py,sha256=Goktn-swmC6PXqfRBnDrH_Lr42vjckT712UyErPjzkw,4102
515
517
  omlish/secrets/secrets.py,sha256=QNgOmRcIRK2fx49bIbBBM2rYbe6IhhLgk8fKvq8guoI,7963
516
518
  omlish/secrets/ssl.py,sha256=TvO1BJeCCBPsOLjO-QH7Q0DC-NS8onfmRxbl4ntOnd8,147
517
519
  omlish/secrets/subprocesses.py,sha256=ffjfbgPbEE_Pwb_87vG4yYR2CGZy3I31mHNCo_0JtHw,1212
518
- omlish/secrets/tempssl.py,sha256=8yFLb3Q19zVtciFZL7LEeK1LIXaYxvtSaxZX2L13Xx8,1048
520
+ omlish/secrets/tempssl.py,sha256=pAmTRFgR23pFRUAIzJrxeJg4JbYFvaVcEtWtvSYyxHw,1932
519
521
  omlish/sockets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
520
522
  omlish/sockets/addresses.py,sha256=vbVeQBkzI513H4vRv-JS89QtRbr9U8v5zqkm3oODl_s,1869
521
523
  omlish/sockets/bind.py,sha256=TnG5nm0pnuMxRA02TG2W40RbutrPA6tkOJtbZvBjDWU,8063
@@ -527,20 +529,25 @@ omlish/sockets/server/server.py,sha256=mZmHPkCRPitous56_7FJdAsDLZag2wDqjj-LaYM8_
527
529
  omlish/sockets/server/threading.py,sha256=YmW3Ym_p5j_F4SIH9BgRHIObywjq1HS39j9CGWIcMAY,2856
528
530
  omlish/specs/__init__.py,sha256=zZwF8yXTEkSstYtORkDhVLK-_hWU8WOJCuBpognb_NY,118
529
531
  omlish/specs/irc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
530
- omlish/specs/irc/format/LICENSE,sha256=1CT5_XkDMJ9HDZh0tX4TIsm7LfrSdljRX5EirPBhDYM,778
531
- omlish/specs/irc/format/__init__.py,sha256=0OFSLrMS5jYFJCqH1LKv0UfTrp5faPQhlhYKBQyCZeA,1701
532
- omlish/specs/irc/format/consts.py,sha256=iDCsJIyDE5-UnkIQpwCLzdbf3DUFWRmqkuVd0cZtujw,185
533
- omlish/specs/irc/format/errors.py,sha256=cRP8c--kRts5Uwqn1xl1J97OI74hicG4UbkJs_EOSDg,334
534
- omlish/specs/irc/format/message.py,sha256=SQP7IpdlxCncALiBD_01TxxOjQsBxbmLE0hxLB2Q0vU,398
535
- omlish/specs/irc/format/nuh.py,sha256=96KJooCzdlmbliyLpoE8g4ccDSHzR0Fl1apu7gkExEQ,1282
536
- omlish/specs/irc/format/parsing.py,sha256=OYSk7IbaZPpU5k1mRn-3reROPVehwyRAJs546vnEXI4,4053
537
- omlish/specs/irc/format/rendering.py,sha256=PDhl5dIU9xffmIO3vHWTPh17Cb-E34vIkFLs-Ow3tmY,4909
538
- omlish/specs/irc/format/tags.py,sha256=_HnzjPCGhLses_P3Os5ReuVdRacmanTb8kEeCxsfqWE,2779
539
- omlish/specs/irc/format/utils.py,sha256=8VZavx37IospJvhwjnP39sYSiBwzcxNyCJ_doxrtM-Y,687
532
+ omlish/specs/irc/messages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
533
+ omlish/specs/irc/messages/base.py,sha256=JQWq4L-USYFw1DmHPpL3FiAwvynf6Hi48-zNdC__jT0,1240
534
+ omlish/specs/irc/messages/formats.py,sha256=uBPB0-_orWzBRAbcZEbS9Q-aZ3iVCmGZMoSau6-Ic04,2361
535
+ omlish/specs/irc/messages/messages.py,sha256=Q_2ceKfqcQTTzwbN9eFJfwwXnHrs_BtkUPFt42lGEHs,14073
536
+ omlish/specs/irc/messages/parsing.py,sha256=Zqtsfkd5auBtk0vEruloQyt067wSa8-3d_yglDFRi0g,2222
540
537
  omlish/specs/irc/numerics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
541
538
  omlish/specs/irc/numerics/formats.py,sha256=n--9bxFkY3p8G1K3aJJXj7FEK_tmGouBrB8Gu1WrEd0,2252
542
- omlish/specs/irc/numerics/numerics.py,sha256=re5eKU4xoTJgFrNr3VPHS-WvaexAHJLoxvWnnMty_O0,16677
539
+ omlish/specs/irc/numerics/numerics.py,sha256=iOEG9PqfGUiDh6gDgdiNUqVY6WAbMBIwEPPIma34JNo,18215
543
540
  omlish/specs/irc/numerics/types.py,sha256=qbNDLxtz827JnIMh79-SGK1RdbEy44vZl6uQMIYGXyg,1287
541
+ omlish/specs/irc/protocol/LICENSE,sha256=1CT5_XkDMJ9HDZh0tX4TIsm7LfrSdljRX5EirPBhDYM,778
542
+ omlish/specs/irc/protocol/__init__.py,sha256=0OFSLrMS5jYFJCqH1LKv0UfTrp5faPQhlhYKBQyCZeA,1701
543
+ omlish/specs/irc/protocol/consts.py,sha256=iDCsJIyDE5-UnkIQpwCLzdbf3DUFWRmqkuVd0cZtujw,185
544
+ omlish/specs/irc/protocol/errors.py,sha256=cRP8c--kRts5Uwqn1xl1J97OI74hicG4UbkJs_EOSDg,334
545
+ omlish/specs/irc/protocol/message.py,sha256=SQP7IpdlxCncALiBD_01TxxOjQsBxbmLE0hxLB2Q0vU,398
546
+ omlish/specs/irc/protocol/nuh.py,sha256=96KJooCzdlmbliyLpoE8g4ccDSHzR0Fl1apu7gkExEQ,1282
547
+ omlish/specs/irc/protocol/parsing.py,sha256=OYSk7IbaZPpU5k1mRn-3reROPVehwyRAJs546vnEXI4,4053
548
+ omlish/specs/irc/protocol/rendering.py,sha256=PDhl5dIU9xffmIO3vHWTPh17Cb-E34vIkFLs-Ow3tmY,4909
549
+ omlish/specs/irc/protocol/tags.py,sha256=_HnzjPCGhLses_P3Os5ReuVdRacmanTb8kEeCxsfqWE,2779
550
+ omlish/specs/irc/protocol/utils.py,sha256=8VZavx37IospJvhwjnP39sYSiBwzcxNyCJ_doxrtM-Y,687
544
551
  omlish/specs/jmespath/LICENSE,sha256=IH-ZZlZkS8XMkf_ubNVD1aYHQ2l_wd0tmHtXrCcYpRU,1113
545
552
  omlish/specs/jmespath/__init__.py,sha256=9tsrquw1kXe1KAhTP3WeL0GlGBiTguQVxsC-lUYTWP4,2087
546
553
  omlish/specs/jmespath/__main__.py,sha256=wIXm6bs08etNG_GZlN2rBkADPb0rKfL2HSkm8spnpxw,200
@@ -660,9 +667,9 @@ omlish/text/indent.py,sha256=YjtJEBYWuk8--b9JU_T6q4yxV85_TR7VEVr5ViRCFwk,1336
660
667
  omlish/text/minja.py,sha256=jZC-fp3Xuhx48ppqsf2Sf1pHbC0t8XBB7UpUUoOk2Qw,5751
661
668
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
662
669
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
663
- omlish-0.0.0.dev222.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
664
- omlish-0.0.0.dev222.dist-info/METADATA,sha256=ij9bc4yyi5znMyYrn-XGpDpGokENDlDacgDAjOeyUFI,4176
665
- omlish-0.0.0.dev222.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
666
- omlish-0.0.0.dev222.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
667
- omlish-0.0.0.dev222.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
668
- omlish-0.0.0.dev222.dist-info/RECORD,,
670
+ omlish-0.0.0.dev224.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
671
+ omlish-0.0.0.dev224.dist-info/METADATA,sha256=mQhHJnChb7Igih2af4khc6lOSNpkVqyv8j2xaVk0IpQ,4176
672
+ omlish-0.0.0.dev224.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
673
+ omlish-0.0.0.dev224.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
674
+ omlish-0.0.0.dev224.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
675
+ omlish-0.0.0.dev224.dist-info/RECORD,,
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes