omlish 0.0.0.dev447__py3-none-any.whl → 0.0.0.dev484__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.
Potentially problematic release.
This version of omlish might be problematic. Click here for more details.
- omlish/.omlish-manifests.json +12 -0
- omlish/__about__.py +15 -15
- omlish/argparse/all.py +17 -9
- omlish/argparse/cli.py +16 -3
- omlish/argparse/utils.py +21 -0
- omlish/asyncs/asyncio/rlock.py +110 -0
- omlish/asyncs/asyncio/sync.py +43 -0
- omlish/asyncs/asyncio/utils.py +2 -0
- omlish/asyncs/sync.py +25 -0
- omlish/bootstrap/_marshal.py +1 -1
- omlish/bootstrap/diag.py +12 -21
- omlish/bootstrap/main.py +2 -5
- omlish/bootstrap/sys.py +27 -28
- omlish/cexts/__init__.py +0 -0
- omlish/cexts/include/omlish/omlish.hh +1 -0
- omlish/collections/__init__.py +13 -1
- omlish/collections/attrregistry.py +210 -0
- omlish/collections/cache/impl.py +1 -0
- omlish/collections/identity.py +1 -0
- omlish/collections/mappings.py +28 -0
- omlish/collections/trie.py +5 -1
- omlish/collections/utils.py +77 -0
- omlish/concurrent/all.py +2 -1
- omlish/concurrent/futures.py +25 -0
- omlish/concurrent/threadlets.py +1 -1
- omlish/daemons/reparent.py +2 -3
- omlish/daemons/spawning.py +2 -3
- omlish/dataclasses/__init__.py +2 -0
- omlish/dataclasses/impl/api/classes/decorator.py +3 -0
- omlish/dataclasses/impl/api/classes/make.py +3 -0
- omlish/dataclasses/impl/concerns/repr.py +15 -2
- omlish/dataclasses/impl/configs.py +97 -37
- omlish/dataclasses/impl/generation/compilation.py +21 -19
- omlish/dataclasses/impl/generation/globals.py +1 -0
- omlish/dataclasses/impl/generation/ops.py +1 -0
- omlish/dataclasses/impl/generation/processor.py +105 -24
- omlish/dataclasses/impl/processing/base.py +8 -0
- omlish/dataclasses/impl/processing/driving.py +8 -8
- omlish/dataclasses/specs.py +1 -0
- omlish/dataclasses/tools/modifiers.py +5 -0
- omlish/diag/cmds/__init__.py +0 -0
- omlish/diag/{lslocks.py → cmds/lslocks.py} +6 -6
- omlish/diag/{lsof.py → cmds/lsof.py} +6 -6
- omlish/diag/{ps.py → cmds/ps.py} +6 -6
- omlish/diag/pycharm.py +16 -2
- omlish/diag/pydevd.py +58 -40
- omlish/diag/replserver/console.py +1 -1
- omlish/dispatch/__init__.py +18 -12
- omlish/dispatch/methods.py +50 -140
- omlish/dom/rendering.py +1 -1
- omlish/formats/dotenv.py +1 -1
- omlish/formats/json/stream/__init__.py +13 -0
- omlish/funcs/guard.py +225 -0
- omlish/graphs/dot/rendering.py +1 -1
- omlish/http/all.py +44 -4
- omlish/http/clients/asyncs.py +33 -27
- omlish/http/clients/base.py +17 -1
- omlish/http/clients/coro/__init__.py +0 -0
- omlish/http/clients/coro/sync.py +171 -0
- omlish/http/clients/default.py +208 -29
- omlish/http/clients/executor.py +56 -0
- omlish/http/clients/httpx.py +72 -11
- omlish/http/clients/middleware.py +181 -0
- omlish/http/clients/sync.py +33 -27
- omlish/http/clients/syncasync.py +49 -0
- omlish/http/clients/urllib.py +6 -3
- omlish/http/coro/client/connection.py +15 -6
- omlish/http/coro/io.py +2 -0
- omlish/http/flasky/__init__.py +40 -0
- omlish/http/flasky/_compat.py +2 -0
- omlish/http/flasky/api.py +82 -0
- omlish/http/flasky/app.py +203 -0
- omlish/http/flasky/cvs.py +59 -0
- omlish/http/flasky/requests.py +20 -0
- omlish/http/flasky/responses.py +23 -0
- omlish/http/flasky/routes.py +23 -0
- omlish/http/flasky/types.py +15 -0
- omlish/http/urls.py +67 -0
- omlish/inject/__init__.py +38 -18
- omlish/inject/_dataclasses.py +4986 -0
- omlish/inject/binder.py +4 -48
- omlish/inject/elements.py +27 -0
- omlish/inject/helpers/__init__.py +0 -0
- omlish/inject/{utils.py → helpers/constfn.py} +3 -3
- omlish/inject/{tags.py → helpers/id.py} +2 -2
- omlish/inject/helpers/multis.py +143 -0
- omlish/inject/helpers/wrappers.py +54 -0
- omlish/inject/impl/elements.py +47 -17
- omlish/inject/impl/injector.py +20 -19
- omlish/inject/impl/inspect.py +10 -1
- omlish/inject/impl/maysync.py +3 -4
- omlish/inject/impl/multis.py +3 -0
- omlish/inject/impl/sync.py +3 -4
- omlish/inject/injector.py +31 -2
- omlish/inject/inspect.py +35 -0
- omlish/inject/maysync.py +2 -4
- omlish/inject/multis.py +8 -0
- omlish/inject/overrides.py +3 -3
- omlish/inject/privates.py +6 -0
- omlish/inject/providers.py +3 -2
- omlish/inject/sync.py +5 -4
- omlish/io/buffers.py +118 -0
- omlish/io/readers.py +29 -0
- omlish/iterators/transforms.py +2 -2
- omlish/lang/__init__.py +178 -97
- omlish/lang/_asyncs.cc +186 -0
- omlish/lang/asyncs.py +17 -0
- omlish/lang/casing.py +11 -0
- omlish/lang/contextmanagers.py +28 -4
- omlish/lang/functions.py +31 -22
- omlish/lang/imports/_capture.cc +11 -9
- omlish/lang/imports/capture.py +363 -170
- omlish/lang/imports/proxy.py +455 -152
- omlish/lang/lazyglobals.py +22 -9
- omlish/lang/params.py +17 -0
- omlish/lang/recursion.py +0 -1
- omlish/lang/sequences.py +124 -0
- omlish/lite/abstract.py +54 -24
- omlish/lite/asyncs.py +2 -2
- omlish/lite/attrops.py +2 -0
- omlish/lite/contextmanagers.py +4 -4
- omlish/lite/dataclasses.py +44 -0
- omlish/lite/maybes.py +8 -0
- omlish/lite/maysync.py +1 -5
- omlish/lite/pycharm.py +1 -1
- omlish/lite/typing.py +6 -0
- omlish/logs/all.py +1 -1
- omlish/logs/utils.py +1 -1
- omlish/manifests/loading.py +2 -1
- omlish/marshal/__init__.py +33 -13
- omlish/marshal/_dataclasses.py +2774 -0
- omlish/marshal/base/configs.py +12 -0
- omlish/marshal/base/contexts.py +36 -21
- omlish/marshal/base/funcs.py +8 -11
- omlish/marshal/base/options.py +8 -0
- omlish/marshal/base/registries.py +146 -44
- omlish/marshal/base/types.py +40 -16
- omlish/marshal/composite/iterables.py +33 -20
- omlish/marshal/composite/literals.py +20 -18
- omlish/marshal/composite/mappings.py +36 -23
- omlish/marshal/composite/maybes.py +29 -19
- omlish/marshal/composite/newtypes.py +16 -16
- omlish/marshal/composite/optionals.py +14 -14
- omlish/marshal/composite/special.py +15 -15
- omlish/marshal/composite/unions/__init__.py +0 -0
- omlish/marshal/composite/unions/literals.py +93 -0
- omlish/marshal/composite/unions/primitives.py +103 -0
- omlish/marshal/factories/invalidate.py +18 -68
- omlish/marshal/factories/method.py +26 -0
- omlish/marshal/factories/moduleimport/factories.py +22 -65
- omlish/marshal/factories/multi.py +13 -25
- omlish/marshal/factories/recursive.py +42 -56
- omlish/marshal/factories/typecache.py +29 -74
- omlish/marshal/factories/typemap.py +42 -43
- omlish/marshal/objects/dataclasses.py +129 -106
- omlish/marshal/objects/marshal.py +18 -14
- omlish/marshal/objects/namedtuples.py +48 -42
- omlish/marshal/objects/unmarshal.py +19 -15
- omlish/marshal/polymorphism/marshal.py +9 -11
- omlish/marshal/polymorphism/metadata.py +16 -5
- omlish/marshal/polymorphism/standard.py +13 -1
- omlish/marshal/polymorphism/unions.py +15 -105
- omlish/marshal/polymorphism/unmarshal.py +9 -10
- omlish/marshal/singular/enums.py +14 -18
- omlish/marshal/standard.py +10 -6
- omlish/marshal/trivial/any.py +1 -1
- omlish/marshal/trivial/forbidden.py +21 -26
- omlish/metadata.py +23 -1
- omlish/os/forkhooks.py +4 -0
- omlish/os/pidfiles/pinning.py +2 -2
- omlish/reflect/types.py +1 -0
- omlish/secrets/marshal.py +1 -1
- omlish/specs/jmespath/__init__.py +12 -3
- omlish/specs/jmespath/_dataclasses.py +2893 -0
- omlish/specs/jmespath/ast.py +1 -1
- omlish/specs/jsonrpc/__init__.py +13 -0
- omlish/specs/jsonrpc/_marshal.py +32 -23
- omlish/specs/jsonrpc/conns.py +10 -7
- omlish/specs/jsonschema/_marshal.py +1 -1
- omlish/specs/jsonschema/keywords/__init__.py +7 -0
- omlish/specs/jsonschema/keywords/_dataclasses.py +1644 -0
- omlish/specs/openapi/_marshal.py +31 -22
- omlish/sql/{tabledefs/alchemy.py → alchemy/tabledefs.py} +2 -2
- omlish/sql/queries/_marshal.py +2 -2
- omlish/sql/queries/rendering.py +1 -1
- omlish/sql/tabledefs/_marshal.py +1 -1
- omlish/subprocesses/base.py +4 -0
- omlish/subprocesses/editor.py +1 -1
- omlish/sync.py +155 -21
- omlish/term/alt.py +60 -0
- omlish/term/confirm.py +8 -8
- omlish/term/pager.py +235 -0
- omlish/term/terminfo.py +935 -0
- omlish/term/termstate.py +67 -0
- omlish/term/vt100/terminal.py +0 -3
- omlish/testing/pytest/plugins/asyncs/fixtures.py +4 -1
- omlish/testing/pytest/plugins/skips.py +2 -1
- omlish/testing/unittest/main.py +3 -3
- omlish/text/docwrap/__init__.py +3 -0
- omlish/text/docwrap/__main__.py +11 -0
- omlish/text/docwrap/api.py +83 -0
- omlish/text/docwrap/cli.py +86 -0
- omlish/text/docwrap/groups.py +84 -0
- omlish/text/docwrap/lists.py +167 -0
- omlish/text/docwrap/parts.py +146 -0
- omlish/text/docwrap/reflowing.py +106 -0
- omlish/text/docwrap/rendering.py +151 -0
- omlish/text/docwrap/utils.py +11 -0
- omlish/text/docwrap/wrapping.py +59 -0
- omlish/text/filecache.py +2 -2
- omlish/text/lorem.py +6 -0
- omlish/text/parts.py +2 -2
- omlish/text/textwrap.py +51 -0
- omlish/typedvalues/marshal.py +85 -59
- omlish/typedvalues/values.py +2 -1
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/METADATA +29 -28
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/RECORD +222 -171
- omlish/dataclasses/impl/generation/mangling.py +0 -18
- omlish/funcs/match.py +0 -227
- omlish/marshal/factories/match.py +0 -34
- omlish/marshal/factories/simple.py +0 -28
- /omlish/inject/impl/{providers2.py → providersmap.py} +0 -0
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev484.dist-info}/top_level.txt +0 -0
|
@@ -5,14 +5,12 @@ from ... import check
|
|
|
5
5
|
from ... import dataclasses as dc
|
|
6
6
|
from ... import lang
|
|
7
7
|
from ... import reflect as rfl
|
|
8
|
-
from
|
|
9
|
-
from ..base.contexts import
|
|
10
|
-
from ..base.contexts import UnmarshalContext
|
|
8
|
+
from ..base.contexts import MarshalFactoryContext
|
|
9
|
+
from ..base.contexts import UnmarshalFactoryContext
|
|
11
10
|
from ..base.types import Marshaler
|
|
11
|
+
from ..base.types import MarshalerFactory
|
|
12
12
|
from ..base.types import Unmarshaler
|
|
13
|
-
from ..base.
|
|
14
|
-
from ..factories.simple import SimpleMarshalerFactory
|
|
15
|
-
from ..factories.simple import SimpleUnmarshalerFactory
|
|
13
|
+
from ..base.types import UnmarshalerFactory
|
|
16
14
|
from .marshal import make_polymorphism_marshaler
|
|
17
15
|
from .metadata import Impls
|
|
18
16
|
from .metadata import TypeTagging
|
|
@@ -23,98 +21,6 @@ from .unmarshal import make_polymorphism_unmarshaler
|
|
|
23
21
|
##
|
|
24
22
|
|
|
25
23
|
|
|
26
|
-
class MatchUnionMarshaler(Marshaler):
|
|
27
|
-
mmf: mfs.MultiMatchFn[[UnmarshalContext, Value], ta.Any]
|
|
28
|
-
|
|
29
|
-
def marshal(self, ctx: MarshalContext, o: ta.Any) -> Value:
|
|
30
|
-
try:
|
|
31
|
-
m = self.mmf.match(ctx, o)
|
|
32
|
-
except mfs.AmbiguousMatchesError:
|
|
33
|
-
raise ValueError(o) # noqa
|
|
34
|
-
return m.fn(ctx, o)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
class MatchUnionUnmarshaler(Unmarshaler):
|
|
38
|
-
mmf: mfs.MultiMatchFn[[UnmarshalContext, Value], ta.Any]
|
|
39
|
-
|
|
40
|
-
def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any:
|
|
41
|
-
try:
|
|
42
|
-
m = self.mmf.match(ctx, v)
|
|
43
|
-
except mfs.AmbiguousMatchesError:
|
|
44
|
-
raise ValueError(v) # noqa
|
|
45
|
-
return m.fn(ctx, v)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
##
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
PRIMITIVE_UNION_TYPES: tuple[type, ...] = (
|
|
52
|
-
float,
|
|
53
|
-
int,
|
|
54
|
-
str,
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
#
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
@dc.dataclass(frozen=True)
|
|
62
|
-
class PrimitiveUnionMarshaler(Marshaler):
|
|
63
|
-
tys: ta.Sequence[type]
|
|
64
|
-
|
|
65
|
-
def marshal(self, ctx: MarshalContext, o: ta.Any) -> Value:
|
|
66
|
-
if type(o) not in self.tys:
|
|
67
|
-
raise TypeError(o)
|
|
68
|
-
return o
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
@dc.dataclass(frozen=True)
|
|
72
|
-
class PrimitiveUnionMarshalerFactory(SimpleMarshalerFactory):
|
|
73
|
-
tys: ta.Sequence[type] = PRIMITIVE_UNION_TYPES
|
|
74
|
-
|
|
75
|
-
def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
|
|
76
|
-
return isinstance(rty, rfl.Union) and all(a in self.tys for a in rty.args)
|
|
77
|
-
|
|
78
|
-
def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
|
|
79
|
-
args = check.isinstance(rty, rfl.Union).args
|
|
80
|
-
return PrimitiveUnionMarshaler([t for t in self.tys if t in args])
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
#
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
@dc.dataclass(frozen=True)
|
|
87
|
-
class PrimitiveUnionUnmarshaler(Unmarshaler):
|
|
88
|
-
tys: ta.Sequence[type]
|
|
89
|
-
|
|
90
|
-
def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any:
|
|
91
|
-
if type(v) not in self.tys:
|
|
92
|
-
raise TypeError(v)
|
|
93
|
-
return v
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
@dc.dataclass(frozen=True)
|
|
97
|
-
class PrimitiveUnionUnmarshalerFactory(SimpleUnmarshalerFactory):
|
|
98
|
-
tys: ta.Sequence[type] = PRIMITIVE_UNION_TYPES
|
|
99
|
-
|
|
100
|
-
def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
|
|
101
|
-
return isinstance(rty, rfl.Union) and all(a in self.tys for a in rty.args)
|
|
102
|
-
|
|
103
|
-
def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
|
|
104
|
-
args = check.isinstance(rty, rfl.Union).args
|
|
105
|
-
return PrimitiveUnionUnmarshaler([t for t in self.tys if t in args])
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
#
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
PRIMITIVE_UNION_MARSHALER_FACTORY = PrimitiveUnionMarshalerFactory()
|
|
112
|
-
PRIMITIVE_UNION_UNMARSHALER_FACTORY = PrimitiveUnionUnmarshalerFactory()
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
##
|
|
116
|
-
|
|
117
|
-
|
|
118
24
|
@dc.dataclass(frozen=True)
|
|
119
25
|
class _BasePolymorphismUnionFactory(lang.Abstract):
|
|
120
26
|
impls: Impls
|
|
@@ -126,7 +32,7 @@ class _BasePolymorphismUnionFactory(lang.Abstract):
|
|
|
126
32
|
def rtys(self) -> frozenset[rfl.Type]:
|
|
127
33
|
return frozenset(i.ty for i in self.impls)
|
|
128
34
|
|
|
129
|
-
def
|
|
35
|
+
def _guard(self, rty: rfl.Type) -> bool:
|
|
130
36
|
if not isinstance(rty, rfl.Union):
|
|
131
37
|
return False
|
|
132
38
|
if self.allow_partial:
|
|
@@ -140,12 +46,16 @@ class _BasePolymorphismUnionFactory(lang.Abstract):
|
|
|
140
46
|
|
|
141
47
|
|
|
142
48
|
@dc.dataclass(frozen=True)
|
|
143
|
-
class PolymorphismUnionMarshalerFactory(_BasePolymorphismUnionFactory,
|
|
144
|
-
def
|
|
145
|
-
|
|
49
|
+
class PolymorphismUnionMarshalerFactory(_BasePolymorphismUnionFactory, MarshalerFactory):
|
|
50
|
+
def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
|
|
51
|
+
if not self._guard(rty):
|
|
52
|
+
return None
|
|
53
|
+
return lambda: make_polymorphism_marshaler(self.get_impls(rty), self.tt, ctx)
|
|
146
54
|
|
|
147
55
|
|
|
148
56
|
@dc.dataclass(frozen=True)
|
|
149
|
-
class PolymorphismUnionUnmarshalerFactory(_BasePolymorphismUnionFactory,
|
|
150
|
-
def
|
|
151
|
-
|
|
57
|
+
class PolymorphismUnionUnmarshalerFactory(_BasePolymorphismUnionFactory, UnmarshalerFactory):
|
|
58
|
+
def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
|
|
59
|
+
if not self._guard(rty):
|
|
60
|
+
return None
|
|
61
|
+
return lambda: make_polymorphism_unmarshaler(self.get_impls(rty), self.tt, ctx)
|
|
@@ -7,9 +7,10 @@ from ... import check
|
|
|
7
7
|
from ... import lang
|
|
8
8
|
from ... import reflect as rfl
|
|
9
9
|
from ..base.contexts import UnmarshalContext
|
|
10
|
+
from ..base.contexts import UnmarshalFactoryContext
|
|
10
11
|
from ..base.types import Unmarshaler
|
|
12
|
+
from ..base.types import UnmarshalerFactory
|
|
11
13
|
from ..base.values import Value
|
|
12
|
-
from ..factories.simple import SimpleUnmarshalerFactory
|
|
13
14
|
from .metadata import FieldTypeTagging
|
|
14
15
|
from .metadata import Impls
|
|
15
16
|
from .metadata import Polymorphism
|
|
@@ -58,12 +59,12 @@ class FieldPolymorphismUnmarshaler(PolymorphismUnmarshaler):
|
|
|
58
59
|
def make_polymorphism_unmarshaler(
|
|
59
60
|
impls: Impls,
|
|
60
61
|
tt: TypeTagging,
|
|
61
|
-
ctx:
|
|
62
|
+
ctx: UnmarshalFactoryContext,
|
|
62
63
|
) -> Unmarshaler:
|
|
63
64
|
m = {
|
|
64
65
|
t: u
|
|
65
66
|
for i in impls
|
|
66
|
-
for u in [ctx.
|
|
67
|
+
for u in [ctx.make_unmarshaler(i.ty)]
|
|
67
68
|
for t in [i.tag, *i.alts]
|
|
68
69
|
}
|
|
69
70
|
if isinstance(tt, WrapperTypeTagging):
|
|
@@ -75,13 +76,11 @@ def make_polymorphism_unmarshaler(
|
|
|
75
76
|
|
|
76
77
|
|
|
77
78
|
@dc.dataclass(frozen=True)
|
|
78
|
-
class PolymorphismUnmarshalerFactory(
|
|
79
|
+
class PolymorphismUnmarshalerFactory(UnmarshalerFactory):
|
|
79
80
|
p: Polymorphism
|
|
80
81
|
tt: TypeTagging = WrapperTypeTagging()
|
|
81
82
|
|
|
82
|
-
def
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
check.is_(rty, self.p.ty)
|
|
87
|
-
return make_polymorphism_unmarshaler(self.p.impls, self.tt, ctx)
|
|
83
|
+
def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
|
|
84
|
+
if rty is not self.p.ty:
|
|
85
|
+
return None
|
|
86
|
+
return lambda: make_polymorphism_unmarshaler(self.p.impls, self.tt, ctx)
|
omlish/marshal/singular/enums.py
CHANGED
|
@@ -5,12 +5,14 @@ import typing as ta
|
|
|
5
5
|
from ... import check
|
|
6
6
|
from ... import reflect as rfl
|
|
7
7
|
from ..base.contexts import MarshalContext
|
|
8
|
+
from ..base.contexts import MarshalFactoryContext
|
|
8
9
|
from ..base.contexts import UnmarshalContext
|
|
10
|
+
from ..base.contexts import UnmarshalFactoryContext
|
|
9
11
|
from ..base.types import Marshaler
|
|
12
|
+
from ..base.types import MarshalerFactory
|
|
10
13
|
from ..base.types import Unmarshaler
|
|
14
|
+
from ..base.types import UnmarshalerFactory
|
|
11
15
|
from ..base.values import Value
|
|
12
|
-
from ..factories.simple import SimpleMarshalerFactory
|
|
13
|
-
from ..factories.simple import SimpleUnmarshalerFactory
|
|
14
16
|
|
|
15
17
|
|
|
16
18
|
##
|
|
@@ -24,14 +26,11 @@ class EnumMarshaler(Marshaler):
|
|
|
24
26
|
return o.name
|
|
25
27
|
|
|
26
28
|
|
|
27
|
-
class EnumMarshalerFactory(
|
|
28
|
-
def
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
ty = check.isinstance(rty, type)
|
|
33
|
-
check.state(issubclass(ty, enum.Enum))
|
|
34
|
-
return EnumMarshaler(ty) # noqa
|
|
29
|
+
class EnumMarshalerFactory(MarshalerFactory):
|
|
30
|
+
def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
|
|
31
|
+
if not (isinstance(rty, type) and issubclass(rty, enum.Enum)):
|
|
32
|
+
return None
|
|
33
|
+
return lambda: EnumMarshaler(rty) # noqa
|
|
35
34
|
|
|
36
35
|
|
|
37
36
|
@dc.dataclass(frozen=True)
|
|
@@ -42,11 +41,8 @@ class EnumUnmarshaler(Unmarshaler):
|
|
|
42
41
|
return self.ty[check.isinstance(v, str)]
|
|
43
42
|
|
|
44
43
|
|
|
45
|
-
class EnumUnmarshalerFactory(
|
|
46
|
-
def
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
ty = check.isinstance(rty, type)
|
|
51
|
-
check.state(issubclass(ty, enum.Enum))
|
|
52
|
-
return EnumUnmarshaler(ty)
|
|
44
|
+
class EnumUnmarshalerFactory(UnmarshalerFactory):
|
|
45
|
+
def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
|
|
46
|
+
if not (isinstance(rty, type) and issubclass(rty, enum.Enum)):
|
|
47
|
+
return None
|
|
48
|
+
return lambda: EnumUnmarshaler(rty) # noqa
|
omlish/marshal/standard.py
CHANGED
|
@@ -22,6 +22,10 @@ from .composite.optionals import OptionalMarshalerFactory
|
|
|
22
22
|
from .composite.optionals import OptionalUnmarshalerFactory
|
|
23
23
|
from .composite.special import SequenceNotStrMarshalerFactory
|
|
24
24
|
from .composite.special import SequenceNotStrUnmarshalerFactory
|
|
25
|
+
from .composite.unions.literals import LiteralUnionMarshalerFactory
|
|
26
|
+
from .composite.unions.literals import LiteralUnionUnmarshalerFactory
|
|
27
|
+
from .composite.unions.primitives import PrimitiveUnionMarshalerFactory
|
|
28
|
+
from .composite.unions.primitives import PrimitiveUnionUnmarshalerFactory
|
|
25
29
|
from .factories.invalidate import InvalidatableMarshalerFactory
|
|
26
30
|
from .factories.invalidate import InvalidatableUnmarshalerFactory
|
|
27
31
|
from .factories.moduleimport.factories import ModuleImportingMarshalerFactory
|
|
@@ -36,8 +40,6 @@ from .objects.dataclasses import DataclassMarshalerFactory
|
|
|
36
40
|
from .objects.dataclasses import DataclassUnmarshalerFactory
|
|
37
41
|
from .objects.namedtuples import NamedtupleMarshalerFactory
|
|
38
42
|
from .objects.namedtuples import NamedtupleUnmarshalerFactory
|
|
39
|
-
from .polymorphism.unions import PrimitiveUnionMarshalerFactory
|
|
40
|
-
from .polymorphism.unions import PrimitiveUnionUnmarshalerFactory
|
|
41
43
|
from .singular.datetimes import DATETIME_MARSHALER_FACTORY
|
|
42
44
|
from .singular.datetimes import DATETIME_UNMARSHALER_FACTORY
|
|
43
45
|
from .singular.enums import EnumMarshalerFactory
|
|
@@ -65,6 +67,7 @@ DEFAULT_STANDARD_FACTORIES = StandardFactories(
|
|
|
65
67
|
PRIMITIVE_MARSHALER_FACTORY,
|
|
66
68
|
NewtypeMarshalerFactory(),
|
|
67
69
|
OptionalMarshalerFactory(),
|
|
70
|
+
LiteralUnionMarshalerFactory(),
|
|
68
71
|
PrimitiveUnionMarshalerFactory(),
|
|
69
72
|
DataclassMarshalerFactory(),
|
|
70
73
|
NamedtupleMarshalerFactory(),
|
|
@@ -84,6 +87,7 @@ DEFAULT_STANDARD_FACTORIES = StandardFactories(
|
|
|
84
87
|
PRIMITIVE_UNMARSHALER_FACTORY,
|
|
85
88
|
NewtypeUnmarshalerFactory(),
|
|
86
89
|
OptionalUnmarshalerFactory(),
|
|
90
|
+
LiteralUnionUnmarshalerFactory(),
|
|
87
91
|
PrimitiveUnionUnmarshalerFactory(),
|
|
88
92
|
DataclassUnmarshalerFactory(),
|
|
89
93
|
NamedtupleUnmarshalerFactory(),
|
|
@@ -115,11 +119,11 @@ def new_standard_marshaler_factory(
|
|
|
115
119
|
nonlocal gl
|
|
116
120
|
gl = DEFAULT_STANDARD_FACTORIES
|
|
117
121
|
|
|
118
|
-
fi: MarshalerFactory = MultiMarshalerFactory(
|
|
122
|
+
fi: MarshalerFactory = MultiMarshalerFactory(
|
|
119
123
|
*(first if first is not None else []),
|
|
120
124
|
*gl.marshaler_factories,
|
|
121
125
|
*(last if last is not None else []),
|
|
122
|
-
|
|
126
|
+
)
|
|
123
127
|
|
|
124
128
|
fi = RecursiveMarshalerFactory(fi)
|
|
125
129
|
|
|
@@ -148,11 +152,11 @@ def new_standard_unmarshaler_factory(
|
|
|
148
152
|
nonlocal gl
|
|
149
153
|
gl = DEFAULT_STANDARD_FACTORIES
|
|
150
154
|
|
|
151
|
-
fi: UnmarshalerFactory = MultiUnmarshalerFactory(
|
|
155
|
+
fi: UnmarshalerFactory = MultiUnmarshalerFactory(
|
|
152
156
|
*(first if first is not None else []),
|
|
153
157
|
*gl.unmarshaler_factories,
|
|
154
158
|
*(last if last is not None else []),
|
|
155
|
-
|
|
159
|
+
)
|
|
156
160
|
|
|
157
161
|
fi = RecursiveUnmarshalerFactory(fi)
|
|
158
162
|
|
omlish/marshal/trivial/any.py
CHANGED
|
@@ -15,7 +15,7 @@ from ..factories.typemap import TypeMapUnmarshalerFactory
|
|
|
15
15
|
|
|
16
16
|
class AnyMarshalerUnmarshaler(Marshaler, Unmarshaler):
|
|
17
17
|
def marshal(self, ctx: MarshalContext, o: ta.Any) -> Value:
|
|
18
|
-
return ctx.
|
|
18
|
+
return ctx.marshal_factory_context.make_marshaler(type(o)).marshal(ctx, o)
|
|
19
19
|
|
|
20
20
|
def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any:
|
|
21
21
|
return v
|
|
@@ -2,45 +2,40 @@ import dataclasses as dc
|
|
|
2
2
|
import typing as ta
|
|
3
3
|
|
|
4
4
|
from ... import reflect as rfl
|
|
5
|
-
from
|
|
6
|
-
from ..base.contexts import
|
|
7
|
-
from ..base.contexts import UnmarshalContext
|
|
5
|
+
from ..base.contexts import MarshalFactoryContext
|
|
6
|
+
from ..base.contexts import UnmarshalFactoryContext
|
|
8
7
|
from ..base.errors import ForbiddenTypeError
|
|
9
8
|
from ..base.types import Marshaler
|
|
9
|
+
from ..base.types import MarshalerFactory
|
|
10
10
|
from ..base.types import Unmarshaler
|
|
11
|
-
from ..
|
|
12
|
-
from ..factories.simple import SimpleUnmarshalerFactory
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
C = ta.TypeVar('C')
|
|
16
|
-
R = ta.TypeVar('R')
|
|
11
|
+
from ..base.types import UnmarshalerFactory
|
|
17
12
|
|
|
18
13
|
|
|
19
14
|
##
|
|
20
15
|
|
|
21
16
|
|
|
22
17
|
@dc.dataclass(frozen=True)
|
|
23
|
-
class
|
|
18
|
+
class ForbiddenTypeMarshalerFactoryUnmarshalerFactory(MarshalerFactory, UnmarshalerFactory):
|
|
24
19
|
rtys: ta.AbstractSet[rfl.Type]
|
|
25
20
|
|
|
26
|
-
def
|
|
27
|
-
|
|
21
|
+
def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
|
|
22
|
+
if rty not in self.rtys:
|
|
23
|
+
return None
|
|
28
24
|
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
def inner():
|
|
26
|
+
raise ForbiddenTypeError(rty)
|
|
31
27
|
|
|
28
|
+
return inner
|
|
32
29
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
SimpleMarshalerFactory,
|
|
37
|
-
):
|
|
38
|
-
pass
|
|
30
|
+
def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
|
|
31
|
+
if rty not in self.rtys:
|
|
32
|
+
return None
|
|
39
33
|
|
|
34
|
+
def inner():
|
|
35
|
+
raise ForbiddenTypeError(rty)
|
|
40
36
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
pass
|
|
37
|
+
return inner
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
ForbiddenTypeMarshalerFactory = ForbiddenTypeMarshalerFactoryUnmarshalerFactory
|
|
41
|
+
ForbiddenTypeUnmarshalerFactory = ForbiddenTypeMarshalerFactoryUnmarshalerFactory
|
omlish/metadata.py
CHANGED
|
@@ -19,6 +19,8 @@ from . import lang
|
|
|
19
19
|
|
|
20
20
|
T = ta.TypeVar('T')
|
|
21
21
|
|
|
22
|
+
ObjectMetadataT = ta.TypeVar('ObjectMetadataT', bound='ObjectMetadata')
|
|
23
|
+
|
|
22
24
|
|
|
23
25
|
##
|
|
24
26
|
|
|
@@ -94,12 +96,32 @@ def append_object_metadata(obj: T, *mds: ObjectMetadata) -> T:
|
|
|
94
96
|
_type = type
|
|
95
97
|
|
|
96
98
|
|
|
99
|
+
@ta.overload
|
|
100
|
+
def get_object_metadata(
|
|
101
|
+
obj: ta.Any,
|
|
102
|
+
*,
|
|
103
|
+
strict: bool = False,
|
|
104
|
+
type: ta.Type[ObjectMetadataT], # noqa
|
|
105
|
+
) -> ta.Sequence[ObjectMetadataT]:
|
|
106
|
+
...
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@ta.overload
|
|
97
110
|
def get_object_metadata(
|
|
98
111
|
obj: ta.Any,
|
|
99
112
|
*,
|
|
100
113
|
strict: bool = False,
|
|
101
114
|
type: ta.Type | tuple[ta.Type, ...] | None = None, # noqa
|
|
102
|
-
) -> ta.Sequence[
|
|
115
|
+
) -> ta.Sequence[ta.Any]:
|
|
116
|
+
...
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def get_object_metadata(
|
|
120
|
+
obj,
|
|
121
|
+
*,
|
|
122
|
+
strict=False,
|
|
123
|
+
type=None, # noqa
|
|
124
|
+
):
|
|
103
125
|
try:
|
|
104
126
|
tgt = _unwrap_object_metadata_target(obj)
|
|
105
127
|
except ObjectMetadataTargetTypeError:
|
omlish/os/forkhooks.py
CHANGED
omlish/os/pidfiles/pinning.py
CHANGED
|
@@ -25,8 +25,8 @@ import sys
|
|
|
25
25
|
import time
|
|
26
26
|
import typing as ta
|
|
27
27
|
|
|
28
|
-
from ...diag.lslocks import LslocksCommand
|
|
29
|
-
from ...diag.lsof import LsofCommand
|
|
28
|
+
from ...diag.cmds.lslocks import LslocksCommand
|
|
29
|
+
from ...diag.cmds.lsof import LsofCommand
|
|
30
30
|
from ...lite.abstract import Abstract
|
|
31
31
|
from ...lite.check import check
|
|
32
32
|
from ...lite.timeouts import Timeout
|
omlish/reflect/types.py
CHANGED
|
@@ -9,6 +9,7 @@ give it some guiding North Star to make all of its decisions for it, and to add
|
|
|
9
9
|
meet, join, solve, ...), but it's quite a bit of work and not a priority at the moment.
|
|
10
10
|
|
|
11
11
|
TODO:
|
|
12
|
+
- !!! refactor like a GuardFn - no check_only, return a closure to continue computation !!!
|
|
12
13
|
- !! cache this shit !!
|
|
13
14
|
- especially generic_mro shit
|
|
14
15
|
"""
|
omlish/secrets/marshal.py
CHANGED
|
@@ -54,7 +54,7 @@ def marshal_secret_field(f: dc.Field) -> dc.Field:
|
|
|
54
54
|
|
|
55
55
|
|
|
56
56
|
@lang.static_init
|
|
57
|
-
def
|
|
57
|
+
def _install_standard_marshaling() -> None:
|
|
58
58
|
msh.install_standard_factories(
|
|
59
59
|
msh.ForbiddenTypeMarshalerFactory({Secret}),
|
|
60
60
|
msh.ForbiddenTypeUnmarshalerFactory({Secret}),
|
|
@@ -28,6 +28,18 @@ See:
|
|
|
28
28
|
- https://github.com/jmespath-community/jmespath.spec/discussions?discussions_q=label%3Ajep-candidate
|
|
29
29
|
- https://github.com/jmespath-community/jmespath.spec/discussions/97
|
|
30
30
|
""" # noqa
|
|
31
|
+
from ... import dataclasses as _dc # noqa
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
_dc.init_package(
|
|
35
|
+
globals(),
|
|
36
|
+
codegen=True,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
##
|
|
41
|
+
|
|
42
|
+
|
|
31
43
|
from . import errors # noqa
|
|
32
44
|
from . import functions # noqa
|
|
33
45
|
from . import lexer # noqa
|
|
@@ -41,6 +53,3 @@ from .parser import ( # noqa
|
|
|
41
53
|
from .visitor import ( # noqa
|
|
42
54
|
Options,
|
|
43
55
|
)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
__version__ = '1.0.1'
|