omdev 0.0.0.dev180__tar.gz → 0.0.0.dev181__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {omdev-0.0.0.dev180/omdev.egg-info → omdev-0.0.0.dev181}/PKG-INFO +2 -2
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/inspect.py +9 -4
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/providers/system.py +5 -2
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/pyenv/pyenv.py +5 -2
- {omdev-0.0.0.dev180/omdev/pyproject → omdev-0.0.0.dev181/omdev/interp}/venvs.py +41 -41
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/pyproject/configs.py +3 -4
- omdev-0.0.0.dev181/omdev/pyproject/inject.py +12 -0
- omdev-0.0.0.dev181/omdev/pyproject/venvs.py +78 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/scripts/interp.py +17 -12
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/scripts/pyproject.py +252 -120
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181/omdev.egg-info}/PKG-INFO +2 -2
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev.egg-info/SOURCES.txt +2 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev.egg-info/requires.txt +1 -1
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/pyproject.toml +2 -2
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/LICENSE +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/MANIFEST.in +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/README.rst +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/.manifests.json +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/__about__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/amalg/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/amalg/__main__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/amalg/gen.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/amalg/imports.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/amalg/main.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/amalg/manifests.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/amalg/resources.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/amalg/srcfiles.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/amalg/strip.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/amalg/types.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/amalg/typing.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/antlr/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/antlr/consts.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/antlr/gen.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/bracepy.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cache/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cache/compute/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cache/compute/cache.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cache/compute/contexts.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cache/compute/currents.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cache/compute/fns.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cache/compute/resolvers.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cache/compute/storage.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cache/compute/types.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cache/data/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cache/data/actions.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cache/data/cache.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cache/data/consts.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cache/data/defaults.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cache/data/manifests.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cache/data/specs.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_boilerplate.cc +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_distutils/LICENSE +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_distutils/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_distutils/build_ext.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_distutils/compilers/options.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_distutils/dir_util.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_distutils/errors.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_distutils/extension.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_distutils/file_util.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_distutils/modified.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_distutils/spawn.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_distutils/sysconfig.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_distutils/util.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/_distutils/version.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/build.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/cmake.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/importhook.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/magic.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cexts/scan.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/classdot.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cli/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cli/__main__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cli/_pathhack.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cli/clicli.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cli/install.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cli/main.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cli/managers.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cli/types.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/clipboard/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/clipboard/clipboard.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/clipboard/darwin_cf.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/clipboard/linux_x11.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/cmake.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/findimports.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/git/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/git/revisions.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/git/status.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/git/subtrees.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/imgur.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/__main__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/cli.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/default.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/inject.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/providers/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/providers/base.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/providers/inject.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/providers/running.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/providers/standalone.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/pyenv/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/pyenv/inject.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/resolvers.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/types.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/uv/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/uv/inject.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/interp/uv/uv.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/magic/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/magic/__main__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/magic/cli.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/magic/find.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/magic/magic.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/magic/prepare.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/magic/styles.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/manifests/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/manifests/__main__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/manifests/build.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/manifests/main.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/mypy/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/mypy/debug.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/packaging/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/packaging/marshal.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/packaging/names.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/packaging/requires.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/packaging/specifiers.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/packaging/versions.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/pip.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/precheck/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/precheck/__main__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/precheck/base.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/precheck/git.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/precheck/lite.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/precheck/main.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/precheck/manifests.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/precheck/scripts.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/ptk/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/ptk/apps/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/ptk/apps/ncdu.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/pycharm/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/pycharm/__main__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/pycharm/cli.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/pyproject/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/pyproject/__main__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/pyproject/cexts.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/pyproject/cli.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/pyproject/pkg.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/pyproject/reqs.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/revisions.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/scripts/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/scripts/bumpversion.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/scripts/execrss.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/scripts/exectime.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/scripts/importtrace.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/scripts/slowcat.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/scripts/tmpexec.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/secrets.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tokens.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/toml/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/toml/parser.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/toml/writer.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/cloc.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/doc.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/docker.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/git.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/importscan.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/json/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/json/__main__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/json/cli.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/json/formats.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/json/io.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/json/parsing.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/json/processing.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/json/rendering.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/mkrelimp.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/notebook.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/pawk/__init__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/pawk/__main__.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/pawk/pawk.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/pip.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/prof.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/qr.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/tools/sqlrepl.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev/wheelfile.py +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev.egg-info/dependency_links.txt +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev.egg-info/entry_points.txt +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/omdev.egg-info/top_level.txt +0 -0
- {omdev-0.0.0.dev180 → omdev-0.0.0.dev181}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: omdev
|
3
|
-
Version: 0.0.0.
|
3
|
+
Version: 0.0.0.dev181
|
4
4
|
Summary: omdev
|
5
5
|
Author: wrmsr
|
6
6
|
License: BSD-3-Clause
|
@@ -12,7 +12,7 @@ Classifier: Operating System :: OS Independent
|
|
12
12
|
Classifier: Operating System :: POSIX
|
13
13
|
Requires-Python: >=3.12
|
14
14
|
License-File: LICENSE
|
15
|
-
Requires-Dist: omlish==0.0.0.
|
15
|
+
Requires-Dist: omlish==0.0.0.dev181
|
16
16
|
Provides-Extra: all
|
17
17
|
Requires-Dist: black~=24.10; extra == "all"
|
18
18
|
Requires-Dist: pycparser~=2.22; extra == "all"
|
@@ -6,7 +6,6 @@ import sys
|
|
6
6
|
import typing as ta
|
7
7
|
|
8
8
|
from omlish.asyncs.asyncio.subprocesses import asyncio_subprocesses
|
9
|
-
from omlish.lite.logs import log
|
10
9
|
|
11
10
|
from ..packaging.versions import Version
|
12
11
|
from .types import InterpOpts
|
@@ -43,9 +42,15 @@ class InterpInspection:
|
|
43
42
|
|
44
43
|
|
45
44
|
class InterpInspector:
|
46
|
-
def __init__(
|
45
|
+
def __init__(
|
46
|
+
self,
|
47
|
+
*,
|
48
|
+
log: ta.Optional[logging.Logger] = None,
|
49
|
+
) -> None:
|
47
50
|
super().__init__()
|
48
51
|
|
52
|
+
self._log = log
|
53
|
+
|
49
54
|
self._cache: ta.Dict[str, ta.Optional[InterpInspection]] = {}
|
50
55
|
|
51
56
|
_RAW_INSPECTION_CODE = """
|
@@ -94,8 +99,8 @@ class InterpInspector:
|
|
94
99
|
try:
|
95
100
|
ret = await self._inspect(exe)
|
96
101
|
except Exception as e: # noqa
|
97
|
-
if
|
98
|
-
|
102
|
+
if self._log is not None and self._log.isEnabledFor(logging.DEBUG):
|
103
|
+
self._log.exception('Failed to inspect interp: %s', exe)
|
99
104
|
ret = None
|
100
105
|
self._cache[exe] = ret
|
101
106
|
return ret
|
@@ -5,13 +5,13 @@ TODO:
|
|
5
5
|
- check if path py's are venvs: sys.prefix != sys.base_prefix
|
6
6
|
"""
|
7
7
|
import dataclasses as dc
|
8
|
+
import logging
|
8
9
|
import os
|
9
10
|
import re
|
10
11
|
import typing as ta
|
11
12
|
|
12
13
|
from omlish.lite.cached import cached_nullary
|
13
14
|
from omlish.lite.check import check
|
14
|
-
from omlish.lite.logs import log
|
15
15
|
|
16
16
|
from ...packaging.versions import InvalidVersion
|
17
17
|
from ..inspect import InterpInspector
|
@@ -37,12 +37,14 @@ class SystemInterpProvider(InterpProvider):
|
|
37
37
|
options: Options = Options(),
|
38
38
|
*,
|
39
39
|
inspector: ta.Optional[InterpInspector] = None,
|
40
|
+
log: ta.Optional[logging.Logger] = None,
|
40
41
|
) -> None:
|
41
42
|
super().__init__()
|
42
43
|
|
43
44
|
self._options = options
|
44
45
|
|
45
46
|
self._inspector = inspector
|
47
|
+
self._log = log
|
46
48
|
|
47
49
|
#
|
48
50
|
|
@@ -116,7 +118,8 @@ class SystemInterpProvider(InterpProvider):
|
|
116
118
|
lst = []
|
117
119
|
for e in self.exes():
|
118
120
|
if (ev := await self.get_exe_version(e)) is None:
|
119
|
-
|
121
|
+
if self._log is not None:
|
122
|
+
self._log.debug('Invalid system version: %s', e)
|
120
123
|
continue
|
121
124
|
lst.append((e, ev))
|
122
125
|
return lst
|
@@ -13,6 +13,7 @@ TODO:
|
|
13
13
|
import abc
|
14
14
|
import dataclasses as dc
|
15
15
|
import itertools
|
16
|
+
import logging
|
16
17
|
import os.path
|
17
18
|
import shutil
|
18
19
|
import sys
|
@@ -22,7 +23,6 @@ from omlish.asyncs.asyncio.subprocesses import asyncio_subprocesses
|
|
22
23
|
from omlish.lite.cached import async_cached_nullary
|
23
24
|
from omlish.lite.cached import cached_nullary
|
24
25
|
from omlish.lite.check import check
|
25
|
-
from omlish.lite.logs import log
|
26
26
|
|
27
27
|
from ...packaging.versions import InvalidVersion
|
28
28
|
from ...packaging.versions import Version
|
@@ -355,6 +355,7 @@ class PyenvInterpProvider(InterpProvider):
|
|
355
355
|
*,
|
356
356
|
pyenv: Pyenv,
|
357
357
|
inspector: InterpInspector,
|
358
|
+
log: ta.Optional[logging.Logger] = None,
|
358
359
|
) -> None:
|
359
360
|
super().__init__()
|
360
361
|
|
@@ -362,6 +363,7 @@ class PyenvInterpProvider(InterpProvider):
|
|
362
363
|
|
363
364
|
self._pyenv = pyenv
|
364
365
|
self._inspector = inspector
|
366
|
+
self._log = log
|
365
367
|
|
366
368
|
#
|
367
369
|
|
@@ -406,7 +408,8 @@ class PyenvInterpProvider(InterpProvider):
|
|
406
408
|
ret: ta.List[PyenvInterpProvider.Installed] = []
|
407
409
|
for vn, ep in await self._pyenv.version_exes():
|
408
410
|
if (i := await self._make_installed(vn, ep)) is None:
|
409
|
-
|
411
|
+
if self._log is not None:
|
412
|
+
self._log.debug('Invalid pyenv version: %s', vn)
|
410
413
|
continue
|
411
414
|
ret.append(i)
|
412
415
|
return ret
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# ruff: noqa: UP006 UP007
|
2
|
-
import
|
2
|
+
import dataclasses as dc
|
3
|
+
import logging
|
3
4
|
import os.path
|
4
5
|
import typing as ta
|
5
6
|
|
@@ -7,36 +8,50 @@ from omlish.asyncs.asyncio.subprocesses import asyncio_subprocesses
|
|
7
8
|
from omlish.lite.cached import async_cached_nullary
|
8
9
|
from omlish.lite.cached import cached_nullary
|
9
10
|
from omlish.lite.check import check
|
10
|
-
from omlish.lite.
|
11
|
+
from omlish.lite.typing import Func2
|
11
12
|
|
12
|
-
from
|
13
|
-
from
|
14
|
-
from .configs import VenvConfig
|
15
|
-
from .reqs import RequirementsRewriter
|
13
|
+
from .default import get_default_interp_resolver
|
14
|
+
from .types import InterpSpecifier
|
16
15
|
|
17
16
|
|
18
17
|
##
|
19
18
|
|
20
19
|
|
21
|
-
|
20
|
+
@dc.dataclass(frozen=True)
|
21
|
+
class InterpVenvConfig:
|
22
|
+
interp: ta.Optional[str] = None
|
23
|
+
requires: ta.Optional[ta.Sequence[str]] = None
|
24
|
+
use_uv: ta.Optional[bool] = None
|
25
|
+
|
26
|
+
|
27
|
+
class InterpVenvRequirementsProcessor(Func2['InterpVenv', ta.Sequence[str], ta.Sequence[str]]):
|
28
|
+
pass
|
29
|
+
|
30
|
+
|
31
|
+
class InterpVenv:
|
22
32
|
def __init__(
|
23
33
|
self,
|
24
|
-
|
25
|
-
cfg:
|
34
|
+
path: str,
|
35
|
+
cfg: InterpVenvConfig,
|
36
|
+
*,
|
37
|
+
requirements_processor: ta.Optional[InterpVenvRequirementsProcessor] = None,
|
38
|
+
log: ta.Optional[logging.Logger] = None,
|
26
39
|
) -> None:
|
27
40
|
super().__init__()
|
28
|
-
|
41
|
+
|
42
|
+
self._path = path
|
29
43
|
self._cfg = cfg
|
30
44
|
|
31
|
-
|
32
|
-
|
33
|
-
return self._cfg
|
45
|
+
self._requirements_processor = requirements_processor
|
46
|
+
self._log = log
|
34
47
|
|
35
|
-
|
48
|
+
@property
|
49
|
+
def path(self) -> str:
|
50
|
+
return self._path
|
36
51
|
|
37
52
|
@property
|
38
|
-
def
|
39
|
-
return
|
53
|
+
def cfg(self) -> InterpVenvConfig:
|
54
|
+
return self._cfg
|
40
55
|
|
41
56
|
@async_cached_nullary
|
42
57
|
async def interp_exe(self) -> str:
|
@@ -45,19 +60,23 @@ class Venv:
|
|
45
60
|
|
46
61
|
@cached_nullary
|
47
62
|
def exe(self) -> str:
|
48
|
-
ve = os.path.join(self.
|
63
|
+
ve = os.path.join(self._path, 'bin/python')
|
49
64
|
if not os.path.isfile(ve):
|
50
65
|
raise Exception(f'venv exe {ve} does not exist or is not a file!')
|
51
66
|
return ve
|
52
67
|
|
53
68
|
@async_cached_nullary
|
54
69
|
async def create(self) -> bool:
|
55
|
-
if os.path.exists(dn := self.
|
70
|
+
if os.path.exists(dn := self._path):
|
56
71
|
if not os.path.isdir(dn):
|
57
72
|
raise Exception(f'{dn} exists but is not a directory!')
|
58
73
|
return False
|
59
74
|
|
60
|
-
|
75
|
+
ie = await self.interp_exe()
|
76
|
+
|
77
|
+
if self._log is not None:
|
78
|
+
self._log.info('Using interpreter %s', ie)
|
79
|
+
|
61
80
|
await asyncio_subprocesses.check_call(ie, '-m', 'venv', dn)
|
62
81
|
|
63
82
|
ve = self.exe()
|
@@ -74,8 +93,9 @@ class Venv:
|
|
74
93
|
)
|
75
94
|
|
76
95
|
if sr := self._cfg.requires:
|
77
|
-
|
78
|
-
|
96
|
+
reqs = list(sr)
|
97
|
+
if self._requirements_processor is not None:
|
98
|
+
reqs = list(self._requirements_processor(self, reqs))
|
79
99
|
|
80
100
|
# TODO: automatically try slower uv download when it fails? lol
|
81
101
|
# Caused by: Failed to download distribution due to network timeout. Try increasing UV_HTTP_TIMEOUT (current value: 30s). # noqa
|
@@ -92,23 +112,3 @@ class Venv:
|
|
92
112
|
)
|
93
113
|
|
94
114
|
return True
|
95
|
-
|
96
|
-
@staticmethod
|
97
|
-
def _resolve_srcs(raw: ta.List[str]) -> ta.List[str]:
|
98
|
-
out: list[str] = []
|
99
|
-
seen: ta.Set[str] = set()
|
100
|
-
for r in raw:
|
101
|
-
es: list[str]
|
102
|
-
if any(c in r for c in '*?'):
|
103
|
-
es = list(glob.glob(r, recursive=True))
|
104
|
-
else:
|
105
|
-
es = [r]
|
106
|
-
for e in es:
|
107
|
-
if e not in seen:
|
108
|
-
seen.add(e)
|
109
|
-
out.append(e)
|
110
|
-
return out
|
111
|
-
|
112
|
-
@cached_nullary
|
113
|
-
def srcs(self) -> ta.Sequence[str]:
|
114
|
-
return self._resolve_srcs(self._cfg.srcs or [])
|
@@ -4,15 +4,14 @@ import typing as ta
|
|
4
4
|
|
5
5
|
from omlish.lite.marshal import unmarshal_obj
|
6
6
|
|
7
|
+
from ..interp.venvs import InterpVenvConfig
|
8
|
+
|
7
9
|
|
8
10
|
@dc.dataclass(frozen=True)
|
9
|
-
class VenvConfig:
|
11
|
+
class VenvConfig(InterpVenvConfig):
|
10
12
|
inherits: ta.Optional[ta.Sequence[str]] = None
|
11
|
-
interp: ta.Optional[str] = None
|
12
|
-
requires: ta.Optional[ta.List[str]] = None
|
13
13
|
docker: ta.Optional[str] = None
|
14
14
|
srcs: ta.Optional[ta.List[str]] = None
|
15
|
-
use_uv: ta.Optional[bool] = None
|
16
15
|
|
17
16
|
|
18
17
|
@dc.dataclass(frozen=True)
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# ruff: noqa: UP006 UP007
|
2
|
+
import typing as ta
|
3
|
+
|
4
|
+
from omlish.lite.inject import InjectorBindingOrBindings
|
5
|
+
from omlish.lite.inject import InjectorBindings
|
6
|
+
from omlish.lite.inject import inj
|
7
|
+
|
8
|
+
|
9
|
+
def bind_pyproject() -> InjectorBindings:
|
10
|
+
lst: ta.List[InjectorBindingOrBindings] = []
|
11
|
+
|
12
|
+
return inj.as_bindings(*lst)
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# ruff: noqa: UP006 UP007
|
2
|
+
import glob
|
3
|
+
import os.path
|
4
|
+
import typing as ta
|
5
|
+
|
6
|
+
from omlish.lite.cached import async_cached_nullary
|
7
|
+
from omlish.lite.cached import cached_nullary
|
8
|
+
from omlish.lite.logs import log
|
9
|
+
|
10
|
+
from ..interp.venvs import InterpVenv
|
11
|
+
from ..interp.venvs import InterpVenvRequirementsProcessor
|
12
|
+
from .configs import VenvConfig
|
13
|
+
from .reqs import RequirementsRewriter
|
14
|
+
|
15
|
+
|
16
|
+
##
|
17
|
+
|
18
|
+
|
19
|
+
class Venv:
|
20
|
+
def __init__(
|
21
|
+
self,
|
22
|
+
name: str,
|
23
|
+
cfg: VenvConfig,
|
24
|
+
) -> None:
|
25
|
+
super().__init__()
|
26
|
+
self._name = name
|
27
|
+
self._cfg = cfg
|
28
|
+
|
29
|
+
@property
|
30
|
+
def cfg(self) -> VenvConfig:
|
31
|
+
return self._cfg
|
32
|
+
|
33
|
+
DIR_NAME = '.venvs'
|
34
|
+
|
35
|
+
@property
|
36
|
+
def dir_name(self) -> str:
|
37
|
+
return os.path.join(self.DIR_NAME, self._name)
|
38
|
+
|
39
|
+
@cached_nullary
|
40
|
+
def _iv(self) -> InterpVenv:
|
41
|
+
rr = RequirementsRewriter(self._name)
|
42
|
+
|
43
|
+
return InterpVenv(
|
44
|
+
self.dir_name,
|
45
|
+
self._cfg,
|
46
|
+
requirements_processor=InterpVenvRequirementsProcessor(
|
47
|
+
lambda iv, reqs: [rr.rewrite(req) for req in reqs] # noqa
|
48
|
+
),
|
49
|
+
log=log,
|
50
|
+
)
|
51
|
+
|
52
|
+
@cached_nullary
|
53
|
+
def exe(self) -> str:
|
54
|
+
return self._iv().exe()
|
55
|
+
|
56
|
+
@async_cached_nullary
|
57
|
+
async def create(self) -> bool:
|
58
|
+
return await self._iv().create()
|
59
|
+
|
60
|
+
@staticmethod
|
61
|
+
def _resolve_srcs(raw: ta.List[str]) -> ta.List[str]:
|
62
|
+
out: list[str] = []
|
63
|
+
seen: ta.Set[str] = set()
|
64
|
+
for r in raw:
|
65
|
+
es: list[str]
|
66
|
+
if any(c in r for c in '*?'):
|
67
|
+
es = list(glob.glob(r, recursive=True))
|
68
|
+
else:
|
69
|
+
es = [r]
|
70
|
+
for e in es:
|
71
|
+
if e not in seen:
|
72
|
+
seen.add(e)
|
73
|
+
out.append(e)
|
74
|
+
return out
|
75
|
+
|
76
|
+
@cached_nullary
|
77
|
+
def srcs(self) -> ta.Sequence[str]:
|
78
|
+
return self._resolve_srcs(self._cfg.srcs or [])
|
@@ -1050,13 +1050,6 @@ json_dump_compact: ta.Callable[..., bytes] = functools.partial(json.dump, **JSON
|
|
1050
1050
|
json_dumps_compact: ta.Callable[..., str] = functools.partial(json.dumps, **JSON_COMPACT_KWARGS)
|
1051
1051
|
|
1052
1052
|
|
1053
|
-
########################################
|
1054
|
-
# ../../../omlish/lite/logs.py
|
1055
|
-
|
1056
|
-
|
1057
|
-
log = logging.getLogger(__name__)
|
1058
|
-
|
1059
|
-
|
1060
1053
|
########################################
|
1061
1054
|
# ../../../omlish/lite/maybes.py
|
1062
1055
|
|
@@ -4205,9 +4198,15 @@ class InterpInspection:
|
|
4205
4198
|
|
4206
4199
|
|
4207
4200
|
class InterpInspector:
|
4208
|
-
def __init__(
|
4201
|
+
def __init__(
|
4202
|
+
self,
|
4203
|
+
*,
|
4204
|
+
log: ta.Optional[logging.Logger] = None,
|
4205
|
+
) -> None:
|
4209
4206
|
super().__init__()
|
4210
4207
|
|
4208
|
+
self._log = log
|
4209
|
+
|
4211
4210
|
self._cache: ta.Dict[str, ta.Optional[InterpInspection]] = {}
|
4212
4211
|
|
4213
4212
|
_RAW_INSPECTION_CODE = """
|
@@ -4256,8 +4255,8 @@ class InterpInspector:
|
|
4256
4255
|
try:
|
4257
4256
|
ret = await self._inspect(exe)
|
4258
4257
|
except Exception as e: # noqa
|
4259
|
-
if
|
4260
|
-
|
4258
|
+
if self._log is not None and self._log.isEnabledFor(logging.DEBUG):
|
4259
|
+
self._log.exception('Failed to inspect interp: %s', exe)
|
4261
4260
|
ret = None
|
4262
4261
|
self._cache[exe] = ret
|
4263
4262
|
return ret
|
@@ -4397,12 +4396,14 @@ class SystemInterpProvider(InterpProvider):
|
|
4397
4396
|
options: Options = Options(),
|
4398
4397
|
*,
|
4399
4398
|
inspector: ta.Optional[InterpInspector] = None,
|
4399
|
+
log: ta.Optional[logging.Logger] = None,
|
4400
4400
|
) -> None:
|
4401
4401
|
super().__init__()
|
4402
4402
|
|
4403
4403
|
self._options = options
|
4404
4404
|
|
4405
4405
|
self._inspector = inspector
|
4406
|
+
self._log = log
|
4406
4407
|
|
4407
4408
|
#
|
4408
4409
|
|
@@ -4476,7 +4477,8 @@ class SystemInterpProvider(InterpProvider):
|
|
4476
4477
|
lst = []
|
4477
4478
|
for e in self.exes():
|
4478
4479
|
if (ev := await self.get_exe_version(e)) is None:
|
4479
|
-
|
4480
|
+
if self._log is not None:
|
4481
|
+
self._log.debug('Invalid system version: %s', e)
|
4480
4482
|
continue
|
4481
4483
|
lst.append((e, ev))
|
4482
4484
|
return lst
|
@@ -4833,6 +4835,7 @@ class PyenvInterpProvider(InterpProvider):
|
|
4833
4835
|
*,
|
4834
4836
|
pyenv: Pyenv,
|
4835
4837
|
inspector: InterpInspector,
|
4838
|
+
log: ta.Optional[logging.Logger] = None,
|
4836
4839
|
) -> None:
|
4837
4840
|
super().__init__()
|
4838
4841
|
|
@@ -4840,6 +4843,7 @@ class PyenvInterpProvider(InterpProvider):
|
|
4840
4843
|
|
4841
4844
|
self._pyenv = pyenv
|
4842
4845
|
self._inspector = inspector
|
4846
|
+
self._log = log
|
4843
4847
|
|
4844
4848
|
#
|
4845
4849
|
|
@@ -4884,7 +4888,8 @@ class PyenvInterpProvider(InterpProvider):
|
|
4884
4888
|
ret: ta.List[PyenvInterpProvider.Installed] = []
|
4885
4889
|
for vn, ep in await self._pyenv.version_exes():
|
4886
4890
|
if (i := await self._make_installed(vn, ep)) is None:
|
4887
|
-
|
4891
|
+
if self._log is not None:
|
4892
|
+
self._log.debug('Invalid pyenv version: %s', vn)
|
4888
4893
|
continue
|
4889
4894
|
ret.append(i)
|
4890
4895
|
return ret
|