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/inject/impl/scopes.py
CHANGED
|
@@ -17,7 +17,7 @@ from ..elements import Elements
|
|
|
17
17
|
from ..elements import as_elements
|
|
18
18
|
from ..errors import ScopeAlreadyOpenError
|
|
19
19
|
from ..errors import ScopeNotOpenError
|
|
20
|
-
from ..injector import
|
|
20
|
+
from ..injector import AsyncInjector
|
|
21
21
|
from ..keys import Key
|
|
22
22
|
from ..providers import FnProvider
|
|
23
23
|
from ..providers import Provider
|
|
@@ -28,14 +28,13 @@ from ..scopes import ThreadScope
|
|
|
28
28
|
from ..types import Scope
|
|
29
29
|
from ..types import Unscoped
|
|
30
30
|
from .bindings import BindingImpl
|
|
31
|
-
from .providers import PROVIDER_IMPLS_BY_PROVIDER
|
|
32
31
|
from .providers import ProviderImpl
|
|
33
32
|
|
|
34
33
|
|
|
35
34
|
if ta.TYPE_CHECKING:
|
|
36
|
-
from . import injector as
|
|
35
|
+
from . import injector as _injector
|
|
37
36
|
else:
|
|
38
|
-
|
|
37
|
+
_injector = lang.proxy_import('.injector', __package__)
|
|
39
38
|
|
|
40
39
|
|
|
41
40
|
##
|
|
@@ -51,7 +50,7 @@ class ScopeImpl(lang.Abstract):
|
|
|
51
50
|
return None
|
|
52
51
|
|
|
53
52
|
@abc.abstractmethod
|
|
54
|
-
def provide(self, binding: BindingImpl, injector:
|
|
53
|
+
def provide(self, binding: BindingImpl, injector: AsyncInjector) -> ta.Awaitable[ta.Any]:
|
|
55
54
|
raise NotImplementedError
|
|
56
55
|
|
|
57
56
|
|
|
@@ -60,8 +59,8 @@ class UnscopedScopeImpl(ScopeImpl, lang.Final):
|
|
|
60
59
|
def scope(self) -> Unscoped:
|
|
61
60
|
return Unscoped()
|
|
62
61
|
|
|
63
|
-
def provide(self, binding: BindingImpl, injector:
|
|
64
|
-
return binding.provider.provide(injector)
|
|
62
|
+
async def provide(self, binding: BindingImpl, injector: AsyncInjector) -> ta.Any:
|
|
63
|
+
return await binding.provider.provide(injector)
|
|
65
64
|
|
|
66
65
|
|
|
67
66
|
class SingletonScopeImpl(ScopeImpl, lang.Final):
|
|
@@ -74,12 +73,12 @@ class SingletonScopeImpl(ScopeImpl, lang.Final):
|
|
|
74
73
|
def scope(self) -> Singleton:
|
|
75
74
|
return Singleton()
|
|
76
75
|
|
|
77
|
-
def provide(self, binding: BindingImpl, injector:
|
|
76
|
+
async def provide(self, binding: BindingImpl, injector: AsyncInjector) -> ta.Any:
|
|
78
77
|
try:
|
|
79
78
|
return self._dct[binding]
|
|
80
79
|
except KeyError:
|
|
81
80
|
pass
|
|
82
|
-
v = binding.provider.provide(injector)
|
|
81
|
+
v = await binding.provider.provide(injector)
|
|
83
82
|
self._dct[binding] = v
|
|
84
83
|
return v
|
|
85
84
|
|
|
@@ -94,7 +93,7 @@ class ThreadScopeImpl(ScopeImpl, lang.Final):
|
|
|
94
93
|
def scope(self) -> ThreadScope:
|
|
95
94
|
return ThreadScope()
|
|
96
95
|
|
|
97
|
-
def provide(self, binding: BindingImpl, injector:
|
|
96
|
+
async def provide(self, binding: BindingImpl, injector: AsyncInjector) -> ta.Any:
|
|
98
97
|
dct: dict[BindingImpl, ta.Any]
|
|
99
98
|
try:
|
|
100
99
|
dct = self._local.dct
|
|
@@ -104,7 +103,7 @@ class ThreadScopeImpl(ScopeImpl, lang.Final):
|
|
|
104
103
|
return dct[binding]
|
|
105
104
|
except KeyError:
|
|
106
105
|
pass
|
|
107
|
-
v = binding.provider.provide(injector)
|
|
106
|
+
v = await binding.provider.provide(injector)
|
|
108
107
|
dct[binding] = v
|
|
109
108
|
return v
|
|
110
109
|
|
|
@@ -120,15 +119,12 @@ class ScopeSeededProviderImpl(ProviderImpl):
|
|
|
120
119
|
def providers(self) -> ta.Iterable[Provider]:
|
|
121
120
|
return (self.p,)
|
|
122
121
|
|
|
123
|
-
def provide(self, injector:
|
|
124
|
-
ii = check.isinstance(injector,
|
|
122
|
+
async def provide(self, injector: AsyncInjector) -> ta.Any:
|
|
123
|
+
ii = check.isinstance(injector, _injector.AsyncInjectorImpl)
|
|
125
124
|
ssi = check.isinstance(ii.get_scope_impl(self.p.ss), SeededScopeImpl)
|
|
126
125
|
return ssi.must_state().seeds[self.p.key]
|
|
127
126
|
|
|
128
127
|
|
|
129
|
-
PROVIDER_IMPLS_BY_PROVIDER[ScopeSeededProvider] = ScopeSeededProviderImpl
|
|
130
|
-
|
|
131
|
-
|
|
132
128
|
class SeededScopeImpl(ScopeImpl):
|
|
133
129
|
@dc.dataclass(frozen=True)
|
|
134
130
|
class State:
|
|
@@ -151,20 +147,20 @@ class SeededScopeImpl(ScopeImpl):
|
|
|
151
147
|
return st
|
|
152
148
|
|
|
153
149
|
class Manager(SeededScope.Manager, lang.Final):
|
|
154
|
-
def __init__(self, ss: SeededScope, i:
|
|
150
|
+
def __init__(self, ss: SeededScope, i: AsyncInjector) -> None:
|
|
155
151
|
super().__init__()
|
|
156
152
|
|
|
157
153
|
self._ss = check.isinstance(ss, SeededScope)
|
|
158
|
-
self._ii = check.isinstance(i,
|
|
154
|
+
self._ii = check.isinstance(i, _injector.AsyncInjectorImpl)
|
|
159
155
|
self._ssi = check.isinstance(self._ii.get_scope_impl(self._ss), SeededScopeImpl)
|
|
160
156
|
|
|
161
|
-
@contextlib.
|
|
162
|
-
def __call__(self, seeds: ta.Mapping[Key, ta.Any]) -> ta.
|
|
157
|
+
@contextlib.asynccontextmanager
|
|
158
|
+
async def __call__(self, seeds: ta.Mapping[Key, ta.Any]) -> ta.AsyncGenerator[None]:
|
|
163
159
|
try:
|
|
164
160
|
if self._ssi._st is not None: # noqa
|
|
165
161
|
raise ScopeAlreadyOpenError(self._ss)
|
|
166
162
|
self._ssi._st = SeededScopeImpl.State(dict(seeds)) # noqa
|
|
167
|
-
self._ii._instantiate_eagers(self._ss) # noqa
|
|
163
|
+
await self._ii._instantiate_eagers(self._ss) # noqa
|
|
168
164
|
yield
|
|
169
165
|
finally:
|
|
170
166
|
if self._ssi._st is None: # noqa
|
|
@@ -180,13 +176,13 @@ class SeededScopeImpl(ScopeImpl):
|
|
|
180
176
|
),
|
|
181
177
|
)
|
|
182
178
|
|
|
183
|
-
def provide(self, binding: BindingImpl, injector:
|
|
179
|
+
async def provide(self, binding: BindingImpl, injector: AsyncInjector) -> ta.Any:
|
|
184
180
|
st = self.must_state()
|
|
185
181
|
try:
|
|
186
182
|
return st.prvs[binding]
|
|
187
183
|
except KeyError:
|
|
188
184
|
pass
|
|
189
|
-
v = binding.provider.provide(injector)
|
|
185
|
+
v = await binding.provider.provide(injector)
|
|
190
186
|
st.prvs[binding] = v
|
|
191
187
|
return v
|
|
192
188
|
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import typing as ta
|
|
2
|
+
|
|
3
|
+
from ... import lang
|
|
4
|
+
from ..elements import CollectedElements
|
|
5
|
+
from ..injector import AsyncInjector
|
|
6
|
+
from ..inspect import KwargsTarget
|
|
7
|
+
from ..keys import Key
|
|
8
|
+
from ..sync import Injector
|
|
9
|
+
from .injector import AsyncInjectorImpl
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
##
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class InjectorImpl(Injector, lang.Final):
|
|
16
|
+
_ai: AsyncInjector
|
|
17
|
+
|
|
18
|
+
def try_provide(self, key: ta.Any) -> lang.Maybe[ta.Any]:
|
|
19
|
+
return lang.sync_await(self._ai.try_provide(key))
|
|
20
|
+
|
|
21
|
+
def provide(self, key: ta.Any) -> ta.Any:
|
|
22
|
+
return lang.sync_await(self._ai.provide(key))
|
|
23
|
+
|
|
24
|
+
def provide_kwargs(self, kt: KwargsTarget) -> ta.Mapping[str, ta.Any]:
|
|
25
|
+
return lang.sync_await(self._ai.provide_kwargs(kt))
|
|
26
|
+
|
|
27
|
+
def inject(self, obj: ta.Any) -> ta.Any:
|
|
28
|
+
return lang.sync_await(self._ai.inject(obj))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def create_injector(ce: CollectedElements) -> Injector:
|
|
32
|
+
si = InjectorImpl()
|
|
33
|
+
ai = AsyncInjectorImpl(
|
|
34
|
+
ce,
|
|
35
|
+
internal_consts={
|
|
36
|
+
Key(Injector): si,
|
|
37
|
+
},
|
|
38
|
+
)
|
|
39
|
+
si._ai = ai # noqa
|
|
40
|
+
lang.sync_await(ai._init()) # noqa
|
|
41
|
+
return si
|
omlish/inject/injector.py
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import abc
|
|
2
2
|
import typing as ta
|
|
3
3
|
|
|
4
|
+
from .. import check
|
|
4
5
|
from .. import lang
|
|
6
|
+
from .elements import CollectedElements
|
|
5
7
|
from .elements import Elemental
|
|
6
8
|
from .elements import as_elements
|
|
9
|
+
from .elements import collect_elements
|
|
7
10
|
from .inspect import KwargsTarget
|
|
8
11
|
from .keys import Key
|
|
9
12
|
|
|
@@ -20,29 +23,55 @@ T = ta.TypeVar('T')
|
|
|
20
23
|
##
|
|
21
24
|
|
|
22
25
|
|
|
23
|
-
class
|
|
26
|
+
class AsyncInjector(lang.Abstract):
|
|
24
27
|
@abc.abstractmethod
|
|
25
|
-
def try_provide(self, key: ta.Any) -> lang.Maybe[ta.Any]:
|
|
28
|
+
def try_provide(self, key: ta.Any) -> ta.Awaitable[lang.Maybe[ta.Any]]:
|
|
26
29
|
raise NotImplementedError
|
|
27
30
|
|
|
28
31
|
@abc.abstractmethod
|
|
29
|
-
def provide(self, key: ta.Any) -> ta.Any:
|
|
32
|
+
def provide(self, key: ta.Any) -> ta.Awaitable[ta.Any]:
|
|
30
33
|
raise NotImplementedError
|
|
31
34
|
|
|
32
35
|
@abc.abstractmethod
|
|
33
|
-
def provide_kwargs(self, kt: KwargsTarget) -> ta.Mapping[str, ta.Any]:
|
|
36
|
+
def provide_kwargs(self, kt: KwargsTarget) -> ta.Awaitable[ta.Mapping[str, ta.Any]]:
|
|
34
37
|
raise NotImplementedError
|
|
35
38
|
|
|
36
39
|
@abc.abstractmethod
|
|
37
|
-
def inject(self, obj: ta.Any) -> ta.Any:
|
|
40
|
+
def inject(self, obj: ta.Any) -> ta.Awaitable[ta.Any]:
|
|
38
41
|
raise NotImplementedError
|
|
39
42
|
|
|
40
43
|
def __getitem__(
|
|
41
44
|
self,
|
|
42
45
|
target: Key[T] | type[T],
|
|
43
|
-
) -> T:
|
|
46
|
+
) -> ta.Awaitable[T]:
|
|
44
47
|
return self.provide(target)
|
|
45
48
|
|
|
46
49
|
|
|
47
|
-
|
|
48
|
-
|
|
50
|
+
##
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@ta.final
|
|
54
|
+
class _InjectorCreator(ta.Generic[T]):
|
|
55
|
+
def __init__(self, fac: ta.Callable[[CollectedElements], T]) -> None:
|
|
56
|
+
self._fac = fac
|
|
57
|
+
|
|
58
|
+
@ta.overload
|
|
59
|
+
def __call__(self, es: CollectedElements, /) -> T: ...
|
|
60
|
+
|
|
61
|
+
@ta.overload
|
|
62
|
+
def __call__(self, *es: Elemental) -> T: ...
|
|
63
|
+
|
|
64
|
+
def __call__(self, arg0, *argv):
|
|
65
|
+
ce: CollectedElements
|
|
66
|
+
if isinstance(arg0, CollectedElements):
|
|
67
|
+
check.arg(not argv)
|
|
68
|
+
ce = arg0
|
|
69
|
+
else:
|
|
70
|
+
ce = collect_elements(as_elements(arg0, *argv))
|
|
71
|
+
return self._fac(ce)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
##
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
create_async_injector = _InjectorCreator[ta.Awaitable[AsyncInjector]](lambda ce: _injector.create_async_injector(ce))
|
omlish/inject/inspect.py
CHANGED
|
@@ -2,6 +2,7 @@ import typing as ta
|
|
|
2
2
|
|
|
3
3
|
from .. import lang
|
|
4
4
|
from .keys import Key
|
|
5
|
+
from .keys import as_key
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
if ta.TYPE_CHECKING:
|
|
@@ -21,11 +22,45 @@ class Kwarg(ta.NamedTuple):
|
|
|
21
22
|
key: Key
|
|
22
23
|
has_default: bool
|
|
23
24
|
|
|
25
|
+
@classmethod
|
|
26
|
+
def of(
|
|
27
|
+
cls,
|
|
28
|
+
name: str,
|
|
29
|
+
key: Key,
|
|
30
|
+
*,
|
|
31
|
+
has_default: bool = False,
|
|
32
|
+
) -> 'Kwarg':
|
|
33
|
+
return cls(
|
|
34
|
+
name,
|
|
35
|
+
key,
|
|
36
|
+
has_default,
|
|
37
|
+
)
|
|
38
|
+
|
|
24
39
|
|
|
25
40
|
class KwargsTarget(ta.NamedTuple):
|
|
26
41
|
obj: ta.Any
|
|
27
42
|
kwargs: ta.Sequence[Kwarg]
|
|
28
43
|
|
|
44
|
+
@classmethod
|
|
45
|
+
def of(
|
|
46
|
+
cls,
|
|
47
|
+
obj: ta.Any,
|
|
48
|
+
*kws: Kwarg,
|
|
49
|
+
**kwargs: tuple[Key, bool] | Key | ta.Any,
|
|
50
|
+
) -> 'KwargsTarget':
|
|
51
|
+
kw_kwargs: list[Kwarg] = []
|
|
52
|
+
for n, v in kwargs.items():
|
|
53
|
+
if isinstance(v, tuple):
|
|
54
|
+
kw_k, kw_hd = v
|
|
55
|
+
kw_kwargs.append(Kwarg.of(n, kw_k, has_default=kw_hd))
|
|
56
|
+
else:
|
|
57
|
+
kw_kwargs.append(Kwarg.of(n, as_key(v)))
|
|
58
|
+
|
|
59
|
+
return cls(
|
|
60
|
+
obj,
|
|
61
|
+
[*kws, *kw_kwargs],
|
|
62
|
+
)
|
|
63
|
+
|
|
29
64
|
|
|
30
65
|
def tag(obj: T, **kwargs: ta.Any) -> T:
|
|
31
66
|
return _inspect.tag(obj, **kwargs)
|
omlish/inject/listeners.py
CHANGED
|
@@ -4,7 +4,7 @@ from .. import dataclasses as dc
|
|
|
4
4
|
from .. import lang
|
|
5
5
|
from .bindings import Binding
|
|
6
6
|
from .elements import Element
|
|
7
|
-
from .injector import
|
|
7
|
+
from .injector import AsyncInjector
|
|
8
8
|
from .keys import Key
|
|
9
9
|
|
|
10
10
|
|
|
@@ -12,11 +12,11 @@ from .keys import Key
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
ProvisionListener: ta.TypeAlias = ta.Callable[[
|
|
15
|
-
|
|
15
|
+
AsyncInjector,
|
|
16
16
|
Key,
|
|
17
17
|
Binding | None,
|
|
18
|
-
ta.Callable[[], ta.Any],
|
|
19
|
-
], ta.
|
|
18
|
+
ta.Callable[[], ta.Awaitable[ta.Any]],
|
|
19
|
+
], ta.Awaitable[ta.Any]]
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
@dc.dataclass(frozen=True)
|
omlish/inject/managed.py
CHANGED
|
@@ -9,14 +9,16 @@ from .. import lang
|
|
|
9
9
|
from .binder import bind
|
|
10
10
|
from .elements import Elemental
|
|
11
11
|
from .impl.inspect import build_kwargs_target
|
|
12
|
-
from .injector import Injector
|
|
13
|
-
from .injector import create_injector
|
|
14
12
|
|
|
15
13
|
|
|
16
14
|
if ta.TYPE_CHECKING:
|
|
17
|
-
from
|
|
15
|
+
from . import injector as _injector
|
|
16
|
+
from . import maysync as _maysync
|
|
17
|
+
from . import sync as _sync
|
|
18
18
|
else:
|
|
19
|
-
|
|
19
|
+
_injector = lang.proxy_import('.injector', __package__)
|
|
20
|
+
_maysync = lang.proxy_import('.maysync', __package__)
|
|
21
|
+
_sync = lang.proxy_import('.sync', __package__)
|
|
20
22
|
|
|
21
23
|
|
|
22
24
|
T = ta.TypeVar('T')
|
|
@@ -25,9 +27,43 @@ T = ta.TypeVar('T')
|
|
|
25
27
|
##
|
|
26
28
|
|
|
27
29
|
|
|
30
|
+
@contextlib.asynccontextmanager
|
|
31
|
+
async def create_async_managed_injector(*args: Elemental) -> ta.AsyncGenerator['_injector.AsyncInjector']:
|
|
32
|
+
ai = await _injector.create_async_injector(
|
|
33
|
+
bind(contextlib.AsyncExitStack, singleton=True, eager=True),
|
|
34
|
+
*args,
|
|
35
|
+
)
|
|
36
|
+
async with (await ai[contextlib.AsyncExitStack]):
|
|
37
|
+
yield ai
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def make_async_managed_provider(
|
|
41
|
+
fac: ta.Callable[..., T],
|
|
42
|
+
*fns: ta.Callable[[T], ta.AsyncContextManager[T]],
|
|
43
|
+
) -> ta.Callable[..., ta.Awaitable[T]]:
|
|
44
|
+
kt = build_kwargs_target(fac)
|
|
45
|
+
|
|
46
|
+
async def _provide(
|
|
47
|
+
ai: _injector.AsyncInjector,
|
|
48
|
+
aes: contextlib.AsyncExitStack,
|
|
49
|
+
):
|
|
50
|
+
obj = await ai.inject(kt)
|
|
51
|
+
if not fns:
|
|
52
|
+
obj = await aes.enter_async_context(obj)
|
|
53
|
+
else:
|
|
54
|
+
for fn in fns:
|
|
55
|
+
await aes.enter_async_context(fn(obj))
|
|
56
|
+
return obj
|
|
57
|
+
|
|
58
|
+
return _provide
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
##
|
|
62
|
+
|
|
63
|
+
|
|
28
64
|
@contextlib.contextmanager
|
|
29
|
-
def create_managed_injector(*args: Elemental) -> ta.Generator[Injector]:
|
|
30
|
-
i = create_injector(
|
|
65
|
+
def create_managed_injector(*args: Elemental) -> ta.Generator['_sync.Injector']:
|
|
66
|
+
i = _sync.create_injector(
|
|
31
67
|
bind(contextlib.ExitStack, singleton=True, eager=True),
|
|
32
68
|
*args,
|
|
33
69
|
)
|
|
@@ -42,7 +78,7 @@ def make_managed_provider(
|
|
|
42
78
|
kt = build_kwargs_target(fac)
|
|
43
79
|
|
|
44
80
|
def _provide(
|
|
45
|
-
i: Injector,
|
|
81
|
+
i: _sync.Injector,
|
|
46
82
|
es: contextlib.ExitStack,
|
|
47
83
|
):
|
|
48
84
|
obj = i.inject(kt)
|
|
@@ -59,32 +95,32 @@ def make_managed_provider(
|
|
|
59
95
|
##
|
|
60
96
|
|
|
61
97
|
|
|
62
|
-
@contextlib.
|
|
63
|
-
|
|
64
|
-
i =
|
|
65
|
-
bind(contextlib.
|
|
98
|
+
@contextlib.contextmanager
|
|
99
|
+
def create_maysync_managed_injector(*args: Elemental) -> ta.Generator['_maysync.MaysyncInjector']:
|
|
100
|
+
i = _maysync.create_maysync_injector(
|
|
101
|
+
bind(contextlib.ExitStack, singleton=True, eager=True),
|
|
66
102
|
*args,
|
|
67
103
|
)
|
|
68
|
-
|
|
104
|
+
with i[contextlib.ExitStack]:
|
|
69
105
|
yield i
|
|
70
106
|
|
|
71
107
|
|
|
72
|
-
def
|
|
108
|
+
def make_maysync_managed_provider(
|
|
73
109
|
fac: ta.Callable[..., T],
|
|
74
|
-
*fns: ta.Callable[[T], ta.
|
|
110
|
+
*fns: ta.Callable[[T], ta.ContextManager[T]],
|
|
75
111
|
) -> ta.Callable[..., T]:
|
|
76
112
|
kt = build_kwargs_target(fac)
|
|
77
113
|
|
|
78
114
|
def _provide(
|
|
79
|
-
i:
|
|
80
|
-
|
|
115
|
+
i: _maysync.MaysyncInjector,
|
|
116
|
+
es: contextlib.ExitStack,
|
|
81
117
|
):
|
|
82
118
|
obj = i.inject(kt)
|
|
83
119
|
if not fns:
|
|
84
|
-
obj =
|
|
120
|
+
obj = es.enter_context(obj)
|
|
85
121
|
else:
|
|
86
122
|
for fn in fns:
|
|
87
|
-
|
|
123
|
+
es.enter_context(fn(obj))
|
|
88
124
|
return obj
|
|
89
125
|
|
|
90
126
|
return _provide
|
omlish/inject/maysync.py
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import typing as ta
|
|
2
|
+
|
|
3
|
+
from .. import lang
|
|
4
|
+
from .injector import _InjectorCreator
|
|
5
|
+
from .sync import Injector
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
if ta.TYPE_CHECKING:
|
|
9
|
+
from .impl import maysync as _maysync
|
|
10
|
+
else:
|
|
11
|
+
_maysync = lang.proxy_import('.impl.maysync', __package__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
T = ta.TypeVar('T')
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class MaysyncInjector(Injector, lang.Abstract):
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
##
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
create_maysync_injector = _InjectorCreator[MaysyncInjector](lambda ce: _maysync.create_maysync_injector(ce))
|
omlish/inject/multis.py
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"""
|
|
2
2
|
TODO:
|
|
3
|
+
- DynamicSetBinding / DynamicMapBinding ? provider of set[T] / map[K, V] ?
|
|
4
|
+
- doable not guicey - too much dynamism
|
|
3
5
|
- scopes
|
|
4
6
|
"""
|
|
5
7
|
import collections.abc
|
|
@@ -94,6 +96,9 @@ class SetBinder(ElementGenerator, ta.Generic[T]):
|
|
|
94
96
|
yield from self._sbs
|
|
95
97
|
|
|
96
98
|
|
|
99
|
+
set_binder = SetBinder
|
|
100
|
+
|
|
101
|
+
|
|
97
102
|
#
|
|
98
103
|
|
|
99
104
|
|
|
@@ -123,3 +128,6 @@ class MapBinder(ElementGenerator, ta.Generic[K, V]):
|
|
|
123
128
|
def __iter__(self) -> ta.Iterator[Element]:
|
|
124
129
|
yield self._map_provider_binding
|
|
125
130
|
yield from self._mbs
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
map_binder = MapBinder
|
omlish/inject/overrides.py
CHANGED
|
@@ -14,9 +14,9 @@ from .elements import as_elements
|
|
|
14
14
|
@dc.dataclass(frozen=True)
|
|
15
15
|
@dc.extra_class_params(cache_hash=True)
|
|
16
16
|
class Overrides(Element, lang.Final):
|
|
17
|
-
ovr: Elements = dc.xfield(coerce=check.of_isinstance(Elements))
|
|
18
17
|
src: Elements = dc.xfield(coerce=check.of_isinstance(Elements))
|
|
18
|
+
ovr: Elements = dc.xfield(coerce=check.of_isinstance(Elements))
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
def override(
|
|
22
|
-
return Overrides(as_elements(
|
|
21
|
+
def override(src: ta.Any, *ovr: ta.Any) -> Element:
|
|
22
|
+
return Overrides(as_elements(src), as_elements(*ovr))
|
omlish/inject/privates.py
CHANGED
omlish/inject/providers.py
CHANGED
|
@@ -3,6 +3,7 @@ import typing as ta
|
|
|
3
3
|
from .. import check
|
|
4
4
|
from .. import dataclasses as dc
|
|
5
5
|
from .. import lang
|
|
6
|
+
from .inspect import KwargsTarget
|
|
6
7
|
from .keys import Key
|
|
7
8
|
|
|
8
9
|
|
|
@@ -17,10 +18,16 @@ class Provider(lang.Abstract):
|
|
|
17
18
|
pass
|
|
18
19
|
|
|
19
20
|
|
|
21
|
+
@dc.dataclass(frozen=True)
|
|
22
|
+
@dc.extra_class_params(cache_hash=True)
|
|
23
|
+
class AsyncFnProvider(Provider):
|
|
24
|
+
fn: ta.Any = dc.xfield(validate=lambda v: callable(v) or isinstance(v, KwargsTarget))
|
|
25
|
+
|
|
26
|
+
|
|
20
27
|
@dc.dataclass(frozen=True)
|
|
21
28
|
@dc.extra_class_params(cache_hash=True)
|
|
22
29
|
class FnProvider(Provider):
|
|
23
|
-
fn: ta.Any = dc.xfield(validate=callable)
|
|
30
|
+
fn: ta.Any = dc.xfield(validate=lambda v: callable(v) or isinstance(v, KwargsTarget))
|
|
24
31
|
|
|
25
32
|
|
|
26
33
|
@dc.dataclass(frozen=True)
|
omlish/inject/scopes.py
CHANGED
|
@@ -5,9 +5,9 @@ import typing as ta
|
|
|
5
5
|
from .. import check
|
|
6
6
|
from .. import dataclasses as dc
|
|
7
7
|
from .. import lang
|
|
8
|
-
from .. import reflect as rfl
|
|
9
8
|
from .bindings import Binding
|
|
10
9
|
from .elements import Element
|
|
10
|
+
from .injector import AsyncInjector
|
|
11
11
|
from .keys import Key
|
|
12
12
|
from .keys import as_key
|
|
13
13
|
from .providers import Provider
|
|
@@ -15,9 +15,13 @@ from .types import Scope
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
if ta.TYPE_CHECKING:
|
|
18
|
-
from . import injector as
|
|
18
|
+
from . import injector as _injector
|
|
19
|
+
from . import maysync as _maysync
|
|
20
|
+
from . import sync as _sync
|
|
19
21
|
else:
|
|
20
|
-
|
|
22
|
+
_injector = lang.proxy_import('.injector', __package__)
|
|
23
|
+
_maysync = lang.proxy_import('.maysync', __package__)
|
|
24
|
+
_sync = lang.proxy_import('.sync', __package__)
|
|
21
25
|
|
|
22
26
|
|
|
23
27
|
##
|
|
@@ -66,7 +70,7 @@ class SeededScope(Scope, lang.Final):
|
|
|
66
70
|
|
|
67
71
|
class Manager(lang.Abstract):
|
|
68
72
|
@abc.abstractmethod
|
|
69
|
-
def __call__(self, seeds: ta.Mapping[Key, ta.Any]) -> ta.
|
|
73
|
+
def __call__(self, seeds: ta.Mapping[Key, ta.Any]) -> ta.AsyncContextManager[None]:
|
|
70
74
|
raise NotImplementedError
|
|
71
75
|
|
|
72
76
|
|
|
@@ -76,20 +80,44 @@ class ScopeSeededProvider(Provider):
|
|
|
76
80
|
ss: SeededScope = dc.xfield(coerce=check.of_isinstance(SeededScope))
|
|
77
81
|
key: Key = dc.xfield(coerce=check.of_isinstance(Key))
|
|
78
82
|
|
|
79
|
-
def provided_ty(self) -> rfl.Type | None:
|
|
80
|
-
return self.key.ty
|
|
81
|
-
|
|
82
83
|
|
|
83
84
|
def bind_scope_seed(k: ta.Any, ss: SeededScope) -> Element:
|
|
84
85
|
k = as_key(k)
|
|
85
86
|
return Binding(k, ScopeSeededProvider(ss, k))
|
|
86
87
|
|
|
87
88
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
##
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
@contextlib.asynccontextmanager
|
|
93
|
+
async def async_enter_seeded_scope(
|
|
94
|
+
i: '_injector.AsyncInjector',
|
|
91
95
|
ss: SeededScope,
|
|
92
96
|
keys: ta.Mapping[Key, ta.Any],
|
|
93
|
-
) -> ta.
|
|
94
|
-
with i.provide(Key(SeededScope.Manager, tag=ss))(keys):
|
|
97
|
+
) -> ta.AsyncGenerator[None]:
|
|
98
|
+
async with (await i.provide(Key(SeededScope.Manager, tag=ss)))(keys):
|
|
95
99
|
yield
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def enter_seeded_scope(
|
|
103
|
+
i: '_sync.Injector',
|
|
104
|
+
ss: SeededScope,
|
|
105
|
+
keys: ta.Mapping[Key, ta.Any],
|
|
106
|
+
) -> ta.ContextManager[None]:
|
|
107
|
+
return lang.run_maysync_context_manager(async_enter_seeded_scope(
|
|
108
|
+
i[AsyncInjector],
|
|
109
|
+
ss,
|
|
110
|
+
keys,
|
|
111
|
+
))
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def maysync_enter_seeded_scope(
|
|
115
|
+
i: '_maysync.MaysyncInjector',
|
|
116
|
+
ss: SeededScope,
|
|
117
|
+
keys: ta.Mapping[Key, ta.Any],
|
|
118
|
+
) -> ta.ContextManager[None]:
|
|
119
|
+
return lang.sync_async_with(async_enter_seeded_scope(
|
|
120
|
+
i[AsyncInjector],
|
|
121
|
+
ss,
|
|
122
|
+
keys,
|
|
123
|
+
))
|