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.
Files changed (32) hide show
  1. omlish/.manifests.json +4 -4
  2. omlish/__about__.py +3 -5
  3. omlish/antlr/__init__.py +3 -0
  4. omlish/antlr/parsing.py +34 -2
  5. omlish/asyncs/asyncio/asyncio.py +34 -0
  6. omlish/asyncs/ioproxy/all.py +32 -0
  7. omlish/asyncs/ioproxy/io.py +13 -13
  8. omlish/asyncs/ioproxy/proxier.py +30 -30
  9. omlish/asyncs/ioproxy/typing.py +3 -3
  10. omlish/formats/json/stream/lex.py +1 -0
  11. omlish/formats/json5/Json5.g4 +172 -0
  12. omlish/formats/json5/__init__.py +8 -0
  13. omlish/formats/json5/_antlr/Json5Lexer.py +353 -0
  14. omlish/formats/json5/_antlr/Json5Listener.py +78 -0
  15. omlish/formats/json5/_antlr/Json5Parser.py +616 -0
  16. omlish/formats/json5/_antlr/Json5Visitor.py +51 -0
  17. omlish/formats/json5/_antlr/__init__.py +0 -0
  18. omlish/formats/{json5.py → json5/codec.py} +6 -11
  19. omlish/formats/json5/errors.py +2 -0
  20. omlish/formats/json5/literals.py +130 -0
  21. omlish/formats/json5/parsing.py +79 -0
  22. omlish/lang/__init__.py +2 -0
  23. omlish/lang/imports.py +4 -0
  24. omlish/lang/strings.py +33 -1
  25. omlish/os/files.py +17 -30
  26. omlish/os/temp.py +50 -0
  27. {omlish-0.0.0.dev213.dist-info → omlish-0.0.0.dev214.dist-info}/METADATA +5 -7
  28. {omlish-0.0.0.dev213.dist-info → omlish-0.0.0.dev214.dist-info}/RECORD +32 -20
  29. {omlish-0.0.0.dev213.dist-info → omlish-0.0.0.dev214.dist-info}/LICENSE +0 -0
  30. {omlish-0.0.0.dev213.dist-info → omlish-0.0.0.dev214.dist-info}/WHEEL +0 -0
  31. {omlish-0.0.0.dev213.dist-info → omlish-0.0.0.dev214.dist-info}/entry_points.txt +0 -0
  32. {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
@@ -1,3 +1,7 @@
1
+ """
2
+ TODO:
3
+ - proxy_init 'as' alias support - attrs of (src, dst)
4
+ """
1
5
  import contextlib
2
6
  import importlib.util
3
7
  import sys
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, count_each: int = -1,
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.dev213
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.1; extra == "all"
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.1; extra == "all"
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.1; extra == "diag"
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.1; extra == "plus"
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=dyIpveH7Z8OnQp2pTn6NVv7LCDXVrozJWAzbk8PBavg,7950
2
- omlish/__about__.py,sha256=rTnrIQNQ5FRbHCr1olR3EzpCFMG4gqKht36KMpz3fPk,3409
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=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
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=PH4WlQAqr6ZfnOUNeQLaTMaJJjx3vK2TCgI9HQUNAKk,435
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=fvIc3M01Bo_qZTFz3Z2X7NrXC_9DnS0vtZKizGiV034,830
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/io.py,sha256=nIvaKi5CEMrycj1N_gfBeMwILNfFA_H1rklgR87xKCM,4987
113
- omlish/asyncs/ioproxy/proxier.py,sha256=yhHud-00DuGZeSlJHJs6dpsXUpsmuD1Kw0vw9gTsdpU,4456
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=Aa9ysSEFww_P39Bza0p-CehRpvwg0UvcopeQ-L_isyc,2440
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=bfy0fb3_Z6G18UGueX2DR6oPSVUsMoFhlbsvXC3ztzI,6793
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=091aYd1gRii-ulxI9QAMjZBPLcl-kfL-XU82kLMR0qU,4013
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=TXLbj2F53LsmozlM05bQhvow9kEgWJOi9qYKsnm2D18,9258
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=qnKLDEkp6zrrjq3ClzY1qubi1I2Vjf8HZfSlSCbmvi8,4019
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=1tNy1z5I_CgYKA5c6lOfsXc-hknP4tQDbSShdz8HArw,1308
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.dev213.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
618
- omlish-0.0.0.dev213.dist-info/METADATA,sha256=IpkbQXwChAhIh8w_W3662VHEfMYUAs1Kcq1NRDjAr6Q,4264
619
- omlish-0.0.0.dev213.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
620
- omlish-0.0.0.dev213.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
621
- omlish-0.0.0.dev213.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
622
- omlish-0.0.0.dev213.dist-info/RECORD,,
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,,