omlish 0.0.0.dev82__py3-none-any.whl → 0.0.0.dev84__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 +3 -3
- omlish/__about__.py +3 -3
- omlish/dataclasses/impl/fields.py +1 -1
- omlish/dataclasses/impl/init.py +18 -2
- omlish/formats/json/cli/__init__.py +0 -0
- omlish/formats/json/{cli.py → cli/cli.py} +23 -51
- omlish/formats/json/cli/formats.py +64 -0
- omlish/formats/json/stream/build.py +63 -67
- omlish/formats/xml.py +63 -0
- {omlish-0.0.0.dev82.dist-info → omlish-0.0.0.dev84.dist-info}/METADATA +3 -3
- {omlish-0.0.0.dev82.dist-info → omlish-0.0.0.dev84.dist-info}/RECORD +16 -13
- /omlish/formats/json/{__main__.py → cli/__main__.py} +0 -0
- {omlish-0.0.0.dev82.dist-info → omlish-0.0.0.dev84.dist-info}/LICENSE +0 -0
- {omlish-0.0.0.dev82.dist-info → omlish-0.0.0.dev84.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev82.dist-info → omlish-0.0.0.dev84.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev82.dist-info → omlish-0.0.0.dev84.dist-info}/top_level.txt +0 -0
omlish/.manifests.json
CHANGED
@@ -36,14 +36,14 @@
|
|
36
36
|
}
|
37
37
|
},
|
38
38
|
{
|
39
|
-
"module": ".formats.json.__main__",
|
39
|
+
"module": ".formats.json.cli.__main__",
|
40
40
|
"attr": "_CLI_MODULE",
|
41
|
-
"file": "omlish/formats/json/__main__.py",
|
41
|
+
"file": "omlish/formats/json/cli/__main__.py",
|
42
42
|
"line": 1,
|
43
43
|
"value": {
|
44
44
|
"$omdev.cli.types.CliModule": {
|
45
45
|
"cmd_name": "json",
|
46
|
-
"mod_name": "omlish.formats.json.__main__"
|
46
|
+
"mod_name": "omlish.formats.json.cli.__main__"
|
47
47
|
}
|
48
48
|
}
|
49
49
|
},
|
omlish/__about__.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
__version__ = '0.0.0.
|
2
|
-
__revision__ = '
|
1
|
+
__version__ = '0.0.0.dev84'
|
2
|
+
__revision__ = 'b3347da7d48862b90c274893e4f9bfa477fecc70'
|
3
3
|
|
4
4
|
|
5
5
|
#
|
@@ -101,7 +101,7 @@ class Project(ProjectBase):
|
|
101
101
|
|
102
102
|
'apsw ~= 3.46',
|
103
103
|
|
104
|
-
'sqlean.py ~= 3.45
|
104
|
+
'sqlean.py ~= 3.45',
|
105
105
|
|
106
106
|
'duckdb ~= 1.1',
|
107
107
|
],
|
omlish/dataclasses/impl/init.py
CHANGED
@@ -23,6 +23,19 @@ from .utils import set_new_attribute
|
|
23
23
|
MISSING = dc.MISSING
|
24
24
|
|
25
25
|
|
26
|
+
##
|
27
|
+
|
28
|
+
|
29
|
+
def raise_validation_error(
|
30
|
+
obj: ta.Any,
|
31
|
+
fn: ta.Callable,
|
32
|
+
) -> ta.NoReturn:
|
33
|
+
raise ValidationError(obj, fn)
|
34
|
+
|
35
|
+
|
36
|
+
##
|
37
|
+
|
38
|
+
|
26
39
|
class InitFields(ta.NamedTuple):
|
27
40
|
all: ta.Sequence[dc.Field]
|
28
41
|
ordered: ta.Sequence[dc.Field]
|
@@ -57,6 +70,9 @@ def init_param(f: dc.Field) -> str:
|
|
57
70
|
return f'{f.name}: __dataclass_type_{f.name}__{default}' # noqa
|
58
71
|
|
59
72
|
|
73
|
+
##
|
74
|
+
|
75
|
+
|
60
76
|
class InitBuilder:
|
61
77
|
|
62
78
|
def __init__(
|
@@ -100,7 +116,7 @@ class InitBuilder:
|
|
100
116
|
'__dataclass_builtins_object__': object,
|
101
117
|
'__dataclass_builtins_isinstance__': isinstance,
|
102
118
|
'__dataclass_builtins_TypeError__': TypeError,
|
103
|
-
'
|
119
|
+
'__dataclass_raise_validation_error__': raise_validation_error,
|
104
120
|
'__dataclass_raise_field_validation_error__': raise_field_validation_error,
|
105
121
|
})
|
106
122
|
|
@@ -128,7 +144,7 @@ class InitBuilder:
|
|
128
144
|
locals[cn] = fn
|
129
145
|
csig = inspect.signature(fn)
|
130
146
|
cas = ', '.join(p.name for p in csig.parameters.values())
|
131
|
-
body_lines.append(f'if not {cn}({cas}):
|
147
|
+
body_lines.append(f'if not {cn}({cas}): __dataclass_raise_validation_error__({self._self_name}, {cn})')
|
132
148
|
|
133
149
|
inits = self._info.merged_metadata.get(Init, [])
|
134
150
|
mro_dct = lang.build_mro_dict(self._info.cls)
|
File without changes
|
@@ -1,13 +1,6 @@
|
|
1
|
-
"""
|
2
|
-
TODO:
|
3
|
-
- xml - [{"att", {"el", {"cdata", ...
|
4
|
-
- csv - dict if headers, array if not
|
5
|
-
"""
|
6
1
|
import argparse
|
7
2
|
import codecs
|
8
3
|
import contextlib
|
9
|
-
import dataclasses as dc
|
10
|
-
import enum
|
11
4
|
import io
|
12
5
|
import json
|
13
6
|
import os
|
@@ -15,33 +8,25 @@ import subprocess
|
|
15
8
|
import sys
|
16
9
|
import typing as ta
|
17
10
|
|
18
|
-
from
|
19
|
-
from
|
20
|
-
from
|
21
|
-
from
|
22
|
-
from
|
23
|
-
from
|
24
|
-
from
|
25
|
-
from
|
11
|
+
from .... import check
|
12
|
+
from .... import lang
|
13
|
+
from .... import term
|
14
|
+
from ..render import JsonRenderer
|
15
|
+
from ..stream.build import JsonObjectBuilder
|
16
|
+
from ..stream.lex import JsonStreamLexer
|
17
|
+
from ..stream.parse import JsonStreamParser
|
18
|
+
from ..stream.render import StreamJsonRenderer
|
19
|
+
from .formats import FORMATS_BY_NAME
|
20
|
+
from .formats import Formats
|
26
21
|
|
27
22
|
|
28
23
|
if ta.TYPE_CHECKING:
|
29
|
-
import
|
30
|
-
import tomllib
|
31
|
-
|
32
|
-
import yaml
|
33
|
-
|
34
|
-
from .. import dotenv
|
35
|
-
from .. import props
|
36
|
-
|
24
|
+
from ....specs import jmespath
|
37
25
|
else:
|
38
|
-
|
39
|
-
tomllib = lang.proxy_import('tomllib')
|
26
|
+
jmespath = lang.proxy_import('....specs.jmespath', __package__)
|
40
27
|
|
41
|
-
yaml = lang.proxy_import('yaml')
|
42
28
|
|
43
|
-
|
44
|
-
props = lang.proxy_import('..props', __package__)
|
29
|
+
##
|
45
30
|
|
46
31
|
|
47
32
|
def term_color(o: ta.Any, state: JsonRenderer.State) -> tuple[str, str]:
|
@@ -53,29 +38,6 @@ def term_color(o: ta.Any, state: JsonRenderer.State) -> tuple[str, str]:
|
|
53
38
|
return '', ''
|
54
39
|
|
55
40
|
|
56
|
-
@dc.dataclass(frozen=True)
|
57
|
-
class Format:
|
58
|
-
names: ta.Sequence[str]
|
59
|
-
load: ta.Callable[[ta.TextIO], ta.Any]
|
60
|
-
|
61
|
-
|
62
|
-
class Formats(enum.Enum):
|
63
|
-
JSON = Format(['json'], json.load)
|
64
|
-
YAML = Format(['yaml', 'yml'], lambda f: yaml.safe_load(f))
|
65
|
-
TOML = Format(['toml'], lambda f: tomllib.loads(f.read()))
|
66
|
-
ENV = Format(['env', 'dotenv'], lambda f: dotenv.dotenv_values(stream=f))
|
67
|
-
PROPS = Format(['properties', 'props'], lambda f: dict(props.Properties().load(f.read())))
|
68
|
-
PY = Format(['py', 'python', 'repr'], lambda f: ast.literal_eval(f.read()))
|
69
|
-
|
70
|
-
|
71
|
-
FORMATS_BY_NAME: ta.Mapping[str, Format] = {
|
72
|
-
n: f
|
73
|
-
for e in Formats
|
74
|
-
for f in [e.value]
|
75
|
-
for n in f.names
|
76
|
-
}
|
77
|
-
|
78
|
-
|
79
41
|
def _main() -> None:
|
80
42
|
parser = argparse.ArgumentParser()
|
81
43
|
|
@@ -87,6 +49,8 @@ def _main() -> None:
|
|
87
49
|
|
88
50
|
parser.add_argument('-f', '--format')
|
89
51
|
|
52
|
+
parser.add_argument('-x', '--jmespath-expr')
|
53
|
+
|
90
54
|
parser.add_argument('-z', '--compact', action='store_true')
|
91
55
|
parser.add_argument('-p', '--pretty', action='store_true')
|
92
56
|
parser.add_argument('-i', '--indent')
|
@@ -119,7 +83,15 @@ def _main() -> None:
|
|
119
83
|
sort_keys=args.sort_keys,
|
120
84
|
)
|
121
85
|
|
86
|
+
if args.jmespath_expr is not None:
|
87
|
+
jp_expr = jmespath.compile(args.jmespath_expr)
|
88
|
+
else:
|
89
|
+
jp_expr = None
|
90
|
+
|
122
91
|
def render_one(v: ta.Any) -> str:
|
92
|
+
if jp_expr is not None:
|
93
|
+
v = jp_expr.search(v)
|
94
|
+
|
123
95
|
if args.color:
|
124
96
|
return JsonRenderer.render_str(
|
125
97
|
v,
|
@@ -0,0 +1,64 @@
|
|
1
|
+
"""
|
2
|
+
TODO:
|
3
|
+
- options lol - csv header, newline, etc
|
4
|
+
"""
|
5
|
+
import dataclasses as dc
|
6
|
+
import enum
|
7
|
+
import json
|
8
|
+
import typing as ta
|
9
|
+
|
10
|
+
from .... import lang
|
11
|
+
|
12
|
+
|
13
|
+
if ta.TYPE_CHECKING:
|
14
|
+
import ast
|
15
|
+
import csv
|
16
|
+
import tomllib
|
17
|
+
|
18
|
+
import yaml
|
19
|
+
|
20
|
+
from ... import dotenv
|
21
|
+
from ... import props
|
22
|
+
from ... import xml
|
23
|
+
|
24
|
+
else:
|
25
|
+
ast = lang.proxy_import('ast')
|
26
|
+
csv = lang.proxy_import('csv')
|
27
|
+
tomllib = lang.proxy_import('tomllib')
|
28
|
+
|
29
|
+
yaml = lang.proxy_import('yaml')
|
30
|
+
|
31
|
+
dotenv = lang.proxy_import('...dotenv', __package__)
|
32
|
+
props = lang.proxy_import('...props', __package__)
|
33
|
+
xml = lang.proxy_import('...xml', __package__)
|
34
|
+
|
35
|
+
|
36
|
+
##
|
37
|
+
|
38
|
+
|
39
|
+
@dc.dataclass(frozen=True)
|
40
|
+
class Format:
|
41
|
+
names: ta.Sequence[str]
|
42
|
+
load: ta.Callable[[ta.TextIO], ta.Any]
|
43
|
+
|
44
|
+
|
45
|
+
class Formats(enum.Enum):
|
46
|
+
JSON = Format(['json'], json.load)
|
47
|
+
YAML = Format(['yaml', 'yml'], lambda f: yaml.safe_load(f))
|
48
|
+
TOML = Format(['toml'], lambda f: tomllib.loads(f.read()))
|
49
|
+
ENV = Format(['env', 'dotenv'], lambda f: dotenv.dotenv_values(stream=f))
|
50
|
+
PROPS = Format(['properties', 'props'], lambda f: dict(props.Properties().load(f.read())))
|
51
|
+
PY = Format(['py', 'python', 'repr'], lambda f: ast.literal_eval(f.read()))
|
52
|
+
XML = Format(['xml'], lambda f: xml.build_simple_element(xml.parse_tree(f.read()).getroot()).as_dict())
|
53
|
+
CSV = Format(['csv'], lambda f: list(csv.DictReader(f)))
|
54
|
+
TSV = Format(['tsv'], lambda f: list(csv.DictReader(f, delimiter='\t')))
|
55
|
+
FLAT_CSV = Format(['fcsv'], lambda f: list(csv.reader(f)))
|
56
|
+
FLAT_TSV = Format(['ftsv'], lambda f: list(csv.reader(f, delimiter='\t')))
|
57
|
+
|
58
|
+
|
59
|
+
FORMATS_BY_NAME: ta.Mapping[str, Format] = {
|
60
|
+
n: f
|
61
|
+
for e in Formats
|
62
|
+
for f in [e.value]
|
63
|
+
for n in f.names
|
64
|
+
}
|
@@ -1,6 +1,5 @@
|
|
1
1
|
import typing as ta
|
2
2
|
|
3
|
-
from ....genmachine import GenMachine
|
4
3
|
from .lex import SCALAR_VALUE_TYPES
|
5
4
|
from .parse import BeginArray
|
6
5
|
from .parse import BeginObject
|
@@ -14,7 +13,7 @@ from .parse import Key
|
|
14
13
|
##
|
15
14
|
|
16
15
|
|
17
|
-
class JsonObjectBuilder
|
16
|
+
class JsonObjectBuilder:
|
18
17
|
def __init__(
|
19
18
|
self,
|
20
19
|
*,
|
@@ -23,91 +22,88 @@ class JsonObjectBuilder(GenMachine[JsonStreamParserEvent, ta.Any]):
|
|
23
22
|
self._stack: list[JsonStreamObject | list | Key] = []
|
24
23
|
self._yield_object_lists = yield_object_lists
|
25
24
|
|
26
|
-
|
25
|
+
class StateError(Exception):
|
26
|
+
pass
|
27
27
|
|
28
|
-
def
|
29
|
-
|
30
|
-
|
31
|
-
def emit_value(v):
|
32
|
-
if not stk:
|
33
|
-
return (v,)
|
28
|
+
def __enter__(self) -> ta.Self:
|
29
|
+
return self
|
34
30
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
if not stk:
|
39
|
-
raise self.StateError
|
31
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
32
|
+
if exc_type is None:
|
33
|
+
self.close()
|
40
34
|
|
41
|
-
|
42
|
-
|
43
|
-
|
35
|
+
def close(self) -> None:
|
36
|
+
if self._stack:
|
37
|
+
raise self.StateError
|
44
38
|
|
45
|
-
|
46
|
-
|
39
|
+
def _emit_value(self, v):
|
40
|
+
if not (stk := self._stack):
|
41
|
+
return (v,)
|
47
42
|
|
48
|
-
|
49
|
-
|
50
|
-
|
43
|
+
tv = stk[-1]
|
44
|
+
if isinstance(tv, Key):
|
45
|
+
stk.pop()
|
46
|
+
if not stk:
|
47
|
+
raise self.StateError
|
51
48
|
|
52
|
-
|
49
|
+
tv2 = stk[-1]
|
50
|
+
if not isinstance(tv2, JsonStreamObject):
|
53
51
|
raise self.StateError
|
54
52
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
else:
|
62
|
-
raise
|
53
|
+
tv2.append((tv.key, v))
|
54
|
+
return ()
|
55
|
+
|
56
|
+
elif isinstance(tv, list):
|
57
|
+
tv.append(v)
|
58
|
+
return ()
|
63
59
|
|
64
|
-
|
60
|
+
else:
|
61
|
+
raise self.StateError
|
65
62
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
63
|
+
def __call__(self, e: JsonStreamParserEvent) -> ta.Any:
|
64
|
+
stk = self._stack
|
65
|
+
|
66
|
+
#
|
67
|
+
|
68
|
+
if isinstance(e, SCALAR_VALUE_TYPES):
|
69
|
+
return self._emit_value(e)
|
70
70
|
|
71
|
-
|
71
|
+
#
|
72
72
|
|
73
|
-
|
74
|
-
|
75
|
-
|
73
|
+
elif e is BeginObject:
|
74
|
+
stk.append(JsonStreamObject())
|
75
|
+
return ()
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
elif isinstance(e, Key):
|
78
|
+
if not stk or not isinstance(stk[-1], JsonStreamObject):
|
79
|
+
raise self.StateError
|
80
80
|
|
81
|
-
|
82
|
-
|
81
|
+
stk.append(e)
|
82
|
+
return ()
|
83
83
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
84
|
+
elif e is EndObject:
|
85
|
+
tv: ta.Any
|
86
|
+
if not stk or not isinstance(tv := stk.pop(), JsonStreamObject):
|
87
|
+
raise self.StateError
|
88
88
|
|
89
|
-
|
90
|
-
|
89
|
+
if not self._yield_object_lists:
|
90
|
+
tv = dict(tv)
|
91
91
|
|
92
|
-
|
93
|
-
yield t
|
94
|
-
continue
|
92
|
+
return self._emit_value(tv)
|
95
93
|
|
96
|
-
|
94
|
+
#
|
97
95
|
|
98
|
-
|
99
|
-
|
100
|
-
|
96
|
+
elif e is BeginArray:
|
97
|
+
stk.append([])
|
98
|
+
return ()
|
101
99
|
|
102
|
-
|
103
|
-
|
104
|
-
|
100
|
+
elif e is EndArray:
|
101
|
+
if not stk or not isinstance(tv := stk.pop(), list):
|
102
|
+
raise self.StateError
|
105
103
|
|
106
|
-
|
107
|
-
yield t
|
108
|
-
continue
|
104
|
+
return self._emit_value(tv)
|
109
105
|
|
110
|
-
|
106
|
+
#
|
111
107
|
|
112
|
-
|
113
|
-
|
108
|
+
else:
|
109
|
+
raise TypeError(e)
|
omlish/formats/xml.py
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
"""
|
2
|
+
TODO:
|
3
|
+
- lxml abstraction
|
4
|
+
- stuff from ommlx/wiki
|
5
|
+
"""
|
6
|
+
import typing as ta
|
7
|
+
|
8
|
+
from .. import dataclasses as dc
|
9
|
+
from .. import lang
|
10
|
+
|
11
|
+
|
12
|
+
if ta.TYPE_CHECKING:
|
13
|
+
import xml.etree.ElementTree as ET
|
14
|
+
else:
|
15
|
+
ET = lang.proxy_import('xml.etree.ElementTree')
|
16
|
+
|
17
|
+
|
18
|
+
##
|
19
|
+
|
20
|
+
|
21
|
+
@dc.dataclass(frozen=True)
|
22
|
+
class SimpleElement:
|
23
|
+
tag: str
|
24
|
+
attributes: ta.Mapping[str, str] | None = dc.xfield(default=None, repr_fn=dc.truthy_repr)
|
25
|
+
body: ta.Sequence[ta.Union['SimpleElement', str]] | None = dc.xfield(default=None, repr_fn=dc.truthy_repr)
|
26
|
+
|
27
|
+
def as_dict(self) -> dict[str, ta.Any]:
|
28
|
+
dct: dict[str, ta.Any] = {'tag': self.tag}
|
29
|
+
if self.attributes:
|
30
|
+
dct['attributes'] = self.attributes
|
31
|
+
if self.body:
|
32
|
+
dct['body'] = [
|
33
|
+
c.as_dict() if isinstance(c, SimpleElement) else c
|
34
|
+
for c in self.body
|
35
|
+
]
|
36
|
+
return dct
|
37
|
+
|
38
|
+
|
39
|
+
def build_simple_element(element: 'ET.Element') -> SimpleElement:
|
40
|
+
atts = {}
|
41
|
+
for name, value in element.attrib.items():
|
42
|
+
atts[name] = value # noqa
|
43
|
+
|
44
|
+
body: list[SimpleElement | str] = []
|
45
|
+
|
46
|
+
if element.text and (s := element.text.strip()):
|
47
|
+
body.append(s)
|
48
|
+
|
49
|
+
for child in element:
|
50
|
+
body.append(build_simple_element(child))
|
51
|
+
|
52
|
+
if child.tail and (s := child.tail.strip()):
|
53
|
+
body.append(s)
|
54
|
+
|
55
|
+
return SimpleElement(
|
56
|
+
element.tag,
|
57
|
+
atts,
|
58
|
+
body,
|
59
|
+
)
|
60
|
+
|
61
|
+
|
62
|
+
def parse_tree(s: str) -> 'ET.ElementTree':
|
63
|
+
return ET.ElementTree(ET.fromstring(s.strip())) # noqa
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: omlish
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev84
|
4
4
|
Summary: omlish
|
5
5
|
Author: wrmsr
|
6
6
|
License: BSD-3-Clause
|
@@ -40,9 +40,9 @@ Requires-Dist: aiomysql ~=0.2 ; extra == 'all'
|
|
40
40
|
Requires-Dist: aiosqlite ~=0.20 ; extra == 'all'
|
41
41
|
Requires-Dist: asyncpg ~=0.30 ; extra == 'all'
|
42
42
|
Requires-Dist: apsw ~=3.46 ; extra == 'all'
|
43
|
+
Requires-Dist: sqlean.py ~=3.45 ; extra == 'all'
|
43
44
|
Requires-Dist: duckdb ~=1.1 ; extra == 'all'
|
44
45
|
Requires-Dist: pytest ~=8.0 ; extra == 'all'
|
45
|
-
Requires-Dist: sqlean.py ~=3.45 ; (python_version < "3.13") and extra == 'all'
|
46
46
|
Provides-Extra: async
|
47
47
|
Requires-Dist: anyio ~=4.6 ; extra == 'async'
|
48
48
|
Requires-Dist: sniffio ~=1.3 ; extra == 'async'
|
@@ -87,8 +87,8 @@ Requires-Dist: aiomysql ~=0.2 ; extra == 'sqldrivers'
|
|
87
87
|
Requires-Dist: aiosqlite ~=0.20 ; extra == 'sqldrivers'
|
88
88
|
Requires-Dist: asyncpg ~=0.30 ; extra == 'sqldrivers'
|
89
89
|
Requires-Dist: apsw ~=3.46 ; extra == 'sqldrivers'
|
90
|
+
Requires-Dist: sqlean.py ~=3.45 ; extra == 'sqldrivers'
|
90
91
|
Requires-Dist: duckdb ~=1.1 ; extra == 'sqldrivers'
|
91
|
-
Requires-Dist: sqlean.py ~=3.45 ; (python_version < "3.13") and extra == 'sqldrivers'
|
92
92
|
Provides-Extra: testing
|
93
93
|
Requires-Dist: pytest ~=8.0 ; extra == 'testing'
|
94
94
|
|
@@ -1,5 +1,5 @@
|
|
1
|
-
omlish/.manifests.json,sha256=
|
2
|
-
omlish/__about__.py,sha256=
|
1
|
+
omlish/.manifests.json,sha256=hTFp9tvE72BxKloIq1s1SS0LRQlIsvMtO69Sbc47rKg,1704
|
2
|
+
omlish/__about__.py,sha256=oOKwJVkrCVI_eRBapOS36eRWek5mbyQvP62epTd67RE,3345
|
3
3
|
omlish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
4
|
omlish/argparse.py,sha256=Dc73G8lyoQBLvXhMYUbzQUh4SJu_OTvKUXjSUxq_ang,7499
|
5
5
|
omlish/c3.py,sha256=4vogWgwPb8TbNS2KkZxpoWbwjj7MuHG2lQG-hdtkvjI,8062
|
@@ -132,10 +132,10 @@ omlish/dataclasses/impl/as_.py,sha256=CD-t7hkC1EP2F_jvZKIA_cVoDuwZ-Ln_xC4fJumPYX
|
|
132
132
|
omlish/dataclasses/impl/copy.py,sha256=Tn8_n6Vohs-w4otbGdubBEvhd3TsSTaM3EfNGdS2LYo,591
|
133
133
|
omlish/dataclasses/impl/descriptors.py,sha256=rEYE1Len99agTQCC25hSPMnM19BgPr0ZChABGi58Fdk,2476
|
134
134
|
omlish/dataclasses/impl/exceptions.py,sha256=-vqxZmfXVflymVuiM553XTlJProse5HEMktTpfdPCIY,1275
|
135
|
-
omlish/dataclasses/impl/fields.py,sha256=
|
135
|
+
omlish/dataclasses/impl/fields.py,sha256=4_5qMz9LlOS6U67cDKQ-oorTtSGGxR77I4hw88soM44,6878
|
136
136
|
omlish/dataclasses/impl/frozen.py,sha256=x87DSM8FIMZ3c_BIUE8NooCkExFjPsabeqIueEP5qKs,2988
|
137
137
|
omlish/dataclasses/impl/hashing.py,sha256=FKnHuXCg9ylrzK2TLGqO5yfRN4HX3F415CSLlVYXtYE,3190
|
138
|
-
omlish/dataclasses/impl/init.py,sha256=
|
138
|
+
omlish/dataclasses/impl/init.py,sha256=5kYcMDlI6EVeLQ6RCTk1bvYjb-cwg0AYfVE9FPZJlYI,6365
|
139
139
|
omlish/dataclasses/impl/internals.py,sha256=UvZYjrLT1S8ntyxJ_vRPIkPOF00K8HatGAygErgoXTU,2990
|
140
140
|
omlish/dataclasses/impl/main.py,sha256=Ti0PKbFKraKvfmoPuR-G7nLVNzRC8mvEuXhCuC-M2kc,2574
|
141
141
|
omlish/dataclasses/impl/metaclass.py,sha256=Fb0ExFiyYdOpvck4ayXMr_vEVDvHLhe28Ns3F4aduM8,3222
|
@@ -181,10 +181,9 @@ omlish/docker/manifests.py,sha256=LR4FpOGNUT3bZQ-gTjB6r_-1C3YiG30QvevZjrsVUQM,70
|
|
181
181
|
omlish/formats/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
182
182
|
omlish/formats/dotenv.py,sha256=UjZl3gac-0U24sDjCCGMcCqO1UCWG2Zs8PZ4JdAg2YE,17348
|
183
183
|
omlish/formats/props.py,sha256=JwFJbKblqzqnzXf7YKFzQSDfcAXzkKsfoYvad6FPy98,18945
|
184
|
+
omlish/formats/xml.py,sha256=FYNUliVZproz4cA3nOTqj0ShfPMQ7rEIeMEP4umDNho,1511
|
184
185
|
omlish/formats/yaml.py,sha256=wTW8ECG9jyA7qIFUqKZUro4KAKpN4IvcW_qhlrKveXM,6836
|
185
186
|
omlish/formats/json/__init__.py,sha256=xqW2APLGvCTO9dVTOlroR_AdrA5bCkdmUnbTkYHhJ7U,379
|
186
|
-
omlish/formats/json/__main__.py,sha256=1wxxKZVkj_u7HCcewwMIbGuZj_Wph95yrUbm474Op9M,188
|
187
|
-
omlish/formats/json/cli.py,sha256=HimX6N-VWnBh6MhyxjXKHw_VNn7tUkelRflpjWv3X3I,6210
|
188
187
|
omlish/formats/json/consts.py,sha256=u-x-qXqZvK0tWk3l3TrCTjk4mSjKmZ_ATdmd1hwHNAY,263
|
189
188
|
omlish/formats/json/encoding.py,sha256=O4iIWle7W_-RwpOvJNlqOfkbnDyiQHexV5Za4hlrFzw,497
|
190
189
|
omlish/formats/json/json.py,sha256=Mdqv2vdMi7gp96eV0BIYH5UdWpjWfsh-tSMZeywG-08,331
|
@@ -196,8 +195,12 @@ omlish/formats/json/backends/jiter.py,sha256=8qv_XWGpcupPtVm6Z_egHio_iY1Kk8eqkvX
|
|
196
195
|
omlish/formats/json/backends/orjson.py,sha256=wR8pMGFtkhZGHcNVk7vNYUnv8lUapdK89p6QpETIs9w,3778
|
197
196
|
omlish/formats/json/backends/std.py,sha256=PM00Kh9ZR2XzollHMEvdo35Eml1N-zFfRW-LOCV5ftM,3085
|
198
197
|
omlish/formats/json/backends/ujson.py,sha256=BNJCU4kluGHdqTUKLJEuHhE2m2TmqR7HEN289S0Eokg,2278
|
198
|
+
omlish/formats/json/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
199
|
+
omlish/formats/json/cli/__main__.py,sha256=1wxxKZVkj_u7HCcewwMIbGuZj_Wph95yrUbm474Op9M,188
|
200
|
+
omlish/formats/json/cli/cli.py,sha256=GkdNokklRuDWiXAIai1wijSBFVJlpdlNLTQ3Lyucos0,5493
|
201
|
+
omlish/formats/json/cli/formats.py,sha256=tqEZKby4HeafGcaUs-m8B-2ZV12dRo40rzL-V99cp00,1714
|
199
202
|
omlish/formats/json/stream/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
200
|
-
omlish/formats/json/stream/build.py,sha256=
|
203
|
+
omlish/formats/json/stream/build.py,sha256=6deXBxTx1toFAPShz2Jo5OiXxH5Y4ppG8gDPRFoUgjA,2461
|
201
204
|
omlish/formats/json/stream/lex.py,sha256=hMnsZld72XE7GCWdjbUANRxrruuBSSQeCm8wypMiMv0,6172
|
202
205
|
omlish/formats/json/stream/parse.py,sha256=WkbW7tvcdrTSluKhw70nPvjsq943eryVcjx8FSz78tM,5198
|
203
206
|
omlish/formats/json/stream/render.py,sha256=B9ZNuBiDJOT25prhIsZu1ICKjxk4eMPwpgQF37NPufs,3212
|
@@ -450,9 +453,9 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
|
|
450
453
|
omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
|
451
454
|
omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
|
452
455
|
omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
|
453
|
-
omlish-0.0.0.
|
454
|
-
omlish-0.0.0.
|
455
|
-
omlish-0.0.0.
|
456
|
-
omlish-0.0.0.
|
457
|
-
omlish-0.0.0.
|
458
|
-
omlish-0.0.0.
|
456
|
+
omlish-0.0.0.dev84.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
457
|
+
omlish-0.0.0.dev84.dist-info/METADATA,sha256=Ui6NExa9RJ31Hhf-FtoRkeGzkSw-2RiAy2bI-1Octl8,3987
|
458
|
+
omlish-0.0.0.dev84.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
|
459
|
+
omlish-0.0.0.dev84.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
|
460
|
+
omlish-0.0.0.dev84.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
|
461
|
+
omlish-0.0.0.dev84.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|