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/binder.py
CHANGED
|
@@ -11,14 +11,10 @@ from .bindings import Binding
|
|
|
11
11
|
from .eagers import Eager
|
|
12
12
|
from .elements import Element
|
|
13
13
|
from .elements import Elements
|
|
14
|
-
from .elements import as_elements
|
|
15
14
|
from .keys import Key
|
|
16
15
|
from .keys import as_key
|
|
17
|
-
from .multis import MapBinding
|
|
18
|
-
from .multis import SetBinding
|
|
19
|
-
from .multis import is_map_multi_key
|
|
20
|
-
from .multis import is_set_multi_key
|
|
21
16
|
from .privates import Expose
|
|
17
|
+
from .providers import AsyncFnProvider
|
|
22
18
|
from .providers import ConstProvider
|
|
23
19
|
from .providers import CtorProvider
|
|
24
20
|
from .providers import FnProvider
|
|
@@ -26,13 +22,12 @@ from .providers import LinkProvider
|
|
|
26
22
|
from .providers import Provider
|
|
27
23
|
from .scopes import SCOPE_ALIASES
|
|
28
24
|
from .scopes import Singleton
|
|
29
|
-
from .tags import Id
|
|
30
25
|
from .types import Scope
|
|
31
26
|
from .types import Unscoped
|
|
32
27
|
|
|
33
28
|
|
|
34
29
|
if ta.TYPE_CHECKING:
|
|
35
|
-
from .impl
|
|
30
|
+
from .impl import inspect as _inspect
|
|
36
31
|
else:
|
|
37
32
|
_inspect = lang.proxy_import('.impl.inspect', __package__)
|
|
38
33
|
|
|
@@ -83,6 +78,8 @@ def bind(
|
|
|
83
78
|
*,
|
|
84
79
|
tag: ta.Any = None,
|
|
85
80
|
|
|
81
|
+
to_provider: Provider | None = None,
|
|
82
|
+
to_async_fn: ta.Any = None,
|
|
86
83
|
to_fn: ta.Any = None,
|
|
87
84
|
to_ctor: ta.Any = None,
|
|
88
85
|
to_const: ta.Any = None,
|
|
@@ -102,6 +99,8 @@ def bind(
|
|
|
102
99
|
##
|
|
103
100
|
|
|
104
101
|
has_to = (
|
|
102
|
+
to_provider is not None or
|
|
103
|
+
to_async_fn is not None or
|
|
105
104
|
to_fn is not None or
|
|
106
105
|
to_ctor is not None or
|
|
107
106
|
to_const is not None or
|
|
@@ -137,6 +136,10 @@ def bind(
|
|
|
137
136
|
##
|
|
138
137
|
|
|
139
138
|
providers: list[Provider] = []
|
|
139
|
+
if to_provider is not None:
|
|
140
|
+
providers.append(to_provider)
|
|
141
|
+
if to_async_fn is not None:
|
|
142
|
+
providers.append(AsyncFnProvider(to_async_fn))
|
|
140
143
|
if to_fn is not None:
|
|
141
144
|
providers.append(FnProvider(to_fn))
|
|
142
145
|
if to_ctor is not None:
|
|
@@ -186,45 +189,3 @@ def bind(
|
|
|
186
189
|
return elements[0]
|
|
187
190
|
else:
|
|
188
191
|
return Elements(frozenset(elements))
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
##
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
def bind_set_entry_const(
|
|
195
|
-
multi_key: ta.Any,
|
|
196
|
-
obj: ta.Any,
|
|
197
|
-
*,
|
|
198
|
-
tag: ta.Any | None = None,
|
|
199
|
-
) -> Elements:
|
|
200
|
-
multi_key = as_key(multi_key)
|
|
201
|
-
check.arg(is_set_multi_key(multi_key))
|
|
202
|
-
|
|
203
|
-
if tag is None:
|
|
204
|
-
tag = Id(id(obj), tag=multi_key.tag)
|
|
205
|
-
obj_key: Key = Key(type(obj), tag=tag)
|
|
206
|
-
|
|
207
|
-
return as_elements(
|
|
208
|
-
bind(obj_key, to_const=obj),
|
|
209
|
-
SetBinding(multi_key, obj_key),
|
|
210
|
-
)
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
def bind_map_entry_const(
|
|
214
|
-
multi_key: ta.Any,
|
|
215
|
-
map_key: ta.Any,
|
|
216
|
-
obj: ta.Any,
|
|
217
|
-
*,
|
|
218
|
-
tag: ta.Any | None = None,
|
|
219
|
-
) -> Elements:
|
|
220
|
-
multi_key = as_key(multi_key)
|
|
221
|
-
check.arg(is_map_multi_key(multi_key))
|
|
222
|
-
|
|
223
|
-
if tag is None:
|
|
224
|
-
tag = Id(id(obj), tag=multi_key.tag)
|
|
225
|
-
obj_key: Key = Key(type(obj), tag=tag)
|
|
226
|
-
|
|
227
|
-
return as_elements(
|
|
228
|
-
bind(obj_key, to_const=obj),
|
|
229
|
-
MapBinding(multi_key, map_key, obj_key),
|
|
230
|
-
)
|
omlish/inject/elements.py
CHANGED
|
@@ -6,6 +6,12 @@ from .. import lang
|
|
|
6
6
|
from .impl.origins import HasOriginsImpl
|
|
7
7
|
|
|
8
8
|
|
|
9
|
+
if ta.TYPE_CHECKING:
|
|
10
|
+
from .impl import elements as _elements
|
|
11
|
+
else:
|
|
12
|
+
_elements = lang.proxy_import('.impl.elements', __package__)
|
|
13
|
+
|
|
14
|
+
|
|
9
15
|
##
|
|
10
16
|
|
|
11
17
|
|
|
@@ -64,3 +70,24 @@ def as_elements(*args: Elemental) -> Elements:
|
|
|
64
70
|
es if es else None,
|
|
65
71
|
cs if cs else None,
|
|
66
72
|
)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def iter_elements(*args: Elemental) -> ta.Iterator[Element]:
|
|
76
|
+
for a in args:
|
|
77
|
+
if isinstance(a, Element):
|
|
78
|
+
yield a
|
|
79
|
+
elif isinstance(a, (Elements, ElementGenerator)):
|
|
80
|
+
yield from a
|
|
81
|
+
else:
|
|
82
|
+
raise TypeError(a)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
##
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class CollectedElements(lang.PackageSealed, lang.Abstract):
|
|
89
|
+
pass
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def collect_elements(es: Elements | CollectedElements) -> CollectedElements:
|
|
93
|
+
return _elements.collect_elements(es)
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import typing as ta
|
|
2
|
+
|
|
3
|
+
from ... import cached
|
|
4
|
+
from ... import check
|
|
5
|
+
from ... import dataclasses as dc
|
|
6
|
+
from ... import lang
|
|
7
|
+
from ... import reflect as rfl
|
|
8
|
+
from ..binder import bind
|
|
9
|
+
from ..elements import Elements
|
|
10
|
+
from ..elements import as_elements
|
|
11
|
+
from ..inspect import KwargsTarget
|
|
12
|
+
from ..keys import Key
|
|
13
|
+
from ..keys import as_key
|
|
14
|
+
from ..multis import MapBinding
|
|
15
|
+
from ..multis import SetBinder
|
|
16
|
+
from ..multis import SetBinding
|
|
17
|
+
from ..multis import is_map_multi_key
|
|
18
|
+
from ..multis import is_set_multi_key
|
|
19
|
+
from ..providers import FnProvider
|
|
20
|
+
from .id import Id
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
ItemT = ta.TypeVar('ItemT')
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
##
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def bind_set_entry_const(
|
|
30
|
+
multi_key: ta.Any,
|
|
31
|
+
obj: ta.Any,
|
|
32
|
+
*,
|
|
33
|
+
tag: ta.Any | None = None,
|
|
34
|
+
) -> Elements:
|
|
35
|
+
multi_key = as_key(multi_key)
|
|
36
|
+
check.arg(is_set_multi_key(multi_key))
|
|
37
|
+
|
|
38
|
+
if tag is None:
|
|
39
|
+
tag = Id(id(obj), tag=multi_key.tag)
|
|
40
|
+
obj_key: Key = Key(type(obj), tag=tag)
|
|
41
|
+
|
|
42
|
+
return as_elements(
|
|
43
|
+
bind(obj_key, to_const=obj),
|
|
44
|
+
SetBinding(multi_key, obj_key),
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def bind_map_entry_const(
|
|
49
|
+
multi_key: ta.Any,
|
|
50
|
+
map_key: ta.Any,
|
|
51
|
+
obj: ta.Any,
|
|
52
|
+
*,
|
|
53
|
+
tag: ta.Any | None = None,
|
|
54
|
+
) -> Elements:
|
|
55
|
+
multi_key = as_key(multi_key)
|
|
56
|
+
check.arg(is_map_multi_key(multi_key))
|
|
57
|
+
|
|
58
|
+
if tag is None:
|
|
59
|
+
tag = Id(id(obj), tag=multi_key.tag)
|
|
60
|
+
obj_key: Key = Key(type(obj), tag=tag)
|
|
61
|
+
|
|
62
|
+
return as_elements(
|
|
63
|
+
bind(obj_key, to_const=obj),
|
|
64
|
+
MapBinding(multi_key, map_key, obj_key),
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
##
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@ta.final
|
|
72
|
+
class ItemsBinderHelper(ta.Generic[ItemT]):
|
|
73
|
+
def __init__(self, items_cls: ta.Any) -> None:
|
|
74
|
+
self._items_cls = items_cls
|
|
75
|
+
|
|
76
|
+
@cached.property
|
|
77
|
+
def _item_rty(self) -> rfl.Type:
|
|
78
|
+
rty = check.isinstance(rfl.type_(rfl.get_orig_class(self)), rfl.Generic)
|
|
79
|
+
check.is_(rty.cls, self.__class__)
|
|
80
|
+
return check.single(rty.args)
|
|
81
|
+
|
|
82
|
+
@dc.dataclass(frozen=True, eq=False)
|
|
83
|
+
class _ItemsBox:
|
|
84
|
+
vs: ta.Sequence
|
|
85
|
+
|
|
86
|
+
@cached.property
|
|
87
|
+
def _items_box(self) -> type[_ItemsBox]:
|
|
88
|
+
if isinstance(item_rty := self._item_rty, type):
|
|
89
|
+
sfx = item_rty.__qualname__
|
|
90
|
+
else:
|
|
91
|
+
sfx = str(item_rty).replace("'", '')
|
|
92
|
+
|
|
93
|
+
return lang.new_type( # noqa
|
|
94
|
+
f'{ItemsBinderHelper._ItemsBox.__qualname__}${sfx}@{id(self):x}',
|
|
95
|
+
(ItemsBinderHelper._ItemsBox,),
|
|
96
|
+
{},
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
@cached.property
|
|
100
|
+
def _set_key(self) -> Key:
|
|
101
|
+
return as_key(ta.AbstractSet[self._item_rty]) # type: ignore
|
|
102
|
+
|
|
103
|
+
def bind_item_consts(self, *items: ItemT) -> Elements:
|
|
104
|
+
return as_elements(
|
|
105
|
+
bind_set_entry_const(self._set_key, self._items_box(items)),
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
@dc.dataclass(frozen=True, eq=False)
|
|
109
|
+
@dc.extra_class_params(repr_id=True)
|
|
110
|
+
class _ItemTag:
|
|
111
|
+
pass
|
|
112
|
+
|
|
113
|
+
def bind_item(self, **kwargs: ta.Any) -> Elements:
|
|
114
|
+
tag = ItemsBinderHelper._ItemTag()
|
|
115
|
+
item_key: Key = Key(ta.Any, tag=tag)
|
|
116
|
+
items_box_key: Key = Key(self._items_box, tag=tag)
|
|
117
|
+
return as_elements(
|
|
118
|
+
bind(item_key, **kwargs),
|
|
119
|
+
bind(
|
|
120
|
+
items_box_key,
|
|
121
|
+
to_provider=FnProvider(KwargsTarget.of(
|
|
122
|
+
lambda v: self._items_box([v]),
|
|
123
|
+
v=item_key,
|
|
124
|
+
)),
|
|
125
|
+
),
|
|
126
|
+
SetBinding(self._set_key, items_box_key),
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
def bind_items_provider(self, **kwargs: ta.Any) -> Elements:
|
|
130
|
+
return as_elements(
|
|
131
|
+
SetBinder[self._item_rty](), # type: ignore
|
|
132
|
+
bind(
|
|
133
|
+
self._items_cls,
|
|
134
|
+
to_provider=FnProvider(KwargsTarget.of(
|
|
135
|
+
lambda s: self._items_cls([v for i in s for v in i.vs]),
|
|
136
|
+
s=self._set_key,
|
|
137
|
+
)),
|
|
138
|
+
**kwargs,
|
|
139
|
+
),
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
items_binder_helper = ItemsBinderHelper
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import typing as ta
|
|
2
|
+
|
|
3
|
+
from ... import cached
|
|
4
|
+
from ... import dataclasses as dc
|
|
5
|
+
from ..binder import bind
|
|
6
|
+
from ..elements import Elemental
|
|
7
|
+
from ..keys import Key
|
|
8
|
+
from ..keys import as_key
|
|
9
|
+
from ..privates import private
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
##
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@ta.final
|
|
16
|
+
class WrapperBinderHelper:
|
|
17
|
+
def __init__(self, key: ta.Any) -> None:
|
|
18
|
+
self._key = as_key(key)
|
|
19
|
+
self._root = WrapperBinderHelper._Root()
|
|
20
|
+
self._top = WrapperBinderHelper._Level(self._root, 0)
|
|
21
|
+
|
|
22
|
+
@dc.dataclass(frozen=True, eq=False)
|
|
23
|
+
@dc.extra_class_params(repr_id=True)
|
|
24
|
+
class _Root:
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
@dc.dataclass(frozen=True)
|
|
28
|
+
class _Level:
|
|
29
|
+
root: 'WrapperBinderHelper._Root'
|
|
30
|
+
level: int
|
|
31
|
+
|
|
32
|
+
def next(self) -> 'WrapperBinderHelper._Level':
|
|
33
|
+
return WrapperBinderHelper._Level(self.root, self.level + 1)
|
|
34
|
+
|
|
35
|
+
@cached.property
|
|
36
|
+
def key(self) -> Key:
|
|
37
|
+
return Key(ta.Any, tag=self)
|
|
38
|
+
|
|
39
|
+
@property
|
|
40
|
+
def top(self) -> Key:
|
|
41
|
+
return self._top.key
|
|
42
|
+
|
|
43
|
+
def push_bind(self, **kwargs: ta.Any) -> Elemental:
|
|
44
|
+
prv = self._top
|
|
45
|
+
nxt = prv.next()
|
|
46
|
+
out = private(
|
|
47
|
+
*([bind(self._key, to_key=prv.key)] if prv.level else []),
|
|
48
|
+
bind(nxt.key, **kwargs, expose=True),
|
|
49
|
+
)
|
|
50
|
+
self._top = nxt
|
|
51
|
+
return out
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
wrapper_binder_helper = WrapperBinderHelper
|
omlish/inject/impl/elements.py
CHANGED
|
@@ -27,6 +27,7 @@ from ... import collections as col
|
|
|
27
27
|
from ... import lang
|
|
28
28
|
from ..bindings import Binding
|
|
29
29
|
from ..eagers import Eager
|
|
30
|
+
from ..elements import CollectedElements
|
|
30
31
|
from ..elements import Element
|
|
31
32
|
from ..elements import Elements
|
|
32
33
|
from ..errors import ConflictingKeyError
|
|
@@ -47,14 +48,14 @@ from .multis import make_multi_provider_impl
|
|
|
47
48
|
from .origins import Origins
|
|
48
49
|
from .origins import set_origins
|
|
49
50
|
from .providers import ProviderImpl
|
|
50
|
-
from .
|
|
51
|
+
from .providersmap import make_provider_impl
|
|
51
52
|
from .scopes import make_scope_impl
|
|
52
53
|
|
|
53
54
|
|
|
54
55
|
if ta.TYPE_CHECKING:
|
|
55
|
-
from . import privates as
|
|
56
|
+
from . import privates as _privates
|
|
56
57
|
else:
|
|
57
|
-
|
|
58
|
+
_privates = lang.proxy_import('.privates', __package__)
|
|
58
59
|
|
|
59
60
|
|
|
60
61
|
ElementT = ta.TypeVar('ElementT', bound=Element)
|
|
@@ -63,23 +64,40 @@ ElementT = ta.TypeVar('ElementT', bound=Element)
|
|
|
63
64
|
##
|
|
64
65
|
|
|
65
66
|
|
|
66
|
-
|
|
67
|
+
_SIMPLE_KEYED_ELEMENT_TYPES: tuple[type[Element], ...] = (
|
|
68
|
+
Binding,
|
|
69
|
+
Eager,
|
|
70
|
+
Expose,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
_SIMPLE_NON_KEYED_ELEMENT_TYPES: tuple[type[Element], ...] = (
|
|
74
|
+
ProvisionListenerBinding,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
_NON_BINDING_ELEMENT_TYPES: tuple[type[Element], ...] = (
|
|
78
|
+
Eager,
|
|
79
|
+
Expose,
|
|
80
|
+
ProvisionListenerBinding,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class ElementCollection(CollectedElements, lang.Final):
|
|
67
85
|
def __init__(self, es: Elements) -> None:
|
|
68
86
|
super().__init__()
|
|
69
87
|
|
|
70
88
|
self._es = check.isinstance(es, Elements)
|
|
71
89
|
|
|
72
|
-
self._private_infos: ta.MutableMapping[Private,
|
|
90
|
+
self._private_infos: ta.MutableMapping[Private, _privates.PrivateInfo] | None = None
|
|
73
91
|
|
|
74
92
|
##
|
|
75
93
|
|
|
76
|
-
def _get_private_info(self, p: Private) -> '
|
|
94
|
+
def _get_private_info(self, p: Private) -> '_privates.PrivateInfo':
|
|
77
95
|
if (pis := self._private_infos) is None:
|
|
78
96
|
self._private_infos = pis = col.IdentityKeyDict()
|
|
79
97
|
try:
|
|
80
98
|
return pis[p]
|
|
81
99
|
except KeyError:
|
|
82
|
-
pis[p] = ec =
|
|
100
|
+
pis[p] = ec = _privates.PrivateInfo(self, p)
|
|
83
101
|
return ec
|
|
84
102
|
|
|
85
103
|
##
|
|
@@ -96,28 +114,28 @@ class ElementCollection(lang.Final):
|
|
|
96
114
|
out.setdefault(k, []).extend(e)
|
|
97
115
|
|
|
98
116
|
for e in es:
|
|
99
|
-
if isinstance(e,
|
|
117
|
+
if isinstance(e, _SIMPLE_KEYED_ELEMENT_TYPES):
|
|
118
|
+
add(e.key, e) # type: ignore[attr-defined] # noqa
|
|
119
|
+
|
|
120
|
+
elif isinstance(e, _SIMPLE_NON_KEYED_ELEMENT_TYPES):
|
|
121
|
+
add(None, e)
|
|
122
|
+
|
|
123
|
+
elif isinstance(e, (SetBinding, MapBinding)):
|
|
124
|
+
add(e.multi_key, e)
|
|
125
|
+
|
|
126
|
+
elif isinstance(e, ScopeBinding):
|
|
100
127
|
add(None, e)
|
|
101
128
|
sci = make_scope_impl(e.scope)
|
|
102
129
|
if (sae := sci.auto_elements()) is not None:
|
|
103
130
|
self._build_raw_element_multimap(sae, out)
|
|
104
131
|
|
|
105
|
-
elif isinstance(e, (Binding, Eager, Expose)):
|
|
106
|
-
add(e.key, e)
|
|
107
|
-
|
|
108
132
|
elif isinstance(e, Private):
|
|
109
133
|
pi = self._get_private_info(e)
|
|
110
134
|
self._build_raw_element_multimap(pi.owner_elements(), out)
|
|
111
135
|
|
|
112
|
-
elif isinstance(e, (SetBinding, MapBinding)):
|
|
113
|
-
add(e.multi_key, e)
|
|
114
|
-
|
|
115
|
-
elif isinstance(e, ProvisionListenerBinding):
|
|
116
|
-
add(None, e)
|
|
117
|
-
|
|
118
136
|
elif isinstance(e, Overrides):
|
|
119
|
-
ovr = self._build_raw_element_multimap(e.ovr)
|
|
120
137
|
src = self._build_raw_element_multimap(e.src)
|
|
138
|
+
ovr = self._build_raw_element_multimap(e.ovr)
|
|
121
139
|
for k, b in src.items(): # FIXME: merge None keys?
|
|
122
140
|
try:
|
|
123
141
|
bs = ovr[k]
|
|
@@ -166,9 +184,8 @@ class ElementCollection(lang.Final):
|
|
|
166
184
|
|
|
167
185
|
es_by_ty = col.multi_map_by(type, es)
|
|
168
186
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
es_by_ty.pop(ProvisionListenerBinding, None)
|
|
187
|
+
for nb_ty in _NON_BINDING_ELEMENT_TYPES:
|
|
188
|
+
es_by_ty.pop(nb_ty, None)
|
|
172
189
|
|
|
173
190
|
if (bs := es_by_ty.pop(Binding, None)):
|
|
174
191
|
b = self._get_single_binding(k, bs) # type: ignore
|
|
@@ -176,7 +193,6 @@ class ElementCollection(lang.Final):
|
|
|
176
193
|
p: ProviderImpl
|
|
177
194
|
if isinstance(b.provider, (SetProvider, MapProvider)):
|
|
178
195
|
p = make_multi_provider_impl(b.provider, es_by_ty)
|
|
179
|
-
|
|
180
196
|
else:
|
|
181
197
|
p = make_provider_impl(b.provider)
|
|
182
198
|
|
|
@@ -193,6 +209,10 @@ class ElementCollection(lang.Final):
|
|
|
193
209
|
|
|
194
210
|
##
|
|
195
211
|
|
|
212
|
+
@lang.cached_function
|
|
213
|
+
def scope_binding_scopes(self) -> ta.Sequence[Scope]:
|
|
214
|
+
return [sb.scope for sb in self.elements_of_type(ScopeBinding)]
|
|
215
|
+
|
|
196
216
|
@lang.cached_function
|
|
197
217
|
def eager_keys_by_scope(self) -> ta.Mapping[Scope, ta.Sequence[Key]]:
|
|
198
218
|
bim = self.binding_impl_map()
|
|
@@ -201,3 +221,13 @@ class ElementCollection(lang.Final):
|
|
|
201
221
|
bi = bim[e.key]
|
|
202
222
|
ret.setdefault(bi.scope, []).append(e.key)
|
|
203
223
|
return ret
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
##
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def collect_elements(es: Elements | CollectedElements) -> ElementCollection:
|
|
230
|
+
if isinstance(es, CollectedElements):
|
|
231
|
+
return check.isinstance(es, ElementCollection)
|
|
232
|
+
else:
|
|
233
|
+
return ElementCollection(es)
|