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/asyncs/bridge.py
DELETED
|
@@ -1,359 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
A system for bridging sync and async code. Supports nesting / reentrancy. Robust, but not the most efficient
|
|
3
|
-
implementation - its primary usecase are heavy and init-time ops like lock management and connection establishment, not
|
|
4
|
-
so much for packet-level ops.
|
|
5
|
-
|
|
6
|
-
==
|
|
7
|
-
|
|
8
|
-
The code is written in a very dumb, simple, explicit style to keep the bookkeeping center-stage and front-of-mind. To
|
|
9
|
-
quote kubernetes:
|
|
10
|
-
|
|
11
|
-
https://github.com/kubernetes/kubernetes/blob/60c4c2b2521fb454ce69dee737e3eb91a25e0535/pkg/controller/volume/persistentvolume/pv_controller.go#L60-L63
|
|
12
|
-
|
|
13
|
-
==================================================================
|
|
14
|
-
PLEASE DO NOT ATTEMPT TO SIMPLIFY THIS CODE.
|
|
15
|
-
KEEP THE SPACE SHUTTLE FLYING.
|
|
16
|
-
==================================================================
|
|
17
|
-
|
|
18
|
-
==
|
|
19
|
-
|
|
20
|
-
TODO:
|
|
21
|
-
- reuse greenlet if nested somehow?
|
|
22
|
-
- test cancel
|
|
23
|
-
|
|
24
|
-
See:
|
|
25
|
-
- https://github.com/sqlalchemy/sqlalchemy/blob/21ea01eebe0350ad1185c7288dca61f363ebd2fe/lib/sqlalchemy/util/concurrency.py
|
|
26
|
-
- ( https://gist.github.com/snaury/202bf4f22c41ca34e56297bae5f33fef )
|
|
27
|
-
- Baked into sqlalchemy and hard-bound to asyncio.
|
|
28
|
-
- https://github.com/oremanj/greenback/blob/ca69b023a9b7b58b715f3b1d78fc116e788a2c9f/greenback/_impl.py
|
|
29
|
-
- ( https://gist.github.com/oremanj/f18ef3e55b9487c2e93eee42232583f2 )
|
|
30
|
-
- Similar to this, but does horrible things with ctypes and is hard-bound to greenlet.
|
|
31
|
-
- https://github.com/fastapi/asyncer/blob/2a4b8ef2540ec687af13d3f361c4ed0cf0cb624d/asyncer/_main.py
|
|
32
|
-
- https://github.com/django/asgiref/blob/05ae3eee3fae4005ae4cfb0bb22d281725fabade/asgiref/sync.py
|
|
33
|
-
- Both are much heavier weight and hard-bound to threads.
|
|
34
|
-
""" # noqa
|
|
35
|
-
import functools # noqa
|
|
36
|
-
import itertools
|
|
37
|
-
import sys # noqa
|
|
38
|
-
import types
|
|
39
|
-
import typing as ta
|
|
40
|
-
import weakref
|
|
41
|
-
|
|
42
|
-
from .. import check
|
|
43
|
-
from .. import lang
|
|
44
|
-
from .. import sync
|
|
45
|
-
from ..concurrent import threadlets
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if ta.TYPE_CHECKING:
|
|
49
|
-
import asyncio
|
|
50
|
-
|
|
51
|
-
from . import anyio as aiu
|
|
52
|
-
|
|
53
|
-
else:
|
|
54
|
-
asyncio = lang.proxy_import('asyncio')
|
|
55
|
-
|
|
56
|
-
aiu = lang.proxy_import('.anyio', __package__)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
T = ta.TypeVar('T')
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
##
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
def trivial_s_to_a(fn):
|
|
66
|
-
async def inner(*args, **kwargs):
|
|
67
|
-
return fn(*args, **kwargs)
|
|
68
|
-
return inner
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
def trivial_a_to_s(fn):
|
|
72
|
-
def inner(*args, **kwargs):
|
|
73
|
-
return lang.sync_await(fn(*args, **kwargs))
|
|
74
|
-
return inner
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
##
|
|
78
|
-
# https://gist.github.com/snaury/202bf4f22c41ca34e56297bae5f33fef
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
_THREADLETS_IMPL = threadlets.GreenletThreadlets
|
|
82
|
-
# from ..concurrent.tests.real import RealThreadlets
|
|
83
|
-
# _THREADLETS_IMPL = RealThreadlets
|
|
84
|
-
|
|
85
|
-
_THREADLETS = sync.LazyFn(lambda: _THREADLETS_IMPL())
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
def _threadlets() -> threadlets.Threadlets:
|
|
89
|
-
return _THREADLETS.get()
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
#
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
class BridgeAwaitRequiredError(Exception):
|
|
96
|
-
pass
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
class MissingBridgeThreadletError(Exception):
|
|
100
|
-
pass
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
class UnexpectedBridgeNestingError(Exception):
|
|
104
|
-
def __init__(self, *args, **kwargs):
|
|
105
|
-
super().__init__(*args, **kwargs)
|
|
106
|
-
# breakpoint()
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
#
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
_DEBUG_PRINT: ta.Callable[..., None] | None = None
|
|
113
|
-
# _DEBUG_PRINT = functools.partial(print, file=sys.stderr) # noqa
|
|
114
|
-
|
|
115
|
-
_TRACK_TRANSITION_OBJS = False
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
#
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
_BRIDGE_TRANSITIONS_SEQ = itertools.count()
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
class _BridgeTransition(ta.NamedTuple):
|
|
125
|
-
seq: int
|
|
126
|
-
a_to_s: bool
|
|
127
|
-
|
|
128
|
-
obj_cls: type
|
|
129
|
-
obj_id: int
|
|
130
|
-
|
|
131
|
-
obj: ta.Any
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
def _make_transition(seq: int, a_to_s: bool, obj: ta.Any) -> _BridgeTransition:
|
|
135
|
-
return _BridgeTransition(seq, a_to_s, obj.__class__, id(obj), (obj if _TRACK_TRANSITION_OBJS else None))
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
_BRIDGED_TASKS: ta.MutableMapping[ta.Any, list[_BridgeTransition]] = weakref.WeakKeyDictionary()
|
|
139
|
-
|
|
140
|
-
_BRIDGE_THREADLET_ATTR = f'__{__package__.replace(".", "__")}__bridge_threadlet__'
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
def _push_transition(a_to_s: bool, l: list[_BridgeTransition], t: _BridgeTransition) -> _BridgeTransition:
|
|
144
|
-
l.append(t)
|
|
145
|
-
if _DEBUG_PRINT:
|
|
146
|
-
_DEBUG_PRINT(f'_push_transition: {a_to_s=} {id(l)=} {t=}')
|
|
147
|
-
return t
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
def _pop_transition(a_to_s: bool, l: list[_BridgeTransition]) -> _BridgeTransition:
|
|
151
|
-
t = l.pop()
|
|
152
|
-
if _DEBUG_PRINT:
|
|
153
|
-
_DEBUG_PRINT(f'_pop_transition: {a_to_s=} {id(l)=} {t=}')
|
|
154
|
-
return t
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
def _get_transitions() -> list[_BridgeTransition]:
|
|
158
|
-
l: list[_BridgeTransition] = []
|
|
159
|
-
|
|
160
|
-
if (t := aiu.get_current_backend_task()) is not None:
|
|
161
|
-
try:
|
|
162
|
-
tl = _BRIDGED_TASKS[t]
|
|
163
|
-
except KeyError:
|
|
164
|
-
pass
|
|
165
|
-
else:
|
|
166
|
-
l.extend(tl)
|
|
167
|
-
|
|
168
|
-
g = _threadlets().get_current()
|
|
169
|
-
try:
|
|
170
|
-
gl = getattr(g.underlying, _BRIDGE_THREADLET_ATTR)
|
|
171
|
-
except AttributeError:
|
|
172
|
-
pass
|
|
173
|
-
else:
|
|
174
|
-
l.extend(gl)
|
|
175
|
-
|
|
176
|
-
l.sort(key=lambda t: (t.seq, t.a_to_s))
|
|
177
|
-
return l
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
def is_in_bridge() -> bool:
|
|
181
|
-
if _DEBUG_PRINT:
|
|
182
|
-
_DEBUG_PRINT(_get_transitions())
|
|
183
|
-
|
|
184
|
-
if (t := aiu.get_current_backend_task()) is not None:
|
|
185
|
-
try:
|
|
186
|
-
tl = _BRIDGED_TASKS[t]
|
|
187
|
-
except KeyError:
|
|
188
|
-
last_t = None
|
|
189
|
-
else:
|
|
190
|
-
if tl:
|
|
191
|
-
last_t = tl[-1]
|
|
192
|
-
else:
|
|
193
|
-
last_t = None
|
|
194
|
-
else:
|
|
195
|
-
last_t = None
|
|
196
|
-
|
|
197
|
-
g = _threadlets().get_current()
|
|
198
|
-
try:
|
|
199
|
-
gl = getattr(g.underlying, _BRIDGE_THREADLET_ATTR)
|
|
200
|
-
except AttributeError:
|
|
201
|
-
last_g = None
|
|
202
|
-
else:
|
|
203
|
-
if gl:
|
|
204
|
-
last_g = gl[-1]
|
|
205
|
-
else:
|
|
206
|
-
last_g = None
|
|
207
|
-
|
|
208
|
-
if last_t is None:
|
|
209
|
-
if last_g is None:
|
|
210
|
-
return False
|
|
211
|
-
o = last_g
|
|
212
|
-
else: # noqa
|
|
213
|
-
if last_g is None or last_g.seq < last_t.seq:
|
|
214
|
-
o = last_t
|
|
215
|
-
else:
|
|
216
|
-
o = last_g
|
|
217
|
-
|
|
218
|
-
in_a = (t is not None)
|
|
219
|
-
|
|
220
|
-
if _DEBUG_PRINT:
|
|
221
|
-
_DEBUG_PRINT(f'{o.a_to_s=} {in_a=}')
|
|
222
|
-
|
|
223
|
-
return in_a != o.a_to_s
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
def _safe_cancel_awaitable(awaitable: ta.Awaitable[ta.Any]) -> None:
|
|
227
|
-
# https://docs.python.org/3/reference/datamodel.html#coroutine.close
|
|
228
|
-
if asyncio.iscoroutine(awaitable):
|
|
229
|
-
awaitable.close() # noqa
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
def s_to_a_await(awaitable: ta.Awaitable[T]) -> T:
|
|
233
|
-
g = _threadlets().get_current()
|
|
234
|
-
|
|
235
|
-
if not getattr(g.underlying, _BRIDGE_THREADLET_ATTR, False):
|
|
236
|
-
_safe_cancel_awaitable(awaitable)
|
|
237
|
-
raise MissingBridgeThreadletError
|
|
238
|
-
|
|
239
|
-
return check.not_none(g.parent).switch(awaitable)
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
def s_to_a(fn, *, require_await=False):
|
|
243
|
-
@types.coroutine
|
|
244
|
-
def outer(*args, **kwargs):
|
|
245
|
-
def inner():
|
|
246
|
-
try:
|
|
247
|
-
return fn(*args, **kwargs)
|
|
248
|
-
finally:
|
|
249
|
-
if (gl2 := getattr(g.underlying, _BRIDGE_THREADLET_ATTR)) is not gl: # noqa
|
|
250
|
-
raise UnexpectedBridgeNestingError
|
|
251
|
-
if (cur_g := _pop_transition(False, gl)) is not added_g: # noqa
|
|
252
|
-
raise UnexpectedBridgeNestingError
|
|
253
|
-
if gl:
|
|
254
|
-
raise UnexpectedBridgeNestingError
|
|
255
|
-
|
|
256
|
-
seq = next(_BRIDGE_TRANSITIONS_SEQ)
|
|
257
|
-
|
|
258
|
-
g = _threadlets().spawn(inner)
|
|
259
|
-
setattr(g.underlying, _BRIDGE_THREADLET_ATTR, gl := []) # type: ignore
|
|
260
|
-
added_g = _push_transition(False, gl, _make_transition(seq, False, g))
|
|
261
|
-
|
|
262
|
-
if (t := aiu.get_current_backend_task()) is not None:
|
|
263
|
-
try:
|
|
264
|
-
tl = _BRIDGED_TASKS[t]
|
|
265
|
-
except KeyError:
|
|
266
|
-
tl = _BRIDGED_TASKS[t] = []
|
|
267
|
-
added_t = _push_transition(False, tl, _make_transition(seq, False, g))
|
|
268
|
-
|
|
269
|
-
try:
|
|
270
|
-
result: ta.Any = g.switch()
|
|
271
|
-
switch_occurred = False
|
|
272
|
-
while not g.dead:
|
|
273
|
-
switch_occurred = True
|
|
274
|
-
try:
|
|
275
|
-
value = yield result
|
|
276
|
-
except BaseException as e: # noqa
|
|
277
|
-
result = g.throw(e)
|
|
278
|
-
else:
|
|
279
|
-
result = g.switch(value)
|
|
280
|
-
|
|
281
|
-
if require_await and not switch_occurred:
|
|
282
|
-
raise BridgeAwaitRequiredError
|
|
283
|
-
|
|
284
|
-
return result
|
|
285
|
-
|
|
286
|
-
finally:
|
|
287
|
-
if t is not None:
|
|
288
|
-
if (tl2 := _BRIDGED_TASKS[t]) is not tl: # noqa
|
|
289
|
-
raise UnexpectedBridgeNestingError
|
|
290
|
-
if (cur_t := _pop_transition(False, tl)) is not added_t: # noqa
|
|
291
|
-
raise UnexpectedBridgeNestingError
|
|
292
|
-
|
|
293
|
-
return outer
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
def a_to_s(fn):
|
|
297
|
-
def inner(*args, **kwargs):
|
|
298
|
-
seq = next(_BRIDGE_TRANSITIONS_SEQ)
|
|
299
|
-
|
|
300
|
-
if (t := aiu.get_current_backend_task()) is not None:
|
|
301
|
-
try:
|
|
302
|
-
tl = _BRIDGED_TASKS[t]
|
|
303
|
-
except KeyError:
|
|
304
|
-
tl = _BRIDGED_TASKS[t] = []
|
|
305
|
-
added_t = _push_transition(True, tl, _make_transition(seq, True, t))
|
|
306
|
-
else:
|
|
307
|
-
added_t = None
|
|
308
|
-
|
|
309
|
-
g = _threadlets().get_current()
|
|
310
|
-
try:
|
|
311
|
-
gl = getattr(g.underlying, _BRIDGE_THREADLET_ATTR)
|
|
312
|
-
except AttributeError:
|
|
313
|
-
setattr(g.underlying, _BRIDGE_THREADLET_ATTR, gl := [])
|
|
314
|
-
added_g = _push_transition(True, gl, _make_transition(seq, True, g))
|
|
315
|
-
|
|
316
|
-
try:
|
|
317
|
-
ret = missing = object()
|
|
318
|
-
|
|
319
|
-
async def gate():
|
|
320
|
-
nonlocal ret
|
|
321
|
-
ret = await fn(*args, **kwargs)
|
|
322
|
-
|
|
323
|
-
cr = gate()
|
|
324
|
-
sv = None
|
|
325
|
-
he = False
|
|
326
|
-
try:
|
|
327
|
-
while True:
|
|
328
|
-
if not he:
|
|
329
|
-
try:
|
|
330
|
-
sv = cr.send(sv)
|
|
331
|
-
except StopIteration:
|
|
332
|
-
break
|
|
333
|
-
he = False
|
|
334
|
-
|
|
335
|
-
if ret is missing or cr.cr_await is not None or cr.cr_running:
|
|
336
|
-
try:
|
|
337
|
-
sv = s_to_a_await(sv) # type: ignore
|
|
338
|
-
except BaseException as e: # noqa
|
|
339
|
-
sv = cr.throw(e)
|
|
340
|
-
he = True
|
|
341
|
-
|
|
342
|
-
finally:
|
|
343
|
-
cr.close()
|
|
344
|
-
|
|
345
|
-
finally:
|
|
346
|
-
if t is not None:
|
|
347
|
-
if (tl2 := _BRIDGED_TASKS[t]) is not tl: # noqa
|
|
348
|
-
raise UnexpectedBridgeNestingError
|
|
349
|
-
if (cur_t := _pop_transition(True, tl)) is not added_t: # noqa
|
|
350
|
-
raise UnexpectedBridgeNestingError
|
|
351
|
-
|
|
352
|
-
if (gl2 := getattr(g.underlying, _BRIDGE_THREADLET_ATTR)) is not gl: # noqa
|
|
353
|
-
raise UnexpectedBridgeNestingError
|
|
354
|
-
if (cur_g := _pop_transition(True, gl)) is not added_g: # noqa
|
|
355
|
-
raise UnexpectedBridgeNestingError
|
|
356
|
-
|
|
357
|
-
return ret
|
|
358
|
-
|
|
359
|
-
return inner
|
omlish/asyncs/utils.py
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import contextlib
|
|
2
|
-
import typing as ta
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
P = ta.ParamSpec('P')
|
|
6
|
-
T = ta.TypeVar('T')
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
##
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
async def call_with_async_exit_stack(
|
|
13
|
-
fn: ta.Callable[ta.Concatenate[contextlib.AsyncExitStack, P], ta.Awaitable[T]],
|
|
14
|
-
*args: ta.Any,
|
|
15
|
-
**kwargs: ta.Any,
|
|
16
|
-
) -> T:
|
|
17
|
-
async with contextlib.AsyncExitStack() as aes:
|
|
18
|
-
return await fn(aes, *args, **kwargs)
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
from ....text.mangle import StringMangler
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
##
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
ESCAPED_IDENT_CHARS = ''.join(
|
|
8
|
-
chr(i)
|
|
9
|
-
for i in range(128)
|
|
10
|
-
if not (
|
|
11
|
-
chr(i).isalpha() or
|
|
12
|
-
chr(i).isdigit() or
|
|
13
|
-
chr(i) == '_' or
|
|
14
|
-
ord(chr(i)) > 127
|
|
15
|
-
)
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
IDENT_MANGLER = StringMangler.of('_', ESCAPED_IDENT_CHARS)
|
omlish/defs.py
DELETED
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
A self-awarely unpythonic set of helpers for defining common boilerplate methods (repr, hash_eq, delegates, etc) in
|
|
3
|
-
class definitions. Should be used sparingly for methods not directly used by humans (like repr) - @property's should
|
|
4
|
-
remain @property's for type annotation, tool assistance, debugging, and otherwise, but these are still nice to have in
|
|
5
|
-
certain circumstances (the real-world alternative usually being simply not adding them).
|
|
6
|
-
"""
|
|
7
|
-
# ruff: noqa: ANN201
|
|
8
|
-
import abc
|
|
9
|
-
import functools
|
|
10
|
-
import operator
|
|
11
|
-
import threading
|
|
12
|
-
|
|
13
|
-
from . import lang
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
##
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
_repr = repr
|
|
20
|
-
|
|
21
|
-
BASICS = {}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
def _basic(fn):
|
|
25
|
-
if fn.__name__ in BASICS:
|
|
26
|
-
raise NameError(fn.__name__)
|
|
27
|
-
|
|
28
|
-
BASICS[fn.__name__] = fn
|
|
29
|
-
return fn
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
@lang.cls_dct_fn()
|
|
33
|
-
def basic(cls_dct, *attrs, basics=None):
|
|
34
|
-
if basics is None:
|
|
35
|
-
basics = BASICS.keys()
|
|
36
|
-
|
|
37
|
-
for k in basics:
|
|
38
|
-
fn = BASICS[k]
|
|
39
|
-
fn(*attrs, cls_dct=cls_dct)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
_REPR_SEEN = threading.local()
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
def _repr_guard(fn):
|
|
46
|
-
@functools.wraps(fn)
|
|
47
|
-
def inner(obj, *args, **kwargs):
|
|
48
|
-
try:
|
|
49
|
-
ids = _REPR_SEEN.ids
|
|
50
|
-
|
|
51
|
-
except AttributeError:
|
|
52
|
-
ids = _REPR_SEEN.ids = set()
|
|
53
|
-
try:
|
|
54
|
-
ids.add(id(obj))
|
|
55
|
-
return fn(obj, *args, **kwargs)
|
|
56
|
-
finally:
|
|
57
|
-
del _REPR_SEEN.ids
|
|
58
|
-
|
|
59
|
-
else:
|
|
60
|
-
if id(obj) in ids:
|
|
61
|
-
return f'<seen:{type(obj).__name__}@{hex(id(obj))[2:]}>'
|
|
62
|
-
ids.add(id(obj))
|
|
63
|
-
return fn(obj, *args, **kwargs)
|
|
64
|
-
|
|
65
|
-
return inner
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
@_repr_guard
|
|
69
|
-
def build_attr_repr(obj, *, mro=False):
|
|
70
|
-
if mro:
|
|
71
|
-
attrs = [
|
|
72
|
-
attr
|
|
73
|
-
for ty in sorted( # noqa
|
|
74
|
-
reversed(type(obj).__mro__),
|
|
75
|
-
key=lambda _ty: _ty.__dict__.get('__repr_priority__', 0),
|
|
76
|
-
)
|
|
77
|
-
for attr in ty.__dict__.get('__repr_attrs__', [])
|
|
78
|
-
]
|
|
79
|
-
|
|
80
|
-
else:
|
|
81
|
-
attrs = obj.__repr_attrs__
|
|
82
|
-
|
|
83
|
-
s = ', '.join(f'{a}={"<self>" if v is obj else _repr(v)}' for a in attrs for v in [getattr(obj, a)])
|
|
84
|
-
return f'{type(obj).__name__}@{hex(id(obj))[2:]}({s})'
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
@_repr_guard
|
|
88
|
-
def build_repr(obj, *attrs):
|
|
89
|
-
return (
|
|
90
|
-
f'{type(obj).__name__}'
|
|
91
|
-
f'@{hex(id(obj))[2:]}'
|
|
92
|
-
f'({", ".join(f"{attr}={getattr(obj, attr)!r}" for attr in attrs)})'
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
@_basic
|
|
97
|
-
@lang.cls_dct_fn()
|
|
98
|
-
def repr(cls_dct, *attrs, mro=False, priority=None): # noqa
|
|
99
|
-
def __repr__(self): # noqa
|
|
100
|
-
return build_attr_repr(self, mro=mro)
|
|
101
|
-
|
|
102
|
-
cls_dct['__repr_attrs__'] = attrs
|
|
103
|
-
if priority is not None:
|
|
104
|
-
cls_dct['__repr_priority__'] = priority
|
|
105
|
-
|
|
106
|
-
cls_dct['__repr__'] = __repr__
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
@lang.cls_dct_fn()
|
|
110
|
-
def bare_repr(cls_dct, *attrs):
|
|
111
|
-
def __repr__(self): # noqa
|
|
112
|
-
return lang.attr_repr(self, *attrs)
|
|
113
|
-
|
|
114
|
-
cls_dct['__repr__'] = __repr__
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
@lang.cls_dct_fn()
|
|
118
|
-
def name_repr(cls_dct):
|
|
119
|
-
def __repr__(self): # noqa
|
|
120
|
-
return self.__name__
|
|
121
|
-
|
|
122
|
-
cls_dct['__repr__'] = __repr__
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
@lang.cls_dct_fn()
|
|
126
|
-
def ne(cls_dct):
|
|
127
|
-
def __ne__(self, other): # noqa
|
|
128
|
-
return not (self == other)
|
|
129
|
-
|
|
130
|
-
cls_dct['__ne__'] = __ne__
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
@lang.cls_dct_fn()
|
|
134
|
-
def no_order(cls_dct, *, raise_=None):
|
|
135
|
-
def fn(self, other):
|
|
136
|
-
if raise_ is None:
|
|
137
|
-
return NotImplemented
|
|
138
|
-
else:
|
|
139
|
-
raise raise_
|
|
140
|
-
|
|
141
|
-
for att in [
|
|
142
|
-
'__lt__',
|
|
143
|
-
'__le__',
|
|
144
|
-
'__gt__',
|
|
145
|
-
'__ge__',
|
|
146
|
-
]:
|
|
147
|
-
cls_dct[att] = fn
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
@_basic
|
|
151
|
-
@lang.cls_dct_fn()
|
|
152
|
-
def hash_eq(cls_dct, *attrs):
|
|
153
|
-
def __hash__(self): # noqa
|
|
154
|
-
return hash(tuple(getattr(self, attr) for attr in attrs))
|
|
155
|
-
|
|
156
|
-
cls_dct['__hash__'] = __hash__
|
|
157
|
-
|
|
158
|
-
def __eq__(self, other): # noqa
|
|
159
|
-
if type(other) is not type(self):
|
|
160
|
-
return False
|
|
161
|
-
|
|
162
|
-
for attr in attrs: # noqa
|
|
163
|
-
if getattr(self, attr) != getattr(other, attr):
|
|
164
|
-
return False
|
|
165
|
-
|
|
166
|
-
return True
|
|
167
|
-
|
|
168
|
-
cls_dct['__eq__'] = __eq__
|
|
169
|
-
|
|
170
|
-
ne(cls_dct=cls_dct)
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
@lang.cls_dct_fn()
|
|
174
|
-
def getter(cls_dct, *attrs):
|
|
175
|
-
for attr in attrs:
|
|
176
|
-
cls_dct[attr] = property(operator.attrgetter('_' + attr))
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
@lang.cls_dct_fn()
|
|
180
|
-
def not_implemented(cls_dct, *names, **kwargs):
|
|
181
|
-
wrapper = kwargs.pop('wrapper', lambda _: _)
|
|
182
|
-
if kwargs:
|
|
183
|
-
raise TypeError(kwargs)
|
|
184
|
-
|
|
185
|
-
ret = []
|
|
186
|
-
for name in names:
|
|
187
|
-
@wrapper
|
|
188
|
-
def not_implemented(self, *args, **kwargs):
|
|
189
|
-
raise NotImplementedError
|
|
190
|
-
|
|
191
|
-
not_implemented.__name__ = name
|
|
192
|
-
cls_dct[name] = not_implemented
|
|
193
|
-
ret.append(not_implemented)
|
|
194
|
-
|
|
195
|
-
return tuple(ret)
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
@lang.cls_dct_fn()
|
|
199
|
-
def abstract_method(cls_dct, *names):
|
|
200
|
-
return not_implemented(cls_dct, *names, wrapper=abc.abstractmethod)
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
@lang.cls_dct_fn()
|
|
204
|
-
def abstract_property(cls_dct, *names):
|
|
205
|
-
return not_implemented(cls_dct, *names, wrapper=lambda o: property(abc.abstractmethod(o)))
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
@lang.cls_dct_fn()
|
|
209
|
-
def abstract_hash_eq(cls_dct):
|
|
210
|
-
return not_implemented(
|
|
211
|
-
cls_dct,
|
|
212
|
-
'__hash__',
|
|
213
|
-
'__eq__',
|
|
214
|
-
'__ne__',
|
|
215
|
-
wrapper=abc.abstractmethod,
|
|
216
|
-
)
|
omlish/dispatch/_dispatch2.py
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import abc
|
|
2
|
-
import typing as ta
|
|
3
|
-
import weakref
|
|
4
|
-
|
|
5
|
-
from .impls import find_impl as default_find_impl
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
T = ta.TypeVar('T')
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
##
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class Dispatcher(ta.Generic[T]):
|
|
15
|
-
def __init__(self, find_impl: ta.Callable[[type, ta.Mapping[type, T]], T | None] | None = None) -> None:
|
|
16
|
-
super().__init__()
|
|
17
|
-
|
|
18
|
-
if find_impl is None:
|
|
19
|
-
find_impl = default_find_impl
|
|
20
|
-
self._find_impl = find_impl
|
|
21
|
-
|
|
22
|
-
self._impls_by_arg_cls: dict[type, T] = {}
|
|
23
|
-
self._dispatch_cache: dict[ta.Any, T | None] = {}
|
|
24
|
-
|
|
25
|
-
def cache_remove(k, self_ref=weakref.ref(self)):
|
|
26
|
-
if (ref_self := self_ref()) is not None:
|
|
27
|
-
cache = ref_self._dispatch_cache # noqa
|
|
28
|
-
try:
|
|
29
|
-
del cache[k]
|
|
30
|
-
except KeyError:
|
|
31
|
-
pass
|
|
32
|
-
|
|
33
|
-
self._cache_remove = cache_remove
|
|
34
|
-
|
|
35
|
-
self._cache_token: ta.Any = None
|
|
36
|
-
|
|
37
|
-
def cache_size(self) -> int:
|
|
38
|
-
return len(self._dispatch_cache)
|
|
39
|
-
|
|
40
|
-
def register(self, impl: T, cls_col: ta.Iterable[type]) -> T:
|
|
41
|
-
for cls in cls_col:
|
|
42
|
-
self._impls_by_arg_cls[cls] = impl
|
|
43
|
-
|
|
44
|
-
if self._cache_token is None and hasattr(cls, '__abstractmethods__'):
|
|
45
|
-
self._cache_token = abc.get_cache_token()
|
|
46
|
-
|
|
47
|
-
self._dispatch_cache.clear()
|
|
48
|
-
return impl
|
|
49
|
-
|
|
50
|
-
def dispatch(self, cls: type) -> T | None:
|
|
51
|
-
if self._cache_token is not None and (current_token := abc.get_cache_token()) != self._cache_token:
|
|
52
|
-
self._dispatch_cache.clear()
|
|
53
|
-
self._cache_token = current_token
|
|
54
|
-
|
|
55
|
-
cls_ref = weakref.ref(cls)
|
|
56
|
-
try:
|
|
57
|
-
return self._dispatch_cache[cls_ref]
|
|
58
|
-
except KeyError:
|
|
59
|
-
pass
|
|
60
|
-
del cls_ref
|
|
61
|
-
|
|
62
|
-
impl: T | None
|
|
63
|
-
try:
|
|
64
|
-
impl = self._impls_by_arg_cls[cls]
|
|
65
|
-
except KeyError:
|
|
66
|
-
impl = self._find_impl(cls, self._impls_by_arg_cls)
|
|
67
|
-
|
|
68
|
-
self._dispatch_cache[weakref.ref(cls, self._cache_remove)] = impl
|
|
69
|
-
return impl
|