omlish 0.0.0.dev213__py3-none-any.whl → 0.0.0.dev214__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.
- omlish/.manifests.json +4 -4
- omlish/__about__.py +3 -5
- omlish/antlr/__init__.py +3 -0
- omlish/antlr/parsing.py +34 -2
- omlish/asyncs/asyncio/asyncio.py +34 -0
- omlish/asyncs/ioproxy/all.py +32 -0
- omlish/asyncs/ioproxy/io.py +13 -13
- omlish/asyncs/ioproxy/proxier.py +30 -30
- omlish/asyncs/ioproxy/typing.py +3 -3
- omlish/formats/json/stream/lex.py +1 -0
- omlish/formats/json5/Json5.g4 +172 -0
- omlish/formats/json5/__init__.py +8 -0
- omlish/formats/json5/_antlr/Json5Lexer.py +353 -0
- omlish/formats/json5/_antlr/Json5Listener.py +78 -0
- omlish/formats/json5/_antlr/Json5Parser.py +616 -0
- omlish/formats/json5/_antlr/Json5Visitor.py +51 -0
- omlish/formats/json5/_antlr/__init__.py +0 -0
- omlish/formats/{json5.py → json5/codec.py} +6 -11
- omlish/formats/json5/errors.py +2 -0
- omlish/formats/json5/literals.py +130 -0
- omlish/formats/json5/parsing.py +79 -0
- omlish/lang/__init__.py +2 -0
- omlish/lang/imports.py +4 -0
- omlish/lang/strings.py +33 -1
- omlish/os/files.py +17 -30
- omlish/os/temp.py +50 -0
- {omlish-0.0.0.dev213.dist-info → omlish-0.0.0.dev214.dist-info}/METADATA +5 -7
- {omlish-0.0.0.dev213.dist-info → omlish-0.0.0.dev214.dist-info}/RECORD +32 -20
- {omlish-0.0.0.dev213.dist-info → omlish-0.0.0.dev214.dist-info}/LICENSE +0 -0
- {omlish-0.0.0.dev213.dist-info → omlish-0.0.0.dev214.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev213.dist-info → omlish-0.0.0.dev214.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev213.dist-info → omlish-0.0.0.dev214.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,130 @@
|
|
1
|
+
"""
|
2
|
+
https://spec.json5.org/
|
3
|
+
"""
|
4
|
+
import io
|
5
|
+
import json
|
6
|
+
import typing as ta
|
7
|
+
|
8
|
+
from ... import lang
|
9
|
+
from .errors import Json5Error
|
10
|
+
|
11
|
+
|
12
|
+
##
|
13
|
+
|
14
|
+
|
15
|
+
LITERAL_VALUES: ta.Mapping[str, ta.Any] = {
|
16
|
+
'true': True,
|
17
|
+
'false': False,
|
18
|
+
'null': None,
|
19
|
+
}
|
20
|
+
|
21
|
+
|
22
|
+
##
|
23
|
+
|
24
|
+
|
25
|
+
STRING_LITERAL_ESCAPES: ta.Mapping[str, str] = {
|
26
|
+
'b': '\\u0008',
|
27
|
+
'f': '\\u000C',
|
28
|
+
'n': '\\u000A',
|
29
|
+
'r': '\\u000D',
|
30
|
+
't': '\\u0009',
|
31
|
+
'v': '\\u000B',
|
32
|
+
'0': '\\u0000',
|
33
|
+
'u': '\\u',
|
34
|
+
'"': '\\"',
|
35
|
+
"'": "'",
|
36
|
+
'\\': '\\\\',
|
37
|
+
}
|
38
|
+
|
39
|
+
|
40
|
+
def _check_state(b: bool, fmt: str = 'Json5 error', *args: ta.Any) -> None:
|
41
|
+
if not b:
|
42
|
+
raise Json5Error(fmt % args)
|
43
|
+
|
44
|
+
|
45
|
+
def translate_string_literal(s: str) -> str:
|
46
|
+
_check_state(len(s) > 1)
|
47
|
+
q = s[0]
|
48
|
+
_check_state(q in '\'"')
|
49
|
+
_check_state(s[-1] == q)
|
50
|
+
|
51
|
+
c = 1
|
52
|
+
e = len(s) - 1
|
53
|
+
|
54
|
+
b = io.StringIO()
|
55
|
+
b.write('"')
|
56
|
+
|
57
|
+
ds = '\\\'"'
|
58
|
+
while True:
|
59
|
+
n = lang.find_any(s, ds, c, e)
|
60
|
+
if n < 0:
|
61
|
+
b.write(s[c:e])
|
62
|
+
break
|
63
|
+
|
64
|
+
_check_state(n < e)
|
65
|
+
b.write(s[c:n])
|
66
|
+
|
67
|
+
x = s[n]
|
68
|
+
if x == '\\':
|
69
|
+
_check_state(n < (e - 1))
|
70
|
+
|
71
|
+
y = s[n + 1]
|
72
|
+
if y in '\n\u2028\u2029':
|
73
|
+
c = n + 2
|
74
|
+
|
75
|
+
elif y == '\r':
|
76
|
+
c = n + 2
|
77
|
+
if c < e and s[c] == '\n':
|
78
|
+
c += 1
|
79
|
+
|
80
|
+
elif y in 'x':
|
81
|
+
_check_state(n < (e - 3))
|
82
|
+
u = int(s[n + 2:n + 4], 16)
|
83
|
+
b.write(f'\\u00{u:02x}')
|
84
|
+
c = n + 4
|
85
|
+
|
86
|
+
elif (g := STRING_LITERAL_ESCAPES.get(y)) is not None:
|
87
|
+
b.write(g)
|
88
|
+
c = n + 2
|
89
|
+
|
90
|
+
elif not ('0' <= y <= '9'):
|
91
|
+
b.write(y)
|
92
|
+
c = n + 2
|
93
|
+
|
94
|
+
else:
|
95
|
+
raise Json5Error(f'Invalid string literal escape: {x}{y}')
|
96
|
+
|
97
|
+
elif x in '\\\'"':
|
98
|
+
_check_state(x != q)
|
99
|
+
if x == '"':
|
100
|
+
b.write('\\"')
|
101
|
+
else:
|
102
|
+
b.write(x)
|
103
|
+
c = n + 1
|
104
|
+
|
105
|
+
else:
|
106
|
+
raise RuntimeError
|
107
|
+
|
108
|
+
b.write('"')
|
109
|
+
return b.getvalue()
|
110
|
+
|
111
|
+
|
112
|
+
def parse_string_literal(s: str) -> str:
|
113
|
+
j = translate_string_literal(s)
|
114
|
+
|
115
|
+
try:
|
116
|
+
return json.loads(j)
|
117
|
+
except json.JSONDecodeError as e:
|
118
|
+
raise Json5Error from e
|
119
|
+
|
120
|
+
|
121
|
+
##
|
122
|
+
|
123
|
+
|
124
|
+
def parse_number_literal(s: str) -> int | float:
|
125
|
+
s = s.lower()
|
126
|
+
|
127
|
+
if 'x' in s:
|
128
|
+
return int(s, 16)
|
129
|
+
else:
|
130
|
+
return float(s)
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# ruff: noqa: N802
|
2
|
+
import typing as ta
|
3
|
+
|
4
|
+
from omlish import antlr
|
5
|
+
|
6
|
+
from ._antlr.Json5Lexer import Json5Lexer # type: ignore
|
7
|
+
from ._antlr.Json5Parser import Json5Parser # type: ignore
|
8
|
+
from ._antlr.Json5Visitor import Json5Visitor # type: ignore
|
9
|
+
from .errors import Json5Error
|
10
|
+
from .literals import LITERAL_VALUES
|
11
|
+
from .literals import parse_number_literal
|
12
|
+
from .literals import parse_string_literal
|
13
|
+
|
14
|
+
|
15
|
+
class Json5ParseVisitor(antlr.parsing.StandardParseTreeVisitor, Json5Visitor):
|
16
|
+
def visitArr(self, ctx: Json5Parser.ArrContext):
|
17
|
+
return [self.visit(e) for e in ctx.value()]
|
18
|
+
|
19
|
+
def visitKey(self, ctx: Json5Parser.KeyContext):
|
20
|
+
if (s := ctx.STRING()) is not None:
|
21
|
+
return parse_string_literal(s.getText())
|
22
|
+
|
23
|
+
elif (i := ctx.IDENTIFIER()) is not None:
|
24
|
+
return parse_string_literal(''.join(['"', i.getText(), '"']))
|
25
|
+
|
26
|
+
elif (l := ctx.LITERAL()) is not None:
|
27
|
+
return LITERAL_VALUES[l.getText()]
|
28
|
+
|
29
|
+
elif (n := ctx.NUMERIC_LITERAL()) is not None:
|
30
|
+
return n.getText()
|
31
|
+
|
32
|
+
else:
|
33
|
+
raise RuntimeError(ctx)
|
34
|
+
|
35
|
+
def visitNumber(self, ctx: Json5Parser.NumberContext):
|
36
|
+
return parse_number_literal(ctx.getText())
|
37
|
+
|
38
|
+
def visitObj(self, ctx: Json5Parser.ObjContext):
|
39
|
+
dct: dict[ta.Any, ta.Any] = {}
|
40
|
+
for pair in ctx.pair():
|
41
|
+
key, value = self.visit(pair)
|
42
|
+
dct[key] = value
|
43
|
+
return dct
|
44
|
+
|
45
|
+
def visitPair(self, ctx: Json5Parser.PairContext):
|
46
|
+
key = self.visit(ctx.key())
|
47
|
+
value = self.visit(ctx.value())
|
48
|
+
return (key, value)
|
49
|
+
|
50
|
+
def visitValue(self, ctx: Json5Parser.ValueContext):
|
51
|
+
if (s := ctx.STRING()) is not None:
|
52
|
+
return parse_string_literal(s.getText())
|
53
|
+
|
54
|
+
elif (n := ctx.LITERAL()) is not None:
|
55
|
+
return LITERAL_VALUES[n.getText()]
|
56
|
+
|
57
|
+
else:
|
58
|
+
return super().visitChildren(ctx)
|
59
|
+
|
60
|
+
|
61
|
+
def parse(buf: str) -> ta.Any:
|
62
|
+
try:
|
63
|
+
parser = antlr.parsing.make_parser(
|
64
|
+
buf,
|
65
|
+
Json5Lexer,
|
66
|
+
Json5Parser,
|
67
|
+
silent_errors=True,
|
68
|
+
)
|
69
|
+
|
70
|
+
root = parser.json5()
|
71
|
+
|
72
|
+
except antlr.errors.ParseError as e:
|
73
|
+
raise Json5Error from e
|
74
|
+
|
75
|
+
if antlr.parsing.is_eof_context(root):
|
76
|
+
raise Json5Error('Empty input')
|
77
|
+
|
78
|
+
visitor = Json5ParseVisitor()
|
79
|
+
return visitor.visit(root)
|
omlish/lang/__init__.py
CHANGED
@@ -200,6 +200,7 @@ from .strings import ( # noqa
|
|
200
200
|
BOOL_TRUE_STRINGS,
|
201
201
|
STRING_BOOL_VALUES,
|
202
202
|
camel_case,
|
203
|
+
find_any,
|
203
204
|
indent_lines,
|
204
205
|
is_dunder,
|
205
206
|
is_ident,
|
@@ -209,6 +210,7 @@ from .strings import ( # noqa
|
|
209
210
|
prefix_delimited,
|
210
211
|
prefix_lines,
|
211
212
|
replace_many,
|
213
|
+
rfind_any,
|
212
214
|
snake_case,
|
213
215
|
strip_prefix,
|
214
216
|
strip_suffix,
|
omlish/lang/imports.py
CHANGED
omlish/lang/strings.py
CHANGED
@@ -42,7 +42,8 @@ def strip_suffix(s: StrOrBytesT, sfx: StrOrBytesT) -> StrOrBytesT:
|
|
42
42
|
def replace_many(
|
43
43
|
s: StrOrBytesT,
|
44
44
|
old: ta.Iterable[StrOrBytesT],
|
45
|
-
new: StrOrBytesT,
|
45
|
+
new: StrOrBytesT,
|
46
|
+
count_each: int = -1,
|
46
47
|
) -> StrOrBytesT:
|
47
48
|
for o in old:
|
48
49
|
s = s.replace(o, new, count_each) # type: ignore
|
@@ -52,6 +53,37 @@ def replace_many(
|
|
52
53
|
##
|
53
54
|
|
54
55
|
|
56
|
+
def find_any(
|
57
|
+
string: StrOrBytesT,
|
58
|
+
subs: ta.Iterable[StrOrBytesT],
|
59
|
+
start: int | None = None,
|
60
|
+
end: int | None = None,
|
61
|
+
) -> int:
|
62
|
+
r = -1
|
63
|
+
for sub in subs:
|
64
|
+
if (p := string.find(sub, start, end)) >= 0: # type: ignore
|
65
|
+
if r < 0 or p < r:
|
66
|
+
r = p
|
67
|
+
return r
|
68
|
+
|
69
|
+
|
70
|
+
def rfind_any(
|
71
|
+
string: StrOrBytesT,
|
72
|
+
subs: ta.Iterable[StrOrBytesT],
|
73
|
+
start: int | None = None,
|
74
|
+
end: int | None = None,
|
75
|
+
) -> int:
|
76
|
+
r = -1
|
77
|
+
for sub in subs:
|
78
|
+
if (p := string.rfind(sub, start, end)) >= 0: # type: ignore
|
79
|
+
if r < 0 or p > r:
|
80
|
+
r = p
|
81
|
+
return r
|
82
|
+
|
83
|
+
|
84
|
+
##
|
85
|
+
|
86
|
+
|
55
87
|
def camel_case(name: str, *, lower: bool = False) -> str:
|
56
88
|
if not name:
|
57
89
|
return ''
|
omlish/os/files.py
CHANGED
@@ -1,38 +1,10 @@
|
|
1
|
+
# ruff: noqa: UP006 UP007
|
2
|
+
# @omlish-lite
|
1
3
|
import contextlib
|
2
4
|
import os
|
3
|
-
import shutil
|
4
|
-
import tempfile
|
5
5
|
import typing as ta
|
6
6
|
|
7
7
|
|
8
|
-
@contextlib.contextmanager
|
9
|
-
def tmp_dir(
|
10
|
-
root_dir: str | None = None,
|
11
|
-
cleanup: bool = True,
|
12
|
-
**kwargs: ta.Any,
|
13
|
-
) -> ta.Iterator[str]:
|
14
|
-
path = tempfile.mkdtemp(dir=root_dir, **kwargs)
|
15
|
-
try:
|
16
|
-
yield path
|
17
|
-
finally:
|
18
|
-
if cleanup:
|
19
|
-
shutil.rmtree(path, ignore_errors=True)
|
20
|
-
|
21
|
-
|
22
|
-
@contextlib.contextmanager
|
23
|
-
def tmp_file(
|
24
|
-
root_dir: str | None = None,
|
25
|
-
cleanup: bool = True,
|
26
|
-
**kwargs: ta.Any,
|
27
|
-
) -> ta.Iterator[tempfile._TemporaryFileWrapper]: # noqa
|
28
|
-
with tempfile.NamedTemporaryFile(dir=root_dir, delete=False, **kwargs) as f:
|
29
|
-
try:
|
30
|
-
yield f
|
31
|
-
finally:
|
32
|
-
if cleanup:
|
33
|
-
shutil.rmtree(f.name, ignore_errors=True)
|
34
|
-
|
35
|
-
|
36
8
|
def touch(self, mode: int = 0o666, exist_ok: bool = True) -> None:
|
37
9
|
if exist_ok:
|
38
10
|
# First try to bump modification time
|
@@ -48,3 +20,18 @@ def touch(self, mode: int = 0o666, exist_ok: bool = True) -> None:
|
|
48
20
|
flags |= os.O_EXCL
|
49
21
|
fd = os.open(self, flags, mode)
|
50
22
|
os.close(fd)
|
23
|
+
|
24
|
+
|
25
|
+
def unlink_if_exists(path: str) -> None:
|
26
|
+
try:
|
27
|
+
os.unlink(path)
|
28
|
+
except FileNotFoundError:
|
29
|
+
pass
|
30
|
+
|
31
|
+
|
32
|
+
@contextlib.contextmanager
|
33
|
+
def unlinking_if_exists(path: str) -> ta.Iterator[None]:
|
34
|
+
try:
|
35
|
+
yield
|
36
|
+
finally:
|
37
|
+
unlink_if_exists(path)
|
omlish/os/temp.py
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# ruff: noqa: UP006 UP007
|
2
|
+
# @omlish-lite
|
3
|
+
import contextlib
|
4
|
+
import os
|
5
|
+
import shutil
|
6
|
+
import tempfile
|
7
|
+
import typing as ta
|
8
|
+
|
9
|
+
from .files import unlink_if_exists
|
10
|
+
|
11
|
+
|
12
|
+
def make_temp_file(**kwargs: ta.Any) -> str:
|
13
|
+
file_fd, file = tempfile.mkstemp(**kwargs)
|
14
|
+
os.close(file_fd)
|
15
|
+
return file
|
16
|
+
|
17
|
+
|
18
|
+
@contextlib.contextmanager
|
19
|
+
def temp_file_context(**kwargs: ta.Any) -> ta.Iterator[str]:
|
20
|
+
path = make_temp_file(**kwargs)
|
21
|
+
try:
|
22
|
+
yield path
|
23
|
+
finally:
|
24
|
+
unlink_if_exists(path)
|
25
|
+
|
26
|
+
|
27
|
+
@contextlib.contextmanager
|
28
|
+
def temp_dir_context(
|
29
|
+
root_dir: ta.Optional[str] = None,
|
30
|
+
**kwargs: ta.Any,
|
31
|
+
) -> ta.Iterator[str]:
|
32
|
+
path = tempfile.mkdtemp(dir=root_dir, **kwargs)
|
33
|
+
try:
|
34
|
+
yield path
|
35
|
+
finally:
|
36
|
+
shutil.rmtree(path, ignore_errors=True)
|
37
|
+
|
38
|
+
|
39
|
+
@contextlib.contextmanager
|
40
|
+
def temp_named_file_context(
|
41
|
+
root_dir: ta.Optional[str] = None,
|
42
|
+
cleanup: bool = True,
|
43
|
+
**kwargs: ta.Any,
|
44
|
+
) -> ta.Iterator[tempfile._TemporaryFileWrapper]: # noqa
|
45
|
+
with tempfile.NamedTemporaryFile(dir=root_dir, delete=False, **kwargs) as f:
|
46
|
+
try:
|
47
|
+
yield f
|
48
|
+
finally:
|
49
|
+
if cleanup:
|
50
|
+
shutil.rmtree(f.name, ignore_errors=True)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: omlish
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev214
|
4
4
|
Summary: omlish
|
5
5
|
Author: wrmsr
|
6
6
|
License: BSD-3-Clause
|
@@ -23,11 +23,10 @@ Requires-Dist: python-snappy~=0.7; extra == "all"
|
|
23
23
|
Requires-Dist: zstandard~=0.23; extra == "all"
|
24
24
|
Requires-Dist: brotli~=1.1; extra == "all"
|
25
25
|
Requires-Dist: asttokens~=3.0; extra == "all"
|
26
|
-
Requires-Dist: executing~=2.
|
26
|
+
Requires-Dist: executing~=2.2; extra == "all"
|
27
27
|
Requires-Dist: psutil~=6.0; extra == "all"
|
28
28
|
Requires-Dist: orjson~=3.10; extra == "all"
|
29
29
|
Requires-Dist: ujson~=5.10; extra == "all"
|
30
|
-
Requires-Dist: json5~=0.9; extra == "all"
|
31
30
|
Requires-Dist: pyyaml~=6.0; extra == "all"
|
32
31
|
Requires-Dist: cbor2~=5.6; extra == "all"
|
33
32
|
Requires-Dist: cloudpickle~=3.1; extra == "all"
|
@@ -47,7 +46,7 @@ Requires-Dist: pytest~=8.0; extra == "all"
|
|
47
46
|
Requires-Dist: anyio~=4.8; extra == "all"
|
48
47
|
Requires-Dist: sniffio~=1.3; extra == "all"
|
49
48
|
Requires-Dist: asttokens~=3.0; extra == "all"
|
50
|
-
Requires-Dist: executing~=2.
|
49
|
+
Requires-Dist: executing~=2.2; extra == "all"
|
51
50
|
Requires-Dist: orjson~=3.10; extra == "all"
|
52
51
|
Requires-Dist: pyyaml~=6.0; extra == "all"
|
53
52
|
Requires-Dist: wrapt~=1.17; extra == "all"
|
@@ -64,12 +63,11 @@ Requires-Dist: zstandard~=0.23; extra == "compress"
|
|
64
63
|
Requires-Dist: brotli~=1.1; extra == "compress"
|
65
64
|
Provides-Extra: diag
|
66
65
|
Requires-Dist: asttokens~=3.0; extra == "diag"
|
67
|
-
Requires-Dist: executing~=2.
|
66
|
+
Requires-Dist: executing~=2.2; extra == "diag"
|
68
67
|
Requires-Dist: psutil~=6.0; extra == "diag"
|
69
68
|
Provides-Extra: formats
|
70
69
|
Requires-Dist: orjson~=3.10; extra == "formats"
|
71
70
|
Requires-Dist: ujson~=5.10; extra == "formats"
|
72
|
-
Requires-Dist: json5~=0.9; extra == "formats"
|
73
71
|
Requires-Dist: pyyaml~=6.0; extra == "formats"
|
74
72
|
Requires-Dist: cbor2~=5.6; extra == "formats"
|
75
73
|
Requires-Dist: cloudpickle~=3.1; extra == "formats"
|
@@ -96,7 +94,7 @@ Provides-Extra: plus
|
|
96
94
|
Requires-Dist: anyio~=4.8; extra == "plus"
|
97
95
|
Requires-Dist: sniffio~=1.3; extra == "plus"
|
98
96
|
Requires-Dist: asttokens~=3.0; extra == "plus"
|
99
|
-
Requires-Dist: executing~=2.
|
97
|
+
Requires-Dist: executing~=2.2; extra == "plus"
|
100
98
|
Requires-Dist: orjson~=3.10; extra == "plus"
|
101
99
|
Requires-Dist: pyyaml~=6.0; extra == "plus"
|
102
100
|
Requires-Dist: wrapt~=1.17; extra == "plus"
|
@@ -1,5 +1,5 @@
|
|
1
|
-
omlish/.manifests.json,sha256=
|
2
|
-
omlish/__about__.py,sha256=
|
1
|
+
omlish/.manifests.json,sha256=YGmAnUBszmosQQ_7Hh2wwtDiYdYZ4unNKYzOtALuels,7968
|
2
|
+
omlish/__about__.py,sha256=_d2jSUjwFrpk8Jy6OmRvIQlDn2eLHleeBqNjm541vLQ,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
|
@@ -13,12 +13,12 @@ omlish/runmodule.py,sha256=PWvuAaJ9wQQn6bx9ftEL3_d04DyotNn8dR_twm2pgw0,700
|
|
13
13
|
omlish/shlex.py,sha256=bsW2XUD8GiMTUTDefJejZ5AyqT1pTgWMPD0BMoF02jE,248
|
14
14
|
omlish/subprocesses.py,sha256=KOvt5gvpq2uisjYKyU_XUPZyM6yq8ywgbfWjz-lx9CQ,8686
|
15
15
|
omlish/sync.py,sha256=QJ79kxmIqDP9SeHDoZAf--DpFIhDQe1jACy8H4N0yZI,2928
|
16
|
-
omlish/antlr/__init__.py,sha256=
|
16
|
+
omlish/antlr/__init__.py,sha256=88bMl_28cfSKslgOkMGYXqALgsHz3KC4LFvAVtzj7k8,89
|
17
17
|
omlish/antlr/delimit.py,sha256=3Byvh9_Ip8ftM_SeSEmMbnNo1jrxk-xm8HnHDp_nDaI,3466
|
18
18
|
omlish/antlr/dot.py,sha256=uH2X7-8xNLYDQNJ30uW8ssv1MLkZSm07GsalcRuunYI,817
|
19
19
|
omlish/antlr/errors.py,sha256=foYz2109WReT1C7qZsIrb4zCAkZg4vM_UiDOAPC0AqQ,308
|
20
20
|
omlish/antlr/input.py,sha256=baeO279AIxR50pymya0eabtnc2A0bSdA5u7jvIGebzA,2090
|
21
|
-
omlish/antlr/parsing.py,sha256=
|
21
|
+
omlish/antlr/parsing.py,sha256=kXxeGb5luiwhSyIcXO2mLLME7IJLF6-0XMuS4UcDbcw,1414
|
22
22
|
omlish/antlr/runtime.py,sha256=wYUiJ0qoj4soHFL6fsq91MnUrDSKUEQVmJScKJibOAc,1975
|
23
23
|
omlish/antlr/utils.py,sha256=hi_RFUl222r2gQsmmm5MYg5_vYa3q8u-KP4CC1ZHndA,912
|
24
24
|
omlish/antlr/_runtime/BufferedTokenStream.py,sha256=1Rnhm62MZCWSuQeRs7lRUbdtdyo7Gyg8r4gAETjv-cE,10793
|
@@ -94,7 +94,7 @@ omlish/asyncs/trio.py,sha256=fmZ5b_lKdVV8NQ3euCUutWgnkqTFzSnOjvJSA_jvmrE,367
|
|
94
94
|
omlish/asyncs/trio_asyncio.py,sha256=oqdOHy0slj9PjVxaDf3gJkq9AAgg7wYZbB469jOftVw,1327
|
95
95
|
omlish/asyncs/asyncio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
96
96
|
omlish/asyncs/asyncio/all.py,sha256=eZDtL8atzHqIdGCAAcQYWVmNvgRYerJB9Sy0reh-09k,115
|
97
|
-
omlish/asyncs/asyncio/asyncio.py,sha256=
|
97
|
+
omlish/asyncs/asyncio/asyncio.py,sha256=uNd1h2EIaQb0pZVtvAkq-GnWjf9gn-sSHY0gkmm-7e0,1767
|
98
98
|
omlish/asyncs/asyncio/channels.py,sha256=ZbmsEmdK1fV96liHdcVpRqA2dAMkXJt4Q3rFAg3YOIw,1074
|
99
99
|
omlish/asyncs/asyncio/streams.py,sha256=Uc9PCWSfBqrK2kdVtfjjQU1eaYTWYmZm8QISDj2xiuw,1004
|
100
100
|
omlish/asyncs/asyncio/subprocesses.py,sha256=XlIWwSxpVB7sMVc75-f7dI6r08JkdipNFRWXUKS8zAw,6960
|
@@ -109,10 +109,11 @@ omlish/asyncs/bluelet/files.py,sha256=pgcLV_3oGbpqQmOrii8SeizyYLp8XKofQJhqM82RlK
|
|
109
109
|
omlish/asyncs/bluelet/runner.py,sha256=F6Ep0th09f-FkIRJfMN3_u-iG21jNNv11WyqnHyITYU,15475
|
110
110
|
omlish/asyncs/bluelet/sockets.py,sha256=RrC2vU52dOEBYKzvoh1qA39uUE8p3uCB_oxnhaP1AeA,6752
|
111
111
|
omlish/asyncs/ioproxy/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
112
|
-
omlish/asyncs/ioproxy/
|
113
|
-
omlish/asyncs/ioproxy/
|
112
|
+
omlish/asyncs/ioproxy/all.py,sha256=_0mg0OjNKbnpGPSQZ-ftXYhKSpt-Po4Rlu2kam7v3XQ,1003
|
113
|
+
omlish/asyncs/ioproxy/io.py,sha256=JDfxqqNw0uKB7rliI-SCDtqK7tGyn6NKnPJea8WXHec,5117
|
114
|
+
omlish/asyncs/ioproxy/proxier.py,sha256=MiqdGTjTor3YcNQqe8s0x6xXOPjKqV1Jg495Bh807hs,4486
|
114
115
|
omlish/asyncs/ioproxy/proxy.py,sha256=cPzwHRlptaRPAKC5XdqwnBEObGNfSUsI4JWaUgFoZ64,3905
|
115
|
-
omlish/asyncs/ioproxy/typing.py,sha256=
|
116
|
+
omlish/asyncs/ioproxy/typing.py,sha256=qqNhfKbOKAxDaKBqvXiTT9tg29Maoxn0Oec1TKgqSVQ,2469
|
116
117
|
omlish/bootstrap/__init__.py,sha256=-Rtsg7uPQNhh1dIT9nqrz96XlqizwoLnWf-FwOEstJI,730
|
117
118
|
omlish/bootstrap/__main__.py,sha256=4jCwsaogp0FrJjJZ85hzF4-WqluPeheHbfeoKynKvNs,194
|
118
119
|
omlish/bootstrap/base.py,sha256=d8hqn4hp1XMMi5PgcJBQXPKmW47epu8CxBlqDZiRZb4,1073
|
@@ -229,7 +230,6 @@ omlish/formats/cbor.py,sha256=o_Hbe4kthO9CeXK-FySrw0dHVlrdyTo2Y8PpGRDfZ3c,514
|
|
229
230
|
omlish/formats/cloudpickle.py,sha256=16si4yUp_pAdDWGECAWf6HLA2PwSANGGgDoMLGZUem8,579
|
230
231
|
omlish/formats/codecs.py,sha256=ip4TLOyWAaUyEJmrIOzuLMtjRdgaMEsC6JeAlcCVi28,1657
|
231
232
|
omlish/formats/dotenv.py,sha256=qoDG4Ayu7B-8LjBBhcmNiLZW0_9LgCi3Ri2aPo9DEQ8,19314
|
232
|
-
omlish/formats/json5.py,sha256=odpZIShlUpv19aACWe58SoMPcv0AHKIa6zSMjlKgaMI,515
|
233
233
|
omlish/formats/pickle.py,sha256=jdp4E9WH9qVPBE3sSqbqDtUo18RbTSIiSpSzJ-IEVZw,529
|
234
234
|
omlish/formats/props.py,sha256=auCv-Jx79KGlWfyG1-Qo0ou-Ex0W_mF3r_lDFdsVkWI,18920
|
235
235
|
omlish/formats/repr.py,sha256=kYrNs4o-ji8nOdp6u_L3aMgBMWN1ZAZJSAWgQQfStSQ,414
|
@@ -257,9 +257,20 @@ omlish/formats/json/backends/ujson.py,sha256=BNJCU4kluGHdqTUKLJEuHhE2m2TmqR7HEN2
|
|
257
257
|
omlish/formats/json/stream/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
258
258
|
omlish/formats/json/stream/build.py,sha256=MSxgreWSfI5CzNAdgQrArZ0yWqDsaHl-shI_jmjLDms,2505
|
259
259
|
omlish/formats/json/stream/errors.py,sha256=c8M8UAYmIZ-vWZLeKD2jMj4EDCJbr9QR8Jq_DyHjujQ,43
|
260
|
-
omlish/formats/json/stream/lex.py,sha256=
|
260
|
+
omlish/formats/json/stream/lex.py,sha256=ItsWvtl5SZH-HwQtPy8Cpf4nszqDzvUTdIOEmSRiZ-E,6807
|
261
261
|
omlish/formats/json/stream/parse.py,sha256=JuYmXwtTHmQJTFKoJNoEHUpCPxXdl_gvKPykVXgED34,6208
|
262
262
|
omlish/formats/json/stream/render.py,sha256=NtmDsN92xZi5dkgSSuMeMXMAiJblmjz1arB4Ft7vBhc,3715
|
263
|
+
omlish/formats/json5/Json5.g4,sha256=fSUikG4-eK3j0Ugab9FzQZgpN3w0dN2gjSPWXmPcybI,2661
|
264
|
+
omlish/formats/json5/__init__.py,sha256=BsjPz5zJDji3GjQ8x8hWvcl1GYPV_ZIHnE3c2Sr8aTU,102
|
265
|
+
omlish/formats/json5/codec.py,sha256=ldnxCRo0JP1fkGLt0mMxJlLvNxqIF_1KUCcSp1HtI-M,452
|
266
|
+
omlish/formats/json5/errors.py,sha256=AHkR9ySjAoQdUrizpqgL8fg0M5oe5mHZkml3KZHEvC4,38
|
267
|
+
omlish/formats/json5/literals.py,sha256=rj4-9KFXfgdq5oK_eUkp57cgoMQ8T0gRaG9ga430he4,2429
|
268
|
+
omlish/formats/json5/parsing.py,sha256=v1CPnJF73yX6eDe1GNfDVXFxBhBeoHrG5E5Tf5f6oL8,2341
|
269
|
+
omlish/formats/json5/_antlr/Json5Lexer.py,sha256=8TKxlENDsl6CPfoLR06uQSvhDnzGcY7fKsIhFJ_g6N4,23237
|
270
|
+
omlish/formats/json5/_antlr/Json5Listener.py,sha256=fSiOzSS0CMjxaCev3sxZqJlW-buqIyDLwgnuRv-Uh80,2095
|
271
|
+
omlish/formats/json5/_antlr/Json5Parser.py,sha256=nbbwoCPvEVRcEh5_t092XLmsXIHnbzONvH0W0g_BYkQ,19677
|
272
|
+
omlish/formats/json5/_antlr/Json5Visitor.py,sha256=SfHhUMNapeP8g4Dc7SFwRSqeBtUTLYBNU-1-uEljbyQ,1433
|
273
|
+
omlish/formats/json5/_antlr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
263
274
|
omlish/formats/toml/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
264
275
|
omlish/formats/toml/codec.py,sha256=5HFGWEPd9IFxPlRMRheX8FEDlRIzLe1moHEOj2_PFKU,342
|
265
276
|
omlish/formats/toml/parser.py,sha256=3QN3rqdJ_zlHfFtsDn-A9pl-BTwdVMUUpUV5-lGWCKc,29342
|
@@ -362,7 +373,7 @@ omlish/iterators/iterators.py,sha256=ghI4dO6WPyyFOLTIIMaHQ_IOy2xXaFpGPqveZ5YGIBU
|
|
362
373
|
omlish/iterators/recipes.py,sha256=53mkexitMhkwXQZbL6DrhpT0WePQ_56uXd5Jaw3DfzI,467
|
363
374
|
omlish/iterators/tools.py,sha256=SvXyyQJh7aceLYhRl6pQB-rfSaXw5IMIWukeEeOZt-0,2492
|
364
375
|
omlish/iterators/unique.py,sha256=0jAX3kwzVfRNhe0Tmh7kVP_Q2WBIn8POo_O-rgFV0rQ,1390
|
365
|
-
omlish/lang/__init__.py,sha256=
|
376
|
+
omlish/lang/__init__.py,sha256=sY7YSgN772n48qWlR-mwuOOCOwRF5Fh421gZqZWxYlw,4042
|
366
377
|
omlish/lang/cached.py,sha256=92TvRZQ6sWlm7dNn4hgl7aWKbX0J1XUEo3DRjBpgVQk,7834
|
367
378
|
omlish/lang/clsdct.py,sha256=AjtIWLlx2E6D5rC97zQ3Lwq2SOMkbg08pdO_AxpzEHI,1744
|
368
379
|
omlish/lang/cmp.py,sha256=5vbzWWbqdzDmNKAGL19z6ZfUKe5Ci49e-Oegf9f4BsE,1346
|
@@ -372,13 +383,13 @@ omlish/lang/descriptors.py,sha256=RRBbkMgTzg82fFFE4D0muqobpM-ZZaOta6yB1lpX3s8,66
|
|
372
383
|
omlish/lang/exceptions.py,sha256=qJBo3NU1mOWWm-NhQUHCY5feYXR3arZVyEHinLsmRH4,47
|
373
384
|
omlish/lang/functions.py,sha256=t9nsnWwhsibG0w908VMx-_pRM5tZfruE3faPxrCWTbI,4160
|
374
385
|
omlish/lang/generators.py,sha256=5LX17j-Ej3QXhwBgZvRTm_dq3n9veC4IOUcVmvSu2vU,5243
|
375
|
-
omlish/lang/imports.py,sha256=
|
386
|
+
omlish/lang/imports.py,sha256=3C04Z0Hsj-BQIfHDWd-MQFGyZqTWuyJc2di6GfE-eUM,9327
|
376
387
|
omlish/lang/iterables.py,sha256=HOjcxOwyI5bBApDLsxRAGGhTTmw7fdZl2kEckxRVl-0,1994
|
377
388
|
omlish/lang/maybes.py,sha256=1RN7chX_x2XvgUwryZRz0W7hAX-be3eEFcFub5vvf6M,3417
|
378
389
|
omlish/lang/objects.py,sha256=LOC3JvX1g5hPxJ7Sv2TK9kNkAo9c8J-Jw2NmClR_rkA,4576
|
379
390
|
omlish/lang/resolving.py,sha256=OuN2mDTPNyBUbcrswtvFKtj4xgH4H4WglgqSKv3MTy0,1606
|
380
391
|
omlish/lang/resources.py,sha256=N64KeVE-rYMxqBBRp91qzgVqpOVR2uX7k1WlS_bo5hM,2681
|
381
|
-
omlish/lang/strings.py,sha256=
|
392
|
+
omlish/lang/strings.py,sha256=egdv8PxLNG40-5V93agP5j2rBUDIsahCx048zV7uEbU,4690
|
382
393
|
omlish/lang/sys.py,sha256=UoZz_PJYVKLQAKqYxxn-LHz1okK_38I__maZgnXMcxU,406
|
383
394
|
omlish/lang/timeouts.py,sha256=vECdWYhc_IZgcal1Ng1Y42wf2FV3KAx-i8As-MgGHIQ,1186
|
384
395
|
omlish/lang/typing.py,sha256=Zdad9Zv0sa-hIaUXPrzPidT7sDVpRcussAI7D-j-I1c,3296
|
@@ -471,12 +482,13 @@ omlish/multiprocessing/spawn.py,sha256=sTvPLIJGYnjjI6ASqhFzHF-97tCnaOXX7u7s-33SU
|
|
471
482
|
omlish/os/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
472
483
|
omlish/os/atomics.py,sha256=KhWNeh4mzU3M-TF0v8uR6hUqMfZJW42MeyIK9Jl6R0k,5246
|
473
484
|
omlish/os/deathsig.py,sha256=hk9Yq2kyDdI-cI7OQH7mOfpRbOKzY_TfPKEqgrjVYbA,641
|
474
|
-
omlish/os/files.py,sha256=
|
485
|
+
omlish/os/files.py,sha256=O1Um1iCLeIzDSKQq2zByVC_4NZ3tLMqv6vICyU21U3Q,861
|
475
486
|
omlish/os/journald.py,sha256=2nI8Res1poXkbLc31--MPUlzYMESnCcPUkIxDOCjZW0,3903
|
476
487
|
omlish/os/linux.py,sha256=whJ6scwMKSFBdXiVhJW0BCpJV4jOGMr-a_a3Bhwz6Ls,18938
|
477
488
|
omlish/os/paths.py,sha256=hqPiyg_eYaRoIVPdAeX4oeLEV4Kpln_XsH0tHvbOf8Q,844
|
478
489
|
omlish/os/pidfile.py,sha256=S4Nbe00oSxckY0qCC9AeTEZe7NSw4eJudnQX7wCXzks,1738
|
479
490
|
omlish/os/sizes.py,sha256=ohkALLvqSqBX4iR-7DMKJ4pfOCRdZXV8htH4QywUNM0,152
|
491
|
+
omlish/os/temp.py,sha256=P97KiVeNB7rfGn4tlgU5ro86JUxAsiphLMlxsjQgfB0,1198
|
480
492
|
omlish/reflect/__init__.py,sha256=JBWwxKwP4IEaomkK0PTju02STU1BVXT14SCrShT1Sm0,769
|
481
493
|
omlish/reflect/inspect.py,sha256=veJ424-9oZrqyvhVpvxOi7hcKW-PDBkdYL2yjrFlk4o,495
|
482
494
|
omlish/reflect/ops.py,sha256=RJ6jzrM4ieFsXzWyNXWV43O_WgzEaUvlHSc5N2ezW2A,2044
|
@@ -614,9 +626,9 @@ omlish/text/indent.py,sha256=YjtJEBYWuk8--b9JU_T6q4yxV85_TR7VEVr5ViRCFwk,1336
|
|
614
626
|
omlish/text/minja.py,sha256=jZC-fp3Xuhx48ppqsf2Sf1pHbC0t8XBB7UpUUoOk2Qw,5751
|
615
627
|
omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
|
616
628
|
omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
|
617
|
-
omlish-0.0.0.
|
618
|
-
omlish-0.0.0.
|
619
|
-
omlish-0.0.0.
|
620
|
-
omlish-0.0.0.
|
621
|
-
omlish-0.0.0.
|
622
|
-
omlish-0.0.0.
|
629
|
+
omlish-0.0.0.dev214.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
630
|
+
omlish-0.0.0.dev214.dist-info/METADATA,sha256=PQq6yr3xSMAgnBbWLpLKNNmi_mhsmDtvjnyYGgDmgEA,4176
|
631
|
+
omlish-0.0.0.dev214.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
632
|
+
omlish-0.0.0.dev214.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
|
633
|
+
omlish-0.0.0.dev214.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
|
634
|
+
omlish-0.0.0.dev214.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|