ipymini 0.1.0__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.
- ipymini-0.1.0/.github/workflows/release.yml +22 -0
- ipymini-0.1.0/.gitignore +157 -0
- ipymini-0.1.0/.uv-cache/.gitignore +1 -0
- ipymini-0.1.0/.uv-cache/.lock +0 -0
- ipymini-0.1.0/.uv-cache/CACHEDIR.TAG +1 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/__about__.py +1 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/__main__.py +6 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/bridge/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/bridge/app.py +111 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/build.py +144 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/app.py +20 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/binary.py +202 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/config.py +864 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/constants.py +43 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/custom.py +54 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/hooks/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/hooks/custom.py +41 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/hooks/plugin/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/hooks/plugin/hooks.py +15 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/hooks/plugin/interface.py +148 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/hooks/version.py +71 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/macos.py +58 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/plugin/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/plugin/hooks.py +18 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/plugin/interface.py +443 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/sdist.py +357 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/utils.py +128 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/wheel.py +870 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/cli/__init__.py +28 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/cli/dep/__init__.py +37 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/cli/dep/core.py +132 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/cli/metadata/__init__.py +58 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/cli/version/__init__.py +51 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/dep/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/dep/core.py +1 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/licenses/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/licenses/supported.py +1 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/metadata/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/metadata/core.py +1621 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/metadata/custom.py +41 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/metadata/plugin/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/metadata/plugin/hooks.py +14 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/metadata/plugin/interface.py +66 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/metadata/spec.py +600 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/metadata/utils.py +66 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/ouroboros.py +52 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/plugin/__init__.py +3 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/plugin/exceptions.py +2 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/plugin/manager.py +114 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/plugin/specs.py +23 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/plugin/utils.py +48 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/py.typed +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/utils/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/utils/constants.py +6 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/utils/context.py +173 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/utils/fs.py +26 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/core.py +58 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/scheme/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/scheme/plugin/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/scheme/plugin/hooks.py +14 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/scheme/plugin/interface.py +85 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/scheme/standard.py +98 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/source/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/source/code.py +64 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/source/env.py +29 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/source/plugin/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/source/plugin/hooks.py +16 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/source/plugin/interface.py +69 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/source/regex.py +29 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling-1.28.0.dist-info/METADATA +79 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling-1.28.0.dist-info/RECORD +73 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling-1.28.0.dist-info/WHEEL +4 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling-1.28.0.dist-info/entry_points.txt +2 -0
- ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling-1.28.0.dist-info/licenses/LICENSE.txt +9 -0
- ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers/__init__.py +921 -0
- ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers/__main__.py +10 -0
- ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers/py.typed +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers-2026.1.14.14.dist-info/METADATA +82 -0
- ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers-2026.1.14.14.dist-info/RECORD +9 -0
- ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers-2026.1.14.14.dist-info/WHEEL +5 -0
- ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers-2026.1.14.14.dist-info/entry_points.txt +2 -0
- ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers-2026.1.14.14.dist-info/licenses/LICENSE +201 -0
- ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers-2026.1.14.14.dist-info/top_level.txt +1 -0
- ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/__init__.py +30 -0
- ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/_callers.py +169 -0
- ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/_hooks.py +714 -0
- ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/_manager.py +523 -0
- ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/_result.py +107 -0
- ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/_tracing.py +72 -0
- ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/_version.py +21 -0
- ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/_warnings.py +27 -0
- ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/py.typed +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy-1.6.0.dist-info/METADATA +152 -0
- ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy-1.6.0.dist-info/RECORD +14 -0
- ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy-1.6.0.dist-info/WHEEL +5 -0
- ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy-1.6.0.dist-info/licenses/LICENSE +21 -0
- ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy-1.6.0.dist-info/top_level.txt +1 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/__init__.py +15 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/_elffile.py +108 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/_manylinux.py +262 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/_musllinux.py +85 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/_parser.py +365 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/_structures.py +69 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/_tokenizer.py +193 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/licenses/__init__.py +147 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/licenses/_spdx.py +799 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/markers.py +388 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/metadata.py +978 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/py.typed +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/pylock.py +635 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/requirements.py +86 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/specifiers.py +1068 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/tags.py +651 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/utils.py +158 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/version.py +792 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging-26.0.dist-info/METADATA +107 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging-26.0.dist-info/RECORD +24 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging-26.0.dist-info/WHEEL +4 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging-26.0.dist-info/licenses/LICENSE +3 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging-26.0.dist-info/licenses/LICENSE.APACHE +177 -0
- ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging-26.0.dist-info/licenses/LICENSE.BSD +23 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/__init__.py +68 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/__init__.py +4 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/_utils.py +45 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/agg.py +104 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/hyperscan/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/hyperscan/_base.py +78 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/hyperscan/base.py +24 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/hyperscan/gitignore.py +245 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/hyperscan/pathspec.py +251 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/re2/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/re2/_base.py +81 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/re2/base.py +23 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/re2/gitignore.py +179 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/re2/pathspec.py +187 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/simple/__init__.py +0 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/simple/gitignore.py +104 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/simple/pathspec.py +76 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_meta.py +66 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_typing.py +64 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_version.py +5 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/backend.py +40 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/gitignore.py +165 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/pathspec.py +460 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/pattern.py +241 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/patterns/__init__.py +12 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/patterns/gitignore/__init__.py +17 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/patterns/gitignore/base.py +176 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/patterns/gitignore/basic.py +317 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/patterns/gitignore/spec.py +335 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/patterns/gitwildmatch.py +52 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/py.typed +1 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/util.py +847 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec-1.0.3.dist-info/METADATA +348 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec-1.0.3.dist-info/RECORD +36 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec-1.0.3.dist-info/WHEEL +4 -0
- ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec-1.0.3.dist-info/licenses/LICENSE +373 -0
- ipymini-0.1.0/.uv-cache/interpreter-v4/690e8bc5fc3a5e7e/ccf55d6a6a96f032.msgpack +0 -0
- ipymini-0.1.0/.uv-cache/interpreter-v4/690e8bc5fc3a5e7e/ee97c511db354a81.msgpack +0 -0
- ipymini-0.1.0/.uv-cache/sdists-v9/.git +0 -0
- ipymini-0.1.0/.uv-cache/sdists-v9/.gitignore +0 -0
- ipymini-0.1.0/.uv-cache/simple-v18/pypi/hatchling.rkyv +0 -0
- ipymini-0.1.0/.uv-cache/simple-v18/pypi/packaging.rkyv +0 -0
- ipymini-0.1.0/.uv-cache/simple-v18/pypi/pathspec.rkyv +0 -0
- ipymini-0.1.0/.uv-cache/simple-v18/pypi/pluggy.rkyv +0 -0
- ipymini-0.1.0/.uv-cache/simple-v18/pypi/trove-classifiers.rkyv +0 -0
- ipymini-0.1.0/.uv-cache/wheels-v5/pypi/hatchling/1.28.0-py3-none-any.http +0 -0
- ipymini-0.1.0/.uv-cache/wheels-v5/pypi/hatchling/1.28.0-py3-none-any.msgpack +0 -0
- ipymini-0.1.0/.uv-cache/wheels-v5/pypi/packaging/26.0-py3-none-any.http +0 -0
- ipymini-0.1.0/.uv-cache/wheels-v5/pypi/packaging/26.0-py3-none-any.msgpack +0 -0
- ipymini-0.1.0/.uv-cache/wheels-v5/pypi/pathspec/1.0.3-py3-none-any.http +0 -0
- ipymini-0.1.0/.uv-cache/wheels-v5/pypi/pathspec/1.0.3-py3-none-any.msgpack +0 -0
- ipymini-0.1.0/.uv-cache/wheels-v5/pypi/pluggy/1.6.0-py3-none-any.http +0 -0
- ipymini-0.1.0/.uv-cache/wheels-v5/pypi/pluggy/1.6.0-py3-none-any.msgpack +0 -0
- ipymini-0.1.0/.uv-cache/wheels-v5/pypi/trove-classifiers/2026.1.14.14-py3-none-any.http +0 -0
- ipymini-0.1.0/.uv-cache/wheels-v5/pypi/trove-classifiers/2026.1.14.14-py3-none-any.msgpack +0 -0
- ipymini-0.1.0/DEVLOG.md +65 -0
- ipymini-0.1.0/PKG-INFO +265 -0
- ipymini-0.1.0/README.md +238 -0
- ipymini-0.1.0/ipymini/__init__.py +8 -0
- ipymini-0.1.0/ipymini/__main__.py +55 -0
- ipymini-0.1.0/ipymini/bridge.py +925 -0
- ipymini-0.1.0/ipymini/comms.py +69 -0
- ipymini-0.1.0/ipymini/kernel.py +783 -0
- ipymini-0.1.0/ipymini/murmur2.py +32 -0
- ipymini-0.1.0/ipymini_bridge.py +4 -0
- ipymini-0.1.0/pyproject.toml +48 -0
- ipymini-0.1.0/pytest.ini +7 -0
- ipymini-0.1.0/pytests/__init__.py +0 -0
- ipymini-0.1.0/pytests/conftest.py +4 -0
- ipymini-0.1.0/pytests/kernel_utils.py +206 -0
- ipymini-0.1.0/pytests/test_debugger_suite.py +183 -0
- ipymini-0.1.0/pytests/test_gateway_interrupt.py +67 -0
- ipymini-0.1.0/pytests/test_ipython_startup_integration.py +35 -0
- ipymini-0.1.0/pytests/test_kernel_asyncio.py +45 -0
- ipymini-0.1.0/pytests/test_kernel_basic.py +10 -0
- ipymini-0.1.0/pytests/test_kernel_comm_buffers.py +60 -0
- ipymini-0.1.0/pytests/test_kernel_completion.py +29 -0
- ipymini-0.1.0/pytests/test_kernel_completion_config.py +38 -0
- ipymini-0.1.0/pytests/test_kernel_connect.py +17 -0
- ipymini-0.1.0/pytests/test_kernel_debug.py +12 -0
- ipymini-0.1.0/pytests/test_kernel_display.py +40 -0
- ipymini-0.1.0/pytests/test_kernel_e2e.py +132 -0
- ipymini-0.1.0/pytests/test_kernel_execute.py +107 -0
- ipymini-0.1.0/pytests/test_kernel_heartbeat.py +17 -0
- ipymini-0.1.0/pytests/test_kernel_history_inspect.py +46 -0
- ipymini-0.1.0/pytests/test_kernel_info_fields.py +16 -0
- ipymini-0.1.0/pytests/test_kernel_input.py +96 -0
- ipymini-0.1.0/pytests/test_kernel_interrupt.py +39 -0
- ipymini-0.1.0/pytests/test_kernel_iopub.py +84 -0
- ipymini-0.1.0/pytests/test_kernel_minimal_behaviors.py +107 -0
- ipymini-0.1.0/pytests/test_kernel_outputs.py +63 -0
- ipymini-0.1.0/pytests/test_kernel_streams.py +19 -0
- ipymini-0.1.0/pytests/test_kernel_subshells.py +377 -0
- ipymini-0.1.0/pytests/test_kernelspec.py +27 -0
- ipymini-0.1.0/pytests/test_message_headers.py +37 -0
- ipymini-0.1.0/pytests/test_murmur2.py +18 -0
- ipymini-0.1.0/pytests/test_streams.py +37 -0
- ipymini-0.1.0/share/jupyter/kernels/ipymini/kernel.json +6 -0
- ipymini-0.1.0/tools/pr.sh +15 -0
- ipymini-0.1.0/tools/release.sh +20 -0
- ipymini-0.1.0/tools/run_file_suites.sh +11 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
tags: ["v*"]
|
|
5
|
+
|
|
6
|
+
jobs:
|
|
7
|
+
pypi:
|
|
8
|
+
runs-on: ubuntu-latest
|
|
9
|
+
permissions:
|
|
10
|
+
id-token: write
|
|
11
|
+
contents: write
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
- uses: actions/setup-python@v5
|
|
15
|
+
with:
|
|
16
|
+
python-version: "3.12"
|
|
17
|
+
- run: pip install hatch
|
|
18
|
+
- run: hatch build
|
|
19
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
20
|
+
- run: gh release create ${{ github.ref_name }} --generate-notes
|
|
21
|
+
env:
|
|
22
|
+
GH_TOKEN: ${{ github.token }}
|
ipymini-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
EVENTLOOP.md
|
|
2
|
+
meta/
|
|
3
|
+
REVIEW.md
|
|
4
|
+
_docs
|
|
5
|
+
DAP.md
|
|
6
|
+
DEBUG.md
|
|
7
|
+
SUBSHELL.md
|
|
8
|
+
links/
|
|
9
|
+
gateway.py
|
|
10
|
+
style.md
|
|
11
|
+
Untitled*.ipynb
|
|
12
|
+
|
|
13
|
+
_proc/
|
|
14
|
+
sidebar.yml
|
|
15
|
+
Gemfile.lock
|
|
16
|
+
token
|
|
17
|
+
_docs/
|
|
18
|
+
conda/
|
|
19
|
+
.last_checked
|
|
20
|
+
.gitconfig
|
|
21
|
+
*.bak
|
|
22
|
+
*.log
|
|
23
|
+
*~
|
|
24
|
+
~*
|
|
25
|
+
_tmp*
|
|
26
|
+
tmp*
|
|
27
|
+
tags
|
|
28
|
+
|
|
29
|
+
# Byte-compiled / optimized / DLL files
|
|
30
|
+
__pycache__/
|
|
31
|
+
*.py[cod]
|
|
32
|
+
*$py.class
|
|
33
|
+
|
|
34
|
+
# C extensions
|
|
35
|
+
*.so
|
|
36
|
+
|
|
37
|
+
# Distribution / packaging
|
|
38
|
+
.Python
|
|
39
|
+
env/
|
|
40
|
+
build/
|
|
41
|
+
develop-eggs/
|
|
42
|
+
dist/
|
|
43
|
+
downloads/
|
|
44
|
+
eggs/
|
|
45
|
+
.eggs/
|
|
46
|
+
lib/
|
|
47
|
+
lib64/
|
|
48
|
+
parts/
|
|
49
|
+
sdist/
|
|
50
|
+
var/
|
|
51
|
+
wheels/
|
|
52
|
+
*.egg-info/
|
|
53
|
+
.installed.cfg
|
|
54
|
+
*.egg
|
|
55
|
+
|
|
56
|
+
# PyInstaller
|
|
57
|
+
# Usually these files are written by a python script from a template
|
|
58
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
59
|
+
*.manifest
|
|
60
|
+
*.spec
|
|
61
|
+
|
|
62
|
+
# Installer logs
|
|
63
|
+
pip-log.txt
|
|
64
|
+
pip-delete-this-directory.txt
|
|
65
|
+
|
|
66
|
+
# Unit test / coverage reports
|
|
67
|
+
htmlcov/
|
|
68
|
+
.tox/
|
|
69
|
+
.coverage
|
|
70
|
+
.coverage.*
|
|
71
|
+
.cache
|
|
72
|
+
nosetests.xml
|
|
73
|
+
coverage.xml
|
|
74
|
+
*.cover
|
|
75
|
+
.hypothesis/
|
|
76
|
+
|
|
77
|
+
# Translations
|
|
78
|
+
*.mo
|
|
79
|
+
*.pot
|
|
80
|
+
|
|
81
|
+
# Django stuff:
|
|
82
|
+
*.log
|
|
83
|
+
local_settings.py
|
|
84
|
+
|
|
85
|
+
# Flask stuff:
|
|
86
|
+
instance/
|
|
87
|
+
.webassets-cache
|
|
88
|
+
|
|
89
|
+
# Scrapy stuff:
|
|
90
|
+
.scrapy
|
|
91
|
+
|
|
92
|
+
# Sphinx documentation
|
|
93
|
+
docs/_build/
|
|
94
|
+
|
|
95
|
+
# PyBuilder
|
|
96
|
+
target/
|
|
97
|
+
|
|
98
|
+
# Jupyter Notebook
|
|
99
|
+
.ipynb_checkpoints
|
|
100
|
+
|
|
101
|
+
# pyenv
|
|
102
|
+
.python-version
|
|
103
|
+
|
|
104
|
+
# celery beat schedule file
|
|
105
|
+
celerybeat-schedule
|
|
106
|
+
|
|
107
|
+
# SageMath parsed files
|
|
108
|
+
*.sage.py
|
|
109
|
+
|
|
110
|
+
# dotenv
|
|
111
|
+
.env
|
|
112
|
+
|
|
113
|
+
# virtualenv
|
|
114
|
+
.venv
|
|
115
|
+
venv/
|
|
116
|
+
ENV/
|
|
117
|
+
|
|
118
|
+
# Spyder project settings
|
|
119
|
+
.spyderproject
|
|
120
|
+
.spyproject
|
|
121
|
+
|
|
122
|
+
# Rope project settings
|
|
123
|
+
.ropeproject
|
|
124
|
+
|
|
125
|
+
# mkdocs documentation
|
|
126
|
+
/site
|
|
127
|
+
|
|
128
|
+
# mypy
|
|
129
|
+
.mypy_cache/
|
|
130
|
+
|
|
131
|
+
.vscode
|
|
132
|
+
*.swp
|
|
133
|
+
|
|
134
|
+
# osx generated files
|
|
135
|
+
.DS_Store
|
|
136
|
+
.DS_Store?
|
|
137
|
+
.Trashes
|
|
138
|
+
ehthumbs.db
|
|
139
|
+
Thumbs.db
|
|
140
|
+
.idea
|
|
141
|
+
|
|
142
|
+
# pytest
|
|
143
|
+
.pytest_cache
|
|
144
|
+
|
|
145
|
+
# tools/trust-doc-nbs
|
|
146
|
+
docs_src/.last_checked
|
|
147
|
+
|
|
148
|
+
# symlinks to fastai
|
|
149
|
+
docs_src/fastai
|
|
150
|
+
tools/fastai
|
|
151
|
+
|
|
152
|
+
# link checker
|
|
153
|
+
checklink/cookies.txt
|
|
154
|
+
|
|
155
|
+
# .gitconfig is now autogenerated
|
|
156
|
+
.gitconfig
|
|
157
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Signature: 8a477f597d28d172789f06886806bc55
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.28.0"
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Application:
|
|
9
|
+
"""
|
|
10
|
+
The way output is displayed can be [configured](../config/hatch.md#terminal) by users.
|
|
11
|
+
|
|
12
|
+
!!! important
|
|
13
|
+
Never import this directly; Hatch judiciously decides if a type of plugin requires
|
|
14
|
+
the capabilities herein and will grant access via an attribute.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def __init__(self) -> None:
|
|
18
|
+
self.__verbosity = int(os.environ.get("HATCH_VERBOSE", "0")) - int(os.environ.get("HATCH_QUIET", "0"))
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def verbosity(self) -> int:
|
|
22
|
+
"""
|
|
23
|
+
The verbosity level of the application, with 0 as the default.
|
|
24
|
+
"""
|
|
25
|
+
return self.__verbosity
|
|
26
|
+
|
|
27
|
+
@staticmethod
|
|
28
|
+
def display(message: str = "", **kwargs: Any) -> None: # noqa: ARG004
|
|
29
|
+
# Do not document
|
|
30
|
+
_display(message, always=True)
|
|
31
|
+
|
|
32
|
+
def display_info(self, message: str = "", **kwargs: Any) -> None: # noqa: ARG002
|
|
33
|
+
"""
|
|
34
|
+
Meant to be used for messages conveying basic information.
|
|
35
|
+
"""
|
|
36
|
+
if self.__verbosity >= 0:
|
|
37
|
+
_display(message)
|
|
38
|
+
|
|
39
|
+
def display_waiting(self, message: str = "", **kwargs: Any) -> None: # noqa: ARG002
|
|
40
|
+
"""
|
|
41
|
+
Meant to be used for messages shown before potentially time consuming operations.
|
|
42
|
+
"""
|
|
43
|
+
if self.__verbosity >= 0:
|
|
44
|
+
_display(message)
|
|
45
|
+
|
|
46
|
+
def display_success(self, message: str = "", **kwargs: Any) -> None: # noqa: ARG002
|
|
47
|
+
"""
|
|
48
|
+
Meant to be used for messages indicating some positive outcome.
|
|
49
|
+
"""
|
|
50
|
+
if self.__verbosity >= 0:
|
|
51
|
+
_display(message)
|
|
52
|
+
|
|
53
|
+
def display_warning(self, message: str = "", **kwargs: Any) -> None: # noqa: ARG002
|
|
54
|
+
"""
|
|
55
|
+
Meant to be used for messages conveying important information.
|
|
56
|
+
"""
|
|
57
|
+
if self.__verbosity >= -1:
|
|
58
|
+
_display(message)
|
|
59
|
+
|
|
60
|
+
def display_error(self, message: str = "", **kwargs: Any) -> None: # noqa: ARG002
|
|
61
|
+
"""
|
|
62
|
+
Meant to be used for messages indicating some unrecoverable error.
|
|
63
|
+
"""
|
|
64
|
+
if self.__verbosity >= -2: # noqa: PLR2004
|
|
65
|
+
_display(message)
|
|
66
|
+
|
|
67
|
+
def display_debug(self, message: str = "", level: int = 1, **kwargs: Any) -> None: # noqa: ARG002
|
|
68
|
+
"""
|
|
69
|
+
Meant to be used for messages that are not useful for most user experiences.
|
|
70
|
+
The `level` option must be between 1 and 3 (inclusive).
|
|
71
|
+
"""
|
|
72
|
+
if not 1 <= level <= 3: # noqa: PLR2004
|
|
73
|
+
error_message = "Debug output can only have verbosity levels between 1 and 3 (inclusive)"
|
|
74
|
+
raise ValueError(error_message)
|
|
75
|
+
|
|
76
|
+
if self.__verbosity >= level:
|
|
77
|
+
_display(message)
|
|
78
|
+
|
|
79
|
+
def display_mini_header(self, message: str = "", **kwargs: Any) -> None: # noqa: ARG002
|
|
80
|
+
if self.__verbosity >= 0:
|
|
81
|
+
_display(f"[{message}]")
|
|
82
|
+
|
|
83
|
+
def abort(self, message: str = "", code: int = 1, **kwargs: Any) -> None: # noqa: ARG002
|
|
84
|
+
"""
|
|
85
|
+
Terminate the program with the given return code.
|
|
86
|
+
"""
|
|
87
|
+
if message and self.__verbosity >= -2: # noqa: PLR2004
|
|
88
|
+
_display(message)
|
|
89
|
+
|
|
90
|
+
sys.exit(code)
|
|
91
|
+
|
|
92
|
+
def get_safe_application(self) -> SafeApplication:
|
|
93
|
+
return SafeApplication(self)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class SafeApplication:
|
|
97
|
+
def __init__(self, app: Application) -> None:
|
|
98
|
+
self.abort = app.abort
|
|
99
|
+
self.verbosity = app.verbosity
|
|
100
|
+
self.display = app.display
|
|
101
|
+
self.display_info = app.display_info
|
|
102
|
+
self.display_error = app.display_error
|
|
103
|
+
self.display_success = app.display_success
|
|
104
|
+
self.display_waiting = app.display_waiting
|
|
105
|
+
self.display_warning = app.display_warning
|
|
106
|
+
self.display_debug = app.display_debug
|
|
107
|
+
self.display_mini_header = app.display_mini_header
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _display(message: str, *, always: bool = False) -> None:
|
|
111
|
+
print(message, file=None if always else sys.stderr)
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"build_editable",
|
|
8
|
+
"build_sdist",
|
|
9
|
+
"build_wheel",
|
|
10
|
+
"get_requires_for_build_editable",
|
|
11
|
+
"get_requires_for_build_sdist",
|
|
12
|
+
"get_requires_for_build_wheel",
|
|
13
|
+
]
|
|
14
|
+
__all__ += ["__all__"]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def get_requires_for_build_sdist(config_settings: dict[str, Any] | None = None) -> list[str]: # noqa: ARG001
|
|
18
|
+
"""
|
|
19
|
+
https://peps.python.org/pep-0517/#get-requires-for-build-sdist
|
|
20
|
+
"""
|
|
21
|
+
from hatchling.builders.sdist import SdistBuilder
|
|
22
|
+
|
|
23
|
+
builder = SdistBuilder(os.getcwd())
|
|
24
|
+
return builder.config.dependencies
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def build_sdist(sdist_directory: str, config_settings: dict[str, Any] | None = None) -> str: # noqa: ARG001
|
|
28
|
+
"""
|
|
29
|
+
https://peps.python.org/pep-0517/#build-sdist
|
|
30
|
+
"""
|
|
31
|
+
from hatchling.builders.sdist import SdistBuilder
|
|
32
|
+
|
|
33
|
+
builder = SdistBuilder(os.getcwd())
|
|
34
|
+
return os.path.basename(next(builder.build(directory=sdist_directory, versions=["standard"])))
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def get_requires_for_build_wheel(config_settings: dict[str, Any] | None = None) -> list[str]: # noqa: ARG001
|
|
38
|
+
"""
|
|
39
|
+
https://peps.python.org/pep-0517/#get-requires-for-build-wheel
|
|
40
|
+
"""
|
|
41
|
+
from hatchling.builders.wheel import WheelBuilder
|
|
42
|
+
|
|
43
|
+
builder = WheelBuilder(os.getcwd())
|
|
44
|
+
return builder.config.dependencies
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def build_wheel(
|
|
48
|
+
wheel_directory: str,
|
|
49
|
+
config_settings: dict[str, Any] | None = None, # noqa: ARG001
|
|
50
|
+
metadata_directory: str | None = None, # noqa: ARG001
|
|
51
|
+
) -> str:
|
|
52
|
+
"""
|
|
53
|
+
https://peps.python.org/pep-0517/#build-wheel
|
|
54
|
+
"""
|
|
55
|
+
from hatchling.builders.wheel import WheelBuilder
|
|
56
|
+
|
|
57
|
+
builder = WheelBuilder(os.getcwd())
|
|
58
|
+
return os.path.basename(next(builder.build(directory=wheel_directory, versions=["standard"])))
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def get_requires_for_build_editable(config_settings: dict[str, Any] | None = None) -> list[str]: # noqa: ARG001
|
|
62
|
+
"""
|
|
63
|
+
https://peps.python.org/pep-0660/#get-requires-for-build-editable
|
|
64
|
+
"""
|
|
65
|
+
from hatchling.builders.constants import EDITABLES_REQUIREMENT
|
|
66
|
+
from hatchling.builders.wheel import WheelBuilder
|
|
67
|
+
|
|
68
|
+
builder = WheelBuilder(os.getcwd())
|
|
69
|
+
return [*builder.config.dependencies, EDITABLES_REQUIREMENT]
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def build_editable(
|
|
73
|
+
wheel_directory: str,
|
|
74
|
+
config_settings: dict[str, Any] | None = None, # noqa: ARG001
|
|
75
|
+
metadata_directory: str | None = None, # noqa: ARG001
|
|
76
|
+
) -> str:
|
|
77
|
+
"""
|
|
78
|
+
https://peps.python.org/pep-0660/#build-editable
|
|
79
|
+
"""
|
|
80
|
+
from hatchling.builders.wheel import WheelBuilder
|
|
81
|
+
|
|
82
|
+
builder = WheelBuilder(os.getcwd())
|
|
83
|
+
return os.path.basename(next(builder.build(directory=wheel_directory, versions=["editable"])))
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
# Any builder that has build-time hooks like Hatchling and setuptools cannot technically keep PEP 517's identical
|
|
87
|
+
# metadata promise e.g. C extensions would require different tags in the `WHEEL` file. Therefore, we consider the
|
|
88
|
+
# methods as mostly being for non-frontend tools like tox and dependency updaters. So Hatchling only writes the
|
|
89
|
+
# `METADATA` file to the metadata directory and continues to ignore that directory itself.
|
|
90
|
+
#
|
|
91
|
+
# An issue we encounter by supporting this metadata-only access is that for installations with pip the required
|
|
92
|
+
# dependencies of the project are read at this stage. This means that build hooks that add to the `dependencies`
|
|
93
|
+
# build data or modify the built wheel have no effect on what dependencies are or are not installed.
|
|
94
|
+
#
|
|
95
|
+
# There are legitimate use cases in which this is required, so we only define these when no pip build is detected.
|
|
96
|
+
# See: https://github.com/pypa/pip/blob/22.2.2/src/pip/_internal/operations/build/build_tracker.py#L41-L51
|
|
97
|
+
# Example use case: https://github.com/pypa/hatch/issues/532
|
|
98
|
+
if "PIP_BUILD_TRACKER" not in os.environ:
|
|
99
|
+
__all__ += ["prepare_metadata_for_build_editable", "prepare_metadata_for_build_wheel"]
|
|
100
|
+
|
|
101
|
+
def prepare_metadata_for_build_wheel(
|
|
102
|
+
metadata_directory: str,
|
|
103
|
+
config_settings: dict[str, Any] | None = None, # noqa: ARG001
|
|
104
|
+
) -> str:
|
|
105
|
+
"""
|
|
106
|
+
https://peps.python.org/pep-0517/#prepare-metadata-for-build-wheel
|
|
107
|
+
"""
|
|
108
|
+
from hatchling.builders.wheel import WheelBuilder
|
|
109
|
+
|
|
110
|
+
builder = WheelBuilder(os.getcwd())
|
|
111
|
+
|
|
112
|
+
directory = os.path.join(metadata_directory, f"{builder.artifact_project_id}.dist-info")
|
|
113
|
+
if not os.path.isdir(directory):
|
|
114
|
+
os.mkdir(directory)
|
|
115
|
+
|
|
116
|
+
with open(os.path.join(directory, "METADATA"), "w", encoding="utf-8") as f:
|
|
117
|
+
f.write(builder.config.core_metadata_constructor(builder.metadata))
|
|
118
|
+
|
|
119
|
+
return os.path.basename(directory)
|
|
120
|
+
|
|
121
|
+
def prepare_metadata_for_build_editable(
|
|
122
|
+
metadata_directory: str,
|
|
123
|
+
config_settings: dict[str, Any] | None = None, # noqa: ARG001
|
|
124
|
+
) -> str:
|
|
125
|
+
"""
|
|
126
|
+
https://peps.python.org/pep-0660/#prepare-metadata-for-build-editable
|
|
127
|
+
"""
|
|
128
|
+
from hatchling.builders.constants import EDITABLES_REQUIREMENT
|
|
129
|
+
from hatchling.builders.wheel import WheelBuilder
|
|
130
|
+
|
|
131
|
+
builder = WheelBuilder(os.getcwd())
|
|
132
|
+
|
|
133
|
+
directory = os.path.join(metadata_directory, f"{builder.artifact_project_id}.dist-info")
|
|
134
|
+
if not os.path.isdir(directory):
|
|
135
|
+
os.mkdir(directory)
|
|
136
|
+
|
|
137
|
+
extra_dependencies = []
|
|
138
|
+
if not builder.config.dev_mode_dirs and builder.config.dev_mode_exact:
|
|
139
|
+
extra_dependencies.append(EDITABLES_REQUIREMENT)
|
|
140
|
+
|
|
141
|
+
with open(os.path.join(directory, "METADATA"), "w", encoding="utf-8") as f:
|
|
142
|
+
f.write(builder.config.core_metadata_constructor(builder.metadata, extra_dependencies=extra_dependencies))
|
|
143
|
+
|
|
144
|
+
return os.path.basename(directory)
|
|
File without changes
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from hatchling.builders.binary import BinaryBuilder
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AppBuilder(BinaryBuilder):
|
|
9
|
+
PLUGIN_NAME = "app"
|
|
10
|
+
|
|
11
|
+
def build_bootstrap(
|
|
12
|
+
self,
|
|
13
|
+
directory: str,
|
|
14
|
+
**build_data: Any,
|
|
15
|
+
) -> str:
|
|
16
|
+
self.app.display_warning(
|
|
17
|
+
"The `app` build target is deprecated and will be removed in a future release. "
|
|
18
|
+
"Use the `binary` build target instead."
|
|
19
|
+
)
|
|
20
|
+
return super().build_bootstrap(directory, **build_data)
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
|
|
7
|
+
from hatchling.builders.config import BuilderConfig
|
|
8
|
+
from hatchling.builders.plugin.interface import BuilderInterface
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from collections.abc import Callable
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class BinaryBuilderConfig(BuilderConfig):
|
|
15
|
+
SUPPORTED_VERSIONS = ("3.12", "3.11", "3.10", "3.9", "3.8", "3.7")
|
|
16
|
+
|
|
17
|
+
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
|
18
|
+
super().__init__(*args, **kwargs)
|
|
19
|
+
|
|
20
|
+
self.__scripts: list[str] | None = None
|
|
21
|
+
self.__python_version: str | None = None
|
|
22
|
+
self.__pyapp_version: str | None = None
|
|
23
|
+
|
|
24
|
+
@property
|
|
25
|
+
def scripts(self) -> list[str]:
|
|
26
|
+
if self.__scripts is None:
|
|
27
|
+
known_scripts = self.builder.metadata.core.scripts
|
|
28
|
+
scripts = self.target_config.get("scripts", [])
|
|
29
|
+
|
|
30
|
+
if not isinstance(scripts, list):
|
|
31
|
+
message = f"Field `tool.hatch.build.targets.{self.plugin_name}.scripts` must be an array"
|
|
32
|
+
raise TypeError(message)
|
|
33
|
+
|
|
34
|
+
for i, script in enumerate(scripts, 1):
|
|
35
|
+
if not isinstance(script, str):
|
|
36
|
+
message = (
|
|
37
|
+
f"Script #{i} of field `tool.hatch.build.targets.{self.plugin_name}.scripts` must be a string"
|
|
38
|
+
)
|
|
39
|
+
raise TypeError(message)
|
|
40
|
+
|
|
41
|
+
if script not in known_scripts:
|
|
42
|
+
message = f"Unknown script in field `tool.hatch.build.targets.{self.plugin_name}.scripts`: {script}"
|
|
43
|
+
raise ValueError(message)
|
|
44
|
+
|
|
45
|
+
self.__scripts = sorted(set(scripts)) if scripts else list(known_scripts)
|
|
46
|
+
|
|
47
|
+
return self.__scripts
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def python_version(self) -> str:
|
|
51
|
+
if self.__python_version is None:
|
|
52
|
+
python_version = self.target_config.get("python-version", "")
|
|
53
|
+
|
|
54
|
+
if not isinstance(python_version, str):
|
|
55
|
+
message = f"Field `tool.hatch.build.targets.{self.plugin_name}.python-version` must be a string"
|
|
56
|
+
raise TypeError(message)
|
|
57
|
+
|
|
58
|
+
if not python_version and "PYAPP_DISTRIBUTION_SOURCE" not in os.environ:
|
|
59
|
+
for supported_version in self.SUPPORTED_VERSIONS:
|
|
60
|
+
if self.builder.metadata.core.python_constraint.contains(supported_version):
|
|
61
|
+
python_version = supported_version
|
|
62
|
+
break
|
|
63
|
+
else:
|
|
64
|
+
message = "Field `project.requires-python` is incompatible with the known distributions"
|
|
65
|
+
raise ValueError(message)
|
|
66
|
+
|
|
67
|
+
self.__python_version = python_version
|
|
68
|
+
|
|
69
|
+
return self.__python_version
|
|
70
|
+
|
|
71
|
+
@property
|
|
72
|
+
def pyapp_version(self) -> str:
|
|
73
|
+
if self.__pyapp_version is None:
|
|
74
|
+
pyapp_version = self.target_config.get("pyapp-version", "")
|
|
75
|
+
|
|
76
|
+
if not isinstance(pyapp_version, str):
|
|
77
|
+
message = f"Field `tool.hatch.build.targets.{self.plugin_name}.pyapp-version` must be a string"
|
|
78
|
+
raise TypeError(message)
|
|
79
|
+
|
|
80
|
+
self.__pyapp_version = pyapp_version
|
|
81
|
+
|
|
82
|
+
return self.__pyapp_version
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class BinaryBuilder(BuilderInterface):
|
|
86
|
+
"""
|
|
87
|
+
Build binaries
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
PLUGIN_NAME = "binary"
|
|
91
|
+
|
|
92
|
+
def get_version_api(self) -> dict[str, Callable]:
|
|
93
|
+
return {"bootstrap": self.build_bootstrap}
|
|
94
|
+
|
|
95
|
+
def get_default_versions(self) -> list[str]: # noqa: PLR6301
|
|
96
|
+
return ["bootstrap"]
|
|
97
|
+
|
|
98
|
+
def clean(
|
|
99
|
+
self,
|
|
100
|
+
directory: str,
|
|
101
|
+
versions: list[str], # noqa: ARG002
|
|
102
|
+
) -> None:
|
|
103
|
+
import shutil
|
|
104
|
+
|
|
105
|
+
app_dir = os.path.join(directory, self.PLUGIN_NAME)
|
|
106
|
+
if os.path.isdir(app_dir):
|
|
107
|
+
shutil.rmtree(app_dir)
|
|
108
|
+
|
|
109
|
+
def build_bootstrap(
|
|
110
|
+
self,
|
|
111
|
+
directory: str,
|
|
112
|
+
**build_data: Any, # noqa: ARG002
|
|
113
|
+
) -> str:
|
|
114
|
+
import shutil
|
|
115
|
+
import tempfile
|
|
116
|
+
|
|
117
|
+
cargo_path = os.environ.get("CARGO", "")
|
|
118
|
+
if not cargo_path:
|
|
119
|
+
if not shutil.which("cargo"):
|
|
120
|
+
message = "Executable `cargo` could not be found on PATH"
|
|
121
|
+
raise OSError(message)
|
|
122
|
+
|
|
123
|
+
cargo_path = "cargo"
|
|
124
|
+
|
|
125
|
+
app_dir = os.path.join(directory, self.PLUGIN_NAME)
|
|
126
|
+
if not os.path.isdir(app_dir):
|
|
127
|
+
os.makedirs(app_dir)
|
|
128
|
+
|
|
129
|
+
on_windows = sys.platform == "win32"
|
|
130
|
+
base_env = dict(os.environ)
|
|
131
|
+
base_env["PYAPP_PROJECT_NAME"] = self.metadata.name
|
|
132
|
+
base_env["PYAPP_PROJECT_VERSION"] = self.metadata.version
|
|
133
|
+
|
|
134
|
+
if self.config.python_version:
|
|
135
|
+
base_env["PYAPP_PYTHON_VERSION"] = self.config.python_version
|
|
136
|
+
|
|
137
|
+
# https://doc.rust-lang.org/cargo/reference/config.html#buildtarget
|
|
138
|
+
build_target = os.environ.get("CARGO_BUILD_TARGET", "")
|
|
139
|
+
|
|
140
|
+
# This will determine whether we install from crates.io or build locally and is currently required for
|
|
141
|
+
# cross compilation: https://github.com/cross-rs/cross/issues/1215
|
|
142
|
+
repo_path = os.environ.get("PYAPP_REPO", "")
|
|
143
|
+
|
|
144
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
|
145
|
+
exe_name = "pyapp.exe" if on_windows else "pyapp"
|
|
146
|
+
if repo_path:
|
|
147
|
+
context_dir = repo_path
|
|
148
|
+
target_dir = os.path.join(temp_dir, "build")
|
|
149
|
+
if build_target:
|
|
150
|
+
temp_exe_path = os.path.join(target_dir, build_target, "release", exe_name)
|
|
151
|
+
else:
|
|
152
|
+
temp_exe_path = os.path.join(target_dir, "release", exe_name)
|
|
153
|
+
install_command = [cargo_path, "build", "--release", "--target-dir", target_dir]
|
|
154
|
+
else:
|
|
155
|
+
context_dir = temp_dir
|
|
156
|
+
temp_exe_path = os.path.join(temp_dir, "bin", exe_name)
|
|
157
|
+
install_command = [cargo_path, "install", "pyapp", "--force", "--root", temp_dir]
|
|
158
|
+
if self.config.pyapp_version:
|
|
159
|
+
install_command.extend(["--version", self.config.pyapp_version])
|
|
160
|
+
|
|
161
|
+
if self.config.scripts:
|
|
162
|
+
for script in self.config.scripts:
|
|
163
|
+
env = dict(base_env)
|
|
164
|
+
env["PYAPP_EXEC_SPEC"] = self.metadata.core.scripts[script]
|
|
165
|
+
|
|
166
|
+
self.cargo_build(install_command, cwd=context_dir, env=env)
|
|
167
|
+
|
|
168
|
+
exe_stem = (
|
|
169
|
+
f"{script}-{self.metadata.version}-{build_target}"
|
|
170
|
+
if build_target
|
|
171
|
+
else f"{script}-{self.metadata.version}"
|
|
172
|
+
)
|
|
173
|
+
exe_path = os.path.join(app_dir, f"{exe_stem}.exe" if on_windows else exe_stem)
|
|
174
|
+
shutil.move(temp_exe_path, exe_path)
|
|
175
|
+
else:
|
|
176
|
+
self.cargo_build(install_command, cwd=context_dir, env=base_env)
|
|
177
|
+
|
|
178
|
+
exe_stem = (
|
|
179
|
+
f"{self.metadata.name}-{self.metadata.version}-{build_target}"
|
|
180
|
+
if build_target
|
|
181
|
+
else f"{self.metadata.name}-{self.metadata.version}"
|
|
182
|
+
)
|
|
183
|
+
exe_path = os.path.join(app_dir, f"{exe_stem}.exe" if on_windows else exe_stem)
|
|
184
|
+
shutil.move(temp_exe_path, exe_path)
|
|
185
|
+
|
|
186
|
+
return app_dir
|
|
187
|
+
|
|
188
|
+
def cargo_build(self, *args: Any, **kwargs: Any) -> None:
|
|
189
|
+
import subprocess
|
|
190
|
+
|
|
191
|
+
if self.app.verbosity < 0:
|
|
192
|
+
kwargs["stdout"] = subprocess.PIPE
|
|
193
|
+
kwargs["stderr"] = subprocess.STDOUT
|
|
194
|
+
|
|
195
|
+
process = subprocess.run(*args, **kwargs) # noqa: PLW1510
|
|
196
|
+
if process.returncode:
|
|
197
|
+
message = f"Compilation failed (code {process.returncode})"
|
|
198
|
+
raise OSError(message)
|
|
199
|
+
|
|
200
|
+
@classmethod
|
|
201
|
+
def get_config_class(cls) -> type[BinaryBuilderConfig]:
|
|
202
|
+
return BinaryBuilderConfig
|