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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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