omlish 0.0.0.dev472__py3-none-any.whl → 0.0.0.dev474__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.

Potentially problematic release.


This version of omlish might be problematic. Click here for more details.

Files changed (37) hide show
  1. omlish/__about__.py +3 -3
  2. omlish/collections/__init__.py +4 -0
  3. omlish/collections/attrregistry.py +32 -4
  4. omlish/diag/cmds/__init__.py +0 -0
  5. omlish/diag/{lslocks.py → cmds/lslocks.py} +6 -6
  6. omlish/diag/{lsof.py → cmds/lsof.py} +6 -6
  7. omlish/diag/{ps.py → cmds/ps.py} +6 -6
  8. omlish/dispatch/__init__.py +18 -12
  9. omlish/formats/json/stream/__init__.py +13 -0
  10. omlish/http/clients/asyncs.py +11 -17
  11. omlish/http/clients/coro/sync.py +3 -2
  12. omlish/http/clients/default.py +2 -2
  13. omlish/http/clients/executor.py +8 -2
  14. omlish/http/clients/httpx.py +29 -46
  15. omlish/http/clients/sync.py +11 -17
  16. omlish/http/clients/syncasync.py +8 -2
  17. omlish/http/clients/urllib.py +2 -1
  18. omlish/io/buffers.py +115 -0
  19. omlish/io/readers.py +29 -0
  20. omlish/lite/contextmanagers.py +4 -4
  21. omlish/os/pidfiles/pinning.py +2 -2
  22. omlish/text/docwrap/__init__.py +3 -0
  23. omlish/text/docwrap/api.py +77 -0
  24. omlish/text/docwrap/groups.py +84 -0
  25. omlish/text/docwrap/lists.py +167 -0
  26. omlish/text/docwrap/parts.py +139 -0
  27. omlish/text/docwrap/reflowing.py +103 -0
  28. omlish/text/docwrap/rendering.py +142 -0
  29. omlish/text/docwrap/utils.py +11 -0
  30. omlish/text/docwrap/wrapping.py +59 -0
  31. omlish/text/textwrap.py +51 -0
  32. {omlish-0.0.0.dev472.dist-info → omlish-0.0.0.dev474.dist-info}/METADATA +7 -6
  33. {omlish-0.0.0.dev472.dist-info → omlish-0.0.0.dev474.dist-info}/RECORD +37 -25
  34. {omlish-0.0.0.dev472.dist-info → omlish-0.0.0.dev474.dist-info}/WHEEL +0 -0
  35. {omlish-0.0.0.dev472.dist-info → omlish-0.0.0.dev474.dist-info}/entry_points.txt +0 -0
  36. {omlish-0.0.0.dev472.dist-info → omlish-0.0.0.dev474.dist-info}/licenses/LICENSE +0 -0
  37. {omlish-0.0.0.dev472.dist-info → omlish-0.0.0.dev474.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,103 @@
1
+ """
2
+ FIXME:
3
+ - use wrapping.py with all its todos
4
+ """
5
+ import dataclasses as dc
6
+ import textwrap
7
+ import typing as ta
8
+
9
+ from ... import lang
10
+ from ..textwrap import TextwrapOpts
11
+ from .parts import Blank
12
+ from .parts import Block
13
+ from .parts import Indent
14
+ from .parts import List
15
+ from .parts import Part
16
+ from .parts import Text
17
+ from .parts import blockify
18
+ from .utils import all_same
19
+
20
+
21
+ ##
22
+
23
+
24
+ class TextReflower(ta.Protocol):
25
+ def __call__(self, strs: ta.Sequence[str], current_indent: int) -> ta.Sequence[str]: ...
26
+
27
+
28
+ class NopReflower:
29
+ def __call__(self, strs: ta.Sequence[str], current_indent: int = 0) -> ta.Sequence[str]:
30
+ return strs
31
+
32
+
33
+ @dc.dataclass(frozen=True)
34
+ class JoiningReflower:
35
+ sep: str = ' '
36
+
37
+ def __call__(self, strs: ta.Sequence[str], current_indent: int = 0) -> ta.Sequence[str]:
38
+ return [self.sep.join(strs)]
39
+
40
+
41
+ @dc.dataclass(frozen=True)
42
+ class TextwrapReflower:
43
+ sep: str = ' '
44
+ opts: TextwrapOpts = TextwrapOpts()
45
+
46
+ def __call__(self, strs: ta.Sequence[str], current_indent: int = 0) -> ta.Sequence[str]:
47
+ return textwrap.wrap(
48
+ self.sep.join(strs),
49
+ **dc.asdict(dc.replace(
50
+ self.opts,
51
+ width=self.opts.width - current_indent,
52
+ )),
53
+ )
54
+
55
+
56
+ ##
57
+
58
+
59
+ def reflow_block_text(
60
+ root: Part,
61
+ reflower: TextReflower = JoiningReflower(),
62
+ ) -> Part:
63
+ def rec(p: Part, ci: int) -> Part:
64
+ if isinstance(p, Blank):
65
+ return p
66
+
67
+ elif isinstance(p, Text):
68
+ if (rf := reflower([p.s], ci)) != [p.s]:
69
+ p = blockify(*map(Text, rf)) # noqa
70
+ return p
71
+
72
+ elif isinstance(p, Indent):
73
+ if (np := rec(p.p, ci + p.n)) is not p.p:
74
+ p = Indent(p.n, np) # type: ignore[arg-type]
75
+ return p
76
+
77
+ elif isinstance(p, List):
78
+ ne = [rec(e, ci + len(p.d) + 1) for e in p.es]
79
+ if not all_same(ne, p.es):
80
+ p = List(p.d, ne)
81
+ return p
82
+
83
+ elif not isinstance(p, Block):
84
+ raise TypeError(p)
85
+
86
+ ps = [rec(c, ci) for c in p.ps]
87
+
88
+ new: list[Part | list[str]] = []
89
+ for c in ps:
90
+ if isinstance(c, Text):
91
+ if new and isinstance(x := new[-1], list):
92
+ x.append(c.s)
93
+ else:
94
+ new.append([c.s])
95
+ else:
96
+ new.append(c)
97
+
98
+ return blockify(*lang.flatmap(
99
+ lambda x: map(Text, reflower(x, ci)) if isinstance(x, list) else [x], # noqa
100
+ new,
101
+ ))
102
+
103
+ return rec(root, 0)
@@ -0,0 +1,142 @@
1
+ import functools
2
+ import io
3
+ import typing as ta
4
+
5
+ from ... import check
6
+ from .parts import Blank
7
+ from .parts import Block
8
+ from .parts import Indent
9
+ from .parts import List
10
+ from .parts import Part
11
+ from .parts import Text
12
+
13
+
14
+ ##
15
+
16
+
17
+ @functools.lru_cache
18
+ def _indent_str(n: int) -> str:
19
+ return ' ' * n
20
+
21
+
22
+ ##
23
+
24
+
25
+ def render_to(root: Part, out: ta.Callable[[str], ta.Any]) -> None:
26
+ i_stk: list[int] = [0]
27
+ ci = 0
28
+
29
+ def write(s: str, ti: int | None = None) -> None:
30
+ if (nl := '\n' in s) and s != '\n':
31
+ check.state(s[-1] == '\n')
32
+ check.state(s.count('\n') == 1)
33
+
34
+ if ti is None:
35
+ ti = i_stk[-1]
36
+ nonlocal ci
37
+ if ci < ti:
38
+ out(_indent_str(ti - ci))
39
+ ci = ti
40
+
41
+ out(s)
42
+
43
+ if nl:
44
+ ci = 0
45
+
46
+ def rec(p: Part) -> None:
47
+ nonlocal ci
48
+
49
+ if isinstance(p, Blank):
50
+ check.state(ci == 0)
51
+ out('\n')
52
+
53
+ elif isinstance(p, Text):
54
+ write(p.s)
55
+ write('\n')
56
+
57
+ elif isinstance(p, Block):
58
+ for c in p.ps:
59
+ rec(c)
60
+
61
+ elif isinstance(p, Indent):
62
+ i_stk.append(i_stk[-1] + p.n)
63
+ rec(p.p)
64
+ i_stk.pop()
65
+
66
+ elif isinstance(p, List):
67
+ i_stk.append((li := i_stk[-1]) + len(p.d) + 1)
68
+ sd = p.d + ' '
69
+ for e in p.es:
70
+ if isinstance(e, Blank):
71
+ rec(e)
72
+ else:
73
+ check.state(ci == 0)
74
+ write(sd, li)
75
+ ci += len(sd)
76
+ rec(e)
77
+ i_stk.pop()
78
+
79
+ else:
80
+ raise TypeError(p)
81
+
82
+ rec(root)
83
+ check.state(i_stk == [0])
84
+
85
+
86
+ def render(root: Part) -> str:
87
+ buf = io.StringIO()
88
+ render_to(root, buf.write)
89
+ return buf.getvalue()
90
+
91
+
92
+ ##
93
+
94
+
95
+ def dump_to(root: Part, out: ta.Callable[[str], ta.Any]) -> None:
96
+ i = 0
97
+
98
+ def write(s: str) -> None:
99
+ out(_indent_str(i * 2))
100
+ out(s)
101
+ out('\n')
102
+
103
+ def rec(p: Part) -> None:
104
+ nonlocal i
105
+
106
+ if isinstance(p, Blank):
107
+ write('blank')
108
+
109
+ elif isinstance(p, Text):
110
+ write(f'text:{p.s!r}')
111
+
112
+ elif isinstance(p, Block):
113
+ write(f'block/{len(p.ps)}')
114
+ i += 1
115
+ for c in p.ps:
116
+ rec(c)
117
+ i -= 1
118
+
119
+ elif isinstance(p, Indent):
120
+ write(f'indent:{p.n}')
121
+ i += 1
122
+ rec(p.p)
123
+ i -= 1
124
+
125
+ elif isinstance(p, List):
126
+ write(f'list/{len(p.es)}:{p.d!r}')
127
+ i += 1
128
+ for e in p.es:
129
+ rec(e)
130
+ i -= 1
131
+
132
+ else:
133
+ raise TypeError(p)
134
+
135
+ rec(root)
136
+ check.state(i == 0)
137
+
138
+
139
+ def dump(root: Part) -> str:
140
+ buf = io.StringIO()
141
+ dump_to(root, buf.write)
142
+ return buf.getvalue()
@@ -0,0 +1,11 @@
1
+ import typing as ta
2
+
3
+
4
+ T = ta.TypeVar('T')
5
+
6
+
7
+ ##
8
+
9
+
10
+ def all_same(l: ta.Sequence[T], r: ta.Sequence[T]) -> bool:
11
+ return len(l) == len(r) and all(x is y for x, y in zip(l, r, strict=True))
@@ -0,0 +1,59 @@
1
+ """
2
+ TODO:
3
+ - a reflowing.TextReflower
4
+ - import textwrap lol
5
+ - obviously handle hyphens, underscores, etc
6
+ - optionally preserve/normalize inter-sentence spaces - '. ' vs '. '
7
+ - detect if 'intentionally' smaller than current remaining line width, if so do not merge.
8
+ - maybe if only ending with punctuation?
9
+ - detect 'matched pairs' of 'quotes'? to preserve whitespace? `foo bar` ...
10
+ - how to escape it lol - if we see any \\` do we give up?
11
+ """
12
+ import re
13
+ import typing as ta
14
+
15
+
16
+ SpanKind: ta.TypeAlias = ta.Literal[
17
+ 'word',
18
+ 'space',
19
+ 'symbol',
20
+ ]
21
+
22
+
23
+ ##
24
+
25
+
26
+ class Span(ta.NamedTuple):
27
+ k: SpanKind
28
+ s: str
29
+
30
+ def __repr__(self) -> str:
31
+ return f'{self.k}:{self.s!r}'
32
+
33
+
34
+ _SPAN_PAT = re.compile(r'(\w+)|(\s+)')
35
+
36
+
37
+ def split_line_spans(s: str) -> list[Span]:
38
+ spans: list[Span] = []
39
+ p = 0
40
+ for m in _SPAN_PAT.finditer(s):
41
+ l, r = m.span()
42
+ if p < l:
43
+ spans.append(Span('symbol', s[p:l]))
44
+ if m.group(1):
45
+ spans.append(Span('word', m.group(1)))
46
+ else:
47
+ spans.append(Span('space', m.group(2)))
48
+ p = r
49
+ if p < len(s):
50
+ spans.append(Span('symbol', s[p:]))
51
+ return spans
52
+
53
+
54
+ def _main() -> None:
55
+ print(split_line_spans('hi i am a string! this has a hy-phen.'))
56
+
57
+
58
+ if __name__ == '__main__':
59
+ _main()
@@ -0,0 +1,51 @@
1
+ import dataclasses as dc
2
+
3
+
4
+ ##
5
+
6
+
7
+ @dc.dataclass(frozen=True)
8
+ class TextwrapOpts:
9
+ # The maximum width of wrapped lines (unless break_long_words is false).
10
+ width: int = 70 # noqa
11
+
12
+ _: dc.KW_ONLY
13
+
14
+ # String that will be prepended to the first line of wrapped output. Counts towards the line's width.
15
+ initial_indent: str = ''
16
+
17
+ # String that will be prepended to all lines save the first of wrapped output; also counts towards each line's
18
+ # width.
19
+ subsequent_indent: str = ''
20
+
21
+ # Expand tabs in input text to spaces before further processing. Each tab will become 0 .. 'tabsize' spaces,
22
+ # depending on its position in its line. If false, each tab is treated as a single character.
23
+ expand_tabs: bool = True
24
+
25
+ # Expand tabs in input text to 0 .. 'tabsize' spaces, unless 'expand_tabs' is false.
26
+ tabsize: int = 8
27
+
28
+ # Replace all whitespace characters in the input text by spaces after tab expansion. Note that if expand_tabs is
29
+ # false and replace_whitespace is true, every tab will be converted to a single space!
30
+ replace_whitespace: bool = True
31
+
32
+ # Ensure that sentence-ending punctuation is always followed by two spaces. Off by default because the algorithm is
33
+ # (unavoidably) imperfect.
34
+ fix_sentence_endings: bool = False
35
+
36
+ # Break words longer than 'width'. If false, those words will not be broken, and some lines might be longer than
37
+ # 'width'.
38
+ break_long_words: bool = True
39
+
40
+ # Allow breaking hyphenated words. If true, wrapping will occur preferably on whitespaces and right after hyphens
41
+ # part of compound words.
42
+ break_on_hyphens: bool = True
43
+
44
+ # Drop leading and trailing whitespace from lines.
45
+ drop_whitespace: bool = True
46
+
47
+ # Truncate wrapped lines.
48
+ max_lines: int | None = None
49
+
50
+ # Append to the last line of truncated text.
51
+ placeholder: str = ' [...]'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev472
3
+ Version: 0.0.0.dev474
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -18,7 +18,7 @@ Provides-Extra: all
18
18
  Requires-Dist: anyio~=4.11; extra == "all"
19
19
  Requires-Dist: sniffio~=1.3; extra == "all"
20
20
  Requires-Dist: greenlet~=3.2; extra == "all"
21
- Requires-Dist: trio~=0.31; extra == "all"
21
+ Requires-Dist: trio~=0.32; extra == "all"
22
22
  Requires-Dist: trio-asyncio~=0.15; extra == "all"
23
23
  Requires-Dist: lz4~=4.4; extra == "all"
24
24
  Requires-Dist: python-snappy~=0.7; extra == "all"
@@ -58,7 +58,7 @@ Provides-Extra: async
58
58
  Requires-Dist: anyio~=4.11; extra == "async"
59
59
  Requires-Dist: sniffio~=1.3; extra == "async"
60
60
  Requires-Dist: greenlet~=3.2; extra == "async"
61
- Requires-Dist: trio~=0.31; extra == "async"
61
+ Requires-Dist: trio~=0.32; extra == "async"
62
62
  Requires-Dist: trio-asyncio~=0.15; extra == "async"
63
63
  Provides-Extra: compress
64
64
  Requires-Dist: lz4~=4.4; extra == "compress"
@@ -234,7 +234,8 @@ dependencies of any kind**.
234
234
  - **[queries](https://github.com/wrmsr/omlish/blob/master/omlish/sql/queries)** - A SQL query builder with a fluent
235
235
  interface.
236
236
  - **[alchemy](https://github.com/wrmsr/omlish/blob/master/omlish/sql/alchemy)** - SQLAlchemy utilities. The codebase
237
- is moving away from SQLAlchemy however in favor of its own internal SQL api.
237
+ has moved away from SQLAlchemy in favor of its own internal SQL api, but it will likely still remain as an optional
238
+ dep for the api adapter.
238
239
 
239
240
  - **[testing](https://github.com/wrmsr/omlish/blob/master/omlish/testing)** - Test - primarily pytest - helpers,
240
241
  including:
@@ -294,8 +295,8 @@ examples are:
294
295
  - **pytest** - What is used for all standard testing - as lite code has no dependencies of any kind its testing uses
295
296
  stdlib's [unittest](https://docs.python.org/3/library/unittest.html).
296
297
  - **wrapt** - For (optionally-enabled) injector circular proxies.
297
- - **sqlalchemy** - Parts of the codebase use SQLAlchemy for db stuff, but it is being migrated away from in favor of the
298
- internal api. It will however likely still remain as an optional dep for the api adapter.
298
+ - **sqlalchemy** - The codebase has migrated away from SQLAlchemy in favor of the internal api but it retains it as an
299
+ optional dep to support adapting the internal api to it.
299
300
 
300
301
  Additionally, some catchall dep categories include:
301
302
 
@@ -1,5 +1,5 @@
1
1
  omlish/.omlish-manifests.json,sha256=FLw7xkPiSXuImZgqSP8BwrEib2R1doSzUPLUkc-QUIA,8410
2
- omlish/__about__.py,sha256=4-bUUNkRfpsKN_j34JrHTQA3yrraoqE3_gcf_eEzYFg,3611
2
+ omlish/__about__.py,sha256=35_ul-npqd8WV5dBJiHcOowqXVDo-ayDrD_0zvxyImg,3611
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=ZNIMl1kwg3qdei4DiUrJPQe5M81S1e76N-GuNSwLBAE,8683
5
5
  omlish/cached.py,sha256=MLap_p0rdGoDIMVhXVHm1tsbcWobJF0OanoodV03Ju8,542
@@ -67,9 +67,9 @@ omlish/codecs/funcs.py,sha256=or0Jogczuzk7csDTRl-HURMEjl8LXXqxxXYK45xcM5w,855
67
67
  omlish/codecs/registry.py,sha256=y7gjhBY1tTTHZmaK4X02zL5HD_25AAiZ8k27Op69Ag0,4006
68
68
  omlish/codecs/standard.py,sha256=eiZ4u9ep0XrA4Z_D1zJI0vmWyuN8HLrX4Se_r_Cq_ZM,60
69
69
  omlish/codecs/text.py,sha256=P9-xpdiQE3nbI5CzEentf07FBHPzD7_SwOtUQUJ01So,5710
70
- omlish/collections/__init__.py,sha256=cSNZ670-GaNW_sCazmLi41HPx5tfzMvkHCvPoyebTEY,2934
70
+ omlish/collections/__init__.py,sha256=zlyn2_SR1QaRomuqziEmONqSdgcalHjjULA66GiKOyk,3001
71
71
  omlish/collections/abc.py,sha256=p9zhL5oNV5WPyWmMn34fWfkuxPQAjOtL7WQA-Xsyhwk,2628
72
- omlish/collections/attrregistry.py,sha256=SPvIt8rT8nWvEBqf35I8wPgBU55m0u2ssSmNcYHm_FM,5563
72
+ omlish/collections/attrregistry.py,sha256=IvepCE4EcU0zsjPRC-A9LxXjMqkK8i2LmlekVHHSsaY,6231
73
73
  omlish/collections/bimap.py,sha256=3szDCscPJlFRtkpyVQNWneg4s50mr6Rd0jdTzVEIcnE,1661
74
74
  omlish/collections/coerce.py,sha256=tAls15v_7p5bUN33R7Zbko87KW5toWHl9fRialCqyNY,7030
75
75
  omlish/collections/frozen.py,sha256=drarjcMFpwKhBM01b1Gh6XDcaRaUgpyuxEiqppaKRkU,4220
@@ -202,22 +202,23 @@ omlish/dataclasses/tools/static.py,sha256=byDnPc0W15s3YPQNC9oyCASKVNxCytrHGLvDky
202
202
  omlish/diag/__init__.py,sha256=c1q8vuapGH1YiYdU300FIJXMI1MOcnLNBZXr-zc8BXk,1181
203
203
  omlish/diag/asts.py,sha256=MWh9XAG3m9L10FIJCyoNT2aU4Eft6tun_x9K0riq6Dk,3332
204
204
  omlish/diag/debug.py,sha256=ClED7kKXeVMyKrjGIxcq14kXk9kvUJfytBQwK9y7c4Q,1637
205
- omlish/diag/lslocks.py,sha256=VuA4MNNqXTcnHWsJvulGM6pNJRKmlXFXUZTfXpY0V6g,1750
206
- omlish/diag/lsof.py,sha256=5N5aZQ7UqEBgV-hj3_a8QcvALOeLlVb8otqF2hvucxY,9107
207
205
  omlish/diag/procfs.py,sha256=eeB3L9UpNBpAfsax3U6OczayYboPlFzOGplqlQ4gBNY,9700
208
206
  omlish/diag/procstats.py,sha256=EJEe2Zc58ykBoTfqMXro7H52aQa_pd6uC2hsIPFceso,825
209
- omlish/diag/ps.py,sha256=MEpMU6fbkh0bSWrOHh_okOa0JDTUSUQUVSYBdh1TGvE,1672
210
207
  omlish/diag/pycharm.py,sha256=_WVmPm1E66cBtR4ukgUAaApe_3rX9Cv3sQRP5PL37P8,5013
211
208
  omlish/diag/pydevd.py,sha256=JEHC0hiSJxL-vVtuxKUi1BNkgUKnRC1N4alDg6JP5WQ,8363
212
209
  omlish/diag/threads.py,sha256=sjtlTl41wxssoVCDkBB6xeLF-9kJEK3eA6hmSFWJSQA,3643
213
210
  omlish/diag/timers.py,sha256=cxX3GgjTIjBx9DI4pzCCO5Hfqb1TM3uo22yim7kjfRU,3831
214
211
  omlish/diag/_pycharm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
215
212
  omlish/diag/_pycharm/runhack.py,sha256=IxawPyqrPfY1fpV1D_9dZXxny89fVSR3RlmqlbaRctw,37869
213
+ omlish/diag/cmds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
214
+ omlish/diag/cmds/lslocks.py,sha256=iEYe3OqcbMCKg1NbtO2EsYsnr2GnDYnNdi6Cbb_zEKM,1756
215
+ omlish/diag/cmds/lsof.py,sha256=hmrEZJNY0rQxa42t2Y3e3w5ZVe8rJqO2eI7_8HmzZEQ,9113
216
+ omlish/diag/cmds/ps.py,sha256=Ff0JusuXhJqpZ4w5cpOwovoRftQUtaKjT5YTtHfazl4,1678
216
217
  omlish/diag/replserver/__init__.py,sha256=uLo6V2aQ29v9z3IMELlPDSlG3_2iOT4-_X8VniF-EgE,235
217
218
  omlish/diag/replserver/__main__.py,sha256=LmU41lQ58bm1h4Mx7S8zhE_uEBSC6kPcp9mn5JRpulA,32
218
219
  omlish/diag/replserver/console.py,sha256=MxDLslAaYfC-l0rfGO-SnYAJ__8RWBJQ5FxGi29czYU,7438
219
220
  omlish/diag/replserver/server.py,sha256=zTeyaARK22KwaqCOzG8H8Rk009en7gBxOBaJcRB1jbM,5402
220
- omlish/dispatch/__init__.py,sha256=UwVT6SSk5HKk9xF9vc_UJD8BDSIQWSw98Ldx-G-6PC0,166
221
+ omlish/dispatch/__init__.py,sha256=OlebxKvMJs2nT36p3xCB4arA3Ln0pnQvfwBaUJ5SdiE,284
221
222
  omlish/dispatch/dispatch.py,sha256=TzWihCt9Zr8wfIwVpKHVOOrYFVKpDXRevxYomtEfqYc,3176
222
223
  omlish/dispatch/functions.py,sha256=cwNzGIg2ZIalEgn9I03cnJVbMTHjWloyDTaowlO3UPs,1524
223
224
  omlish/dispatch/impls.py,sha256=3kyLw5yiYXWCN1DiqQbD1czMVrM8v1mpQ8NyD0tUrnk,1870
@@ -270,7 +271,7 @@ omlish/formats/json/backends/jiter.py,sha256=8qv_XWGpcupPtVm6Z_egHio_iY1Kk8eqkvX
270
271
  omlish/formats/json/backends/orjson.py,sha256=X2jhKgUYYwaVuAppPQmfyncbOs2PJ7drqH5BioP-AYI,3831
271
272
  omlish/formats/json/backends/std.py,sha256=Hhiug5CkC1TXLFrE9rnMR2on7xP-RliSvfYA9ill_U0,3159
272
273
  omlish/formats/json/backends/ujson.py,sha256=U3iOlAURfiCdXbiNlXfIjDdtJDbDaLZsSuZriTUvbxs,2307
273
- omlish/formats/json/stream/__init__.py,sha256=LoYSkdUX3lkQ4g9JB_F6YOeexlOEporKW8bW8tv3YXg,859
274
+ omlish/formats/json/stream/__init__.py,sha256=YIRCs5ckY_y1v08OwGGtU4nXlo-ByO4IsibTlZZIsAM,1366
274
275
  omlish/formats/json/stream/building.py,sha256=QAQaTyXuw9vkfhvzWIh_DSlypD1-HgzO855Dgz3_wFM,2517
275
276
  omlish/formats/json/stream/errors.py,sha256=c8M8UAYmIZ-vWZLeKD2jMj4EDCJbr9QR8Jq_DyHjujQ,43
276
277
  omlish/formats/json/stream/lexing.py,sha256=FeO7sjCQ6HHBj7VJIwkSxMPUneG1KqDyN-zuACdE_rw,17384
@@ -323,17 +324,17 @@ omlish/http/urls.py,sha256=dZBeQwf5ogKwsD_uCEei5EG_SbnHk-MzpX2FYLsfTgM,1774
323
324
  omlish/http/versions.py,sha256=Lwk6FztKH7c5zuc7NFWxPVULuLeeQp5-NFJInY6r-Zo,420
324
325
  omlish/http/wsgi.py,sha256=1JpfrY2JrQ0wrEVE0oLdQMWZw8Zcx0b4_9f3VmH4JKA,1070
325
326
  omlish/http/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
326
- omlish/http/clients/asyncs.py,sha256=YJKin04lXSrhn8tgs2gMEo8Fy4jWkPhy6ZaWi1fVnko,4427
327
+ omlish/http/clients/asyncs.py,sha256=QrbavgXv4BuQFW0bRojy-dxa_jpxjPVLA7eyfo1zzns,4230
327
328
  omlish/http/clients/base.py,sha256=bm3Oy2wuunSO3Rd2dxCmhHoZcQ8X9B5pkzaudbjZKvI,2810
328
- omlish/http/clients/default.py,sha256=fnz-pvPKHc7Kgft4XRwOZ6ZUUtt5D6ljuvOGAA8mgQw,5639
329
- omlish/http/clients/executor.py,sha256=A9LLTR3O_-_hH6HAB3hvf5uBv9SwLL5YOW3YWVb20Js,1580
330
- omlish/http/clients/httpx.py,sha256=8CVA9nNVKSkKcEynu34GxcbfVaz3PBA_UBx3-NFKDrw,4448
329
+ omlish/http/clients/default.py,sha256=yQ7kOxlU-Dds8NdIJszeHkgnxtiJd6W-d0oUhKXTaYI,5653
330
+ omlish/http/clients/executor.py,sha256=r66xoGWdRsaSpfGtx8ovf3pOMG3k4UONlZEQZ58KAS0,1854
331
+ omlish/http/clients/httpx.py,sha256=T1Pa9Of6GylTmt9AGp8D6Uni3HxOtP7OPsImo35Kc1o,4029
331
332
  omlish/http/clients/middleware.py,sha256=xnXlNN1MU4sUKtkhPzdpRQsRh9wpLf1r7OGKjqGzLWg,5058
332
- omlish/http/clients/sync.py,sha256=zs6XzFHKwKhKuBwb6hJFaYOcBY-4QVEsa0udFOoU0QM,4058
333
- omlish/http/clients/syncasync.py,sha256=veVSD-uqOzePAUzhXOoJvMF6fHLOkzXYbviQ9x18l1k,1215
334
- omlish/http/clients/urllib.py,sha256=BwxlDEiJQZA6sogcqTtuog6WEK2OhVNLR70F50lXA9I,2764
333
+ omlish/http/clients/sync.py,sha256=jVbqbUlruuaNFKUYQr55kVF6bwcIZgeaLyLclXM_T5w,3891
334
+ omlish/http/clients/syncasync.py,sha256=nhQlcds4BWib_gphhGElUdA_0uJ0tD1lV1At-fr13Q0,1401
335
+ omlish/http/clients/urllib.py,sha256=c8TQITZYRo5RrdxaNhsE2QoeDw4mZW0wLzoIsWYTYwU,2852
335
336
  omlish/http/clients/coro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
336
- omlish/http/clients/coro/sync.py,sha256=JCWSCsDP7rFBRQSxzB7WmBBwRdAfLFRGI-F_4f0jiPQ,5673
337
+ omlish/http/clients/coro/sync.py,sha256=Fk1KdJf9q6ba2-7HWzj7Tb-ibBuj5VIV5f4SCziP-C8,5762
337
338
  omlish/http/coro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
338
339
  omlish/http/coro/io.py,sha256=d97Oa7KlgMP7BQWdhUbOv3sfA96uWyMtjJF7lJFwZC0,1090
339
340
  omlish/http/coro/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -390,9 +391,10 @@ omlish/inject/impl/scopes.py,sha256=sqtjHe6g0pAEOHqIARXGiIE9mKmGmlqh1FDpskV4TIw,
390
391
  omlish/inject/impl/sync.py,sha256=_aLaC-uVNHOePcfE1as61Ni7fuyHZpjEafIWBc7FvC0,1049
391
392
  omlish/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
392
393
  omlish/io/abc.py,sha256=M40QB2udYpCEqmlxCcHv6FlJYJY6ymmJQBlaklYv0U8,1256
393
- omlish/io/buffers.py,sha256=GuddTeEeaNU4Ep2NWEeS-8ZO05JF8guPCGeTBNQ3mek,7351
394
+ omlish/io/buffers.py,sha256=eeDSG0mhwx1IAYPu3pSe-ce3LG5WpQz924OsRyLu0mI,10935
394
395
  omlish/io/fileno.py,sha256=_W3qxkIKpnabn1_7kgmKdx0IsPF3R334xWnF_TtkEj4,185
395
396
  omlish/io/pyio.py,sha256=xmHTV-sn7QZThWCVBo6lTM7dhgsQn7m2L0DqRwdF2-8,94509
397
+ omlish/io/readers.py,sha256=w67uZQbWzed4Ton2kyA_WRrRz-IRXmFip8EJtpAxLYU,583
396
398
  omlish/io/compress/__init__.py,sha256=fJFPT4ONfqxmsA4jR6qbMt2woIyyEgnc_qOWK9o1kII,247
397
399
  omlish/io/compress/abc.py,sha256=P9YoQX8XYoq2UfBsinKLUuwwqV1ODUIJzjTraRWGF1M,3090
398
400
  omlish/io/compress/adapters.py,sha256=LJHhjwMHXstoLyX_q0QhGoBAcqyYGWfzhzQbGBXHzHY,6148
@@ -486,7 +488,7 @@ omlish/lite/attrops.py,sha256=02DNBjOl27NjznkwolgPwtWpA1q3UPUuwOjHsgG4oLo,11381
486
488
  omlish/lite/cached.py,sha256=AF0PdB2k4h2dyNc5tzrmnNrb9zKnoMPQU3WA8KrhS_o,3108
487
489
  omlish/lite/check.py,sha256=ytCkwZoKfOlJqylL-AGm8C2WfsWJd2q3kFbnZCzX3_M,13844
488
490
  omlish/lite/configs.py,sha256=4-1uVxo-aNV7vMKa7PVNhM610eejG1WepB42-Dw2xQI,914
489
- omlish/lite/contextmanagers.py,sha256=usDzBoNqJi98AccVlwgZoMvoBXOe9wyx2MreZtWhJy4,5863
491
+ omlish/lite/contextmanagers.py,sha256=McvPC6VsQlUHzwAppHgmo0RviABPGOAEdDsGPn7dShw,5879
490
492
  omlish/lite/dataclasses.py,sha256=Kxr68nTinRAkdWFGeu8C2qLul8iw6bxpbqqp20yxZfg,5064
491
493
  omlish/lite/imports.py,sha256=GyEDKL-WuHtdOKIL-cc8aFd0-bHwZFDEjAB52ItabX0,1341
492
494
  omlish/lite/inject.py,sha256=BQgjBj2mzJgMimLam-loSpQzcb31-8NYPVRQgHVv3cQ,29159
@@ -634,7 +636,7 @@ omlish/os/pidfiles/__main__.py,sha256=nfjVxFY9I2I7hfb81rCxX6zm2Rc3P87ySpUouy33vG
634
636
  omlish/os/pidfiles/cli.py,sha256=dAKukx4mrarH8t7KZM4n_XSfTk3ycShGAFqRrirK5dw,2079
635
637
  omlish/os/pidfiles/manager.py,sha256=oOnL90ttOG5ba_k9XPJ18reP7M5S-_30ln4OAfYV5W8,2357
636
638
  omlish/os/pidfiles/pidfile.py,sha256=KlqrW7I-lYVDNJspFHE89i_A0HTTteT5B99b7vpTfNs,4400
637
- omlish/os/pidfiles/pinning.py,sha256=WGK0kmMBhH1isGSdpm9fKJQqjaL7kxCuT-aAaaYCyn4,6666
639
+ omlish/os/pidfiles/pinning.py,sha256=JJBpW-9cM9Jv_2l0LP4vXQhpx8EnjFaLUnt1FnxrKhw,6676
638
640
  omlish/reflect/__init__.py,sha256=omD3VLFQtYTwPxrTH6gLATQIax9sTGGKc-7ps96-q0g,1202
639
641
  omlish/reflect/inspect.py,sha256=dUrVz8VfAdLVFtFpW416DxzVC17D80cvFb_g2Odzgq8,1823
640
642
  omlish/reflect/ops.py,sha256=4mGvFMw5D6XGbhDhdCqZ1dZsiqezUTenDv63FIDohpY,3029
@@ -830,6 +832,16 @@ omlish/text/minja.py,sha256=7UKNalkWpTG_364OIo7p5ym--uiNPR2RFBW_W8rrO4I,9194
830
832
  omlish/text/parts.py,sha256=MFi-ANxXlBiOMqW2y2S0BRg6xDwPYxSXSfrYPM3rtcE,6669
831
833
  omlish/text/random.py,sha256=8feS5JE_tSjYlMl-lp0j93kCfzBae9AM2cXlRLebXMA,199
832
834
  omlish/text/templating.py,sha256=i-HU7W-GtKdnBhEG3mnSey5ig7vV0q02D3pVzMoOzJY,3318
835
+ omlish/text/textwrap.py,sha256=fTe04E4T5MpMGLz5QOTfT8T93FdiIT1tohEpzL28_zI,1874
836
+ omlish/text/docwrap/__init__.py,sha256=NQh0gVyJSxUOAX7nnwsAOwHVPeuZ8abVaN5topQI6gE,42
837
+ omlish/text/docwrap/api.py,sha256=cePtl2fLb1FwWN0z6dL5CquAt1AiH0aEEiGp7ijF-Wo,1602
838
+ omlish/text/docwrap/groups.py,sha256=8__fk1q3KX7tRBcWQ2RprpFS2p4QYnRtCNOxbUBaOVI,1887
839
+ omlish/text/docwrap/lists.py,sha256=8ZTfXV-hJaTZTf0jAkODke0Z87kZDS5w-xGqNlc0U_c,4693
840
+ omlish/text/docwrap/parts.py,sha256=IaW_qRvIiP3e12OhFgTIa_qKamQX4MAps-BG5CT_dDw,3338
841
+ omlish/text/docwrap/reflowing.py,sha256=F1mrGpNvTPfII8LpnZGCU4aoUxEvh91iL1mfswHB98U,2584
842
+ omlish/text/docwrap/rendering.py,sha256=SmnkLdePgK4qH0f3lGRY94NfRKJNdTlUaTgzo6RjEnM,2848
843
+ omlish/text/docwrap/utils.py,sha256=n4oFWgA9PBC_77vYrH8H7uFR2s8bcFqDtrCWTcyhGFw,188
844
+ omlish/text/docwrap/wrapping.py,sha256=VyECcYTpjPz7SidT8PJi7mLTg4bGLzaME1H3G5Ub0Yg,1314
833
845
  omlish/text/go/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
834
846
  omlish/text/go/quoting.py,sha256=zbcPEDWsdj7GAemtu0x8nwMqpIu2C_5iInSwn6mMWlE,9142
835
847
  omlish/typedvalues/__init__.py,sha256=dQpM8VaON8S7dUv1LBwhyBDjUVo7EW475a9DpnDQz1E,936
@@ -842,9 +854,9 @@ omlish/typedvalues/marshal.py,sha256=2xqX6JllhtGpmeYkU7C-qzgU__0x-vd6CzYbAsocQlc
842
854
  omlish/typedvalues/of_.py,sha256=UXkxSj504WI2UrFlqdZJbu2hyDwBhL7XVrc2qdR02GQ,1309
843
855
  omlish/typedvalues/reflect.py,sha256=PAvKW6T4cW7u--iX80w3HWwZUS3SmIZ2_lQjT65uAyk,1026
844
856
  omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
845
- omlish-0.0.0.dev472.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
846
- omlish-0.0.0.dev472.dist-info/METADATA,sha256=YdE7vkMrfcNoa_DIKW5K9O1_DbzdmLKAYEdiUS3kw2Y,18999
847
- omlish-0.0.0.dev472.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
848
- omlish-0.0.0.dev472.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
849
- omlish-0.0.0.dev472.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
850
- omlish-0.0.0.dev472.dist-info/RECORD,,
857
+ omlish-0.0.0.dev474.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
858
+ omlish-0.0.0.dev474.dist-info/METADATA,sha256=sTrBg5y3IV8XQuez3bmFN_mIxOqGGArfERXAKffXCFw,19032
859
+ omlish-0.0.0.dev474.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
860
+ omlish-0.0.0.dev474.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
861
+ omlish-0.0.0.dev474.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
862
+ omlish-0.0.0.dev474.dist-info/RECORD,,