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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) 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 +14 -0
  8. omlish/http/parsing.py +13 -0
  9. omlish/lite/marshal.py +22 -6
  10. omlish/specs/irc/messages/__init__.py +0 -0
  11. omlish/specs/irc/messages/base.py +49 -0
  12. omlish/specs/irc/messages/formats.py +92 -0
  13. omlish/specs/irc/messages/messages.py +774 -0
  14. omlish/specs/irc/messages/parsing.py +98 -0
  15. omlish/specs/irc/numerics/numerics.py +57 -0
  16. omlish/subprocesses.py +88 -0
  17. {omlish-0.0.0.dev222.dist-info → omlish-0.0.0.dev223.dist-info}/METADATA +5 -5
  18. {omlish-0.0.0.dev222.dist-info → omlish-0.0.0.dev223.dist-info}/RECORD +32 -27
  19. /omlish/specs/irc/{format → protocol}/LICENSE +0 -0
  20. /omlish/specs/irc/{format → protocol}/__init__.py +0 -0
  21. /omlish/specs/irc/{format → protocol}/consts.py +0 -0
  22. /omlish/specs/irc/{format → protocol}/errors.py +0 -0
  23. /omlish/specs/irc/{format → protocol}/message.py +0 -0
  24. /omlish/specs/irc/{format → protocol}/nuh.py +0 -0
  25. /omlish/specs/irc/{format → protocol}/parsing.py +0 -0
  26. /omlish/specs/irc/{format → protocol}/rendering.py +0 -0
  27. /omlish/specs/irc/{format → protocol}/tags.py +0 -0
  28. /omlish/specs/irc/{format → protocol}/utils.py +0 -0
  29. {omlish-0.0.0.dev222.dist-info → omlish-0.0.0.dev223.dist-info}/LICENSE +0 -0
  30. {omlish-0.0.0.dev222.dist-info → omlish-0.0.0.dev223.dist-info}/WHEEL +0 -0
  31. {omlish-0.0.0.dev222.dist-info → omlish-0.0.0.dev223.dist-info}/entry_points.txt +0 -0
  32. {omlish-0.0.0.dev222.dist-info → omlish-0.0.0.dev223.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,51 @@ 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
+
269
+ @dc.dataclass(frozen=True)
270
+ class SubprocessRunOutput(ta.Generic[T]):
271
+ proc: T
272
+
273
+ returncode: int # noqa
274
+
275
+ stdout: ta.Optional[bytes] = None
276
+ stderr: ta.Optional[bytes] = None
277
+
278
+
258
279
  class AbstractSubprocesses(BaseSubprocesses, abc.ABC):
280
+ @abc.abstractmethod
281
+ def run_(self, run: SubprocessRun) -> SubprocessRunOutput:
282
+ raise NotImplementedError
283
+
284
+ def run(
285
+ self,
286
+ *cmd: str,
287
+ input: ta.Any = None, # noqa
288
+ timeout: ta.Optional[float] = None,
289
+ check: bool = False,
290
+ capture_output: ta.Optional[bool] = None,
291
+ **kwargs: ta.Any,
292
+ ) -> SubprocessRunOutput:
293
+ return self.run_(SubprocessRun(
294
+ cmd=cmd,
295
+ input=input,
296
+ timeout=timeout,
297
+ check=check,
298
+ capture_output=capture_output,
299
+ kwargs=kwargs,
300
+ ))
301
+
302
+ #
303
+
259
304
  @abc.abstractmethod
260
305
  def check_call(
261
306
  self,
@@ -319,6 +364,25 @@ class AbstractSubprocesses(BaseSubprocesses, abc.ABC):
319
364
 
320
365
 
321
366
  class Subprocesses(AbstractSubprocesses):
367
+ def run_(self, run: SubprocessRun) -> SubprocessRunOutput[subprocess.CompletedProcess]:
368
+ proc = subprocess.run(
369
+ run.cmd,
370
+ input=run.input,
371
+ timeout=run.timeout,
372
+ check=run.check,
373
+ capture_output=run.capture_output or False,
374
+ **(run.kwargs or {}),
375
+ )
376
+
377
+ return SubprocessRunOutput(
378
+ proc=proc,
379
+
380
+ returncode=proc.returncode,
381
+
382
+ stdout=proc.stdout, # noqa
383
+ stderr=proc.stderr, # noqa
384
+ )
385
+
322
386
  def check_call(
323
387
  self,
324
388
  *cmd: str,
@@ -344,6 +408,30 @@ subprocesses = Subprocesses()
344
408
 
345
409
 
346
410
  class AbstractAsyncSubprocesses(BaseSubprocesses):
411
+ @abc.abstractmethod
412
+ async def run_(self, run: SubprocessRun) -> SubprocessRunOutput:
413
+ raise NotImplementedError
414
+
415
+ def run(
416
+ self,
417
+ *cmd: str,
418
+ input: ta.Any = None, # noqa
419
+ timeout: ta.Optional[float] = None,
420
+ check: bool = False,
421
+ capture_output: ta.Optional[bool] = None,
422
+ **kwargs: ta.Any,
423
+ ) -> ta.Awaitable[SubprocessRunOutput]:
424
+ return self.run_(SubprocessRun(
425
+ cmd=cmd,
426
+ input=input,
427
+ timeout=timeout,
428
+ check=check,
429
+ capture_output=capture_output,
430
+ kwargs=kwargs,
431
+ ))
432
+
433
+ #
434
+
347
435
  @abc.abstractmethod
348
436
  async def check_call(
349
437
  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.dev223
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=cfcfKE_bobX_WDE8x_mLyrVgIGJv3TZdMAc3Zrzc3xs,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=kI9z5_D8J30BrAKu6FvsCvnIvmWGEMIc3jbGbvmSmFA,12510
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=QUjS2C3k7SqoL9yaAssfNIvfHYzNtg8Xfpsq2KC7fFU,1839
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
@@ -527,20 +527,25 @@ omlish/sockets/server/server.py,sha256=mZmHPkCRPitous56_7FJdAsDLZag2wDqjj-LaYM8_
527
527
  omlish/sockets/server/threading.py,sha256=YmW3Ym_p5j_F4SIH9BgRHIObywjq1HS39j9CGWIcMAY,2856
528
528
  omlish/specs/__init__.py,sha256=zZwF8yXTEkSstYtORkDhVLK-_hWU8WOJCuBpognb_NY,118
529
529
  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
530
+ omlish/specs/irc/messages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
531
+ omlish/specs/irc/messages/base.py,sha256=JQWq4L-USYFw1DmHPpL3FiAwvynf6Hi48-zNdC__jT0,1240
532
+ omlish/specs/irc/messages/formats.py,sha256=uBPB0-_orWzBRAbcZEbS9Q-aZ3iVCmGZMoSau6-Ic04,2361
533
+ omlish/specs/irc/messages/messages.py,sha256=Q_2ceKfqcQTTzwbN9eFJfwwXnHrs_BtkUPFt42lGEHs,14073
534
+ omlish/specs/irc/messages/parsing.py,sha256=Zqtsfkd5auBtk0vEruloQyt067wSa8-3d_yglDFRi0g,2222
540
535
  omlish/specs/irc/numerics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
541
536
  omlish/specs/irc/numerics/formats.py,sha256=n--9bxFkY3p8G1K3aJJXj7FEK_tmGouBrB8Gu1WrEd0,2252
542
- omlish/specs/irc/numerics/numerics.py,sha256=re5eKU4xoTJgFrNr3VPHS-WvaexAHJLoxvWnnMty_O0,16677
537
+ omlish/specs/irc/numerics/numerics.py,sha256=iOEG9PqfGUiDh6gDgdiNUqVY6WAbMBIwEPPIma34JNo,18215
543
538
  omlish/specs/irc/numerics/types.py,sha256=qbNDLxtz827JnIMh79-SGK1RdbEy44vZl6uQMIYGXyg,1287
539
+ omlish/specs/irc/protocol/LICENSE,sha256=1CT5_XkDMJ9HDZh0tX4TIsm7LfrSdljRX5EirPBhDYM,778
540
+ omlish/specs/irc/protocol/__init__.py,sha256=0OFSLrMS5jYFJCqH1LKv0UfTrp5faPQhlhYKBQyCZeA,1701
541
+ omlish/specs/irc/protocol/consts.py,sha256=iDCsJIyDE5-UnkIQpwCLzdbf3DUFWRmqkuVd0cZtujw,185
542
+ omlish/specs/irc/protocol/errors.py,sha256=cRP8c--kRts5Uwqn1xl1J97OI74hicG4UbkJs_EOSDg,334
543
+ omlish/specs/irc/protocol/message.py,sha256=SQP7IpdlxCncALiBD_01TxxOjQsBxbmLE0hxLB2Q0vU,398
544
+ omlish/specs/irc/protocol/nuh.py,sha256=96KJooCzdlmbliyLpoE8g4ccDSHzR0Fl1apu7gkExEQ,1282
545
+ omlish/specs/irc/protocol/parsing.py,sha256=OYSk7IbaZPpU5k1mRn-3reROPVehwyRAJs546vnEXI4,4053
546
+ omlish/specs/irc/protocol/rendering.py,sha256=PDhl5dIU9xffmIO3vHWTPh17Cb-E34vIkFLs-Ow3tmY,4909
547
+ omlish/specs/irc/protocol/tags.py,sha256=_HnzjPCGhLses_P3Os5ReuVdRacmanTb8kEeCxsfqWE,2779
548
+ omlish/specs/irc/protocol/utils.py,sha256=8VZavx37IospJvhwjnP39sYSiBwzcxNyCJ_doxrtM-Y,687
544
549
  omlish/specs/jmespath/LICENSE,sha256=IH-ZZlZkS8XMkf_ubNVD1aYHQ2l_wd0tmHtXrCcYpRU,1113
545
550
  omlish/specs/jmespath/__init__.py,sha256=9tsrquw1kXe1KAhTP3WeL0GlGBiTguQVxsC-lUYTWP4,2087
546
551
  omlish/specs/jmespath/__main__.py,sha256=wIXm6bs08etNG_GZlN2rBkADPb0rKfL2HSkm8spnpxw,200
@@ -660,9 +665,9 @@ omlish/text/indent.py,sha256=YjtJEBYWuk8--b9JU_T6q4yxV85_TR7VEVr5ViRCFwk,1336
660
665
  omlish/text/minja.py,sha256=jZC-fp3Xuhx48ppqsf2Sf1pHbC0t8XBB7UpUUoOk2Qw,5751
661
666
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
662
667
  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,,
668
+ omlish-0.0.0.dev223.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
669
+ omlish-0.0.0.dev223.dist-info/METADATA,sha256=fmmzRE5W14ixJfioXsdtMRVBzze_mKcI_1ZFfKDVQ34,4176
670
+ omlish-0.0.0.dev223.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
671
+ omlish-0.0.0.dev223.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
672
+ omlish-0.0.0.dev223.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
673
+ omlish-0.0.0.dev223.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