omdev 0.0.0.dev238__tar.gz → 0.0.0.dev240__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.dev238/omdev.egg-info → omdev-0.0.0.dev240}/PKG-INFO +2 -2
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/home/paths.py +31 -3
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/home/secrets.py +10 -2
- omdev-0.0.0.dev238/omdev/home/configs.py → omdev-0.0.0.dev240/omdev/home/shadow.py +5 -4
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/magic/find.py +7 -1
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/manifests/build.py +96 -71
- omdev-0.0.0.dev240/omdev/manifests/dumping.py +94 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/scripts/pyproject.py +7 -1
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/git/cli.py +3 -3
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/shadow.py +1 -1
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240/omdev.egg-info}/PKG-INFO +2 -2
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev.egg-info/SOURCES.txt +2 -1
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev.egg-info/requires.txt +1 -1
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/pyproject.toml +2 -2
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/LICENSE +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/MANIFEST.in +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/README.rst +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/.manifests.json +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/__about__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/amalg/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/amalg/__main__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/amalg/gen.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/amalg/imports.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/amalg/main.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/amalg/manifests.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/amalg/resources.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/amalg/srcfiles.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/amalg/strip.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/amalg/types.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/amalg/typing.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/antlr/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/antlr/consts.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/antlr/gen.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/bracepy.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cache/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cache/compute/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cache/compute/cache.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cache/compute/contexts.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cache/compute/currents.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cache/compute/fns.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cache/compute/resolvers.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cache/compute/storage.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cache/compute/types.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cache/data/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cache/data/actions.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cache/data/cache.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cache/data/consts.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cache/data/defaults.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cache/data/manifests.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cache/data/specs.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cc/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cc/__main__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cc/cdeps.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cc/cdeps.toml +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cc/cli.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_boilerplate.cc +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_distutils/LICENSE +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_distutils/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_distutils/build_ext.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_distutils/compilers/options.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_distutils/dir_util.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_distutils/errors.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_distutils/extension.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_distutils/file_util.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_distutils/modified.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_distutils/spawn.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_distutils/sysconfig.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_distutils/util.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/_distutils/version.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/build.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/cmake.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/importhook.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/magic.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cexts/scan.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/__main__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/cache.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/ci.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/cli.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/compose.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/consts.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/docker/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/docker/buildcaching.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/docker/cache.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/docker/cacheserved.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/docker/cmds.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/docker/dataserver.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/docker/imagepulling.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/docker/inject.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/docker/packing.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/docker/repositories.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/docker/utils.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/github/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/github/api.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/github/bootstrap.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/github/cache.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/github/cli.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/github/client.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/github/env.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/github/inject.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/inject.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/requirements.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/shell.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ci/utils.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/classdot.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cli/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cli/__main__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cli/_pathhack.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cli/clicli.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cli/install.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cli/main.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cli/managers.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cli/types.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/clipboard/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/clipboard/clipboard.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/clipboard/darwin_cf.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/clipboard/linux_x11.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/cmake.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/dataserver/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/dataserver/handlers.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/dataserver/http.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/dataserver/routes.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/dataserver/server.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/dataserver/targets.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/findimports.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/git/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/git/revisions.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/git/shallow.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/git/status.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/home/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/imgur.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/__main__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/cli.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/default.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/inject.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/inspect.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/providers/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/providers/base.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/providers/inject.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/providers/running.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/providers/standalone.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/providers/system.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/pyenv/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/pyenv/inject.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/pyenv/install.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/pyenv/provider.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/pyenv/pyenv.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/resolvers.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/types.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/uv/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/uv/inject.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/uv/provider.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/uv/uv.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/interp/venvs.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/magic/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/magic/__main__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/magic/cli.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/magic/magic.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/magic/prepare.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/magic/styles.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/manifests/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/manifests/__main__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/manifests/main.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/mypy/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/mypy/debug.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/oci/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/oci/building.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/oci/compression.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/oci/data.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/oci/datarefs.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/oci/dataserver.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/oci/loading.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/oci/media.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/oci/pack/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/oci/pack/packing.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/oci/pack/repositories.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/oci/pack/unpacking.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/oci/repositories.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/oci/tars.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/packaging/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/packaging/marshal.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/packaging/names.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/packaging/requires.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/packaging/revisions.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/packaging/specifiers.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/packaging/versions.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/packaging/wheelfile.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/pip.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/precheck/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/precheck/__main__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/precheck/base.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/precheck/git.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/precheck/lite.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/precheck/main.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/precheck/manifests.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/precheck/scripts.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ptk/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ptk/apps/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/ptk/apps/ncdu.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/pycharm/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/pycharm/__main__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/pycharm/cli.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/pyproject/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/pyproject/__main__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/pyproject/cexts.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/pyproject/cli.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/pyproject/configs.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/pyproject/inject.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/pyproject/pkg.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/pyproject/reqs.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/pyproject/resources/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/pyproject/resources/docker-dev.sh +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/pyproject/resources/python.sh +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/pyproject/venvs.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/scripts/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/scripts/bumpversion.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/scripts/ci.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/scripts/execrss.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/scripts/exectime.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/scripts/importtrace.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/scripts/interp.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/scripts/slowcat.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/scripts/tmpexec.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tagstrings.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tokens/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tokens/all.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tokens/tokenizert.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tokens/utils.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/cloc.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/doc.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/docker.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/git/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/git/__main__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/git/consts.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/git/messages.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/importscan.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/json/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/json/__main__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/json/cli.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/json/formats.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/json/io.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/json/parsing.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/json/processing.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/json/rendering.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/linehisto.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/mkenv.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/mkrelimp.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/notebook.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/pawk/__init__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/pawk/__main__.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/pawk/pawk.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/pip.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/prof.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/qr.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev/tools/sqlrepl.py +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev.egg-info/dependency_links.txt +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev.egg-info/entry_points.txt +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/omdev.egg-info/top_level.txt +0 -0
- {omdev-0.0.0.dev238 → omdev-0.0.0.dev240}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: omdev
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev240
|
4
4
|
Summary: omdev
|
5
5
|
Author: wrmsr
|
6
6
|
License: BSD-3-Clause
|
@@ -12,7 +12,7 @@ Classifier: Operating System :: OS Independent
|
|
12
12
|
Classifier: Operating System :: POSIX
|
13
13
|
Requires-Python: >=3.12
|
14
14
|
License-File: LICENSE
|
15
|
-
Requires-Dist: omlish==0.0.0.
|
15
|
+
Requires-Dist: omlish==0.0.0.dev240
|
16
16
|
Provides-Extra: all
|
17
17
|
Requires-Dist: black~=25.1; extra == "all"
|
18
18
|
Requires-Dist: pycparser~=2.22; extra == "all"
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# ruff: noqa: UP006 UP007
|
2
|
+
# @omlish-lite
|
1
3
|
"""
|
2
4
|
TODO:
|
3
5
|
- XDG cache root
|
@@ -5,16 +7,42 @@ TODO:
|
|
5
7
|
import os.path
|
6
8
|
|
7
9
|
|
10
|
+
##
|
11
|
+
|
12
|
+
|
8
13
|
HOME_DIR_ENV_VAR = 'OMLISH_HOME'
|
9
14
|
DEFAULT_HOME_DIR = '~/.omlish'
|
10
15
|
|
11
|
-
CACHE_DIR_ENV_VAR = 'OMLISH_CACHE'
|
12
|
-
DEFAULT_CACHE_DIR = '~/.cache/omlish'
|
13
|
-
|
14
16
|
|
15
17
|
def get_home_dir() -> str:
|
16
18
|
return os.path.expanduser(os.getenv(HOME_DIR_ENV_VAR, DEFAULT_HOME_DIR))
|
17
19
|
|
18
20
|
|
21
|
+
#
|
22
|
+
|
23
|
+
|
24
|
+
def get_config_dir() -> str:
|
25
|
+
return os.path.join(get_home_dir(), 'config')
|
26
|
+
|
27
|
+
|
28
|
+
def get_run_dir() -> str:
|
29
|
+
return os.path.join(get_home_dir(), 'run')
|
30
|
+
|
31
|
+
|
32
|
+
def get_shadow_dir() -> str:
|
33
|
+
return os.path.join(get_home_dir(), 'shadow')
|
34
|
+
|
35
|
+
|
36
|
+
def get_state_dir() -> str:
|
37
|
+
return os.path.join(get_home_dir(), 'state')
|
38
|
+
|
39
|
+
|
40
|
+
##
|
41
|
+
|
42
|
+
|
43
|
+
CACHE_DIR_ENV_VAR = 'OMLISH_CACHE'
|
44
|
+
DEFAULT_CACHE_DIR = '~/.cache/omlish'
|
45
|
+
|
46
|
+
|
19
47
|
def get_cache_dir() -> str:
|
20
48
|
return os.path.expanduser(os.getenv(DEFAULT_CACHE_DIR, DEFAULT_CACHE_DIR))
|
@@ -4,7 +4,7 @@ import typing as ta
|
|
4
4
|
from omlish import lang
|
5
5
|
from omlish.secrets import all as sec
|
6
6
|
|
7
|
-
from .paths import
|
7
|
+
from .paths import get_config_dir
|
8
8
|
|
9
9
|
|
10
10
|
if ta.TYPE_CHECKING:
|
@@ -13,12 +13,20 @@ else:
|
|
13
13
|
yaml = lang.proxy_import('yaml')
|
14
14
|
|
15
15
|
|
16
|
+
##
|
17
|
+
|
18
|
+
|
16
19
|
SECRETS_FILE_ENV_VAR = 'OMLISH_SECRETS'
|
17
20
|
DEFAULT_SECRETS_FILE_NAME = 'secrets.yml'
|
18
21
|
|
19
22
|
|
20
23
|
def get_secrets_file() -> str:
|
21
|
-
return os.path.expanduser(
|
24
|
+
return os.path.expanduser(
|
25
|
+
os.getenv(
|
26
|
+
SECRETS_FILE_ENV_VAR,
|
27
|
+
os.path.join(get_config_dir(), DEFAULT_SECRETS_FILE_NAME),
|
28
|
+
),
|
29
|
+
)
|
22
30
|
|
23
31
|
|
24
32
|
def load_secrets() -> sec.Secrets:
|
@@ -1,13 +1,14 @@
|
|
1
|
-
import os.path
|
2
|
-
|
3
1
|
from omlish.configs.shadow import MangledFilesShadowConfigs
|
4
2
|
from omlish.configs.shadow import ShadowConfigs
|
5
3
|
|
6
|
-
from .paths import
|
4
|
+
from .paths import get_shadow_dir
|
5
|
+
|
6
|
+
|
7
|
+
##
|
7
8
|
|
8
9
|
|
9
10
|
def get_shadow_configs() -> ShadowConfigs:
|
10
11
|
return MangledFilesShadowConfigs(
|
11
|
-
|
12
|
+
get_shadow_dir(),
|
12
13
|
create=True,
|
13
14
|
)
|
@@ -99,7 +99,11 @@ def find_magic(
|
|
99
99
|
*,
|
100
100
|
file: ta.Optional[str] = None,
|
101
101
|
preparer: ta.Callable[[str], ta.Any] = py_compile_magic_preparer,
|
102
|
+
keys: ta.Optional[ta.Container[str]] = None,
|
102
103
|
) -> ta.List[Magic]:
|
104
|
+
if keys is not None and isinstance(keys, str):
|
105
|
+
raise TypeError(keys)
|
106
|
+
|
103
107
|
out: ta.List[Magic] = []
|
104
108
|
|
105
109
|
start = 0
|
@@ -163,7 +167,9 @@ def find_magic(
|
|
163
167
|
if magic is None:
|
164
168
|
raise Exception(f'Failed to find magic block terminator : {file=} {start=} {end=}')
|
165
169
|
|
166
|
-
|
170
|
+
if keys is None or key in keys:
|
171
|
+
out.append(magic)
|
172
|
+
|
167
173
|
start = end + 1
|
168
174
|
|
169
175
|
return out
|
@@ -27,13 +27,17 @@ import time
|
|
27
27
|
import typing as ta
|
28
28
|
|
29
29
|
from omlish.lite.cached import cached_nullary
|
30
|
+
from omlish.lite.check import check
|
31
|
+
from omlish.lite.imports import import_attr
|
30
32
|
from omlish.lite.json import json_dumps_pretty
|
31
33
|
from omlish.lite.logs import log
|
34
|
+
from omlish.manifests.base import ModAttrManifest
|
32
35
|
from omlish.manifests.load import MANIFEST_LOADER
|
33
36
|
from omlish.manifests.types import Manifest
|
34
37
|
from omlish.manifests.types import ManifestOrigin
|
35
38
|
|
36
39
|
from .. import magic
|
40
|
+
from .dumping import _ModuleManifestDumper
|
37
41
|
|
38
42
|
|
39
43
|
T = ta.TypeVar('T')
|
@@ -44,6 +48,7 @@ T = ta.TypeVar('T')
|
|
44
48
|
|
45
49
|
MANIFEST_MAGIC_KEY = '@omlish-manifest'
|
46
50
|
|
51
|
+
|
47
52
|
_MANIFEST_GLOBAL_PATS = tuple(re.compile(p) for p in [
|
48
53
|
# _FOO_MANIFEST = FooManifest(...
|
49
54
|
r'^(?P<name>[A-Za-z_][A-Za-z0-9_]*)\s*=.*',
|
@@ -53,59 +58,22 @@ _MANIFEST_GLOBAL_PATS = tuple(re.compile(p) for p in [
|
|
53
58
|
])
|
54
59
|
|
55
60
|
|
56
|
-
def
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
mod = importlib.import_module(spec)
|
63
|
-
|
64
|
-
out = {}
|
65
|
-
for attr in attrs:
|
66
|
-
manifest = getattr(mod, attr)
|
67
|
-
|
68
|
-
if dc.is_dataclass(manifest):
|
69
|
-
# Support static dataclasses
|
70
|
-
if isinstance(manifest, type):
|
71
|
-
manifest = manifest()
|
72
|
-
|
73
|
-
cls = type(manifest)
|
74
|
-
manifest_json = json.dumps(dc.asdict(manifest))
|
75
|
-
manifest_dct = json.loads(manifest_json)
|
76
|
-
|
77
|
-
rt_manifest = cls(**manifest_dct)
|
78
|
-
if rt_manifest != manifest:
|
79
|
-
raise Exception(f'Manifest failed to roundtrip: {manifest} => {manifest_dct} != {rt_manifest}')
|
61
|
+
def extract_manifest_target_name(line: str) -> str:
|
62
|
+
for pat in _MANIFEST_GLOBAL_PATS:
|
63
|
+
if (m := pat.match(line)) is not None:
|
64
|
+
return m.groupdict()['name']
|
65
|
+
raise Exception(line)
|
80
66
|
|
81
|
-
key = f'${cls.__module__}.{cls.__qualname__}'
|
82
|
-
out[attr] = {key: manifest_dct}
|
83
67
|
|
84
|
-
|
85
|
-
[(key, manifest_dct)] = manifest.items()
|
86
|
-
if not key.startswith('$'): # noqa
|
87
|
-
raise Exception(f'Bad key: {key}')
|
68
|
+
_INLINE_MANIFEST_CLS_NAME_PAT = re.compile(r'^(?P<cls_name>[_a-zA-Z][_a-zA-Z0-9.]*)\s*(?P<cls_args>\()?')
|
88
69
|
|
89
|
-
if not isinstance(manifest_dct, collections.abc.Mapping):
|
90
|
-
raise Exception(f'Bad value: {manifest_dct}')
|
91
70
|
|
92
|
-
|
93
|
-
rt_manifest_dct = json.loads(manifest_json)
|
94
|
-
if manifest_dct != rt_manifest_dct:
|
95
|
-
raise Exception(f'Manifest failed to roundtrip: {manifest_dct} != {rt_manifest_dct}')
|
96
|
-
|
97
|
-
out[attr] = {key: manifest_dct}
|
98
|
-
|
99
|
-
else:
|
100
|
-
raise TypeError(f'Manifest must be dataclass or mapping: {manifest!r}')
|
101
|
-
|
102
|
-
out_json = json.dumps(out, indent=None, separators=(',', ':'))
|
103
|
-
print(out_json)
|
71
|
+
##
|
104
72
|
|
105
73
|
|
106
74
|
@cached_nullary
|
107
75
|
def _payload_src() -> str:
|
108
|
-
return inspect.getsource(
|
76
|
+
return inspect.getsource(_ModuleManifestDumper)
|
109
77
|
|
110
78
|
|
111
79
|
class ManifestBuilder:
|
@@ -153,24 +121,83 @@ class ManifestBuilder:
|
|
153
121
|
with open(os.path.join(self._base, file)) as f: # noqa
|
154
122
|
src = f.read()
|
155
123
|
|
156
|
-
origins: ta.List[ManifestOrigin] = []
|
157
124
|
lines = src.splitlines(keepends=True)
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
125
|
+
|
126
|
+
magics = magic.find_magic(
|
127
|
+
magic.PY_MAGIC_STYLE,
|
128
|
+
lines,
|
129
|
+
file=file,
|
130
|
+
keys={MANIFEST_MAGIC_KEY},
|
131
|
+
)
|
132
|
+
|
133
|
+
origins: ta.List[ManifestOrigin] = []
|
134
|
+
targets: ta.List[dict] = []
|
135
|
+
for m in magics:
|
136
|
+
if m.body:
|
137
|
+
pat_match = check.not_none(_INLINE_MANIFEST_CLS_NAME_PAT.match(m.body))
|
138
|
+
cls_name = check.non_empty_str(pat_match.groupdict()['cls_name'])
|
139
|
+
has_cls_args = bool(pat_match.groupdict().get('cls_args'))
|
140
|
+
|
141
|
+
cls = check.isinstance(import_attr(cls_name), type)
|
142
|
+
check.state(dc.is_dataclass(cls))
|
143
|
+
|
144
|
+
cls_mod_name = cls.__module__
|
145
|
+
cls_qualname = cls.__qualname__
|
146
|
+
cls_reload = sys.modules[cls_mod_name]
|
147
|
+
for p in cls_qualname.split('.'):
|
148
|
+
cls_reload = getattr(cls_reload, p)
|
149
|
+
check.is_(cls_reload, cls)
|
150
|
+
|
151
|
+
if has_cls_args:
|
152
|
+
inl_init_src = m.body[len(cls_name):]
|
164
153
|
else:
|
165
|
-
|
154
|
+
inl_init_src = '()'
|
166
155
|
|
167
|
-
|
156
|
+
inl_kw: dict = {}
|
157
|
+
|
158
|
+
if issubclass(cls, ModAttrManifest):
|
159
|
+
attr_name = extract_manifest_target_name(lines[m.end_line])
|
160
|
+
inl_kw.update({
|
161
|
+
'mod_name': mod_name,
|
162
|
+
'attr_name': attr_name,
|
163
|
+
})
|
164
|
+
|
165
|
+
origin = ManifestOrigin(
|
168
166
|
module='.'.join(['', *mod_name.split('.')[1:]]),
|
169
|
-
attr=
|
167
|
+
attr=None,
|
170
168
|
|
171
169
|
file=file,
|
172
|
-
line=
|
173
|
-
)
|
170
|
+
line=m.start_line,
|
171
|
+
)
|
172
|
+
|
173
|
+
origins.append(origin)
|
174
|
+
targets.append({
|
175
|
+
'origin': dc.asdict(origin), # noqa
|
176
|
+
'kind': 'inline',
|
177
|
+
'cls_mod_name': cls_mod_name,
|
178
|
+
'cls_qualname': cls_qualname,
|
179
|
+
'init_src': inl_init_src,
|
180
|
+
'kwargs': inl_kw,
|
181
|
+
})
|
182
|
+
|
183
|
+
else:
|
184
|
+
nl = lines[m.end_line]
|
185
|
+
attr_name = extract_manifest_target_name(nl)
|
186
|
+
|
187
|
+
origin = ManifestOrigin(
|
188
|
+
module='.'.join(['', *mod_name.split('.')[1:]]),
|
189
|
+
attr=attr_name,
|
190
|
+
|
191
|
+
file=file,
|
192
|
+
line=m.start_line,
|
193
|
+
)
|
194
|
+
|
195
|
+
origins.append(origin)
|
196
|
+
targets.append({
|
197
|
+
'origin': dc.asdict(origin), # noqa
|
198
|
+
'kind': 'attr',
|
199
|
+
'attr': attr_name,
|
200
|
+
})
|
174
201
|
|
175
202
|
if not origins:
|
176
203
|
raise Exception('no manifests found')
|
@@ -178,11 +205,9 @@ class ManifestBuilder:
|
|
178
205
|
if (dups := [k for k, v in collections.Counter(o.attr for o in origins).items() if v > 1]):
|
179
206
|
raise Exception(f'Duplicate attrs: {dups}')
|
180
207
|
|
181
|
-
attrs = [o.attr for o in origins]
|
182
|
-
|
183
208
|
subproc_src = '\n\n'.join([
|
184
209
|
_payload_src(),
|
185
|
-
f'
|
210
|
+
f'_ModuleManifestDumper({mod_name!r})({", ".join(repr(tgt) for tgt in targets)})\n',
|
186
211
|
])
|
187
212
|
|
188
213
|
args = [
|
@@ -210,21 +235,21 @@ class ManifestBuilder:
|
|
210
235
|
if len(sp_lines) != 1:
|
211
236
|
raise Exception('Unexpected subprocess output')
|
212
237
|
|
213
|
-
|
214
|
-
|
215
|
-
|
238
|
+
sp_outs = json.loads(sp_lines[0])
|
239
|
+
# FIXME:
|
240
|
+
# if set(dct) != set(attrs):
|
241
|
+
# raise Exception('Unexpected subprocess output keys')
|
216
242
|
|
217
243
|
out: ta.List[Manifest] = []
|
218
|
-
|
219
|
-
|
220
|
-
value = dct[o.attr]
|
244
|
+
for sp_out in sp_outs:
|
245
|
+
value = sp_out['value']
|
221
246
|
|
222
247
|
if not (
|
223
248
|
isinstance(value, ta.Mapping) and
|
224
249
|
len(value) == 1 and
|
225
250
|
all(isinstance(k, str) and k.startswith('$') and len(k) > 1 for k in value)
|
226
251
|
):
|
227
|
-
raise TypeError(f'
|
252
|
+
raise TypeError(f'Manifest values must be mappings of strings starting with $: {value!r}')
|
228
253
|
|
229
254
|
[(key, value_dct)] = value.items()
|
230
255
|
kb, _, kr = key[1:].partition('.') # noqa
|
@@ -232,10 +257,10 @@ class ManifestBuilder:
|
|
232
257
|
key = f'$.{kr}'
|
233
258
|
value = {key: value_dct}
|
234
259
|
|
235
|
-
out.append(Manifest(
|
236
|
-
**
|
237
|
-
value=value,
|
238
|
-
))
|
260
|
+
out.append(Manifest(**{
|
261
|
+
**sp_out,
|
262
|
+
**dict(value=value),
|
263
|
+
}))
|
239
264
|
|
240
265
|
return out
|
241
266
|
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# ruff: noqa: UP006 UP007
|
2
|
+
import typing as ta
|
3
|
+
|
4
|
+
|
5
|
+
class _ModuleManifestDumper:
|
6
|
+
def __init__(self, spec: str) -> None:
|
7
|
+
super().__init__()
|
8
|
+
|
9
|
+
self._spec = spec
|
10
|
+
|
11
|
+
def __call__(self, *targets: dict) -> None:
|
12
|
+
import collections.abc
|
13
|
+
import dataclasses as dc # noqa
|
14
|
+
import functools
|
15
|
+
import importlib
|
16
|
+
import json
|
17
|
+
|
18
|
+
mod = importlib.import_module(self._spec)
|
19
|
+
|
20
|
+
cls: ta.Any
|
21
|
+
|
22
|
+
out = []
|
23
|
+
for target in targets:
|
24
|
+
origin = target['origin']
|
25
|
+
|
26
|
+
if target['kind'] == 'attr':
|
27
|
+
attr = target['attr']
|
28
|
+
manifest = getattr(mod, attr)
|
29
|
+
|
30
|
+
if dc.is_dataclass(manifest):
|
31
|
+
# Support static dataclasses
|
32
|
+
if isinstance(manifest, type):
|
33
|
+
manifest = manifest()
|
34
|
+
|
35
|
+
cls = type(manifest)
|
36
|
+
manifest_json = json.dumps(dc.asdict(manifest))
|
37
|
+
manifest_dct = json.loads(manifest_json)
|
38
|
+
|
39
|
+
rt_manifest = cls(**manifest_dct)
|
40
|
+
if rt_manifest != manifest:
|
41
|
+
raise Exception(f'Manifest failed to roundtrip: {manifest} => {manifest_dct} != {rt_manifest}')
|
42
|
+
|
43
|
+
key = f'${cls.__module__}.{cls.__qualname__}'
|
44
|
+
out_value = {key: manifest_dct}
|
45
|
+
|
46
|
+
elif isinstance(manifest, collections.abc.Mapping):
|
47
|
+
[(key, manifest_dct)] = manifest.items()
|
48
|
+
if not key.startswith('$'): # noqa
|
49
|
+
raise Exception(f'Bad key: {key}')
|
50
|
+
|
51
|
+
if not isinstance(manifest_dct, collections.abc.Mapping):
|
52
|
+
raise Exception(f'Bad value: {manifest_dct}')
|
53
|
+
|
54
|
+
manifest_json = json.dumps(manifest_dct)
|
55
|
+
rt_manifest_dct = json.loads(manifest_json)
|
56
|
+
if manifest_dct != rt_manifest_dct:
|
57
|
+
raise Exception(f'Manifest failed to roundtrip: {manifest_dct} != {rt_manifest_dct}')
|
58
|
+
|
59
|
+
out_value = {key: manifest_dct}
|
60
|
+
|
61
|
+
else:
|
62
|
+
raise TypeError(f'Manifest must be dataclass or mapping: {manifest!r}')
|
63
|
+
|
64
|
+
elif target['kind'] == 'inline':
|
65
|
+
cls = importlib.import_module(target['cls_mod_name'])
|
66
|
+
for p in target['cls_qualname'].split('.'):
|
67
|
+
cls = getattr(cls, p)
|
68
|
+
if not isinstance(cls, type) or not dc.is_dataclass(cls):
|
69
|
+
raise TypeError(cls)
|
70
|
+
|
71
|
+
cls_fac = functools.partial(cls, **target['kwargs'])
|
72
|
+
eval_attr_name = '__manifest_factory__'
|
73
|
+
inl_glo = {
|
74
|
+
**mod.__dict__,
|
75
|
+
eval_attr_name: cls_fac,
|
76
|
+
}
|
77
|
+
inl_src = eval_attr_name + target['init_src']
|
78
|
+
inl_code = compile(inl_src, '<magic>', 'eval')
|
79
|
+
manifest = eval(inl_code, inl_glo) # noqa
|
80
|
+
manifest_json = json.dumps(dc.asdict(manifest))
|
81
|
+
manifest_dct = json.loads(manifest_json)
|
82
|
+
key = f'${cls.__module__}.{cls.__qualname__}'
|
83
|
+
out_value = {key: manifest_dct}
|
84
|
+
|
85
|
+
else:
|
86
|
+
raise ValueError(target)
|
87
|
+
|
88
|
+
out.append({
|
89
|
+
**origin,
|
90
|
+
'value': out_value,
|
91
|
+
})
|
92
|
+
|
93
|
+
out_json = json.dumps(out, indent=None, separators=(',', ':'))
|
94
|
+
print(out_json)
|
@@ -3059,7 +3059,11 @@ def find_magic(
|
|
3059
3059
|
*,
|
3060
3060
|
file: ta.Optional[str] = None,
|
3061
3061
|
preparer: ta.Callable[[str], ta.Any] = py_compile_magic_preparer,
|
3062
|
+
keys: ta.Optional[ta.Container[str]] = None,
|
3062
3063
|
) -> ta.List[Magic]:
|
3064
|
+
if keys is not None and isinstance(keys, str):
|
3065
|
+
raise TypeError(keys)
|
3066
|
+
|
3063
3067
|
out: ta.List[Magic] = []
|
3064
3068
|
|
3065
3069
|
start = 0
|
@@ -3123,7 +3127,9 @@ def find_magic(
|
|
3123
3127
|
if magic is None:
|
3124
3128
|
raise Exception(f'Failed to find magic block terminator : {file=} {start=} {end=}')
|
3125
3129
|
|
3126
|
-
|
3130
|
+
if keys is None or key in keys:
|
3131
|
+
out.append(magic)
|
3132
|
+
|
3127
3133
|
start = end + 1
|
3128
3134
|
|
3129
3135
|
return out
|
@@ -21,8 +21,8 @@ from omlish.subprocesses.sync import subprocesses
|
|
21
21
|
|
22
22
|
from ...git.status import GitStatusItem
|
23
23
|
from ...git.status import get_git_status
|
24
|
-
from ...home.
|
25
|
-
from ...home.
|
24
|
+
from ...home.paths import get_config_dir
|
25
|
+
from ...home.shadow import get_shadow_configs
|
26
26
|
from . import consts
|
27
27
|
from .messages import GitMessageGenerator
|
28
28
|
from .messages import TimestampGitMessageGenerator
|
@@ -74,7 +74,7 @@ class Cli(ap.Cli):
|
|
74
74
|
if (arg := self._config_file_path_arg) is not None:
|
75
75
|
return os.path.expanduser(arg)
|
76
76
|
else:
|
77
|
-
return os.path.join(
|
77
|
+
return os.path.join(get_config_dir(), 'tools', 'git.yml')
|
78
78
|
|
79
79
|
@cached.function
|
80
80
|
def load_home_config_content(self) -> ta.Any:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: omdev
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev240
|
4
4
|
Summary: omdev
|
5
5
|
Author: wrmsr
|
6
6
|
License: BSD-3-Clause
|
@@ -12,7 +12,7 @@ Classifier: Operating System :: OS Independent
|
|
12
12
|
Classifier: Operating System :: POSIX
|
13
13
|
Requires-Python: >=3.12
|
14
14
|
License-File: LICENSE
|
15
|
-
Requires-Dist: omlish==0.0.0.
|
15
|
+
Requires-Dist: omlish==0.0.0.dev240
|
16
16
|
Provides-Extra: all
|
17
17
|
Requires-Dist: black~=25.1; extra == "all"
|
18
18
|
Requires-Dist: pycparser~=2.22; extra == "all"
|
@@ -129,9 +129,9 @@ omdev/git/revisions.py
|
|
129
129
|
omdev/git/shallow.py
|
130
130
|
omdev/git/status.py
|
131
131
|
omdev/home/__init__.py
|
132
|
-
omdev/home/configs.py
|
133
132
|
omdev/home/paths.py
|
134
133
|
omdev/home/secrets.py
|
134
|
+
omdev/home/shadow.py
|
135
135
|
omdev/interp/__init__.py
|
136
136
|
omdev/interp/__main__.py
|
137
137
|
omdev/interp/cli.py
|
@@ -166,6 +166,7 @@ omdev/magic/styles.py
|
|
166
166
|
omdev/manifests/__init__.py
|
167
167
|
omdev/manifests/__main__.py
|
168
168
|
omdev/manifests/build.py
|
169
|
+
omdev/manifests/dumping.py
|
169
170
|
omdev/manifests/main.py
|
170
171
|
omdev/mypy/__init__.py
|
171
172
|
omdev/mypy/debug.py
|
@@ -12,7 +12,7 @@ authors = [
|
|
12
12
|
urls = {source = 'https://github.com/wrmsr/omlish'}
|
13
13
|
license = {text = 'BSD-3-Clause'}
|
14
14
|
requires-python = '>=3.12'
|
15
|
-
version = '0.0.0.
|
15
|
+
version = '0.0.0.dev240'
|
16
16
|
classifiers = [
|
17
17
|
'License :: OSI Approved :: BSD License',
|
18
18
|
'Development Status :: 2 - Pre-Alpha',
|
@@ -22,7 +22,7 @@ classifiers = [
|
|
22
22
|
]
|
23
23
|
description = 'omdev'
|
24
24
|
dependencies = [
|
25
|
-
'omlish == 0.0.0.
|
25
|
+
'omlish == 0.0.0.dev240',
|
26
26
|
]
|
27
27
|
|
28
28
|
[project.optional-dependencies]
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|