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
|
@@ -4,6 +4,7 @@ import typing as ta
|
|
|
4
4
|
from .... import lang
|
|
5
5
|
from ....funcs.genmachine import GenMachine
|
|
6
6
|
from .errors import JsonStreamError
|
|
7
|
+
from .lexing import CONST_IDENT_VALUES
|
|
7
8
|
from .lexing import SCALAR_VALUE_TYPES
|
|
8
9
|
from .lexing import VALUE_TOKEN_KINDS
|
|
9
10
|
from .lexing import Position
|
|
@@ -34,7 +35,7 @@ class EndArray(lang.Marker):
|
|
|
34
35
|
pass
|
|
35
36
|
|
|
36
37
|
|
|
37
|
-
|
|
38
|
+
Event: ta.TypeAlias = ta.Union[ # noqa
|
|
38
39
|
type[BeginObject],
|
|
39
40
|
Key,
|
|
40
41
|
type[EndObject],
|
|
@@ -46,7 +47,7 @@ JsonStreamParserEvent: ta.TypeAlias = ta.Union[ # noqa
|
|
|
46
47
|
]
|
|
47
48
|
|
|
48
49
|
|
|
49
|
-
class
|
|
50
|
+
class Events(lang.Namespace):
|
|
50
51
|
BeginObject = BeginObject
|
|
51
52
|
Key = Key
|
|
52
53
|
EndObject = EndObject
|
|
@@ -58,7 +59,7 @@ class JsonStreamParserEvents(lang.Namespace):
|
|
|
58
59
|
##
|
|
59
60
|
|
|
60
61
|
|
|
61
|
-
def yield_parser_events(obj: ta.Any) -> ta.
|
|
62
|
+
def yield_parser_events(obj: ta.Any) -> ta.Iterator[Event]:
|
|
62
63
|
if isinstance(obj, SCALAR_VALUE_TYPES):
|
|
63
64
|
yield obj # type: ignore
|
|
64
65
|
|
|
@@ -94,19 +95,29 @@ class JsonStreamObject(list):
|
|
|
94
95
|
return f'{self.__class__.__name__}({super().__repr__()})'
|
|
95
96
|
|
|
96
97
|
|
|
97
|
-
class JsonStreamParser(GenMachine[Token,
|
|
98
|
-
def __init__(
|
|
99
|
-
|
|
98
|
+
class JsonStreamParser(GenMachine[Token, Event]):
|
|
99
|
+
def __init__(
|
|
100
|
+
self,
|
|
101
|
+
*,
|
|
102
|
+
allow_trailing_commas: bool = False,
|
|
103
|
+
|
|
104
|
+
allow_extended_idents: bool = False,
|
|
105
|
+
) -> None:
|
|
106
|
+
self._allow_trailing_commas = allow_trailing_commas
|
|
107
|
+
|
|
108
|
+
self._allow_extended_idents = allow_extended_idents
|
|
100
109
|
|
|
101
110
|
self._stack: list[ta.Literal['OBJECT', 'KEY', 'ARRAY']] = []
|
|
102
111
|
|
|
112
|
+
super().__init__(self._do_value())
|
|
113
|
+
|
|
103
114
|
#
|
|
104
115
|
|
|
105
116
|
def _next_tok(self):
|
|
106
117
|
while True:
|
|
107
118
|
tok = yield None
|
|
108
119
|
|
|
109
|
-
if tok.kind != 'SPACE':
|
|
120
|
+
if tok.kind != 'SPACE' and tok.kind != 'COMMENT':
|
|
110
121
|
return tok
|
|
111
122
|
|
|
112
123
|
#
|
|
@@ -144,12 +155,23 @@ class JsonStreamParser(GenMachine[Token, JsonStreamParserEvent]):
|
|
|
144
155
|
raise JsonStreamParseError('Expected value') from None
|
|
145
156
|
else:
|
|
146
157
|
raise
|
|
158
|
+
# except Exception as e:
|
|
159
|
+
# raise
|
|
147
160
|
|
|
148
161
|
if tok.kind in VALUE_TOKEN_KINDS:
|
|
149
162
|
y, r = self._emit_event(tok.value)
|
|
150
163
|
yield y
|
|
151
164
|
return r
|
|
152
165
|
|
|
166
|
+
elif tok.kind == 'IDENT':
|
|
167
|
+
try:
|
|
168
|
+
cv = CONST_IDENT_VALUES[tok.value]
|
|
169
|
+
except KeyError:
|
|
170
|
+
raise JsonStreamParseError('Expected value', tok.pos) from None
|
|
171
|
+
y, r = self._emit_event(cv)
|
|
172
|
+
yield y
|
|
173
|
+
return r
|
|
174
|
+
|
|
153
175
|
elif tok.kind == 'LBRACE':
|
|
154
176
|
y, r = self._emit_begin_object()
|
|
155
177
|
yield y
|
|
@@ -193,7 +215,7 @@ class JsonStreamParser(GenMachine[Token, JsonStreamParserEvent]):
|
|
|
193
215
|
except GeneratorExit:
|
|
194
216
|
raise JsonStreamParseError('Expected object body') from None
|
|
195
217
|
|
|
196
|
-
if tok.kind == 'STRING':
|
|
218
|
+
if tok.kind == 'STRING' or (self._allow_trailing_commas and tok.kind == 'IDENT'):
|
|
197
219
|
k = tok.value
|
|
198
220
|
|
|
199
221
|
try:
|
|
@@ -225,7 +247,7 @@ class JsonStreamParser(GenMachine[Token, JsonStreamParserEvent]):
|
|
|
225
247
|
raise JsonStreamParseError('Expected continuation') from None
|
|
226
248
|
|
|
227
249
|
if tok.kind == 'COMMA':
|
|
228
|
-
return self._do_object_body(must_be_present=
|
|
250
|
+
return self._do_object_body(must_be_present=not self._allow_trailing_commas)
|
|
229
251
|
|
|
230
252
|
elif tok.kind == 'RBRACE':
|
|
231
253
|
y, r = self._emit_end_object()
|
|
@@ -258,7 +280,7 @@ class JsonStreamParser(GenMachine[Token, JsonStreamParserEvent]):
|
|
|
258
280
|
raise JsonStreamParseError('Expected continuation') from None
|
|
259
281
|
|
|
260
282
|
if tok.kind == 'COMMA':
|
|
261
|
-
return self._do_value(must_be_present=
|
|
283
|
+
return self._do_value(must_be_present=not self._allow_trailing_commas)
|
|
262
284
|
|
|
263
285
|
elif tok.kind == 'RBRACKET':
|
|
264
286
|
y, r = self._emit_end_array()
|
|
@@ -7,14 +7,14 @@ from .parsing import BeginArray
|
|
|
7
7
|
from .parsing import BeginObject
|
|
8
8
|
from .parsing import EndArray
|
|
9
9
|
from .parsing import EndObject
|
|
10
|
-
from .parsing import
|
|
10
|
+
from .parsing import Event
|
|
11
11
|
from .parsing import Key
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
##
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
class StreamJsonRenderer(AbstractJsonRenderer[ta.Iterable[
|
|
17
|
+
class StreamJsonRenderer(AbstractJsonRenderer[ta.Iterable[Event]]):
|
|
18
18
|
def __init__(
|
|
19
19
|
self,
|
|
20
20
|
*,
|
|
@@ -36,7 +36,7 @@ class StreamJsonRenderer(AbstractJsonRenderer[ta.Iterable[JsonStreamParserEvent]
|
|
|
36
36
|
self,
|
|
37
37
|
o: ta.Any,
|
|
38
38
|
state: AbstractJsonRenderer.State = AbstractJsonRenderer.State.VALUE,
|
|
39
|
-
) -> ta.
|
|
39
|
+
) -> ta.Iterator[str]:
|
|
40
40
|
if self._style is not None:
|
|
41
41
|
pre, post = self._style(o, state)
|
|
42
42
|
yield pre
|
|
@@ -52,7 +52,7 @@ class StreamJsonRenderer(AbstractJsonRenderer[ta.Iterable[JsonStreamParserEvent]
|
|
|
52
52
|
if post:
|
|
53
53
|
yield post
|
|
54
54
|
|
|
55
|
-
def _render(self, e:
|
|
55
|
+
def _render(self, e: Event) -> ta.Iterator[str]:
|
|
56
56
|
if self._need_delimit:
|
|
57
57
|
yield self._delimiter
|
|
58
58
|
self._need_delimit = False
|
|
@@ -124,12 +124,12 @@ class StreamJsonRenderer(AbstractJsonRenderer[ta.Iterable[JsonStreamParserEvent]
|
|
|
124
124
|
else:
|
|
125
125
|
raise TypeError(e)
|
|
126
126
|
|
|
127
|
-
def render(self, events: ta.Iterable[
|
|
127
|
+
def render(self, events: ta.Iterable[Event]) -> ta.Iterator[str]:
|
|
128
128
|
for e in events:
|
|
129
129
|
yield from self._render(e)
|
|
130
130
|
|
|
131
131
|
@classmethod
|
|
132
|
-
def render_str(cls, i: ta.Iterable[
|
|
132
|
+
def render_str(cls, i: ta.Iterable[Event], /, **kwargs: ta.Any) -> str:
|
|
133
133
|
out = io.StringIO()
|
|
134
134
|
for s in cls(**kwargs).render(i):
|
|
135
135
|
out.write(s)
|
|
@@ -1,56 +1,158 @@
|
|
|
1
|
-
|
|
1
|
+
r"""
|
|
2
|
+
TODO:
|
|
3
|
+
- gson switches
|
|
4
|
+
- Strictness.LEGACY_STRICT
|
|
5
|
+
- JsonReader allows the literals true, false and null to have any capitalization, for example fAlSe or NULL
|
|
6
|
+
- JsonReader supports the escape sequence \', representing a ' (single-quote)
|
|
7
|
+
- JsonReader supports the escape sequence \LF (with LF being the Unicode character U+000A), resulting in a LF within
|
|
8
|
+
the read JSON string
|
|
9
|
+
- JsonReader allows unescaped control characters (U+0000 through U+001F)
|
|
10
|
+
- Strictness.LENIENT
|
|
11
|
+
- In lenient mode, all input that is accepted in legacy strict mode is accepted in addition to the following
|
|
12
|
+
departures from RFC 8259:
|
|
13
|
+
- Streams that start with the non-execute prefix, ")]'\n"}
|
|
14
|
+
- Streams that include multiple top-level values. With legacy strict or strict parsing, each stream must contain
|
|
15
|
+
exactly one top-level value.
|
|
16
|
+
- Numbers may be NaNs or infinities represented by NaN and (-)Infinity respectively.
|
|
17
|
+
- End of line comments starting with // or # and ending with a newline character.
|
|
18
|
+
- C-style comments starting with /* and ending with */. Such comments may not be nested.
|
|
19
|
+
- Names that are unquoted or 'single quoted'.
|
|
20
|
+
- Strings that are unquoted or 'single quoted'.
|
|
21
|
+
- Array elements separated by ; instead of ,.
|
|
22
|
+
- Unnecessary array separators. These are interpreted as if null was the omitted value.
|
|
23
|
+
- Names and values separated by = or => instead of :.
|
|
24
|
+
- Name/value pairs separated by ; instead of ,.
|
|
25
|
+
"""
|
|
26
|
+
import itertools
|
|
2
27
|
import typing as ta
|
|
3
28
|
|
|
4
29
|
from .... import lang
|
|
5
30
|
from .building import JsonValueBuilder
|
|
31
|
+
from .errors import JsonStreamError
|
|
6
32
|
from .lexing import JsonStreamLexer
|
|
33
|
+
from .lexing import Token
|
|
34
|
+
from .parsing import Event
|
|
7
35
|
from .parsing import JsonStreamParser
|
|
8
36
|
|
|
9
37
|
|
|
10
38
|
##
|
|
11
39
|
|
|
12
40
|
|
|
13
|
-
@dc.dataclass(kw_only=True)
|
|
14
41
|
class JsonStreamValueParser(lang.ExitStacked):
|
|
15
|
-
|
|
16
|
-
|
|
42
|
+
class Machinery(ta.NamedTuple):
|
|
43
|
+
lex: JsonStreamLexer
|
|
44
|
+
parse: JsonStreamParser
|
|
45
|
+
build: JsonValueBuilder
|
|
17
46
|
|
|
18
|
-
|
|
47
|
+
def __init__(self, m: Machinery) -> None:
|
|
48
|
+
super().__init__()
|
|
49
|
+
|
|
50
|
+
self._m = m
|
|
19
51
|
|
|
20
|
-
|
|
21
|
-
_parse: JsonStreamParser = dc.field(init=False)
|
|
22
|
-
_build: JsonValueBuilder = dc.field(init=False)
|
|
52
|
+
#
|
|
23
53
|
|
|
24
54
|
def _enter_contexts(self) -> None:
|
|
25
|
-
self.
|
|
26
|
-
|
|
27
|
-
)
|
|
55
|
+
self._enter_context(self._m.lex)
|
|
56
|
+
self._enter_context(self._m.parse)
|
|
28
57
|
|
|
29
|
-
|
|
58
|
+
def feed(self, i: ta.Iterable[str]) -> ta.Iterator[ta.Any]:
|
|
59
|
+
for c in i:
|
|
60
|
+
for t in self._m.lex(c):
|
|
61
|
+
for e in self._m.parse(t):
|
|
62
|
+
for v in self._m.build(e): # noqa
|
|
63
|
+
yield v
|
|
30
64
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
65
|
+
#
|
|
66
|
+
|
|
67
|
+
@classmethod
|
|
68
|
+
def parse_values(
|
|
69
|
+
cls,
|
|
70
|
+
m: Machinery,
|
|
71
|
+
i: ta.Iterable[str],
|
|
72
|
+
) -> ta.Iterator[ta.Any]:
|
|
73
|
+
with cls(m) as p:
|
|
74
|
+
yield from p.feed(itertools.chain(i, ['']))
|
|
75
|
+
|
|
76
|
+
@classmethod
|
|
77
|
+
def parse_one_value(
|
|
78
|
+
cls,
|
|
79
|
+
m: Machinery,
|
|
80
|
+
i: ta.Iterable[str],
|
|
81
|
+
) -> ta.Any:
|
|
82
|
+
with cls(m) as p:
|
|
83
|
+
return next(p.feed(itertools.chain(i, [''])))
|
|
84
|
+
|
|
85
|
+
@classmethod
|
|
86
|
+
def parse_exactly_one_value(
|
|
87
|
+
cls,
|
|
88
|
+
m: Machinery,
|
|
89
|
+
i: ta.Iterable[str],
|
|
90
|
+
) -> ta.Any:
|
|
91
|
+
r: ta.Any
|
|
92
|
+
r = not_set = object()
|
|
93
|
+
with cls(m) as p:
|
|
94
|
+
for v in p.feed(itertools.chain(i, [''])):
|
|
95
|
+
if r is not_set:
|
|
96
|
+
r = v
|
|
97
|
+
else:
|
|
98
|
+
raise JsonStreamError('Unexpected input')
|
|
99
|
+
if r is not_set:
|
|
100
|
+
raise JsonStreamError('No value')
|
|
101
|
+
return r
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
##
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class DebugJsonStreamValueParser(JsonStreamValueParser):
|
|
108
|
+
def __init__(self, m: JsonStreamValueParser.Machinery) -> None:
|
|
109
|
+
super().__init__(m)
|
|
110
|
+
|
|
111
|
+
self._chars: list[str] = []
|
|
112
|
+
self._tokens: list[Token] = []
|
|
113
|
+
self._events: list[Event] = []
|
|
114
|
+
self._values: list[ta.Any] = []
|
|
34
115
|
|
|
35
116
|
def feed(self, i: ta.Iterable[str]) -> ta.Iterator[ta.Any]:
|
|
36
117
|
for c in i:
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
118
|
+
self._chars.append(c)
|
|
119
|
+
for t in self._m.lex(c):
|
|
120
|
+
self._tokens.append(t)
|
|
121
|
+
for e in self._m.parse(t):
|
|
122
|
+
self._events.append(e)
|
|
123
|
+
for v in self._m.build(e):
|
|
124
|
+
self._values.append(v)
|
|
40
125
|
yield v
|
|
41
126
|
|
|
42
127
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
128
|
+
##
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def make_machinery(
|
|
132
|
+
*,
|
|
133
|
+
include_raw: bool = False,
|
|
134
|
+
yield_object_lists: bool = False,
|
|
135
|
+
) -> JsonStreamValueParser.Machinery:
|
|
136
|
+
return JsonStreamValueParser.Machinery(
|
|
137
|
+
JsonStreamLexer(
|
|
138
|
+
include_raw=include_raw,
|
|
139
|
+
),
|
|
140
|
+
|
|
141
|
+
JsonStreamParser(),
|
|
142
|
+
|
|
143
|
+
JsonValueBuilder(
|
|
144
|
+
yield_object_lists=yield_object_lists,
|
|
145
|
+
),
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def stream_parse_values(i: ta.Iterable[str], **kwargs: ta.Any) -> ta.Iterator[ta.Any]:
|
|
150
|
+
return JsonStreamValueParser.parse_values(make_machinery(**kwargs), i)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def stream_parse_one_value(i: ta.Iterable[str], **kwargs: ta.Any) -> ta.Any:
|
|
154
|
+
return JsonStreamValueParser.parse_one_value(make_machinery(**kwargs), i)
|
|
49
155
|
|
|
50
156
|
|
|
51
|
-
def
|
|
52
|
-
|
|
53
|
-
**kwargs: ta.Any,
|
|
54
|
-
) -> ta.Any:
|
|
55
|
-
with JsonStreamValueParser(**kwargs) as p:
|
|
56
|
-
return next(p.feed(i))
|
|
157
|
+
def stream_parse_exactly_one_value(i: ta.Iterable[str], **kwargs: ta.Any) -> ta.Any:
|
|
158
|
+
return JsonStreamValueParser.parse_exactly_one_value(make_machinery(**kwargs), i)
|
omlish/formats/json5/literals.py
CHANGED
|
@@ -124,7 +124,10 @@ def parse_string_literal(s: str) -> str:
|
|
|
124
124
|
def parse_number_literal(s: str) -> int | float:
|
|
125
125
|
s = s.lower()
|
|
126
126
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
127
|
+
try:
|
|
128
|
+
if 'x' in s:
|
|
129
|
+
return int(s, 16)
|
|
130
|
+
else:
|
|
131
|
+
return float(s)
|
|
132
|
+
except ValueError as e:
|
|
133
|
+
raise Json5Error from e
|
omlish/formats/json5/parsing.py
CHANGED
|
@@ -1,100 +1,54 @@
|
|
|
1
|
-
# ruff: noqa: N802 N803
|
|
2
1
|
import typing as ta
|
|
3
2
|
|
|
4
|
-
from
|
|
5
|
-
from .
|
|
6
|
-
from .
|
|
7
|
-
from ._antlr.Json5Visitor import Json5Visitor # type: ignore
|
|
3
|
+
from ..json.stream.errors import JsonStreamError
|
|
4
|
+
from ..json.stream.utils import DebugJsonStreamValueParser
|
|
5
|
+
from ..json.stream.utils import JsonStreamValueParser
|
|
8
6
|
from .errors import Json5Error
|
|
9
|
-
from .
|
|
10
|
-
from .literals import parse_number_literal
|
|
11
|
-
from .literals import parse_string_literal
|
|
7
|
+
from .stream import make_machinery
|
|
12
8
|
|
|
13
9
|
|
|
14
10
|
##
|
|
15
11
|
|
|
16
12
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
def parse(
|
|
14
|
+
buf: str,
|
|
15
|
+
*,
|
|
16
|
+
debug: bool = False,
|
|
17
|
+
) -> ta.Any:
|
|
18
|
+
m = make_machinery()
|
|
20
19
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
if debug:
|
|
21
|
+
vc: type[JsonStreamValueParser] = DebugJsonStreamValueParser
|
|
22
|
+
else:
|
|
23
|
+
vc = JsonStreamValueParser
|
|
24
24
|
|
|
25
|
-
elif (i := ctx.IDENTIFIER()) is not None:
|
|
26
|
-
return parse_string_literal(''.join(['"', i.getText(), '"']))
|
|
27
|
-
|
|
28
|
-
elif (l := ctx.LITERAL()) is not None:
|
|
29
|
-
return LITERAL_VALUES[l.getText()]
|
|
30
|
-
|
|
31
|
-
elif (n := ctx.NUMERIC_LITERAL()) is not None:
|
|
32
|
-
return n.getText()
|
|
33
|
-
|
|
34
|
-
else:
|
|
35
|
-
raise RuntimeError(ctx)
|
|
36
|
-
|
|
37
|
-
def visitNumber(self, ctx: Json5Parser.NumberContext):
|
|
38
|
-
return parse_number_literal(ctx.getText())
|
|
39
|
-
|
|
40
|
-
def visitObj(self, ctx: Json5Parser.ObjContext):
|
|
41
|
-
dct: dict[ta.Any, ta.Any] = {}
|
|
42
|
-
for pair in ctx.pair():
|
|
43
|
-
key, value = self.visit(pair)
|
|
44
|
-
dct[key] = value
|
|
45
|
-
return dct
|
|
46
|
-
|
|
47
|
-
def visitPair(self, ctx: Json5Parser.PairContext):
|
|
48
|
-
key = self.visit(ctx.key())
|
|
49
|
-
value = self.visit(ctx.value())
|
|
50
|
-
return (key, value)
|
|
51
|
-
|
|
52
|
-
def visitValue(self, ctx: Json5Parser.ValueContext):
|
|
53
|
-
if (s := ctx.STRING()) is not None:
|
|
54
|
-
return parse_string_literal(s.getText())
|
|
55
|
-
|
|
56
|
-
elif (n := ctx.LITERAL()) is not None:
|
|
57
|
-
return LITERAL_VALUES[n.getText()]
|
|
58
|
-
|
|
59
|
-
else:
|
|
60
|
-
return super().visitChildren(ctx)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
def _make_parser(buf: str) -> Json5Parser:
|
|
64
|
-
return antlr.parsing.make_parser(
|
|
65
|
-
buf,
|
|
66
|
-
Json5Lexer,
|
|
67
|
-
Json5Parser,
|
|
68
|
-
silent_errors=True,
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
def parse(buf: str) -> ta.Any:
|
|
73
25
|
try:
|
|
74
|
-
|
|
26
|
+
return vc.parse_exactly_one_value(m, buf)
|
|
27
|
+
|
|
28
|
+
except Json5Error:
|
|
29
|
+
raise
|
|
75
30
|
|
|
76
|
-
except
|
|
31
|
+
except JsonStreamError as e:
|
|
77
32
|
raise Json5Error from e
|
|
78
33
|
|
|
79
|
-
if antlr.parsing.is_eof_context(root):
|
|
80
|
-
raise Json5Error('Empty input')
|
|
81
34
|
|
|
82
|
-
|
|
83
|
-
|
|
35
|
+
def parse_many(
|
|
36
|
+
buf: str,
|
|
37
|
+
*,
|
|
38
|
+
debug: bool = False,
|
|
39
|
+
) -> ta.Iterator[ta.Any]:
|
|
40
|
+
m = make_machinery()
|
|
84
41
|
|
|
42
|
+
if debug:
|
|
43
|
+
vc: type[JsonStreamValueParser] = DebugJsonStreamValueParser
|
|
44
|
+
else:
|
|
45
|
+
vc = JsonStreamValueParser
|
|
85
46
|
|
|
86
|
-
def parse_many(buf: str) -> ta.Generator[ta.Any]:
|
|
87
47
|
try:
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
while True:
|
|
91
|
-
if parser.getInputStream().LT(1).type == antlr.runtime.Token.EOF:
|
|
92
|
-
break
|
|
93
|
-
|
|
94
|
-
value = parser.value()
|
|
48
|
+
yield from vc.parse_values(m, buf)
|
|
95
49
|
|
|
96
|
-
|
|
97
|
-
|
|
50
|
+
except Json5Error:
|
|
51
|
+
raise
|
|
98
52
|
|
|
99
|
-
except
|
|
53
|
+
except JsonStreamError as e:
|
|
100
54
|
raise Json5Error from e
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Objects:
|
|
3
|
+
+ Object keys may be an ECMAScript 5.1 IdentifierName.
|
|
4
|
+
+ Objects may have a single trailing comma.
|
|
5
|
+
Arrays:
|
|
6
|
+
+ Arrays may have a single trailing comma.
|
|
7
|
+
Strings:
|
|
8
|
+
+ Strings may be single quoted.
|
|
9
|
+
+ Strings may span multiple lines by escaping new line characters.
|
|
10
|
+
+ Strings may include character escapes.
|
|
11
|
+
Numbers:
|
|
12
|
+
+ Numbers may be hexadecimal.
|
|
13
|
+
+ Numbers may have a leading or trailing decimal point.
|
|
14
|
+
+ Numbers may be IEEE 754 positive infinity, negative infinity, and NaN.
|
|
15
|
+
+ Numbers may begin with an explicit plus sign.
|
|
16
|
+
Comments:
|
|
17
|
+
+ Single and multi-line comments are allowed.
|
|
18
|
+
White Space:
|
|
19
|
+
+ Additional white space characters are allowed.
|
|
20
|
+
"""
|
|
21
|
+
import typing as ta
|
|
22
|
+
|
|
23
|
+
from ..json.stream.building import JsonValueBuilder
|
|
24
|
+
from ..json.stream.lexing import JsonStreamLexer
|
|
25
|
+
from ..json.stream.parsing import JsonStreamParser
|
|
26
|
+
from ..json.stream.utils import JsonStreamValueParser
|
|
27
|
+
from .literals import parse_number_literal
|
|
28
|
+
from .literals import parse_string_literal
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
##
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def make_machinery(
|
|
35
|
+
*,
|
|
36
|
+
include_raw: bool = False,
|
|
37
|
+
yield_object_lists: bool = False,
|
|
38
|
+
) -> JsonStreamValueParser.Machinery:
|
|
39
|
+
return JsonStreamValueParser.Machinery(
|
|
40
|
+
JsonStreamLexer(
|
|
41
|
+
include_raw=include_raw,
|
|
42
|
+
|
|
43
|
+
allow_extended_space=True,
|
|
44
|
+
|
|
45
|
+
allow_comments=True,
|
|
46
|
+
|
|
47
|
+
allow_single_quotes=True,
|
|
48
|
+
string_literal_parser=parse_string_literal,
|
|
49
|
+
|
|
50
|
+
allow_extended_number_literals=True,
|
|
51
|
+
number_literal_parser=parse_number_literal,
|
|
52
|
+
|
|
53
|
+
allow_extended_idents=True,
|
|
54
|
+
),
|
|
55
|
+
|
|
56
|
+
JsonStreamParser(
|
|
57
|
+
allow_trailing_commas=True,
|
|
58
|
+
|
|
59
|
+
allow_extended_idents=True,
|
|
60
|
+
),
|
|
61
|
+
|
|
62
|
+
JsonValueBuilder(
|
|
63
|
+
yield_object_lists=yield_object_lists,
|
|
64
|
+
),
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def stream_parse_values(i: ta.Iterable[str], **kwargs: ta.Any) -> ta.Iterator[ta.Any]:
|
|
69
|
+
return JsonStreamValueParser.parse_values(make_machinery(**kwargs), i)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def stream_parse_one_value(i: ta.Iterable[str], **kwargs: ta.Any) -> ta.Any:
|
|
73
|
+
return JsonStreamValueParser.parse_one_value(make_machinery(**kwargs), i)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def stream_parse_exactly_one_value(i: ta.Iterable[str], **kwargs: ta.Any) -> ta.Any:
|
|
77
|
+
return JsonStreamValueParser.parse_exactly_one_value(make_machinery(**kwargs), i)
|
omlish/formats/logfmt.py
CHANGED
|
@@ -20,7 +20,10 @@ def logfmt_encode(
|
|
|
20
20
|
) -> str:
|
|
21
21
|
def encode(s: str) -> str:
|
|
22
22
|
if _LOGFMT_ENCODE_WS_PAT.search(s) is not None:
|
|
23
|
-
|
|
23
|
+
s = s.replace('\\', '\\\\')
|
|
24
|
+
s = s.replace('\n', '\\n')
|
|
25
|
+
s = s.replace('"', '\\"')
|
|
26
|
+
return f'"{s}"'
|
|
24
27
|
else:
|
|
25
28
|
return s
|
|
26
29
|
|
|
@@ -67,7 +70,10 @@ def logfmt_decode(
|
|
|
67
70
|
if s.startswith('"'):
|
|
68
71
|
if len(s) < 2 or not s.endswith('"'):
|
|
69
72
|
raise ValueError(s)
|
|
70
|
-
s = s[1:-1]
|
|
73
|
+
s = s[1:-1]
|
|
74
|
+
s = s.replace('\\"', '"')
|
|
75
|
+
s = s.replace('\\n', '\n')
|
|
76
|
+
s = s.replace('\\\\', '\\')
|
|
71
77
|
return s
|
|
72
78
|
|
|
73
79
|
if value_decoder is None:
|
omlish/funcs/genmachine.py
CHANGED
|
@@ -45,7 +45,7 @@ class GenMachine(ta.Generic[I, O]):
|
|
|
45
45
|
_gen: MachineGen | None
|
|
46
46
|
|
|
47
47
|
def __repr__(self) -> str:
|
|
48
|
-
return f'{self.__class__.__name__}@{
|
|
48
|
+
return f'{self.__class__.__name__}@{id(self):x}<{self.state}>'
|
|
49
49
|
|
|
50
50
|
#
|
|
51
51
|
|
|
@@ -88,7 +88,7 @@ class GenMachine(ta.Generic[I, O]):
|
|
|
88
88
|
|
|
89
89
|
#
|
|
90
90
|
|
|
91
|
-
def __call__(self, i: I) -> ta.
|
|
91
|
+
def __call__(self, i: I) -> ta.Iterator[O]:
|
|
92
92
|
if self._gen is None:
|
|
93
93
|
raise GenMachine.ClosedError
|
|
94
94
|
|