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.
- omlish/__about__.py +3 -3
- omlish/collections/__init__.py +4 -0
- omlish/collections/attrregistry.py +32 -4
- omlish/diag/cmds/__init__.py +0 -0
- omlish/diag/{lslocks.py → cmds/lslocks.py} +6 -6
- omlish/diag/{lsof.py → cmds/lsof.py} +6 -6
- omlish/diag/{ps.py → cmds/ps.py} +6 -6
- omlish/dispatch/__init__.py +18 -12
- omlish/formats/json/stream/__init__.py +13 -0
- omlish/http/clients/asyncs.py +11 -17
- omlish/http/clients/coro/sync.py +3 -2
- omlish/http/clients/default.py +2 -2
- omlish/http/clients/executor.py +8 -2
- omlish/http/clients/httpx.py +29 -46
- omlish/http/clients/sync.py +11 -17
- omlish/http/clients/syncasync.py +8 -2
- omlish/http/clients/urllib.py +2 -1
- omlish/io/buffers.py +115 -0
- omlish/io/readers.py +29 -0
- omlish/lite/contextmanagers.py +4 -4
- omlish/os/pidfiles/pinning.py +2 -2
- omlish/text/docwrap/__init__.py +3 -0
- omlish/text/docwrap/api.py +77 -0
- omlish/text/docwrap/groups.py +84 -0
- omlish/text/docwrap/lists.py +167 -0
- omlish/text/docwrap/parts.py +139 -0
- omlish/text/docwrap/reflowing.py +103 -0
- omlish/text/docwrap/rendering.py +142 -0
- omlish/text/docwrap/utils.py +11 -0
- omlish/text/docwrap/wrapping.py +59 -0
- omlish/text/textwrap.py +51 -0
- {omlish-0.0.0.dev472.dist-info → omlish-0.0.0.dev474.dist-info}/METADATA +7 -6
- {omlish-0.0.0.dev472.dist-info → omlish-0.0.0.dev474.dist-info}/RECORD +37 -25
- {omlish-0.0.0.dev472.dist-info → omlish-0.0.0.dev474.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev472.dist-info → omlish-0.0.0.dev474.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev472.dist-info → omlish-0.0.0.dev474.dist-info}/licenses/LICENSE +0 -0
- {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,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()
|
omlish/text/textwrap.py
ADDED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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** -
|
|
298
|
-
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
329
|
-
omlish/http/clients/executor.py,sha256=
|
|
330
|
-
omlish/http/clients/httpx.py,sha256=
|
|
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=
|
|
333
|
-
omlish/http/clients/syncasync.py,sha256=
|
|
334
|
-
omlish/http/clients/urllib.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
846
|
-
omlish-0.0.0.
|
|
847
|
-
omlish-0.0.0.
|
|
848
|
-
omlish-0.0.0.
|
|
849
|
-
omlish-0.0.0.
|
|
850
|
-
omlish-0.0.0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|