omdev 0.0.0.dev242__tar.gz → 0.0.0.dev244__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.dev242/omdev.egg-info → omdev-0.0.0.dev244}/PKG-INFO +2 -2
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/docker/cacheserved/cache.py +9 -11
- omdev-0.0.0.dev244/omdev/home/paths.py +70 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/home/secrets.py +2 -2
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/home/shadow.py +2 -2
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/oci/tars.py +2 -10
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/scripts/ci.py +210 -69
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/git/cli.py +2 -2
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/json/parsing.py +2 -6
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244/omdev.egg-info}/PKG-INFO +2 -2
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev.egg-info/requires.txt +1 -1
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/pyproject.toml +2 -2
- omdev-0.0.0.dev242/omdev/home/paths.py +0 -48
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/LICENSE +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/MANIFEST.in +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/README.rst +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/.manifests.json +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/__about__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/amalg/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/amalg/__main__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/amalg/gen.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/amalg/imports.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/amalg/main.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/amalg/manifests.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/amalg/resources.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/amalg/srcfiles.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/amalg/strip.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/amalg/types.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/amalg/typing.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/antlr/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/antlr/consts.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/antlr/gen.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/bracepy.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cache/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cache/compute/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cache/compute/cache.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cache/compute/contexts.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cache/compute/currents.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cache/compute/fns.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cache/compute/resolvers.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cache/compute/storage.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cache/compute/types.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cache/data/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cache/data/actions.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cache/data/cache.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cache/data/consts.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cache/data/defaults.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cache/data/manifests.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cache/data/specs.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cc/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cc/__main__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cc/cdeps.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cc/cdeps.toml +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cc/cli.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_boilerplate.cc +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_distutils/LICENSE +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_distutils/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_distutils/build_ext.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_distutils/compilers/options.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_distutils/dir_util.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_distutils/errors.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_distutils/extension.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_distutils/file_util.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_distutils/modified.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_distutils/spawn.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_distutils/sysconfig.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_distutils/util.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/_distutils/version.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/build.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/cmake.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/importhook.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/magic.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cexts/scan.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/__main__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/cache.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/ci.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/cli.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/compose.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/consts.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/docker/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/docker/buildcaching.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/docker/cache.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/docker/cacheserved/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/docker/cacheserved/manifests.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/docker/cmds.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/docker/dataserver.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/docker/imagepulling.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/docker/inject.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/docker/packing.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/docker/repositories.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/docker/utils.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/github/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/github/api.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/github/bootstrap.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/github/cache.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/github/cli.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/github/client.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/github/env.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/github/inject.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/inject.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/requirements.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/shell.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ci/utils.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/classdot.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cli/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cli/__main__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cli/_pathhack.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cli/clicli.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cli/install.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cli/main.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cli/managers.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cli/types.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/clipboard/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/clipboard/clipboard.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/clipboard/darwin_cf.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/clipboard/linux_x11.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/cmake.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/dataserver/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/dataserver/handlers.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/dataserver/http.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/dataserver/routes.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/dataserver/server.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/dataserver/targets.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/findimports.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/git/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/git/revisions.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/git/shallow.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/git/status.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/home/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/imgur.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/__main__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/cli.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/default.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/inject.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/inspect.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/providers/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/providers/base.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/providers/inject.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/providers/running.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/providers/standalone.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/providers/system.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/pyenv/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/pyenv/inject.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/pyenv/install.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/pyenv/provider.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/pyenv/pyenv.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/resolvers.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/types.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/uv/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/uv/inject.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/uv/provider.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/uv/uv.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/interp/venvs.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/magic/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/magic/__main__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/magic/cli.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/magic/find.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/magic/magic.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/magic/prepare.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/magic/styles.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/manifests/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/manifests/__main__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/manifests/build.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/manifests/dumping.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/manifests/main.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/mypy/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/mypy/debug.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/oci/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/oci/building.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/oci/compression.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/oci/data.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/oci/datarefs.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/oci/dataserver.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/oci/loading.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/oci/media.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/oci/pack/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/oci/pack/packing.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/oci/pack/repositories.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/oci/pack/unpacking.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/oci/repositories.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/packaging/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/packaging/marshal.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/packaging/names.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/packaging/requires.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/packaging/revisions.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/packaging/specifiers.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/packaging/versions.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/packaging/wheelfile.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/pip.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/precheck/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/precheck/__main__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/precheck/base.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/precheck/git.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/precheck/lite.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/precheck/main.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/precheck/manifests.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/precheck/scripts.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ptk/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ptk/apps/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/ptk/apps/ncdu.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/pycharm/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/pycharm/__main__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/pycharm/cli.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/pyproject/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/pyproject/__main__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/pyproject/cexts.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/pyproject/cli.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/pyproject/configs.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/pyproject/inject.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/pyproject/pkg.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/pyproject/reqs.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/pyproject/resources/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/pyproject/resources/docker-dev.sh +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/pyproject/resources/python.sh +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/pyproject/venvs.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/scripts/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/scripts/bumpversion.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/scripts/execrss.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/scripts/exectime.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/scripts/importtrace.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/scripts/interp.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/scripts/pyproject.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/scripts/slowcat.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/scripts/tmpexec.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tagstrings.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tokens/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tokens/all.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tokens/tokenizert.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tokens/utils.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/cloc.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/doc.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/docker.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/git/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/git/__main__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/git/consts.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/git/messages.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/importscan.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/json/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/json/__main__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/json/cli.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/json/formats.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/json/io.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/json/processing.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/json/rendering.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/linehisto.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/mkenv.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/mkrelimp.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/notebook.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/pawk/__init__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/pawk/__main__.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/pawk/pawk.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/pip.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/prof.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/qr.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/shadow.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev/tools/sqlrepl.py +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev.egg-info/SOURCES.txt +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev.egg-info/dependency_links.txt +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev.egg-info/entry_points.txt +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/omdev.egg-info/top_level.txt +0 -0
- {omdev-0.0.0.dev242 → omdev-0.0.0.dev244}/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.dev244
|
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.dev244
|
16
16
|
Provides-Extra: all
|
17
17
|
Requires-Dist: black~=25.1; extra == "all"
|
18
18
|
Requires-Dist: pycparser~=2.22; extra == "all"
|
@@ -6,6 +6,7 @@ import json
|
|
6
6
|
import os.path
|
7
7
|
import typing as ta
|
8
8
|
|
9
|
+
from omlish.asyncs.asyncio.sockets import asyncio_wait_until_can_connect
|
9
10
|
from omlish.asyncs.asyncio.subprocesses import asyncio_subprocesses
|
10
11
|
from omlish.lite.check import check
|
11
12
|
from omlish.lite.json import json_dumps_compact
|
@@ -126,17 +127,14 @@ class CacheServedDockerCache(DockerCache):
|
|
126
127
|
dds_run_task = asyncio.create_task(dds.run())
|
127
128
|
try:
|
128
129
|
timeout = Timeout.of(self._config.server_start_timeout)
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
await asyncio.wait_for(writer.wait_closed(), timeout=timeout.remaining())
|
138
|
-
break
|
139
|
-
await asyncio.sleep(self._config.server_start_sleep)
|
130
|
+
|
131
|
+
await asyncio_wait_until_can_connect(
|
132
|
+
'localhost',
|
133
|
+
self._config.port,
|
134
|
+
timeout=timeout,
|
135
|
+
on_fail=lambda _: log.exception('Failed to connect to cache server - will try again'),
|
136
|
+
sleep_s=self._config.server_start_sleep,
|
137
|
+
)
|
140
138
|
|
141
139
|
if (prc := self._config.pull_run_cmd) is not None:
|
142
140
|
pull_cmd = [
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# ruff: noqa: UP006 UP007
|
2
|
+
# @omlish-lite
|
3
|
+
"""
|
4
|
+
TODO:
|
5
|
+
- XDG cache root
|
6
|
+
"""
|
7
|
+
import os.path
|
8
|
+
import typing as ta
|
9
|
+
|
10
|
+
|
11
|
+
##
|
12
|
+
|
13
|
+
|
14
|
+
HOME_DIR_ENV_VAR = 'OMLISH_HOME'
|
15
|
+
DEFAULT_HOME_DIR = '~/.omlish'
|
16
|
+
|
17
|
+
|
18
|
+
def get_home_dir() -> str:
|
19
|
+
return os.path.expanduser(os.getenv(HOME_DIR_ENV_VAR, DEFAULT_HOME_DIR))
|
20
|
+
|
21
|
+
|
22
|
+
#
|
23
|
+
|
24
|
+
|
25
|
+
class HomePaths:
|
26
|
+
def __init__(self, home_dir: ta.Optional[str] = None) -> None:
|
27
|
+
super().__init__()
|
28
|
+
|
29
|
+
if home_dir is None:
|
30
|
+
home_dir = get_home_dir()
|
31
|
+
self._home_dir = home_dir
|
32
|
+
|
33
|
+
@property
|
34
|
+
def home_dir(self) -> str:
|
35
|
+
return self._home_dir
|
36
|
+
|
37
|
+
@property
|
38
|
+
def config_dir(self) -> str:
|
39
|
+
return os.path.join(self._home_dir, 'config')
|
40
|
+
|
41
|
+
@property
|
42
|
+
def log_dir(self) -> str:
|
43
|
+
return os.path.join(self._home_dir, 'log')
|
44
|
+
|
45
|
+
@property
|
46
|
+
def run_dir(self) -> str:
|
47
|
+
return os.path.join(self._home_dir, 'run')
|
48
|
+
|
49
|
+
@property
|
50
|
+
def shadow_dir(self) -> str:
|
51
|
+
return os.path.join(self._home_dir, 'shadow')
|
52
|
+
|
53
|
+
@property
|
54
|
+
def state_dir(self) -> str:
|
55
|
+
return os.path.join(self._home_dir, 'state')
|
56
|
+
|
57
|
+
|
58
|
+
def get_home_paths() -> HomePaths:
|
59
|
+
return HomePaths()
|
60
|
+
|
61
|
+
|
62
|
+
##
|
63
|
+
|
64
|
+
|
65
|
+
CACHE_DIR_ENV_VAR = 'OMLISH_CACHE'
|
66
|
+
DEFAULT_CACHE_DIR = '~/.cache/omlish'
|
67
|
+
|
68
|
+
|
69
|
+
def get_cache_dir() -> str:
|
70
|
+
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_home_paths
|
8
8
|
|
9
9
|
|
10
10
|
if ta.TYPE_CHECKING:
|
@@ -24,7 +24,7 @@ def get_secrets_file() -> str:
|
|
24
24
|
return os.path.expanduser(
|
25
25
|
os.getenv(
|
26
26
|
SECRETS_FILE_ENV_VAR,
|
27
|
-
os.path.join(
|
27
|
+
os.path.join(get_home_paths().config_dir, DEFAULT_SECRETS_FILE_NAME),
|
28
28
|
),
|
29
29
|
)
|
30
30
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
from omlish.configs.shadow import MangledFilesShadowConfigs
|
2
2
|
from omlish.configs.shadow import ShadowConfigs
|
3
3
|
|
4
|
-
from .paths import
|
4
|
+
from .paths import get_home_paths
|
5
5
|
|
6
6
|
|
7
7
|
##
|
@@ -9,6 +9,6 @@ from .paths import get_shadow_dir
|
|
9
9
|
|
10
10
|
def get_shadow_configs() -> ShadowConfigs:
|
11
11
|
return MangledFilesShadowConfigs(
|
12
|
-
|
12
|
+
get_home_paths().shadow_dir,
|
13
13
|
create=True,
|
14
14
|
)
|
@@ -79,11 +79,7 @@ class OciDataTarWriter(ExitStacked):
|
|
79
79
|
tar_sha256=self._tw.sha256(),
|
80
80
|
)
|
81
81
|
|
82
|
-
def
|
83
|
-
super().__enter__()
|
84
|
-
|
85
|
-
#
|
86
|
-
|
82
|
+
def _enter_contexts(self) -> None:
|
87
83
|
self._cw = self._FileWrapper(self._f)
|
88
84
|
|
89
85
|
if self._compression is OciCompression.GZIP:
|
@@ -112,16 +108,12 @@ class OciDataTarWriter(ExitStacked):
|
|
112
108
|
self._tw = self._FileWrapper(self._cf)
|
113
109
|
|
114
110
|
self._tf = self._enter_context(
|
115
|
-
tarfile.open( # type: ignore
|
111
|
+
tarfile.open( # type: ignore # noqa
|
116
112
|
fileobj=self._tw,
|
117
113
|
mode='w',
|
118
114
|
),
|
119
115
|
)
|
120
116
|
|
121
|
-
#
|
122
|
-
|
123
|
-
return self
|
124
|
-
|
125
117
|
def tar_file(self) -> tarfile.TarFile:
|
126
118
|
return self._tf
|
127
119
|
|
@@ -2607,6 +2607,48 @@ class ArgparseCli:
|
|
2607
2607
|
return fn()
|
2608
2608
|
|
2609
2609
|
|
2610
|
+
########################################
|
2611
|
+
# ../../../omlish/asyncs/asyncio/sockets.py
|
2612
|
+
|
2613
|
+
|
2614
|
+
async def asyncio_wait_until_can_connect(
|
2615
|
+
host: ta.Any = None,
|
2616
|
+
port: ta.Any = None,
|
2617
|
+
*,
|
2618
|
+
timeout: ta.Optional[TimeoutLike] = None,
|
2619
|
+
on_fail: ta.Optional[ta.Callable[[BaseException], None]] = None,
|
2620
|
+
sleep_s: float = .1,
|
2621
|
+
exception: ta.Union[ta.Type[BaseException], ta.Tuple[ta.Type[BaseException], ...]] = (Exception,),
|
2622
|
+
) -> None:
|
2623
|
+
timeout = Timeout.of(timeout)
|
2624
|
+
|
2625
|
+
async def inner():
|
2626
|
+
while True:
|
2627
|
+
timeout()
|
2628
|
+
|
2629
|
+
try:
|
2630
|
+
reader, writer = await asyncio.open_connection(host, port)
|
2631
|
+
|
2632
|
+
except asyncio.CancelledError:
|
2633
|
+
raise
|
2634
|
+
|
2635
|
+
except exception as e: # noqa
|
2636
|
+
if on_fail is not None:
|
2637
|
+
on_fail(e)
|
2638
|
+
|
2639
|
+
else:
|
2640
|
+
writer.close()
|
2641
|
+
await asyncio.wait_for(writer.wait_closed(), timeout=timeout.or_(None))
|
2642
|
+
break
|
2643
|
+
|
2644
|
+
await asyncio.sleep(min(sleep_s, timeout.remaining()))
|
2645
|
+
|
2646
|
+
if timeout() != float('inf'):
|
2647
|
+
await asyncio.wait_for(inner(), timeout=timeout())
|
2648
|
+
else:
|
2649
|
+
await inner()
|
2650
|
+
|
2651
|
+
|
2610
2652
|
########################################
|
2611
2653
|
# ../../../omlish/asyncs/asyncio/timeouts.py
|
2612
2654
|
|
@@ -3041,20 +3083,64 @@ class HttpRequestParser:
|
|
3041
3083
|
|
3042
3084
|
|
3043
3085
|
class ExitStacked:
|
3086
|
+
def __init_subclass__(cls, **kwargs: ta.Any) -> None:
|
3087
|
+
super().__init_subclass__(**kwargs)
|
3088
|
+
|
3089
|
+
for a in ('__enter__', '__exit__'):
|
3090
|
+
for b in cls.__bases__:
|
3091
|
+
if b is ExitStacked:
|
3092
|
+
continue
|
3093
|
+
try:
|
3094
|
+
fn = getattr(b, a)
|
3095
|
+
except AttributeError:
|
3096
|
+
pass
|
3097
|
+
else:
|
3098
|
+
if fn is not getattr(ExitStacked, a):
|
3099
|
+
raise TypeError(f'ExitStacked subclass {cls} must not not override {a} via {b}')
|
3100
|
+
|
3044
3101
|
_exit_stack: ta.Optional[contextlib.ExitStack] = None
|
3045
3102
|
|
3103
|
+
@contextlib.contextmanager
|
3104
|
+
def _exit_stacked_init_wrapper(self) -> ta.Iterator[None]:
|
3105
|
+
"""
|
3106
|
+
Overridable wrapper around __enter__ which deliberately does not have access to an _exit_stack yet. Intended for
|
3107
|
+
things like wrapping __enter__ in a lock.
|
3108
|
+
"""
|
3109
|
+
|
3110
|
+
yield
|
3111
|
+
|
3112
|
+
@ta.final
|
3046
3113
|
def __enter__(self: ExitStackedT) -> ExitStackedT:
|
3047
|
-
|
3048
|
-
|
3049
|
-
|
3050
|
-
|
3114
|
+
"""
|
3115
|
+
Final because any contexts entered during this init must be exited if any exception is thrown, and user
|
3116
|
+
overriding would likely interfere with that. Override `_enter_contexts` for such init.
|
3117
|
+
"""
|
3118
|
+
|
3119
|
+
with self._exit_stacked_init_wrapper():
|
3120
|
+
check.state(self._exit_stack is None)
|
3121
|
+
es = self._exit_stack = contextlib.ExitStack()
|
3122
|
+
es.__enter__()
|
3123
|
+
try:
|
3124
|
+
self._enter_contexts()
|
3125
|
+
except Exception: # noqa
|
3126
|
+
es.__exit__(*sys.exc_info())
|
3127
|
+
raise
|
3128
|
+
return self
|
3051
3129
|
|
3130
|
+
@ta.final
|
3052
3131
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
3053
3132
|
if (es := self._exit_stack) is None:
|
3054
3133
|
return None
|
3055
|
-
|
3134
|
+
try:
|
3135
|
+
self._exit_contexts()
|
3136
|
+
except Exception: # noqa
|
3137
|
+
es.__exit__(*sys.exc_info())
|
3138
|
+
raise
|
3056
3139
|
return es.__exit__(exc_type, exc_val, exc_tb)
|
3057
3140
|
|
3141
|
+
def _enter_contexts(self) -> None:
|
3142
|
+
pass
|
3143
|
+
|
3058
3144
|
def _exit_contexts(self) -> None:
|
3059
3145
|
pass
|
3060
3146
|
|
@@ -3064,20 +3150,54 @@ class ExitStacked:
|
|
3064
3150
|
|
3065
3151
|
|
3066
3152
|
class AsyncExitStacked:
|
3153
|
+
def __init_subclass__(cls, **kwargs: ta.Any) -> None:
|
3154
|
+
super().__init_subclass__(**kwargs)
|
3155
|
+
|
3156
|
+
for a in ('__aenter__', '__aexit__'):
|
3157
|
+
for b in cls.__bases__:
|
3158
|
+
if b is AsyncExitStacked:
|
3159
|
+
continue
|
3160
|
+
try:
|
3161
|
+
fn = getattr(b, a)
|
3162
|
+
except AttributeError:
|
3163
|
+
pass
|
3164
|
+
else:
|
3165
|
+
if fn is not getattr(AsyncExitStacked, a):
|
3166
|
+
raise TypeError(f'AsyncExitStacked subclass {cls} must not not override {a} via {b}')
|
3167
|
+
|
3067
3168
|
_exit_stack: ta.Optional[contextlib.AsyncExitStack] = None
|
3068
3169
|
|
3170
|
+
@contextlib.asynccontextmanager
|
3171
|
+
async def _async_exit_stacked_init_wrapper(self) -> ta.AsyncGenerator[None, None]:
|
3172
|
+
yield
|
3173
|
+
|
3174
|
+
@ta.final
|
3069
3175
|
async def __aenter__(self: AsyncExitStackedT) -> AsyncExitStackedT:
|
3070
|
-
|
3071
|
-
|
3072
|
-
|
3073
|
-
|
3176
|
+
async with self._async_exit_stacked_init_wrapper():
|
3177
|
+
check.state(self._exit_stack is None)
|
3178
|
+
es = self._exit_stack = contextlib.AsyncExitStack()
|
3179
|
+
await es.__aenter__()
|
3180
|
+
try:
|
3181
|
+
await self._async_enter_contexts()
|
3182
|
+
except Exception: # noqa
|
3183
|
+
await es.__aexit__(*sys.exc_info())
|
3184
|
+
raise
|
3185
|
+
return self
|
3074
3186
|
|
3187
|
+
@ta.final
|
3075
3188
|
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
3076
3189
|
if (es := self._exit_stack) is None:
|
3077
3190
|
return None
|
3078
|
-
|
3191
|
+
try:
|
3192
|
+
await self._async_exit_contexts()
|
3193
|
+
except Exception: # noqa
|
3194
|
+
await es.__aexit__(*sys.exc_info())
|
3195
|
+
raise
|
3079
3196
|
return await es.__aexit__(exc_type, exc_val, exc_tb)
|
3080
3197
|
|
3198
|
+
async def _async_enter_contexts(self) -> None:
|
3199
|
+
pass
|
3200
|
+
|
3081
3201
|
async def _async_exit_contexts(self) -> None:
|
3082
3202
|
pass
|
3083
3203
|
|
@@ -6952,11 +7072,7 @@ class OciDataTarWriter(ExitStacked):
|
|
6952
7072
|
tar_sha256=self._tw.sha256(),
|
6953
7073
|
)
|
6954
7074
|
|
6955
|
-
def
|
6956
|
-
super().__enter__()
|
6957
|
-
|
6958
|
-
#
|
6959
|
-
|
7075
|
+
def _enter_contexts(self) -> None:
|
6960
7076
|
self._cw = self._FileWrapper(self._f)
|
6961
7077
|
|
6962
7078
|
if self._compression is OciCompression.GZIP:
|
@@ -6985,16 +7101,12 @@ class OciDataTarWriter(ExitStacked):
|
|
6985
7101
|
self._tw = self._FileWrapper(self._cf)
|
6986
7102
|
|
6987
7103
|
self._tf = self._enter_context(
|
6988
|
-
tarfile.open( # type: ignore
|
7104
|
+
tarfile.open( # type: ignore # noqa
|
6989
7105
|
fileobj=self._tw,
|
6990
7106
|
mode='w',
|
6991
7107
|
),
|
6992
7108
|
)
|
6993
7109
|
|
6994
|
-
#
|
6995
|
-
|
6996
|
-
return self
|
6997
|
-
|
6998
7110
|
def tar_file(self) -> tarfile.TarFile:
|
6999
7111
|
return self._tf
|
7000
7112
|
|
@@ -8800,58 +8912,88 @@ class SocketServer(abc.ABC):
|
|
8800
8912
|
|
8801
8913
|
#
|
8802
8914
|
|
8803
|
-
|
8804
|
-
|
8805
|
-
|
8806
|
-
|
8807
|
-
|
8915
|
+
class PollResult(enum.Enum):
|
8916
|
+
TIMEOUT = enum.auto()
|
8917
|
+
CONNECTION = enum.auto()
|
8918
|
+
ERROR = enum.auto()
|
8919
|
+
SHUTDOWN = enum.auto()
|
8808
8920
|
|
8809
|
-
|
8921
|
+
class PollContext(ExitStacked, abc.ABC):
|
8922
|
+
@abc.abstractmethod
|
8923
|
+
def poll(self, timeout: ta.Optional[float] = None) -> 'SocketServer.PollResult':
|
8924
|
+
raise NotImplementedError
|
8810
8925
|
|
8811
|
-
|
8812
|
-
|
8813
|
-
|
8814
|
-
# polling. Polling reduces our responsiveness to a shutdown request and wastes cpu at all other times.
|
8815
|
-
with self.Selector() as selector:
|
8816
|
-
selector.register(self._binder.fileno(), selectors.EVENT_READ)
|
8926
|
+
class _PollContext(PollContext):
|
8927
|
+
def __init__(self, server: 'SocketServer') -> None:
|
8928
|
+
super().__init__()
|
8817
8929
|
|
8818
|
-
|
8930
|
+
self._server = server
|
8819
8931
|
|
8820
|
-
|
8821
|
-
self._is_shutdown.set()
|
8932
|
+
_selector: ta.Any = None
|
8822
8933
|
|
8823
|
-
|
8824
|
-
|
8825
|
-
|
8826
|
-
poll_interval = self._poll_interval
|
8934
|
+
def _enter_contexts(self) -> None:
|
8935
|
+
self._enter_context(self._server._lock) # noqa: SLF001
|
8936
|
+
self._enter_context(self._server._binder) # noqa: SLF001
|
8827
8937
|
|
8828
|
-
|
8829
|
-
def loop():
|
8830
|
-
while not self._should_shutdown:
|
8831
|
-
ready = selector.select(poll_interval)
|
8938
|
+
self._server._binder.listen() # noqa: SLF001
|
8832
8939
|
|
8833
|
-
|
8834
|
-
|
8835
|
-
break # type: ignore[unreachable]
|
8940
|
+
self._server._is_shutdown.clear() # noqa: SLF001
|
8941
|
+
self._enter_context(defer(self._server._is_shutdown.set)) # noqa
|
8836
8942
|
|
8837
|
-
|
8838
|
-
|
8839
|
-
|
8943
|
+
# XXX: Consider using another file descriptor or connecting to the socket to wake this up instead of
|
8944
|
+
# polling. Polling reduces our responsiveness to a shutdown request and wastes cpu at all other times.
|
8945
|
+
self._selector = self._enter_context(self._server.Selector())
|
8946
|
+
self._selector.register(self._server._binder.fileno(), selectors.EVENT_READ) # noqa: SLF001
|
8840
8947
|
|
8841
|
-
|
8842
|
-
|
8948
|
+
def poll(self, timeout: ta.Optional[float] = None) -> 'SocketServer.PollResult':
|
8949
|
+
if self._server._should_shutdown: # noqa: SLF001
|
8950
|
+
return SocketServer.PollResult.SHUTDOWN
|
8843
8951
|
|
8844
|
-
|
8952
|
+
ready = self._selector.select(timeout)
|
8845
8953
|
|
8846
|
-
|
8847
|
-
|
8954
|
+
# bpo-35017: shutdown() called during select(), exit immediately.
|
8955
|
+
if self._server._should_shutdown: # noqa: SLF001
|
8956
|
+
return SocketServer.PollResult.SHUTDOWN # type: ignore[unreachable]
|
8848
8957
|
|
8849
|
-
|
8850
|
-
|
8958
|
+
if not ready:
|
8959
|
+
return SocketServer.PollResult.TIMEOUT
|
8851
8960
|
|
8852
|
-
|
8961
|
+
try:
|
8962
|
+
conn = self._server._binder.accept() # noqa: SLF001
|
8963
|
+
|
8964
|
+
except OSError as exc:
|
8965
|
+
self._server._handle_error(exc) # noqa: SLF001
|
8966
|
+
|
8967
|
+
return SocketServer.PollResult.ERROR
|
8968
|
+
|
8969
|
+
try:
|
8970
|
+
self._server._handler(conn) # noqa: SLF001
|
8971
|
+
|
8972
|
+
except Exception as exc: # noqa
|
8973
|
+
self._server._handle_error(exc, conn) # noqa: SLF001
|
8974
|
+
|
8975
|
+
close_socket_immediately(conn.socket)
|
8853
8976
|
|
8854
|
-
|
8977
|
+
return SocketServer.PollResult.CONNECTION
|
8978
|
+
|
8979
|
+
def poll_context(self) -> PollContext:
|
8980
|
+
return self._PollContext(self)
|
8981
|
+
|
8982
|
+
#
|
8983
|
+
|
8984
|
+
@contextlib.contextmanager
|
8985
|
+
def loop_context(self, poll_interval: ta.Optional[float] = None) -> ta.Iterator[ta.Iterator[bool]]:
|
8986
|
+
if poll_interval is None:
|
8987
|
+
poll_interval = self._poll_interval
|
8988
|
+
|
8989
|
+
with self.poll_context() as pc:
|
8990
|
+
def loop():
|
8991
|
+
while True:
|
8992
|
+
res = pc.poll(poll_interval)
|
8993
|
+
if res in (SocketServer.PollResult.ERROR, SocketServer.PollResult.SHUTDOWN):
|
8994
|
+
return
|
8995
|
+
else:
|
8996
|
+
yield res == SocketServer.PollResult.CONNECTION
|
8855
8997
|
|
8856
8998
|
yield loop()
|
8857
8999
|
|
@@ -10631,6 +10773,7 @@ def make_simple_http_server(
|
|
10631
10773
|
ignore_ssl_errors: bool = False,
|
10632
10774
|
executor: ta.Optional[cf.Executor] = None,
|
10633
10775
|
use_threads: bool = False,
|
10776
|
+
**kwargs: ta.Any,
|
10634
10777
|
) -> ta.Iterator[SocketServer]:
|
10635
10778
|
check.arg(not (executor is not None and use_threads))
|
10636
10779
|
|
@@ -10695,6 +10838,7 @@ def make_simple_http_server(
|
|
10695
10838
|
server = es.enter_context(SocketServer(
|
10696
10839
|
SocketBinder.of(bind),
|
10697
10840
|
server_handler,
|
10841
|
+
**kwargs,
|
10698
10842
|
))
|
10699
10843
|
|
10700
10844
|
yield server
|
@@ -11460,17 +11604,14 @@ class CacheServedDockerCache(DockerCache):
|
|
11460
11604
|
dds_run_task = asyncio.create_task(dds.run())
|
11461
11605
|
try:
|
11462
11606
|
timeout = Timeout.of(self._config.server_start_timeout)
|
11463
|
-
|
11464
|
-
|
11465
|
-
|
11466
|
-
|
11467
|
-
|
11468
|
-
|
11469
|
-
|
11470
|
-
|
11471
|
-
await asyncio.wait_for(writer.wait_closed(), timeout=timeout.remaining())
|
11472
|
-
break
|
11473
|
-
await asyncio.sleep(self._config.server_start_sleep)
|
11607
|
+
|
11608
|
+
await asyncio_wait_until_can_connect(
|
11609
|
+
'localhost',
|
11610
|
+
self._config.port,
|
11611
|
+
timeout=timeout,
|
11612
|
+
on_fail=lambda _: log.exception('Failed to connect to cache server - will try again'),
|
11613
|
+
sleep_s=self._config.server_start_sleep,
|
11614
|
+
)
|
11474
11615
|
|
11475
11616
|
if (prc := self._config.pull_run_cmd) is not None:
|
11476
11617
|
pull_cmd = [
|
@@ -22,7 +22,7 @@ from omlish.subprocesses.sync import subprocesses
|
|
22
22
|
|
23
23
|
from ...git.status import GitStatusItem
|
24
24
|
from ...git.status import get_git_status
|
25
|
-
from ...home.paths import
|
25
|
+
from ...home.paths import get_home_paths
|
26
26
|
from ...home.shadow import get_shadow_configs
|
27
27
|
from . import consts
|
28
28
|
from .messages import GitMessageGenerator
|
@@ -75,7 +75,7 @@ class Cli(ap.Cli):
|
|
75
75
|
if (arg := self._config_file_path_arg) is not None:
|
76
76
|
return os.path.expanduser(arg)
|
77
77
|
else:
|
78
|
-
return os.path.join(
|
78
|
+
return os.path.join(get_home_paths().config_dir, 'tools', 'git.yml')
|
79
79
|
|
80
80
|
@cached.function
|
81
81
|
def load_home_config_content(self) -> ta.Any:
|
@@ -55,10 +55,8 @@ class DelimitingParser:
|
|
55
55
|
class StreamBuilder(lang.ExitStacked):
|
56
56
|
_builder: JsonObjectBuilder | None = None
|
57
57
|
|
58
|
-
def
|
59
|
-
super().__enter__()
|
58
|
+
def _enter_contexts(self) -> None:
|
60
59
|
self._builder = self._enter_context(JsonObjectBuilder())
|
61
|
-
return self
|
62
60
|
|
63
61
|
def build(self, e: JsonStreamParserEvent) -> ta.Generator[ta.Any, None, None]:
|
64
62
|
yield from check.not_none(self._builder)(e)
|
@@ -69,12 +67,10 @@ class StreamParser(lang.ExitStacked):
|
|
69
67
|
_lex: JsonStreamLexer
|
70
68
|
_parse: JsonStreamParser
|
71
69
|
|
72
|
-
def
|
73
|
-
super().__enter__()
|
70
|
+
def _enter_contexts(self) -> None:
|
74
71
|
self._decoder = codecs.getincrementaldecoder('utf-8')()
|
75
72
|
self._lex = self._enter_context(JsonStreamLexer())
|
76
73
|
self._parse = self._enter_context(JsonStreamParser())
|
77
|
-
return self
|
78
74
|
|
79
75
|
def parse(self, b: bytes) -> ta.Generator[JsonStreamParserEvent, None, None]:
|
80
76
|
for s in self._decoder.decode(b, not b):
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: omdev
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev244
|
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.dev244
|
16
16
|
Provides-Extra: all
|
17
17
|
Requires-Dist: black~=25.1; extra == "all"
|
18
18
|
Requires-Dist: pycparser~=2.22; extra == "all"
|
@@ -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.dev244'
|
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.dev244',
|
26
26
|
]
|
27
27
|
|
28
28
|
[project.optional-dependencies]
|