omlish 0.0.0.dev107__py3-none-any.whl → 0.0.0.dev108__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/__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.dev107.dist-info → omlish-0.0.0.dev108.dist-info}/METADATA +1 -1
- {omlish-0.0.0.dev107.dist-info → omlish-0.0.0.dev108.dist-info}/RECORD +19 -17
- {omlish-0.0.0.dev107.dist-info → omlish-0.0.0.dev108.dist-info}/LICENSE +0 -0
- {omlish-0.0.0.dev107.dist-info → omlish-0.0.0.dev108.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev107.dist-info → omlish-0.0.0.dev108.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev107.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
|