omlish 0.0.0.dev106__py3-none-any.whl → 0.0.0.dev108__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- omlish/__about__.py +2 -2
- omlish/dataclasses/impl/reflect.py +4 -15
- omlish/formats/json/__init__.py +14 -3
- omlish/formats/json/cli/cli.py +5 -6
- omlish/formats/json/cli/processing.py +6 -2
- omlish/lang/imports.py +34 -5
- omlish/marshal/iterables.py +4 -0
- omlish/marshal/namedtuples.py +111 -0
- omlish/marshal/standard.py +4 -0
- omlish/marshal/unions.py +21 -18
- omlish/reflect/__init__.py +4 -0
- omlish/reflect/inspect.py +23 -0
- omlish/reflect/types.py +15 -3
- {omlish-0.0.0.dev106.dist-info → omlish-0.0.0.dev108.dist-info}/METADATA +1 -1
- {omlish-0.0.0.dev106.dist-info → omlish-0.0.0.dev108.dist-info}/RECORD +19 -17
- {omlish-0.0.0.dev106.dist-info → omlish-0.0.0.dev108.dist-info}/LICENSE +0 -0
- {omlish-0.0.0.dev106.dist-info → omlish-0.0.0.dev108.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev106.dist-info → omlish-0.0.0.dev108.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev106.dist-info → omlish-0.0.0.dev108.dist-info}/top_level.txt +0 -0
omlish/__about__.py
CHANGED
@@ -3,7 +3,6 @@ TODO:
|
|
3
3
|
- more cache-recursive reuse - fields, mro, etc
|
4
4
|
"""
|
5
5
|
import dataclasses as dc
|
6
|
-
import inspect
|
7
6
|
import sys
|
8
7
|
import typing as ta
|
9
8
|
import weakref
|
@@ -28,22 +27,9 @@ from .params import get_params_extras
|
|
28
27
|
from .utils import Namespace
|
29
28
|
|
30
29
|
|
31
|
-
try:
|
32
|
-
import annotationlib # noqa
|
33
|
-
except ImportError:
|
34
|
-
annotationlib = None
|
35
|
-
|
36
|
-
|
37
30
|
MISSING = dc.MISSING
|
38
31
|
|
39
32
|
|
40
|
-
def _get_annotations(obj):
|
41
|
-
if annotationlib is not None:
|
42
|
-
return annotationlib.get_annotations(obj, format=annotationlib.Format.FORWARDREF) # noqa
|
43
|
-
else:
|
44
|
-
return inspect.get_annotations(obj)
|
45
|
-
|
46
|
-
|
47
33
|
class ClassInfo:
|
48
34
|
|
49
35
|
def __init__(self, cls: type, *, _constructing: bool = False) -> None:
|
@@ -67,7 +53,10 @@ class ClassInfo:
|
|
67
53
|
|
68
54
|
@cached.property
|
69
55
|
def cls_annotations(self) -> ta.Mapping[str, ta.Any]:
|
70
|
-
|
56
|
+
# Does not use ta.get_type_hints because that's what std dataclasses do [1]. Might be worth revisiting? A part
|
57
|
+
# of why they don't is to not import typing for efficiency but we don't care about that degree of startup speed.
|
58
|
+
# [1]: https://github.com/python/cpython/blob/54c63a32d06cb5f07a66245c375eac7d7efb964a/Lib/dataclasses.py#L985-L986 # noqa
|
59
|
+
return rfl.get_annotations(self._cls)
|
71
60
|
|
72
61
|
##
|
73
62
|
|
omlish/formats/json/__init__.py
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
# ruff: noqa: I001
|
2
|
+
import typing as _ta
|
3
|
+
|
4
|
+
from ... import lang as _lang
|
5
|
+
|
6
|
+
|
1
7
|
from .consts import ( # noqa
|
2
8
|
COMPACT_KWARGS,
|
3
9
|
COMPACT_SEPARATORS,
|
@@ -23,6 +29,11 @@ from .json import ( # noqa
|
|
23
29
|
loads,
|
24
30
|
)
|
25
31
|
|
26
|
-
|
27
|
-
|
28
|
-
|
32
|
+
if _ta.TYPE_CHECKING:
|
33
|
+
from .render import ( # noqa
|
34
|
+
JsonRenderer,
|
35
|
+
)
|
36
|
+
else:
|
37
|
+
_lang.proxy_init(globals(), '.render', [
|
38
|
+
'JsonRenderer',
|
39
|
+
])
|
omlish/formats/json/cli/cli.py
CHANGED
@@ -5,7 +5,7 @@ TODO:
|
|
5
5
|
|
6
6
|
==
|
7
7
|
|
8
|
-
jq Command options
|
8
|
+
jq Command options:
|
9
9
|
-n, --null-input use `null` as the single input value;
|
10
10
|
-R, --raw-input read each line as string instead of JSON;
|
11
11
|
-s, --slurp read all inputs into an array and use it as the single input value;
|
@@ -276,11 +276,10 @@ def _main() -> None:
|
|
276
276
|
renderer = EagerRenderer(cfg.rendering)
|
277
277
|
|
278
278
|
for buf in yield_input():
|
279
|
-
|
280
|
-
for
|
281
|
-
|
282
|
-
|
283
|
-
print(s, file=out)
|
279
|
+
for v in parser.parse(buf):
|
280
|
+
for e in processor.process(v):
|
281
|
+
s = renderer.render(e)
|
282
|
+
print(s, file=out)
|
284
283
|
|
285
284
|
else:
|
286
285
|
parser = EagerParser(cfg.format)
|
@@ -35,8 +35,12 @@ class Processor:
|
|
35
35
|
v = self._jmespath_expr.search(v)
|
36
36
|
|
37
37
|
if self._opts.flat:
|
38
|
-
if
|
39
|
-
|
38
|
+
if (
|
39
|
+
not isinstance(v, ta.Iterable) or # noqa
|
40
|
+
isinstance(v, ta.Mapping) or
|
41
|
+
isinstance(v, lang.BUILTIN_SCALAR_ITERABLE_TYPES)
|
42
|
+
):
|
43
|
+
raise TypeError(f'Flat output must be flat collections, got {type(v)}', v)
|
40
44
|
|
41
45
|
yield from v
|
42
46
|
|
omlish/lang/imports.py
CHANGED
@@ -1,12 +1,9 @@
|
|
1
1
|
import contextlib
|
2
|
-
import functools
|
3
2
|
import importlib.util
|
4
3
|
import sys
|
5
4
|
import types
|
6
5
|
import typing as ta
|
7
6
|
|
8
|
-
from .cached import cached_function
|
9
|
-
|
10
7
|
|
11
8
|
##
|
12
9
|
|
@@ -23,8 +20,40 @@ def can_import(name: str, package: str | None = None) -> bool:
|
|
23
20
|
##
|
24
21
|
|
25
22
|
|
26
|
-
def lazy_import(
|
27
|
-
|
23
|
+
def lazy_import(
|
24
|
+
name: str,
|
25
|
+
package: str | None = None,
|
26
|
+
*,
|
27
|
+
optional: bool = False,
|
28
|
+
cache_failure: bool = False,
|
29
|
+
) -> ta.Callable[[], ta.Any]:
|
30
|
+
result = not_set = object()
|
31
|
+
|
32
|
+
def inner():
|
33
|
+
nonlocal result
|
34
|
+
|
35
|
+
if result is not not_set:
|
36
|
+
if isinstance(result, Exception):
|
37
|
+
raise result
|
38
|
+
return result
|
39
|
+
|
40
|
+
try:
|
41
|
+
mod = importlib.import_module(name, package=package)
|
42
|
+
|
43
|
+
except Exception as e:
|
44
|
+
if optional:
|
45
|
+
if cache_failure:
|
46
|
+
result = None
|
47
|
+
return None
|
48
|
+
|
49
|
+
if cache_failure:
|
50
|
+
result = e
|
51
|
+
raise
|
52
|
+
|
53
|
+
result = mod
|
54
|
+
return mod
|
55
|
+
|
56
|
+
return inner
|
28
57
|
|
29
58
|
|
30
59
|
def proxy_import(
|
omlish/marshal/iterables.py
CHANGED
@@ -0,0 +1,111 @@
|
|
1
|
+
import inspect
|
2
|
+
import typing as ta
|
3
|
+
|
4
|
+
from .. import check
|
5
|
+
from .. import collections as col
|
6
|
+
from .. import lang
|
7
|
+
from .. import reflect as rfl
|
8
|
+
from .base import MarshalContext
|
9
|
+
from .base import Marshaler
|
10
|
+
from .base import MarshalerFactory
|
11
|
+
from .base import Option
|
12
|
+
from .base import UnmarshalContext
|
13
|
+
from .base import Unmarshaler
|
14
|
+
from .base import UnmarshalerFactory
|
15
|
+
from .objects import FieldInfo
|
16
|
+
from .objects import FieldInfos
|
17
|
+
from .objects import FieldMetadata
|
18
|
+
from .objects import ObjectMarshaler
|
19
|
+
from .objects import ObjectUnmarshaler
|
20
|
+
|
21
|
+
|
22
|
+
##
|
23
|
+
|
24
|
+
|
25
|
+
def _is_named_tuple(rty: rfl.Type) -> bool:
|
26
|
+
return (
|
27
|
+
isinstance(rty, type) and
|
28
|
+
issubclass(rty, tuple) and
|
29
|
+
ta.NamedTuple in rfl.get_orig_bases(rty)
|
30
|
+
)
|
31
|
+
|
32
|
+
|
33
|
+
def get_field_infos(
|
34
|
+
ty: type,
|
35
|
+
opts: col.TypeMap[Option] = col.TypeMap(),
|
36
|
+
) -> FieldInfos:
|
37
|
+
check.arg(_is_named_tuple(ty), ty)
|
38
|
+
|
39
|
+
sig = inspect.signature(ty)
|
40
|
+
|
41
|
+
ret: list[FieldInfo] = []
|
42
|
+
for param in sig.parameters.values():
|
43
|
+
ret.append(FieldInfo(
|
44
|
+
name=param.name,
|
45
|
+
type=param.annotation,
|
46
|
+
metadata=FieldMetadata(),
|
47
|
+
|
48
|
+
marshal_name=param.name,
|
49
|
+
unmarshal_names=[param.name],
|
50
|
+
))
|
51
|
+
|
52
|
+
return FieldInfos(ret)
|
53
|
+
|
54
|
+
|
55
|
+
##
|
56
|
+
|
57
|
+
|
58
|
+
class NamedtupleMarshalerFactory(MarshalerFactory):
|
59
|
+
def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
|
60
|
+
return _is_named_tuple(rty)
|
61
|
+
|
62
|
+
def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
|
63
|
+
check.state(_is_named_tuple(rty))
|
64
|
+
ty = check.isinstance(rty, type)
|
65
|
+
check.state(not lang.is_abstract_class(ty))
|
66
|
+
|
67
|
+
fis = get_field_infos(ty, ctx.options)
|
68
|
+
|
69
|
+
fields = [
|
70
|
+
(fi, ctx.make(fi.type))
|
71
|
+
for fi in fis
|
72
|
+
]
|
73
|
+
|
74
|
+
return ObjectMarshaler(
|
75
|
+
fields,
|
76
|
+
)
|
77
|
+
|
78
|
+
|
79
|
+
##
|
80
|
+
|
81
|
+
|
82
|
+
class NamedtupleUnmarshalerFactory(UnmarshalerFactory):
|
83
|
+
def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
|
84
|
+
return _is_named_tuple(rty)
|
85
|
+
|
86
|
+
def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
|
87
|
+
check.state(_is_named_tuple(rty))
|
88
|
+
ty = check.isinstance(rty, type)
|
89
|
+
check.state(not lang.is_abstract_class(ty))
|
90
|
+
|
91
|
+
fis = get_field_infos(ty, ctx.options)
|
92
|
+
|
93
|
+
d: dict[str, tuple[FieldInfo, Unmarshaler]] = {}
|
94
|
+
defaults: dict[str, ta.Any] = {}
|
95
|
+
|
96
|
+
for fi in fis:
|
97
|
+
tup = (fi, ctx.make(fi.type))
|
98
|
+
|
99
|
+
for un in fi.unmarshal_names:
|
100
|
+
if un in d:
|
101
|
+
raise KeyError(f'Duplicate fields for name {un!r}: {fi.name!r}, {d[un][0].name!r}')
|
102
|
+
d[un] = tup
|
103
|
+
|
104
|
+
if fi.options.default.present:
|
105
|
+
defaults[fi.name] = fi.options.default.must()
|
106
|
+
|
107
|
+
return ObjectUnmarshaler(
|
108
|
+
ty,
|
109
|
+
d,
|
110
|
+
defaults=defaults,
|
111
|
+
)
|
omlish/marshal/standard.py
CHANGED
@@ -21,6 +21,8 @@ from .mappings import MappingMarshalerFactory
|
|
21
21
|
from .mappings import MappingUnmarshalerFactory
|
22
22
|
from .maybes import MaybeMarshalerFactory
|
23
23
|
from .maybes import MaybeUnmarshalerFactory
|
24
|
+
from .namedtuples import NamedtupleMarshalerFactory
|
25
|
+
from .namedtuples import NamedtupleUnmarshalerFactory
|
24
26
|
from .newtypes import NewtypeMarshalerFactory
|
25
27
|
from .newtypes import NewtypeUnmarshalerFactory
|
26
28
|
from .numbers import NUMBERS_MARSHALER_FACTORY
|
@@ -44,6 +46,7 @@ STANDARD_MARSHALER_FACTORIES: list[MarshalerFactory] = [
|
|
44
46
|
OptionalMarshalerFactory(),
|
45
47
|
PrimitiveUnionMarshalerFactory(),
|
46
48
|
DataclassMarshalerFactory(),
|
49
|
+
NamedtupleMarshalerFactory(),
|
47
50
|
EnumMarshalerFactory(),
|
48
51
|
NUMBERS_MARSHALER_FACTORY,
|
49
52
|
UUID_MARSHALER_FACTORY,
|
@@ -75,6 +78,7 @@ STANDARD_UNMARSHALER_FACTORIES: list[UnmarshalerFactory] = [
|
|
75
78
|
OptionalUnmarshalerFactory(),
|
76
79
|
PrimitiveUnionUnmarshalerFactory(),
|
77
80
|
DataclassUnmarshalerFactory(),
|
81
|
+
NamedtupleUnmarshalerFactory(),
|
78
82
|
EnumUnmarshalerFactory(),
|
79
83
|
NUMBERS_UNMARSHALER_FACTORY,
|
80
84
|
UUID_UNMARSHALER_FACTORY,
|
omlish/marshal/unions.py
CHANGED
@@ -3,6 +3,7 @@ import typing as ta
|
|
3
3
|
from .. import cached
|
4
4
|
from .. import check
|
5
5
|
from .. import dataclasses as dc
|
6
|
+
from .. import lang
|
6
7
|
from .. import matchfns as mfs
|
7
8
|
from .. import reflect as rfl
|
8
9
|
from .base import MarshalContext
|
@@ -115,34 +116,36 @@ PRIMITIVE_UNION_UNMARSHALER_FACTORY = PrimitiveUnionUnmarshalerFactory()
|
|
115
116
|
|
116
117
|
|
117
118
|
@dc.dataclass(frozen=True)
|
118
|
-
class
|
119
|
+
class _BasePolymorphismUnionFactory(lang.Abstract):
|
119
120
|
impls: Impls
|
120
121
|
tt: TypeTagging = WrapperTypeTagging()
|
122
|
+
allow_partial: bool = dc.field(default=False, kw_only=True)
|
121
123
|
|
122
124
|
@cached.property
|
123
125
|
@dc.init
|
124
|
-
def
|
125
|
-
return
|
126
|
+
def rtys(self) -> frozenset[rfl.Type]:
|
127
|
+
return frozenset(i.ty for i in self.impls)
|
126
128
|
|
127
|
-
def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
|
128
|
-
|
129
|
+
def guard(self, ctx: MarshalContext | UnmarshalContext, rty: rfl.Type) -> bool:
|
130
|
+
if not isinstance(rty, rfl.Union):
|
131
|
+
return False
|
132
|
+
if self.allow_partial:
|
133
|
+
return not (rty.args - self.rtys)
|
134
|
+
else:
|
135
|
+
return rty.args == self.rtys
|
129
136
|
|
130
|
-
def
|
131
|
-
|
137
|
+
def get_impls(self, rty: rfl.Type) -> Impls:
|
138
|
+
uty = check.isinstance(rty, rfl.Union)
|
139
|
+
return Impls([self.impls.by_ty[check.isinstance(a, type)] for a in uty.args])
|
132
140
|
|
133
141
|
|
134
142
|
@dc.dataclass(frozen=True)
|
135
|
-
class
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
@cached.property
|
140
|
-
@dc.init
|
141
|
-
def rty(self) -> rfl.Union:
|
142
|
-
return rfl.type_(ta.Union[*tuple(i.ty for i in self.impls)]) # type: ignore
|
143
|
+
class PolymorphismUnionMarshalerFactory(_BasePolymorphismUnionFactory, MarshalerFactory):
|
144
|
+
def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
|
145
|
+
return make_polymorphism_marshaler(self.get_impls(rty), self.tt, ctx)
|
143
146
|
|
144
|
-
def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
|
145
|
-
return isinstance(rty, rfl.Union) and rty == self.rty
|
146
147
|
|
148
|
+
@dc.dataclass(frozen=True)
|
149
|
+
class PolymorphismUnionUnmarshalerFactory(_BasePolymorphismUnionFactory, UnmarshalerFactory):
|
147
150
|
def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
|
148
|
-
return make_polymorphism_unmarshaler(self.
|
151
|
+
return make_polymorphism_unmarshaler(self.get_impls(rty), self.tt, ctx)
|
omlish/reflect/__init__.py
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
"""
|
2
|
+
TODO:
|
3
|
+
- vs ta.get_type_hints?
|
4
|
+
"""
|
5
|
+
import typing as ta
|
6
|
+
|
7
|
+
from .. import lang
|
8
|
+
|
9
|
+
|
10
|
+
if ta.TYPE_CHECKING:
|
11
|
+
import inspect
|
12
|
+
else:
|
13
|
+
inspect = lang.proxy_import('inspect')
|
14
|
+
|
15
|
+
|
16
|
+
annotationlib = lang.lazy_import('annotationlib', optional=True, cache_failure=True)
|
17
|
+
|
18
|
+
|
19
|
+
def get_annotations(obj: ta.Any) -> ta.Mapping[str, ta.Any]:
|
20
|
+
if (al := annotationlib()) is not None:
|
21
|
+
return al.get_annotations(obj, format=al.Format.FORWARDREF) # noqa
|
22
|
+
else:
|
23
|
+
return inspect.get_annotations(obj)
|
omlish/reflect/types.py
CHANGED
@@ -42,7 +42,7 @@ _KNOWN_SPECIALS = [
|
|
42
42
|
v.__origin__,
|
43
43
|
v._nparams, # noqa
|
44
44
|
)
|
45
|
-
for v in ta.__dict__.values()
|
45
|
+
for v in ta.__dict__.values() # noqa
|
46
46
|
if isinstance(v, _SpecialGenericAlias)
|
47
47
|
]
|
48
48
|
|
@@ -78,7 +78,9 @@ def get_params(obj: ta.Any) -> tuple[ta.TypeVar, ...]:
|
|
78
78
|
return obj.__dict__.get('__parameters__', ()) # noqa
|
79
79
|
|
80
80
|
if (ks := _KNOWN_SPECIALS_BY_ORIGIN.get(obj)) is not None:
|
81
|
-
|
81
|
+
if (np := ks.nparams) < 0:
|
82
|
+
raise TypeError(obj)
|
83
|
+
return _KNOWN_SPECIAL_TYPE_VARS[:np]
|
82
84
|
|
83
85
|
oty = type(obj)
|
84
86
|
|
@@ -256,18 +258,26 @@ class Reflector:
|
|
256
258
|
):
|
257
259
|
origin = ta.get_origin(obj)
|
258
260
|
args = ta.get_args(obj)
|
261
|
+
|
259
262
|
if oty is _CallableGenericAlias:
|
260
263
|
p, r = args
|
261
264
|
if p is Ellipsis or isinstance(p, ta.ParamSpec):
|
262
265
|
raise TypeError(f'Callable argument not yet supported for {obj=}')
|
263
266
|
args = (*p, r)
|
264
267
|
params = _KNOWN_SPECIAL_TYPE_VARS[:len(args)]
|
268
|
+
|
269
|
+
elif origin is tuple:
|
270
|
+
params = _KNOWN_SPECIAL_TYPE_VARS[:len(args)]
|
271
|
+
|
265
272
|
elif origin is ta.Generic:
|
266
273
|
params = args
|
274
|
+
|
267
275
|
else:
|
268
276
|
params = get_params(origin)
|
277
|
+
|
269
278
|
if len(args) != len(params):
|
270
279
|
raise TypeError(f'Mismatched {args=} and {params=} for {obj=}')
|
280
|
+
|
271
281
|
return Generic(
|
272
282
|
origin,
|
273
283
|
tuple(self.type(a) for a in args),
|
@@ -289,7 +299,9 @@ class Reflector:
|
|
289
299
|
|
290
300
|
if isinstance(obj, _SpecialGenericAlias):
|
291
301
|
if (ks := _KNOWN_SPECIALS_BY_ALIAS.get(obj)) is not None:
|
292
|
-
|
302
|
+
if (np := ks.nparams) < 0:
|
303
|
+
raise TypeError(obj)
|
304
|
+
params = _KNOWN_SPECIAL_TYPE_VARS[:np]
|
293
305
|
return Generic(
|
294
306
|
ks.origin,
|
295
307
|
params,
|
@@ -1,5 +1,5 @@
|
|
1
1
|
omlish/.manifests.json,sha256=hTFp9tvE72BxKloIq1s1SS0LRQlIsvMtO69Sbc47rKg,1704
|
2
|
-
omlish/__about__.py,sha256=
|
2
|
+
omlish/__about__.py,sha256=nnMnzzIpQQBYqkBJnDhTgHSf5k4qBFwZmWBnq36lwnk,3352
|
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
|
@@ -143,7 +143,7 @@ omlish/dataclasses/impl/metadata.py,sha256=4veWwTr-aA0KP-Y1cPEeOcXHup9EKJTYNJ0oz
|
|
143
143
|
omlish/dataclasses/impl/order.py,sha256=zWvWDkSTym8cc7vO1cLHqcBhhjOlucHOCUVJcdh4jt0,1369
|
144
144
|
omlish/dataclasses/impl/params.py,sha256=MWRL0IhulYP0dycWnK3j-0ej0uTgeE_jIlKFiE9MnI0,2836
|
145
145
|
omlish/dataclasses/impl/processing.py,sha256=DFxyFjL_h3awRyF_5eyTnB8QkuApx7Zc4QFnVoltlao,459
|
146
|
-
omlish/dataclasses/impl/reflect.py,sha256
|
146
|
+
omlish/dataclasses/impl/reflect.py,sha256=-yEkg30fOHmMf5LQbzy6DFuDpQjuljsfV517_a74VAc,5365
|
147
147
|
omlish/dataclasses/impl/replace.py,sha256=wS9GHX4fIwaPv1JBJzIewdBfXyK3X3V7_t55Da87dYo,1217
|
148
148
|
omlish/dataclasses/impl/repr.py,sha256=oLXBTxqp88NKmz82HrJeGiTEiwK4l5LlXQT9Q0-tX3c,1605
|
149
149
|
omlish/dataclasses/impl/simple.py,sha256=EovA-GpmQYtB_svItO2byTAWqbKGF4njz0MdQts3QBU,3157
|
@@ -183,7 +183,7 @@ omlish/formats/dotenv.py,sha256=UjZl3gac-0U24sDjCCGMcCqO1UCWG2Zs8PZ4JdAg2YE,1734
|
|
183
183
|
omlish/formats/props.py,sha256=JwFJbKblqzqnzXf7YKFzQSDfcAXzkKsfoYvad6FPy98,18945
|
184
184
|
omlish/formats/xml.py,sha256=ggiOwSERt4d9XmZwLZiDIh5qnFJS4jdmow9m9_9USps,1491
|
185
185
|
omlish/formats/yaml.py,sha256=wTW8ECG9jyA7qIFUqKZUro4KAKpN4IvcW_qhlrKveXM,6836
|
186
|
-
omlish/formats/json/__init__.py,sha256=
|
186
|
+
omlish/formats/json/__init__.py,sha256=xP1_VdDhvgOW9wojwPzVJ7FGOYi9iJ99BzdYTwiIYMA,607
|
187
187
|
omlish/formats/json/consts.py,sha256=A0cTAGGLyjo-gcYIQrL4JIaardI0yPMhQoNmh42BaRg,387
|
188
188
|
omlish/formats/json/encoding.py,sha256=O4iIWle7W_-RwpOvJNlqOfkbnDyiQHexV5Za4hlrFzw,497
|
189
189
|
omlish/formats/json/json.py,sha256=Mdqv2vdMi7gp96eV0BIYH5UdWpjWfsh-tSMZeywG-08,331
|
@@ -197,11 +197,11 @@ omlish/formats/json/backends/std.py,sha256=PM00Kh9ZR2XzollHMEvdo35Eml1N-zFfRW-LO
|
|
197
197
|
omlish/formats/json/backends/ujson.py,sha256=BNJCU4kluGHdqTUKLJEuHhE2m2TmqR7HEN289S0Eokg,2278
|
198
198
|
omlish/formats/json/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
199
199
|
omlish/formats/json/cli/__main__.py,sha256=1wxxKZVkj_u7HCcewwMIbGuZj_Wph95yrUbm474Op9M,188
|
200
|
-
omlish/formats/json/cli/cli.py,sha256=
|
200
|
+
omlish/formats/json/cli/cli.py,sha256=dRtkX9cqXmff0RnYXAyXX324zbi2z0cg2Efp_5BOx0k,9575
|
201
201
|
omlish/formats/json/cli/formats.py,sha256=FUZ0ptn3n0ljei2_o0t5UtmZkMB3_5p1pE-hgDD3-ak,1721
|
202
202
|
omlish/formats/json/cli/io.py,sha256=IoJ5asjS_gUan5TcrGgS0KpJaiSE5YQgEGljFMCcDto,1427
|
203
203
|
omlish/formats/json/cli/parsing.py,sha256=GfD6Om9FDaTJ662qROKSftSdp95tbw22Ids_vkMJV7U,2100
|
204
|
-
omlish/formats/json/cli/processing.py,sha256=
|
204
|
+
omlish/formats/json/cli/processing.py,sha256=UXHA_5El1qSDjPlJBBfREzHA_T2GNmP6nD1X99GNqOM,1214
|
205
205
|
omlish/formats/json/cli/rendering.py,sha256=cmnGAUqY0vKlMYHMBydIBgbs23Isdobf1F8cRk8o9f0,2182
|
206
206
|
omlish/formats/json/stream/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
207
207
|
omlish/formats/json/stream/build.py,sha256=MSxgreWSfI5CzNAdgQrArZ0yWqDsaHl-shI_jmjLDms,2505
|
@@ -274,7 +274,7 @@ omlish/lang/datetimes.py,sha256=ehI_DhQRM-bDxAavnp470XcekbbXc4Gdw9y1KpHDJT0,223
|
|
274
274
|
omlish/lang/descriptors.py,sha256=RRBbkMgTzg82fFFE4D0muqobpM-ZZaOta6yB1lpX3s8,6617
|
275
275
|
omlish/lang/exceptions.py,sha256=qJBo3NU1mOWWm-NhQUHCY5feYXR3arZVyEHinLsmRH4,47
|
276
276
|
omlish/lang/functions.py,sha256=kkPfcdocg-OmyN7skIqrFxNvqAv89Zc_kXKYAN8vw8g,3895
|
277
|
-
omlish/lang/imports.py,sha256=
|
277
|
+
omlish/lang/imports.py,sha256=vYc2vje10aJuJMvmpsGbEAQFX0j55MHbSURDFngJ2Go,9257
|
278
278
|
omlish/lang/iterables.py,sha256=xRwktm6i2RHSb_ELfAXdjITIfE69qDyMEzgeZqvQXiU,2386
|
279
279
|
omlish/lang/maybes.py,sha256=NYHZDjqDtwPMheDrj2VtUVujxRPf8Qpgk4ZlZCTvBZc,3492
|
280
280
|
omlish/lang/objects.py,sha256=LOC3JvX1g5hPxJ7Sv2TK9kNkAo9c8J-Jw2NmClR_rkA,4576
|
@@ -330,9 +330,10 @@ omlish/marshal/factories.py,sha256=UV2Svjok-lTWsRqKGh-CeuAhvlohw9uJe7ZLyoKMvTM,2
|
|
330
330
|
omlish/marshal/forbidden.py,sha256=BNshzm4lN5O8sUZ1YvxrSYq3WPklq9NMQCRZ7RC3DLM,865
|
331
331
|
omlish/marshal/global_.py,sha256=K76wB1-pdg4VWgiqR7wyxRNYr-voJApexYW2nV-R4DM,1127
|
332
332
|
omlish/marshal/helpers.py,sha256=-SOgYJmrURILHpPK6Wu3cCvhj8RJrqfJxuKhh9UMs7o,1102
|
333
|
-
omlish/marshal/iterables.py,sha256=
|
333
|
+
omlish/marshal/iterables.py,sha256=sPkbWJa6gSbAxsVojLDqF4BZA_xURmlXkHM4yJ1Jh2s,2630
|
334
334
|
omlish/marshal/mappings.py,sha256=s2cFSLyo0PM1eoQ2-SONtFSOldk5ARsBj55-icvWZ5o,2787
|
335
335
|
omlish/marshal/maybes.py,sha256=mgK3QsWHkXgRqo076KxYKH6elRxzJ_QDTodv93mgHR0,2198
|
336
|
+
omlish/marshal/namedtuples.py,sha256=H0icxcE5FrqgfI9dRc8LlXJy430g_yuILTCVD0Zvfd0,2799
|
336
337
|
omlish/marshal/naming.py,sha256=lIklR_Od4x1ghltAgOzqcKhHs-leeSv2YmFhCHO7GIs,613
|
337
338
|
omlish/marshal/newtypes.py,sha256=fRpXLoCpoiaqcvl7v92I1_Qt7udn4vsPc1P3UfcBu-8,841
|
338
339
|
omlish/marshal/nop.py,sha256=2mWve_dicFAiUQ2Y5asKkUW-XGmEE9Qi2ClIasFad0c,461
|
@@ -342,8 +343,8 @@ omlish/marshal/optionals.py,sha256=r0XB5rqfasvgZJNrKYd6Unq2U4nHt3JURi26j0dYHlw,1
|
|
342
343
|
omlish/marshal/polymorphism.py,sha256=2SxrfneA9QdhNdxieEGFnHDHpUo3ftETA9dMbCbmbWY,6511
|
343
344
|
omlish/marshal/primitives.py,sha256=f_6m24Cb-FDGsZpYSas11nLt3xCCEUXugw3Hv4-aNhg,1291
|
344
345
|
omlish/marshal/registries.py,sha256=FvC6qXHCizNB2QmU_N3orxW7iqfGYkiUXYYdTRWS6HA,2353
|
345
|
-
omlish/marshal/standard.py,sha256=
|
346
|
-
omlish/marshal/unions.py,sha256=
|
346
|
+
omlish/marshal/standard.py,sha256=jarT6qEzwIAnZiJ24__AnNWVOJPV9z7LY_fvLvlwEWM,3319
|
347
|
+
omlish/marshal/unions.py,sha256=Ghd1robwbCXqd5ssmgjIBf1nQ_A0RlIoL49VQQrSRyo,4355
|
347
348
|
omlish/marshal/utils.py,sha256=puKJpwPpuDlMOIrKMcLTRLJyMiL6n_Xs-p59AuDEymA,543
|
348
349
|
omlish/marshal/uuids.py,sha256=H4B7UX_EPNmP2tC8bubcKrPLTS4aQu98huvbXQ3Zv2g,910
|
349
350
|
omlish/marshal/values.py,sha256=ssHiWdg_L6M17kAn8GiGdPW7UeQOm3RDikWkvwblf5I,263
|
@@ -351,11 +352,12 @@ omlish/math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
351
352
|
omlish/math/bits.py,sha256=yip1l8agOYzT7bFyMGc0RR3XlnGCfHMpjw_SECLLh1I,3477
|
352
353
|
omlish/math/floats.py,sha256=UimhOT7KRl8LXTzOI5cQWoX_9h6WNWe_3vcOuO7-h_8,327
|
353
354
|
omlish/math/stats.py,sha256=MegzKVsmv2kra4jDWLOUgV0X7Ee2Tbl5u6ql1v4-dEY,10053
|
354
|
-
omlish/reflect/__init__.py,sha256=
|
355
|
+
omlish/reflect/__init__.py,sha256=3XME1VdOmmf8Qp3e8iTcqmRw6rzFzE3HQbM8fMNqY44,807
|
356
|
+
omlish/reflect/inspect.py,sha256=veJ424-9oZrqyvhVpvxOi7hcKW-PDBkdYL2yjrFlk4o,495
|
355
357
|
omlish/reflect/isinstance.py,sha256=x5T9S2634leinBT4hl3CZZkRttvdvvlxChkC_x9Qu2s,1176
|
356
358
|
omlish/reflect/ops.py,sha256=RJ6jzrM4ieFsXzWyNXWV43O_WgzEaUvlHSc5N2ezW2A,2044
|
357
359
|
omlish/reflect/subst.py,sha256=JM2RGv2-Rcex8wCqhmgvRG59zD242P9jM3O2QLjKWWo,3586
|
358
|
-
omlish/reflect/types.py,sha256=
|
360
|
+
omlish/reflect/types.py,sha256=B1zbq3yHo6B5JeNOXbmaxm78kqZTRb_4jIWY5GxzY4Q,8155
|
359
361
|
omlish/secrets/__init__.py,sha256=SGB1KrlNrxlNpazEHYy95NTzteLi8ndoEgMhU7luBl8,420
|
360
362
|
omlish/secrets/crypto.py,sha256=6CsLy0UEqCrBK8Xx_3-iFF6SKtu2GlEqUQ8-MliY3tk,3709
|
361
363
|
omlish/secrets/marshal.py,sha256=U9uSRTWzZmumfNZeh_dROwVdGrARsp155TylRbjilP8,2048
|
@@ -467,9 +469,9 @@ omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,329
|
|
467
469
|
omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
|
468
470
|
omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
|
469
471
|
omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
|
470
|
-
omlish-0.0.0.
|
471
|
-
omlish-0.0.0.
|
472
|
-
omlish-0.0.0.
|
473
|
-
omlish-0.0.0.
|
474
|
-
omlish-0.0.0.
|
475
|
-
omlish-0.0.0.
|
472
|
+
omlish-0.0.0.dev108.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
473
|
+
omlish-0.0.0.dev108.dist-info/METADATA,sha256=YT-AOzWICV5yww_4mweKcISx4dcR21NI6du4Lgambv0,4000
|
474
|
+
omlish-0.0.0.dev108.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
|
475
|
+
omlish-0.0.0.dev108.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
|
476
|
+
omlish-0.0.0.dev108.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
|
477
|
+
omlish-0.0.0.dev108.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|