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/diag/pydevd.py
CHANGED
|
@@ -6,7 +6,7 @@ an already-debugging PyCharm instance to debug PySpark jobs.
|
|
|
6
6
|
TODO:
|
|
7
7
|
- https://www.jetbrains.com/help/pycharm/remote-debugging-with-product.html#
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
====
|
|
10
10
|
|
|
11
11
|
https://www.jetbrains.com/help/pycharm/remote-debugging-with-product.html#remote-debug-config ->
|
|
12
12
|
|
|
@@ -25,13 +25,34 @@ buf = textwrap.dedent(f'''
|
|
|
25
25
|
stderrToServer=True,
|
|
26
26
|
)
|
|
27
27
|
''') + '\n' * 2 + buf
|
|
28
|
+
|
|
29
|
+
====
|
|
30
|
+
|
|
31
|
+
TODO: monkeypatch:
|
|
32
|
+
|
|
33
|
+
/Applications/PyCharm.app/Contents/plugins/python-ce/helpers/pydev/_pydev_bundle/pydev_monkey.py ::
|
|
34
|
+
|
|
35
|
+
def starts_with_python_shebang(path):
|
|
36
|
+
try:
|
|
37
|
+
with open(path) as f:
|
|
38
|
+
for line in f:
|
|
39
|
+
line = line.strip()
|
|
40
|
+
if line:
|
|
41
|
+
for name in PYTHON_NAMES:
|
|
42
|
+
if line.startswith('#!/usr/bin/env %s' % name):
|
|
43
|
+
return True
|
|
44
|
+
return False
|
|
45
|
+
except (UnicodeDecodeError, IsADirectoryError): # <-- Add catch for `IsADirectoryError`
|
|
46
|
+
return False
|
|
47
|
+
except:
|
|
48
|
+
traceback.print_exc()
|
|
49
|
+
return False
|
|
28
50
|
"""
|
|
29
51
|
import json
|
|
30
52
|
import os
|
|
31
53
|
import sys
|
|
32
54
|
import tempfile
|
|
33
55
|
import textwrap
|
|
34
|
-
import threading
|
|
35
56
|
import types
|
|
36
57
|
import typing as ta
|
|
37
58
|
|
|
@@ -119,7 +140,19 @@ def _pydevd() -> types.ModuleType | None:
|
|
|
119
140
|
|
|
120
141
|
|
|
121
142
|
def is_present() -> bool:
|
|
122
|
-
|
|
143
|
+
# FIXME: try to use `lang.can_import('pydevd'), but raises with:
|
|
144
|
+
# INTERNALERROR> File "/Users/spinlock/src/wrmsr/omlish/omlish/lang/imports/resolving.py", line 16, in can_import
|
|
145
|
+
# INTERNALERROR> spec = importlib.util.find_spec(name, package)
|
|
146
|
+
# INTERNALERROR> File "<frozen importlib.util>", line 111, in find_spec
|
|
147
|
+
# INTERNALERROR> ValueError: pydevd.__spec__ is None
|
|
148
|
+
# Really want to avoid actually importing pydevd due to side-effects, slowness, and even a pkg_resources deprecation
|
|
149
|
+
# warning...
|
|
150
|
+
try:
|
|
151
|
+
__import__('pydevd')
|
|
152
|
+
except ImportError:
|
|
153
|
+
return False
|
|
154
|
+
else:
|
|
155
|
+
return True
|
|
123
156
|
|
|
124
157
|
|
|
125
158
|
def get_setup() -> dict | None:
|
|
@@ -243,23 +276,23 @@ def maybe_reexec(
|
|
|
243
276
|
bootstrap_path = os.path.join(tmpdir, 'bootstrap.py')
|
|
244
277
|
with open(bootstrap_path, 'w') as f:
|
|
245
278
|
f.write(textwrap.dedent(f"""
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
279
|
+
import sys
|
|
280
|
+
old_paths = set(sys.path)
|
|
281
|
+
for new_path in {sys.path!r}:
|
|
282
|
+
if new_path not in old_paths:
|
|
283
|
+
sys.path.insert(0, new_path)
|
|
284
|
+
|
|
285
|
+
_stderr_write = sys.stderr.write
|
|
286
|
+
def stderr_write(*args, **kwargs):
|
|
287
|
+
code = sys._getframe(1).f_code
|
|
288
|
+
if code is not None and code.co_filename and code.co_filename.endswith('/pydev_log.py'):
|
|
289
|
+
return
|
|
290
|
+
_stderr_write(*args, **kwargs)
|
|
291
|
+
sys.stderr.write = stderr_write
|
|
292
|
+
|
|
293
|
+
sys.argv = {args[1:]!r}
|
|
294
|
+
import runpy
|
|
295
|
+
runpy.run_path({args[1]!r}, run_name='__main__')
|
|
263
296
|
"""))
|
|
264
297
|
args = [args[0], bootstrap_path]
|
|
265
298
|
|
|
@@ -272,29 +305,14 @@ def debug_unhandled_exception(exc_info: ta.Any = None) -> None:
|
|
|
272
305
|
|
|
273
306
|
try:
|
|
274
307
|
import pydevd
|
|
275
|
-
from pydevd import pydevd_tracing
|
|
276
308
|
|
|
277
309
|
except ImportError:
|
|
278
310
|
return
|
|
279
311
|
|
|
280
|
-
|
|
281
|
-
frames = []
|
|
282
|
-
while traceback:
|
|
283
|
-
frames.append(traceback.tb_frame)
|
|
284
|
-
traceback = traceback.tb_next
|
|
285
|
-
|
|
286
|
-
thread = threading.current_thread()
|
|
287
|
-
frames_by_id = {id(frame): frame for frame in frames}
|
|
288
|
-
frame = frames[-1]
|
|
289
|
-
exception = (exctype, value, traceback)
|
|
290
|
-
|
|
291
|
-
if hasattr(thread, 'additional_info'):
|
|
292
|
-
thread.additional_info.pydev_message = 'server exception'
|
|
293
|
-
try:
|
|
294
|
-
debugger = pydevd.debugger # noqa
|
|
295
|
-
except AttributeError:
|
|
296
|
-
debugger = pydevd.get_global_debugger() # noqa
|
|
312
|
+
et, e, tb = exc_info
|
|
297
313
|
|
|
298
|
-
|
|
314
|
+
while tb.tb_next is not None:
|
|
315
|
+
tb = tb.tb_next
|
|
316
|
+
original_frame = tb.tb_frame
|
|
299
317
|
|
|
300
|
-
|
|
318
|
+
pydevd.settrace(stop_at_frame=original_frame, suspend=True)
|
|
@@ -17,7 +17,6 @@ def _attach(repl):
|
|
|
17
17
|
import ast
|
|
18
18
|
import codeop
|
|
19
19
|
import errno
|
|
20
|
-
import logging
|
|
21
20
|
import socket as sock
|
|
22
21
|
import sys
|
|
23
22
|
import threading
|
|
@@ -26,9 +25,10 @@ import types
|
|
|
26
25
|
import typing as ta
|
|
27
26
|
|
|
28
27
|
from ... import check
|
|
28
|
+
from ...logs import all as logs
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
log =
|
|
31
|
+
log = logs.get_module_logger(globals())
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
##
|
|
@@ -173,7 +173,7 @@ class InteractiveSocketConsole:
|
|
|
173
173
|
|
|
174
174
|
# Case 3 (complete)
|
|
175
175
|
try:
|
|
176
|
-
node = ast.parse(source)
|
|
176
|
+
node = ast.parse(source)
|
|
177
177
|
except (OverflowError, SyntaxError, ValueError):
|
|
178
178
|
return True
|
|
179
179
|
|
omlish/diag/replserver/server.py
CHANGED
|
@@ -22,7 +22,6 @@ socat - UNIX-CONNECT:repl.sock
|
|
|
22
22
|
"""
|
|
23
23
|
import contextlib
|
|
24
24
|
import functools
|
|
25
|
-
import logging
|
|
26
25
|
import os
|
|
27
26
|
import socket as sock
|
|
28
27
|
import threading
|
|
@@ -31,10 +30,11 @@ import weakref
|
|
|
31
30
|
|
|
32
31
|
from ... import check
|
|
33
32
|
from ... import dataclasses as dc
|
|
33
|
+
from ...logs import all as logs
|
|
34
34
|
from .console import InteractiveSocketConsole
|
|
35
35
|
|
|
36
36
|
|
|
37
|
-
log =
|
|
37
|
+
log = logs.get_module_logger(globals())
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
##
|
omlish/dispatch/__init__.py
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
from .. import lang as _lang
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
with _lang.auto_proxy_init(globals()):
|
|
5
|
+
##
|
|
6
|
+
|
|
7
|
+
from .dispatch import ( # noqa
|
|
8
|
+
Dispatcher,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
from .functions import ( # noqa
|
|
12
|
+
function,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
from .methods import ( # noqa
|
|
16
|
+
install_method,
|
|
17
|
+
method,
|
|
18
|
+
)
|
omlish/dispatch/methods.py
CHANGED
|
@@ -4,13 +4,11 @@ TODO:
|
|
|
4
4
|
- ALT: A.f(super(), ... ? :/
|
|
5
5
|
- classmethod/staticmethod
|
|
6
6
|
"""
|
|
7
|
-
import contextlib
|
|
8
7
|
import functools
|
|
9
8
|
import typing as ta
|
|
10
|
-
import weakref
|
|
11
9
|
|
|
12
10
|
from .. import check
|
|
13
|
-
from .. import
|
|
11
|
+
from .. import collections as col
|
|
14
12
|
from .dispatch import Dispatcher
|
|
15
13
|
from .impls import get_impl_func_cls_set
|
|
16
14
|
|
|
@@ -34,9 +32,8 @@ class Method(ta.Generic[P, R]):
|
|
|
34
32
|
it must be explicitly `@register`'ed itself. This is a feature, allowing for selective de-registration of
|
|
35
33
|
implementations in subclasses via name shadowing.
|
|
36
34
|
|
|
37
|
-
Methods
|
|
38
|
-
|
|
39
|
-
visitors.
|
|
35
|
+
Methods can choose to allow external installation of implementations outside of direct subclasses. This is to be
|
|
36
|
+
used *extremely* rarely - basically only in the rare case of externally extensible type hierarchies with visitors.
|
|
40
37
|
"""
|
|
41
38
|
|
|
42
39
|
def __init__(
|
|
@@ -45,6 +42,7 @@ class Method(ta.Generic[P, R]):
|
|
|
45
42
|
*,
|
|
46
43
|
installable: bool = False,
|
|
47
44
|
requires_override: bool = False,
|
|
45
|
+
instance_cache: bool = False,
|
|
48
46
|
) -> None:
|
|
49
47
|
super().__init__()
|
|
50
48
|
|
|
@@ -53,9 +51,16 @@ class Method(ta.Generic[P, R]):
|
|
|
53
51
|
|
|
54
52
|
self._func = func
|
|
55
53
|
self._installable = installable
|
|
56
|
-
self.
|
|
54
|
+
self._instance_cache = instance_cache
|
|
57
55
|
|
|
58
|
-
self.
|
|
56
|
+
self._registry: col.AttrRegistry[ta.Callable, Method._Entry] = col.AttrRegistry(
|
|
57
|
+
requires_override=requires_override,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
self._cache: col.AttrRegistryCache[ta.Callable, Method._Entry, ta.Callable] = col.AttrRegistryCache(
|
|
61
|
+
self._registry,
|
|
62
|
+
self._prepare,
|
|
63
|
+
)
|
|
59
64
|
|
|
60
65
|
# bpo-45678: special-casing for classmethod/staticmethod in Python <=3.9, as functools.update_wrapper doesn't
|
|
61
66
|
# work properly in singledispatchmethod.__get__ if it is applied to an unbound classmethod/staticmethod
|
|
@@ -68,19 +73,12 @@ class Method(ta.Generic[P, R]):
|
|
|
68
73
|
self._is_abstractmethod = getattr(func, '__isabstractmethod__', False) # noqa
|
|
69
74
|
self.update_wrapper(self)
|
|
70
75
|
|
|
71
|
-
self._dispatch_func_cache: dict[ta.Any, ta.Callable] = {}
|
|
72
|
-
|
|
73
|
-
def dispatch_func_cache_remove(k, self_ref=weakref.ref(self)):
|
|
74
|
-
if (ref_self := self_ref()) is not None:
|
|
75
|
-
cache = ref_self._dispatch_func_cache # noqa
|
|
76
|
-
with contextlib.suppress(KeyError):
|
|
77
|
-
del cache[k]
|
|
78
|
-
|
|
79
|
-
self._dispatch_func_cache_remove = dispatch_func_cache_remove
|
|
80
|
-
|
|
81
76
|
self._owner: type | None = None
|
|
82
77
|
self._name: str | None = None
|
|
83
78
|
|
|
79
|
+
class _Entry:
|
|
80
|
+
cls_set: frozenset[type]
|
|
81
|
+
|
|
84
82
|
def __set_name__(self, owner, name):
|
|
85
83
|
if self._owner is None:
|
|
86
84
|
self._owner = owner
|
|
@@ -102,83 +100,29 @@ class Method(ta.Generic[P, R]):
|
|
|
102
100
|
|
|
103
101
|
def register(self, impl: T, cls_set: frozenset[type] | None = None) -> T:
|
|
104
102
|
check.callable(impl)
|
|
105
|
-
if impl not in self._impls:
|
|
106
|
-
self._impls[impl] = cls_set # type: ignore
|
|
107
|
-
self._dispatch_func_cache.clear()
|
|
108
|
-
|
|
109
|
-
return impl
|
|
110
|
-
|
|
111
|
-
def _is_impl(self, obj: ta.Any) -> bool:
|
|
112
|
-
try:
|
|
113
|
-
hash(obj)
|
|
114
|
-
except TypeError:
|
|
115
|
-
return False
|
|
116
|
-
|
|
117
|
-
return obj in self._impls
|
|
118
103
|
|
|
119
|
-
|
|
120
|
-
if
|
|
121
|
-
|
|
104
|
+
entry = Method._Entry()
|
|
105
|
+
if cls_set is not None:
|
|
106
|
+
entry.cls_set = cls_set
|
|
122
107
|
|
|
123
|
-
|
|
124
|
-
try:
|
|
125
|
-
mro_pos = mro.index(owner_cls)
|
|
126
|
-
except ValueError:
|
|
127
|
-
raise TypeError(f'Owner class {owner_cls} not in mro of instance class {instance_cls}') from None
|
|
108
|
+
self._registry.register(ta.cast(ta.Callable, impl), entry)
|
|
128
109
|
|
|
129
|
-
|
|
130
|
-
for cur_cls in mro[:mro_pos + 1]:
|
|
131
|
-
for att, obj in cur_cls.__dict__.items():
|
|
132
|
-
if att not in mro_dct:
|
|
133
|
-
if not self._is_impl(obj):
|
|
134
|
-
continue
|
|
135
|
-
|
|
136
|
-
try:
|
|
137
|
-
lst = mro_dct[att]
|
|
138
|
-
except KeyError:
|
|
139
|
-
lst = mro_dct[att] = []
|
|
140
|
-
lst.append((cur_cls, obj))
|
|
141
|
-
|
|
142
|
-
#
|
|
110
|
+
return impl
|
|
143
111
|
|
|
112
|
+
def _build_dispatcher(self, collected: ta.Mapping[str, tuple[ta.Callable, _Entry]]) -> Dispatcher[str]:
|
|
144
113
|
disp: Dispatcher[str] = Dispatcher()
|
|
145
114
|
|
|
146
|
-
|
|
147
|
-
for att, lst in mro_dct.items():
|
|
148
|
-
if not lst:
|
|
149
|
-
raise RuntimeError
|
|
150
|
-
_, obj = lst[-1]
|
|
151
|
-
|
|
152
|
-
if len(lst) > 1:
|
|
153
|
-
if self._requires_override and not lang.is_override(obj):
|
|
154
|
-
raise lang.RequiresOverrideError(
|
|
155
|
-
att,
|
|
156
|
-
instance_cls,
|
|
157
|
-
lst[-1][0],
|
|
158
|
-
lst[0][0],
|
|
159
|
-
)
|
|
160
|
-
|
|
161
|
-
if not self._is_impl(obj):
|
|
162
|
-
continue
|
|
163
|
-
|
|
164
|
-
cls_set = self._impls[obj]
|
|
165
|
-
if cls_set is None:
|
|
166
|
-
cls_set = get_impl_func_cls_set(obj, arg_offset=1)
|
|
167
|
-
self._impls[obj] = cls_set
|
|
168
|
-
|
|
115
|
+
for a, (f, e) in collected.items():
|
|
169
116
|
try:
|
|
170
|
-
|
|
171
|
-
except
|
|
172
|
-
|
|
173
|
-
else:
|
|
174
|
-
raise TypeError(f'Duplicate impl: {owner_cls} {instance_cls} {att} {ex_att}')
|
|
175
|
-
seen[obj] = att
|
|
117
|
+
cls_set = e.cls_set
|
|
118
|
+
except AttributeError:
|
|
119
|
+
cls_set = e.cls_set = get_impl_func_cls_set(f, arg_offset=1)
|
|
176
120
|
|
|
177
|
-
disp.register(
|
|
121
|
+
disp.register(a, cls_set)
|
|
178
122
|
|
|
179
123
|
return disp
|
|
180
124
|
|
|
181
|
-
def
|
|
125
|
+
def _build_dispatch_func(self, disp: Dispatcher[str]) -> ta.Callable:
|
|
182
126
|
dispatch = disp.dispatch
|
|
183
127
|
type_ = type
|
|
184
128
|
getattr_ = getattr
|
|
@@ -190,25 +134,16 @@ class Method(ta.Generic[P, R]):
|
|
|
190
134
|
raise TypeError(f'{func_name} requires at least 1 positional argument')
|
|
191
135
|
|
|
192
136
|
if (impl_att := dispatch(type_(args[0]))) is not None:
|
|
193
|
-
|
|
194
|
-
return fn(*args, **kwargs)
|
|
137
|
+
return getattr_(self, impl_att)(*args, **kwargs)
|
|
195
138
|
|
|
196
139
|
return base_func.__get__(self)(*args, **kwargs) # noqa
|
|
197
140
|
|
|
198
141
|
self.update_wrapper(__call__)
|
|
199
142
|
return __call__
|
|
200
143
|
|
|
201
|
-
def
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
return self._dispatch_func_cache[cls_ref]
|
|
205
|
-
except KeyError:
|
|
206
|
-
pass
|
|
207
|
-
del cls_ref
|
|
208
|
-
|
|
209
|
-
att_disp = self.build_attr_dispatcher(instance_cls)
|
|
210
|
-
func = self.build_dispatch_func(att_disp)
|
|
211
|
-
self._dispatch_func_cache[weakref.ref(instance_cls, self._dispatch_func_cache_remove)] = func
|
|
144
|
+
def _prepare(self, instance_cls: type, collected: ta.Mapping[str, tuple[ta.Callable, _Entry]]) -> ta.Callable:
|
|
145
|
+
disp = self._build_dispatcher(collected)
|
|
146
|
+
func = self._build_dispatch_func(disp)
|
|
212
147
|
return func
|
|
213
148
|
|
|
214
149
|
def __get__(self, instance, owner=None):
|
|
@@ -216,16 +151,21 @@ class Method(ta.Generic[P, R]):
|
|
|
216
151
|
# FIXME: classmethod/staticmethod
|
|
217
152
|
return self
|
|
218
153
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
154
|
+
if self._instance_cache:
|
|
155
|
+
try:
|
|
156
|
+
return instance.__dict__[self._name]
|
|
157
|
+
except KeyError:
|
|
158
|
+
pass
|
|
159
|
+
|
|
160
|
+
bound = self._cache.get(type(instance)).__get__(instance, owner) # noqa
|
|
161
|
+
|
|
162
|
+
if self._instance_cache:
|
|
163
|
+
instance.__dict__[self._name] = bound
|
|
164
|
+
|
|
165
|
+
return bound
|
|
225
166
|
|
|
226
167
|
def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R:
|
|
227
168
|
instance, *rest = args
|
|
228
|
-
instance_cls = type(instance)
|
|
229
169
|
|
|
230
170
|
# if instance_cls is super:
|
|
231
171
|
# owner = instance.__self_class__.__mro__[instance.__self_class__.__mro__.index(instance.__thisclass__) + 1]
|
|
@@ -233,55 +173,25 @@ class Method(ta.Generic[P, R]):
|
|
|
233
173
|
# func = self.build_dispatch_func(att_disp)
|
|
234
174
|
# return func.__get__(instance, instance.__thisclass__)(*rest, **kwargs)
|
|
235
175
|
|
|
236
|
-
|
|
237
|
-
func = self._dispatch_func_cache[weakref.ref(instance_cls)]
|
|
238
|
-
except KeyError:
|
|
239
|
-
func = self.get_dispatch_func(instance_cls)
|
|
240
|
-
return func.__get__(instance)(*rest, **kwargs) # noqa
|
|
176
|
+
return self.__get__(instance)(*rest, **kwargs)
|
|
241
177
|
|
|
242
178
|
|
|
243
179
|
##
|
|
244
180
|
|
|
245
181
|
|
|
246
|
-
@ta.overload
|
|
247
|
-
def method(
|
|
248
|
-
func: ta.Callable[P, R],
|
|
249
|
-
/,
|
|
250
|
-
*,
|
|
251
|
-
installable: bool = False,
|
|
252
|
-
requires_override: bool = False,
|
|
253
|
-
) -> Method[P, R]: # noqa
|
|
254
|
-
...
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
@ta.overload
|
|
258
182
|
def method(
|
|
259
|
-
func: None = None,
|
|
260
|
-
/,
|
|
261
183
|
*,
|
|
262
184
|
installable: bool = False,
|
|
263
185
|
requires_override: bool = False,
|
|
186
|
+
instance_cache: bool = False,
|
|
264
187
|
) -> ta.Callable[[ta.Callable[P, R]], Method[P, R]]: # noqa
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
def method(
|
|
269
|
-
func=None,
|
|
270
|
-
/,
|
|
271
|
-
*,
|
|
272
|
-
installable=False,
|
|
273
|
-
requires_override=False,
|
|
274
|
-
):
|
|
275
|
-
kw = dict(
|
|
188
|
+
return functools.partial(
|
|
189
|
+
Method, # type: ignore[arg-type]
|
|
276
190
|
installable=installable,
|
|
277
191
|
requires_override=requires_override,
|
|
192
|
+
instance_cache=instance_cache,
|
|
278
193
|
)
|
|
279
194
|
|
|
280
|
-
if func is None:
|
|
281
|
-
return functools.partial(Method, **kw)
|
|
282
|
-
|
|
283
|
-
return Method(func, **kw)
|
|
284
|
-
|
|
285
195
|
|
|
286
196
|
#
|
|
287
197
|
|
|
@@ -305,7 +215,7 @@ def install_method(
|
|
|
305
215
|
if on is None:
|
|
306
216
|
cls = owner
|
|
307
217
|
else:
|
|
308
|
-
cls = check.issubclass(on, owner)
|
|
218
|
+
cls = check.issubclass(on, owner) # noqa
|
|
309
219
|
|
|
310
220
|
check.arg(not hasattr(cls, a))
|
|
311
221
|
setattr(cls, a, fn)
|
omlish/dom/rendering.py
CHANGED
omlish/formats/dotenv.py
CHANGED
|
@@ -27,7 +27,6 @@ import abc
|
|
|
27
27
|
import codecs
|
|
28
28
|
import contextlib
|
|
29
29
|
import io
|
|
30
|
-
import logging
|
|
31
30
|
import os
|
|
32
31
|
import pathlib
|
|
33
32
|
import re
|
|
@@ -36,6 +35,7 @@ import tempfile
|
|
|
36
35
|
import typing as ta
|
|
37
36
|
|
|
38
37
|
from ..lite.abstract import Abstract
|
|
38
|
+
from ..logs.protocols import LoggerLike
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
##
|
|
@@ -312,7 +312,7 @@ def parse_dotenv_stream(stream: ta.IO[str]) -> ta.Iterator[DotenvBinding]:
|
|
|
312
312
|
|
|
313
313
|
def _dotenv_with_warn_for_invalid_lines(
|
|
314
314
|
mappings: ta.Iterator[DotenvBinding],
|
|
315
|
-
log: ta.Optional[
|
|
315
|
+
log: ta.Optional[LoggerLike] = None,
|
|
316
316
|
) -> ta.Iterator[DotenvBinding]:
|
|
317
317
|
for mapping in mappings:
|
|
318
318
|
if mapping.error:
|
|
@@ -337,7 +337,7 @@ class Dotenv:
|
|
|
337
337
|
interpolate: bool = True,
|
|
338
338
|
override: bool = True,
|
|
339
339
|
env: ta.Optional[ta.Mapping[str, str]] = None,
|
|
340
|
-
log: ta.Optional[
|
|
340
|
+
log: ta.Optional[LoggerLike] = None,
|
|
341
341
|
) -> None:
|
|
342
342
|
super().__init__()
|
|
343
343
|
|
|
@@ -415,7 +415,7 @@ def dotenv_get_key(
|
|
|
415
415
|
key_to_get: str,
|
|
416
416
|
*,
|
|
417
417
|
encoding: ta.Optional[str] = 'utf-8',
|
|
418
|
-
log: ta.Optional[
|
|
418
|
+
log: ta.Optional[LoggerLike] = None,
|
|
419
419
|
) -> ta.Optional[str]:
|
|
420
420
|
"""
|
|
421
421
|
Get the value of a given key from the given .env.
|
|
@@ -461,7 +461,7 @@ def dotenv_set_key(
|
|
|
461
461
|
quote_mode: str = 'always',
|
|
462
462
|
export: bool = False,
|
|
463
463
|
encoding: ta.Optional[str] = 'utf-8',
|
|
464
|
-
log: ta.Optional[
|
|
464
|
+
log: ta.Optional[LoggerLike] = None,
|
|
465
465
|
) -> ta.Tuple[ta.Optional[bool], str, str]:
|
|
466
466
|
"""
|
|
467
467
|
Adds or Updates a key/value to the given .env
|
|
@@ -511,7 +511,7 @@ def dotenv_unset_key(
|
|
|
511
511
|
*,
|
|
512
512
|
quote_mode: str = 'always',
|
|
513
513
|
encoding: ta.Optional[str] = 'utf-8',
|
|
514
|
-
log: ta.Optional[
|
|
514
|
+
log: ta.Optional[LoggerLike] = None,
|
|
515
515
|
) -> ta.Tuple[ta.Optional[bool], str]:
|
|
516
516
|
"""
|
|
517
517
|
Removes a given key from the given `.env` file.
|
|
@@ -575,7 +575,7 @@ def dotenv_values(
|
|
|
575
575
|
interpolate: bool = True,
|
|
576
576
|
encoding: ta.Optional[str] = 'utf-8',
|
|
577
577
|
env: ta.Optional[ta.Mapping[str, str]] = None,
|
|
578
|
-
log: ta.Optional[
|
|
578
|
+
log: ta.Optional[LoggerLike] = None,
|
|
579
579
|
) -> ta.Dict[str, ta.Optional[str]]:
|
|
580
580
|
"""
|
|
581
581
|
Parse a .env file and return its content as a dict.
|
|
@@ -584,7 +584,7 @@ def dotenv_values(
|
|
|
584
584
|
For example, `foo=bar` results in `{"foo": "bar"}` whereas `foo` alone results in
|
|
585
585
|
`{"foo": None}`
|
|
586
586
|
|
|
587
|
-
|
|
587
|
+
Args:
|
|
588
588
|
path: Absolute or relative path to the .env file.
|
|
589
589
|
stream: `StringIO` object with .env content, used if `path` is `None`.
|
|
590
590
|
verbose: Whether to output a warning if the .env file is missing.
|
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A generator powered, configurable, mostly fully streaming JSON parser.
|
|
3
|
+
|
|
4
|
+
Regarding the 'streamyness' of the subsystems:
|
|
5
|
+
- Lexing only buffers for string and number literals.
|
|
6
|
+
- Parsing maintains only a stack that scales by nesting depth.
|
|
7
|
+
- Building values will obviously hold everything under the topmost object it's building until it's finished.
|
|
8
|
+
|
|
9
|
+
It's reasonably optimized, but performance is not a primary or even secondary goal: its goal is flexibility. If speed
|
|
10
|
+
matters use a native library.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
|
|
1
14
|
from .building import ( # noqa
|
|
2
15
|
JsonValueBuilder,
|
|
3
16
|
)
|
|
@@ -8,6 +21,7 @@ from .errors import ( # noqa
|
|
|
8
21
|
|
|
9
22
|
|
|
10
23
|
from .lexing import ( # noqa
|
|
24
|
+
IdentTokenKind,
|
|
11
25
|
ValueTokenKind,
|
|
12
26
|
VALUE_TOKEN_KINDS,
|
|
13
27
|
ControlTokenKind,
|
|
@@ -22,7 +36,7 @@ from .lexing import ( # noqa
|
|
|
22
36
|
Token,
|
|
23
37
|
|
|
24
38
|
CONTROL_TOKENS,
|
|
25
|
-
|
|
39
|
+
CONST_IDENT_VALUES,
|
|
26
40
|
|
|
27
41
|
JsonStreamLexError,
|
|
28
42
|
JsonStreamLexer,
|
|
@@ -35,8 +49,8 @@ from .parsing import ( # noqa
|
|
|
35
49
|
BeginArray,
|
|
36
50
|
EndArray,
|
|
37
51
|
|
|
38
|
-
|
|
39
|
-
|
|
52
|
+
Event,
|
|
53
|
+
Events,
|
|
40
54
|
|
|
41
55
|
yield_parser_events,
|
|
42
56
|
|
|
@@ -54,4 +68,5 @@ from .utils import ( # noqa
|
|
|
54
68
|
|
|
55
69
|
stream_parse_values,
|
|
56
70
|
stream_parse_one_value,
|
|
71
|
+
stream_parse_exactly_one_value,
|
|
57
72
|
)
|
|
@@ -5,8 +5,8 @@ from .parsing import BeginArray
|
|
|
5
5
|
from .parsing import BeginObject
|
|
6
6
|
from .parsing import EndArray
|
|
7
7
|
from .parsing import EndObject
|
|
8
|
+
from .parsing import Event
|
|
8
9
|
from .parsing import JsonStreamObject
|
|
9
|
-
from .parsing import JsonStreamParserEvent
|
|
10
10
|
from .parsing import Key
|
|
11
11
|
|
|
12
12
|
|
|
@@ -62,7 +62,7 @@ class JsonValueBuilder:
|
|
|
62
62
|
else:
|
|
63
63
|
raise self.StateError
|
|
64
64
|
|
|
65
|
-
def __call__(self, e:
|
|
65
|
+
def __call__(self, e: Event) -> ta.Iterable[ta.Any]:
|
|
66
66
|
stk = self._stack
|
|
67
67
|
|
|
68
68
|
#
|