omlish 0.0.0.dev423__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/{.manifests.json → .omlish-manifests.json} +12 -0
- omlish/__about__.py +21 -18
- omlish/argparse/all.py +17 -9
- omlish/argparse/cli.py +16 -3
- omlish/argparse/utils.py +21 -0
- omlish/asyncs/all.py +0 -13
- omlish/asyncs/asyncio/rlock.py +110 -0
- omlish/asyncs/asyncio/subprocesses.py +2 -2
- omlish/asyncs/asyncio/sync.py +43 -0
- omlish/asyncs/asyncio/utils.py +2 -0
- omlish/asyncs/ioproxy/proxy.py +1 -1
- 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/c3.py +4 -1
- 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 +3 -2
- 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/__init__.py +0 -11
- omlish/concurrent/all.py +18 -0
- omlish/concurrent/futures.py +25 -0
- omlish/concurrent/threadlets.py +1 -1
- omlish/configs/processing/flattening.py +1 -1
- omlish/configs/processing/merging.py +8 -6
- omlish/configs/types.py +1 -1
- omlish/daemons/__init__.py +70 -0
- omlish/daemons/daemon.py +2 -2
- omlish/daemons/launching.py +2 -2
- omlish/daemons/reparent.py +2 -3
- omlish/daemons/spawning.py +2 -3
- omlish/dataclasses/__init__.py +5 -5
- omlish/dataclasses/errors.py +1 -1
- omlish/dataclasses/impl/api/classes/decorator.py +3 -0
- omlish/dataclasses/impl/api/classes/make.py +4 -1
- omlish/dataclasses/impl/concerns/doc.py +1 -1
- omlish/dataclasses/impl/concerns/repr.py +15 -2
- omlish/dataclasses/impl/configs.py +97 -36
- 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 +34 -2
- omlish/dataclasses/tools/as_.py +0 -12
- omlish/dataclasses/tools/modifiers.py +5 -0
- omlish/dataclasses/tools/static.py +1 -1
- omlish/diag/_pycharm/runhack.py +1 -1
- 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/procfs.py +4 -4
- omlish/diag/pycharm.py +16 -2
- omlish/diag/pydevd.py +58 -40
- omlish/diag/replserver/console.py +3 -3
- omlish/diag/replserver/server.py +2 -2
- omlish/dispatch/__init__.py +18 -12
- omlish/dispatch/methods.py +50 -140
- omlish/dom/rendering.py +1 -1
- omlish/formats/dotenv.py +8 -8
- omlish/formats/json/stream/__init__.py +18 -3
- omlish/formats/json/stream/building.py +2 -2
- omlish/formats/json/stream/lexing.py +401 -67
- omlish/formats/json/stream/parsing.py +32 -10
- omlish/formats/json/stream/rendering.py +6 -6
- omlish/formats/json/stream/utils.py +132 -30
- omlish/formats/json5/literals.py +7 -4
- omlish/formats/json5/parsing.py +33 -79
- omlish/formats/json5/stream.py +77 -0
- omlish/formats/logfmt.py +8 -2
- omlish/funcs/genmachine.py +2 -2
- omlish/funcs/guard.py +225 -0
- omlish/graphs/dot/rendering.py +1 -1
- omlish/http/all.py +122 -53
- omlish/http/asgi.py +2 -2
- omlish/http/clients/__init__.py +0 -34
- omlish/http/clients/asyncs.py +153 -0
- omlish/http/clients/base.py +63 -122
- omlish/http/clients/coro/sync.py +171 -0
- omlish/http/clients/default.py +209 -30
- omlish/http/clients/executor.py +56 -0
- omlish/http/clients/httpx.py +78 -13
- omlish/http/clients/middleware.py +181 -0
- omlish/http/clients/sync.py +151 -0
- omlish/http/clients/syncasync.py +49 -0
- omlish/http/clients/urllib.py +8 -5
- omlish/http/coro/client/{client.py → connection.py} +43 -37
- omlish/http/coro/client/headers.py +5 -5
- omlish/http/coro/client/response.py +37 -38
- omlish/http/coro/client/status.py +4 -4
- omlish/http/coro/{client/io.py → io.py} +19 -2
- omlish/http/coro/server/fdio.py +10 -9
- omlish/http/coro/server/server.py +14 -41
- omlish/http/coro/server/sockets.py +7 -6
- 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/handlers.py +3 -2
- omlish/http/headers.py +69 -35
- omlish/http/sse.py +1 -1
- omlish/http/urls.py +67 -0
- omlish/inject/__init__.py +173 -126
- omlish/inject/_dataclasses.py +4986 -0
- omlish/inject/binder.py +10 -49
- omlish/inject/elements.py +27 -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 +52 -22
- omlish/inject/impl/injector.py +76 -49
- omlish/inject/impl/inspect.py +11 -1
- omlish/inject/impl/maysync.py +43 -0
- omlish/inject/impl/multis.py +10 -7
- omlish/inject/impl/privates.py +8 -8
- omlish/inject/impl/providers.py +23 -34
- omlish/inject/impl/providersmap.py +43 -0
- omlish/inject/impl/proxy.py +0 -2
- omlish/inject/impl/scopes.py +19 -23
- omlish/inject/impl/sync.py +41 -0
- omlish/inject/injector.py +37 -8
- omlish/inject/inspect.py +35 -0
- omlish/inject/listeners.py +4 -4
- omlish/inject/managed.py +54 -18
- omlish/inject/maysync.py +27 -0
- omlish/inject/multis.py +8 -0
- omlish/inject/overrides.py +3 -3
- omlish/inject/privates.py +6 -0
- omlish/inject/providers.py +8 -1
- omlish/inject/scopes.py +40 -12
- omlish/inject/sync.py +49 -0
- omlish/io/buffers.py +119 -1
- omlish/io/readers.py +29 -0
- omlish/iterators/__init__.py +28 -20
- omlish/iterators/transforms.py +204 -0
- omlish/lang/__init__.py +240 -129
- omlish/lang/_asyncs.cc +186 -0
- omlish/lang/asyncs.py +67 -43
- omlish/lang/{attrs.py → attrstorage.py} +15 -15
- omlish/lang/cached/property.py +2 -2
- omlish/lang/casing.py +11 -0
- omlish/lang/classes/bindable.py +2 -3
- omlish/lang/classes/restrict.py +8 -0
- omlish/lang/classes/simple.py +26 -4
- omlish/lang/collections.py +1 -1
- omlish/lang/contextmanagers.py +59 -9
- omlish/lang/functions.py +31 -33
- omlish/lang/imports/_capture.cc +103 -0
- omlish/lang/imports/capture.py +902 -0
- omlish/lang/imports/lazy.py +0 -25
- omlish/lang/imports/proxy.py +559 -0
- omlish/lang/iterables.py +2 -2
- omlish/lang/lazyglobals.py +49 -14
- omlish/lang/maybes.py +2 -1
- omlish/lang/maysync.py +2 -2
- omlish/lang/params.py +17 -0
- omlish/lang/recursion.py +0 -1
- omlish/lang/resources.py +1 -1
- omlish/lang/sequences.py +124 -0
- omlish/lifecycles/contextmanagers.py +1 -2
- omlish/lifecycles/controller.py +1 -2
- omlish/lite/abstract.py +54 -24
- omlish/lite/asyncs.py +146 -0
- omlish/lite/attrops.py +415 -0
- omlish/lite/cached.py +57 -1
- omlish/lite/contextmanagers.py +4 -4
- omlish/lite/dataclasses.py +55 -0
- omlish/lite/inject.py +5 -4
- omlish/lite/marshal.py +1 -0
- omlish/lite/maybes.py +10 -2
- omlish/lite/maysync.py +22 -5
- omlish/lite/pycharm.py +1 -1
- omlish/lite/strings.py +0 -7
- omlish/lite/timing.py +6 -3
- omlish/lite/typing.py +6 -0
- omlish/logs/_amalg.py +8 -0
- omlish/logs/all.py +59 -31
- omlish/logs/base.py +204 -0
- omlish/logs/contexts.py +171 -0
- omlish/logs/formatters.py +13 -0
- omlish/logs/infos.py +377 -0
- omlish/logs/levels.py +97 -0
- omlish/logs/modules.py +13 -0
- omlish/logs/protocols.py +32 -0
- omlish/logs/standard.py +20 -15
- omlish/logs/std/configs.py +29 -0
- omlish/logs/{filters.py → std/filters.py} +1 -1
- omlish/logs/std/formatters.py +25 -0
- omlish/logs/std/handlers.py +19 -0
- omlish/logs/{json.py → std/json.py} +2 -2
- omlish/logs/std/loggers.py +48 -0
- omlish/logs/{proxy.py → std/proxy.py} +3 -3
- omlish/logs/std/records.py +671 -0
- omlish/logs/typed/bindings.py +108 -37
- omlish/logs/typed/types.py +17 -1
- omlish/logs/typed/values.py +2 -2
- omlish/logs/utils.py +60 -4
- omlish/logs/warnings.py +8 -0
- omlish/manifests/loading.py +8 -1
- omlish/marshal/__init__.py +54 -22
- 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/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/math/fixed.py +2 -2
- omlish/metadata.py +23 -1
- omlish/os/atomics.py +2 -2
- omlish/os/forkhooks.py +4 -0
- omlish/os/journald.py +3 -3
- omlish/os/pidfiles/pinning.py +2 -2
- omlish/reflect/ops.py +9 -0
- omlish/reflect/types.py +44 -8
- omlish/secrets/marshal.py +1 -1
- omlish/secrets/secrets.py +6 -3
- omlish/sockets/addresses.py +1 -1
- omlish/sockets/server/handlers.py +2 -2
- omlish/sockets/server/server.py +4 -3
- omlish/sockets/server/ssl.py +2 -2
- 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 +15 -20
- omlish/sql/{tabledefs/alchemy.py → alchemy/tabledefs.py} +2 -2
- omlish/sql/queries/_marshal.py +3 -3
- omlish/sql/queries/params.py +1 -1
- omlish/sql/queries/rendering.py +1 -1
- omlish/sql/tabledefs/_marshal.py +1 -1
- omlish/subprocesses/all.py +135 -0
- omlish/subprocesses/base.py +8 -3
- omlish/subprocesses/editor.py +1 -1
- omlish/sync.py +181 -20
- 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 -5
- 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/__init__.py +1 -1
- omlish/typedvalues/marshal.py +85 -59
- omlish/typedvalues/values.py +2 -1
- {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/METADATA +36 -38
- {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/RECORD +323 -385
- omlish/asyncs/bluelet/LICENSE +0 -6
- omlish/asyncs/bluelet/all.py +0 -67
- omlish/asyncs/bluelet/api.py +0 -23
- omlish/asyncs/bluelet/core.py +0 -178
- omlish/asyncs/bluelet/events.py +0 -79
- omlish/asyncs/bluelet/files.py +0 -80
- omlish/asyncs/bluelet/runner.py +0 -417
- omlish/asyncs/bluelet/sockets.py +0 -216
- omlish/asyncs/bridge.py +0 -359
- omlish/asyncs/utils.py +0 -18
- omlish/dataclasses/impl/generation/mangling.py +0 -18
- omlish/defs.py +0 -216
- omlish/dispatch/_dispatch2.py +0 -69
- omlish/dispatch/_dispatch3.py +0 -108
- omlish/dynamic.py +0 -219
- omlish/formats/json/Json.g4 +0 -77
- omlish/formats/json/_antlr/JsonLexer.py +0 -109
- omlish/formats/json/_antlr/JsonListener.py +0 -61
- omlish/formats/json/_antlr/JsonParser.py +0 -457
- omlish/formats/json/_antlr/JsonVisitor.py +0 -42
- omlish/formats/json5/Json5.g4 +0 -168
- omlish/formats/json5/_antlr/Json5Lexer.py +0 -354
- omlish/formats/json5/_antlr/Json5Listener.py +0 -79
- omlish/formats/json5/_antlr/Json5Parser.py +0 -617
- omlish/formats/json5/_antlr/Json5Visitor.py +0 -52
- omlish/funcs/match.py +0 -227
- omlish/io/trampoline.py +0 -289
- omlish/lang/imports/proxyinit.py +0 -665
- omlish/lite/logs.py +0 -4
- omlish/lite/reprs.py +0 -85
- omlish/logs/abc.py +0 -319
- omlish/logs/callers.py +0 -67
- omlish/logs/color.py +0 -27
- omlish/logs/configs.py +0 -29
- omlish/logs/handlers.py +0 -17
- omlish/logs/protocol.py +0 -218
- omlish/logs/timing.py +0 -58
- omlish/marshal/factories/match.py +0 -34
- omlish/marshal/factories/simple.py +0 -28
- omlish/specs/irc/messages/base.py +0 -49
- omlish/specs/irc/messages/formats.py +0 -92
- omlish/specs/irc/messages/messages.py +0 -774
- omlish/specs/irc/messages/parsing.py +0 -98
- omlish/specs/irc/numerics/formats.py +0 -97
- omlish/specs/irc/numerics/numerics.py +0 -865
- omlish/specs/irc/numerics/types.py +0 -59
- omlish/specs/irc/protocol/LICENSE +0 -11
- omlish/specs/irc/protocol/__init__.py +0 -61
- omlish/specs/irc/protocol/consts.py +0 -6
- omlish/specs/irc/protocol/errors.py +0 -30
- omlish/specs/irc/protocol/message.py +0 -21
- omlish/specs/irc/protocol/nuh.py +0 -55
- omlish/specs/irc/protocol/parsing.py +0 -158
- omlish/specs/irc/protocol/rendering.py +0 -153
- omlish/specs/irc/protocol/tags.py +0 -102
- omlish/specs/irc/protocol/utils.py +0 -30
- omlish/specs/proto/Protobuf3.g4 +0 -396
- omlish/specs/proto/__init__.py +0 -0
- omlish/specs/proto/_antlr/Protobuf3Lexer.py +0 -340
- omlish/specs/proto/_antlr/Protobuf3Listener.py +0 -448
- omlish/specs/proto/_antlr/Protobuf3Parser.py +0 -3909
- omlish/specs/proto/_antlr/Protobuf3Visitor.py +0 -257
- omlish/specs/proto/_antlr/__init__.py +0 -0
- omlish/specs/proto/nodes.py +0 -54
- omlish/specs/proto/parsing.py +0 -97
- omlish/sql/parsing/Minisql.g4 +0 -292
- omlish/sql/parsing/__init__.py +0 -0
- omlish/sql/parsing/_antlr/MinisqlLexer.py +0 -322
- omlish/sql/parsing/_antlr/MinisqlListener.py +0 -511
- omlish/sql/parsing/_antlr/MinisqlParser.py +0 -3763
- omlish/sql/parsing/_antlr/MinisqlVisitor.py +0 -292
- omlish/sql/parsing/_antlr/__init__.py +0 -0
- omlish/sql/parsing/parsing.py +0 -119
- omlish/text/antlr/__init__.py +0 -3
- omlish/text/antlr/_runtime/BufferedTokenStream.py +0 -305
- omlish/text/antlr/_runtime/CommonTokenFactory.py +0 -64
- omlish/text/antlr/_runtime/CommonTokenStream.py +0 -90
- omlish/text/antlr/_runtime/FileStream.py +0 -30
- omlish/text/antlr/_runtime/InputStream.py +0 -90
- omlish/text/antlr/_runtime/IntervalSet.py +0 -183
- omlish/text/antlr/_runtime/LICENSE.txt +0 -28
- omlish/text/antlr/_runtime/LL1Analyzer.py +0 -176
- omlish/text/antlr/_runtime/Lexer.py +0 -332
- omlish/text/antlr/_runtime/ListTokenSource.py +0 -147
- omlish/text/antlr/_runtime/Parser.py +0 -583
- omlish/text/antlr/_runtime/ParserInterpreter.py +0 -173
- omlish/text/antlr/_runtime/ParserRuleContext.py +0 -189
- omlish/text/antlr/_runtime/PredictionContext.py +0 -632
- omlish/text/antlr/_runtime/Recognizer.py +0 -150
- omlish/text/antlr/_runtime/RuleContext.py +0 -230
- omlish/text/antlr/_runtime/StdinStream.py +0 -14
- omlish/text/antlr/_runtime/Token.py +0 -158
- omlish/text/antlr/_runtime/TokenStreamRewriter.py +0 -258
- omlish/text/antlr/_runtime/Utils.py +0 -36
- omlish/text/antlr/_runtime/__init__.py +0 -2
- omlish/text/antlr/_runtime/_all.py +0 -24
- omlish/text/antlr/_runtime/_pygrun.py +0 -174
- omlish/text/antlr/_runtime/atn/ATN.py +0 -135
- omlish/text/antlr/_runtime/atn/ATNConfig.py +0 -162
- omlish/text/antlr/_runtime/atn/ATNConfigSet.py +0 -215
- omlish/text/antlr/_runtime/atn/ATNDeserializationOptions.py +0 -27
- omlish/text/antlr/_runtime/atn/ATNDeserializer.py +0 -449
- omlish/text/antlr/_runtime/atn/ATNSimulator.py +0 -50
- omlish/text/antlr/_runtime/atn/ATNState.py +0 -267
- omlish/text/antlr/_runtime/atn/ATNType.py +0 -20
- omlish/text/antlr/_runtime/atn/LexerATNSimulator.py +0 -573
- omlish/text/antlr/_runtime/atn/LexerAction.py +0 -301
- omlish/text/antlr/_runtime/atn/LexerActionExecutor.py +0 -146
- omlish/text/antlr/_runtime/atn/ParserATNSimulator.py +0 -1664
- omlish/text/antlr/_runtime/atn/PredictionMode.py +0 -502
- omlish/text/antlr/_runtime/atn/SemanticContext.py +0 -333
- omlish/text/antlr/_runtime/atn/Transition.py +0 -271
- omlish/text/antlr/_runtime/atn/__init__.py +0 -4
- omlish/text/antlr/_runtime/dfa/DFA.py +0 -136
- omlish/text/antlr/_runtime/dfa/DFASerializer.py +0 -76
- omlish/text/antlr/_runtime/dfa/DFAState.py +0 -129
- omlish/text/antlr/_runtime/dfa/__init__.py +0 -4
- omlish/text/antlr/_runtime/error/DiagnosticErrorListener.py +0 -111
- omlish/text/antlr/_runtime/error/ErrorListener.py +0 -75
- omlish/text/antlr/_runtime/error/ErrorStrategy.py +0 -712
- omlish/text/antlr/_runtime/error/Errors.py +0 -176
- omlish/text/antlr/_runtime/error/__init__.py +0 -4
- omlish/text/antlr/_runtime/tree/Chunk.py +0 -33
- omlish/text/antlr/_runtime/tree/ParseTreeMatch.py +0 -121
- omlish/text/antlr/_runtime/tree/ParseTreePattern.py +0 -75
- omlish/text/antlr/_runtime/tree/ParseTreePatternMatcher.py +0 -377
- omlish/text/antlr/_runtime/tree/RuleTagToken.py +0 -53
- omlish/text/antlr/_runtime/tree/TokenTagToken.py +0 -50
- omlish/text/antlr/_runtime/tree/Tree.py +0 -194
- omlish/text/antlr/_runtime/tree/Trees.py +0 -114
- omlish/text/antlr/_runtime/tree/__init__.py +0 -2
- omlish/text/antlr/_runtime/xpath/XPath.py +0 -278
- omlish/text/antlr/_runtime/xpath/XPathLexer.py +0 -98
- omlish/text/antlr/_runtime/xpath/__init__.py +0 -4
- omlish/text/antlr/delimit.py +0 -109
- omlish/text/antlr/dot.py +0 -41
- omlish/text/antlr/errors.py +0 -14
- omlish/text/antlr/input.py +0 -96
- omlish/text/antlr/parsing.py +0 -54
- omlish/text/antlr/runtime.py +0 -102
- omlish/text/antlr/utils.py +0 -38
- /omlish/{asyncs/bluelet → cexts}/__init__.py +0 -0
- /omlish/{formats/json/_antlr → diag/cmds}/__init__.py +0 -0
- /omlish/{formats/json5/_antlr → http/clients/coro}/__init__.py +0 -0
- /omlish/{specs/irc → inject/helpers}/__init__.py +0 -0
- /omlish/{specs/irc/messages → logs/std}/__init__.py +0 -0
- /omlish/logs/{noisy.py → std/noisy.py} +0 -0
- /omlish/{specs/irc/numerics → marshal/composite/unions}/__init__.py +0 -0
- {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/top_level.txt +0 -0
omlish/marshal/base/configs.py
CHANGED
|
@@ -3,6 +3,10 @@ import typing as ta
|
|
|
3
3
|
from ... import lang
|
|
4
4
|
from .registries import Registry
|
|
5
5
|
from .registries import RegistryItem
|
|
6
|
+
from .registries import RegistryView
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
ConfigT = ta.TypeVar('ConfigT', bound='Config')
|
|
6
10
|
|
|
7
11
|
|
|
8
12
|
##
|
|
@@ -12,7 +16,15 @@ class Config(RegistryItem, lang.Abstract):
|
|
|
12
16
|
pass
|
|
13
17
|
|
|
14
18
|
|
|
19
|
+
Configs: ta.TypeAlias = RegistryView[Config]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
##
|
|
23
|
+
|
|
24
|
+
|
|
15
25
|
ConfigRegistry: ta.TypeAlias = Registry[Config]
|
|
16
26
|
|
|
27
|
+
lang.static_check_issubclass[Configs](ConfigRegistry)
|
|
28
|
+
|
|
17
29
|
|
|
18
30
|
EMPTY_CONFIG_REGISTRY = ConfigRegistry().seal()
|
omlish/marshal/base/contexts.py
CHANGED
|
@@ -5,9 +5,8 @@ from ... import check
|
|
|
5
5
|
from ... import collections as col
|
|
6
6
|
from ... import lang
|
|
7
7
|
from ... import reflect as rfl
|
|
8
|
-
from ...funcs import match as mfs
|
|
9
8
|
from .configs import EMPTY_CONFIG_REGISTRY
|
|
10
|
-
from .configs import
|
|
9
|
+
from .configs import Configs
|
|
11
10
|
from .errors import UnhandledTypeError
|
|
12
11
|
from .options import Option
|
|
13
12
|
from .overrides import ReflectOverride
|
|
@@ -28,44 +27,60 @@ T = ta.TypeVar('T')
|
|
|
28
27
|
|
|
29
28
|
|
|
30
29
|
@dc.dataclass(frozen=True, kw_only=True)
|
|
31
|
-
class BaseContext(lang.Abstract):
|
|
32
|
-
|
|
30
|
+
class BaseContext(lang.Abstract, lang.Sealed):
|
|
31
|
+
configs: Configs = EMPTY_CONFIG_REGISTRY
|
|
33
32
|
options: col.TypeMap[Option] = col.TypeMap()
|
|
34
33
|
|
|
35
34
|
def _reflect(self, o: ta.Any) -> rfl.Type:
|
|
36
35
|
def override(o):
|
|
37
|
-
if (ovr := self.
|
|
36
|
+
if (ovr := self.configs.get_of(o, ReflectOverride)):
|
|
38
37
|
return ovr[-1].rty
|
|
39
38
|
return None
|
|
40
39
|
|
|
41
40
|
return rfl.Reflector(override=override).type(o)
|
|
42
41
|
|
|
43
42
|
|
|
43
|
+
#
|
|
44
|
+
|
|
45
|
+
|
|
44
46
|
@dc.dataclass(frozen=True, kw_only=True)
|
|
45
|
-
class
|
|
46
|
-
|
|
47
|
+
class MarshalFactoryContext(BaseContext, lang.Final):
|
|
48
|
+
marshaler_factory: ta.Optional['MarshalerFactory'] = None
|
|
47
49
|
|
|
48
|
-
def
|
|
50
|
+
def make_marshaler(self, o: ta.Any) -> 'Marshaler':
|
|
49
51
|
rty = self._reflect(o)
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
except mfs.MatchGuardError:
|
|
52
|
+
fac = check.not_none(self.marshaler_factory)
|
|
53
|
+
if (m := fac.make_marshaler(self, rty)) is None:
|
|
53
54
|
raise UnhandledTypeError(rty) # noqa
|
|
54
|
-
|
|
55
|
-
def marshal(self, obj: ta.Any, ty: ta.Any | None = None) -> 'Value':
|
|
56
|
-
return self.make(ty if ty is not None else type(obj)).marshal(self, obj)
|
|
55
|
+
return m()
|
|
57
56
|
|
|
58
57
|
|
|
59
58
|
@dc.dataclass(frozen=True, kw_only=True)
|
|
60
|
-
class
|
|
61
|
-
|
|
59
|
+
class UnmarshalFactoryContext(BaseContext, lang.Final):
|
|
60
|
+
unmarshaler_factory: ta.Optional['UnmarshalerFactory'] = None
|
|
62
61
|
|
|
63
|
-
def
|
|
62
|
+
def make_unmarshaler(self, o: ta.Any) -> 'Unmarshaler':
|
|
64
63
|
rty = self._reflect(o)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
except mfs.MatchGuardError:
|
|
64
|
+
fac = check.not_none(self.unmarshaler_factory)
|
|
65
|
+
if (m := fac.make_unmarshaler(self, rty)) is None:
|
|
68
66
|
raise UnhandledTypeError(rty) # noqa
|
|
67
|
+
return m()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
#
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@dc.dataclass(frozen=True, kw_only=True)
|
|
74
|
+
class MarshalContext(BaseContext, lang.Final):
|
|
75
|
+
marshal_factory_context: MarshalFactoryContext
|
|
76
|
+
|
|
77
|
+
def marshal(self, obj: ta.Any, ty: ta.Any | None = None) -> 'Value':
|
|
78
|
+
return self.marshal_factory_context.make_marshaler(ty if ty is not None else type(obj)).marshal(self, obj)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@dc.dataclass(frozen=True, kw_only=True)
|
|
82
|
+
class UnmarshalContext(BaseContext, lang.Final):
|
|
83
|
+
unmarshal_factory_context: UnmarshalFactoryContext
|
|
69
84
|
|
|
70
85
|
@ta.overload
|
|
71
86
|
def unmarshal(self, v: 'Value', ty: type[T]) -> T:
|
|
@@ -76,4 +91,4 @@ class UnmarshalContext(BaseContext, lang.Final):
|
|
|
76
91
|
...
|
|
77
92
|
|
|
78
93
|
def unmarshal(self, v, ty):
|
|
79
|
-
return self.
|
|
94
|
+
return self.unmarshal_factory_context.make_unmarshaler(ty).unmarshal(self, v)
|
omlish/marshal/base/funcs.py
CHANGED
|
@@ -3,9 +3,10 @@ import typing as ta
|
|
|
3
3
|
|
|
4
4
|
from ... import lang
|
|
5
5
|
from ... import reflect as rfl
|
|
6
|
-
from ...funcs import match as mfs
|
|
7
6
|
from .contexts import MarshalContext
|
|
7
|
+
from .contexts import MarshalFactoryContext
|
|
8
8
|
from .contexts import UnmarshalContext
|
|
9
|
+
from .contexts import UnmarshalFactoryContext
|
|
9
10
|
from .types import Marshaler
|
|
10
11
|
from .types import MarshalerFactory
|
|
11
12
|
from .types import MarshalerMaker
|
|
@@ -39,19 +40,15 @@ class FuncUnmarshaler(Unmarshaler, lang.Final):
|
|
|
39
40
|
|
|
40
41
|
@dc.dataclass(frozen=True)
|
|
41
42
|
class FuncMarshalerFactory(MarshalerFactory): # noqa
|
|
42
|
-
|
|
43
|
-
fn: ta.Callable[[MarshalContext, rfl.Type], Marshaler]
|
|
43
|
+
gf: MarshalerMaker
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
return mfs.simple(self.guard, self.fn)
|
|
45
|
+
def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
|
|
46
|
+
return self.gf(ctx, rty)
|
|
48
47
|
|
|
49
48
|
|
|
50
49
|
@dc.dataclass(frozen=True)
|
|
51
50
|
class FuncUnmarshalerFactory(UnmarshalerFactory): # noqa
|
|
52
|
-
|
|
53
|
-
fn: ta.Callable[[UnmarshalContext, rfl.Type], Unmarshaler]
|
|
51
|
+
gf: UnmarshalerMaker
|
|
54
52
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
return mfs.simple(self.guard, self.fn)
|
|
53
|
+
def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
|
|
54
|
+
return self.gf(ctx, rty)
|
omlish/marshal/base/options.py
CHANGED
|
@@ -3,11 +3,11 @@ TODO:
|
|
|
3
3
|
- col.TypeMap?
|
|
4
4
|
- at least get_any
|
|
5
5
|
"""
|
|
6
|
+
import abc
|
|
6
7
|
import dataclasses as dc
|
|
7
8
|
import threading
|
|
8
9
|
import typing as ta
|
|
9
10
|
|
|
10
|
-
from ... import collections as col
|
|
11
11
|
from ... import lang
|
|
12
12
|
|
|
13
13
|
|
|
@@ -22,23 +22,38 @@ RegistryItemT = ta.TypeVar('RegistryItemT', bound=RegistryItem)
|
|
|
22
22
|
RegistryItemU = ta.TypeVar('RegistryItemU', bound=RegistryItem)
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
##
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class RegistryView(lang.Abstract, ta.Generic[RegistryItemT]):
|
|
29
|
+
@abc.abstractmethod
|
|
30
|
+
def get(
|
|
31
|
+
self,
|
|
32
|
+
key: ta.Any,
|
|
33
|
+
*,
|
|
34
|
+
identity: bool | None = None,
|
|
35
|
+
) -> ta.Sequence[RegistryItemT]:
|
|
36
|
+
...
|
|
30
37
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
self
|
|
34
|
-
|
|
38
|
+
@abc.abstractmethod
|
|
39
|
+
def get_of(
|
|
40
|
+
self,
|
|
41
|
+
key: ta.Any,
|
|
42
|
+
item_ty: type[RegistryItemU],
|
|
43
|
+
*,
|
|
44
|
+
identity: bool | None = None,
|
|
45
|
+
) -> ta.Sequence[RegistryItemU]:
|
|
46
|
+
...
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
##
|
|
35
50
|
|
|
36
51
|
|
|
37
52
|
class RegistrySealedError(Exception):
|
|
38
53
|
pass
|
|
39
54
|
|
|
40
55
|
|
|
41
|
-
class Registry(
|
|
56
|
+
class Registry(RegistryView[RegistryItemT]):
|
|
42
57
|
def __init__(
|
|
43
58
|
self,
|
|
44
59
|
*,
|
|
@@ -50,14 +65,123 @@ class Registry(ta.Generic[RegistryItemT]):
|
|
|
50
65
|
lock = threading.RLock()
|
|
51
66
|
self._lock = lock
|
|
52
67
|
|
|
53
|
-
self.
|
|
54
|
-
|
|
68
|
+
self._state: Registry._State[RegistryItemT] = Registry._State(
|
|
69
|
+
dct={},
|
|
70
|
+
id_dct={},
|
|
71
|
+
version=0,
|
|
72
|
+
)
|
|
55
73
|
|
|
56
|
-
self._version = 0
|
|
57
74
|
self._sealed = False
|
|
58
75
|
|
|
59
76
|
#
|
|
60
77
|
|
|
78
|
+
@dc.dataclass(frozen=True)
|
|
79
|
+
class _KeyItems(ta.Generic[RegistryItemU]):
|
|
80
|
+
key: ta.Any
|
|
81
|
+
items: ta.Sequence[RegistryItemU] = ()
|
|
82
|
+
item_lists_by_ty: ta.Mapping[type[RegistryItemU], ta.Sequence[RegistryItemU]] = dc.field(default_factory=dict)
|
|
83
|
+
|
|
84
|
+
def add(self, *items: RegistryItemU) -> 'Registry._KeyItems[RegistryItemU]':
|
|
85
|
+
item_lists_by_ty: dict[type[RegistryItemU], list[RegistryItemU]] = {}
|
|
86
|
+
|
|
87
|
+
for i in items:
|
|
88
|
+
try:
|
|
89
|
+
l = item_lists_by_ty[type(i)]
|
|
90
|
+
except KeyError:
|
|
91
|
+
l = item_lists_by_ty[type(i)] = list(self.item_lists_by_ty.get(type(i), ()))
|
|
92
|
+
l.append(i)
|
|
93
|
+
|
|
94
|
+
return Registry._KeyItems(
|
|
95
|
+
self.key,
|
|
96
|
+
(*self.items, *items),
|
|
97
|
+
{**self.item_lists_by_ty, **item_lists_by_ty},
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
@dc.dataclass(frozen=True, kw_only=True)
|
|
101
|
+
class _State(ta.Generic[RegistryItemU]):
|
|
102
|
+
dct: ta.Mapping[ta.Any, 'Registry._KeyItems[RegistryItemU]']
|
|
103
|
+
id_dct: ta.Mapping[ta.Any, 'Registry._KeyItems[RegistryItemU]']
|
|
104
|
+
version: int
|
|
105
|
+
|
|
106
|
+
#
|
|
107
|
+
|
|
108
|
+
def register(
|
|
109
|
+
self,
|
|
110
|
+
key: ta.Any,
|
|
111
|
+
*items: RegistryItemT,
|
|
112
|
+
identity: bool = False,
|
|
113
|
+
) -> 'Registry._State[RegistryItemU]':
|
|
114
|
+
if not items:
|
|
115
|
+
return self
|
|
116
|
+
|
|
117
|
+
sr_dct: ta.Any = self.dct if not identity else self.id_dct
|
|
118
|
+
if (sr := sr_dct.get(key)) is None:
|
|
119
|
+
sr = Registry._KeyItems(key)
|
|
120
|
+
sr = sr.add(*items)
|
|
121
|
+
new = {key: sr}
|
|
122
|
+
|
|
123
|
+
return Registry._State(
|
|
124
|
+
dct={**self.dct, **new} if not identity else self.dct,
|
|
125
|
+
id_dct={**self.id_dct, **new} if identity else self.id_dct,
|
|
126
|
+
version=self.version + 1,
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
#
|
|
130
|
+
|
|
131
|
+
_get_cache: dict[ta.Any, ta.Sequence[RegistryItem]] = dc.field(default_factory=dict)
|
|
132
|
+
|
|
133
|
+
def get(
|
|
134
|
+
self,
|
|
135
|
+
key: ta.Any,
|
|
136
|
+
*,
|
|
137
|
+
identity: bool | None = None,
|
|
138
|
+
) -> ta.Sequence[RegistryItem]:
|
|
139
|
+
if identity is None:
|
|
140
|
+
try:
|
|
141
|
+
return self._get_cache[key]
|
|
142
|
+
except KeyError:
|
|
143
|
+
pass
|
|
144
|
+
|
|
145
|
+
ret = self._get_cache[key] = (
|
|
146
|
+
*self.get(key, identity=True),
|
|
147
|
+
*self.get(key, identity=False),
|
|
148
|
+
)
|
|
149
|
+
return ret
|
|
150
|
+
|
|
151
|
+
dct: ta.Any = self.dct if not identity else self.id_dct
|
|
152
|
+
try:
|
|
153
|
+
return dct[key].items
|
|
154
|
+
except KeyError:
|
|
155
|
+
return ()
|
|
156
|
+
|
|
157
|
+
_get_of_cache: dict[ta.Any, dict[type, ta.Sequence[RegistryItem]]] = dc.field(default_factory=dict)
|
|
158
|
+
|
|
159
|
+
def get_of(
|
|
160
|
+
self,
|
|
161
|
+
key: ta.Any,
|
|
162
|
+
item_ty: type[RegistryItem],
|
|
163
|
+
*,
|
|
164
|
+
identity: bool | None = None,
|
|
165
|
+
) -> ta.Sequence[RegistryItem]:
|
|
166
|
+
if identity is None:
|
|
167
|
+
try:
|
|
168
|
+
return self._get_of_cache[key][item_ty]
|
|
169
|
+
except KeyError:
|
|
170
|
+
pass
|
|
171
|
+
|
|
172
|
+
ret = self._get_of_cache.setdefault(key, {})[item_ty] = (
|
|
173
|
+
*self.get_of(key, item_ty, identity=True),
|
|
174
|
+
*self.get_of(key, item_ty, identity=False),
|
|
175
|
+
)
|
|
176
|
+
return ret
|
|
177
|
+
|
|
178
|
+
dct: ta.Any = self.dct if not identity else self.id_dct
|
|
179
|
+
try:
|
|
180
|
+
sr = dct[key]
|
|
181
|
+
except KeyError:
|
|
182
|
+
return ()
|
|
183
|
+
return sr.item_lists_by_ty.get(item_ty, ())
|
|
184
|
+
|
|
61
185
|
def is_sealed(self) -> bool:
|
|
62
186
|
if self._sealed:
|
|
63
187
|
return True
|
|
@@ -92,12 +216,11 @@ class Registry(ta.Generic[RegistryItemT]):
|
|
|
92
216
|
if self._sealed:
|
|
93
217
|
raise RegistrySealedError(self)
|
|
94
218
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
self._version += 1
|
|
219
|
+
self._state = self._state.register(
|
|
220
|
+
key,
|
|
221
|
+
*items,
|
|
222
|
+
identity=identity,
|
|
223
|
+
)
|
|
101
224
|
|
|
102
225
|
return self
|
|
103
226
|
|
|
@@ -108,18 +231,8 @@ class Registry(ta.Generic[RegistryItemT]):
|
|
|
108
231
|
key: ta.Any,
|
|
109
232
|
*,
|
|
110
233
|
identity: bool | None = None,
|
|
111
|
-
) -> ta.Sequence[
|
|
112
|
-
|
|
113
|
-
return (
|
|
114
|
-
*self.get(key, identity=True),
|
|
115
|
-
*self.get(key, identity=False),
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
dct: ta.Any = self._id_dct if identity else self._dct
|
|
119
|
-
try:
|
|
120
|
-
return dct[key].items
|
|
121
|
-
except KeyError:
|
|
122
|
-
return ()
|
|
234
|
+
) -> ta.Sequence[RegistryItemT]:
|
|
235
|
+
return self._state.get(key, identity=identity) # type: ignore [return-value]
|
|
123
236
|
|
|
124
237
|
def get_of(
|
|
125
238
|
self,
|
|
@@ -128,15 +241,4 @@ class Registry(ta.Generic[RegistryItemT]):
|
|
|
128
241
|
*,
|
|
129
242
|
identity: bool | None = None,
|
|
130
243
|
) -> ta.Sequence[RegistryItemU]:
|
|
131
|
-
|
|
132
|
-
return (
|
|
133
|
-
*self.get_of(key, item_ty, identity=True),
|
|
134
|
-
*self.get_of(key, item_ty, identity=False),
|
|
135
|
-
)
|
|
136
|
-
|
|
137
|
-
dct: ta.Any = self._id_dct if identity else self._dct
|
|
138
|
-
try:
|
|
139
|
-
sr = dct[key]
|
|
140
|
-
except KeyError:
|
|
141
|
-
return ()
|
|
142
|
-
return sr.item_lists_by_ty.get(item_ty, ())
|
|
244
|
+
return self._state.get_of(key, item_ty, identity=identity) # type: ignore [return-value]
|
omlish/marshal/base/types.py
CHANGED
|
@@ -3,10 +3,12 @@ import typing as ta
|
|
|
3
3
|
|
|
4
4
|
from ... import lang
|
|
5
5
|
from ... import reflect as rfl
|
|
6
|
-
from ...funcs import
|
|
6
|
+
from ...funcs import guard as gfs
|
|
7
7
|
from .configs import ConfigRegistry
|
|
8
8
|
from .contexts import MarshalContext
|
|
9
|
+
from .contexts import MarshalFactoryContext
|
|
9
10
|
from .contexts import UnmarshalContext
|
|
11
|
+
from .contexts import UnmarshalFactoryContext
|
|
10
12
|
from .values import Value
|
|
11
13
|
|
|
12
14
|
|
|
@@ -31,21 +33,19 @@ class Unmarshaler(lang.Abstract):
|
|
|
31
33
|
##
|
|
32
34
|
|
|
33
35
|
|
|
34
|
-
MarshalerMaker: ta.TypeAlias =
|
|
35
|
-
UnmarshalerMaker: ta.TypeAlias =
|
|
36
|
+
MarshalerMaker: ta.TypeAlias = gfs.GuardFn[[MarshalFactoryContext, rfl.Type], Marshaler]
|
|
37
|
+
UnmarshalerMaker: ta.TypeAlias = gfs.GuardFn[[UnmarshalFactoryContext, rfl.Type], Unmarshaler]
|
|
36
38
|
|
|
37
39
|
|
|
38
40
|
class MarshalerFactory(lang.Abstract):
|
|
39
|
-
@property
|
|
40
41
|
@abc.abstractmethod
|
|
41
|
-
def make_marshaler(self) ->
|
|
42
|
+
def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
|
|
42
43
|
raise NotImplementedError
|
|
43
44
|
|
|
44
45
|
|
|
45
46
|
class UnmarshalerFactory(lang.Abstract):
|
|
46
|
-
@property
|
|
47
47
|
@abc.abstractmethod
|
|
48
|
-
def make_unmarshaler(self) ->
|
|
48
|
+
def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
|
|
49
49
|
raise NotImplementedError
|
|
50
50
|
|
|
51
51
|
|
|
@@ -65,20 +65,32 @@ class Marshaling(lang.Abstract):
|
|
|
65
65
|
def unmarshaler_factory(self) -> UnmarshalerFactory:
|
|
66
66
|
raise NotImplementedError
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
##
|
|
69
|
+
|
|
70
|
+
def new_marshal_factory_context(self) -> MarshalFactoryContext:
|
|
71
|
+
return MarshalFactoryContext(
|
|
72
|
+
configs=self.config_registry(),
|
|
73
|
+
marshaler_factory=self.marshaler_factory(),
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
def new_unmarshal_factory_context(self) -> UnmarshalFactoryContext:
|
|
77
|
+
return UnmarshalFactoryContext(
|
|
78
|
+
configs=self.config_registry(),
|
|
79
|
+
unmarshaler_factory=self.unmarshaler_factory(),
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
##
|
|
69
83
|
|
|
70
|
-
def new_marshal_context(self
|
|
84
|
+
def new_marshal_context(self) -> MarshalContext:
|
|
71
85
|
return MarshalContext(
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
**kwargs,
|
|
86
|
+
configs=self.config_registry(),
|
|
87
|
+
marshal_factory_context=self.new_marshal_factory_context(),
|
|
75
88
|
)
|
|
76
89
|
|
|
77
|
-
def new_unmarshal_context(self
|
|
90
|
+
def new_unmarshal_context(self) -> UnmarshalContext:
|
|
78
91
|
return UnmarshalContext(
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
**kwargs,
|
|
92
|
+
configs=self.config_registry(),
|
|
93
|
+
unmarshal_factory_context=self.new_unmarshal_factory_context(),
|
|
82
94
|
)
|
|
83
95
|
|
|
84
96
|
#
|
|
@@ -98,3 +110,15 @@ class Marshaling(lang.Abstract):
|
|
|
98
110
|
@ta.final
|
|
99
111
|
def unmarshal(self, v, ty, **kwargs):
|
|
100
112
|
return self.new_unmarshal_context(**kwargs).unmarshal(v, ty)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
##
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
# MarshalerOrUnmarshaler: ta.TypeAlias = Marshaler | Unmarshaler
|
|
119
|
+
# MarshalerOrUnmarshalerT = ta.TypeVar('MarshalerOrUnmarshalerT', bound=MarshalerOrUnmarshaler)
|
|
120
|
+
#
|
|
121
|
+
# MarshalContextOrUnmarshalContext: ta.TypeAlias = MarshalContext | UnmarshalContext
|
|
122
|
+
# MarshalContextOrUnmarshalContextT = ta.TypeVar('MarshalContextOrUnmarshalContextT', bound=MarshalContextOrUnmarshalContext) # noqa
|
|
123
|
+
#
|
|
124
|
+
# MarshalerMakerOrUnmarshalerMaker: ta.TypeAlias = MarshalerMaker | UnmarshalerMaker
|
|
@@ -9,14 +9,15 @@ import typing as ta
|
|
|
9
9
|
|
|
10
10
|
from ... import check
|
|
11
11
|
from ... import reflect as rfl
|
|
12
|
-
from ...funcs import match as mfs
|
|
13
12
|
from ..base.contexts import MarshalContext
|
|
13
|
+
from ..base.contexts import MarshalFactoryContext
|
|
14
14
|
from ..base.contexts import UnmarshalContext
|
|
15
|
+
from ..base.contexts import UnmarshalFactoryContext
|
|
15
16
|
from ..base.types import Marshaler
|
|
16
17
|
from ..base.types import Unmarshaler
|
|
17
18
|
from ..base.values import Value
|
|
18
|
-
from ..factories.
|
|
19
|
-
from ..factories.
|
|
19
|
+
from ..factories.method import MarshalerFactoryMethodClass
|
|
20
|
+
from ..factories.method import UnmarshalerFactoryMethodClass
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
##
|
|
@@ -29,6 +30,9 @@ DEFAULT_ITERABLE_CONCRETE_TYPES: dict[type[collections.abc.Iterable], type[colle
|
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
|
|
33
|
+
#
|
|
34
|
+
|
|
35
|
+
|
|
32
36
|
@dc.dataclass(frozen=True)
|
|
33
37
|
class IterableMarshaler(Marshaler):
|
|
34
38
|
e: Marshaler
|
|
@@ -37,15 +41,21 @@ class IterableMarshaler(Marshaler):
|
|
|
37
41
|
return list(map(functools.partial(self.e.marshal, ctx), o))
|
|
38
42
|
|
|
39
43
|
|
|
40
|
-
class IterableMarshalerFactory(
|
|
41
|
-
@
|
|
42
|
-
def
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
class IterableMarshalerFactory(MarshalerFactoryMethodClass):
|
|
45
|
+
@MarshalerFactoryMethodClass.make_marshaler.register
|
|
46
|
+
def _make_generic(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
|
|
47
|
+
if not (isinstance(rty, rfl.Generic) and issubclass(rty.cls, collections.abc.Iterable)):
|
|
48
|
+
return None
|
|
49
|
+
return lambda: IterableMarshaler(ctx.make_marshaler(check.single(rty.args)))
|
|
50
|
+
|
|
51
|
+
@MarshalerFactoryMethodClass.make_marshaler.register
|
|
52
|
+
def _make_concrete(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
|
|
53
|
+
if not (isinstance(rty, type) and issubclass(rty, collections.abc.Iterable)):
|
|
54
|
+
return None
|
|
55
|
+
return lambda: IterableMarshaler(ctx.make_marshaler(ta.Any))
|
|
56
|
+
|
|
45
57
|
|
|
46
|
-
|
|
47
|
-
def _build_concrete(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
|
|
48
|
-
return IterableMarshaler(ctx.make(ta.Any))
|
|
58
|
+
#
|
|
49
59
|
|
|
50
60
|
|
|
51
61
|
@dc.dataclass(frozen=True)
|
|
@@ -57,13 +67,16 @@ class IterableUnmarshaler(Unmarshaler):
|
|
|
57
67
|
return self.ctor(map(functools.partial(self.e.unmarshal, ctx), check.isinstance(v, collections.abc.Iterable)))
|
|
58
68
|
|
|
59
69
|
|
|
60
|
-
class IterableUnmarshalerFactory(
|
|
61
|
-
@
|
|
62
|
-
def
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
70
|
+
class IterableUnmarshalerFactory(UnmarshalerFactoryMethodClass):
|
|
71
|
+
@UnmarshalerFactoryMethodClass.make_unmarshaler.register
|
|
72
|
+
def _make_generic(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
|
|
73
|
+
if not (isinstance(rty, rfl.Generic) and issubclass(rty.cls, collections.abc.Iterable)):
|
|
74
|
+
return None
|
|
75
|
+
cty = DEFAULT_ITERABLE_CONCRETE_TYPES.get(rty.cls, rty.cls) # noqa
|
|
76
|
+
return lambda: IterableUnmarshaler(cty, ctx.make_unmarshaler(check.single(rty.args))) # noqa
|
|
66
77
|
|
|
67
|
-
@
|
|
68
|
-
def
|
|
69
|
-
|
|
78
|
+
@UnmarshalerFactoryMethodClass.make_unmarshaler.register
|
|
79
|
+
def _make_concrete(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
|
|
80
|
+
if not (isinstance(rty, type) and issubclass(rty, collections.abc.Iterable)):
|
|
81
|
+
return None
|
|
82
|
+
return lambda: IterableUnmarshaler(check.isinstance(rty, type), ctx.make_unmarshaler(ta.Any))
|
|
@@ -1,15 +1,21 @@
|
|
|
1
|
+
"""
|
|
2
|
+
TODO:
|
|
3
|
+
- squash literal unions - typing machinery doesn't
|
|
4
|
+
"""
|
|
1
5
|
import dataclasses as dc
|
|
2
6
|
import typing as ta
|
|
3
7
|
|
|
4
8
|
from ... import check
|
|
5
9
|
from ... import reflect as rfl
|
|
6
10
|
from ..base.contexts import MarshalContext
|
|
11
|
+
from ..base.contexts import MarshalFactoryContext
|
|
7
12
|
from ..base.contexts import UnmarshalContext
|
|
13
|
+
from ..base.contexts import UnmarshalFactoryContext
|
|
8
14
|
from ..base.types import Marshaler
|
|
15
|
+
from ..base.types import MarshalerFactory
|
|
9
16
|
from ..base.types import Unmarshaler
|
|
17
|
+
from ..base.types import UnmarshalerFactory
|
|
10
18
|
from ..base.values import Value
|
|
11
|
-
from ..factories.simple import SimpleMarshalerFactory
|
|
12
|
-
from ..factories.simple import SimpleUnmarshalerFactory
|
|
13
19
|
|
|
14
20
|
|
|
15
21
|
##
|
|
@@ -24,14 +30,12 @@ class LiteralMarshaler(Marshaler):
|
|
|
24
30
|
return self.e.marshal(ctx, check.in_(o, self.vs))
|
|
25
31
|
|
|
26
32
|
|
|
27
|
-
class LiteralMarshalerFactory(
|
|
28
|
-
def
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
ety = check.single(set(map(type, lty.args)))
|
|
34
|
-
return LiteralMarshaler(ctx.make(ety), frozenset(lty.args))
|
|
33
|
+
class LiteralMarshalerFactory(MarshalerFactory):
|
|
34
|
+
def make_marshaler(self, ctx: MarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Marshaler] | None:
|
|
35
|
+
if not (isinstance(rty, rfl.Literal) and len(set(map(type, rty.args))) == 1):
|
|
36
|
+
return None
|
|
37
|
+
ety = check.single(set(map(type, rty.args)))
|
|
38
|
+
return lambda: LiteralMarshaler(ctx.make_marshaler(ety), frozenset(rty.args))
|
|
35
39
|
|
|
36
40
|
|
|
37
41
|
@dc.dataclass(frozen=True)
|
|
@@ -43,11 +47,9 @@ class LiteralUnmarshaler(Unmarshaler):
|
|
|
43
47
|
return check.in_(self.e.unmarshal(ctx, v), self.vs)
|
|
44
48
|
|
|
45
49
|
|
|
46
|
-
class LiteralUnmarshalerFactory(
|
|
47
|
-
def
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
ety = check.single(set(map(type, lty.args)))
|
|
53
|
-
return LiteralUnmarshaler(ctx.make(ety), frozenset(lty.args))
|
|
50
|
+
class LiteralUnmarshalerFactory(UnmarshalerFactory):
|
|
51
|
+
def make_unmarshaler(self, ctx: UnmarshalFactoryContext, rty: rfl.Type) -> ta.Callable[[], Unmarshaler] | None:
|
|
52
|
+
if not (isinstance(rty, rfl.Literal) and len(set(map(type, rty.args))) == 1):
|
|
53
|
+
return None
|
|
54
|
+
ety = check.single(set(map(type, rty.args)))
|
|
55
|
+
return lambda: LiteralUnmarshaler(ctx.make_unmarshaler(ety), frozenset(rty.args))
|