omdev 0.0.0.dev472__tar.gz → 0.0.0.dev474__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.dev472/omdev.egg-info → omdev-0.0.0.dev474}/PKG-INFO +4 -4
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/__about__.py +1 -1
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/pyproject/pkg.py +7 -2
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/scripts/ci.py +4 -4
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/scripts/pyproject.py +7 -2
- omdev-0.0.0.dev474/omdev/tui/apps/edit/main.py +163 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/apps/irc/app.py +15 -15
- omdev-0.0.0.dev474/omdev/tui/apps/markdown/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/textual/__init__.py +1 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474/omdev.egg-info}/PKG-INFO +4 -4
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev.egg-info/SOURCES.txt +2 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev.egg-info/requires.txt +3 -3
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/pyproject.toml +4 -4
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/LICENSE +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/MANIFEST.in +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/README.md +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/.omlish-manifests.json +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/amalg/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/amalg/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/amalg/cli/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/amalg/cli/main.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/amalg/gen/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/amalg/gen/gen.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/amalg/gen/imports.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/amalg/gen/manifests.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/amalg/gen/resources.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/amalg/gen/srcfiles.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/amalg/gen/strip.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/amalg/gen/types.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/amalg/gen/typing.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/amalg/sources.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cache/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cache/compute/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cache/compute/cache.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cache/compute/contexts.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cache/compute/currents.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cache/compute/fns.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cache/compute/resolvers.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cache/compute/storage.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cache/compute/types.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cache/data/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cache/data/actions.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cache/data/cache.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cache/data/consts.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cache/data/defaults.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cache/data/manifests.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cache/data/specs.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/capi/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/capi/darwin/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/capi/darwin/aps.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/capi/darwin/ax.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/capi/darwin/cf.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/capi/darwin/cg.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/capi/linux/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/capi/linux/x11.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cc/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cc/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cc/cdeps.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cc/cdeps.toml +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cc/cli.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cc/srclangs.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_boilerplate.cc +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_distutils/LICENSE +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_distutils/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_distutils/build_ext.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_distutils/compilers/options.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_distutils/dir_util.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_distutils/errors.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_distutils/extension.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_distutils/file_util.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_distutils/modified.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_distutils/spawn.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_distutils/sysconfig.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_distutils/util.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/_distutils/version.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/build.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/cmake.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/importhook.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/magic.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cexts/scan.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/cache.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/ci.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/cli.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/compose.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/consts.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/docker/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/docker/buildcaching.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/docker/cache.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/docker/cacheserved/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/docker/cacheserved/cache.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/docker/cacheserved/manifests.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/docker/cmds.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/docker/dataserver.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/docker/imagepulling.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/docker/inject.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/docker/packing.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/docker/repositories.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/docker/utils.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/github/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/github/api/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/github/api/clients.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/github/api/v1/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/github/api/v1/api.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/github/api/v1/client.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/github/api/v2/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/github/api/v2/api.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/github/api/v2/azure.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/github/api/v2/client.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/github/bootstrap.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/github/cache.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/github/cli.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/github/env.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/github/inject.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/inject.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/requirements.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/shell.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/ci/utils.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cli/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cli/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cli/_pathhack.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cli/clicli.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cli/install.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cli/main.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cli/managers.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cli/types.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/clipboard/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/clipboard/clipboard.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/clipboard/darwin_cf.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/clipboard/linux_x11.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cmake.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cmdlog/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cmdlog/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cmdlog/_cmdlog.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cmdlog/cli.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/cmdlog/cmdlog.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/dataclasses/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/dataclasses/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/dataclasses/cli.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/dataclasses/codegen.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/dataserver/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/dataserver/handlers.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/dataserver/http.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/dataserver/routes.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/dataserver/server.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/dataserver/targets.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/git/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/git/magic.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/git/revisions.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/git/shallow.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/git/status.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/home/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/home/paths.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/home/secrets.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/home/shadow.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/imgur.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/intellij/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/intellij/cli.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/intellij/ides.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/intellij/open.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/cli.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/default.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/inject.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/inspect.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/providers/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/providers/base.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/providers/inject.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/providers/running.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/providers/standalone.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/providers/system.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/pyenv/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/pyenv/inject.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/pyenv/install.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/pyenv/provider.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/pyenv/pyenv.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/resolvers.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/types.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/uv/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/uv/inject.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/uv/provider.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/uv/uv.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/interp/venvs.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/messages/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/messages/base.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/messages/formats.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/messages/messages.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/messages/parsing.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/numerics/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/numerics/formats.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/numerics/numerics.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/numerics/types.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/protocol/LICENSE +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/protocol/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/protocol/consts.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/protocol/errors.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/protocol/message.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/protocol/nuh.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/protocol/parsing.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/protocol/rendering.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/protocol/tags.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/irc/protocol/utils.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/magic/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/magic/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/magic/cli.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/magic/find.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/magic/magic.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/magic/prepare.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/magic/styles.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/manifests/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/manifests/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/manifests/_dumping.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/manifests/building.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/manifests/dumping.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/manifests/main.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/markdown/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/markdown/incparse.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/markdown/tokens.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/mypy/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/mypy/debug.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/mypy/report.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/oci/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/oci/building.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/oci/compression.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/oci/data.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/oci/datarefs.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/oci/dataserver.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/oci/loading.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/oci/media.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/oci/pack/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/oci/pack/packing.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/oci/pack/repositories.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/oci/pack/unpacking.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/oci/repositories.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/oci/tars.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/packaging/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/packaging/marshal.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/packaging/names.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/packaging/requires.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/packaging/revisions.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/packaging/specifiers.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/packaging/versions.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/packaging/wheelfile.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/pip.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/precheck/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/precheck/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/precheck/base.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/precheck/blanklines.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/precheck/caches.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/precheck/git.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/precheck/imports.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/precheck/lite.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/precheck/main.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/precheck/manifests.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/precheck/scripts.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/precheck/unicode.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/attrdocs.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/bracepy.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/classdot.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/docstrings/LICENSE +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/docstrings/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/docstrings/attrdoc.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/docstrings/common.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/docstrings/epydoc.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/docstrings/google.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/docstrings/numpydoc.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/docstrings/parser.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/docstrings/rest.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/findimports.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/scripts/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/scripts/bumpversion.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/scripts/execstat.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/scripts/importtrace.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/srcheaders.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/tools/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/tools/importscan.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/py/tools/mkrelimp.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/pyproject/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/pyproject/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/pyproject/cli.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/pyproject/configs.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/pyproject/inject.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/pyproject/reqs.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/pyproject/resources/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/pyproject/resources/docker-dev.sh +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/pyproject/resources/python.sh +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/pyproject/venvs.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/rs/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/scripts/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/scripts/interp.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/scripts/lib/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/scripts/lib/inject.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/scripts/lib/logs.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/scripts/lib/marshal.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/scripts/slowcat.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/scripts/tmpexec.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tagstrings.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tokens/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tokens/all.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tokens/tokenizert.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tokens/utils.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/cloc.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/diff.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/doc.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/docker.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/git/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/git/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/git/cli.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/git/cloning.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/git/consts.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/git/messages.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/json/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/json/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/json/cli.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/json/formats.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/json/io.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/json/parsing.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/json/processing.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/json/rendering.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/jsonview/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/jsonview/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/jsonview/cli.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/jsonview/resources/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/jsonview/resources/jsonview.css +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/jsonview/resources/jsonview.js +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/linehisto.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/mkenv.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/notebook.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/pawk/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/pawk/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/pawk/pawk.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/pip.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/prof.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/qr.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/shadow.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/shell.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tools/sqlrepl.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/apps/__init__.py +0 -0
- {omdev-0.0.0.dev472/omdev/tui/apps/irc → omdev-0.0.0.dev474/omdev/tui/apps/edit}/__init__.py +0 -0
- {omdev-0.0.0.dev472/omdev/tui/apps/markdown → omdev-0.0.0.dev474/omdev/tui/apps/irc}/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/apps/irc/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/apps/irc/client.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/apps/irc/commands.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/apps/irc/main.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/apps/markdown/__main__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/apps/markdown/cli.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/rich/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/rich/console2.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/rich/markdown2.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/textual/app2.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/textual/autocomplete/LICENSE +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/textual/autocomplete/__init__.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/textual/autocomplete/matching.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/textual/autocomplete/paths.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/textual/autocomplete/widget.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev/tui/textual/drivers2.py +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev.egg-info/dependency_links.txt +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev.egg-info/entry_points.txt +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/omdev.egg-info/top_level.txt +0 -0
- {omdev-0.0.0.dev472 → omdev-0.0.0.dev474}/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.dev474
|
|
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.dev474
|
|
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
|
|
@@ -93,7 +93,7 @@ class BasePyprojectPackageGenerator(Abstract):
|
|
|
93
93
|
|
|
94
94
|
def _write_git_ignore(self) -> None:
|
|
95
95
|
with open(os.path.join(self._pkg_dir(), '.gitignore'), 'w') as f:
|
|
96
|
-
f.write('\n'.join(self._GIT_IGNORE))
|
|
96
|
+
f.write('\n'.join([*self._GIT_IGNORE, '']))
|
|
97
97
|
|
|
98
98
|
#
|
|
99
99
|
|
|
@@ -516,12 +516,17 @@ class _PyprojectCextPackageGenerator(_PyprojectExtensionPackageGenerator):
|
|
|
516
516
|
ext_lines = []
|
|
517
517
|
|
|
518
518
|
for ext_src in self.find_cext_srcs():
|
|
519
|
+
ext_lang = ext_src.rpartition('.')[2]
|
|
520
|
+
compile_args = {
|
|
521
|
+
'c': ['-std=c11'],
|
|
522
|
+
'cc': ['-std=c++20'],
|
|
523
|
+
}.get(ext_lang, [])
|
|
519
524
|
ext_name = ext_src.rpartition('.')[0].replace(os.sep, '.')
|
|
520
525
|
ext_lines.extend([
|
|
521
526
|
'st.Extension(',
|
|
522
527
|
f" name='{ext_name}',",
|
|
523
528
|
f" sources=['{ext_src}'],",
|
|
524
|
-
|
|
529
|
+
f' extra_compile_args={compile_args!r},',
|
|
525
530
|
'),',
|
|
526
531
|
])
|
|
527
532
|
|
|
@@ -1293,7 +1293,7 @@ class ExitStacked:
|
|
|
1293
1293
|
es.__enter__()
|
|
1294
1294
|
try:
|
|
1295
1295
|
self._enter_contexts()
|
|
1296
|
-
except
|
|
1296
|
+
except BaseException: # noqa
|
|
1297
1297
|
es.__exit__(*sys.exc_info())
|
|
1298
1298
|
raise
|
|
1299
1299
|
return self
|
|
@@ -1304,7 +1304,7 @@ class ExitStacked:
|
|
|
1304
1304
|
return None
|
|
1305
1305
|
try:
|
|
1306
1306
|
self._exit_contexts()
|
|
1307
|
-
except
|
|
1307
|
+
except BaseException: # noqa
|
|
1308
1308
|
es.__exit__(*sys.exc_info())
|
|
1309
1309
|
raise
|
|
1310
1310
|
return es.__exit__(exc_type, exc_val, exc_tb)
|
|
@@ -1352,7 +1352,7 @@ class AsyncExitStacked:
|
|
|
1352
1352
|
await es.__aenter__()
|
|
1353
1353
|
try:
|
|
1354
1354
|
await self._async_enter_contexts()
|
|
1355
|
-
except
|
|
1355
|
+
except BaseException: # noqa
|
|
1356
1356
|
await es.__aexit__(*sys.exc_info())
|
|
1357
1357
|
raise
|
|
1358
1358
|
return self
|
|
@@ -1363,7 +1363,7 @@ class AsyncExitStacked:
|
|
|
1363
1363
|
return None
|
|
1364
1364
|
try:
|
|
1365
1365
|
await self._async_exit_contexts()
|
|
1366
|
-
except
|
|
1366
|
+
except BaseException: # noqa
|
|
1367
1367
|
await es.__aexit__(*sys.exc_info())
|
|
1368
1368
|
raise
|
|
1369
1369
|
return await es.__aexit__(exc_type, exc_val, exc_tb)
|
|
@@ -10877,7 +10877,7 @@ class BasePyprojectPackageGenerator(Abstract):
|
|
|
10877
10877
|
|
|
10878
10878
|
def _write_git_ignore(self) -> None:
|
|
10879
10879
|
with open(os.path.join(self._pkg_dir(), '.gitignore'), 'w') as f:
|
|
10880
|
-
f.write('\n'.join(self._GIT_IGNORE))
|
|
10880
|
+
f.write('\n'.join([*self._GIT_IGNORE, '']))
|
|
10881
10881
|
|
|
10882
10882
|
#
|
|
10883
10883
|
|
|
@@ -11300,12 +11300,17 @@ class _PyprojectCextPackageGenerator(_PyprojectExtensionPackageGenerator):
|
|
|
11300
11300
|
ext_lines = []
|
|
11301
11301
|
|
|
11302
11302
|
for ext_src in self.find_cext_srcs():
|
|
11303
|
+
ext_lang = ext_src.rpartition('.')[2]
|
|
11304
|
+
compile_args = {
|
|
11305
|
+
'c': ['-std=c11'],
|
|
11306
|
+
'cc': ['-std=c++20'],
|
|
11307
|
+
}.get(ext_lang, [])
|
|
11303
11308
|
ext_name = ext_src.rpartition('.')[0].replace(os.sep, '.')
|
|
11304
11309
|
ext_lines.extend([
|
|
11305
11310
|
'st.Extension(',
|
|
11306
11311
|
f" name='{ext_name}',",
|
|
11307
11312
|
f" sources=['{ext_src}'],",
|
|
11308
|
-
|
|
11313
|
+
f' extra_compile_args={compile_args!r},',
|
|
11309
11314
|
'),',
|
|
11310
11315
|
])
|
|
11311
11316
|
|
|
@@ -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.dev474
|
|
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.dev474
|
|
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.dev474
|
|
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
|
|
@@ -13,7 +13,7 @@ urls = {source = 'https://github.com/wrmsr/omlish'}
|
|
|
13
13
|
license = 'BSD-3-Clause'
|
|
14
14
|
readme = 'README.md'
|
|
15
15
|
requires-python = '>=3.13'
|
|
16
|
-
version = '0.0.0.
|
|
16
|
+
version = '0.0.0.dev474'
|
|
17
17
|
classifiers = [
|
|
18
18
|
'Development Status :: 2 - Pre-Alpha',
|
|
19
19
|
'Intended Audience :: Developers',
|
|
@@ -24,7 +24,7 @@ classifiers = [
|
|
|
24
24
|
]
|
|
25
25
|
description = 'omdev'
|
|
26
26
|
dependencies = [
|
|
27
|
-
'omlish == 0.0.0.
|
|
27
|
+
'omlish == 0.0.0.dev474',
|
|
28
28
|
]
|
|
29
29
|
|
|
30
30
|
[project.optional-dependencies]
|
|
@@ -40,7 +40,7 @@ all = [
|
|
|
40
40
|
'gprof2dot ~= 2025.4',
|
|
41
41
|
'segno ~= 1.6',
|
|
42
42
|
'rich ~= 14.2',
|
|
43
|
-
'textual ~= 6.
|
|
43
|
+
'textual ~= 6.5',
|
|
44
44
|
]
|
|
45
45
|
black = [
|
|
46
46
|
'black ~= 25.9',
|
|
@@ -66,7 +66,7 @@ qr = [
|
|
|
66
66
|
]
|
|
67
67
|
tui = [
|
|
68
68
|
'rich ~= 14.2',
|
|
69
|
-
'textual ~= 6.
|
|
69
|
+
'textual ~= 6.5',
|
|
70
70
|
]
|
|
71
71
|
|
|
72
72
|
[project.entry-points]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|