omdev 0.0.0.dev310__tar.gz → 0.0.0.dev312__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.dev310/omdev.egg-info → omdev-0.0.0.dev312}/PKG-INFO +2 -2
- omdev-0.0.0.dev312/README.md +44 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/.manifests.json +12 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/__init__.py +5 -2
- omdev-0.0.0.dev312/omdev/ptk/confirm.py +54 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/markdown.py +6 -0
- omdev-0.0.0.dev312/omdev/tools/antlr/__main__.py +11 -0
- omdev-0.0.0.dev312/omdev/tools/antlr/cli.py +62 -0
- {omdev-0.0.0.dev310/omdev → omdev-0.0.0.dev312/omdev/tools}/antlr/consts.py +1 -1
- omdev-0.0.0.dev312/omdev/tools/antlr/gen.py +187 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/git/cli.py +16 -4
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312/omdev.egg-info}/PKG-INFO +2 -2
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev.egg-info/SOURCES.txt +6 -3
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev.egg-info/requires.txt +1 -1
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/pyproject.toml +2 -2
- omdev-0.0.0.dev310/README.md +0 -17
- omdev-0.0.0.dev310/omdev/antlr/gen.py +0 -114
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/LICENSE +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/MANIFEST.in +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/__about__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/__main__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/gen.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/imports.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/main.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/manifests.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/resources.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/srcfiles.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/strip.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/types.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/amalg/typing.py +0 -0
- {omdev-0.0.0.dev310/omdev/antlr → omdev-0.0.0.dev312/omdev/cache}/__init__.py +0 -0
- {omdev-0.0.0.dev310/omdev/cache → omdev-0.0.0.dev312/omdev/cache/compute}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/compute/cache.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/compute/contexts.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/compute/currents.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/compute/fns.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/compute/resolvers.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/compute/storage.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/compute/types.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/data/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/data/actions.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/data/cache.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/data/consts.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/data/defaults.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/data/manifests.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cache/data/specs.py +0 -0
- {omdev-0.0.0.dev310/omdev/cache/compute → omdev-0.0.0.dev312/omdev/cc}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cc/__main__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cc/cdeps.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cc/cdeps.toml +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cc/cli.py +0 -0
- {omdev-0.0.0.dev310/omdev/cc → omdev-0.0.0.dev312/omdev/cexts}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_boilerplate.cc +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/LICENSE +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/build_ext.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/compilers/options.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/dir_util.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/errors.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/extension.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/file_util.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/modified.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/spawn.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/sysconfig.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/util.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/_distutils/version.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/build.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/cmake.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/importhook.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/magic.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cexts/scan.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/__main__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/cache.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/ci.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/cli.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/compose.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/consts.py +0 -0
- {omdev-0.0.0.dev310/omdev/cexts → omdev-0.0.0.dev312/omdev/ci/docker}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/buildcaching.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/cache.py +0 -0
- {omdev-0.0.0.dev310/omdev/ci/docker → omdev-0.0.0.dev312/omdev/ci/docker/cacheserved}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/cacheserved/cache.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/cacheserved/manifests.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/cmds.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/dataserver.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/imagepulling.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/inject.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/packing.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/repositories.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/docker/utils.py +0 -0
- {omdev-0.0.0.dev310/omdev/ci/docker/cacheserved → omdev-0.0.0.dev312/omdev/ci/github}/__init__.py +0 -0
- {omdev-0.0.0.dev310/omdev/ci/github → omdev-0.0.0.dev312/omdev/ci/github/api}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/api/clients.py +0 -0
- {omdev-0.0.0.dev310/omdev/ci/github/api → omdev-0.0.0.dev312/omdev/ci/github/api/v1}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/api/v1/api.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/api/v1/client.py +0 -0
- {omdev-0.0.0.dev310/omdev/ci/github/api/v1 → omdev-0.0.0.dev312/omdev/ci/github/api/v2}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/api/v2/api.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/api/v2/azure.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/api/v2/client.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/bootstrap.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/cache.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/cli.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/env.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/github/inject.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/inject.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/requirements.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/shell.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ci/utils.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cli/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cli/__main__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cli/_pathhack.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cli/clicli.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cli/install.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cli/main.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cli/managers.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cli/types.py +0 -0
- {omdev-0.0.0.dev310/omdev/ci/github/api/v2 → omdev-0.0.0.dev312/omdev/clipboard}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/clipboard/clipboard.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/clipboard/darwin_cf.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/clipboard/linux_x11.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cmake.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cmdlog/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cmdlog/__main__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cmdlog/_cmdlog.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cmdlog/cli.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/cmdlog/cmdlog.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/dataserver/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/dataserver/handlers.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/dataserver/http.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/dataserver/routes.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/dataserver/server.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/dataserver/targets.py +0 -0
- {omdev-0.0.0.dev310/omdev/clipboard → omdev-0.0.0.dev312/omdev/git}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/git/magic.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/git/revisions.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/git/shallow.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/git/status.py +0 -0
- {omdev-0.0.0.dev310/omdev/git → omdev-0.0.0.dev312/omdev/home}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/home/paths.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/home/secrets.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/home/shadow.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/imgur.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/__main__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/cli.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/default.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/inject.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/inspect.py +0 -0
- {omdev-0.0.0.dev310/omdev/home → omdev-0.0.0.dev312/omdev/interp/providers}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/providers/base.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/providers/inject.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/providers/running.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/providers/standalone.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/providers/system.py +0 -0
- {omdev-0.0.0.dev310/omdev/interp/providers → omdev-0.0.0.dev312/omdev/interp/pyenv}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/pyenv/inject.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/pyenv/install.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/pyenv/provider.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/pyenv/pyenv.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/resolvers.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/types.py +0 -0
- {omdev-0.0.0.dev310/omdev/interp/pyenv → omdev-0.0.0.dev312/omdev/interp/uv}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/uv/inject.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/uv/provider.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/uv/uv.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/interp/venvs.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/magic/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/magic/__main__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/magic/cli.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/magic/find.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/magic/magic.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/magic/prepare.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/magic/styles.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/manifests/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/manifests/__main__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/manifests/build.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/manifests/dumping.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/manifests/main.py +0 -0
- {omdev-0.0.0.dev310/omdev/interp/uv → omdev-0.0.0.dev312/omdev/mypy}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/mypy/debug.py +0 -0
- {omdev-0.0.0.dev310/omdev/mypy → omdev-0.0.0.dev312/omdev/oci}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/building.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/compression.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/data.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/datarefs.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/dataserver.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/loading.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/media.py +0 -0
- {omdev-0.0.0.dev310/omdev/oci → omdev-0.0.0.dev312/omdev/oci/pack}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/pack/packing.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/pack/repositories.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/pack/unpacking.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/repositories.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/oci/tars.py +0 -0
- {omdev-0.0.0.dev310/omdev/oci/pack → omdev-0.0.0.dev312/omdev/packaging}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/packaging/marshal.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/packaging/names.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/packaging/requires.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/packaging/revisions.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/packaging/specifiers.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/packaging/versions.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/packaging/wheelfile.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pip.py +0 -0
- {omdev-0.0.0.dev310/omdev/packaging → omdev-0.0.0.dev312/omdev/precheck}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/__main__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/base.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/caches.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/git.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/imports.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/lite.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/main.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/manifests.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/precheck/scripts.py +0 -0
- {omdev-0.0.0.dev310/omdev/precheck → omdev-0.0.0.dev312/omdev/ptk/apps}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/apps/ncdu.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/LICENSE +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/__main__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/border.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/cli.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/parser.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/styles.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/tags.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/ptk/markdown/utils.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/attrdocs.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/bracepy.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/classdot.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/findimports.py +0 -0
- {omdev-0.0.0.dev310/omdev/ptk/apps → omdev-0.0.0.dev312/omdev/py/scripts}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/scripts/bumpversion.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/scripts/execstat.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/scripts/importtrace.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/srcheaders.py +0 -0
- {omdev-0.0.0.dev310/omdev/py/scripts → omdev-0.0.0.dev312/omdev/py/tools}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/tools/importscan.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/py/tools/mkrelimp.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/__main__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/cexts.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/cli.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/configs.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/inject.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/pkg.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/reqs.py +0 -0
- {omdev-0.0.0.dev310/omdev/py/tools → omdev-0.0.0.dev312/omdev/pyproject/resources}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/resources/docker-dev.sh +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/resources/python.sh +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/pyproject/venvs.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/scripts/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/scripts/ci.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/scripts/interp.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/scripts/pyproject.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/scripts/slowcat.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/scripts/tmpexec.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tagstrings.py +0 -0
- {omdev-0.0.0.dev310/omdev/pyproject/resources → omdev-0.0.0.dev312/omdev/tokens}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tokens/all.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tokens/tokenizert.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tokens/utils.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/__init__.py +0 -0
- {omdev-0.0.0.dev310/omdev/tokens → omdev-0.0.0.dev312/omdev/tools/antlr}/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/cloc.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/diff.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/doc.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/docker.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/git/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/git/__main__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/git/consts.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/git/messages.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/intellij.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/json/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/json/__main__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/json/cli.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/json/formats.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/json/io.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/json/parsing.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/json/processing.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/json/rendering.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/linehisto.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/mkenv.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/notebook.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/pawk/__init__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/pawk/__main__.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/pawk/pawk.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/pip.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/prof.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/qr.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/shadow.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev/tools/sqlrepl.py +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev.egg-info/dependency_links.txt +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev.egg-info/entry_points.txt +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/omdev.egg-info/top_level.txt +0 -0
- {omdev-0.0.0.dev310 → omdev-0.0.0.dev312}/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.dev312
|
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.dev312
|
16
16
|
Provides-Extra: all
|
17
17
|
Requires-Dist: black~=25.1; extra == "all"
|
18
18
|
Requires-Dist: pycparser~=2.22; extra == "all"
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Overview
|
2
|
+
|
3
|
+
Development utilities and support code.
|
4
|
+
|
5
|
+
# Notable packages
|
6
|
+
|
7
|
+
- **[cli](cli)** - The codebase's all-in-one CLI. This is not installed as an entrypoint / command when this package is
|
8
|
+
itself installed - that is separated into the `omdev-cli` installable package so as to not pollute users' bin/
|
9
|
+
directories when depping this lib for its utility code.
|
10
|
+
|
11
|
+
- **[amalg](amalg)** - The [amalgamator](#amalgamation).
|
12
|
+
|
13
|
+
- **[pyproject](pyproject)** ([amalg](scripts/pyproject.py)) - python project management tool. wrangles but does not
|
14
|
+
replace tools like venv, pip, setuptools, and uv. this should grow to eat more and more of the Makefile. as it is
|
15
|
+
amalgamated it requires no installation and can just be dropped into other projects / repos.
|
16
|
+
|
17
|
+
- **[ci](ci)** ([amalg](scripts/ci.py)) - ci runner. given a [compose.yml](https://github.com/wrmsr/omlish/blob/master/docker/compose.yml)
|
18
|
+
and requirements.txt files, takes care of building and caching of containers and venvs and execution of required ci
|
19
|
+
commands. detects and [natively uses](ci/github/api/v2) github-action's caching system. unifies ci execution between
|
20
|
+
local dev and github runners.
|
21
|
+
|
22
|
+
- **[tools.json](tools/json)** (cli: `om j`) - a tool for json-like data, obviously in the vein of [jq](https://github.com/jqlang/jq)
|
23
|
+
but using the internal [jmespath](https://github.com/wrmsr/omlish/tree/master/omlish/specs/jmespath) engine. supports
|
24
|
+
[true streaming](https://github.com/wrmsr/omlish/blob/master/omlish/formats/json/stream) json input and output, as
|
25
|
+
well as [various other](tools/json/formats.py) non-streaming input formats.
|
26
|
+
|
27
|
+
- **[tools.git](tools/git)** (cli: `om git`) - a tool for various lazy git operations, including the one that (poorly)
|
28
|
+
writes all of these commit messages.
|
29
|
+
|
30
|
+
# Amalgamation
|
31
|
+
|
32
|
+
Amalgamation is the process of stitching together multiple python source files into a single self-contained python
|
33
|
+
script. ['lite'](https://github.com/wrmsr/omlish/blob/master/omlish#lite-code) code is written in a style conducive to
|
34
|
+
this.
|
35
|
+
|
36
|
+
# Local storage
|
37
|
+
|
38
|
+
Some of this code, when asked, will store things on the local filesystem. The only directories used (outside of ones
|
39
|
+
explicitly specified as command or function arguments) are managed in [home.paths](home/paths.py), and are the
|
40
|
+
following:
|
41
|
+
|
42
|
+
- `$OMLISH_HOME`, default of `~/.omlish` - persistent things like config and state.
|
43
|
+
- `$OMLISH_CACHE`, default of `~/.cache/omlish` - used for things like the local ci cache and
|
44
|
+
[various other](https://github.com/search?q=repo%3Awrmsr%2Fomlish+%22dcache.%22&type=code) cached data.
|
@@ -290,6 +290,18 @@
|
|
290
290
|
}
|
291
291
|
}
|
292
292
|
},
|
293
|
+
{
|
294
|
+
"module": ".tools.antlr.__main__",
|
295
|
+
"attr": "_CLI_MODULE",
|
296
|
+
"file": "omdev/tools/antlr/__main__.py",
|
297
|
+
"line": 4,
|
298
|
+
"value": {
|
299
|
+
"$.cli.types.CliModule": {
|
300
|
+
"cmd_name": "antlr",
|
301
|
+
"mod_name": "omdev.tools.antlr.__main__"
|
302
|
+
}
|
303
|
+
}
|
304
|
+
},
|
293
305
|
{
|
294
306
|
"module": ".tools.cloc",
|
295
307
|
"attr": "_CLI_MODULE",
|
@@ -1,8 +1,7 @@
|
|
1
1
|
# ruff: noqa: F401
|
2
2
|
# flake8: noqa: F401
|
3
3
|
|
4
|
-
from prompt_toolkit import Application
|
5
|
-
from prompt_toolkit import prompt
|
4
|
+
from prompt_toolkit.application import Application
|
6
5
|
from prompt_toolkit.application import get_app
|
7
6
|
from prompt_toolkit.application import get_app_session
|
8
7
|
from prompt_toolkit.application import run_in_terminal
|
@@ -80,7 +79,9 @@ from prompt_toolkit.output import DummyOutput
|
|
80
79
|
from prompt_toolkit.output import Output
|
81
80
|
from prompt_toolkit.search import SearchDirection
|
82
81
|
from prompt_toolkit.selection import SelectionType
|
82
|
+
from prompt_toolkit.shortcuts import confirm
|
83
83
|
from prompt_toolkit.shortcuts import print_formatted_text
|
84
|
+
from prompt_toolkit.shortcuts import prompt
|
84
85
|
from prompt_toolkit.styles import BaseStyle
|
85
86
|
from prompt_toolkit.styles import DynamicStyle
|
86
87
|
from prompt_toolkit.styles import Style
|
@@ -95,3 +96,5 @@ from prompt_toolkit.widgets.toolbars import FormattedTextToolbar
|
|
95
96
|
from prompt_toolkit.widgets.toolbars import SearchToolbar
|
96
97
|
from prompt_toolkit.widgets.toolbars import SystemToolbar
|
97
98
|
from prompt_toolkit.widgets.toolbars import ValidationToolbar
|
99
|
+
|
100
|
+
from .confirm import strict_confirm
|
@@ -0,0 +1,54 @@
|
|
1
|
+
from prompt_toolkit.formatted_text import merge_formatted_text
|
2
|
+
from prompt_toolkit.key_binding import KeyBindings
|
3
|
+
from prompt_toolkit.key_binding import KeyPressEvent
|
4
|
+
from prompt_toolkit.shortcuts import PromptSession
|
5
|
+
|
6
|
+
from omlish import check
|
7
|
+
|
8
|
+
|
9
|
+
##
|
10
|
+
|
11
|
+
|
12
|
+
def create_strict_confirm_session(
|
13
|
+
message: str,
|
14
|
+
suffix: str = ' (y/n) ',
|
15
|
+
) -> PromptSession[str | bool]:
|
16
|
+
"""Create a `PromptSession` object for the 'confirm' function."""
|
17
|
+
|
18
|
+
bindings = KeyBindings()
|
19
|
+
|
20
|
+
@bindings.add('y')
|
21
|
+
@bindings.add('Y')
|
22
|
+
def yes(event: KeyPressEvent) -> None:
|
23
|
+
session.default_buffer.text = 'y'
|
24
|
+
event.app.exit(result=True)
|
25
|
+
|
26
|
+
@bindings.add('n')
|
27
|
+
@bindings.add('N')
|
28
|
+
def no(event: KeyPressEvent) -> None:
|
29
|
+
session.default_buffer.text = 'n'
|
30
|
+
event.app.exit(result=False)
|
31
|
+
|
32
|
+
complete_message = merge_formatted_text([message, suffix])
|
33
|
+
session: PromptSession[str | bool] = PromptSession(
|
34
|
+
complete_message,
|
35
|
+
key_bindings=bindings,
|
36
|
+
)
|
37
|
+
return session
|
38
|
+
|
39
|
+
|
40
|
+
def strict_confirm(message: str = 'Confirm?', suffix: str = ' (y/n) ') -> bool:
|
41
|
+
"""Display a confirmation prompt that returns True/False. Requires an explicit answer."""
|
42
|
+
|
43
|
+
while True:
|
44
|
+
session = create_strict_confirm_session(message, suffix)
|
45
|
+
ret = session.prompt()
|
46
|
+
|
47
|
+
if isinstance(ret, str):
|
48
|
+
check.empty(ret)
|
49
|
+
|
50
|
+
elif isinstance(ret, bool):
|
51
|
+
return ret
|
52
|
+
|
53
|
+
else:
|
54
|
+
raise TypeError(ret)
|
@@ -1,3 +1,8 @@
|
|
1
|
+
"""
|
2
|
+
TODO:
|
3
|
+
- accept pre-parsed tokens
|
4
|
+
- provide live view in this pkg
|
5
|
+
"""
|
1
6
|
import itertools
|
2
7
|
import typing as ta
|
3
8
|
|
@@ -36,6 +41,7 @@ class Markdown:
|
|
36
41
|
def __init__(
|
37
42
|
self,
|
38
43
|
markup: str,
|
44
|
+
*,
|
39
45
|
width: int | None = None,
|
40
46
|
strip_trailing_lines: bool = True,
|
41
47
|
) -> None:
|
@@ -0,0 +1,62 @@
|
|
1
|
+
import logging
|
2
|
+
import re
|
3
|
+
import subprocess
|
4
|
+
import sys
|
5
|
+
|
6
|
+
from omlish.argparse import all as ap
|
7
|
+
from omlish.logs import all as logs
|
8
|
+
|
9
|
+
from .consts import ANTLR_RUNTIME_PACKAGE
|
10
|
+
from .gen import GenPy
|
11
|
+
from .gen import get_jar_path
|
12
|
+
|
13
|
+
|
14
|
+
log = logging.getLogger(__name__)
|
15
|
+
|
16
|
+
|
17
|
+
##
|
18
|
+
|
19
|
+
|
20
|
+
class Cli(ap.Cli):
|
21
|
+
@ap.cmd()
|
22
|
+
def jar(self) -> None:
|
23
|
+
print(get_jar_path())
|
24
|
+
|
25
|
+
@ap.cmd()
|
26
|
+
def latest(self) -> None:
|
27
|
+
o, _ = subprocess.Popen(
|
28
|
+
[
|
29
|
+
sys.executable,
|
30
|
+
'-m', 'pip',
|
31
|
+
'index', 'versions',
|
32
|
+
ANTLR_RUNTIME_PACKAGE,
|
33
|
+
],
|
34
|
+
stdout=subprocess.PIPE,
|
35
|
+
).communicate()
|
36
|
+
tl = o.decode().splitlines()[0]
|
37
|
+
m = re.fullmatch(rf'{ANTLR_RUNTIME_PACKAGE} \((?P<version>[^)]+)\)', tl)
|
38
|
+
if m is None:
|
39
|
+
raise ValueError(f'Failed to parse version: {tl}')
|
40
|
+
v = m.groupdict()['version']
|
41
|
+
print(v)
|
42
|
+
|
43
|
+
#
|
44
|
+
|
45
|
+
@ap.cmd(
|
46
|
+
ap.arg('roots', nargs='+'),
|
47
|
+
)
|
48
|
+
def gen(self) -> None:
|
49
|
+
gp = GenPy(
|
50
|
+
self.args.roots,
|
51
|
+
)
|
52
|
+
gp.run()
|
53
|
+
|
54
|
+
|
55
|
+
def _main() -> None:
|
56
|
+
logs.configure_standard_logging(logging.INFO)
|
57
|
+
cli = Cli()
|
58
|
+
cli()
|
59
|
+
|
60
|
+
|
61
|
+
if __name__ == '__main__':
|
62
|
+
_main()
|
@@ -0,0 +1,187 @@
|
|
1
|
+
"""
|
2
|
+
TODO:
|
3
|
+
- mtime cmp
|
4
|
+
- parallelism
|
5
|
+
"""
|
6
|
+
import logging
|
7
|
+
import os.path
|
8
|
+
import re
|
9
|
+
import shutil
|
10
|
+
import subprocess
|
11
|
+
import typing as ta
|
12
|
+
|
13
|
+
from omlish import check
|
14
|
+
from omlish import lang
|
15
|
+
from omlish.os.paths import is_path_in_dir
|
16
|
+
|
17
|
+
from ...cache import data as dcache
|
18
|
+
from .consts import ANTLR_JAR_URL
|
19
|
+
from .consts import ANTLR_RUNTIME_VENDOR
|
20
|
+
|
21
|
+
|
22
|
+
log = logging.getLogger(__name__)
|
23
|
+
|
24
|
+
|
25
|
+
##
|
26
|
+
|
27
|
+
|
28
|
+
ANTLR_JAR_CACHE = dcache.UrlSpec(ANTLR_JAR_URL)
|
29
|
+
|
30
|
+
|
31
|
+
@lang.cached_function
|
32
|
+
def get_jar_path() -> str:
|
33
|
+
return dcache.default().get(ANTLR_JAR_CACHE)
|
34
|
+
|
35
|
+
|
36
|
+
##
|
37
|
+
|
38
|
+
|
39
|
+
def _find_dirs(*base_paths: str, filter: ta.Callable[[str], bool] = lambda _: True) -> ta.Sequence[str]: # noqa
|
40
|
+
return sorted(
|
41
|
+
os.path.join(dp, dn)
|
42
|
+
for base_path in base_paths
|
43
|
+
for dp, dns, fns in os.walk(base_path)
|
44
|
+
for dn in dns
|
45
|
+
if filter(dn)
|
46
|
+
)
|
47
|
+
|
48
|
+
|
49
|
+
def _find_files(*base_paths: str, filter: ta.Callable[[str], bool] = lambda _: True) -> ta.Sequence[str]: # noqa
|
50
|
+
return sorted(
|
51
|
+
os.path.join(dp, fn)
|
52
|
+
for base_path in base_paths
|
53
|
+
for dp, dns, fns in os.walk(base_path)
|
54
|
+
for fn in fns
|
55
|
+
if filter(fn)
|
56
|
+
)
|
57
|
+
|
58
|
+
|
59
|
+
class GenPy:
|
60
|
+
def __init__(
|
61
|
+
self,
|
62
|
+
root_dirs: str, # noqa
|
63
|
+
*,
|
64
|
+
out_subdir: str = '_antlr',
|
65
|
+
runtime_import: str = ANTLR_RUNTIME_VENDOR,
|
66
|
+
jar_path: str | None = None,
|
67
|
+
# parallelism: int | None = None,
|
68
|
+
) -> None:
|
69
|
+
super().__init__()
|
70
|
+
|
71
|
+
check.non_empty_str(out_subdir)
|
72
|
+
check.arg(not os.path.isabs(out_subdir) and '.' not in out_subdir and '/' not in out_subdir)
|
73
|
+
|
74
|
+
self._root_dirs = frozenset(check.non_empty_str(rd) for rd in check.not_isinstance(root_dirs, str))
|
75
|
+
self._out_subdir = out_subdir
|
76
|
+
self._runtime_import = runtime_import
|
77
|
+
self._given_jar_path = jar_path
|
78
|
+
|
79
|
+
#
|
80
|
+
|
81
|
+
def _rmtree(self, tgt: str) -> None: # noqa
|
82
|
+
if not any(is_path_in_dir(rd, tgt) for rd in self._root_dirs):
|
83
|
+
raise RuntimeError(f'Refusing to delete {tgt!r} outside of {self._root_dirs!r}')
|
84
|
+
shutil.rmtree(tgt)
|
85
|
+
|
86
|
+
#
|
87
|
+
|
88
|
+
@lang.cached_function
|
89
|
+
def jar_path(self) -> str:
|
90
|
+
if (gjp := self._given_jar_path) is not None:
|
91
|
+
return gjp
|
92
|
+
return get_jar_path()
|
93
|
+
|
94
|
+
#
|
95
|
+
|
96
|
+
def process_g4(self, g4_file: str) -> None:
|
97
|
+
ap = os.path.abspath(g4_file)
|
98
|
+
check.state(os.path.isfile(ap))
|
99
|
+
|
100
|
+
od = os.path.join(os.path.dirname(ap), self._out_subdir)
|
101
|
+
os.makedirs(od, exist_ok=True)
|
102
|
+
|
103
|
+
log.info('Compiling grammar %s', g4_file)
|
104
|
+
|
105
|
+
try:
|
106
|
+
subprocess.check_call([
|
107
|
+
'java',
|
108
|
+
'-jar', self.jar_path(),
|
109
|
+
'-Dlanguage=Python3',
|
110
|
+
'-visitor',
|
111
|
+
'-o', self._out_subdir,
|
112
|
+
os.path.basename(g4_file),
|
113
|
+
], cwd=os.path.dirname(ap))
|
114
|
+
|
115
|
+
except Exception: # noqa
|
116
|
+
log.exception('Exception in grammar %s', g4_file)
|
117
|
+
raise
|
118
|
+
|
119
|
+
def process_py(self, py_file: str) -> None:
|
120
|
+
ap = os.path.abspath(py_file)
|
121
|
+
with open(ap) as f:
|
122
|
+
in_lines = list(f)
|
123
|
+
|
124
|
+
pfp = py_file.split(os.sep)
|
125
|
+
arp = ANTLR_RUNTIME_VENDOR.split('.')
|
126
|
+
if (cpl := lang.common_prefix_len(pfp, arp)) > 0:
|
127
|
+
pkg_depth = len(os.path.normpath(py_file).split(os.path.sep))
|
128
|
+
antlr_imp = '.'.join([*([''] * (pkg_depth - cpl)), *arp[cpl:]])
|
129
|
+
else:
|
130
|
+
antlr_imp = ANTLR_RUNTIME_VENDOR
|
131
|
+
|
132
|
+
out_lines = [
|
133
|
+
'# type: ignore\n',
|
134
|
+
'# ruff: noqa\n',
|
135
|
+
'# flake8: noqa\n',
|
136
|
+
]
|
137
|
+
|
138
|
+
for l in in_lines:
|
139
|
+
l = re.sub(r'^(from antlr4)(.*)', rf'from {antlr_imp}\2', l)
|
140
|
+
out_lines.append(l)
|
141
|
+
|
142
|
+
with open(ap, 'w') as f:
|
143
|
+
f.write(''.join(out_lines))
|
144
|
+
|
145
|
+
def process_dir(self, dir: str) -> None: # noqa
|
146
|
+
log.info('Processing directory %s', dir)
|
147
|
+
|
148
|
+
ad = os.path.join(dir, self._out_subdir)
|
149
|
+
if os.path.exists(ad):
|
150
|
+
self._rmtree(ad)
|
151
|
+
|
152
|
+
for f in os.listdir(dir):
|
153
|
+
fp = os.path.join(dir, f)
|
154
|
+
if not os.path.isfile(fp) or not f.endswith('.g4'):
|
155
|
+
continue
|
156
|
+
|
157
|
+
self.process_g4(fp)
|
158
|
+
|
159
|
+
if not os.path.exists(ad):
|
160
|
+
return
|
161
|
+
|
162
|
+
ip = os.path.join(ad, '__init__.py')
|
163
|
+
check.state(not os.path.exists(ip))
|
164
|
+
|
165
|
+
for f in list(os.listdir(ad)):
|
166
|
+
fp = os.path.join(ad, f)
|
167
|
+
if not os.path.isfile(fp):
|
168
|
+
continue
|
169
|
+
|
170
|
+
if f.split('.')[-1] in ('interp', 'tokens'):
|
171
|
+
os.unlink(fp)
|
172
|
+
|
173
|
+
elif f != '__init__.py' and f.endswith('.py'):
|
174
|
+
self.process_py(fp)
|
175
|
+
|
176
|
+
with open(ip, 'w'):
|
177
|
+
pass
|
178
|
+
|
179
|
+
def run(self) -> None:
|
180
|
+
dns = _find_dirs(*self._root_dirs, filter=lambda dn: os.path.basename(dn) == '_antlr')
|
181
|
+
for dn in dns:
|
182
|
+
self._rmtree(dn)
|
183
|
+
|
184
|
+
fns = _find_files(*self._root_dirs, filter=lambda fn: fn.endswith('.g4'))
|
185
|
+
fds = {os.path.dirname(fn) for fn in fns}
|
186
|
+
for dn in sorted(fds):
|
187
|
+
self.process_dir(dn)
|
@@ -23,7 +23,6 @@ import dataclasses as dc
|
|
23
23
|
import logging
|
24
24
|
import os
|
25
25
|
import re
|
26
|
-
import sys
|
27
26
|
import typing as ta
|
28
27
|
import urllib.parse
|
29
28
|
|
@@ -380,6 +379,8 @@ class Cli(ap.Cli):
|
|
380
379
|
)
|
381
380
|
def update_submodule_branches(self) -> None:
|
382
381
|
def run_submodule(submodule: str, cwd: str | None) -> None:
|
382
|
+
log.info('Updating submodule %s', submodule)
|
383
|
+
|
383
384
|
submodule_path = submodule if cwd is None else os.path.join(cwd, submodule)
|
384
385
|
|
385
386
|
# Get the HEAD branch from origin
|
@@ -401,21 +402,32 @@ class Cli(ap.Cli):
|
|
401
402
|
subprocesses.check_call('git', 'checkout', head_branch, cwd=submodule_path)
|
402
403
|
subprocesses.check_call('git', 'pull', cwd=submodule_path)
|
403
404
|
|
405
|
+
failed: set[str] = set()
|
406
|
+
|
404
407
|
def run(cwd: str | None) -> None:
|
405
408
|
submodules = subprocesses.check_output(
|
406
409
|
'git', 'submodule', 'foreach', '-q', 'echo $name',
|
407
410
|
cwd=cwd,
|
408
411
|
).decode().strip().splitlines()
|
409
412
|
|
410
|
-
for submodule in submodules:
|
413
|
+
for submodule in sorted(submodules):
|
411
414
|
try:
|
412
415
|
run_submodule(submodule, cwd)
|
413
|
-
|
416
|
+
|
417
|
+
except Exception: # noqa
|
418
|
+
failed.add(submodule)
|
419
|
+
|
414
420
|
if self.args.on_error_resume_next:
|
415
|
-
|
421
|
+
log.exception('Failed to update submodule %s', submodule)
|
416
422
|
else:
|
417
423
|
raise
|
418
424
|
|
425
|
+
if failed:
|
426
|
+
log.error(
|
427
|
+
'The following submodules failed to update:\n%s',
|
428
|
+
'\n'.join([f' {f}' for f in failed]),
|
429
|
+
)
|
430
|
+
|
419
431
|
if not self.args.dir:
|
420
432
|
run(None)
|
421
433
|
else:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: omdev
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev312
|
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.dev312
|
16
16
|
Provides-Extra: all
|
17
17
|
Requires-Dist: black~=25.1; extra == "all"
|
18
18
|
Requires-Dist: pycparser~=2.22; extra == "all"
|
@@ -26,9 +26,6 @@ omdev/amalg/srcfiles.py
|
|
26
26
|
omdev/amalg/strip.py
|
27
27
|
omdev/amalg/types.py
|
28
28
|
omdev/amalg/typing.py
|
29
|
-
omdev/antlr/__init__.py
|
30
|
-
omdev/antlr/consts.py
|
31
|
-
omdev/antlr/gen.py
|
32
29
|
omdev/cache/__init__.py
|
33
30
|
omdev/cache/compute/__init__.py
|
34
31
|
omdev/cache/compute/cache.py
|
@@ -215,6 +212,7 @@ omdev/precheck/main.py
|
|
215
212
|
omdev/precheck/manifests.py
|
216
213
|
omdev/precheck/scripts.py
|
217
214
|
omdev/ptk/__init__.py
|
215
|
+
omdev/ptk/confirm.py
|
218
216
|
omdev/ptk/apps/__init__.py
|
219
217
|
omdev/ptk/apps/ncdu.py
|
220
218
|
omdev/ptk/markdown/LICENSE
|
@@ -276,6 +274,11 @@ omdev/tools/prof.py
|
|
276
274
|
omdev/tools/qr.py
|
277
275
|
omdev/tools/shadow.py
|
278
276
|
omdev/tools/sqlrepl.py
|
277
|
+
omdev/tools/antlr/__init__.py
|
278
|
+
omdev/tools/antlr/__main__.py
|
279
|
+
omdev/tools/antlr/cli.py
|
280
|
+
omdev/tools/antlr/consts.py
|
281
|
+
omdev/tools/antlr/gen.py
|
279
282
|
omdev/tools/git/__init__.py
|
280
283
|
omdev/tools/git/__main__.py
|
281
284
|
omdev/tools/git/cli.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.dev312'
|
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.dev312',
|
26
26
|
]
|
27
27
|
|
28
28
|
[project.optional-dependencies]
|
omdev-0.0.0.dev310/README.md
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
# Overview
|
2
|
-
|
3
|
-
Development utilities and support code.
|
4
|
-
|
5
|
-
# Notable packages
|
6
|
-
|
7
|
-
- **[cli](cli)** - The codebase's all-in-one CLI. This is not installed as an entrypoint / command when this package is
|
8
|
-
itself installed - that is separated into the `omdev-cli` installable package so as to not pollute users' bin/
|
9
|
-
directories when depping this lib for its utility code.
|
10
|
-
|
11
|
-
- **[amalg](amalg)** - The [amalgamator](#amalgamation).
|
12
|
-
|
13
|
-
# Amalgamation
|
14
|
-
|
15
|
-
Amalgamation is the process of stitching together multiple python source files into a single self-contained python
|
16
|
-
script. ['lite'](https://github.com/wrmsr/omlish/blob/master/omlish#lite-code) code is written in a style conducive to
|
17
|
-
this.
|