omlish 0.0.0.dev19__tar.gz → 0.0.0.dev20__tar.gz
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.
- {omlish-0.0.0.dev19/omlish.egg-info → omlish-0.0.0.dev20}/PKG-INFO +3 -3
- omlish-0.0.0.dev20/README.rst +10 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/__about__.py +3 -3
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/asyncs/anyio.py +13 -6
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/__init__.py +2 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/metadata.py +2 -1
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/utils.py +45 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/fnpairs.py +1 -1
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/formats/json.py +1 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/descriptors.py +2 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lite/logs.py +2 -2
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/__init__.py +4 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/dataclasses.py +16 -3
- omlish-0.0.0.dev20/omlish/marshal/helpers.py +22 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/objects.py +33 -14
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/multiprocessing.py +32 -0
- omlish-0.0.0.dev20/omlish/specs/jsonschema/__init__.py +0 -0
- omlish-0.0.0.dev20/omlish/specs/jsonschema/keywords/__init__.py +42 -0
- omlish-0.0.0.dev20/omlish/specs/jsonschema/keywords/base.py +86 -0
- omlish-0.0.0.dev20/omlish/specs/jsonschema/keywords/core.py +26 -0
- omlish-0.0.0.dev20/omlish/specs/jsonschema/keywords/metadata.py +22 -0
- omlish-0.0.0.dev20/omlish/specs/jsonschema/keywords/parse.py +69 -0
- omlish-0.0.0.dev20/omlish/specs/jsonschema/keywords/render.py +47 -0
- omlish-0.0.0.dev20/omlish/specs/jsonschema/keywords/validation.py +68 -0
- omlish-0.0.0.dev20/omlish/specs/jsonschema/schemas/__init__.py +0 -0
- omlish-0.0.0.dev20/omlish/specs/jsonschema/schemas/draft202012/__init__.py +0 -0
- omlish-0.0.0.dev20/omlish/specs/jsonschema/schemas/draft202012/vocabularies/__init__.py +0 -0
- omlish-0.0.0.dev20/omlish/specs/jsonschema/types.py +10 -0
- omlish-0.0.0.dev20/omlish/text/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20/omlish.egg-info}/PKG-INFO +3 -3
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish.egg-info/SOURCES.txt +14 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish.egg-info/requires.txt +2 -2
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/pyproject.toml +3 -3
- omlish-0.0.0.dev19/README.rst +0 -5
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/LICENSE +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/MANIFEST.in +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/argparse.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/asyncs/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/asyncs/asyncio.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/asyncs/asyncs.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/asyncs/bridge.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/asyncs/flavors.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/asyncs/trio.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/asyncs/trio_asyncio.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/bootstrap/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/bootstrap/__main__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/bootstrap/base.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/bootstrap/diag.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/bootstrap/harness.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/bootstrap/main.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/bootstrap/sys.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/c3.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/cached.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/check.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/_abc.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/_io_abc.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/cache/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/cache/descriptor.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/cache/impl.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/cache/types.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/coerce.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/exceptions.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/frozen.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/identity.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/indexed.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/mappings.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/ordered.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/persistent.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/skiplist.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/sorted.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/treap.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/treapmap.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/unmodifiable.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/collections/utils.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/concurrent.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/configs/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/configs/classes.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/configs/flattening.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/configs/strings.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/api.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/as_.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/copy.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/descriptors.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/exceptions.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/fields.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/frozen.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/hashing.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/init.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/internals.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/main.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/metaclass.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/order.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/params.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/processing.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/reflect.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/replace.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/repr.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/simple.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/slots.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dataclasses/impl/utils.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/datetimes.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/defs.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/diag/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/diag/procfs.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/diag/procstats.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/diag/ps.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/diag/pydevd.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/diag/replserver/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/diag/replserver/__main__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/diag/replserver/console.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/diag/replserver/server.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/diag/threads.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dispatch/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dispatch/_dispatch2.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dispatch/_dispatch3.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dispatch/dispatch.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dispatch/functions.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dispatch/methods.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/docker.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/dynamic.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/formats/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/formats/dotenv.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/formats/props.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/formats/yaml.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/graphs/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/graphs/dags.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/graphs/domination.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/graphs/dot/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/graphs/dot/items.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/graphs/dot/rendering.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/graphs/dot/utils.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/graphs/trees.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/http/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/http/asgi.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/http/collections.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/http/consts.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/http/cookies.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/http/dates.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/http/encodings.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/http/json.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/http/sessions.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/http/wsgi.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/binder.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/bindings.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/eagers.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/elements.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/exceptions.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/impl/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/impl/bindings.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/impl/elements.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/impl/injector.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/impl/inspect.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/impl/multis.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/impl/origins.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/impl/privates.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/impl/providers.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/impl/proxy.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/impl/scopes.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/injector.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/inspect.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/keys.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/listeners.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/managed.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/multis.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/origins.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/overrides.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/privates.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/providers.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/scopes.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/types.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/inject/utils.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/iterators.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/cached.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/classes/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/classes/abstract.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/classes/restrict.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/classes/simple.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/classes/virtual.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/clsdct.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/cmp.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/contextmanagers.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/exceptions.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/functions.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/imports.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/iterables.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/maybes.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/objects.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/resolving.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/strings.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/sys.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/timeouts.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lang/typing.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/libc.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lifecycles/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lifecycles/abstract.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lifecycles/base.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lifecycles/contextmanagers.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lifecycles/controller.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lifecycles/manager.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lifecycles/states.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lifecycles/transitions.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lite/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lite/cached.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lite/check.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lite/contextmanagers.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lite/json.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lite/marshal.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lite/reflect.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lite/runtime.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lite/secrets.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lite/strings.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/lite/subprocesses.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/logs/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/logs/_abc.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/logs/configs.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/logs/formatters.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/logs/noisy.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/logs/utils.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/any.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/base.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/base64.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/datetimes.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/enums.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/exceptions.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/factories.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/forbidden.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/global_.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/iterables.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/mappings.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/maybes.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/naming.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/numbers.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/optionals.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/polymorphism.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/primitives.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/registries.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/standard.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/utils.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/uuids.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/marshal/values.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/matchfns.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/math.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/os.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/reflect/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/reflect/isinstance.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/reflect/ops.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/reflect/subst.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/reflect/types.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/runmodule.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/secrets/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/secrets/crypto.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/secrets/marshal.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/secrets/openssl.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/secrets/passwords.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/secrets/secrets.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/secrets/subprocesses.py +0 -0
- {omlish-0.0.0.dev19/omlish/text → omlish-0.0.0.dev20/omlish/specs}/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/sql/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/sql/_abc.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/sql/asyncs.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/sql/dbs.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/sql/duckdb.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/sql/exprs.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/sql/secrets.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/sql/sqlean.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/stats.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/sync.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/term.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/helpers.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/inject/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/inject/harness.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/marks.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/plugins/__init__.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/plugins/_registry.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/plugins/asyncs.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/plugins/depskip.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/plugins/logging.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/plugins/managermarks.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/plugins/pydevd.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/plugins/repeat.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/plugins/skips.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/plugins/spacing.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/plugins/switches.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/pytest/plugins/utils.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/testing/testing.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/text/delimit.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/text/glyphsplit.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/text/indent.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish/text/parts.py +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish.egg-info/dependency_links.txt +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/omlish.egg-info/top_level.txt +0 -0
- {omlish-0.0.0.dev19 → omlish-0.0.0.dev20}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: omlish
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev20
|
4
4
|
Summary: omlish
|
5
5
|
Author: wrmsr
|
6
6
|
License: BSD-3-Clause
|
@@ -38,7 +38,7 @@ Requires-Dist: aiomysql~=0.2; extra == "all"
|
|
38
38
|
Requires-Dist: aiosqlite~=0.20; extra == "all"
|
39
39
|
Requires-Dist: asyncpg~=0.29; python_version < "3.13" and extra == "all"
|
40
40
|
Requires-Dist: sqlean.py~=3.45; python_version < "3.13" and extra == "all"
|
41
|
-
Requires-Dist: duckdb~=1.
|
41
|
+
Requires-Dist: duckdb~=1.1; extra == "all"
|
42
42
|
Requires-Dist: pytest~=8.0; extra == "all"
|
43
43
|
Provides-Extra: async
|
44
44
|
Requires-Dist: anyio~=4.4; extra == "async"
|
@@ -74,6 +74,6 @@ Requires-Dist: aiosqlite~=0.20; extra == "sql"
|
|
74
74
|
Requires-Dist: asyncpg~=0.29; python_version < "3.13" and extra == "sql"
|
75
75
|
Provides-Extra: sqlx
|
76
76
|
Requires-Dist: sqlean.py~=3.45; python_version < "3.13" and extra == "sqlx"
|
77
|
-
Requires-Dist: duckdb~=1.
|
77
|
+
Requires-Dist: duckdb~=1.1; extra == "sqlx"
|
78
78
|
Provides-Extra: testing
|
79
79
|
Requires-Dist: pytest~=8.0; extra == "testing"
|
@@ -0,0 +1,10 @@
|
|
1
|
+
It's like my previous python monorepo-ey thing `omnibus
|
2
|
+
<https://github.com/wrmsr/omnibus/tree/wrmsr_exp_split>`_... ish.
|
3
|
+
|
4
|
+
Core packages begin with ``om``, scratch app is in ``app``, temp / dump code is in ``x``.
|
5
|
+
|
6
|
+
Core packages installable from git via:
|
7
|
+
|
8
|
+
.. code-block::
|
9
|
+
|
10
|
+
pip install 'git+https://github.com/wrmsr/omlish@master#subdirectory=.pkg/<pkg>'
|
@@ -1,5 +1,5 @@
|
|
1
|
-
__version__ = '0.0.0.
|
2
|
-
__revision__ = '
|
1
|
+
__version__ = '0.0.0.dev20'
|
2
|
+
__revision__ = '56a3421b375112818e306f2c17d467c7aac1d26b'
|
3
3
|
|
4
4
|
|
5
5
|
#
|
@@ -88,7 +88,7 @@ class Project(ProjectBase):
|
|
88
88
|
'sqlx': [
|
89
89
|
'sqlean.py ~= 3.45; python_version < "3.13"',
|
90
90
|
|
91
|
-
'duckdb ~= 1.
|
91
|
+
'duckdb ~= 1.1',
|
92
92
|
],
|
93
93
|
|
94
94
|
'testing': [
|
@@ -23,6 +23,7 @@ async def killer(shutdown: anyio.Event, sleep_s: float) -> None:
|
|
23
23
|
shutdown.set()
|
24
24
|
|
25
25
|
""" # noqa
|
26
|
+
import dataclasses as dc
|
26
27
|
import signal
|
27
28
|
import typing as ta
|
28
29
|
|
@@ -44,6 +45,12 @@ StapledByteStream: ta.TypeAlias = anyio.streams.stapled.StapledByteStream
|
|
44
45
|
StapledObjectStream: ta.TypeAlias = anyio.streams.stapled.StapledObjectStream
|
45
46
|
|
46
47
|
|
48
|
+
@dc.dataclass(eq=False)
|
49
|
+
class MemoryStapledObjectStream(StapledObjectStream[T]):
|
50
|
+
send_stream: MemoryObjectSendStream[T]
|
51
|
+
receive_stream: MemoryObjectReceiveStream[T]
|
52
|
+
|
53
|
+
|
47
54
|
##
|
48
55
|
|
49
56
|
|
@@ -143,8 +150,8 @@ def split_memory_object_streams(
|
|
143
150
|
return tup
|
144
151
|
|
145
152
|
|
146
|
-
def create_stapled_memory_object_stream(max_buffer_size: float = 0) ->
|
147
|
-
return
|
153
|
+
def create_stapled_memory_object_stream(max_buffer_size: float = 0) -> MemoryStapledObjectStream:
|
154
|
+
return MemoryStapledObjectStream(*anyio.create_memory_object_stream(max_buffer_size))
|
148
155
|
|
149
156
|
|
150
157
|
# FIXME: https://github.com/python/mypy/issues/15238
|
@@ -158,9 +165,9 @@ def create_memory_object_stream[T](max_buffer_size: float = 0) -> tuple[
|
|
158
165
|
|
159
166
|
def staple_memory_object_stream(
|
160
167
|
*args: anyio.create_memory_object_stream[T],
|
161
|
-
) ->
|
168
|
+
) -> MemoryStapledObjectStream[T]:
|
162
169
|
send, receive = args
|
163
|
-
return
|
170
|
+
return MemoryStapledObjectStream(
|
164
171
|
check.isinstance(send, MemoryObjectSendStream), # type: ignore
|
165
172
|
check.isinstance(receive, MemoryObjectReceiveStream), # type: ignore
|
166
173
|
)
|
@@ -168,9 +175,9 @@ def staple_memory_object_stream(
|
|
168
175
|
|
169
176
|
# FIXME: https://github.com/python/mypy/issues/15238
|
170
177
|
# FIXME: https://youtrack.jetbrains.com/issues?q=tag:%20%7BPEP%20695%7D
|
171
|
-
def staple_memory_object_stream2[T](max_buffer_size: float = 0) ->
|
178
|
+
def staple_memory_object_stream2[T](max_buffer_size: float = 0) -> MemoryStapledObjectStream[T]:
|
172
179
|
send, receive = anyio.create_memory_object_stream[T](max_buffer_size)
|
173
|
-
return
|
180
|
+
return MemoryStapledObjectStream(
|
174
181
|
check.isinstance(send, MemoryObjectSendStream), # type: ignore
|
175
182
|
check.isinstance(receive, MemoryObjectReceiveStream), # type: ignore
|
176
183
|
)
|
@@ -12,6 +12,9 @@ from .impl.params import get_field_extras
|
|
12
12
|
T = ta.TypeVar('T')
|
13
13
|
|
14
14
|
|
15
|
+
#
|
16
|
+
|
17
|
+
|
15
18
|
def maybe_post_init(sup: ta.Any) -> bool:
|
16
19
|
try:
|
17
20
|
fn = sup.__post_init__
|
@@ -21,10 +24,16 @@ def maybe_post_init(sup: ta.Any) -> bool:
|
|
21
24
|
return True
|
22
25
|
|
23
26
|
|
27
|
+
#
|
28
|
+
|
29
|
+
|
24
30
|
def opt_repr(o: ta.Any) -> str | None:
|
25
31
|
return repr(o) if o is not None else None
|
26
32
|
|
27
33
|
|
34
|
+
#
|
35
|
+
|
36
|
+
|
28
37
|
class field_modifier: # noqa
|
29
38
|
def __init__(self, fn: ta.Callable[[dc.Field], dc.Field]) -> None:
|
30
39
|
super().__init__()
|
@@ -58,6 +67,42 @@ def update_field_extras(f: dc.Field, *, unless_non_default: bool = False, **kwar
|
|
58
67
|
})
|
59
68
|
|
60
69
|
|
70
|
+
def update_fields(
|
71
|
+
fn: ta.Callable[[str, dc.Field], dc.Field],
|
72
|
+
fields: ta.Iterable[str] | None = None,
|
73
|
+
) -> ta.Callable[[type[T]], type[T]]:
|
74
|
+
def inner(cls):
|
75
|
+
if fields is None:
|
76
|
+
for a, v in list(cls.__dict__.items()):
|
77
|
+
if isinstance(v, dc.Field):
|
78
|
+
setattr(cls, a, fn(a, v))
|
79
|
+
|
80
|
+
else:
|
81
|
+
for a in fields:
|
82
|
+
v = cls.__dict__[a]
|
83
|
+
if not isinstance(v, dc.Field):
|
84
|
+
v = dc.field(default=v)
|
85
|
+
setattr(cls, a, fn(a, v))
|
86
|
+
|
87
|
+
return cls
|
88
|
+
|
89
|
+
check.not_isinstance(fields, str)
|
90
|
+
return inner
|
91
|
+
|
92
|
+
|
93
|
+
def update_fields_metadata(
|
94
|
+
nmd: ta.Mapping,
|
95
|
+
fields: ta.Iterable[str] | None = None,
|
96
|
+
) -> ta.Callable[[type[T]], type[T]]:
|
97
|
+
def inner(a: str, f: dc.Field) -> dc.Field:
|
98
|
+
return update_field_metadata(f, nmd)
|
99
|
+
|
100
|
+
return update_fields(inner, fields)
|
101
|
+
|
102
|
+
|
103
|
+
#
|
104
|
+
|
105
|
+
|
61
106
|
def deep_replace(o: T, *args: str | ta.Callable[[ta.Any], ta.Mapping[str, ta.Any]]) -> T:
|
62
107
|
if not args:
|
63
108
|
return o
|
@@ -125,11 +125,13 @@ class _decorator_descriptor: # noqa
|
|
125
125
|
|
126
126
|
def __get__(self, instance, owner=None):
|
127
127
|
fn = self._fn.__get__(instance, owner)
|
128
|
+
|
128
129
|
if self._md or instance is not None:
|
129
130
|
@functools.wraps(fn)
|
130
131
|
def inner(*args, **kwargs):
|
131
132
|
return self._wrapper(fn, *args, **kwargs)
|
132
133
|
return inner
|
134
|
+
|
133
135
|
else:
|
134
136
|
@functools.wraps(fn)
|
135
137
|
def outer(this, *args, **kwargs):
|
@@ -69,8 +69,8 @@ class JsonLogFormatter(logging.Formatter):
|
|
69
69
|
STANDARD_LOG_FORMAT_PARTS = [
|
70
70
|
('asctime', '%(asctime)-15s'),
|
71
71
|
('process', 'pid=%(process)-6s'),
|
72
|
-
('thread', 'tid=%(thread)
|
73
|
-
('levelname', '%(levelname)
|
72
|
+
('thread', 'tid=%(thread)x'),
|
73
|
+
('levelname', '%(levelname)s'),
|
74
74
|
('name', '%(name)s'),
|
75
75
|
('separator', '::'),
|
76
76
|
('message', '%(message)s'),
|
@@ -31,10 +31,19 @@ def get_dataclass_metadata(ty: type) -> ObjectMetadata:
|
|
31
31
|
) or ObjectMetadata()
|
32
32
|
|
33
33
|
|
34
|
-
def get_field_infos(
|
34
|
+
def get_field_infos(
|
35
|
+
ty: type,
|
36
|
+
opts: col.TypeMap[Option] = col.TypeMap(),
|
37
|
+
) -> ta.Sequence[FieldInfo]:
|
35
38
|
dc_md = get_dataclass_metadata(ty)
|
36
39
|
dc_naming = dc_md.field_naming or opts.get(Naming)
|
37
40
|
|
41
|
+
fi_defaults = {
|
42
|
+
k: v
|
43
|
+
for k, v in dc.asdict(dc_md.field_defaults).items()
|
44
|
+
if v is not None
|
45
|
+
}
|
46
|
+
|
38
47
|
type_hints = ta.get_type_hints(ty)
|
39
48
|
|
40
49
|
ret: list[FieldInfo] = []
|
@@ -44,7 +53,8 @@ def get_field_infos(ty: type, opts: col.TypeMap[Option] = col.TypeMap()) -> ta.S
|
|
44
53
|
else:
|
45
54
|
um_name = field.name
|
46
55
|
|
47
|
-
kw = dict(
|
56
|
+
kw = dict(fi_defaults)
|
57
|
+
kw.update(
|
48
58
|
name=field.name,
|
49
59
|
type=type_hints[field.name],
|
50
60
|
metadata=FieldMetadata(),
|
@@ -54,7 +64,10 @@ def get_field_infos(ty: type, opts: col.TypeMap[Option] = col.TypeMap()) -> ta.S
|
|
54
64
|
)
|
55
65
|
|
56
66
|
if (fmd := field.metadata.get(FieldMetadata)) is not None:
|
57
|
-
kw.update(
|
67
|
+
kw.update(
|
68
|
+
metadata=fmd,
|
69
|
+
omit_if=fmd.omit_if,
|
70
|
+
)
|
58
71
|
|
59
72
|
if fmd.name is not None:
|
60
73
|
kw.update(
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import typing as ta
|
2
|
+
|
3
|
+
from .. import dataclasses as dc
|
4
|
+
from .objects import FieldMetadata
|
5
|
+
|
6
|
+
|
7
|
+
T = ta.TypeVar('T')
|
8
|
+
|
9
|
+
|
10
|
+
def update_fields_metadata(
|
11
|
+
fields: ta.Iterable[str] | None = None,
|
12
|
+
**kwargs: ta.Any,
|
13
|
+
) -> ta.Callable[[type[T]], type[T]]:
|
14
|
+
def inner(a: str, f: dc.Field) -> dc.Field:
|
15
|
+
return dc.update_field_metadata(f, {
|
16
|
+
FieldMetadata: dc.replace(
|
17
|
+
f.metadata.get(FieldMetadata, FieldMetadata()),
|
18
|
+
**kwargs,
|
19
|
+
),
|
20
|
+
})
|
21
|
+
|
22
|
+
return dc.update_fields(inner, fields)
|
@@ -22,18 +22,13 @@ from .values import Value
|
|
22
22
|
##
|
23
23
|
|
24
24
|
|
25
|
-
@dc.dataclass(frozen=True)
|
26
|
-
class ObjectMetadata:
|
27
|
-
field_naming: Naming | None = None
|
28
|
-
|
29
|
-
unknown_field: str | None = None
|
30
|
-
|
31
|
-
|
32
|
-
@dc.dataclass(frozen=True)
|
25
|
+
@dc.dataclass(frozen=True, kw_only=True)
|
33
26
|
class FieldMetadata:
|
34
27
|
name: str | None = None
|
35
28
|
alts: ta.Iterable[str] | None = None
|
36
29
|
|
30
|
+
omit_if: ta.Callable[[ta.Any], bool] | None = None
|
31
|
+
|
37
32
|
marshaler: Marshaler | None = None
|
38
33
|
marshaler_factory: MarshalerFactory | None = None
|
39
34
|
|
@@ -41,18 +36,30 @@ class FieldMetadata:
|
|
41
36
|
unmarshaler_factory: UnmarshalerFactory | None = None
|
42
37
|
|
43
38
|
|
39
|
+
@dc.dataclass(frozen=True, kw_only=True)
|
40
|
+
class ObjectMetadata:
|
41
|
+
field_naming: Naming | None = None
|
42
|
+
|
43
|
+
unknown_field: str | None = None
|
44
|
+
|
45
|
+
field_defaults: FieldMetadata = FieldMetadata()
|
46
|
+
|
47
|
+
|
44
48
|
##
|
45
49
|
|
46
50
|
|
47
|
-
@dc.dataclass(frozen=True)
|
51
|
+
@dc.dataclass(frozen=True, kw_only=True)
|
48
52
|
class FieldInfo:
|
49
53
|
name: str
|
50
54
|
type: ta.Any
|
51
|
-
metadata: FieldMetadata
|
52
55
|
|
53
56
|
marshal_name: str
|
54
57
|
unmarshal_names: ta.Sequence[str]
|
55
58
|
|
59
|
+
metadata: FieldMetadata = FieldMetadata()
|
60
|
+
|
61
|
+
omit_if: ta.Callable[[ta.Any], bool] | None = None
|
62
|
+
|
56
63
|
|
57
64
|
##
|
58
65
|
|
@@ -63,15 +70,20 @@ class ObjectMarshaler(Marshaler):
|
|
63
70
|
unknown_field: str | None = None
|
64
71
|
|
65
72
|
def marshal(self, ctx: MarshalContext, o: ta.Any) -> Value:
|
66
|
-
ret = {
|
67
|
-
|
68
|
-
|
69
|
-
|
73
|
+
ret = {}
|
74
|
+
for fi, m in self.fields:
|
75
|
+
v = getattr(o, fi.name)
|
76
|
+
if fi.omit_if is not None and fi.omit_if(v):
|
77
|
+
continue
|
78
|
+
ret[fi.marshal_name] = m.marshal(ctx, v)
|
79
|
+
|
70
80
|
if self.unknown_field is not None:
|
71
81
|
if (ukf := getattr(o, self.unknown_field)):
|
72
82
|
if (dks := set(ret) & set(ukf)):
|
73
83
|
raise KeyError(f'Unknown field keys duplicate fields: {dks!r}')
|
84
|
+
|
74
85
|
ret.update(ukf) # FIXME: marshal?
|
86
|
+
|
75
87
|
return ret
|
76
88
|
|
77
89
|
|
@@ -89,18 +101,25 @@ class ObjectUnmarshaler(Unmarshaler):
|
|
89
101
|
u: ta.Any
|
90
102
|
kw: dict[str, ta.Any] = {}
|
91
103
|
ukf: dict[str, ta.Any] | None = None
|
104
|
+
|
92
105
|
if self.unknown_field is not None:
|
93
106
|
kw[self.unknown_field] = ukf = {}
|
107
|
+
|
94
108
|
for k, mv in ma.items():
|
95
109
|
ks = check.isinstance(k, str)
|
110
|
+
|
96
111
|
try:
|
97
112
|
fi, u = self.fields_by_unmarshal_name[ks]
|
113
|
+
|
98
114
|
except KeyError:
|
99
115
|
if ukf is not None:
|
100
116
|
ukf[ks] = mv # FIXME: unmarshal?
|
101
117
|
continue
|
102
118
|
raise
|
119
|
+
|
103
120
|
if fi.name in kw:
|
104
121
|
raise KeyError(f'Duplicate keys for field {fi.name!r}: {ks!r}')
|
122
|
+
|
105
123
|
kw[fi.name] = u.unmarshal(ctx, mv)
|
124
|
+
|
106
125
|
return self.cls(**kw)
|
@@ -9,6 +9,7 @@ import time
|
|
9
9
|
import typing as ta
|
10
10
|
|
11
11
|
from . import check
|
12
|
+
from . import lang
|
12
13
|
from . import libc
|
13
14
|
|
14
15
|
|
@@ -18,6 +19,32 @@ T = ta.TypeVar('T')
|
|
18
19
|
##
|
19
20
|
|
20
21
|
|
22
|
+
@ta.runtime_checkable
|
23
|
+
class ValueProxy(ta.Protocol[T]):
|
24
|
+
# value = property(get, set)
|
25
|
+
|
26
|
+
def get(self) -> T:
|
27
|
+
...
|
28
|
+
|
29
|
+
def set(self, value: T) -> None:
|
30
|
+
...
|
31
|
+
|
32
|
+
|
33
|
+
@dc.dataclass()
|
34
|
+
@lang.protocol_check(ValueProxy)
|
35
|
+
class DummyValueProxy(ValueProxy[T]):
|
36
|
+
value: T
|
37
|
+
|
38
|
+
def get(self) -> T:
|
39
|
+
return self.value
|
40
|
+
|
41
|
+
def set(self, value: T) -> None:
|
42
|
+
self.value = value
|
43
|
+
|
44
|
+
|
45
|
+
##
|
46
|
+
|
47
|
+
|
21
48
|
@dc.dataclass(frozen=True, kw_only=True)
|
22
49
|
class SpawnExtras:
|
23
50
|
fds: ta.AbstractSet[int] | None = None
|
@@ -75,6 +102,11 @@ class Deathpact(abc.ABC):
|
|
75
102
|
raise NotImplementedError
|
76
103
|
|
77
104
|
|
105
|
+
class NopDeathpact(Deathpact):
|
106
|
+
def poll(self) -> None:
|
107
|
+
pass
|
108
|
+
|
109
|
+
|
78
110
|
#
|
79
111
|
|
80
112
|
|
File without changes
|
@@ -0,0 +1,42 @@
|
|
1
|
+
from .base import ( # noqa
|
2
|
+
Keyword,
|
3
|
+
Keywords,
|
4
|
+
)
|
5
|
+
|
6
|
+
from .core import ( # noqa
|
7
|
+
CoreKeyword,
|
8
|
+
Id,
|
9
|
+
Ref,
|
10
|
+
SchemaKeyword,
|
11
|
+
)
|
12
|
+
|
13
|
+
from .metadata import ( # noqa
|
14
|
+
Description,
|
15
|
+
MetadataKeyword,
|
16
|
+
Title,
|
17
|
+
)
|
18
|
+
|
19
|
+
from .parse import ( # noqa
|
20
|
+
parse_keyword,
|
21
|
+
parse_keywords,
|
22
|
+
)
|
23
|
+
|
24
|
+
from .render import ( # noqa
|
25
|
+
render_keyword,
|
26
|
+
render_keywords,
|
27
|
+
)
|
28
|
+
|
29
|
+
from .validation import ( # noqa
|
30
|
+
ExclusiveMaximum,
|
31
|
+
ExclusiveMinimum,
|
32
|
+
Items,
|
33
|
+
MaxItems,
|
34
|
+
Maximum,
|
35
|
+
MinItems,
|
36
|
+
Minimum,
|
37
|
+
Properties,
|
38
|
+
Required,
|
39
|
+
Type,
|
40
|
+
UniqueItems,
|
41
|
+
ValidationKeyword,
|
42
|
+
)
|
@@ -0,0 +1,86 @@
|
|
1
|
+
import operator
|
2
|
+
import typing as ta
|
3
|
+
|
4
|
+
from omlish import cached
|
5
|
+
from omlish import check
|
6
|
+
from omlish import collections as col
|
7
|
+
from omlish import dataclasses as dc
|
8
|
+
from omlish import lang
|
9
|
+
|
10
|
+
|
11
|
+
KeywordT = ta.TypeVar('KeywordT', bound='Keyword')
|
12
|
+
|
13
|
+
|
14
|
+
##
|
15
|
+
|
16
|
+
|
17
|
+
class Keyword(lang.Abstract, lang.PackageSealed):
|
18
|
+
tag: ta.ClassVar[str]
|
19
|
+
|
20
|
+
def __init_subclass__(cls, *, tag: str | None = None, **kwargs: ta.Any) -> None:
|
21
|
+
super().__init_subclass__(**kwargs)
|
22
|
+
check.not_in('tag', dir(cls))
|
23
|
+
if not lang.is_abstract_class(cls):
|
24
|
+
check.issubclass(cls, lang.Final)
|
25
|
+
cls.tag = check.non_empty_str(tag)
|
26
|
+
else:
|
27
|
+
check.none(tag)
|
28
|
+
|
29
|
+
|
30
|
+
##
|
31
|
+
|
32
|
+
|
33
|
+
@dc.dataclass(frozen=True)
|
34
|
+
class Keywords(lang.Final):
|
35
|
+
lst: ta.Sequence[Keyword]
|
36
|
+
|
37
|
+
@cached.property
|
38
|
+
@dc.init
|
39
|
+
def by_type(self) -> ta.Mapping[type[Keyword], Keyword]:
|
40
|
+
return col.unique_map_by(type, self.lst, strict=True) # noqa
|
41
|
+
|
42
|
+
@cached.property
|
43
|
+
@dc.init
|
44
|
+
def by_tag(self) -> ta.Mapping[str, Keyword]:
|
45
|
+
return col.unique_map_by(operator.attrgetter('tag'), self.lst, strict=True) # noqa
|
46
|
+
|
47
|
+
def __getitem__(self, item: type[KeywordT] | str) -> KeywordT:
|
48
|
+
if isinstance(item, type):
|
49
|
+
return self.by_type[item] # noqa
|
50
|
+
elif isinstance(item, str):
|
51
|
+
return self.by_tag[item]
|
52
|
+
else:
|
53
|
+
raise TypeError(item)
|
54
|
+
|
55
|
+
|
56
|
+
##
|
57
|
+
|
58
|
+
|
59
|
+
@dc.dataclass(frozen=True)
|
60
|
+
class BooleanKeyword(Keyword, lang.Abstract):
|
61
|
+
b: bool
|
62
|
+
|
63
|
+
|
64
|
+
@dc.dataclass(frozen=True)
|
65
|
+
class NumberKeyword(Keyword, lang.Abstract):
|
66
|
+
n: int | float
|
67
|
+
|
68
|
+
|
69
|
+
@dc.dataclass(frozen=True)
|
70
|
+
class StrKeyword(Keyword, lang.Abstract):
|
71
|
+
s: str
|
72
|
+
|
73
|
+
|
74
|
+
@dc.dataclass(frozen=True)
|
75
|
+
class StrOrStrsKeyword(Keyword, lang.Abstract):
|
76
|
+
ss: str | ta.Sequence[str]
|
77
|
+
|
78
|
+
|
79
|
+
@dc.dataclass(frozen=True)
|
80
|
+
class KeywordsKeyword(Keyword, lang.Abstract):
|
81
|
+
kw: Keywords
|
82
|
+
|
83
|
+
|
84
|
+
@dc.dataclass(frozen=True)
|
85
|
+
class StrToKeywordsKeyword(Keyword, lang.Abstract):
|
86
|
+
m: ta.Mapping[str, Keywords]
|
@@ -0,0 +1,26 @@
|
|
1
|
+
from omlish import lang
|
2
|
+
|
3
|
+
from .base import Keyword
|
4
|
+
from .base import StrKeyword
|
5
|
+
|
6
|
+
|
7
|
+
##
|
8
|
+
|
9
|
+
|
10
|
+
class CoreKeyword(Keyword, lang.Abstract):
|
11
|
+
pass
|
12
|
+
|
13
|
+
|
14
|
+
##
|
15
|
+
|
16
|
+
|
17
|
+
class Id(StrKeyword, CoreKeyword, lang.Final, tag='$id'):
|
18
|
+
pass
|
19
|
+
|
20
|
+
|
21
|
+
class SchemaKeyword(StrKeyword, CoreKeyword, lang.Final, tag='$schema'):
|
22
|
+
pass
|
23
|
+
|
24
|
+
|
25
|
+
class Ref(StrKeyword, CoreKeyword, lang.Final, tag='$ref'):
|
26
|
+
pass
|
@@ -0,0 +1,22 @@
|
|
1
|
+
from omlish import lang
|
2
|
+
|
3
|
+
from .base import Keyword
|
4
|
+
from .base import StrKeyword
|
5
|
+
|
6
|
+
|
7
|
+
##
|
8
|
+
|
9
|
+
|
10
|
+
class MetadataKeyword(Keyword, lang.Abstract):
|
11
|
+
pass
|
12
|
+
|
13
|
+
|
14
|
+
##
|
15
|
+
|
16
|
+
|
17
|
+
class Title(StrKeyword, MetadataKeyword, lang.Final, tag='title'):
|
18
|
+
pass
|
19
|
+
|
20
|
+
|
21
|
+
class Description(StrKeyword, MetadataKeyword, lang.Final, tag='description'):
|
22
|
+
pass
|