omlish 0.0.0.dev447__py3-none-any.whl → 0.0.0.dev493__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/README.md +199 -0
- omlish/__about__.py +21 -16
- 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/plans.py +2 -17
- omlish/dataclasses/impl/generation/processor.py +106 -25
- omlish/dataclasses/impl/processing/base.py +8 -0
- omlish/dataclasses/impl/processing/driving.py +19 -7
- omlish/dataclasses/specs.py +1 -0
- omlish/dataclasses/tools/modifiers.py +5 -0
- omlish/diag/_pycharm/runhack.py +1 -1
- 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 +57 -29
- omlish/inject/_dataclasses.py +5148 -0
- omlish/inject/binder.py +11 -52
- omlish/inject/eagers.py +2 -0
- 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/late.py +76 -0
- omlish/inject/{managed.py → helpers/managed.py} +10 -10
- omlish/inject/helpers/multis.py +143 -0
- omlish/inject/helpers/wrappers.py +54 -0
- omlish/inject/impl/elements.py +54 -21
- omlish/inject/impl/injector.py +29 -25
- 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 +180 -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/lifecycles/README.md +30 -0
- omlish/lifecycles/__init__.py +87 -13
- omlish/lifecycles/_dataclasses.py +1388 -0
- omlish/lifecycles/base.py +178 -64
- omlish/lifecycles/contextmanagers.py +113 -4
- omlish/lifecycles/controller.py +150 -87
- omlish/lifecycles/injection.py +143 -0
- omlish/lifecycles/listeners.py +56 -0
- omlish/lifecycles/managed.py +142 -0
- omlish/lifecycles/manager.py +218 -93
- omlish/lifecycles/states.py +2 -0
- omlish/lifecycles/transitions.py +3 -0
- omlish/lifecycles/unwrap.py +57 -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 +24 -0
- omlish/logs/_amalg.py +1 -1
- omlish/logs/all.py +25 -11
- omlish/logs/asyncs.py +73 -0
- omlish/logs/base.py +101 -12
- omlish/logs/contexts.py +4 -1
- omlish/logs/lists.py +125 -0
- omlish/logs/modules.py +19 -1
- omlish/logs/std/loggers.py +6 -1
- omlish/logs/std/noisy.py +11 -9
- omlish/logs/{standard.py → std/standard.py} +3 -4
- omlish/logs/utils.py +17 -2
- 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/__init__.py +43 -26
- omlish/reflect/ops.py +10 -1
- 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/__init__.py +24 -5
- omlish/sql/{tabledefs/alchemy.py → alchemy/tabledefs.py} +2 -2
- omlish/sql/api/dbapi.py +1 -1
- omlish/sql/dbapi/__init__.py +15 -0
- omlish/sql/{dbapi.py → dbapi/drivers.py} +2 -2
- omlish/sql/queries/__init__.py +3 -0
- 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/asyncs/plugin.py +2 -0
- 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 +91 -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.dev493.dist-info}/METADATA +36 -32
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev493.dist-info}/RECORD +260 -199
- omlish/dataclasses/impl/generation/mangling.py +0 -18
- omlish/funcs/match.py +0 -227
- omlish/lifecycles/abstract.py +0 -86
- omlish/marshal/factories/match.py +0 -34
- omlish/marshal/factories/simple.py +0 -28
- /omlish/inject/{impl → helpers}/proxy.py +0 -0
- /omlish/inject/impl/{providers2.py → providersmap.py} +0 -0
- /omlish/sql/{abc.py → dbapi/abc.py} +0 -0
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev493.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev493.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev493.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev447.dist-info → omlish-0.0.0.dev493.dist-info}/top_level.txt +0 -0
omlish/typedvalues/marshal.py
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import typing as ta
|
|
2
|
+
|
|
1
3
|
from .. import check
|
|
2
4
|
from .. import dataclasses as dc
|
|
3
5
|
from .. import lang
|
|
4
6
|
from .. import marshal as msh
|
|
5
7
|
from .. import reflect as rfl
|
|
6
|
-
from ..funcs import match as mfs
|
|
7
8
|
from .collection import TypedValues
|
|
8
9
|
from .reflect import reflect_typed_values_impls
|
|
9
10
|
from .values import ScalarTypedValue
|
|
@@ -14,60 +15,77 @@ from .values import TypedValue
|
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
def _build_typed_value_poly(rty: rfl.Type) -> msh.Polymorphism:
|
|
17
|
-
ty: type[TypedValue] = check.issubclass(check.isinstance(rty, type), TypedValue)
|
|
18
|
+
ty: type[TypedValue] = check.issubclass(check.isinstance(rty, type), TypedValue) # noqa
|
|
18
19
|
check.state(lang.is_abstract_class(ty))
|
|
19
20
|
return msh.polymorphism_from_subclasses(
|
|
20
21
|
ty,
|
|
21
22
|
naming=msh.Naming.SNAKE,
|
|
22
|
-
strip_suffix=
|
|
23
|
+
strip_suffix=msh.AutoStripSuffix,
|
|
23
24
|
)
|
|
24
25
|
|
|
25
26
|
|
|
26
|
-
class TypedValueMarshalerFactory(msh.
|
|
27
|
-
@
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
27
|
+
class TypedValueMarshalerFactory(msh.MarshalerFactoryMethodClass):
|
|
28
|
+
@msh.MarshalerFactoryMethodClass.make_marshaler.register
|
|
29
|
+
def _make_scalar(self, ctx: msh.MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], msh.Marshaler] | None:
|
|
30
|
+
if not (
|
|
31
|
+
isinstance(rty, type) and
|
|
32
|
+
issubclass(rty, ScalarTypedValue) and
|
|
33
|
+
not lang.is_abstract_class(rty)
|
|
34
|
+
):
|
|
35
|
+
return None
|
|
36
|
+
|
|
37
|
+
def inner() -> msh.Marshaler:
|
|
38
|
+
dc_rfl = dc.reflect(check.isinstance(rty, type))
|
|
39
|
+
v_rty = check.single(dc_rfl.fields_inspection.generic_replaced_field_annotations.values())
|
|
40
|
+
v_m = ctx.make_marshaler(v_rty)
|
|
41
|
+
return msh.WrappedMarshaler(lambda _, o: o.v, v_m)
|
|
42
|
+
|
|
43
|
+
return inner
|
|
44
|
+
|
|
45
|
+
@msh.MarshalerFactoryMethodClass.make_marshaler.register
|
|
46
|
+
def _make_abstract(self, ctx: msh.MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], msh.Marshaler] | None:
|
|
47
|
+
if not (
|
|
48
|
+
isinstance(rty, type) and
|
|
49
|
+
issubclass(rty, TypedValue) and
|
|
50
|
+
lang.is_abstract_class(rty)
|
|
51
|
+
):
|
|
52
|
+
return None
|
|
53
|
+
|
|
54
|
+
return lambda: msh.make_polymorphism_marshaler(
|
|
45
55
|
_build_typed_value_poly(rty).impls,
|
|
46
56
|
msh.WrapperTypeTagging(),
|
|
47
57
|
ctx,
|
|
48
58
|
)
|
|
49
59
|
|
|
50
60
|
|
|
51
|
-
class TypedValueUnmarshalerFactory(msh.
|
|
52
|
-
@
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
61
|
+
class TypedValueUnmarshalerFactory(msh.UnmarshalerFactoryMethodClass):
|
|
62
|
+
@msh.UnmarshalerFactoryMethodClass.make_unmarshaler.register
|
|
63
|
+
def _make_scalar(self, ctx: msh.UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], msh.Unmarshaler] | None:
|
|
64
|
+
if not (
|
|
65
|
+
isinstance(rty, type) and
|
|
66
|
+
issubclass(rty, ScalarTypedValue) and
|
|
67
|
+
not lang.is_abstract_class(rty)
|
|
68
|
+
):
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
def inner() -> msh.Unmarshaler:
|
|
72
|
+
dc_rfl = dc.reflect(rty)
|
|
73
|
+
v_rty = check.single(dc_rfl.fields_inspection.generic_replaced_field_annotations.values())
|
|
74
|
+
v_u = ctx.make_unmarshaler(v_rty)
|
|
75
|
+
return msh.WrappedUnmarshaler(lambda _, v: rty(v), v_u)
|
|
76
|
+
|
|
77
|
+
return inner
|
|
78
|
+
|
|
79
|
+
@msh.UnmarshalerFactoryMethodClass.make_unmarshaler.register
|
|
80
|
+
def _make_abstract(self, ctx: msh.UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], msh.Unmarshaler] | None: # noqa
|
|
81
|
+
if not (
|
|
82
|
+
isinstance(rty, type) and
|
|
83
|
+
issubclass(rty, TypedValue) and
|
|
84
|
+
lang.is_abstract_class(rty)
|
|
85
|
+
):
|
|
86
|
+
return None
|
|
87
|
+
|
|
88
|
+
return lambda: msh.make_polymorphism_unmarshaler(
|
|
71
89
|
_build_typed_value_poly(rty).impls,
|
|
72
90
|
msh.WrapperTypeTagging(),
|
|
73
91
|
ctx,
|
|
@@ -99,7 +117,7 @@ def _build_typed_values_impls(rty: rfl.Type) -> msh.Impls:
|
|
|
99
117
|
#
|
|
100
118
|
|
|
101
119
|
|
|
102
|
-
def build_typed_values_marshaler(ctx: msh.
|
|
120
|
+
def build_typed_values_marshaler(ctx: msh.MarshalFactoryContext, rty: rfl.Type) -> msh.Marshaler:
|
|
103
121
|
tv_m = msh.make_polymorphism_marshaler(
|
|
104
122
|
msh.Impls(_build_typed_values_impls(rty)),
|
|
105
123
|
msh.WrapperTypeTagging(),
|
|
@@ -108,20 +126,24 @@ def build_typed_values_marshaler(ctx: msh.MarshalContext, rty: rfl.Type) -> msh.
|
|
|
108
126
|
return msh.IterableMarshaler(tv_m)
|
|
109
127
|
|
|
110
128
|
|
|
111
|
-
class TypedValuesMarshalerFactory(msh.
|
|
112
|
-
@
|
|
113
|
-
def
|
|
114
|
-
|
|
129
|
+
class TypedValuesMarshalerFactory(msh.MarshalerFactoryMethodClass):
|
|
130
|
+
@msh.MarshalerFactoryMethodClass.make_marshaler.register
|
|
131
|
+
def _make_generic(self, ctx: msh.MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], msh.Marshaler] | None:
|
|
132
|
+
if not (isinstance(rty, rfl.Generic) and rty.cls is TypedValues):
|
|
133
|
+
return None
|
|
134
|
+
return lambda: build_typed_values_marshaler(ctx, rty)
|
|
115
135
|
|
|
116
|
-
@
|
|
117
|
-
def
|
|
118
|
-
|
|
136
|
+
@msh.MarshalerFactoryMethodClass.make_marshaler.register
|
|
137
|
+
def _make_concrete(self, ctx: msh.MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], msh.Marshaler] | None:
|
|
138
|
+
if rty is not TypedValues:
|
|
139
|
+
return None
|
|
140
|
+
return lambda: lang.raise_(NotImplementedError)
|
|
119
141
|
|
|
120
142
|
|
|
121
143
|
#
|
|
122
144
|
|
|
123
145
|
|
|
124
|
-
def build_typed_values_unmarshaler(ctx: msh.
|
|
146
|
+
def build_typed_values_unmarshaler(ctx: msh.UnmarshalFactoryContext, rty: rfl.Type) -> msh.Unmarshaler:
|
|
125
147
|
tv_u = msh.make_polymorphism_unmarshaler(
|
|
126
148
|
msh.Impls(_build_typed_values_impls(rty)),
|
|
127
149
|
msh.WrapperTypeTagging(),
|
|
@@ -130,21 +152,25 @@ def build_typed_values_unmarshaler(ctx: msh.UnmarshalContext, rty: rfl.Type) ->
|
|
|
130
152
|
return msh.IterableUnmarshaler(lambda it: TypedValues(*it), tv_u) # noqa
|
|
131
153
|
|
|
132
154
|
|
|
133
|
-
class TypedValuesUnmarshalerFactory(msh.
|
|
134
|
-
@
|
|
135
|
-
def _build(self, ctx: msh.
|
|
136
|
-
|
|
155
|
+
class TypedValuesUnmarshalerFactory(msh.UnmarshalerFactoryMethodClass):
|
|
156
|
+
@msh.UnmarshalerFactoryMethodClass.make_unmarshaler.register
|
|
157
|
+
def _build(self, ctx: msh.UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], msh.Unmarshaler] | None:
|
|
158
|
+
if not (isinstance(rty, rfl.Generic) and rty.cls is TypedValues):
|
|
159
|
+
return None
|
|
160
|
+
return lambda: build_typed_values_unmarshaler(ctx, rty)
|
|
137
161
|
|
|
138
|
-
@
|
|
139
|
-
def _build_concrete(self, ctx: msh.
|
|
140
|
-
|
|
162
|
+
@msh.UnmarshalerFactoryMethodClass.make_unmarshaler.register
|
|
163
|
+
def _build_concrete(self, ctx: msh.UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], msh.Unmarshaler] | None: # noqa
|
|
164
|
+
if rty is not TypedValues:
|
|
165
|
+
return None
|
|
166
|
+
return lambda: lang.raise_(NotImplementedError)
|
|
141
167
|
|
|
142
168
|
|
|
143
169
|
##
|
|
144
170
|
|
|
145
171
|
|
|
146
172
|
@lang.static_init
|
|
147
|
-
def
|
|
173
|
+
def _install_standard_marshaling() -> None:
|
|
148
174
|
msh.install_standard_factories(
|
|
149
175
|
TypedValueMarshalerFactory(),
|
|
150
176
|
TypedValueUnmarshalerFactory(),
|
omlish/typedvalues/values.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: omlish
|
|
3
|
-
Version: 0.0.0.
|
|
3
|
+
Version: 0.0.0.dev493
|
|
4
4
|
Summary: omlish
|
|
5
5
|
Author: wrmsr
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -15,15 +15,15 @@ Requires-Python: >=3.13
|
|
|
15
15
|
Description-Content-Type: text/markdown
|
|
16
16
|
License-File: LICENSE
|
|
17
17
|
Provides-Extra: all
|
|
18
|
-
Requires-Dist: anyio~=4.
|
|
18
|
+
Requires-Dist: anyio~=4.11; extra == "all"
|
|
19
19
|
Requires-Dist: sniffio~=1.3; extra == "all"
|
|
20
|
-
Requires-Dist: greenlet~=3.
|
|
21
|
-
Requires-Dist: trio~=0.
|
|
20
|
+
Requires-Dist: greenlet~=3.3; extra == "all"
|
|
21
|
+
Requires-Dist: trio~=0.32; extra == "all"
|
|
22
22
|
Requires-Dist: trio-asyncio~=0.15; extra == "all"
|
|
23
23
|
Requires-Dist: lz4~=4.4; extra == "all"
|
|
24
24
|
Requires-Dist: python-snappy~=0.7; extra == "all"
|
|
25
25
|
Requires-Dist: zstandard~=0.25; python_version < "3.14" and extra == "all"
|
|
26
|
-
Requires-Dist: brotli~=1.
|
|
26
|
+
Requires-Dist: brotli~=1.2; extra == "all"
|
|
27
27
|
Requires-Dist: asttokens~=3.0; extra == "all"
|
|
28
28
|
Requires-Dist: executing~=2.2; extra == "all"
|
|
29
29
|
Requires-Dist: psutil~=7.1; extra == "all"
|
|
@@ -33,38 +33,38 @@ Requires-Dist: pyyaml~=6.0; extra == "all"
|
|
|
33
33
|
Requires-Dist: cbor2~=5.7; extra == "all"
|
|
34
34
|
Requires-Dist: cloudpickle~=3.1; extra == "all"
|
|
35
35
|
Requires-Dist: httpx[http2]~=0.28; extra == "all"
|
|
36
|
-
Requires-Dist: wrapt~=
|
|
37
|
-
Requires-Dist: cryptography~=
|
|
36
|
+
Requires-Dist: wrapt~=2.0; extra == "all"
|
|
37
|
+
Requires-Dist: cryptography~=46.0; extra == "all"
|
|
38
38
|
Requires-Dist: sqlalchemy[asyncio]~=2.0; extra == "all"
|
|
39
39
|
Requires-Dist: pg8000~=1.31; extra == "all"
|
|
40
40
|
Requires-Dist: pymysql~=1.1; extra == "all"
|
|
41
|
-
Requires-Dist: aiomysql~=0.
|
|
42
|
-
Requires-Dist: aiosqlite~=0.
|
|
43
|
-
Requires-Dist: asyncpg~=0.
|
|
44
|
-
Requires-Dist: apsw~=3.
|
|
41
|
+
Requires-Dist: aiomysql~=0.3; extra == "all"
|
|
42
|
+
Requires-Dist: aiosqlite~=0.22; extra == "all"
|
|
43
|
+
Requires-Dist: asyncpg~=0.31; extra == "all"
|
|
44
|
+
Requires-Dist: apsw~=3.51; extra == "all"
|
|
45
45
|
Requires-Dist: sqlean.py~=3.50; extra == "all"
|
|
46
46
|
Requires-Dist: duckdb~=1.4; extra == "all"
|
|
47
47
|
Requires-Dist: markupsafe~=3.0; extra == "all"
|
|
48
48
|
Requires-Dist: jinja2~=3.1; extra == "all"
|
|
49
|
-
Requires-Dist: pytest~=
|
|
50
|
-
Requires-Dist: anyio~=4.
|
|
49
|
+
Requires-Dist: pytest~=9.0; extra == "all"
|
|
50
|
+
Requires-Dist: anyio~=4.11; extra == "all"
|
|
51
51
|
Requires-Dist: sniffio~=1.3; extra == "all"
|
|
52
52
|
Requires-Dist: asttokens~=3.0; extra == "all"
|
|
53
53
|
Requires-Dist: executing~=2.2; extra == "all"
|
|
54
54
|
Requires-Dist: orjson~=3.11; extra == "all"
|
|
55
55
|
Requires-Dist: pyyaml~=6.0; extra == "all"
|
|
56
|
-
Requires-Dist: wrapt~=
|
|
56
|
+
Requires-Dist: wrapt~=2.0; extra == "all"
|
|
57
57
|
Provides-Extra: async
|
|
58
|
-
Requires-Dist: anyio~=4.
|
|
58
|
+
Requires-Dist: anyio~=4.11; extra == "async"
|
|
59
59
|
Requires-Dist: sniffio~=1.3; extra == "async"
|
|
60
|
-
Requires-Dist: greenlet~=3.
|
|
61
|
-
Requires-Dist: trio~=0.
|
|
60
|
+
Requires-Dist: greenlet~=3.3; extra == "async"
|
|
61
|
+
Requires-Dist: trio~=0.32; extra == "async"
|
|
62
62
|
Requires-Dist: trio-asyncio~=0.15; extra == "async"
|
|
63
63
|
Provides-Extra: compress
|
|
64
64
|
Requires-Dist: lz4~=4.4; extra == "compress"
|
|
65
65
|
Requires-Dist: python-snappy~=0.7; extra == "compress"
|
|
66
66
|
Requires-Dist: zstandard~=0.25; python_version < "3.14" and extra == "compress"
|
|
67
|
-
Requires-Dist: brotli~=1.
|
|
67
|
+
Requires-Dist: brotli~=1.2; extra == "compress"
|
|
68
68
|
Provides-Extra: diag
|
|
69
69
|
Requires-Dist: asttokens~=3.0; extra == "diag"
|
|
70
70
|
Requires-Dist: executing~=2.2; extra == "diag"
|
|
@@ -78,33 +78,33 @@ Requires-Dist: cloudpickle~=3.1; extra == "formats"
|
|
|
78
78
|
Provides-Extra: http
|
|
79
79
|
Requires-Dist: httpx[http2]~=0.28; extra == "http"
|
|
80
80
|
Provides-Extra: misc
|
|
81
|
-
Requires-Dist: wrapt~=
|
|
81
|
+
Requires-Dist: wrapt~=2.0; extra == "misc"
|
|
82
82
|
Provides-Extra: secrets
|
|
83
|
-
Requires-Dist: cryptography~=
|
|
83
|
+
Requires-Dist: cryptography~=46.0; extra == "secrets"
|
|
84
84
|
Provides-Extra: sqlalchemy
|
|
85
85
|
Requires-Dist: sqlalchemy[asyncio]~=2.0; extra == "sqlalchemy"
|
|
86
86
|
Provides-Extra: sqldrivers
|
|
87
87
|
Requires-Dist: pg8000~=1.31; extra == "sqldrivers"
|
|
88
88
|
Requires-Dist: pymysql~=1.1; extra == "sqldrivers"
|
|
89
|
-
Requires-Dist: aiomysql~=0.
|
|
90
|
-
Requires-Dist: aiosqlite~=0.
|
|
91
|
-
Requires-Dist: asyncpg~=0.
|
|
92
|
-
Requires-Dist: apsw~=3.
|
|
89
|
+
Requires-Dist: aiomysql~=0.3; extra == "sqldrivers"
|
|
90
|
+
Requires-Dist: aiosqlite~=0.22; extra == "sqldrivers"
|
|
91
|
+
Requires-Dist: asyncpg~=0.31; extra == "sqldrivers"
|
|
92
|
+
Requires-Dist: apsw~=3.51; extra == "sqldrivers"
|
|
93
93
|
Requires-Dist: sqlean.py~=3.50; extra == "sqldrivers"
|
|
94
94
|
Requires-Dist: duckdb~=1.4; extra == "sqldrivers"
|
|
95
95
|
Provides-Extra: templates
|
|
96
96
|
Requires-Dist: markupsafe~=3.0; extra == "templates"
|
|
97
97
|
Requires-Dist: jinja2~=3.1; extra == "templates"
|
|
98
98
|
Provides-Extra: testing
|
|
99
|
-
Requires-Dist: pytest~=
|
|
99
|
+
Requires-Dist: pytest~=9.0; extra == "testing"
|
|
100
100
|
Provides-Extra: plus
|
|
101
|
-
Requires-Dist: anyio~=4.
|
|
101
|
+
Requires-Dist: anyio~=4.11; extra == "plus"
|
|
102
102
|
Requires-Dist: sniffio~=1.3; extra == "plus"
|
|
103
103
|
Requires-Dist: asttokens~=3.0; extra == "plus"
|
|
104
104
|
Requires-Dist: executing~=2.2; extra == "plus"
|
|
105
105
|
Requires-Dist: orjson~=3.11; extra == "plus"
|
|
106
106
|
Requires-Dist: pyyaml~=6.0; extra == "plus"
|
|
107
|
-
Requires-Dist: wrapt~=
|
|
107
|
+
Requires-Dist: wrapt~=2.0; extra == "plus"
|
|
108
108
|
Dynamic: license-file
|
|
109
109
|
|
|
110
110
|
# Overview
|
|
@@ -167,7 +167,7 @@ dependencies of any kind**.
|
|
|
167
167
|
- An optional [metaclass](https://github.com/wrmsr/omlish/blob/master/omlish/dataclasses/metaclass) which removes the
|
|
168
168
|
need for re-decorating subclasses (with support for inheritance of dataclass parameters like `frozen`), and some
|
|
169
169
|
basic [base classes](https://github.com/wrmsr/omlish/blob/master/omlish/dataclasses/metaclass/bases.py).
|
|
170
|
-
-
|
|
170
|
+
- Support for ahead-of-time / build-time code generation, significantly reducing import times.
|
|
171
171
|
|
|
172
172
|
The stdlib-equivalent api is exported in such a way as to appear to be direct aliases for the stdlib api itself,
|
|
173
173
|
simplifying tool support.
|
|
@@ -234,7 +234,8 @@ dependencies of any kind**.
|
|
|
234
234
|
- **[queries](https://github.com/wrmsr/omlish/blob/master/omlish/sql/queries)** - A SQL query builder with a fluent
|
|
235
235
|
interface.
|
|
236
236
|
- **[alchemy](https://github.com/wrmsr/omlish/blob/master/omlish/sql/alchemy)** - SQLAlchemy utilities. The codebase
|
|
237
|
-
|
|
237
|
+
has moved away from SQLAlchemy in favor of its own internal SQL api, but it will likely still remain as an optional
|
|
238
|
+
dep for the api adapter.
|
|
238
239
|
|
|
239
240
|
- **[testing](https://github.com/wrmsr/omlish/blob/master/omlish/testing)** - Test - primarily pytest - helpers,
|
|
240
241
|
including:
|
|
@@ -246,6 +247,10 @@ dependencies of any kind**.
|
|
|
246
247
|
*any-future-event-loop-impl* without having multiple fighting plugins (*[I know, I know](https://xkcd.com/927/)*).
|
|
247
248
|
- **[plugins](https://github.com/wrmsr/omlish/blob/master/omlish/testing/pytest/plugins)** - Various other plugins.
|
|
248
249
|
|
|
250
|
+
- **[typedvalues](https://github.com/wrmsr/omlish/blob/master/omlish/typedvalues)** - A little toolkit around 'boxed'
|
|
251
|
+
values, whose 'box' types convey more information than the bare values themselves. A rebellion against kwargs and env
|
|
252
|
+
vars: instead of `foo(bar=1, baz=2)`, you do `foo(Bar(1), Baz(2))`.
|
|
253
|
+
|
|
249
254
|
- **[lite](https://github.com/wrmsr/omlish/blob/master/omlish/lite)** - The standard library of 'lite' code. This is the
|
|
250
255
|
only package beneath `lang`, and parts of it are re-exported by it for deduplication. On top of miscellaneous
|
|
251
256
|
utilities it contains a handful of independent, self-contained, significantly simplified 'lite' equivalents of some
|
|
@@ -293,9 +298,8 @@ examples are:
|
|
|
293
298
|
- **anyio** - While lite code must use only asyncio, non-trivial async standard code prefers to be written to anyio.
|
|
294
299
|
- **pytest** - What is used for all standard testing - as lite code has no dependencies of any kind its testing uses
|
|
295
300
|
stdlib's [unittest](https://docs.python.org/3/library/unittest.html).
|
|
296
|
-
- **
|
|
297
|
-
|
|
298
|
-
internal api. It will however likely still remain as an optional dep for the api adapter.
|
|
301
|
+
- **sqlalchemy** - The codebase has migrated away from SQLAlchemy in favor of the internal api but it retains it as an
|
|
302
|
+
optional dep to support adapting the internal api to it.
|
|
299
303
|
|
|
300
304
|
Additionally, some catchall dep categories include:
|
|
301
305
|
|