omdev 0.0.0.dev489__tar.gz → 0.0.0.dev491__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.dev489/omdev.egg-info → omdev-0.0.0.dev491}/PKG-INFO +4 -4
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/.omlish-manifests.json +1 -1
- omdev-0.0.0.dev491/omdev/README.md +51 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/__about__.py +1 -1
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cli/clicli.py +23 -11
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/tools/pipdepup.py +144 -84
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/jsonview/cli.py +19 -61
- omdev-0.0.0.dev491/omdev/tools/jsonview/resources/jsonview.html.j2 +43 -0
- omdev-0.0.0.dev491/omdev/tools/pawk/README.md +195 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/rich/__init__.py +9 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/textual/__init__.py +7 -0
- omdev-0.0.0.dev491/omdev/tui/textual/debug/__init__.py +0 -0
- omdev-0.0.0.dev491/omdev/tui/textual/debug/dominfo.py +151 -0
- omdev-0.0.0.dev491/omdev/tui/textual/debug/screen.py +24 -0
- omdev-0.0.0.dev491/omdev/tui/textual/types.py +45 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491/omdev.egg-info}/PKG-INFO +4 -4
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev.egg-info/SOURCES.txt +8 -1
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev.egg-info/requires.txt +3 -3
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/pyproject.toml +9 -4
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/LICENSE +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/MANIFEST.in +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/README.md +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/cli/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/cli/main.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/gen.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/imports.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/manifests.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/resources.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/srcfiles.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/strip.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/types.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/gen/typing.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/info.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/amalg/sources.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/compute/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/compute/cache.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/compute/contexts.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/compute/currents.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/compute/fns.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/compute/resolvers.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/compute/storage.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/compute/types.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/data/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/data/actions.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/data/cache.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/data/consts.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/data/defaults.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/data/manifests.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cache/data/specs.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/capi/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/capi/darwin/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/capi/darwin/aps.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/capi/darwin/ax.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/capi/darwin/cf.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/capi/darwin/cg.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/capi/linux/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/capi/linux/x11.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cc/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cc/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cc/cdeps.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cc/cdeps.toml +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cc/cli.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cc/srclangs.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_boilerplate.cc +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/LICENSE +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/build_ext.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/compilers/options.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/dir_util.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/errors.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/extension.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/file_util.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/modified.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/spawn.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/sysconfig.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/util.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/_distutils/version.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/build.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/cmake.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/importhook.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/magic.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cexts/scan.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/cache.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/ci.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/cli.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/compose.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/consts.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/buildcaching.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/cache.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/cacheserved/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/cacheserved/cache.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/cacheserved/manifests.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/cmds.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/dataserver.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/imagepulling.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/inject.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/packing.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/repositories.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/docker/utils.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/clients.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/v1/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/v1/api.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/v1/client.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/v2/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/v2/api.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/v2/azure.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/api/v2/client.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/bootstrap.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/cache.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/cli.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/env.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/github/inject.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/inject.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/requirements.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/shell.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/ci/utils.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cli/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cli/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cli/_pathhack.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cli/install.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cli/main.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cli/managers.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cli/types.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/clipboard/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/clipboard/clipboard.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/clipboard/darwin_cf.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/clipboard/linux_x11.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cmake.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cmdlog/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cmdlog/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cmdlog/_cmdlog.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cmdlog/cli.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/cmdlog/cmdlog.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataclasses/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataclasses/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataclasses/_dumping.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataclasses/_template.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataclasses/cli.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataclasses/codegen.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataclasses/dumping.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataserver/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataserver/handlers.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataserver/http.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataserver/routes.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataserver/server.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/dataserver/targets.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/git/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/git/magic.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/git/revisions.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/git/shallow.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/git/status.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/home/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/home/paths.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/home/secrets.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/home/shadow.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/imgur.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/intellij/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/intellij/cli.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/intellij/ides.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/intellij/open.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/cli.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/default.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/inject.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/inspect.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/providers/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/providers/base.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/providers/inject.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/providers/running.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/providers/standalone.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/providers/system.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/pyenv/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/pyenv/inject.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/pyenv/install.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/pyenv/provider.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/pyenv/pyenv.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/resolvers.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/types.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/uv/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/uv/inject.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/uv/provider.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/uv/uv.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/interp/venvs.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/messages/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/messages/base.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/messages/formats.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/messages/messages.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/messages/parsing.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/numerics/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/numerics/formats.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/numerics/numerics.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/numerics/types.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/LICENSE +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/consts.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/errors.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/message.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/nuh.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/parsing.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/rendering.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/tags.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/irc/protocol/utils.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/magic/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/magic/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/magic/cli.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/magic/find.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/magic/magic.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/magic/prepare.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/magic/styles.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/manifests/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/manifests/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/manifests/_dumping.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/manifests/building.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/manifests/dumping.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/manifests/main.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/markdown/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/markdown/incparse.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/markdown/tokens.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/mypy/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/mypy/debug.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/mypy/report.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/building.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/compression.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/data.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/datarefs.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/dataserver.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/loading.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/media.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/pack/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/pack/packing.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/pack/repositories.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/pack/unpacking.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/repositories.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/oci/tars.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/packaging/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/packaging/marshal.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/packaging/names.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/packaging/requires.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/packaging/revisions.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/packaging/specifiers.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/packaging/versions.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/packaging/wheelfile.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pip.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/base.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/blanklines.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/caches.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/git.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/imports.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/lite.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/main.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/manifests.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/scripts.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/precheck/unicode.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/asts/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/asts/parents.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/asts/toplevel.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/asts/visitors.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/attrdocs.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/bracepy.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/classdot.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/LICENSE +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/attrdoc.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/common.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/epydoc.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/google.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/numpydoc.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/parser.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/docstrings/rest.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/findimports.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/reprs.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/scripts/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/scripts/bumpversion.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/scripts/execstat.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/scripts/importtrace.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/srcheaders.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/tokens/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/tokens/all.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/tokens/tokenizert.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/tokens/utils.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/tools/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/tools/importscan.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/py/tools/mkrelimp.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/cli.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/configs.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/inject.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/pkg.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/reqs.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/resources/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/resources/docker-dev.sh +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/resources/python.sh +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/tools/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/tools/aboutdeps.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/pyproject/venvs.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/rs/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/ci.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/interp.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/lib/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/lib/inject.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/lib/logs.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/lib/marshal.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/pyproject.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/slowcat.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/scripts/tmpexec.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tagstrings.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/cloc.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/diff.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/doc.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/docker.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/git/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/git/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/git/cli.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/git/cloning.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/git/consts.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/git/messages.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/json/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/json/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/json/cli.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/json/formats.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/json/io.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/json/parsing.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/json/processing.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/json/rendering.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/jsonview/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/jsonview/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/jsonview/resources/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/jsonview/resources/jsonview.css +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/jsonview/resources/jsonview.js +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/linehisto.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/mkenv.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/notebook.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/pawk/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/pawk/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/pawk/pawk.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/pip.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/prof.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/qr.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/shadow.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/shell.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tools/sqlrepl.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/edit/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/edit/main.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/irc/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/irc/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/irc/app.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/irc/client.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/irc/commands.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/irc/main.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/markdown/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/markdown/__main__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/apps/markdown/cli.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/rich/console2.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/rich/markdown2.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/textual/app2.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/textual/autocomplete/LICENSE +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/textual/autocomplete/__init__.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/textual/autocomplete/matching.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/textual/autocomplete/paths.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/textual/autocomplete/widget.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev/tui/textual/drivers2.py +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev.egg-info/dependency_links.txt +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev.egg-info/entry_points.txt +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/omdev.egg-info/top_level.txt +0 -0
- {omdev-0.0.0.dev489 → omdev-0.0.0.dev491}/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.dev491
|
|
4
4
|
Summary: omdev
|
|
5
5
|
Author: wrmsr
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -14,7 +14,7 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
14
14
|
Requires-Python: >=3.13
|
|
15
15
|
Description-Content-Type: text/markdown
|
|
16
16
|
License-File: LICENSE
|
|
17
|
-
Requires-Dist: omlish==0.0.0.
|
|
17
|
+
Requires-Dist: omlish==0.0.0.dev491
|
|
18
18
|
Provides-Extra: all
|
|
19
19
|
Requires-Dist: black~=25.12; extra == "all"
|
|
20
20
|
Requires-Dist: pycparser~=2.23; extra == "all"
|
|
@@ -27,7 +27,7 @@ Requires-Dist: mypy~=1.19; extra == "all"
|
|
|
27
27
|
Requires-Dist: gprof2dot~=2025.4; extra == "all"
|
|
28
28
|
Requires-Dist: segno~=1.6; extra == "all"
|
|
29
29
|
Requires-Dist: rich~=14.2; extra == "all"
|
|
30
|
-
Requires-Dist: textual~=6.
|
|
30
|
+
Requires-Dist: textual~=6.10; extra == "all"
|
|
31
31
|
Provides-Extra: black
|
|
32
32
|
Requires-Dist: black~=25.12; extra == "black"
|
|
33
33
|
Provides-Extra: c
|
|
@@ -46,7 +46,7 @@ Provides-Extra: qr
|
|
|
46
46
|
Requires-Dist: segno~=1.6; extra == "qr"
|
|
47
47
|
Provides-Extra: tui
|
|
48
48
|
Requires-Dist: rich~=14.2; extra == "tui"
|
|
49
|
-
Requires-Dist: textual~=6.
|
|
49
|
+
Requires-Dist: textual~=6.10; extra == "tui"
|
|
50
50
|
Dynamic: license-file
|
|
51
51
|
|
|
52
52
|
# Overview
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
Development utilities and support code.
|
|
4
|
+
|
|
5
|
+
# Notable packages
|
|
6
|
+
|
|
7
|
+
- **[cli](https://github.com/wrmsr/omlish/blob/master/omdev/cli)** - The codebase's all-in-one CLI. This is not
|
|
8
|
+
installed as an entrypoint / command when this package is itself installed - that is separated into the `omdev-cli`
|
|
9
|
+
installable package so as to not pollute users' bin/ directories when depping this lib for its utility code.
|
|
10
|
+
|
|
11
|
+
- **[amalg](https://github.com/wrmsr/omlish/blob/master/omdev/amalg)** - The [amalgamator](#amalgamation).
|
|
12
|
+
|
|
13
|
+
- **[pyproject](https://github.com/wrmsr/omlish/blob/master/omdev/pyproject)**
|
|
14
|
+
([amalg](https://github.com/wrmsr/omlish/blob/master/omdev/scripts/pyproject.py)) - python project management tool.
|
|
15
|
+
wrangles but does not replace tools like venv, pip, setuptools, and uv. does things like sets up venvs, generates
|
|
16
|
+
[`.pkg`](https://github.com/wrmsr/omlish/blob/master/.pkg) directories and their `pyproject.toml`'s (from their
|
|
17
|
+
`__about__.py`'s), and packages them. this should grow to eat more and more of the Makefile. as it is amalgamated it
|
|
18
|
+
requires no installation and can just be dropped into other projects / repos.
|
|
19
|
+
|
|
20
|
+
- **[ci](https://github.com/wrmsr/omlish/blob/master/omdev/ci)**
|
|
21
|
+
([amalg](https://github.com/wrmsr/omlish/blob/master/omdev/scripts/ci.py)) - ci runner. given a
|
|
22
|
+
[`compose.yml`](https://github.com/wrmsr/omlish/blob/master/docker/compose.yml)
|
|
23
|
+
and requirements.txt files, takes care of building and caching of containers and venvs and execution of required ci
|
|
24
|
+
commands. detects and [natively uses](https://github.com/wrmsr/omlish/blob/master/omdev/ci/github/api/v2)
|
|
25
|
+
github-action's caching system. unifies ci execution between local dev and github runners.
|
|
26
|
+
|
|
27
|
+
- **[tools.json](https://github.com/wrmsr/omlish/blob/master/omdev/tools/json)** (cli: `om j`) - a tool for json-like
|
|
28
|
+
data, obviously in the vein of [jq](https://github.com/jqlang/jq) but using the internal
|
|
29
|
+
[jmespath](https://github.com/wrmsr/omlish/blob/master/omlish/specs/jmespath) engine. supports
|
|
30
|
+
[true streaming](https://github.com/wrmsr/omlish/blob/master/omlish/formats/json/stream) json input and output, as
|
|
31
|
+
well as [various other](https://github.com/wrmsr/omlish/blob/master/omdev/tools/json/formats.py) non-streaming input
|
|
32
|
+
formats.
|
|
33
|
+
|
|
34
|
+
- **[tools.git](https://github.com/wrmsr/omlish/blob/master/omdev/tools/git)** (cli: `om git`) - a tool for various lazy
|
|
35
|
+
git operations, including the one that (poorly) writes all of these commit messages.
|
|
36
|
+
|
|
37
|
+
# Amalgamation
|
|
38
|
+
|
|
39
|
+
Amalgamation is the process of stitching together multiple python source files into a single self-contained python
|
|
40
|
+
script. ['lite'](https://github.com/wrmsr/omlish/blob/master/omlish#lite-code) code is written in a style conducive to
|
|
41
|
+
this.
|
|
42
|
+
|
|
43
|
+
# Local storage
|
|
44
|
+
|
|
45
|
+
Some of this code, when asked, will store things on the local filesystem. The only directories used (outside of ones
|
|
46
|
+
explicitly specified as command or function arguments) are managed in
|
|
47
|
+
[home.paths](https://github.com/wrmsr/omlish/blob/master/omdev/home/paths.py), and are the following:
|
|
48
|
+
|
|
49
|
+
- `$OMLISH_HOME`, default of `~/.omlish` - persistent things like config and state.
|
|
50
|
+
- `$OMLISH_CACHE`, default of `~/.cache/omlish` - used for things like the local ci cache and
|
|
51
|
+
[various other](https://github.com/search?q=repo%3Awrmsr%2Fomlish+%22dcache.%22&type=code) cached data.
|
|
@@ -5,6 +5,7 @@ import re
|
|
|
5
5
|
import shlex
|
|
6
6
|
import subprocess
|
|
7
7
|
import sys
|
|
8
|
+
import time
|
|
8
9
|
import typing as ta
|
|
9
10
|
import urllib.parse
|
|
10
11
|
import urllib.request
|
|
@@ -104,23 +105,34 @@ class CliCli(ap.Cli):
|
|
|
104
105
|
ap.arg('--no-uv', action='store_true'),
|
|
105
106
|
ap.arg('--dry-run', action='store_true'),
|
|
106
107
|
ap.arg('--must-upgrade', action='store_true'),
|
|
108
|
+
ap.arg('--must-upgrade-loop', action='store_true'),
|
|
107
109
|
ap.arg('--version'),
|
|
108
110
|
ap.arg('extra_deps', nargs='*'),
|
|
109
111
|
)
|
|
110
112
|
def reinstall(self) -> None:
|
|
111
113
|
current_version = __about__.__version__
|
|
112
|
-
latest_version = _parse_latest_version_str(lookup_latest_package_version(__package__.split('.')[0]))
|
|
113
114
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if
|
|
123
|
-
|
|
115
|
+
while True:
|
|
116
|
+
latest_version = _parse_latest_version_str(lookup_latest_package_version(__package__.split('.')[0]))
|
|
117
|
+
|
|
118
|
+
if self.args.version is not None:
|
|
119
|
+
target_version: str = self.args.version
|
|
120
|
+
else:
|
|
121
|
+
target_version = latest_version
|
|
122
|
+
|
|
123
|
+
if self.args.must_upgrade or self.args.must_upgrade_loop:
|
|
124
|
+
current_vo = Version(current_version)
|
|
125
|
+
target_vo = Version(target_version)
|
|
126
|
+
if not (target_vo > current_vo):
|
|
127
|
+
ex = CliCli.ReinstallWouldNotUpgradeError(current_version, target_version)
|
|
128
|
+
if self.args.must_upgrade_loop:
|
|
129
|
+
print(ex)
|
|
130
|
+
time.sleep(1)
|
|
131
|
+
continue
|
|
132
|
+
else:
|
|
133
|
+
raise ex
|
|
134
|
+
|
|
135
|
+
break
|
|
124
136
|
|
|
125
137
|
#
|
|
126
138
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""
|
|
2
2
|
TODO:
|
|
3
|
+
- output 2 tables lol
|
|
3
4
|
- min_time_since_prev_version
|
|
4
5
|
- without this the min age is moot lol, can still catch a bad release at the same time of day just n days later
|
|
5
6
|
- * at least show 'suggested', 'suggested age', 'latest', 'latest age', 'number of releases between the 2' *
|
|
@@ -30,7 +31,7 @@ https://news.ycombinator.com/item?id=46005111
|
|
|
30
31
|
# ~> https://github.com/pypa/pip/blob/a52069365063ea813fe3a3f8bac90397c9426d35/src/pip/_internal/commands/list.py (25.3)
|
|
31
32
|
import dataclasses as dc
|
|
32
33
|
import datetime
|
|
33
|
-
import
|
|
34
|
+
import itertools
|
|
34
35
|
import os.path
|
|
35
36
|
import ssl
|
|
36
37
|
import typing as ta
|
|
@@ -312,16 +313,42 @@ class Package:
|
|
|
312
313
|
|
|
313
314
|
return datetime.datetime.fromisoformat(check.isinstance(ut, str)) # noqa
|
|
314
315
|
|
|
316
|
+
@cached.property
|
|
317
|
+
def version(self) -> Version:
|
|
318
|
+
return self.install.version
|
|
319
|
+
|
|
320
|
+
@cached.property
|
|
321
|
+
def filetype(self) -> ta.Literal['wheel', 'sdist']:
|
|
322
|
+
if self.install.link.is_wheel:
|
|
323
|
+
return 'wheel'
|
|
324
|
+
else:
|
|
325
|
+
return 'sdist'
|
|
326
|
+
|
|
327
|
+
unfiltered_candidates: ta.Sequence[Candidate] | None = None
|
|
315
328
|
candidates: ta.Sequence[Candidate] | None = None
|
|
316
329
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
330
|
+
latest_candidate: Candidate | None = None
|
|
331
|
+
suggested_candidate: Candidate | None = None
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
def get_best_candidate(
|
|
335
|
+
pkg: Package,
|
|
336
|
+
finder: MyPackageFinder,
|
|
337
|
+
candidates: ta.Sequence[Package.Candidate],
|
|
338
|
+
) -> Package.Candidate | None:
|
|
339
|
+
candidates_by_install: ta.Mapping[InstallationCandidate, Package.Candidate] = col.make_map((
|
|
340
|
+
(c.install, c)
|
|
341
|
+
for c in candidates
|
|
342
|
+
), strict=True, identity=True)
|
|
320
343
|
|
|
321
|
-
|
|
322
|
-
|
|
344
|
+
evaluator = finder.make_candidate_evaluator(
|
|
345
|
+
project_name=pkg.dist.canonical_name,
|
|
346
|
+
)
|
|
347
|
+
best_install = evaluator.sort_best_candidate([c.install for c in candidates])
|
|
348
|
+
if best_install is None:
|
|
349
|
+
return None
|
|
323
350
|
|
|
324
|
-
|
|
351
|
+
return candidates_by_install[best_install]
|
|
325
352
|
|
|
326
353
|
|
|
327
354
|
def set_package_finder_info(
|
|
@@ -332,17 +359,18 @@ def set_package_finder_info(
|
|
|
332
359
|
max_uploaded_at: datetime.datetime | None = None,
|
|
333
360
|
min_time_since_prev_version: datetime.timedelta | None = None,
|
|
334
361
|
) -> None:
|
|
335
|
-
|
|
362
|
+
pkg.unfiltered_candidates = [
|
|
336
363
|
Package.Candidate(
|
|
337
364
|
c,
|
|
338
365
|
finder.get_link_pypi_dict(c.link),
|
|
339
366
|
)
|
|
340
367
|
for c in finder.find_all_candidates(pkg.dist.canonical_name)
|
|
341
368
|
]
|
|
342
|
-
pkg.candidates = candidates
|
|
343
369
|
|
|
344
370
|
#
|
|
345
371
|
|
|
372
|
+
candidates = pkg.unfiltered_candidates
|
|
373
|
+
|
|
346
374
|
if not pre:
|
|
347
375
|
# Remove prereleases
|
|
348
376
|
candidates = [
|
|
@@ -351,8 +379,16 @@ def set_package_finder_info(
|
|
|
351
379
|
if not c.install.version.is_prerelease
|
|
352
380
|
]
|
|
353
381
|
|
|
382
|
+
pkg.candidates = candidates
|
|
383
|
+
|
|
354
384
|
#
|
|
355
385
|
|
|
386
|
+
pkg.latest_candidate = get_best_candidate(pkg, finder, pkg.candidates)
|
|
387
|
+
|
|
388
|
+
#
|
|
389
|
+
|
|
390
|
+
suggested_candidates = candidates
|
|
391
|
+
|
|
356
392
|
if min_time_since_prev_version is not None:
|
|
357
393
|
# candidates_by_version = col.multi_map((c.install.version, c) for c in candidates)
|
|
358
394
|
# uploaded_at_by_version = {
|
|
@@ -361,46 +397,17 @@ def set_package_finder_info(
|
|
|
361
397
|
# }
|
|
362
398
|
raise NotImplementedError
|
|
363
399
|
|
|
364
|
-
#
|
|
365
|
-
|
|
366
400
|
if max_uploaded_at is not None:
|
|
367
|
-
|
|
401
|
+
suggested_candidates = [
|
|
368
402
|
c
|
|
369
|
-
for c in
|
|
403
|
+
for c in suggested_candidates
|
|
370
404
|
if not (
|
|
371
405
|
(c_dt := c.upload_time()) is not None and
|
|
372
406
|
c_dt > max_uploaded_at
|
|
373
407
|
)
|
|
374
408
|
]
|
|
375
409
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
candidates_by_install: ta.Mapping[InstallationCandidate, Package.Candidate] = col.make_map((
|
|
379
|
-
(c.install, c)
|
|
380
|
-
for c in candidates
|
|
381
|
-
), strict=True, identity=True)
|
|
382
|
-
|
|
383
|
-
evaluator = finder.make_candidate_evaluator(
|
|
384
|
-
project_name=pkg.dist.canonical_name,
|
|
385
|
-
)
|
|
386
|
-
best_install = evaluator.sort_best_candidate([c.install for c in candidates])
|
|
387
|
-
if best_install is None:
|
|
388
|
-
return
|
|
389
|
-
best_candidate = candidates_by_install[best_install]
|
|
390
|
-
|
|
391
|
-
#
|
|
392
|
-
|
|
393
|
-
remote_version = best_candidate.install.version
|
|
394
|
-
if best_candidate.install.link.is_wheel:
|
|
395
|
-
typ = 'wheel'
|
|
396
|
-
else:
|
|
397
|
-
typ = 'sdist'
|
|
398
|
-
|
|
399
|
-
pkg.latest_info = Package.LatestInfo(
|
|
400
|
-
candidate=best_candidate,
|
|
401
|
-
version=remote_version,
|
|
402
|
-
filetype=typ,
|
|
403
|
-
)
|
|
410
|
+
pkg.suggested_candidate = get_best_candidate(pkg, finder, suggested_candidates)
|
|
404
411
|
|
|
405
412
|
|
|
406
413
|
##
|
|
@@ -474,20 +481,20 @@ def format_for_json(
|
|
|
474
481
|
infos: list[dict[str, ta.Any]] = []
|
|
475
482
|
|
|
476
483
|
for pkg in pkgs:
|
|
477
|
-
|
|
484
|
+
latest = check.not_none(pkg.latest_candidate)
|
|
485
|
+
suggested = check.not_none(pkg.suggested_candidate)
|
|
478
486
|
|
|
479
487
|
info = {
|
|
480
488
|
'name': pkg.dist.raw_name,
|
|
481
489
|
'version': pkg.version(),
|
|
482
490
|
'location': pkg.dist.location or '',
|
|
483
491
|
'installer': pkg.dist.installer,
|
|
484
|
-
'latest_version': str(
|
|
485
|
-
'
|
|
492
|
+
'latest_version': str(latest.install.version),
|
|
493
|
+
'latest_upload_time': lut.isoformat() if (lut := latest.upload_time()) is not None else None,
|
|
494
|
+
'suggested_version': str(suggested.install.version),
|
|
495
|
+
'suggested_upload_time': sut.isoformat() if (sut := suggested.upload_time()) is not None else None,
|
|
486
496
|
}
|
|
487
497
|
|
|
488
|
-
if (l_ut := latest_info.candidate.upload_time()) is not None:
|
|
489
|
-
info['latest_age'] = human_round_td(now_utc() - l_ut)
|
|
490
|
-
|
|
491
498
|
if editable_project_location := pkg.dist.editable_project_location:
|
|
492
499
|
info['editable_project_location'] = editable_project_location
|
|
493
500
|
|
|
@@ -502,59 +509,106 @@ def format_for_json(
|
|
|
502
509
|
def format_for_columns(pkgs: ta.Sequence[Package]) -> tuple[list[list[str]], list[str]]:
|
|
503
510
|
"""Convert the package data into something usable by output_package_listing_columns."""
|
|
504
511
|
|
|
505
|
-
header = [
|
|
512
|
+
header = [
|
|
513
|
+
' ',
|
|
506
514
|
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
515
|
+
'Package',
|
|
516
|
+
'Current',
|
|
517
|
+
|
|
518
|
+
' ',
|
|
519
|
+
|
|
520
|
+
'Suggested',
|
|
521
|
+
'Age',
|
|
522
|
+
|
|
523
|
+
' ',
|
|
524
|
+
|
|
525
|
+
'Latest',
|
|
526
|
+
'Age',
|
|
527
|
+
]
|
|
528
|
+
|
|
529
|
+
# def wheel_build_tag(dist: BaseDistribution) -> str | None:
|
|
530
|
+
# try:
|
|
531
|
+
# wheel_file = dist.read_text('WHEEL')
|
|
532
|
+
# except FileNotFoundError:
|
|
533
|
+
# return None
|
|
534
|
+
# return email.parser.Parser().parsestr(wheel_file).get('Build')
|
|
513
535
|
|
|
514
|
-
build_tags = [wheel_build_tag(p.dist) for p in pkgs]
|
|
515
|
-
has_build_tags = any(build_tags)
|
|
516
|
-
if has_build_tags:
|
|
517
|
-
|
|
536
|
+
# build_tags = [wheel_build_tag(p.dist) for p in pkgs]
|
|
537
|
+
# has_build_tags = any(build_tags)
|
|
538
|
+
# if has_build_tags:
|
|
539
|
+
# header.append('Build')
|
|
518
540
|
|
|
519
|
-
has_editables = any(x.dist.editable for x in pkgs)
|
|
520
|
-
if has_editables:
|
|
521
|
-
|
|
541
|
+
# has_editables = any(x.dist.editable for x in pkgs)
|
|
542
|
+
# if has_editables:
|
|
543
|
+
# header.append('Editable project location')
|
|
522
544
|
|
|
523
545
|
data = []
|
|
524
|
-
for
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
546
|
+
for proj in pkgs:
|
|
547
|
+
sc = check.not_none(proj.suggested_candidate)
|
|
548
|
+
lc = check.not_none(proj.latest_candidate)
|
|
549
|
+
|
|
550
|
+
row = [
|
|
551
|
+
'*' if lc is not sc else '',
|
|
552
|
+
|
|
553
|
+
proj.dist.raw_name,
|
|
554
|
+
proj.dist.raw_version,
|
|
555
|
+
]
|
|
556
|
+
|
|
557
|
+
for c in [sc, lc]:
|
|
558
|
+
row.extend([
|
|
559
|
+
'|',
|
|
560
|
+
|
|
561
|
+
str(c.version),
|
|
562
|
+
])
|
|
563
|
+
|
|
564
|
+
if (l_ut := c.upload_time()) is not None:
|
|
565
|
+
row.append(human_round_td(now_utc() - l_ut))
|
|
566
|
+
else:
|
|
567
|
+
row.append('')
|
|
568
|
+
|
|
569
|
+
# row.append(c.filetype)
|
|
535
570
|
|
|
536
|
-
if has_build_tags:
|
|
537
|
-
|
|
571
|
+
# if has_build_tags:
|
|
572
|
+
# row.append(build_tags[i] or '')
|
|
538
573
|
|
|
539
|
-
if has_editables:
|
|
540
|
-
|
|
574
|
+
# if has_editables:
|
|
575
|
+
# row.append(proj.dist.editable_project_location or '')
|
|
541
576
|
|
|
542
577
|
data.append(row)
|
|
543
578
|
|
|
544
579
|
return data, header
|
|
545
580
|
|
|
546
581
|
|
|
582
|
+
def _tabulate(
|
|
583
|
+
rows: ta.Iterable[ta.Iterable[ta.Any]],
|
|
584
|
+
*,
|
|
585
|
+
sep: str = ' ',
|
|
586
|
+
) -> tuple[list[str], list[int]]:
|
|
587
|
+
"""
|
|
588
|
+
Return a list of formatted rows and a list of column sizes.
|
|
589
|
+
|
|
590
|
+
For example::
|
|
591
|
+
|
|
592
|
+
>>> tabulate([['foobar', 2000], [0xdeadbeef]])
|
|
593
|
+
(['foobar 2000', '3735928559'], [10, 4])
|
|
594
|
+
"""
|
|
595
|
+
|
|
596
|
+
rows = [tuple(map(str, row)) for row in rows]
|
|
597
|
+
sizes = [max(map(len, col)) for col in itertools.zip_longest(*rows, fillvalue='')]
|
|
598
|
+
table = [sep.join(map(str.ljust, row, sizes)).rstrip() for row in rows]
|
|
599
|
+
return table, sizes
|
|
600
|
+
|
|
601
|
+
|
|
547
602
|
def render_package_listing_columns(data: list[list[str]], header: list[str]) -> list[str]:
|
|
548
603
|
# insert the header first: we need to know the size of column names
|
|
549
604
|
if len(data) > 0:
|
|
550
605
|
data.insert(0, header)
|
|
551
606
|
|
|
552
|
-
|
|
553
|
-
pkg_strings, sizes = tabulate(data)
|
|
607
|
+
pkg_strings, sizes = _tabulate(data, sep=' ')
|
|
554
608
|
|
|
555
609
|
# Create and add a separator.
|
|
556
610
|
if len(data) > 0:
|
|
557
|
-
pkg_strings.insert(1, '
|
|
611
|
+
pkg_strings.insert(1, ' '.join('-' * x for x in sizes))
|
|
558
612
|
|
|
559
613
|
return pkg_strings
|
|
560
614
|
|
|
@@ -612,21 +666,27 @@ def _main() -> None:
|
|
|
612
666
|
|
|
613
667
|
#
|
|
614
668
|
|
|
615
|
-
|
|
669
|
+
outdated_pkgs = [
|
|
616
670
|
pkg
|
|
617
671
|
for pkg in pkgs
|
|
618
|
-
if (li := pkg.
|
|
672
|
+
if (li := pkg.latest_candidate) is not None
|
|
619
673
|
and li.version > pkg.dist.version
|
|
620
674
|
]
|
|
621
675
|
|
|
622
|
-
|
|
676
|
+
outdated_pkgs.sort(key=lambda x: x.dist.raw_name)
|
|
623
677
|
|
|
624
678
|
#
|
|
625
679
|
|
|
626
680
|
if args.json:
|
|
627
|
-
print(json.dumps_pretty(format_for_json(
|
|
681
|
+
print(json.dumps_pretty(format_for_json(outdated_pkgs)))
|
|
682
|
+
|
|
628
683
|
else:
|
|
629
|
-
|
|
684
|
+
# stable_pkgs, unstable_pkgs = col.partition(
|
|
685
|
+
# outdated_pkgs,
|
|
686
|
+
# lambda pkg: pkg.latest_candidate is pkg.suggested_candidate,
|
|
687
|
+
# )
|
|
688
|
+
|
|
689
|
+
print('\n'.join(render_package_listing_columns(*format_for_columns(outdated_pkgs))))
|
|
630
690
|
|
|
631
691
|
|
|
632
692
|
if __name__ == '__main__':
|
|
@@ -3,7 +3,7 @@ TODO:
|
|
|
3
3
|
- read from stdin
|
|
4
4
|
- evaluate jmespath on server using extended engine
|
|
5
5
|
- integrate with json tool
|
|
6
|
-
- use omlish server
|
|
6
|
+
- use omlish server
|
|
7
7
|
- vendor deps, serve local
|
|
8
8
|
- update to https://github.com/josdejong/svelte-jsoneditor
|
|
9
9
|
"""
|
|
@@ -19,61 +19,22 @@ import webbrowser
|
|
|
19
19
|
|
|
20
20
|
from omlish import check
|
|
21
21
|
from omlish import lang
|
|
22
|
+
from omlish.sockets.ports import get_available_port
|
|
23
|
+
from omlish.text import minja
|
|
22
24
|
|
|
23
25
|
|
|
24
26
|
##
|
|
25
27
|
|
|
26
28
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
<head>
|
|
32
|
-
<meta charset="UTF-8">
|
|
33
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
34
|
-
<title>JSON Viewer</title>
|
|
35
|
-
<link
|
|
36
|
-
href="https://cdn.jsdelivr.net/npm/jsoneditor/dist/jsoneditor.min.css"
|
|
37
|
-
rel="stylesheet"
|
|
38
|
-
type="text/css"
|
|
39
|
-
>
|
|
40
|
-
<style>
|
|
41
|
-
{css_src}
|
|
42
|
-
</style>
|
|
43
|
-
</head>
|
|
44
|
-
|
|
45
|
-
<body>
|
|
46
|
-
<div class="input-area">
|
|
47
|
-
<label for="jmespath-input">JMESPath:</label>
|
|
48
|
-
<input
|
|
49
|
-
type="text"
|
|
50
|
-
id="jmespath-input"
|
|
51
|
-
list="jmespath-history"
|
|
52
|
-
placeholder="Enter JMESPath expression..."
|
|
53
|
-
autocomplete="off"
|
|
54
|
-
>
|
|
55
|
-
<datalist id="jmespath-history"></datalist>
|
|
56
|
-
<span id="error-message"></span>
|
|
57
|
-
</div>
|
|
58
|
-
<div id="jsoneditor"></div>
|
|
59
|
-
|
|
60
|
-
<script src="https://cdn.jsdelivr.net/npm/jsoneditor@10.2.0/dist/jsoneditor.min.js"></script>
|
|
61
|
-
<script src="https://cdn.jsdelivr.net/npm/jmespath@0.16.0/jmespath.min.js"></script>
|
|
62
|
-
<script>
|
|
63
|
-
const originalJsonData = {json_data};
|
|
64
|
-
</script>
|
|
65
|
-
<script>
|
|
66
|
-
{js_src}
|
|
67
|
-
</script>
|
|
68
|
-
</body>
|
|
69
|
-
|
|
70
|
-
</html>
|
|
71
|
-
"""
|
|
29
|
+
@lang.cached_function
|
|
30
|
+
def html_template() -> minja.MinjaTemplate:
|
|
31
|
+
src = lang.get_relative_resources('resources', globals=globals())['jsonview.html.j2'].read_text()
|
|
32
|
+
return minja.compile_minja_template(src, ['ctx'])
|
|
72
33
|
|
|
73
34
|
|
|
74
35
|
def view_json(
|
|
75
36
|
filepath: str,
|
|
76
|
-
port: int,
|
|
37
|
+
port: int | None,
|
|
77
38
|
*,
|
|
78
39
|
mode: ta.Literal['jsonl', 'json5', 'json', None] = None,
|
|
79
40
|
) -> None:
|
|
@@ -120,15 +81,18 @@ def view_json(
|
|
|
120
81
|
self.send_response(200)
|
|
121
82
|
self.send_header('Content-type', 'text/html')
|
|
122
83
|
self.end_headers()
|
|
123
|
-
html_content =
|
|
124
|
-
css_src=css_src,
|
|
125
|
-
js_src=js_src,
|
|
84
|
+
html_content = html_template()(ctx=dict(
|
|
85
|
+
css_src=css_src.strip(),
|
|
86
|
+
js_src=js_src.strip(),
|
|
126
87
|
json_data=json_string,
|
|
127
|
-
)
|
|
88
|
+
))
|
|
128
89
|
self.wfile.write(html_content.encode('utf-8'))
|
|
129
90
|
else:
|
|
130
91
|
super().do_GET()
|
|
131
92
|
|
|
93
|
+
if port is None:
|
|
94
|
+
port = get_available_port()
|
|
95
|
+
|
|
132
96
|
handler_cls = JsonViewerHttpRequestHandler
|
|
133
97
|
with socketserver.TCPServer(('127.0.0.1', port), handler_cls) as httpd:
|
|
134
98
|
url = f'http://127.0.0.1:{port}'
|
|
@@ -150,18 +114,12 @@ def _main() -> None:
|
|
|
150
114
|
description='Launch a web-based JSON viewer with JMESPath transformations.',
|
|
151
115
|
formatter_class=argparse.RawTextHelpFormatter,
|
|
152
116
|
)
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
)
|
|
157
|
-
parser.add_argument(
|
|
158
|
-
'-p', '--port',
|
|
159
|
-
type=int,
|
|
160
|
-
default=(default_port := 8999),
|
|
161
|
-
help=f'The port to run the web server on. Defaults to {default_port}.',
|
|
162
|
-
)
|
|
117
|
+
|
|
118
|
+
parser.add_argument('filepath')
|
|
119
|
+
parser.add_argument('-p', '--port', type=int)
|
|
163
120
|
parser.add_argument('-l', '--lines', action='store_true')
|
|
164
121
|
parser.add_argument('-5', '--five', action='store_true')
|
|
122
|
+
|
|
165
123
|
args = parser.parse_args()
|
|
166
124
|
|
|
167
125
|
check.state(not (args.lines and args.five))
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
+
<title>JSON Viewer</title>
|
|
8
|
+
<link
|
|
9
|
+
href="https://cdn.jsdelivr.net/npm/jsoneditor/dist/jsoneditor.min.css"
|
|
10
|
+
rel="stylesheet"
|
|
11
|
+
type="text/css"
|
|
12
|
+
>
|
|
13
|
+
<style>
|
|
14
|
+
{{ ctx['css_src'] }}
|
|
15
|
+
</style>
|
|
16
|
+
</head>
|
|
17
|
+
|
|
18
|
+
<body>
|
|
19
|
+
<div class="input-area">
|
|
20
|
+
<label for="jmespath-input">JMESPath:</label>
|
|
21
|
+
<input
|
|
22
|
+
type="text"
|
|
23
|
+
id="jmespath-input"
|
|
24
|
+
list="jmespath-history"
|
|
25
|
+
placeholder="Enter JMESPath expression..."
|
|
26
|
+
autocomplete="off"
|
|
27
|
+
>
|
|
28
|
+
<datalist id="jmespath-history"></datalist>
|
|
29
|
+
<span id="error-message"></span>
|
|
30
|
+
</div>
|
|
31
|
+
<div id="jsoneditor"></div>
|
|
32
|
+
|
|
33
|
+
<script src="https://cdn.jsdelivr.net/npm/jsoneditor@10.2.0/dist/jsoneditor.min.js"></script>
|
|
34
|
+
<script src="https://cdn.jsdelivr.net/npm/jmespath@0.16.0/jmespath.min.js"></script>
|
|
35
|
+
<script>
|
|
36
|
+
const originalJsonData = {{ ctx['json_data'] }};
|
|
37
|
+
</script>
|
|
38
|
+
<script>
|
|
39
|
+
{{ ctx['js_src'] }}
|
|
40
|
+
</script>
|
|
41
|
+
</body>
|
|
42
|
+
|
|
43
|
+
</html>
|