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/injector.py
CHANGED
|
@@ -2,36 +2,35 @@
|
|
|
2
2
|
TODO:
|
|
3
3
|
- ** can currently bind in a child/private scope shadowing an external parent binding **
|
|
4
4
|
- better source tracking
|
|
5
|
-
- cache/export ElementCollections lol
|
|
6
5
|
- scope bindings, auto in root
|
|
7
6
|
- injector-internal / blacklisted bindings (Injector itself, default scopes) without rebuilding ElementCollection
|
|
8
7
|
- config - proxies, impl select, etc
|
|
9
8
|
- config is probably shared with ElementCollection... but not 'bound', must be shared everywhere
|
|
10
9
|
- InjectorRoot object?
|
|
11
10
|
- ** eagers in any scope, on scope init/open
|
|
12
|
-
- injection listeners
|
|
13
11
|
- unions - raise on ambiguous - usecase: sql.AsyncEngineLike
|
|
14
12
|
- multiple live request scopes on single injector - use private injectors?
|
|
13
|
+
- more listeners - UnboundKeyListener
|
|
14
|
+
- lazy parent listener chain cache thing
|
|
15
15
|
"""
|
|
16
16
|
import contextlib
|
|
17
17
|
import functools
|
|
18
18
|
import itertools
|
|
19
|
-
import logging
|
|
20
19
|
import typing as ta
|
|
21
20
|
import weakref
|
|
22
21
|
|
|
23
22
|
from ... import check
|
|
24
23
|
from ... import lang
|
|
25
|
-
from
|
|
24
|
+
from ...logs import all as logs
|
|
25
|
+
from ..elements import CollectedElements
|
|
26
26
|
from ..errors import CyclicDependencyError
|
|
27
27
|
from ..errors import UnboundKeyError
|
|
28
|
-
from ..injector import
|
|
28
|
+
from ..injector import AsyncInjector
|
|
29
29
|
from ..inspect import KwargsTarget
|
|
30
30
|
from ..keys import Key
|
|
31
31
|
from ..keys import as_key
|
|
32
32
|
from ..listeners import ProvisionListener
|
|
33
33
|
from ..listeners import ProvisionListenerBinding
|
|
34
|
-
from ..scopes import ScopeBinding
|
|
35
34
|
from ..scopes import Singleton
|
|
36
35
|
from ..scopes import ThreadScope
|
|
37
36
|
from ..types import Scope
|
|
@@ -42,7 +41,7 @@ from .scopes import ScopeImpl
|
|
|
42
41
|
from .scopes import make_scope_impl
|
|
43
42
|
|
|
44
43
|
|
|
45
|
-
log =
|
|
44
|
+
log = logs.get_module_logger(globals())
|
|
46
45
|
|
|
47
46
|
|
|
48
47
|
##
|
|
@@ -55,61 +54,84 @@ DEFAULT_SCOPES: list[Scope] = [
|
|
|
55
54
|
]
|
|
56
55
|
|
|
57
56
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
@ta.final
|
|
58
|
+
class AsyncInjectorImpl(AsyncInjector, lang.Final):
|
|
59
|
+
def __init__(
|
|
60
|
+
self,
|
|
61
|
+
ec: CollectedElements,
|
|
62
|
+
p: ta.Optional['AsyncInjectorImpl'] = None,
|
|
63
|
+
*,
|
|
64
|
+
internal_consts: dict[Key, ta.Any] | None = None,
|
|
65
|
+
) -> None:
|
|
66
|
+
self._ec = (ec := check.isinstance(ec, ElementCollection))
|
|
67
|
+
self._p: AsyncInjectorImpl | None = check.isinstance(p, (AsyncInjectorImpl, None))
|
|
64
68
|
|
|
65
69
|
self._internal_consts: dict[Key, ta.Any] = {
|
|
66
|
-
Key(
|
|
70
|
+
Key(AsyncInjector): self,
|
|
71
|
+
**(internal_consts or {}),
|
|
67
72
|
}
|
|
68
73
|
|
|
69
74
|
self._bim = ec.binding_impl_map()
|
|
75
|
+
|
|
70
76
|
self._ekbs = ec.eager_keys_by_scope()
|
|
77
|
+
|
|
71
78
|
self._pls: tuple[ProvisionListener, ...] = tuple(
|
|
72
79
|
b.listener # type: ignore[attr-defined]
|
|
73
80
|
for b in itertools.chain(
|
|
74
81
|
ec.elements_of_type(ProvisionListenerBinding),
|
|
75
|
-
|
|
82
|
+
p._pls if p is not None else (), # noqa
|
|
76
83
|
)
|
|
77
84
|
)
|
|
78
85
|
|
|
79
|
-
self.
|
|
80
|
-
self._root: InjectorImpl = p._root if p is not None else self # noqa
|
|
81
|
-
|
|
82
|
-
self.__cur_req: InjectorImpl._Request | None = None
|
|
86
|
+
self._root: AsyncInjectorImpl = p._root if p is not None else self # noqa
|
|
83
87
|
|
|
84
|
-
ss = [
|
|
85
|
-
*DEFAULT_SCOPES,
|
|
86
|
-
*[sb.scope for sb in ec.elements_of_type(ScopeBinding)],
|
|
87
|
-
]
|
|
88
88
|
self._scopes: dict[Scope, ScopeImpl] = {
|
|
89
|
-
s: make_scope_impl(s)
|
|
89
|
+
s: make_scope_impl(s)
|
|
90
|
+
for s in itertools.chain(
|
|
91
|
+
DEFAULT_SCOPES,
|
|
92
|
+
ec.scope_binding_scopes(),
|
|
93
|
+
)
|
|
90
94
|
}
|
|
91
95
|
|
|
92
|
-
|
|
93
|
-
|
|
96
|
+
_cs: weakref.WeakSet['AsyncInjectorImpl'] | None = None # noqa
|
|
97
|
+
|
|
98
|
+
__cur_req: ta.Optional['AsyncInjectorImpl._Request'] = None
|
|
99
|
+
|
|
100
|
+
#
|
|
101
|
+
|
|
102
|
+
_has_run_init: bool = False
|
|
103
|
+
|
|
104
|
+
async def _init(self) -> bool:
|
|
105
|
+
if self._has_run_init:
|
|
106
|
+
return False
|
|
107
|
+
|
|
108
|
+
self._has_run_init = True
|
|
109
|
+
|
|
110
|
+
await self._instantiate_eagers(Unscoped())
|
|
111
|
+
await self._instantiate_eagers(Singleton())
|
|
94
112
|
|
|
95
|
-
|
|
113
|
+
return True
|
|
96
114
|
|
|
97
|
-
|
|
115
|
+
#
|
|
116
|
+
|
|
117
|
+
_root: 'AsyncInjectorImpl'
|
|
118
|
+
|
|
119
|
+
async def _instantiate_eagers(self, sc: Scope) -> None:
|
|
98
120
|
for k in self._ekbs.get(sc, ()):
|
|
99
|
-
self.provide(k)
|
|
121
|
+
await self.provide(k)
|
|
100
122
|
|
|
101
123
|
def get_scope_impl(self, sc: Scope) -> ScopeImpl:
|
|
102
124
|
return self._scopes[sc]
|
|
103
125
|
|
|
104
|
-
def create_child(self, ec: ElementCollection) ->
|
|
105
|
-
c =
|
|
126
|
+
def create_child(self, ec: ElementCollection) -> AsyncInjector:
|
|
127
|
+
c = AsyncInjectorImpl(ec, self)
|
|
106
128
|
if self._cs is None:
|
|
107
129
|
self._cs = weakref.WeakSet()
|
|
108
130
|
self._cs.add(c)
|
|
109
131
|
return c
|
|
110
132
|
|
|
111
133
|
class _Request:
|
|
112
|
-
def __init__(self, injector: '
|
|
134
|
+
def __init__(self, injector: 'AsyncInjectorImpl') -> None:
|
|
113
135
|
super().__init__()
|
|
114
136
|
|
|
115
137
|
self._injector = injector
|
|
@@ -162,10 +184,13 @@ class InjectorImpl(Injector, lang.Final):
|
|
|
162
184
|
finally:
|
|
163
185
|
self.__cur_req = None
|
|
164
186
|
|
|
165
|
-
def _try_provide(self, key: ta.Any, *, source: ta.Any = None) -> lang.Maybe[ta.Any]:
|
|
187
|
+
async def _try_provide(self, key: ta.Any, *, source: ta.Any = None) -> lang.Maybe[ta.Any]:
|
|
188
|
+
if not self._has_run_init:
|
|
189
|
+
await self._init()
|
|
190
|
+
|
|
166
191
|
key = as_key(key)
|
|
167
192
|
|
|
168
|
-
cr:
|
|
193
|
+
cr: AsyncInjectorImpl._Request
|
|
169
194
|
with self._current_request() as cr:
|
|
170
195
|
with cr.push_source(source):
|
|
171
196
|
if (rv := cr.handle_key(key)).present:
|
|
@@ -182,55 +207,57 @@ class InjectorImpl(Injector, lang.Final):
|
|
|
182
207
|
fn = lambda: sc.provide(bi, self) # noqa
|
|
183
208
|
for pl in self._pls:
|
|
184
209
|
fn = functools.partial(pl, self, key, bi.binding, fn)
|
|
185
|
-
v = fn()
|
|
210
|
+
v = await fn()
|
|
186
211
|
|
|
187
212
|
return cr.handle_provision(key, lang.just(v))
|
|
188
213
|
|
|
189
214
|
if self._p is not None:
|
|
190
|
-
pv = self._p._try_provide(key, source=source) # noqa
|
|
215
|
+
pv = await self._p._try_provide(key, source=source) # noqa
|
|
191
216
|
if pv.present:
|
|
192
217
|
return cr.handle_provision(key, pv)
|
|
193
218
|
|
|
194
219
|
return cr.handle_provision(key, lang.empty())
|
|
195
220
|
|
|
196
|
-
def _provide(self, key: ta.Any, *, source: ta.Any = None) -> ta.Any:
|
|
197
|
-
v = self._try_provide(key, source=source)
|
|
221
|
+
async def _provide(self, key: ta.Any, *, source: ta.Any = None) -> ta.Any:
|
|
222
|
+
v = await self._try_provide(key, source=source)
|
|
198
223
|
if v.present:
|
|
199
224
|
return v.must()
|
|
200
225
|
raise UnboundKeyError(key)
|
|
201
226
|
|
|
202
227
|
#
|
|
203
228
|
|
|
204
|
-
def try_provide(self, key: ta.Any) -> lang.Maybe[ta.Any]:
|
|
205
|
-
return self.
|
|
229
|
+
def try_provide(self, key: ta.Any) -> ta.Awaitable[lang.Maybe[ta.Any]]:
|
|
230
|
+
return self._try_provide(key)
|
|
206
231
|
|
|
207
|
-
def provide(self, key: ta.Any) -> ta.Any:
|
|
208
|
-
v = self._try_provide(key)
|
|
232
|
+
async def provide(self, key: ta.Any) -> ta.Any:
|
|
233
|
+
v = await self._try_provide(key)
|
|
209
234
|
if v.present:
|
|
210
235
|
return v.must()
|
|
211
236
|
raise UnboundKeyError(key)
|
|
212
237
|
|
|
213
|
-
def provide_kwargs(self, kt: KwargsTarget) -> ta.Mapping[str, ta.Any]:
|
|
238
|
+
async def provide_kwargs(self, kt: KwargsTarget) -> ta.Mapping[str, ta.Any]:
|
|
214
239
|
ret: dict[str, ta.Any] = {}
|
|
215
240
|
for kw in kt.kwargs:
|
|
216
241
|
if kw.has_default:
|
|
217
|
-
if not (mv := self._try_provide(kw.key, source=kt)).present:
|
|
242
|
+
if not (mv := await self._try_provide(kw.key, source=kt)).present:
|
|
218
243
|
continue
|
|
219
244
|
v = mv.must()
|
|
220
245
|
else:
|
|
221
|
-
v = self._provide(kw.key, source=kt)
|
|
246
|
+
v = await self._provide(kw.key, source=kt)
|
|
222
247
|
ret[kw.name] = v
|
|
223
248
|
return ret
|
|
224
249
|
|
|
225
|
-
def inject(self, obj: ta.Any) -> ta.Any:
|
|
250
|
+
async def inject(self, obj: ta.Any) -> ta.Any:
|
|
226
251
|
if isinstance(obj, KwargsTarget):
|
|
227
252
|
obj, kt = obj.obj, obj
|
|
228
253
|
else:
|
|
229
254
|
kt = build_kwargs_target(obj)
|
|
230
|
-
kws = self.provide_kwargs(kt)
|
|
255
|
+
kws = await self.provide_kwargs(kt)
|
|
231
256
|
# FIXME: still 'injecting' (as in has a req) if ctor needs and uses Injector
|
|
232
257
|
return obj(**kws)
|
|
233
258
|
|
|
234
259
|
|
|
235
|
-
def
|
|
236
|
-
|
|
260
|
+
async def create_async_injector(ce: CollectedElements) -> AsyncInjector:
|
|
261
|
+
i = AsyncInjectorImpl(ce)
|
|
262
|
+
await i._init() # noqa
|
|
263
|
+
return i
|
omlish/inject/impl/inspect.py
CHANGED
|
@@ -4,6 +4,7 @@ TODO:
|
|
|
4
4
|
- tag annotations? x: ta.Annotated[int, inj.Tag('foo')]
|
|
5
5
|
- tag decorator - @inj.tag(x='foo')
|
|
6
6
|
- *unpack optional here*
|
|
7
|
+
- use ...metadata
|
|
7
8
|
"""
|
|
8
9
|
import dataclasses as dc
|
|
9
10
|
import inspect
|
|
@@ -74,7 +75,11 @@ def build_kwargs_target(
|
|
|
74
75
|
skip_args: int = 0,
|
|
75
76
|
skip_kwargs: ta.Iterable[str] | None = None,
|
|
76
77
|
raw_optional: bool = False,
|
|
78
|
+
non_strict: bool = False,
|
|
77
79
|
) -> KwargsTarget:
|
|
80
|
+
if isinstance(obj, KwargsTarget):
|
|
81
|
+
return obj
|
|
82
|
+
|
|
78
83
|
sig = signature(obj)
|
|
79
84
|
tags = _TAGS.get(obj)
|
|
80
85
|
|
|
@@ -89,11 +94,15 @@ def build_kwargs_target(
|
|
|
89
94
|
continue
|
|
90
95
|
|
|
91
96
|
if p.annotation is inspect.Signature.empty:
|
|
97
|
+
if non_strict:
|
|
98
|
+
continue
|
|
92
99
|
if p.default is not inspect.Parameter.empty:
|
|
93
100
|
raise KeyError(f'{obj}, {p.name}')
|
|
94
101
|
continue
|
|
95
102
|
|
|
96
103
|
if p.kind not in (inspect.Parameter.POSITIONAL_OR_KEYWORD, inspect.Parameter.KEYWORD_ONLY):
|
|
104
|
+
if non_strict:
|
|
105
|
+
continue
|
|
97
106
|
raise TypeError(sig)
|
|
98
107
|
|
|
99
108
|
ann = p.annotation
|
|
@@ -118,7 +127,8 @@ def build_kwargs_target(
|
|
|
118
127
|
k = dc.replace(k, tag=pt)
|
|
119
128
|
|
|
120
129
|
if k in seen:
|
|
121
|
-
|
|
130
|
+
if not non_strict:
|
|
131
|
+
raise ConflictingKeyError(k)
|
|
122
132
|
seen.add(k)
|
|
123
133
|
|
|
124
134
|
kws.append(Kwarg(
|
|
@@ -0,0 +1,43 @@
|
|
|
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 ..maysync import MaysyncInjector
|
|
9
|
+
from ..sync import Injector
|
|
10
|
+
from .injector import AsyncInjectorImpl
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class MaysyncInjectorImpl(MaysyncInjector, lang.Final):
|
|
17
|
+
_ai: AsyncInjector
|
|
18
|
+
|
|
19
|
+
def try_provide(self, key: ta.Any) -> lang.Maybe[ta.Any]:
|
|
20
|
+
return lang.run_maysync(self._ai.try_provide(key))
|
|
21
|
+
|
|
22
|
+
def provide(self, key: ta.Any) -> ta.Any:
|
|
23
|
+
return lang.run_maysync(self._ai.provide(key))
|
|
24
|
+
|
|
25
|
+
def provide_kwargs(self, kt: KwargsTarget) -> ta.Mapping[str, ta.Any]:
|
|
26
|
+
return lang.run_maysync(self._ai.provide_kwargs(kt))
|
|
27
|
+
|
|
28
|
+
def inject(self, obj: ta.Any) -> ta.Any:
|
|
29
|
+
return lang.run_maysync(self._ai.inject(obj))
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def create_maysync_injector(ce: CollectedElements) -> MaysyncInjector:
|
|
33
|
+
si = MaysyncInjectorImpl()
|
|
34
|
+
ai = AsyncInjectorImpl(
|
|
35
|
+
ce,
|
|
36
|
+
internal_consts={
|
|
37
|
+
Key(MaysyncInjector): si,
|
|
38
|
+
Key(Injector): si,
|
|
39
|
+
},
|
|
40
|
+
)
|
|
41
|
+
si._ai = ai # noqa
|
|
42
|
+
lang.run_maysync(ai._init()) # noqa
|
|
43
|
+
return si
|
omlish/inject/impl/multis.py
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import typing as ta
|
|
2
2
|
|
|
3
|
+
from ... import check
|
|
3
4
|
from ... import dataclasses as dc
|
|
4
5
|
from ... import lang
|
|
5
6
|
from ..elements import Element
|
|
6
|
-
from ..injector import
|
|
7
|
+
from ..injector import AsyncInjector
|
|
7
8
|
from ..multis import MapBinding
|
|
8
9
|
from ..multis import MapProvider
|
|
9
10
|
from ..multis import SetBinding
|
|
@@ -22,14 +23,14 @@ class SetProviderImpl(ProviderImpl, lang.Final):
|
|
|
22
23
|
ps: ta.Sequence[ProviderImpl]
|
|
23
24
|
|
|
24
25
|
@property
|
|
25
|
-
def providers(self) -> ta.
|
|
26
|
+
def providers(self) -> ta.Iterator[Provider]:
|
|
26
27
|
for p in self.ps:
|
|
27
28
|
yield from p.providers
|
|
28
29
|
|
|
29
|
-
def provide(self, injector:
|
|
30
|
+
async def provide(self, injector: AsyncInjector) -> ta.Any:
|
|
30
31
|
rv = set()
|
|
31
32
|
for ep in self.ps:
|
|
32
|
-
o = ep.provide(injector)
|
|
33
|
+
o = await ep.provide(injector)
|
|
33
34
|
rv.add(o)
|
|
34
35
|
return rv
|
|
35
36
|
|
|
@@ -43,14 +44,14 @@ class MapProviderImpl(ProviderImpl, lang.Final):
|
|
|
43
44
|
es: ta.Sequence[Entry]
|
|
44
45
|
|
|
45
46
|
@property
|
|
46
|
-
def providers(self) -> ta.
|
|
47
|
+
def providers(self) -> ta.Iterator[Provider]:
|
|
47
48
|
for e in self.es:
|
|
48
49
|
yield from e.v.providers
|
|
49
50
|
|
|
50
|
-
def provide(self, injector:
|
|
51
|
+
async def provide(self, injector: AsyncInjector) -> ta.Any:
|
|
51
52
|
rv = {}
|
|
52
53
|
for e in self.es:
|
|
53
|
-
o = e.v.provide(injector)
|
|
54
|
+
o = await e.v.provide(injector)
|
|
54
55
|
rv[e.k] = o
|
|
55
56
|
return rv
|
|
56
57
|
|
|
@@ -58,6 +59,7 @@ class MapProviderImpl(ProviderImpl, lang.Final):
|
|
|
58
59
|
def make_multi_provider_impl(p: Provider, es_by_ty: ta.MutableMapping[type, list[Element]]) -> ProviderImpl:
|
|
59
60
|
if isinstance(p, SetProvider):
|
|
60
61
|
sbs: ta.Iterable[SetBinding] = es_by_ty.pop(SetBinding, ()) # type: ignore
|
|
62
|
+
check.empty(es_by_ty)
|
|
61
63
|
return SetProviderImpl([
|
|
62
64
|
LinkProviderImpl(LinkProvider(sb.dst))
|
|
63
65
|
for sb in sbs
|
|
@@ -65,6 +67,7 @@ def make_multi_provider_impl(p: Provider, es_by_ty: ta.MutableMapping[type, list
|
|
|
65
67
|
|
|
66
68
|
elif isinstance(p, MapProvider):
|
|
67
69
|
mbs: ta.Iterable[MapBinding] = es_by_ty.pop(MapBinding, ()) # type: ignore
|
|
70
|
+
check.empty(es_by_ty)
|
|
68
71
|
return MapProviderImpl([
|
|
69
72
|
MapProviderImpl.Entry(
|
|
70
73
|
mb.map_key,
|
omlish/inject/impl/privates.py
CHANGED
|
@@ -12,14 +12,14 @@ from ... import lang
|
|
|
12
12
|
from ..bindings import Binding
|
|
13
13
|
from ..eagers import Eager
|
|
14
14
|
from ..elements import Element
|
|
15
|
-
from ..injector import
|
|
15
|
+
from ..injector import AsyncInjector
|
|
16
16
|
from ..keys import Key
|
|
17
17
|
from ..privates import Expose
|
|
18
18
|
from ..privates import Private
|
|
19
19
|
from ..providers import Provider
|
|
20
20
|
from ..scopes import Singleton
|
|
21
21
|
from .elements import ElementCollection
|
|
22
|
-
from .injector import
|
|
22
|
+
from .injector import AsyncInjectorImpl
|
|
23
23
|
from .providers import InternalProvider
|
|
24
24
|
from .providers import ProviderImpl
|
|
25
25
|
|
|
@@ -47,8 +47,8 @@ class PrivateInjectorProviderImpl(ProviderImpl, lang.Final):
|
|
|
47
47
|
def providers(self) -> ta.Iterable[Provider]:
|
|
48
48
|
return ()
|
|
49
49
|
|
|
50
|
-
def provide(self, injector:
|
|
51
|
-
return check.isinstance(injector,
|
|
50
|
+
async def provide(self, injector: AsyncInjector) -> ta.Any:
|
|
51
|
+
return check.isinstance(injector, AsyncInjectorImpl).create_child(self.ec)
|
|
52
52
|
|
|
53
53
|
|
|
54
54
|
##
|
|
@@ -63,9 +63,9 @@ class ExposedPrivateProviderImpl(ProviderImpl, lang.Final):
|
|
|
63
63
|
def providers(self) -> ta.Iterable[Provider]:
|
|
64
64
|
return ()
|
|
65
65
|
|
|
66
|
-
def provide(self, injector:
|
|
67
|
-
pi = injector.provide(self.pik)
|
|
68
|
-
return pi.provide(self.k)
|
|
66
|
+
async def provide(self, injector: AsyncInjector) -> ta.Any:
|
|
67
|
+
pi = await injector.provide(self.pik)
|
|
68
|
+
return await pi.provide(self.k)
|
|
69
69
|
|
|
70
70
|
|
|
71
71
|
##
|
|
@@ -82,7 +82,7 @@ class PrivateInfo(lang.Final):
|
|
|
82
82
|
|
|
83
83
|
@cached.property
|
|
84
84
|
def pik(self) -> Key:
|
|
85
|
-
return Key(
|
|
85
|
+
return Key(AsyncInjectorImpl, tag=self.id)
|
|
86
86
|
|
|
87
87
|
@cached.function
|
|
88
88
|
def element_collection(self) -> ElementCollection:
|
omlish/inject/impl/providers.py
CHANGED
|
@@ -7,15 +7,14 @@ import typing as ta
|
|
|
7
7
|
|
|
8
8
|
from ... import dataclasses as dc
|
|
9
9
|
from ... import lang
|
|
10
|
-
from
|
|
11
|
-
from ..injector import Injector
|
|
10
|
+
from ..injector import AsyncInjector
|
|
12
11
|
from ..inspect import KwargsTarget
|
|
12
|
+
from ..providers import AsyncFnProvider
|
|
13
13
|
from ..providers import ConstProvider
|
|
14
14
|
from ..providers import CtorProvider
|
|
15
15
|
from ..providers import FnProvider
|
|
16
16
|
from ..providers import LinkProvider
|
|
17
17
|
from ..providers import Provider
|
|
18
|
-
from .inspect import build_kwargs_target
|
|
19
18
|
|
|
20
19
|
|
|
21
20
|
##
|
|
@@ -28,7 +27,7 @@ class ProviderImpl(lang.Abstract):
|
|
|
28
27
|
raise NotImplementedError
|
|
29
28
|
|
|
30
29
|
@abc.abstractmethod
|
|
31
|
-
def provide(self, injector:
|
|
30
|
+
def provide(self, injector: AsyncInjector) -> ta.Awaitable[ta.Any]:
|
|
32
31
|
raise NotImplementedError
|
|
33
32
|
|
|
34
33
|
|
|
@@ -39,8 +38,21 @@ class ProviderImpl(lang.Abstract):
|
|
|
39
38
|
class InternalProvider(Provider):
|
|
40
39
|
impl: ProviderImpl
|
|
41
40
|
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
|
|
42
|
+
##
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@dc.dataclass(frozen=True, eq=False)
|
|
46
|
+
class AsyncCallableProviderImpl(ProviderImpl, lang.Final):
|
|
47
|
+
p: AsyncFnProvider
|
|
48
|
+
kt: KwargsTarget
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def providers(self) -> ta.Iterable[Provider]:
|
|
52
|
+
return (self.p,)
|
|
53
|
+
|
|
54
|
+
async def provide(self, injector: AsyncInjector) -> ta.Any:
|
|
55
|
+
return await (await injector.inject(self.kt))
|
|
44
56
|
|
|
45
57
|
|
|
46
58
|
##
|
|
@@ -55,8 +67,8 @@ class CallableProviderImpl(ProviderImpl, lang.Final):
|
|
|
55
67
|
def providers(self) -> ta.Iterable[Provider]:
|
|
56
68
|
return (self.p,)
|
|
57
69
|
|
|
58
|
-
def provide(self, injector:
|
|
59
|
-
return injector.inject(self.kt)
|
|
70
|
+
async def provide(self, injector: AsyncInjector) -> ta.Any:
|
|
71
|
+
return await injector.inject(self.kt)
|
|
60
72
|
|
|
61
73
|
|
|
62
74
|
##
|
|
@@ -70,7 +82,7 @@ class ConstProviderImpl(ProviderImpl, lang.Final):
|
|
|
70
82
|
def providers(self) -> ta.Iterable[Provider]:
|
|
71
83
|
return (self.p,)
|
|
72
84
|
|
|
73
|
-
def provide(self, injector:
|
|
85
|
+
async def provide(self, injector: AsyncInjector) -> ta.Any:
|
|
74
86
|
return self.p.v
|
|
75
87
|
|
|
76
88
|
|
|
@@ -85,28 +97,5 @@ class LinkProviderImpl(ProviderImpl, lang.Final):
|
|
|
85
97
|
def providers(self) -> ta.Iterable[Provider]:
|
|
86
98
|
return (self.p,)
|
|
87
99
|
|
|
88
|
-
def provide(self, injector:
|
|
89
|
-
return injector.provide(self.p.k)
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
##
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
PROVIDER_IMPLS_BY_PROVIDER: dict[type[Provider], ta.Callable[..., ProviderImpl]] = {
|
|
96
|
-
FnProvider: lambda p: CallableProviderImpl(p, build_kwargs_target(p.fn)),
|
|
97
|
-
CtorProvider: lambda p: CallableProviderImpl(p, build_kwargs_target(p.ty)),
|
|
98
|
-
ConstProvider: ConstProviderImpl,
|
|
99
|
-
LinkProvider: LinkProviderImpl,
|
|
100
|
-
InternalProvider: lambda p: p.impl,
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
def make_provider_impl(p: Provider) -> ProviderImpl:
|
|
105
|
-
try:
|
|
106
|
-
fac = PROVIDER_IMPLS_BY_PROVIDER[type(p)]
|
|
107
|
-
except KeyError:
|
|
108
|
-
pass
|
|
109
|
-
else:
|
|
110
|
-
return fac(p)
|
|
111
|
-
|
|
112
|
-
raise TypeError(p)
|
|
100
|
+
async def provide(self, injector: AsyncInjector) -> ta.Any:
|
|
101
|
+
return await injector.provide(self.p.k)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import typing as ta
|
|
2
|
+
|
|
3
|
+
from ..providers import AsyncFnProvider
|
|
4
|
+
from ..providers import ConstProvider
|
|
5
|
+
from ..providers import CtorProvider
|
|
6
|
+
from ..providers import FnProvider
|
|
7
|
+
from ..providers import LinkProvider
|
|
8
|
+
from ..providers import Provider
|
|
9
|
+
from ..scopes import ScopeSeededProvider
|
|
10
|
+
from .inspect import build_kwargs_target
|
|
11
|
+
from .providers import AsyncCallableProviderImpl
|
|
12
|
+
from .providers import CallableProviderImpl
|
|
13
|
+
from .providers import ConstProviderImpl
|
|
14
|
+
from .providers import InternalProvider
|
|
15
|
+
from .providers import LinkProviderImpl
|
|
16
|
+
from .providers import ProviderImpl
|
|
17
|
+
from .scopes import ScopeSeededProviderImpl
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
##
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
PROVIDER_IMPLS_BY_PROVIDER: dict[type[Provider], ta.Callable[..., ProviderImpl]] = {
|
|
24
|
+
AsyncFnProvider: lambda p: AsyncCallableProviderImpl(p, build_kwargs_target(p.fn)),
|
|
25
|
+
FnProvider: lambda p: CallableProviderImpl(p, build_kwargs_target(p.fn)),
|
|
26
|
+
CtorProvider: lambda p: CallableProviderImpl(p, build_kwargs_target(p.ty)),
|
|
27
|
+
ConstProvider: ConstProviderImpl,
|
|
28
|
+
LinkProvider: LinkProviderImpl,
|
|
29
|
+
InternalProvider: lambda p: p.impl,
|
|
30
|
+
|
|
31
|
+
ScopeSeededProvider: ScopeSeededProviderImpl,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def make_provider_impl(p: Provider) -> ProviderImpl:
|
|
36
|
+
try:
|
|
37
|
+
fac = PROVIDER_IMPLS_BY_PROVIDER[type(p)]
|
|
38
|
+
except KeyError:
|
|
39
|
+
pass
|
|
40
|
+
else:
|
|
41
|
+
return fac(p)
|
|
42
|
+
|
|
43
|
+
raise TypeError(p)
|
omlish/inject/impl/proxy.py
CHANGED
|
@@ -12,7 +12,6 @@ def _cyclic_dependency_proxy() -> tuple[type, ta.Callable[[ta.Any, ta.Any], None
|
|
|
12
12
|
import wrapt # noqa
|
|
13
13
|
|
|
14
14
|
class _CyclicDependencyPlaceholder(lang.Final):
|
|
15
|
-
|
|
16
15
|
def __init__(self, cls: ta.Any) -> None:
|
|
17
16
|
super().__init__()
|
|
18
17
|
|
|
@@ -22,7 +21,6 @@ def _cyclic_dependency_proxy() -> tuple[type, ta.Callable[[ta.Any, ta.Any], None
|
|
|
22
21
|
return f'{type(self).__name__}({self.__cls!r})'
|
|
23
22
|
|
|
24
23
|
class _CyclicDependencyProxy(wrapt.ObjectProxy, lang.Final): # noqa
|
|
25
|
-
|
|
26
24
|
def __init__(self, cls):
|
|
27
25
|
super().__init__(_CyclicDependencyPlaceholder(cls))
|
|
28
26
|
|