omdev 0.0.0.dev473__tar.gz → 0.0.0.dev475__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.dev473/omdev.egg-info → omdev-0.0.0.dev475}/PKG-INFO +4 -4
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/__about__.py +1 -1
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/cli.py +1 -2
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cmdlog/cli.py +1 -2
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataclasses/codegen.py +1 -1
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/main.py +1 -2
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/pkg.py +1 -1
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/ci.py +18 -5
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/interp.py +16 -3
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/pyproject.py +17 -4
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/pawk/pawk.py +2 -2
- omdev-0.0.0.dev475/omdev/tui/apps/edit/main.py +163 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/apps/irc/app.py +15 -15
- omdev-0.0.0.dev475/omdev/tui/apps/markdown/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/textual/__init__.py +1 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475/omdev.egg-info}/PKG-INFO +4 -4
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev.egg-info/SOURCES.txt +2 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev.egg-info/requires.txt +3 -3
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/pyproject.toml +4 -4
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/LICENSE +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/MANIFEST.in +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/README.md +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/.omlish-manifests.json +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/cli/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/cli/main.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/gen.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/imports.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/manifests.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/resources.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/srcfiles.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/strip.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/types.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/gen/typing.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/amalg/sources.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/compute/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/compute/cache.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/compute/contexts.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/compute/currents.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/compute/fns.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/compute/resolvers.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/compute/storage.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/compute/types.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/data/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/data/actions.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/data/cache.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/data/consts.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/data/defaults.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/data/manifests.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cache/data/specs.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/capi/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/capi/darwin/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/capi/darwin/aps.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/capi/darwin/ax.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/capi/darwin/cf.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/capi/darwin/cg.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/capi/linux/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/capi/linux/x11.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cc/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cc/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cc/cdeps.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cc/cdeps.toml +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cc/cli.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cc/srclangs.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_boilerplate.cc +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/LICENSE +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/build_ext.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/compilers/options.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/dir_util.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/errors.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/extension.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/file_util.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/modified.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/spawn.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/sysconfig.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/util.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/_distutils/version.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/build.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/cmake.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/importhook.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/magic.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cexts/scan.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/cache.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/ci.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/compose.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/consts.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/buildcaching.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/cache.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/cacheserved/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/cacheserved/cache.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/cacheserved/manifests.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/cmds.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/dataserver.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/imagepulling.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/inject.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/packing.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/repositories.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/docker/utils.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/clients.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/v1/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/v1/api.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/v1/client.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/v2/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/v2/api.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/v2/azure.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/api/v2/client.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/bootstrap.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/cache.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/cli.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/env.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/github/inject.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/inject.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/requirements.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/shell.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/ci/utils.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cli/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cli/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cli/_pathhack.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cli/clicli.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cli/install.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cli/main.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cli/managers.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cli/types.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/clipboard/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/clipboard/clipboard.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/clipboard/darwin_cf.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/clipboard/linux_x11.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cmake.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cmdlog/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cmdlog/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cmdlog/_cmdlog.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/cmdlog/cmdlog.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataclasses/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataclasses/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataclasses/cli.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataserver/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataserver/handlers.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataserver/http.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataserver/routes.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataserver/server.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/dataserver/targets.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/git/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/git/magic.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/git/revisions.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/git/shallow.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/git/status.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/home/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/home/paths.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/home/secrets.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/home/shadow.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/imgur.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/intellij/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/intellij/cli.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/intellij/ides.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/intellij/open.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/cli.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/default.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/inject.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/inspect.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/providers/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/providers/base.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/providers/inject.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/providers/running.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/providers/standalone.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/providers/system.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/pyenv/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/pyenv/inject.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/pyenv/install.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/pyenv/provider.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/pyenv/pyenv.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/resolvers.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/types.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/uv/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/uv/inject.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/uv/provider.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/uv/uv.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/interp/venvs.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/messages/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/messages/base.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/messages/formats.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/messages/messages.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/messages/parsing.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/numerics/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/numerics/formats.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/numerics/numerics.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/numerics/types.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/LICENSE +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/consts.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/errors.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/message.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/nuh.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/parsing.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/rendering.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/tags.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/irc/protocol/utils.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/magic/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/magic/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/magic/cli.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/magic/find.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/magic/magic.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/magic/prepare.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/magic/styles.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/manifests/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/manifests/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/manifests/_dumping.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/manifests/building.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/manifests/dumping.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/manifests/main.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/markdown/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/markdown/incparse.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/markdown/tokens.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/mypy/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/mypy/debug.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/mypy/report.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/building.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/compression.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/data.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/datarefs.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/dataserver.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/loading.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/media.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/pack/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/pack/packing.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/pack/repositories.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/pack/unpacking.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/repositories.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/oci/tars.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/packaging/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/packaging/marshal.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/packaging/names.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/packaging/requires.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/packaging/revisions.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/packaging/specifiers.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/packaging/versions.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/packaging/wheelfile.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pip.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/base.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/blanklines.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/caches.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/git.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/imports.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/lite.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/manifests.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/scripts.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/precheck/unicode.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/attrdocs.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/bracepy.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/classdot.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/LICENSE +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/attrdoc.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/common.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/epydoc.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/google.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/numpydoc.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/parser.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/docstrings/rest.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/findimports.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/scripts/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/scripts/bumpversion.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/scripts/execstat.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/scripts/importtrace.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/srcheaders.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/tools/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/tools/importscan.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/py/tools/mkrelimp.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/cli.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/configs.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/inject.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/reqs.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/resources/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/resources/docker-dev.sh +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/resources/python.sh +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/pyproject/venvs.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/rs/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/lib/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/lib/inject.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/lib/logs.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/lib/marshal.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/slowcat.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/scripts/tmpexec.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tagstrings.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tokens/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tokens/all.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tokens/tokenizert.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tokens/utils.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/cloc.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/diff.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/doc.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/docker.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/git/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/git/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/git/cli.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/git/cloning.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/git/consts.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/git/messages.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/json/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/json/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/json/cli.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/json/formats.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/json/io.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/json/parsing.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/json/processing.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/json/rendering.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/jsonview/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/jsonview/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/jsonview/cli.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/jsonview/resources/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/jsonview/resources/jsonview.css +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/jsonview/resources/jsonview.js +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/linehisto.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/mkenv.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/notebook.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/pawk/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/pawk/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/pip.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/prof.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/qr.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/shadow.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/shell.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tools/sqlrepl.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/apps/__init__.py +0 -0
- {omdev-0.0.0.dev473/omdev/tui/apps/irc → omdev-0.0.0.dev475/omdev/tui/apps/edit}/__init__.py +0 -0
- {omdev-0.0.0.dev473/omdev/tui/apps/markdown → omdev-0.0.0.dev475/omdev/tui/apps/irc}/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/apps/irc/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/apps/irc/client.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/apps/irc/commands.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/apps/irc/main.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/apps/markdown/__main__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/apps/markdown/cli.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/rich/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/rich/console2.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/rich/markdown2.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/textual/app2.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/textual/autocomplete/LICENSE +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/textual/autocomplete/__init__.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/textual/autocomplete/matching.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/textual/autocomplete/paths.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/textual/autocomplete/widget.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev/tui/textual/drivers2.py +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev.egg-info/dependency_links.txt +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev.egg-info/entry_points.txt +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/omdev.egg-info/top_level.txt +0 -0
- {omdev-0.0.0.dev473 → omdev-0.0.0.dev475}/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.dev475
|
|
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.dev475
|
|
18
18
|
Provides-Extra: all
|
|
19
19
|
Requires-Dist: black~=25.9; extra == "all"
|
|
20
20
|
Requires-Dist: pycparser~=2.23; extra == "all"
|
|
@@ -27,7 +27,7 @@ Requires-Dist: mypy~=1.18; 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.5; extra == "all"
|
|
31
31
|
Provides-Extra: black
|
|
32
32
|
Requires-Dist: black~=25.9; 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.5; extra == "tui"
|
|
50
50
|
Dynamic: license-file
|
|
51
51
|
|
|
52
52
|
# Overview
|
|
@@ -14,7 +14,6 @@ import argparse
|
|
|
14
14
|
import asyncio
|
|
15
15
|
import itertools
|
|
16
16
|
import os.path
|
|
17
|
-
import sys
|
|
18
17
|
import typing as ta
|
|
19
18
|
|
|
20
19
|
from omlish.argparse.cli import ArgparseCli
|
|
@@ -260,7 +259,7 @@ async def _async_main() -> ta.Optional[int]:
|
|
|
260
259
|
def _main() -> None:
|
|
261
260
|
configure_standard_logging('DEBUG')
|
|
262
261
|
|
|
263
|
-
|
|
262
|
+
raise SystemExit(rc if isinstance(rc := asyncio.run(_async_main()), int) else 0)
|
|
264
263
|
|
|
265
264
|
|
|
266
265
|
if __name__ == '__main__':
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import os.path
|
|
3
3
|
import subprocess
|
|
4
|
-
import sys
|
|
5
4
|
import typing as ta
|
|
6
5
|
|
|
7
6
|
from omlish.formats import json
|
|
@@ -60,7 +59,7 @@ def _main() -> None:
|
|
|
60
59
|
entry_dcts = [json.loads(sl) for l in log_lines if (sl := l.strip())]
|
|
61
60
|
print(json.dumps_compact(entry_dcts))
|
|
62
61
|
|
|
63
|
-
|
|
62
|
+
raise SystemExit(rc)
|
|
64
63
|
|
|
65
64
|
|
|
66
65
|
if __name__ == '__main__':
|
|
@@ -21,7 +21,6 @@ TODO:
|
|
|
21
21
|
import argparse
|
|
22
22
|
import asyncio
|
|
23
23
|
import os.path
|
|
24
|
-
import sys
|
|
25
24
|
import typing as ta
|
|
26
25
|
|
|
27
26
|
from omlish import inject as inj
|
|
@@ -126,7 +125,7 @@ def _check_cmd(args) -> None:
|
|
|
126
125
|
|
|
127
126
|
if vs:
|
|
128
127
|
print(f'{len(vs)} violations found')
|
|
129
|
-
|
|
128
|
+
raise SystemExit(1)
|
|
130
129
|
|
|
131
130
|
|
|
132
131
|
##
|
|
@@ -3107,6 +3107,7 @@ TODO:
|
|
|
3107
3107
|
- pre-run, post-run hooks
|
|
3108
3108
|
- exitstack?
|
|
3109
3109
|
- suggestion - difflib.get_close_matches
|
|
3110
|
+
- add_argument_group - group kw on ArgparseKwarg?
|
|
3110
3111
|
"""
|
|
3111
3112
|
|
|
3112
3113
|
|
|
@@ -3117,6 +3118,7 @@ TODO:
|
|
|
3117
3118
|
class ArgparseArg:
|
|
3118
3119
|
args: ta.Sequence[ta.Any]
|
|
3119
3120
|
kwargs: ta.Mapping[str, ta.Any]
|
|
3121
|
+
group: ta.Optional[str] = None
|
|
3120
3122
|
dest: ta.Optional[str] = None
|
|
3121
3123
|
|
|
3122
3124
|
def __get__(self, instance, owner=None):
|
|
@@ -3126,7 +3128,11 @@ class ArgparseArg:
|
|
|
3126
3128
|
|
|
3127
3129
|
|
|
3128
3130
|
def argparse_arg(*args, **kwargs) -> ArgparseArg:
|
|
3129
|
-
return ArgparseArg(
|
|
3131
|
+
return ArgparseArg(
|
|
3132
|
+
args=args,
|
|
3133
|
+
group=kwargs.pop('group', None),
|
|
3134
|
+
kwargs=kwargs,
|
|
3135
|
+
)
|
|
3130
3136
|
|
|
3131
3137
|
|
|
3132
3138
|
def argparse_arg_(*args, **kwargs) -> ta.Any:
|
|
@@ -3296,6 +3302,10 @@ class ArgparseCli:
|
|
|
3296
3302
|
subparser.set_defaults(_cmd=obj)
|
|
3297
3303
|
|
|
3298
3304
|
elif isinstance(obj, ArgparseArg):
|
|
3305
|
+
if obj.group is not None:
|
|
3306
|
+
# FIXME: add_argument_group
|
|
3307
|
+
raise NotImplementedError
|
|
3308
|
+
|
|
3299
3309
|
if att in anns:
|
|
3300
3310
|
ann_kwargs = _get_argparse_arg_ann_kwargs(anns[att])
|
|
3301
3311
|
obj.kwargs = {**ann_kwargs, **obj.kwargs}
|
|
@@ -3341,7 +3351,7 @@ class ArgparseCli:
|
|
|
3341
3351
|
|
|
3342
3352
|
if self._unknown_args and not (cmd is not None and cmd.accepts_unknown):
|
|
3343
3353
|
msg = f'unrecognized arguments: {" ".join(self._unknown_args)}'
|
|
3344
|
-
if (parser := self.get_parser()).exit_on_error:
|
|
3354
|
+
if (parser := self.get_parser()).exit_on_error: # noqa
|
|
3345
3355
|
parser.error(msg)
|
|
3346
3356
|
else:
|
|
3347
3357
|
raise argparse.ArgumentError(None, msg)
|
|
@@ -3361,7 +3371,10 @@ class ArgparseCli:
|
|
|
3361
3371
|
return fn()
|
|
3362
3372
|
|
|
3363
3373
|
def cli_run_and_exit(self) -> ta.NoReturn:
|
|
3364
|
-
|
|
3374
|
+
rc = self.cli_run()
|
|
3375
|
+
if not isinstance(rc, int):
|
|
3376
|
+
rc = 0
|
|
3377
|
+
raise SystemExit(rc)
|
|
3365
3378
|
|
|
3366
3379
|
def __call__(self, *, exit: bool = False) -> ta.Optional[int]: # noqa
|
|
3367
3380
|
if exit:
|
|
@@ -8137,7 +8150,7 @@ def configure_standard_logging(
|
|
|
8137
8150
|
##
|
|
8138
8151
|
|
|
8139
8152
|
|
|
8140
|
-
def
|
|
8153
|
+
def exception_logging(log): # noqa
|
|
8141
8154
|
def outer(fn):
|
|
8142
8155
|
@functools.wraps(fn)
|
|
8143
8156
|
def inner(*args, **kwargs):
|
|
@@ -15559,7 +15572,7 @@ async def _async_main() -> ta.Optional[int]:
|
|
|
15559
15572
|
def _main() -> None:
|
|
15560
15573
|
configure_standard_logging('DEBUG')
|
|
15561
15574
|
|
|
15562
|
-
|
|
15575
|
+
raise SystemExit(rc if isinstance(rc := asyncio.run(_async_main()), int) else 0)
|
|
15563
15576
|
|
|
15564
15577
|
|
|
15565
15578
|
if __name__ == '__main__':
|
|
@@ -2227,6 +2227,7 @@ TODO:
|
|
|
2227
2227
|
- pre-run, post-run hooks
|
|
2228
2228
|
- exitstack?
|
|
2229
2229
|
- suggestion - difflib.get_close_matches
|
|
2230
|
+
- add_argument_group - group kw on ArgparseKwarg?
|
|
2230
2231
|
"""
|
|
2231
2232
|
|
|
2232
2233
|
|
|
@@ -2237,6 +2238,7 @@ TODO:
|
|
|
2237
2238
|
class ArgparseArg:
|
|
2238
2239
|
args: ta.Sequence[ta.Any]
|
|
2239
2240
|
kwargs: ta.Mapping[str, ta.Any]
|
|
2241
|
+
group: ta.Optional[str] = None
|
|
2240
2242
|
dest: ta.Optional[str] = None
|
|
2241
2243
|
|
|
2242
2244
|
def __get__(self, instance, owner=None):
|
|
@@ -2246,7 +2248,11 @@ class ArgparseArg:
|
|
|
2246
2248
|
|
|
2247
2249
|
|
|
2248
2250
|
def argparse_arg(*args, **kwargs) -> ArgparseArg:
|
|
2249
|
-
return ArgparseArg(
|
|
2251
|
+
return ArgparseArg(
|
|
2252
|
+
args=args,
|
|
2253
|
+
group=kwargs.pop('group', None),
|
|
2254
|
+
kwargs=kwargs,
|
|
2255
|
+
)
|
|
2250
2256
|
|
|
2251
2257
|
|
|
2252
2258
|
def argparse_arg_(*args, **kwargs) -> ta.Any:
|
|
@@ -2416,6 +2422,10 @@ class ArgparseCli:
|
|
|
2416
2422
|
subparser.set_defaults(_cmd=obj)
|
|
2417
2423
|
|
|
2418
2424
|
elif isinstance(obj, ArgparseArg):
|
|
2425
|
+
if obj.group is not None:
|
|
2426
|
+
# FIXME: add_argument_group
|
|
2427
|
+
raise NotImplementedError
|
|
2428
|
+
|
|
2419
2429
|
if att in anns:
|
|
2420
2430
|
ann_kwargs = _get_argparse_arg_ann_kwargs(anns[att])
|
|
2421
2431
|
obj.kwargs = {**ann_kwargs, **obj.kwargs}
|
|
@@ -2461,7 +2471,7 @@ class ArgparseCli:
|
|
|
2461
2471
|
|
|
2462
2472
|
if self._unknown_args and not (cmd is not None and cmd.accepts_unknown):
|
|
2463
2473
|
msg = f'unrecognized arguments: {" ".join(self._unknown_args)}'
|
|
2464
|
-
if (parser := self.get_parser()).exit_on_error:
|
|
2474
|
+
if (parser := self.get_parser()).exit_on_error: # noqa
|
|
2465
2475
|
parser.error(msg)
|
|
2466
2476
|
else:
|
|
2467
2477
|
raise argparse.ArgumentError(None, msg)
|
|
@@ -2481,7 +2491,10 @@ class ArgparseCli:
|
|
|
2481
2491
|
return fn()
|
|
2482
2492
|
|
|
2483
2493
|
def cli_run_and_exit(self) -> ta.NoReturn:
|
|
2484
|
-
|
|
2494
|
+
rc = self.cli_run()
|
|
2495
|
+
if not isinstance(rc, int):
|
|
2496
|
+
rc = 0
|
|
2497
|
+
raise SystemExit(rc)
|
|
2485
2498
|
|
|
2486
2499
|
def __call__(self, *, exit: bool = False) -> ta.Optional[int]: # noqa
|
|
2487
2500
|
if exit:
|
|
@@ -4058,6 +4058,7 @@ TODO:
|
|
|
4058
4058
|
- pre-run, post-run hooks
|
|
4059
4059
|
- exitstack?
|
|
4060
4060
|
- suggestion - difflib.get_close_matches
|
|
4061
|
+
- add_argument_group - group kw on ArgparseKwarg?
|
|
4061
4062
|
"""
|
|
4062
4063
|
|
|
4063
4064
|
|
|
@@ -4068,6 +4069,7 @@ TODO:
|
|
|
4068
4069
|
class ArgparseArg:
|
|
4069
4070
|
args: ta.Sequence[ta.Any]
|
|
4070
4071
|
kwargs: ta.Mapping[str, ta.Any]
|
|
4072
|
+
group: ta.Optional[str] = None
|
|
4071
4073
|
dest: ta.Optional[str] = None
|
|
4072
4074
|
|
|
4073
4075
|
def __get__(self, instance, owner=None):
|
|
@@ -4077,7 +4079,11 @@ class ArgparseArg:
|
|
|
4077
4079
|
|
|
4078
4080
|
|
|
4079
4081
|
def argparse_arg(*args, **kwargs) -> ArgparseArg:
|
|
4080
|
-
return ArgparseArg(
|
|
4082
|
+
return ArgparseArg(
|
|
4083
|
+
args=args,
|
|
4084
|
+
group=kwargs.pop('group', None),
|
|
4085
|
+
kwargs=kwargs,
|
|
4086
|
+
)
|
|
4081
4087
|
|
|
4082
4088
|
|
|
4083
4089
|
def argparse_arg_(*args, **kwargs) -> ta.Any:
|
|
@@ -4247,6 +4253,10 @@ class ArgparseCli:
|
|
|
4247
4253
|
subparser.set_defaults(_cmd=obj)
|
|
4248
4254
|
|
|
4249
4255
|
elif isinstance(obj, ArgparseArg):
|
|
4256
|
+
if obj.group is not None:
|
|
4257
|
+
# FIXME: add_argument_group
|
|
4258
|
+
raise NotImplementedError
|
|
4259
|
+
|
|
4250
4260
|
if att in anns:
|
|
4251
4261
|
ann_kwargs = _get_argparse_arg_ann_kwargs(anns[att])
|
|
4252
4262
|
obj.kwargs = {**ann_kwargs, **obj.kwargs}
|
|
@@ -4292,7 +4302,7 @@ class ArgparseCli:
|
|
|
4292
4302
|
|
|
4293
4303
|
if self._unknown_args and not (cmd is not None and cmd.accepts_unknown):
|
|
4294
4304
|
msg = f'unrecognized arguments: {" ".join(self._unknown_args)}'
|
|
4295
|
-
if (parser := self.get_parser()).exit_on_error:
|
|
4305
|
+
if (parser := self.get_parser()).exit_on_error: # noqa
|
|
4296
4306
|
parser.error(msg)
|
|
4297
4307
|
else:
|
|
4298
4308
|
raise argparse.ArgumentError(None, msg)
|
|
@@ -4312,7 +4322,10 @@ class ArgparseCli:
|
|
|
4312
4322
|
return fn()
|
|
4313
4323
|
|
|
4314
4324
|
def cli_run_and_exit(self) -> ta.NoReturn:
|
|
4315
|
-
|
|
4325
|
+
rc = self.cli_run()
|
|
4326
|
+
if not isinstance(rc, int):
|
|
4327
|
+
rc = 0
|
|
4328
|
+
raise SystemExit(rc)
|
|
4316
4329
|
|
|
4317
4330
|
def __call__(self, *, exit: bool = False) -> ta.Optional[int]: # noqa
|
|
4318
4331
|
if exit:
|
|
@@ -10877,7 +10890,7 @@ class BasePyprojectPackageGenerator(Abstract):
|
|
|
10877
10890
|
|
|
10878
10891
|
def _write_git_ignore(self) -> None:
|
|
10879
10892
|
with open(os.path.join(self._pkg_dir(), '.gitignore'), 'w') as f:
|
|
10880
|
-
f.write('\n'.join(self._GIT_IGNORE))
|
|
10893
|
+
f.write('\n'.join([*self._GIT_IGNORE, '']))
|
|
10881
10894
|
|
|
10882
10895
|
#
|
|
10883
10896
|
|
|
@@ -384,9 +384,9 @@ def main() -> None:
|
|
|
384
384
|
# Workaround for close failed in file object destructor: sys.excepthook is missing lost sys.stderr
|
|
385
385
|
# http://stackoverflow.com/questions/7955138/addressing-sys-excepthook-error-in-bash-script
|
|
386
386
|
sys.stderr.write(str(e) + '\n')
|
|
387
|
-
|
|
387
|
+
raise SystemExit(1) from None
|
|
388
388
|
except KeyboardInterrupt:
|
|
389
|
-
|
|
389
|
+
raise SystemExit(1) from None
|
|
390
390
|
|
|
391
391
|
|
|
392
392
|
# @omlish-manifest
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import pathlib
|
|
3
|
+
import typing as ta
|
|
4
|
+
|
|
5
|
+
from ... import textual as tx
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
##
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class QuitConfirmScreen(tx.ModalScreen[bool]):
|
|
12
|
+
"""Screen with a dialog to confirm quit without saving."""
|
|
13
|
+
|
|
14
|
+
CSS = """
|
|
15
|
+
QuitConfirmScreen {
|
|
16
|
+
align: center middle;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
#dialog {
|
|
20
|
+
width: 60;
|
|
21
|
+
height: 11;
|
|
22
|
+
border: thick $background 80%;
|
|
23
|
+
background: $surface;
|
|
24
|
+
padding: 1 2;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
#question {
|
|
28
|
+
height: 3;
|
|
29
|
+
content-align: center middle;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
Button {
|
|
33
|
+
width: 1fr;
|
|
34
|
+
}
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def compose(self) -> tx.ComposeResult:
|
|
38
|
+
yield tx.Vertical(
|
|
39
|
+
tx.Label('You have unsaved changes. Do you want to save before quitting?', id='question'),
|
|
40
|
+
tx.Button('Save and Quit', variant='success', id='save'),
|
|
41
|
+
tx.Button('Quit Without Saving', variant='warning', id='quit'),
|
|
42
|
+
tx.Button('Cancel', variant='primary', id='cancel'),
|
|
43
|
+
id='dialog',
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
def on_button_pressed(self, event: tx.Button.Pressed) -> None:
|
|
47
|
+
if event.button.id == 'save':
|
|
48
|
+
self.dismiss(True)
|
|
49
|
+
elif event.button.id == 'quit':
|
|
50
|
+
self.dismiss(False)
|
|
51
|
+
else:
|
|
52
|
+
self.dismiss(None)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class TextEditor(tx.App):
|
|
56
|
+
"""A simple text editor using Textual."""
|
|
57
|
+
|
|
58
|
+
CSS = """
|
|
59
|
+
TextArea {
|
|
60
|
+
height: 1fr;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
Container {
|
|
64
|
+
height: 100%;
|
|
65
|
+
}
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
BINDINGS: ta.ClassVar[ta.Sequence[tx.Binding]] = [
|
|
69
|
+
tx.Binding('ctrl+s', 'save', 'Save', show=True),
|
|
70
|
+
tx.Binding('ctrl+q', 'quit', 'Quit', show=True),
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
def __init__(self, filepath: pathlib.Path):
|
|
74
|
+
super().__init__()
|
|
75
|
+
|
|
76
|
+
self.filepath = filepath
|
|
77
|
+
self.text_area: tx.TextArea | None = None
|
|
78
|
+
self.modified = False
|
|
79
|
+
self.original_content = ''
|
|
80
|
+
|
|
81
|
+
def compose(self) -> tx.ComposeResult:
|
|
82
|
+
"""Create child widgets for the app."""
|
|
83
|
+
|
|
84
|
+
yield tx.Header()
|
|
85
|
+
yield tx.Container(tx.TextArea(id='editor'))
|
|
86
|
+
yield tx.Footer()
|
|
87
|
+
|
|
88
|
+
def on_mount(self) -> None:
|
|
89
|
+
"""Load the file content when the app starts."""
|
|
90
|
+
|
|
91
|
+
self.text_area = self.query_one('#editor', tx.TextArea)
|
|
92
|
+
|
|
93
|
+
# Load existing file or create new
|
|
94
|
+
if self.filepath.exists():
|
|
95
|
+
content = self.filepath.read_text()
|
|
96
|
+
self.text_area.load_text(content)
|
|
97
|
+
self.original_content = content
|
|
98
|
+
else:
|
|
99
|
+
self.original_content = ''
|
|
100
|
+
|
|
101
|
+
self.title = f'Text Editor - {self.filepath.name}'
|
|
102
|
+
self.sub_title = str(self.filepath)
|
|
103
|
+
|
|
104
|
+
def on_text_area_changed(self, event: tx.TextArea.Changed) -> None:
|
|
105
|
+
"""Track if the document has been modified."""
|
|
106
|
+
|
|
107
|
+
if self.text_area:
|
|
108
|
+
current_content = self.text_area.text
|
|
109
|
+
self.modified = current_content != self.original_content
|
|
110
|
+
|
|
111
|
+
# Update title to show modified status
|
|
112
|
+
status = ' *' if self.modified else ''
|
|
113
|
+
self.title = f'Text Editor - {self.filepath.name}{status}'
|
|
114
|
+
|
|
115
|
+
def action_save(self) -> None:
|
|
116
|
+
"""Save the current content to file."""
|
|
117
|
+
|
|
118
|
+
if self.text_area:
|
|
119
|
+
content = self.text_area.text
|
|
120
|
+
self.filepath.write_text(content)
|
|
121
|
+
self.original_content = content
|
|
122
|
+
self.modified = False
|
|
123
|
+
self.title = f'Text Editor - {self.filepath.name}'
|
|
124
|
+
self.notify(f'Saved to {self.filepath.name}')
|
|
125
|
+
|
|
126
|
+
async def action_quit(self) -> None:
|
|
127
|
+
"""Quit the editor, prompting to save if modified."""
|
|
128
|
+
|
|
129
|
+
if self.modified:
|
|
130
|
+
def check_quit(should_save: bool | None) -> None:
|
|
131
|
+
if should_save is None:
|
|
132
|
+
# User cancelled
|
|
133
|
+
return
|
|
134
|
+
|
|
135
|
+
if should_save:
|
|
136
|
+
self.action_save()
|
|
137
|
+
|
|
138
|
+
self.exit()
|
|
139
|
+
|
|
140
|
+
await self.push_screen(QuitConfirmScreen(), callback=check_quit)
|
|
141
|
+
|
|
142
|
+
else:
|
|
143
|
+
self.exit()
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def main() -> None:
|
|
147
|
+
"""Parse arguments and run the editor."""
|
|
148
|
+
|
|
149
|
+
parser = argparse.ArgumentParser(description='Simple text editor')
|
|
150
|
+
parser.add_argument('filename', help='File to edit')
|
|
151
|
+
args = parser.parse_args()
|
|
152
|
+
|
|
153
|
+
filepath = pathlib.Path(args.filename).resolve()
|
|
154
|
+
|
|
155
|
+
# Create parent directories if needed
|
|
156
|
+
filepath.parent.mkdir(parents=True, exist_ok=True)
|
|
157
|
+
|
|
158
|
+
app = TextEditor(filepath)
|
|
159
|
+
app.run()
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
if __name__ == '__main__':
|
|
163
|
+
main()
|
|
@@ -12,7 +12,7 @@ import typing as ta
|
|
|
12
12
|
|
|
13
13
|
from omlish import lang
|
|
14
14
|
|
|
15
|
-
from ... import textual
|
|
15
|
+
from ... import textual as tx
|
|
16
16
|
from .client import IrcClient
|
|
17
17
|
from .commands import ALL_COMMANDS
|
|
18
18
|
from .commands import IrcCommand
|
|
@@ -37,7 +37,7 @@ class IrcWindow:
|
|
|
37
37
|
self.unread += 1
|
|
38
38
|
|
|
39
39
|
|
|
40
|
-
class IrcApp(
|
|
40
|
+
class IrcApp(tx.App):
|
|
41
41
|
"""IRC client application."""
|
|
42
42
|
|
|
43
43
|
_commands: ta.ClassVar[ta.Mapping[str, IrcCommand]] = ALL_COMMANDS
|
|
@@ -65,9 +65,9 @@ class IrcApp(textual.App):
|
|
|
65
65
|
}
|
|
66
66
|
"""
|
|
67
67
|
|
|
68
|
-
BINDINGS: ta.ClassVar[ta.Sequence[
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
BINDINGS: ta.ClassVar[ta.Sequence[tx.Binding]] = [
|
|
69
|
+
tx.Binding('ctrl+n', 'next_window', 'Next Window', show=False),
|
|
70
|
+
tx.Binding('ctrl+p', 'prev_window', 'Previous Window', show=False),
|
|
71
71
|
]
|
|
72
72
|
|
|
73
73
|
def __init__(
|
|
@@ -94,12 +94,12 @@ class IrcApp(textual.App):
|
|
|
94
94
|
|
|
95
95
|
#
|
|
96
96
|
|
|
97
|
-
def compose(self) ->
|
|
98
|
-
text_area =
|
|
97
|
+
def compose(self) -> tx.ComposeResult:
|
|
98
|
+
text_area = tx.TextArea(id='messages', read_only=True, show_line_numbers=False)
|
|
99
99
|
text_area.cursor_blink = False
|
|
100
100
|
yield text_area
|
|
101
|
-
yield
|
|
102
|
-
yield
|
|
101
|
+
yield tx.Static('', id='status')
|
|
102
|
+
yield tx.Input(placeholder='Enter command or message', id='input', select_on_focus=False)
|
|
103
103
|
|
|
104
104
|
async def on_mount(self) -> None:
|
|
105
105
|
"""Initialize on mount."""
|
|
@@ -120,21 +120,21 @@ class IrcApp(textual.App):
|
|
|
120
120
|
await self.add_message('system', f'Executing: {cmd}')
|
|
121
121
|
await self.handle_command(cmd)
|
|
122
122
|
|
|
123
|
-
async def on_key(self, event:
|
|
123
|
+
async def on_key(self, event: tx.Key) -> None:
|
|
124
124
|
"""Handle key events - redirect typing to input when messages area is focused."""
|
|
125
125
|
|
|
126
126
|
focused = self.focused
|
|
127
127
|
if focused and focused.id == 'messages':
|
|
128
128
|
# If a printable character or common input key is pressed, focus the input and forward event
|
|
129
129
|
if event.is_printable or event.key in ('space', 'backspace', 'delete'):
|
|
130
|
-
input_widget = self.query_one('#input',
|
|
130
|
+
input_widget = self.query_one('#input', tx.Input)
|
|
131
131
|
input_widget.focus()
|
|
132
132
|
# Post the key event to the input widget so it handles it naturally
|
|
133
|
-
input_widget.post_message(
|
|
133
|
+
input_widget.post_message(tx.Key(event.key, event.character))
|
|
134
134
|
# Stop the event from being processed by the messages widget
|
|
135
135
|
event.stop()
|
|
136
136
|
|
|
137
|
-
async def on_input_submitted(self, event:
|
|
137
|
+
async def on_input_submitted(self, event: tx.Input.Submitted) -> None:
|
|
138
138
|
"""Handle user input."""
|
|
139
139
|
|
|
140
140
|
text = event.value.strip()
|
|
@@ -232,7 +232,7 @@ class IrcApp(textual.App):
|
|
|
232
232
|
current_window.unread = 0
|
|
233
233
|
|
|
234
234
|
# Update messages display
|
|
235
|
-
messages_widget = self.query_one('#messages',
|
|
235
|
+
messages_widget = self.query_one('#messages', tx.TextArea)
|
|
236
236
|
|
|
237
237
|
# Check if we switched windows or need full reload
|
|
238
238
|
window_changed = self._last_window != current_window_name
|
|
@@ -271,7 +271,7 @@ class IrcApp(textual.App):
|
|
|
271
271
|
window_list.append(indicator)
|
|
272
272
|
|
|
273
273
|
status_text = ' '.join(window_list)
|
|
274
|
-
self.query_one('#status',
|
|
274
|
+
self.query_one('#status', tx.Static).update(status_text)
|
|
275
275
|
|
|
276
276
|
async def on_unmount(self) -> None:
|
|
277
277
|
if (cl := self._client) is not None:
|
|
File without changes
|
|
@@ -27,6 +27,7 @@ with _lang.auto_proxy_init(globals()):
|
|
|
27
27
|
from textual import timer # noqa
|
|
28
28
|
from textual import widget # noqa
|
|
29
29
|
from textual import widgets # noqa
|
|
30
|
+
from textual import work # noqa
|
|
30
31
|
from textual.app import ActionError # noqa
|
|
31
32
|
from textual.app import ActiveModeError # noqa
|
|
32
33
|
from textual.app import App as App_ # noqa
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: omdev
|
|
3
|
-
Version: 0.0.0.
|
|
3
|
+
Version: 0.0.0.dev475
|
|
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.dev475
|
|
18
18
|
Provides-Extra: all
|
|
19
19
|
Requires-Dist: black~=25.9; extra == "all"
|
|
20
20
|
Requires-Dist: pycparser~=2.23; extra == "all"
|
|
@@ -27,7 +27,7 @@ Requires-Dist: mypy~=1.18; 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.5; extra == "all"
|
|
31
31
|
Provides-Extra: black
|
|
32
32
|
Requires-Dist: black~=25.9; 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.5; extra == "tui"
|
|
50
50
|
Dynamic: license-file
|
|
51
51
|
|
|
52
52
|
# Overview
|
|
@@ -345,6 +345,8 @@ omdev/tools/pawk/__main__.py
|
|
|
345
345
|
omdev/tools/pawk/pawk.py
|
|
346
346
|
omdev/tui/__init__.py
|
|
347
347
|
omdev/tui/apps/__init__.py
|
|
348
|
+
omdev/tui/apps/edit/__init__.py
|
|
349
|
+
omdev/tui/apps/edit/main.py
|
|
348
350
|
omdev/tui/apps/irc/__init__.py
|
|
349
351
|
omdev/tui/apps/irc/__main__.py
|
|
350
352
|
omdev/tui/apps/irc/app.py
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
omlish==0.0.0.
|
|
1
|
+
omlish==0.0.0.dev475
|
|
2
2
|
|
|
3
3
|
[all]
|
|
4
4
|
black~=25.9
|
|
@@ -12,7 +12,7 @@ mypy~=1.18
|
|
|
12
12
|
gprof2dot~=2025.4
|
|
13
13
|
segno~=1.6
|
|
14
14
|
rich~=14.2
|
|
15
|
-
textual~=6.
|
|
15
|
+
textual~=6.5
|
|
16
16
|
|
|
17
17
|
[black]
|
|
18
18
|
black~=25.9
|
|
@@ -38,4 +38,4 @@ segno~=1.6
|
|
|
38
38
|
|
|
39
39
|
[tui]
|
|
40
40
|
rich~=14.2
|
|
41
|
-
textual~=6.
|
|
41
|
+
textual~=6.5
|