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
|
@@ -10,6 +10,7 @@ import typing as ta
|
|
|
10
10
|
|
|
11
11
|
from .... import check
|
|
12
12
|
from .... import lang
|
|
13
|
+
from ....logs import all as logs
|
|
13
14
|
from ..processing.base import ProcessingContext
|
|
14
15
|
from ..processing.base import ProcessingOption
|
|
15
16
|
from ..processing.base import Processor
|
|
@@ -21,7 +22,6 @@ from .execution import OpExecutor
|
|
|
21
22
|
from .globals import FN_GLOBALS
|
|
22
23
|
from .globals import FnGlobal
|
|
23
24
|
from .idents import CLS_IDENT
|
|
24
|
-
from .mangling import IDENT_MANGLER
|
|
25
25
|
from .ops import Op
|
|
26
26
|
from .ops import OpRef
|
|
27
27
|
from .ops import OpRefMap
|
|
@@ -30,6 +30,9 @@ from .registry import all_generator_types
|
|
|
30
30
|
from .registry import generator_type_for_plan_type
|
|
31
31
|
|
|
32
32
|
|
|
33
|
+
log = logs.get_module_logger(globals())
|
|
34
|
+
|
|
35
|
+
|
|
33
36
|
##
|
|
34
37
|
|
|
35
38
|
|
|
@@ -38,9 +41,10 @@ class PlanOnly(ProcessingOption):
|
|
|
38
41
|
b: bool
|
|
39
42
|
|
|
40
43
|
|
|
41
|
-
@dc.dataclass(frozen=True)
|
|
42
|
-
class
|
|
43
|
-
|
|
44
|
+
@dc.dataclass(frozen=True, kw_only=True)
|
|
45
|
+
class Verbosity(ProcessingOption):
|
|
46
|
+
warn: bool = False
|
|
47
|
+
debug: bool = False
|
|
44
48
|
|
|
45
49
|
|
|
46
50
|
class CompileCallback(ta.Protocol):
|
|
@@ -53,13 +57,21 @@ class CompileCallback(ta.Protocol):
|
|
|
53
57
|
...
|
|
54
58
|
|
|
55
59
|
|
|
56
|
-
@dc.dataclass(frozen=True)
|
|
60
|
+
@dc.dataclass(frozen=True, kw_only=True)
|
|
57
61
|
class Codegen(ProcessingOption):
|
|
58
|
-
|
|
62
|
+
style: ta.Literal['jit', 'aot'] = 'jit'
|
|
63
|
+
|
|
64
|
+
force: bool = False
|
|
65
|
+
callback: CompileCallback | None = None
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
##
|
|
59
69
|
|
|
60
70
|
|
|
61
71
|
@register_processor_type(priority=ProcessorPriority.GENERATION)
|
|
62
72
|
class GeneratorProcessor(Processor):
|
|
73
|
+
PROCESS_FN_NAME: ta.ClassVar[str] = '_process_dataclass'
|
|
74
|
+
|
|
63
75
|
class Mode(lang.Abstract):
|
|
64
76
|
@abc.abstractmethod
|
|
65
77
|
def _process(self, gp: 'GeneratorProcessor', cls: type) -> None:
|
|
@@ -85,36 +97,52 @@ class GeneratorProcessor(Processor):
|
|
|
85
97
|
|
|
86
98
|
self._codegen = codegen
|
|
87
99
|
|
|
100
|
+
@classmethod
|
|
101
|
+
def build_standard_kwargs(cls, dc_cls: type) -> dict[str, ta.Any]:
|
|
102
|
+
kw: dict = {CLS_IDENT: dc_cls}
|
|
103
|
+
kw.update({
|
|
104
|
+
k.ident: v.value
|
|
105
|
+
for k, v in FN_GLOBALS.items()
|
|
106
|
+
})
|
|
107
|
+
return kw
|
|
108
|
+
|
|
88
109
|
def _process(self, gp: 'GeneratorProcessor', cls: type) -> None:
|
|
89
|
-
|
|
90
|
-
OpCompiler.
|
|
91
|
-
|
|
92
|
-
)
|
|
110
|
+
style: OpCompiler.Style = {
|
|
111
|
+
'jit': OpCompiler.JitStyle,
|
|
112
|
+
'aot': OpCompiler.AotStyle,
|
|
113
|
+
}[self._codegen.style]()
|
|
93
114
|
|
|
94
|
-
|
|
115
|
+
compiler = OpCompiler(style)
|
|
95
116
|
|
|
96
117
|
comp = compiler.compile(
|
|
97
|
-
|
|
118
|
+
GeneratorProcessor.PROCESS_FN_NAME,
|
|
98
119
|
gp.ops(),
|
|
99
120
|
)
|
|
100
121
|
|
|
101
|
-
|
|
122
|
+
comp_src = '\n'.join([
|
|
123
|
+
*comp.hdr_lines,
|
|
124
|
+
*(['', ''] if comp.hdr_lines else []),
|
|
125
|
+
*comp.fn_lines,
|
|
126
|
+
])
|
|
127
|
+
|
|
128
|
+
if (vo := gp._ctx.option(Verbosity)) is not None and vo.debug: # noqa
|
|
102
129
|
print(gp.prepare().plans.render(), file=sys.stderr)
|
|
103
130
|
print(file=sys.stderr)
|
|
104
|
-
print(
|
|
131
|
+
print(comp_src, file=sys.stderr)
|
|
105
132
|
print(file=sys.stderr)
|
|
106
133
|
|
|
107
134
|
ns: dict = {}
|
|
108
135
|
ns.update(compiler.style.globals_ns()) # noqa
|
|
109
136
|
|
|
110
|
-
exec(
|
|
111
|
-
o_fn = ns[
|
|
137
|
+
exec(comp_src, ns)
|
|
138
|
+
o_fn = ns[GeneratorProcessor.PROCESS_FN_NAME]
|
|
112
139
|
|
|
113
140
|
if cls.__module__ in sys.modules:
|
|
114
141
|
gl = sys.modules[cls.__module__].__dict__
|
|
115
142
|
else:
|
|
116
143
|
gl = {}
|
|
117
144
|
|
|
145
|
+
# TODO: comment why lol
|
|
118
146
|
fn = lang.new_function(**{
|
|
119
147
|
**lang.new_function_kwargs(o_fn),
|
|
120
148
|
**dict(
|
|
@@ -122,12 +150,8 @@ class GeneratorProcessor(Processor):
|
|
|
122
150
|
),
|
|
123
151
|
})
|
|
124
152
|
|
|
125
|
-
kw
|
|
126
|
-
|
|
127
|
-
k.ident: v.value
|
|
128
|
-
for k, v in FN_GLOBALS.items()
|
|
129
|
-
# if v.src.startswith('.')
|
|
130
|
-
})
|
|
153
|
+
kw = self.build_standard_kwargs(cls)
|
|
154
|
+
|
|
131
155
|
orm = gp.prepare().ref_map
|
|
132
156
|
for r in comp.refs:
|
|
133
157
|
if isinstance(r, OpRef):
|
|
@@ -140,7 +164,7 @@ class GeneratorProcessor(Processor):
|
|
|
140
164
|
fn(**kw)
|
|
141
165
|
|
|
142
166
|
if (cg := self._codegen) is not None and (cb := cg.callback) is not None:
|
|
143
|
-
cb(
|
|
167
|
+
cb( # noqa
|
|
144
168
|
gp._ctx, # noqa
|
|
145
169
|
gp.prepare(),
|
|
146
170
|
comp,
|
|
@@ -194,13 +218,70 @@ class GeneratorProcessor(Processor):
|
|
|
194
218
|
|
|
195
219
|
#
|
|
196
220
|
|
|
221
|
+
def _process_from_codegen(self, cls: type) -> bool:
|
|
222
|
+
cg_pkg = check.not_none(self._ctx.pkg_cfg.pkg)
|
|
223
|
+
cg_mod_spec = f'{cg_pkg}._dataclasses'
|
|
224
|
+
|
|
225
|
+
try:
|
|
226
|
+
__import__(cg_mod_spec)
|
|
227
|
+
except ImportError:
|
|
228
|
+
if (vo := self._ctx.option(Verbosity)) is not None and vo.warn: # noqa
|
|
229
|
+
log.warning(lambda: f'Codegen module missing for {cls.__module__}.{cls.__qualname__} at {cg_mod_spec}')
|
|
230
|
+
return False
|
|
231
|
+
|
|
232
|
+
cg_mod = sys.modules[cg_mod_spec]
|
|
233
|
+
cg_fn_reg = cg_mod.REGISTRY
|
|
234
|
+
|
|
235
|
+
#
|
|
236
|
+
|
|
237
|
+
prep = self.prepare()
|
|
238
|
+
prep_plan_repr = repr(prep.plans)
|
|
239
|
+
|
|
240
|
+
#
|
|
241
|
+
|
|
242
|
+
try:
|
|
243
|
+
cg_reg_item = cg_fn_reg[prep_plan_repr]
|
|
244
|
+
except KeyError:
|
|
245
|
+
if (vo := self._ctx.option(Verbosity)) is not None and vo.warn: # noqa
|
|
246
|
+
log.warning(lambda: f'Codegen missing for {cls.__module__}.{cls.__qualname__} in {cg_mod_spec}')
|
|
247
|
+
return False
|
|
248
|
+
|
|
249
|
+
cg_kw, cg_fn = cg_reg_item
|
|
250
|
+
|
|
251
|
+
#
|
|
252
|
+
|
|
253
|
+
ref_map = {
|
|
254
|
+
ref.ident(): v
|
|
255
|
+
for ref, v in prep.ref_map.items()
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
#
|
|
259
|
+
|
|
260
|
+
fn_kw = {
|
|
261
|
+
**GeneratorProcessor.CompilerMode.build_standard_kwargs(cls),
|
|
262
|
+
**{k: ref_map[k] for k in cg_kw['op_ref_idents']},
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
fn = cg_fn()
|
|
266
|
+
fn(**fn_kw)
|
|
267
|
+
|
|
268
|
+
return True
|
|
269
|
+
|
|
270
|
+
#
|
|
271
|
+
|
|
197
272
|
def process(self, cls: type) -> type:
|
|
198
273
|
if (po := self._ctx.option(PlanOnly)) is not None and po.b:
|
|
199
274
|
self.prepare()
|
|
200
275
|
return cls
|
|
201
276
|
|
|
277
|
+
cg = self._ctx.option(Codegen)
|
|
278
|
+
|
|
279
|
+
if not (cg is not None and cg.force) and self._ctx.pkg_cfg.cfg.codegen:
|
|
280
|
+
if self._process_from_codegen(cls):
|
|
281
|
+
return cls
|
|
282
|
+
|
|
202
283
|
mode: GeneratorProcessor.Mode
|
|
203
|
-
if
|
|
284
|
+
if cg is not None: # noqa
|
|
204
285
|
mode = GeneratorProcessor.CompilerMode(codegen=cg)
|
|
205
286
|
else:
|
|
206
287
|
mode = GeneratorProcessor.ExecutorMode()
|
|
@@ -10,6 +10,8 @@ import typing as ta
|
|
|
10
10
|
from .... import check
|
|
11
11
|
from .... import lang
|
|
12
12
|
from ...specs import ClassSpec
|
|
13
|
+
from ..configs import DEFAULT_NAMED_PACKAGE_CONFIG
|
|
14
|
+
from ..configs import NamedPackageConfig
|
|
13
15
|
|
|
14
16
|
|
|
15
17
|
T = ta.TypeVar('T')
|
|
@@ -33,6 +35,7 @@ class ProcessingContext:
|
|
|
33
35
|
cs: ClassSpec,
|
|
34
36
|
item_factories: ta.Mapping[type, ProcessingContextItemFactory],
|
|
35
37
|
*,
|
|
38
|
+
pkg_cfg: NamedPackageConfig = DEFAULT_NAMED_PACKAGE_CONFIG,
|
|
36
39
|
options: ta.Sequence[ProcessingOption] | None = None,
|
|
37
40
|
) -> None:
|
|
38
41
|
super().__init__()
|
|
@@ -40,6 +43,7 @@ class ProcessingContext:
|
|
|
40
43
|
self._cls = cls
|
|
41
44
|
self._cs = cs
|
|
42
45
|
self._item_factories = item_factories
|
|
46
|
+
self._pkg_cfg = pkg_cfg
|
|
43
47
|
|
|
44
48
|
options_dct: dict = {}
|
|
45
49
|
for o in options or ():
|
|
@@ -57,6 +61,10 @@ class ProcessingContext:
|
|
|
57
61
|
def cs(self) -> ClassSpec:
|
|
58
62
|
return self._cs
|
|
59
63
|
|
|
64
|
+
@property
|
|
65
|
+
def pkg_cfg(self) -> NamedPackageConfig:
|
|
66
|
+
return self._pkg_cfg
|
|
67
|
+
|
|
60
68
|
def __getitem__(self, ty: type[T]) -> T:
|
|
61
69
|
try:
|
|
62
70
|
return self._items[ty]
|
|
@@ -5,7 +5,7 @@ import typing as ta
|
|
|
5
5
|
from .... import lang
|
|
6
6
|
from ...specs import ClassSpec
|
|
7
7
|
from .. import concerns as _concerns # noqa # imported for registration
|
|
8
|
-
from ..configs import
|
|
8
|
+
from ..configs import DEFAULT_NAMED_PACKAGE_CONFIG
|
|
9
9
|
from ..configs import PACKAGE_CONFIG_CACHE
|
|
10
10
|
from ..generation import processor as gp
|
|
11
11
|
from .base import ProcessingContext
|
|
@@ -41,21 +41,20 @@ def drive_cls_processing(
|
|
|
41
41
|
cs: ClassSpec,
|
|
42
42
|
*,
|
|
43
43
|
plan_only: bool = False,
|
|
44
|
-
|
|
44
|
+
warn: bool = False,
|
|
45
|
+
debug: bool = False,
|
|
45
46
|
) -> type:
|
|
46
47
|
options: list[ProcessingOption] = list(_OPTIONS_CONTEXT_VAR.get())
|
|
47
48
|
if plan_only:
|
|
48
49
|
options.append(gp.PlanOnly(True))
|
|
49
|
-
if
|
|
50
|
-
options.append(gp.
|
|
50
|
+
if warn or debug:
|
|
51
|
+
options.append(gp.Verbosity(warn=warn, debug=debug))
|
|
51
52
|
|
|
52
53
|
#
|
|
53
54
|
|
|
54
|
-
pkg_config = DEFAULT_PACKAGE_CONFIG
|
|
55
55
|
cls_mod = cls.__module__
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
pkg_cfg = PACKAGE_CONFIG_CACHE.get(cls_pkg, pkg_config) # noqa
|
|
56
|
+
cls_pkg = cls_mod.rpartition('.')[0]
|
|
57
|
+
pkg_cfg = lang.coalesce(PACKAGE_CONFIG_CACHE.get(cls_pkg), DEFAULT_NAMED_PACKAGE_CONFIG)
|
|
59
58
|
|
|
60
59
|
#
|
|
61
60
|
|
|
@@ -63,6 +62,7 @@ def drive_cls_processing(
|
|
|
63
62
|
cls,
|
|
64
63
|
cs,
|
|
65
64
|
all_processing_context_item_factories(),
|
|
65
|
+
pkg_cfg=pkg_cfg,
|
|
66
66
|
options=options,
|
|
67
67
|
)
|
|
68
68
|
|
omlish/dataclasses/specs.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Should be kept pure. No references to dc std, no references to impl detail."""
|
|
2
2
|
import dataclasses as dc
|
|
3
3
|
import enum
|
|
4
|
+
import types
|
|
4
5
|
import typing as ta
|
|
5
6
|
|
|
6
7
|
from .. import check
|
|
@@ -28,6 +29,30 @@ class DefaultFactory(ta.NamedTuple):
|
|
|
28
29
|
##
|
|
29
30
|
|
|
30
31
|
|
|
32
|
+
class _SpecBase:
|
|
33
|
+
_BOOL_FIELDS: ta.ClassVar[ta.Sequence[dc.Field]]
|
|
34
|
+
_OPT_BOOL_FIELDS: ta.ClassVar[ta.Sequence[dc.Field]]
|
|
35
|
+
|
|
36
|
+
def _check_spec_base_fields(self) -> None:
|
|
37
|
+
for f in self._BOOL_FIELDS:
|
|
38
|
+
if not isinstance(bv := getattr(self, f.name), bool):
|
|
39
|
+
raise TypeError(f'dataclass {self.__class__.__name__} attr {f.name} must be bool, got {bv!r}')
|
|
40
|
+
|
|
41
|
+
for f in self._OPT_BOOL_FIELDS:
|
|
42
|
+
if not isinstance(bv := getattr(self, f.name), (bool, types.NoneType)):
|
|
43
|
+
raise TypeError(f'dataclass {self.__class__.__name__} attr {f.name} must be bool or None, got {bv!r}')
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _init_spec_base(cls):
|
|
47
|
+
cls._BOOL_FIELDS = [f for f in dc.fields(cls) if f.type is bool] # noqa
|
|
48
|
+
cls._OPT_BOOL_FIELDS = [f for f in dc.fields(cls) if f.type in (bool | None, ta.Optional[bool])] # noqa
|
|
49
|
+
|
|
50
|
+
return cls
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
##
|
|
54
|
+
|
|
55
|
+
|
|
31
56
|
class FieldType(enum.StrEnum):
|
|
32
57
|
INSTANCE = enum.auto()
|
|
33
58
|
CLASS_VAR = enum.auto()
|
|
@@ -36,8 +61,9 @@ class FieldType(enum.StrEnum):
|
|
|
36
61
|
__repr__ = lang.enum_name_repr
|
|
37
62
|
|
|
38
63
|
|
|
64
|
+
@_init_spec_base
|
|
39
65
|
@dc.dataclass(frozen=True, kw_only=True, eq=False)
|
|
40
|
-
class FieldSpec(lang.Final):
|
|
66
|
+
class FieldSpec(_SpecBase, lang.Final):
|
|
41
67
|
name: str
|
|
42
68
|
annotation: ta.Any
|
|
43
69
|
|
|
@@ -95,6 +121,8 @@ class FieldSpec(lang.Final):
|
|
|
95
121
|
check.non_empty_str(self.name)
|
|
96
122
|
check.arg(self.name.isidentifier())
|
|
97
123
|
|
|
124
|
+
self._check_spec_base_fields()
|
|
125
|
+
|
|
98
126
|
if self.field_type in (FieldType.CLASS_VAR, FieldType.INIT_VAR):
|
|
99
127
|
if isinstance(self.default.or_else(None), DefaultFactory):
|
|
100
128
|
raise TypeError(f'field {self.name} cannot have a default factory')
|
|
@@ -121,8 +149,9 @@ class FieldSpec(lang.Final):
|
|
|
121
149
|
##
|
|
122
150
|
|
|
123
151
|
|
|
152
|
+
@_init_spec_base
|
|
124
153
|
@dc.dataclass(frozen=True, kw_only=True, eq=False)
|
|
125
|
-
class ClassSpec(lang.Final):
|
|
154
|
+
class ClassSpec(_SpecBase, lang.Final):
|
|
126
155
|
##
|
|
127
156
|
# fields
|
|
128
157
|
|
|
@@ -187,6 +216,7 @@ class ClassSpec(lang.Final):
|
|
|
187
216
|
|
|
188
217
|
repr_id: bool = False
|
|
189
218
|
terse_repr: bool = False
|
|
219
|
+
default_repr_fn: ReprFn | None = None
|
|
190
220
|
|
|
191
221
|
allow_redundant_decorator: bool = False
|
|
192
222
|
|
|
@@ -209,6 +239,8 @@ class ClassSpec(lang.Final):
|
|
|
209
239
|
# validate
|
|
210
240
|
|
|
211
241
|
def __post_init__(self) -> None:
|
|
242
|
+
self._check_spec_base_fields()
|
|
243
|
+
|
|
212
244
|
fields_by_name: dict[str, FieldSpec] = {}
|
|
213
245
|
for f in self.fields:
|
|
214
246
|
check.not_in(f.name, fields_by_name)
|
omlish/dataclasses/tools/as_.py
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import copy
|
|
2
2
|
import dataclasses as dc
|
|
3
|
-
import typing as ta
|
|
4
3
|
|
|
5
4
|
from .._internals import STD_ATOMIC_TYPES
|
|
6
5
|
from .._internals import std_is_dataclass_instance
|
|
@@ -78,14 +77,3 @@ def _astuple_inner(obj, tuple_factory):
|
|
|
78
77
|
|
|
79
78
|
else:
|
|
80
79
|
return copy.deepcopy(obj)
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
##
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def shallow_astuple(o: ta.Any) -> tuple[ta.Any, ...]:
|
|
87
|
-
return tuple(getattr(o, f.name) for f in dc.fields(o))
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
def shallow_asdict(o: ta.Any) -> dict[str, ta.Any]:
|
|
91
|
-
return {f.name: getattr(o, f.name) for f in dc.fields(o)}
|
|
@@ -3,6 +3,7 @@ import typing as ta
|
|
|
3
3
|
|
|
4
4
|
from ... import check
|
|
5
5
|
from ... import lang
|
|
6
|
+
from ...lite.dataclasses import is_immediate_dataclass
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
if ta.TYPE_CHECKING:
|
|
@@ -40,6 +41,8 @@ def update_fields(
|
|
|
40
41
|
def inner(cls):
|
|
41
42
|
if issubclass(cls, meta.DataMeta):
|
|
42
43
|
raise TypeError('update_fields() cannot be used on DataMeta subclasses')
|
|
44
|
+
if is_immediate_dataclass(cls):
|
|
45
|
+
raise TypeError('update_fields() cannot be used on already processed dataclasses')
|
|
43
46
|
|
|
44
47
|
if fields is None:
|
|
45
48
|
for a, v in list(cls.__dict__.items()):
|
|
@@ -51,6 +54,8 @@ def update_fields(
|
|
|
51
54
|
try:
|
|
52
55
|
v = cls.__dict__[a]
|
|
53
56
|
except KeyError:
|
|
57
|
+
if hasattr(cls, a):
|
|
58
|
+
raise TypeError('update_fields() cannot be used on parent dataclass fields') from None
|
|
54
59
|
v = dc.field()
|
|
55
60
|
else:
|
|
56
61
|
if not isinstance(v, dc.Field):
|
|
@@ -142,7 +142,7 @@ class Static(lang.Abstract):
|
|
|
142
142
|
n_md[_ExtraFieldParamsMetadata] = {
|
|
143
143
|
fs_f.name: getattr(x_fs, fs_f.name)
|
|
144
144
|
for fs_f in dc.fields(FieldSpec) # noqa
|
|
145
|
-
if fs_f not in dc.Field.__slots__
|
|
145
|
+
if fs_f not in dc.Field.__slots__
|
|
146
146
|
and fs_f.name not in ('default', 'default_factory')
|
|
147
147
|
}
|
|
148
148
|
new_fld.metadata = n_md # type: ignore[assignment]
|
omlish/diag/_pycharm/runhack.py
CHANGED
|
@@ -51,7 +51,7 @@ class _cached_nullary: # noqa
|
|
|
51
51
|
|
|
52
52
|
return self._value
|
|
53
53
|
|
|
54
|
-
def __get__(self, instance, owner): # noqa
|
|
54
|
+
def __get__(self, instance, owner=None): # noqa
|
|
55
55
|
bound = instance.__dict__[self._fn.__name__] = self.__class__(self._fn.__get__(instance, owner))
|
|
56
56
|
return bound
|
|
57
57
|
|
|
@@ -7,12 +7,12 @@ import dataclasses as dc
|
|
|
7
7
|
import json
|
|
8
8
|
import typing as ta
|
|
9
9
|
|
|
10
|
-
from
|
|
11
|
-
from
|
|
12
|
-
from
|
|
13
|
-
from
|
|
14
|
-
from
|
|
15
|
-
from
|
|
10
|
+
from ...lite.check import check
|
|
11
|
+
from ...lite.marshal import OBJ_MARSHALER_FIELD_KEY
|
|
12
|
+
from ...lite.marshal import unmarshal_obj
|
|
13
|
+
from ...subprocesses.run import SubprocessRun
|
|
14
|
+
from ...subprocesses.run import SubprocessRunnable
|
|
15
|
+
from ...subprocesses.run import SubprocessRunOutput
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
##
|
|
@@ -7,12 +7,12 @@ import dataclasses as dc
|
|
|
7
7
|
import enum
|
|
8
8
|
import typing as ta
|
|
9
9
|
|
|
10
|
-
from
|
|
11
|
-
from
|
|
12
|
-
from
|
|
13
|
-
from
|
|
14
|
-
from
|
|
15
|
-
from
|
|
10
|
+
from ...lite.check import check
|
|
11
|
+
from ...lite.dataclasses import dataclass_repr_omit_falsey
|
|
12
|
+
from ...lite.marshal import OBJ_MARSHALER_OMIT_IF_NONE
|
|
13
|
+
from ...subprocesses.run import SubprocessRun
|
|
14
|
+
from ...subprocesses.run import SubprocessRunnable
|
|
15
|
+
from ...subprocesses.run import SubprocessRunOutput
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
##
|
omlish/diag/{ps.py → cmds/ps.py}
RENAMED
|
@@ -4,12 +4,12 @@ import dataclasses as dc
|
|
|
4
4
|
import os
|
|
5
5
|
import typing as ta
|
|
6
6
|
|
|
7
|
-
from
|
|
8
|
-
from
|
|
9
|
-
from
|
|
10
|
-
from
|
|
11
|
-
from
|
|
12
|
-
from
|
|
7
|
+
from ...lite.check import check
|
|
8
|
+
from ...lite.timeouts import Timeout
|
|
9
|
+
from ...subprocesses.run import SubprocessRun
|
|
10
|
+
from ...subprocesses.run import SubprocessRunnable
|
|
11
|
+
from ...subprocesses.run import SubprocessRunOutput
|
|
12
|
+
from ...subprocesses.sync import subprocesses
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
##
|
omlish/diag/procfs.py
CHANGED
|
@@ -3,7 +3,6 @@ TODO:
|
|
|
3
3
|
- dataclasses
|
|
4
4
|
"""
|
|
5
5
|
import argparse
|
|
6
|
-
import logging
|
|
7
6
|
import os
|
|
8
7
|
import re
|
|
9
8
|
import resource
|
|
@@ -14,11 +13,12 @@ import typing as ta
|
|
|
14
13
|
from .. import iterators as it
|
|
15
14
|
from .. import lang
|
|
16
15
|
from ..formats import json
|
|
16
|
+
from ..logs import all as logs
|
|
17
17
|
from ..os.sizes import PAGE_SIZE
|
|
18
18
|
from .procstats import ProcStats
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
log =
|
|
21
|
+
log = logs.get_module_logger(globals())
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
PidLike = int | str
|
|
@@ -235,7 +235,7 @@ PAGEMAP_KEYS = (
|
|
|
235
235
|
)
|
|
236
236
|
|
|
237
237
|
|
|
238
|
-
def get_process_range_pagemaps(start: int, end: int, pid: PidLike = 'self') -> ta.
|
|
238
|
+
def get_process_range_pagemaps(start: int, end: int, pid: PidLike = 'self') -> ta.Iterator[dict[str, int]]:
|
|
239
239
|
"""https://www.kernel.org/doc/Documentation/vm/pagemap.txt"""
|
|
240
240
|
|
|
241
241
|
_check_linux()
|
|
@@ -262,7 +262,7 @@ def get_process_range_pagemaps(start: int, end: int, pid: PidLike = 'self') -> t
|
|
|
262
262
|
}
|
|
263
263
|
|
|
264
264
|
|
|
265
|
-
def get_process_pagemaps(pid: PidLike = 'self') -> ta.
|
|
265
|
+
def get_process_pagemaps(pid: PidLike = 'self') -> ta.Iterator[dict[str, int]]:
|
|
266
266
|
_check_linux()
|
|
267
267
|
for m in get_process_maps(pid):
|
|
268
268
|
yield from get_process_range_pagemaps(m['address'], m['end_address'], pid)
|
omlish/diag/pycharm.py
CHANGED
|
@@ -191,9 +191,23 @@ def pycharm_remote_debugger_attach(prd: PycharmRemoteDebugger) -> None:
|
|
|
191
191
|
else:
|
|
192
192
|
pydevd_pycharm = _import_pydevd_pycharm(version=version)
|
|
193
193
|
|
|
194
|
+
import inspect
|
|
195
|
+
st_sig = inspect.signature(pydevd_pycharm.settrace)
|
|
196
|
+
|
|
197
|
+
kw: dict = {}
|
|
198
|
+
if 'stdoutToServer' in st_sig.parameters:
|
|
199
|
+
kw.update(
|
|
200
|
+
stdoutToServer=True,
|
|
201
|
+
stderrToServer=True,
|
|
202
|
+
)
|
|
203
|
+
else:
|
|
204
|
+
kw.update(
|
|
205
|
+
stdout_to_server=True,
|
|
206
|
+
stderr_to_server=True,
|
|
207
|
+
)
|
|
208
|
+
|
|
194
209
|
pydevd_pycharm.settrace(
|
|
195
210
|
host,
|
|
196
211
|
port=prd.port,
|
|
197
|
-
|
|
198
|
-
stderrToServer=True,
|
|
212
|
+
**kw,
|
|
199
213
|
)
|