omdev 0.0.0.dev431__tar.gz → 0.0.0.dev433__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.
- {omdev-0.0.0.dev431/omdev.egg-info → omdev-0.0.0.dev433}/PKG-INFO +4 -4
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/.omlish-manifests.json +1 -1
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/__about__.py +1 -1
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/scripts/execstat.py +20 -20
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/scripts/ci.py +105 -39
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/scripts/interp.py +10 -6
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/scripts/pyproject.py +105 -39
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433/omdev.egg-info}/PKG-INFO +4 -4
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev.egg-info/requires.txt +3 -3
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/pyproject.toml +4 -4
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/LICENSE +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/MANIFEST.in +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/README.md +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/__main__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/cli/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/cli/main.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/gen.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/imports.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/manifests.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/resources.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/srcfiles.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/strip.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/types.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/typing.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/sources.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/compute/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/compute/cache.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/compute/contexts.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/compute/currents.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/compute/fns.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/compute/resolvers.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/compute/storage.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/compute/types.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/data/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/data/actions.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/data/cache.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/data/consts.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/data/defaults.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/data/manifests.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/data/specs.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/capi/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/capi/darwin/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/capi/darwin/aps.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/capi/darwin/ax.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/capi/darwin/cf.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/capi/darwin/cg.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/capi/linux/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/capi/linux/x11.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cc/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cc/__main__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cc/cdeps.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cc/cdeps.toml +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cc/cli.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cc/srclangs.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_boilerplate.cc +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/LICENSE +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/build_ext.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/compilers/options.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/dir_util.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/errors.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/extension.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/file_util.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/modified.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/spawn.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/sysconfig.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/util.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/version.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/build.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/cmake.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/importhook.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/magic.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/scan.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/__main__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/cache.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/ci.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/cli.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/compose.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/consts.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/buildcaching.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/cache.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/cacheserved/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/cacheserved/cache.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/cacheserved/manifests.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/cmds.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/dataserver.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/imagepulling.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/inject.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/packing.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/repositories.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/utils.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/clients.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/v1/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/v1/api.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/v1/client.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/v2/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/v2/api.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/v2/azure.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/v2/client.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/bootstrap.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/cache.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/cli.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/env.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/inject.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/inject.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/requirements.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/shell.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/utils.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cli/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cli/__main__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cli/_pathhack.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cli/clicli.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cli/install.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cli/main.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cli/managers.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cli/types.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/clipboard/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/clipboard/clipboard.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/clipboard/darwin_cf.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/clipboard/linux_x11.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cmake.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cmdlog/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cmdlog/__main__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cmdlog/_cmdlog.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cmdlog/cli.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cmdlog/cmdlog.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataclasses/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataclasses/__main__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataclasses/cli.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataclasses/codegen.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataserver/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataserver/handlers.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataserver/http.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataserver/routes.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataserver/server.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataserver/targets.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/git/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/git/magic.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/git/revisions.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/git/shallow.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/git/status.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/home/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/home/paths.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/home/secrets.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/home/shadow.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/imgur.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/intellij/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/intellij/cli.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/intellij/ides.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/intellij/open.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/__main__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/cli.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/default.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/inject.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/inspect.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/providers/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/providers/base.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/providers/inject.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/providers/running.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/providers/standalone.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/providers/system.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/pyenv/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/pyenv/inject.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/pyenv/install.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/pyenv/provider.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/pyenv/pyenv.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/resolvers.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/types.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/uv/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/uv/inject.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/uv/provider.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/uv/uv.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/venvs.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/magic/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/magic/__main__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/magic/cli.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/magic/find.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/magic/magic.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/magic/prepare.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/magic/styles.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/manifests/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/manifests/__main__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/manifests/_dumping.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/manifests/building.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/manifests/dumping.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/manifests/main.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/mypy/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/mypy/debug.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/mypy/report.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/building.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/compression.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/data.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/datarefs.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/dataserver.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/loading.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/media.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/pack/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/pack/packing.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/pack/repositories.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/pack/unpacking.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/repositories.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/tars.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/packaging/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/packaging/marshal.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/packaging/names.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/packaging/requires.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/packaging/revisions.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/packaging/specifiers.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/packaging/versions.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/packaging/wheelfile.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pip.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/__main__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/base.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/caches.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/git.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/imports.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/lite.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/main.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/manifests.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/scripts.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/unicode.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/apps/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/apps/ncdu.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/confirm.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/LICENSE +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/__main__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/border.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/cli.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/markdown.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/parser.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/styles.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/tags.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/utils.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/attrdocs.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/bracepy.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/classdot.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/LICENSE +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/attrdoc.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/common.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/epydoc.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/google.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/numpydoc.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/parser.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/rest.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/findimports.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/scripts/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/scripts/bumpversion.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/scripts/importtrace.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/srcheaders.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/tools/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/tools/importscan.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/tools/mkrelimp.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/__main__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/cexts.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/cli.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/configs.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/inject.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/pkg.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/reqs.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/resources/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/resources/docker-dev.sh +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/resources/python.sh +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/venvs.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/scripts/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/scripts/slowcat.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/scripts/tmpexec.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tagstrings.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tokens/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tokens/all.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tokens/tokenizert.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tokens/utils.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/cloc.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/diff.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/doc.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/docker.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/git/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/git/__main__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/git/cli.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/git/cloning.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/git/consts.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/git/messages.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/json/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/json/__main__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/json/cli.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/json/formats.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/json/io.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/json/parsing.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/json/processing.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/json/rendering.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/jsonview/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/jsonview/__main__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/jsonview/cli.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/jsonview/resources/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/jsonview/resources/jsonview.css +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/jsonview/resources/jsonview.js +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/linehisto.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/mkenv.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/notebook.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/pawk/__init__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/pawk/__main__.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/pawk/pawk.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/pip.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/prof.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/qr.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/shadow.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/shell.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/sqlrepl.py +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev.egg-info/SOURCES.txt +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev.egg-info/dependency_links.txt +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev.egg-info/entry_points.txt +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev.egg-info/top_level.txt +0 -0
- {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: omdev
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev433
|
4
4
|
Summary: omdev
|
5
5
|
Author: wrmsr
|
6
6
|
License-Expression: BSD-3-Clause
|
@@ -14,10 +14,10 @@ Classifier: Programming Language :: Python :: 3.13
|
|
14
14
|
Requires-Python: >=3.13
|
15
15
|
Description-Content-Type: text/markdown
|
16
16
|
License-File: LICENSE
|
17
|
-
Requires-Dist: omlish==0.0.0.
|
17
|
+
Requires-Dist: omlish==0.0.0.dev433
|
18
18
|
Provides-Extra: all
|
19
19
|
Requires-Dist: black~=25.1; extra == "all"
|
20
|
-
Requires-Dist: pycparser~=2.
|
20
|
+
Requires-Dist: pycparser~=2.23; extra == "all"
|
21
21
|
Requires-Dist: pcpp~=1.30; extra == "all"
|
22
22
|
Requires-Dist: docutils~=0.22; extra == "all"
|
23
23
|
Requires-Dist: markdown-it-py~=4.0; extra == "all"
|
@@ -30,7 +30,7 @@ Requires-Dist: segno~=1.6; extra == "all"
|
|
30
30
|
Provides-Extra: black
|
31
31
|
Requires-Dist: black~=25.1; extra == "black"
|
32
32
|
Provides-Extra: c
|
33
|
-
Requires-Dist: pycparser~=2.
|
33
|
+
Requires-Dist: pycparser~=2.23; extra == "c"
|
34
34
|
Requires-Dist: pcpp~=1.30; extra == "c"
|
35
35
|
Provides-Extra: doc
|
36
36
|
Requires-Dist: docutils~=0.22; extra == "doc"
|
@@ -17,13 +17,14 @@ import typing as ta
|
|
17
17
|
|
18
18
|
|
19
19
|
def _run(
|
20
|
+
report: 'ta.Callable[[dict], None]',
|
20
21
|
src: str,
|
21
22
|
*,
|
22
23
|
setup: 'ta.Optional[str]' = None,
|
23
24
|
time: bool = False,
|
24
25
|
rss: bool = False,
|
25
26
|
modules: bool = False,
|
26
|
-
) ->
|
27
|
+
) -> None:
|
27
28
|
if rss:
|
28
29
|
import resource # noqa
|
29
30
|
|
@@ -61,26 +62,28 @@ def _run(
|
|
61
62
|
|
62
63
|
#
|
63
64
|
|
64
|
-
|
65
|
+
try:
|
66
|
+
exec(code, globals(), ns)
|
65
67
|
|
66
|
-
|
68
|
+
finally:
|
69
|
+
#
|
67
70
|
|
68
|
-
|
69
|
-
|
71
|
+
if time:
|
72
|
+
end_time = get_time()
|
70
73
|
|
71
|
-
|
72
|
-
|
74
|
+
if rss:
|
75
|
+
end_rss = get_rss()
|
73
76
|
|
74
|
-
|
75
|
-
|
77
|
+
if modules:
|
78
|
+
end_modules = get_modules()
|
76
79
|
|
77
|
-
|
80
|
+
#
|
78
81
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
82
|
+
report({
|
83
|
+
**({'time': (end_time - start_time)} if time else {}), # noqa
|
84
|
+
**({'rss': (end_rss - start_rss)} if rss else {}), # noqa
|
85
|
+
**({'modules': [m for m in end_modules if m not in start_modules]} if modules else {}), # noqa
|
86
|
+
})
|
84
87
|
|
85
88
|
|
86
89
|
#
|
@@ -145,13 +148,10 @@ def _main() -> None:
|
|
145
148
|
|
146
149
|
payload = '\n'.join([
|
147
150
|
inspect.getsource(_run),
|
148
|
-
f'
|
149
|
-
f'import json',
|
150
|
-
f'with open({out_file!r}, "w") as f:', # noqa
|
151
|
-
f' f.write(json.dumps(dct))',
|
151
|
+
f'with open({out_file!r}, "w") as f: _run(lambda dct: f.write(__import__("json").dumps(dct)), **{run_kw!r})', # noqa
|
152
152
|
])
|
153
153
|
|
154
|
-
subprocess.
|
154
|
+
subprocess.call([exe, '-c', payload])
|
155
155
|
|
156
156
|
with open(out_file) as f:
|
157
157
|
result = json.load(f)
|
@@ -7653,6 +7653,16 @@ class LoggingContext(Abstract):
|
|
7653
7653
|
raise TypeError(f'LoggingContextInfo absent: {ty}')
|
7654
7654
|
return info
|
7655
7655
|
|
7656
|
+
|
7657
|
+
@ta.final
|
7658
|
+
class SimpleLoggingContext(LoggingContext):
|
7659
|
+
def __init__(self, *infos: LoggingContextInfo) -> None:
|
7660
|
+
self._infos: ta.Dict[ta.Type[LoggingContextInfo], LoggingContextInfo] = {type(i): i for i in infos}
|
7661
|
+
|
7662
|
+
def get_info(self, ty: ta.Type[LoggingContextInfoT]) -> ta.Optional[LoggingContextInfoT]:
|
7663
|
+
return self._infos.get(ty)
|
7664
|
+
|
7665
|
+
|
7656
7666
|
##
|
7657
7667
|
|
7658
7668
|
|
@@ -7703,16 +7713,17 @@ class CaptureLoggingContextImpl(CaptureLoggingContext):
|
|
7703
7713
|
stack_offset: int = 0,
|
7704
7714
|
stack_info: bool = False,
|
7705
7715
|
) -> None:
|
7706
|
-
# TODO: Name, Msg, Extra
|
7707
|
-
|
7708
7716
|
if time_ns is None:
|
7709
7717
|
time_ns = time.time_ns()
|
7710
7718
|
|
7719
|
+
# Done early to not trample on sys.exc_info()
|
7720
|
+
exc = LoggingContextInfos.Exc.build(exc_info)
|
7721
|
+
|
7711
7722
|
self._infos: ta.Dict[ta.Type[LoggingContextInfo], LoggingContextInfo] = {}
|
7712
7723
|
self._set_info(
|
7713
7724
|
LoggingContextInfos.Level.build(level),
|
7725
|
+
exc,
|
7714
7726
|
LoggingContextInfos.Time.build(time_ns),
|
7715
|
-
LoggingContextInfos.Exc.build(exc_info),
|
7716
7727
|
)
|
7717
7728
|
|
7718
7729
|
if caller is not CaptureLoggingContextImpl.NOT_SET:
|
@@ -7854,10 +7865,14 @@ def _locking_logging_module_lock() -> ta.Iterator[None]:
|
|
7854
7865
|
def configure_standard_logging(
|
7855
7866
|
level: ta.Union[int, str] = logging.INFO,
|
7856
7867
|
*,
|
7857
|
-
json: bool = False,
|
7858
7868
|
target: ta.Optional[logging.Logger] = None,
|
7869
|
+
|
7859
7870
|
force: bool = False,
|
7871
|
+
|
7860
7872
|
handler_factory: ta.Optional[ta.Callable[[], logging.Handler]] = None,
|
7873
|
+
|
7874
|
+
formatter: ta.Optional[logging.Formatter] = None, # noqa
|
7875
|
+
json: bool = False,
|
7861
7876
|
) -> ta.Optional[StandardConfiguredLoggingHandler]:
|
7862
7877
|
with _locking_logging_module_lock():
|
7863
7878
|
if target is None:
|
@@ -7878,11 +7893,11 @@ def configure_standard_logging(
|
|
7878
7893
|
|
7879
7894
|
#
|
7880
7895
|
|
7881
|
-
formatter:
|
7882
|
-
|
7883
|
-
|
7884
|
-
|
7885
|
-
|
7896
|
+
if formatter is None:
|
7897
|
+
if json:
|
7898
|
+
formatter = JsonLoggingFormatter()
|
7899
|
+
else:
|
7900
|
+
formatter = StandardLoggingFormatter(StandardLoggingFormatter.build_log_format(STANDARD_LOG_FORMAT_PARTS)) # noqa
|
7886
7901
|
handler.setFormatter(formatter)
|
7887
7902
|
|
7888
7903
|
#
|
@@ -9855,22 +9870,6 @@ class LoggingContextInfoRecordAdapters:
|
|
9855
9870
|
args=rec.args,
|
9856
9871
|
)
|
9857
9872
|
|
9858
|
-
# FIXME: handled specially - all unknown attrs on LogRecord
|
9859
|
-
# class Extra(Adapter[LoggingContextInfos.Extra]):
|
9860
|
-
# _record_attrs: ta.ClassVar[ta.Mapping[str, ta.Union[ta.Any, ta.Tuple[ta.Any, ta.Any]]]] = dict()
|
9861
|
-
#
|
9862
|
-
# def info_to_record(self, info: ta.Optional[LoggingContextInfos.Extra]) -> ta.Mapping[str, ta.Any]:
|
9863
|
-
# # FIXME:
|
9864
|
-
# # if extra is not None:
|
9865
|
-
# # for key in extra:
|
9866
|
-
# # if (key in ["message", "asctime"]) or (key in rv.__dict__):
|
9867
|
-
# # raise KeyError("Attempt to overwrite %r in LogRecord" % key)
|
9868
|
-
# # rv.__dict__[key] = extra[key]
|
9869
|
-
# return dict()
|
9870
|
-
#
|
9871
|
-
# def record_to_info(self, rec: logging.LogRecord) -> ta.Optional[LoggingContextInfos.Extra]:
|
9872
|
-
# return None
|
9873
|
-
|
9874
9873
|
class Time(RequiredAdapter[LoggingContextInfos.Time]):
|
9875
9874
|
info_cls: ta.ClassVar[ta.Type[LoggingContextInfos.Time]] = LoggingContextInfos.Time
|
9876
9875
|
|
@@ -9976,8 +9975,23 @@ class LoggingContextInfoRecordAdapters:
|
|
9976
9975
|
|
9977
9976
|
def record_to_info(self, rec: logging.LogRecord) -> ta.Optional[LoggingContextInfos.Caller]:
|
9978
9977
|
# FIXME: piecemeal?
|
9979
|
-
|
9980
|
-
|
9978
|
+
if (
|
9979
|
+
rec.pathname != self._UNKNOWN_PATH_NAME and
|
9980
|
+
rec.lineno != 0 and
|
9981
|
+
rec.funcName != self._UNKNOWN_FUNC_NAME
|
9982
|
+
):
|
9983
|
+
if (sinfo := rec.stack_info) is not None and sinfo.startswith(self._STACK_INFO_PREFIX):
|
9984
|
+
sinfo = sinfo[len(self._STACK_INFO_PREFIX):]
|
9985
|
+
return LoggingContextInfos.Caller(
|
9986
|
+
file_path=rec.pathname,
|
9987
|
+
|
9988
|
+
line_no=rec.lineno,
|
9989
|
+
func_name=rec.funcName,
|
9990
|
+
|
9991
|
+
stack_info=sinfo,
|
9992
|
+
)
|
9993
|
+
|
9994
|
+
return None
|
9981
9995
|
|
9982
9996
|
class SourceFile(Adapter[LoggingContextInfos.SourceFile]):
|
9983
9997
|
info_cls: ta.ClassVar[ta.Type[LoggingContextInfos.SourceFile]] = LoggingContextInfos.SourceFile
|
@@ -10013,9 +10027,9 @@ class LoggingContextInfoRecordAdapters:
|
|
10013
10027
|
)
|
10014
10028
|
|
10015
10029
|
def record_to_info(self, rec: logging.LogRecord) -> ta.Optional[LoggingContextInfos.SourceFile]:
|
10016
|
-
if
|
10017
|
-
rec.module is None
|
10018
|
-
rec.module
|
10030
|
+
if (
|
10031
|
+
rec.module is not None and
|
10032
|
+
rec.module != self._UNKNOWN_MODULE
|
10019
10033
|
):
|
10020
10034
|
return LoggingContextInfos.SourceFile(
|
10021
10035
|
file_name=rec.filename,
|
@@ -10168,16 +10182,11 @@ _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS: ta.Mapping[ta.Type[LoggingContextInfo], L
|
|
10168
10182
|
##
|
10169
10183
|
|
10170
10184
|
|
10171
|
-
KNOWN_STD_LOGGING_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(
|
10172
|
-
a for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS.values() for a in ad.record_attrs
|
10173
|
-
)
|
10174
|
-
|
10175
|
-
|
10176
10185
|
# Formatter:
|
10177
10186
|
# - https://github.com/python/cpython/blob/39b2f82717a69dde7212bc39b673b0f55c99e6a3/Lib/logging/__init__.py#L514 (3.8)
|
10178
10187
|
# - https://github.com/python/cpython/blob/f070f54c5f4a42c7c61d1d5d3b8f3b7203b4a0fb/Lib/logging/__init__.py#L554 (~3.14) # noqa
|
10179
10188
|
#
|
10180
|
-
|
10189
|
+
_KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS: ta.Dict[str, ta.Any] = dict(
|
10181
10190
|
# The logged message, computed as msg % args. Set to `record.getMessage()`.
|
10182
10191
|
message=str,
|
10183
10192
|
|
@@ -10191,7 +10200,15 @@ KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS: ta.Dict[str, ta.Any] = dict(
|
|
10191
10200
|
exc_text=ta.Optional[str],
|
10192
10201
|
)
|
10193
10202
|
|
10194
|
-
|
10203
|
+
|
10204
|
+
##
|
10205
|
+
|
10206
|
+
|
10207
|
+
_KNOWN_STD_LOGGING_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(
|
10208
|
+
a for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS.values() for a in ad.record_attrs
|
10209
|
+
)
|
10210
|
+
|
10211
|
+
_KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(_KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS)
|
10195
10212
|
|
10196
10213
|
|
10197
10214
|
class UnknownStdLoggingRecordAttrsWarning(LoggingSetupWarning):
|
@@ -10201,13 +10218,13 @@ class UnknownStdLoggingRecordAttrsWarning(LoggingSetupWarning):
|
|
10201
10218
|
def _check_std_logging_record_attrs() -> None:
|
10202
10219
|
if (
|
10203
10220
|
len([a for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS.values() for a in ad.record_attrs]) !=
|
10204
|
-
len(
|
10221
|
+
len(_KNOWN_STD_LOGGING_RECORD_ATTR_SET)
|
10205
10222
|
):
|
10206
10223
|
raise RuntimeError('Duplicate LoggingContextInfoRecordAdapter record attrs')
|
10207
10224
|
|
10208
10225
|
rec_dct = dict(logging.makeLogRecord({}).__dict__)
|
10209
10226
|
|
10210
|
-
if (unk_rec_fields := frozenset(rec_dct) -
|
10227
|
+
if (unk_rec_fields := frozenset(rec_dct) - _KNOWN_STD_LOGGING_RECORD_ATTR_SET):
|
10211
10228
|
import warnings # noqa
|
10212
10229
|
|
10213
10230
|
warnings.warn(
|
@@ -10233,11 +10250,60 @@ class LoggingContextLogRecord(logging.LogRecord):
|
|
10233
10250
|
# - exc_info: LoggingExcInfoTuple | None
|
10234
10251
|
# - func: str | None = None -> funcName
|
10235
10252
|
# - sinfo: str | None = None -> stack_info
|
10253
|
+
#
|
10236
10254
|
|
10237
10255
|
def __init__(self, *, _logging_context: LoggingContext) -> None: # noqa
|
10256
|
+
self.__dict__.update(_logging_context=_logging_context)
|
10257
|
+
|
10238
10258
|
for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS_:
|
10239
10259
|
self.__dict__.update(ad.context_to_record(_logging_context))
|
10240
10260
|
|
10261
|
+
_logging_context: LoggingContext
|
10262
|
+
|
10263
|
+
# FIXME: track extra
|
10264
|
+
# def __setattr__(self, key, value):
|
10265
|
+
# super().__setattr__(key, value)
|
10266
|
+
|
10267
|
+
|
10268
|
+
##
|
10269
|
+
|
10270
|
+
|
10271
|
+
@ta.final
|
10272
|
+
class LogRecordLoggingContext(LoggingContext):
|
10273
|
+
def __init__(self, rec: logging.LogRecord) -> None:
|
10274
|
+
if isinstance(rec, LoggingContextLogRecord):
|
10275
|
+
raise TypeError(rec)
|
10276
|
+
|
10277
|
+
self._rec = rec
|
10278
|
+
|
10279
|
+
infos: ta.List[LoggingContextInfo] = [
|
10280
|
+
info
|
10281
|
+
for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS_
|
10282
|
+
if (info := ad.record_to_info(rec)) is not None
|
10283
|
+
]
|
10284
|
+
|
10285
|
+
# FIXME:
|
10286
|
+
# if extra is not None:
|
10287
|
+
# for key in extra:
|
10288
|
+
# if (key in ["message", "asctime"]) or (key in rv.__dict__):
|
10289
|
+
# raise KeyError("Attempt to overwrite %r in LogRecord" % key)
|
10290
|
+
# rv.__dict__[key] = extra[key]
|
10291
|
+
|
10292
|
+
if (extra := {
|
10293
|
+
a: v
|
10294
|
+
for a, v in rec.__dict__.items()
|
10295
|
+
if a not in _KNOWN_STD_LOGGING_RECORD_ATTR_SET
|
10296
|
+
}):
|
10297
|
+
infos.append(LoggingContextInfos.Extra(extra))
|
10298
|
+
|
10299
|
+
self._infos: ta.Dict[ta.Type[LoggingContextInfo], LoggingContextInfo] = {
|
10300
|
+
type(info): info
|
10301
|
+
for info in infos
|
10302
|
+
}
|
10303
|
+
|
10304
|
+
def get_info(self, ty: ta.Type[LoggingContextInfoT]) -> ta.Optional[LoggingContextInfoT]:
|
10305
|
+
return self._infos.get(ty)
|
10306
|
+
|
10241
10307
|
|
10242
10308
|
########################################
|
10243
10309
|
# ../../../omlish/secrets/tempssl.py
|
@@ -4220,10 +4220,14 @@ def _locking_logging_module_lock() -> ta.Iterator[None]:
|
|
4220
4220
|
def configure_standard_logging(
|
4221
4221
|
level: ta.Union[int, str] = logging.INFO,
|
4222
4222
|
*,
|
4223
|
-
json: bool = False,
|
4224
4223
|
target: ta.Optional[logging.Logger] = None,
|
4224
|
+
|
4225
4225
|
force: bool = False,
|
4226
|
+
|
4226
4227
|
handler_factory: ta.Optional[ta.Callable[[], logging.Handler]] = None,
|
4228
|
+
|
4229
|
+
formatter: ta.Optional[logging.Formatter] = None, # noqa
|
4230
|
+
json: bool = False,
|
4227
4231
|
) -> ta.Optional[StandardConfiguredLoggingHandler]:
|
4228
4232
|
with _locking_logging_module_lock():
|
4229
4233
|
if target is None:
|
@@ -4244,11 +4248,11 @@ def configure_standard_logging(
|
|
4244
4248
|
|
4245
4249
|
#
|
4246
4250
|
|
4247
|
-
formatter:
|
4248
|
-
|
4249
|
-
|
4250
|
-
|
4251
|
-
|
4251
|
+
if formatter is None:
|
4252
|
+
if json:
|
4253
|
+
formatter = JsonLoggingFormatter()
|
4254
|
+
else:
|
4255
|
+
formatter = StandardLoggingFormatter(StandardLoggingFormatter.build_log_format(STANDARD_LOG_FORMAT_PARTS)) # noqa
|
4252
4256
|
handler.setFormatter(formatter)
|
4253
4257
|
|
4254
4258
|
#
|
@@ -7116,6 +7116,16 @@ class LoggingContext(Abstract):
|
|
7116
7116
|
raise TypeError(f'LoggingContextInfo absent: {ty}')
|
7117
7117
|
return info
|
7118
7118
|
|
7119
|
+
|
7120
|
+
@ta.final
|
7121
|
+
class SimpleLoggingContext(LoggingContext):
|
7122
|
+
def __init__(self, *infos: LoggingContextInfo) -> None:
|
7123
|
+
self._infos: ta.Dict[ta.Type[LoggingContextInfo], LoggingContextInfo] = {type(i): i for i in infos}
|
7124
|
+
|
7125
|
+
def get_info(self, ty: ta.Type[LoggingContextInfoT]) -> ta.Optional[LoggingContextInfoT]:
|
7126
|
+
return self._infos.get(ty)
|
7127
|
+
|
7128
|
+
|
7119
7129
|
##
|
7120
7130
|
|
7121
7131
|
|
@@ -7166,16 +7176,17 @@ class CaptureLoggingContextImpl(CaptureLoggingContext):
|
|
7166
7176
|
stack_offset: int = 0,
|
7167
7177
|
stack_info: bool = False,
|
7168
7178
|
) -> None:
|
7169
|
-
# TODO: Name, Msg, Extra
|
7170
|
-
|
7171
7179
|
if time_ns is None:
|
7172
7180
|
time_ns = time.time_ns()
|
7173
7181
|
|
7182
|
+
# Done early to not trample on sys.exc_info()
|
7183
|
+
exc = LoggingContextInfos.Exc.build(exc_info)
|
7184
|
+
|
7174
7185
|
self._infos: ta.Dict[ta.Type[LoggingContextInfo], LoggingContextInfo] = {}
|
7175
7186
|
self._set_info(
|
7176
7187
|
LoggingContextInfos.Level.build(level),
|
7188
|
+
exc,
|
7177
7189
|
LoggingContextInfos.Time.build(time_ns),
|
7178
|
-
LoggingContextInfos.Exc.build(exc_info),
|
7179
7190
|
)
|
7180
7191
|
|
7181
7192
|
if caller is not CaptureLoggingContextImpl.NOT_SET:
|
@@ -7317,10 +7328,14 @@ def _locking_logging_module_lock() -> ta.Iterator[None]:
|
|
7317
7328
|
def configure_standard_logging(
|
7318
7329
|
level: ta.Union[int, str] = logging.INFO,
|
7319
7330
|
*,
|
7320
|
-
json: bool = False,
|
7321
7331
|
target: ta.Optional[logging.Logger] = None,
|
7332
|
+
|
7322
7333
|
force: bool = False,
|
7334
|
+
|
7323
7335
|
handler_factory: ta.Optional[ta.Callable[[], logging.Handler]] = None,
|
7336
|
+
|
7337
|
+
formatter: ta.Optional[logging.Formatter] = None, # noqa
|
7338
|
+
json: bool = False,
|
7324
7339
|
) -> ta.Optional[StandardConfiguredLoggingHandler]:
|
7325
7340
|
with _locking_logging_module_lock():
|
7326
7341
|
if target is None:
|
@@ -7341,11 +7356,11 @@ def configure_standard_logging(
|
|
7341
7356
|
|
7342
7357
|
#
|
7343
7358
|
|
7344
|
-
formatter:
|
7345
|
-
|
7346
|
-
|
7347
|
-
|
7348
|
-
|
7359
|
+
if formatter is None:
|
7360
|
+
if json:
|
7361
|
+
formatter = JsonLoggingFormatter()
|
7362
|
+
else:
|
7363
|
+
formatter = StandardLoggingFormatter(StandardLoggingFormatter.build_log_format(STANDARD_LOG_FORMAT_PARTS)) # noqa
|
7349
7364
|
handler.setFormatter(formatter)
|
7350
7365
|
|
7351
7366
|
#
|
@@ -8000,22 +8015,6 @@ class LoggingContextInfoRecordAdapters:
|
|
8000
8015
|
args=rec.args,
|
8001
8016
|
)
|
8002
8017
|
|
8003
|
-
# FIXME: handled specially - all unknown attrs on LogRecord
|
8004
|
-
# class Extra(Adapter[LoggingContextInfos.Extra]):
|
8005
|
-
# _record_attrs: ta.ClassVar[ta.Mapping[str, ta.Union[ta.Any, ta.Tuple[ta.Any, ta.Any]]]] = dict()
|
8006
|
-
#
|
8007
|
-
# def info_to_record(self, info: ta.Optional[LoggingContextInfos.Extra]) -> ta.Mapping[str, ta.Any]:
|
8008
|
-
# # FIXME:
|
8009
|
-
# # if extra is not None:
|
8010
|
-
# # for key in extra:
|
8011
|
-
# # if (key in ["message", "asctime"]) or (key in rv.__dict__):
|
8012
|
-
# # raise KeyError("Attempt to overwrite %r in LogRecord" % key)
|
8013
|
-
# # rv.__dict__[key] = extra[key]
|
8014
|
-
# return dict()
|
8015
|
-
#
|
8016
|
-
# def record_to_info(self, rec: logging.LogRecord) -> ta.Optional[LoggingContextInfos.Extra]:
|
8017
|
-
# return None
|
8018
|
-
|
8019
8018
|
class Time(RequiredAdapter[LoggingContextInfos.Time]):
|
8020
8019
|
info_cls: ta.ClassVar[ta.Type[LoggingContextInfos.Time]] = LoggingContextInfos.Time
|
8021
8020
|
|
@@ -8121,8 +8120,23 @@ class LoggingContextInfoRecordAdapters:
|
|
8121
8120
|
|
8122
8121
|
def record_to_info(self, rec: logging.LogRecord) -> ta.Optional[LoggingContextInfos.Caller]:
|
8123
8122
|
# FIXME: piecemeal?
|
8124
|
-
|
8125
|
-
|
8123
|
+
if (
|
8124
|
+
rec.pathname != self._UNKNOWN_PATH_NAME and
|
8125
|
+
rec.lineno != 0 and
|
8126
|
+
rec.funcName != self._UNKNOWN_FUNC_NAME
|
8127
|
+
):
|
8128
|
+
if (sinfo := rec.stack_info) is not None and sinfo.startswith(self._STACK_INFO_PREFIX):
|
8129
|
+
sinfo = sinfo[len(self._STACK_INFO_PREFIX):]
|
8130
|
+
return LoggingContextInfos.Caller(
|
8131
|
+
file_path=rec.pathname,
|
8132
|
+
|
8133
|
+
line_no=rec.lineno,
|
8134
|
+
func_name=rec.funcName,
|
8135
|
+
|
8136
|
+
stack_info=sinfo,
|
8137
|
+
)
|
8138
|
+
|
8139
|
+
return None
|
8126
8140
|
|
8127
8141
|
class SourceFile(Adapter[LoggingContextInfos.SourceFile]):
|
8128
8142
|
info_cls: ta.ClassVar[ta.Type[LoggingContextInfos.SourceFile]] = LoggingContextInfos.SourceFile
|
@@ -8158,9 +8172,9 @@ class LoggingContextInfoRecordAdapters:
|
|
8158
8172
|
)
|
8159
8173
|
|
8160
8174
|
def record_to_info(self, rec: logging.LogRecord) -> ta.Optional[LoggingContextInfos.SourceFile]:
|
8161
|
-
if
|
8162
|
-
rec.module is None
|
8163
|
-
rec.module
|
8175
|
+
if (
|
8176
|
+
rec.module is not None and
|
8177
|
+
rec.module != self._UNKNOWN_MODULE
|
8164
8178
|
):
|
8165
8179
|
return LoggingContextInfos.SourceFile(
|
8166
8180
|
file_name=rec.filename,
|
@@ -8313,16 +8327,11 @@ _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS: ta.Mapping[ta.Type[LoggingContextInfo], L
|
|
8313
8327
|
##
|
8314
8328
|
|
8315
8329
|
|
8316
|
-
KNOWN_STD_LOGGING_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(
|
8317
|
-
a for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS.values() for a in ad.record_attrs
|
8318
|
-
)
|
8319
|
-
|
8320
|
-
|
8321
8330
|
# Formatter:
|
8322
8331
|
# - https://github.com/python/cpython/blob/39b2f82717a69dde7212bc39b673b0f55c99e6a3/Lib/logging/__init__.py#L514 (3.8)
|
8323
8332
|
# - https://github.com/python/cpython/blob/f070f54c5f4a42c7c61d1d5d3b8f3b7203b4a0fb/Lib/logging/__init__.py#L554 (~3.14) # noqa
|
8324
8333
|
#
|
8325
|
-
|
8334
|
+
_KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS: ta.Dict[str, ta.Any] = dict(
|
8326
8335
|
# The logged message, computed as msg % args. Set to `record.getMessage()`.
|
8327
8336
|
message=str,
|
8328
8337
|
|
@@ -8336,7 +8345,15 @@ KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS: ta.Dict[str, ta.Any] = dict(
|
|
8336
8345
|
exc_text=ta.Optional[str],
|
8337
8346
|
)
|
8338
8347
|
|
8339
|
-
|
8348
|
+
|
8349
|
+
##
|
8350
|
+
|
8351
|
+
|
8352
|
+
_KNOWN_STD_LOGGING_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(
|
8353
|
+
a for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS.values() for a in ad.record_attrs
|
8354
|
+
)
|
8355
|
+
|
8356
|
+
_KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(_KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS)
|
8340
8357
|
|
8341
8358
|
|
8342
8359
|
class UnknownStdLoggingRecordAttrsWarning(LoggingSetupWarning):
|
@@ -8346,13 +8363,13 @@ class UnknownStdLoggingRecordAttrsWarning(LoggingSetupWarning):
|
|
8346
8363
|
def _check_std_logging_record_attrs() -> None:
|
8347
8364
|
if (
|
8348
8365
|
len([a for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS.values() for a in ad.record_attrs]) !=
|
8349
|
-
len(
|
8366
|
+
len(_KNOWN_STD_LOGGING_RECORD_ATTR_SET)
|
8350
8367
|
):
|
8351
8368
|
raise RuntimeError('Duplicate LoggingContextInfoRecordAdapter record attrs')
|
8352
8369
|
|
8353
8370
|
rec_dct = dict(logging.makeLogRecord({}).__dict__)
|
8354
8371
|
|
8355
|
-
if (unk_rec_fields := frozenset(rec_dct) -
|
8372
|
+
if (unk_rec_fields := frozenset(rec_dct) - _KNOWN_STD_LOGGING_RECORD_ATTR_SET):
|
8356
8373
|
import warnings # noqa
|
8357
8374
|
|
8358
8375
|
warnings.warn(
|
@@ -8378,11 +8395,60 @@ class LoggingContextLogRecord(logging.LogRecord):
|
|
8378
8395
|
# - exc_info: LoggingExcInfoTuple | None
|
8379
8396
|
# - func: str | None = None -> funcName
|
8380
8397
|
# - sinfo: str | None = None -> stack_info
|
8398
|
+
#
|
8381
8399
|
|
8382
8400
|
def __init__(self, *, _logging_context: LoggingContext) -> None: # noqa
|
8401
|
+
self.__dict__.update(_logging_context=_logging_context)
|
8402
|
+
|
8383
8403
|
for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS_:
|
8384
8404
|
self.__dict__.update(ad.context_to_record(_logging_context))
|
8385
8405
|
|
8406
|
+
_logging_context: LoggingContext
|
8407
|
+
|
8408
|
+
# FIXME: track extra
|
8409
|
+
# def __setattr__(self, key, value):
|
8410
|
+
# super().__setattr__(key, value)
|
8411
|
+
|
8412
|
+
|
8413
|
+
##
|
8414
|
+
|
8415
|
+
|
8416
|
+
@ta.final
|
8417
|
+
class LogRecordLoggingContext(LoggingContext):
|
8418
|
+
def __init__(self, rec: logging.LogRecord) -> None:
|
8419
|
+
if isinstance(rec, LoggingContextLogRecord):
|
8420
|
+
raise TypeError(rec)
|
8421
|
+
|
8422
|
+
self._rec = rec
|
8423
|
+
|
8424
|
+
infos: ta.List[LoggingContextInfo] = [
|
8425
|
+
info
|
8426
|
+
for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS_
|
8427
|
+
if (info := ad.record_to_info(rec)) is not None
|
8428
|
+
]
|
8429
|
+
|
8430
|
+
# FIXME:
|
8431
|
+
# if extra is not None:
|
8432
|
+
# for key in extra:
|
8433
|
+
# if (key in ["message", "asctime"]) or (key in rv.__dict__):
|
8434
|
+
# raise KeyError("Attempt to overwrite %r in LogRecord" % key)
|
8435
|
+
# rv.__dict__[key] = extra[key]
|
8436
|
+
|
8437
|
+
if (extra := {
|
8438
|
+
a: v
|
8439
|
+
for a, v in rec.__dict__.items()
|
8440
|
+
if a not in _KNOWN_STD_LOGGING_RECORD_ATTR_SET
|
8441
|
+
}):
|
8442
|
+
infos.append(LoggingContextInfos.Extra(extra))
|
8443
|
+
|
8444
|
+
self._infos: ta.Dict[ta.Type[LoggingContextInfo], LoggingContextInfo] = {
|
8445
|
+
type(info): info
|
8446
|
+
for info in infos
|
8447
|
+
}
|
8448
|
+
|
8449
|
+
def get_info(self, ty: ta.Type[LoggingContextInfoT]) -> ta.Optional[LoggingContextInfoT]:
|
8450
|
+
return self._infos.get(ty)
|
8451
|
+
|
8386
8452
|
|
8387
8453
|
########################################
|
8388
8454
|
# ../../../omlish/subprocesses/base.py
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: omdev
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev433
|
4
4
|
Summary: omdev
|
5
5
|
Author: wrmsr
|
6
6
|
License-Expression: BSD-3-Clause
|
@@ -14,10 +14,10 @@ Classifier: Programming Language :: Python :: 3.13
|
|
14
14
|
Requires-Python: >=3.13
|
15
15
|
Description-Content-Type: text/markdown
|
16
16
|
License-File: LICENSE
|
17
|
-
Requires-Dist: omlish==0.0.0.
|
17
|
+
Requires-Dist: omlish==0.0.0.dev433
|
18
18
|
Provides-Extra: all
|
19
19
|
Requires-Dist: black~=25.1; extra == "all"
|
20
|
-
Requires-Dist: pycparser~=2.
|
20
|
+
Requires-Dist: pycparser~=2.23; extra == "all"
|
21
21
|
Requires-Dist: pcpp~=1.30; extra == "all"
|
22
22
|
Requires-Dist: docutils~=0.22; extra == "all"
|
23
23
|
Requires-Dist: markdown-it-py~=4.0; extra == "all"
|
@@ -30,7 +30,7 @@ Requires-Dist: segno~=1.6; extra == "all"
|
|
30
30
|
Provides-Extra: black
|
31
31
|
Requires-Dist: black~=25.1; extra == "black"
|
32
32
|
Provides-Extra: c
|
33
|
-
Requires-Dist: pycparser~=2.
|
33
|
+
Requires-Dist: pycparser~=2.23; extra == "c"
|
34
34
|
Requires-Dist: pcpp~=1.30; extra == "c"
|
35
35
|
Provides-Extra: doc
|
36
36
|
Requires-Dist: docutils~=0.22; extra == "doc"
|