omlish 0.0.0.dev222__py3-none-any.whl → 0.0.0.dev223__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 (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