calkit-python 0.38.2__tar.gz → 0.38.3__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.
- {calkit_python-0.38.2 → calkit_python-0.38.3}/.pre-commit-config.yaml +1 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/AGENTS.md +3 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/PKG-INFO +6 -1
- {calkit_python-0.38.2 → calkit_python-0.38.3}/README.md +5 -0
- calkit_python-0.38.3/calkit/__init__.py +83 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/check.py +3 -2
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/check.py +17 -13
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/cloud.py +2 -1
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/config.py +17 -4
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/core.py +29 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/import_.py +15 -7
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/list.py +20 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/main/core.py +225 -87
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/main/xr.py +3 -2
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/new.py +133 -13
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/office.py +2 -1
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/overleaf.py +6 -1
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/update.py +15 -3
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cloud.py +4 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/core.py +32 -22
- calkit_python-0.38.3/calkit/dvc/__init__.py +14 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/models/pipeline.py +6 -4
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/notebooks.py +13 -6
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/pipeline.py +47 -4
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/cli/main/test_core.py +119 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/cli/test_check.py +32 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/cli/test_list.py +20 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/cli/test_new.py +114 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_cloud.py +11 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/cli-reference.md +29 -9
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/quickstart.md +5 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/pyproject.toml +6 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/scripts/generate-docs-references.py +11 -2
- {calkit_python-0.38.2 → calkit_python-0.38.3}/scripts/install.ps1 +3 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/scripts/install.sh +7 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/package.json +1 -1
- calkit_python-0.38.2/calkit/__init__.py +0 -53
- calkit_python-0.38.2/calkit/templates/latex/__init__.py +0 -1
- {calkit_python-0.38.2 → calkit_python-0.38.3}/.claude-plugin/marketplace.json +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/.gitignore +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/.prettierignore +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/.python-version +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/.vscode/launch.json +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/.vscode/tasks.json +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/.yarnrc.yml +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/CITATION.cff +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/CODE_OF_CONDUCT.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/CONTRIBUTING.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/LICENSE +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/Makefile +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/agent-plugin/.claude-plugin/plugin.json +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/agent-plugin/skills/add-pipeline-stage/SKILL.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/agent-plugin/skills/conventions/SKILL.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/agent-plugin/skills/create-pipeline/SKILL.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/babel.config.js +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/__main__.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/calc.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/__init__.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/describe.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/dev.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/latex.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/main/__init__.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/notebooks.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/cli/slurm.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/conda.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/config.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/datasets.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/detect.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/docker.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/dvc/core.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/dvc/zip.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/environments.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/fs.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/git.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/github.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/gui.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/invenio.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/julia.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/jupyter.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/jupyterlab/__init__.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/jupyterlab/routes.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/labextension/package.json +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/labextension/schemas/calkit/package.json.orig +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/labextension/schemas/calkit/plugin.json +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/labextension/static/502.9a2c5772a15466e923ef.js +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/labextension/static/695.2c41003a452d43d2b358.js +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/labextension/static/867.a42a046aa5108f54f8fb.js +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/labextension/static/909.e3f9cc3408834a7fdcc3.js +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/labextension/static/b2f1c3efe70cb539d121.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/labextension/static/remoteEntry.65469af996e7a96aa983.js +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/labextension/static/style.js +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/labextension/static/third-party-licenses.json +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/licenses.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/magics.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/matlab.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/models/__init__.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/models/core.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/models/io.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/models/iteration.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/office.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/ops.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/overleaf.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/releases.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/server.py +0 -0
- {calkit_python-0.38.2/calkit/dvc → calkit_python-0.38.3/calkit/templates}/__init__.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/templates/core.py +0 -0
- {calkit_python-0.38.2/calkit/templates → calkit_python-0.38.3/calkit/templates/latex}/__init__.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/templates/latex/article/paper.tex +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/templates/latex/core.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/templates/latex/jfm/jfm.bst +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/templates/latex/jfm/jfm.cls +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/templates/latex/jfm/paper.tex +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/templates/latex/jfm/upmath.sty +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/__init__.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/cli/__init__.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/cli/main/__init__.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/cli/main/test_xr.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/cli/test_cloud.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/cli/test_config.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/cli/test_import.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/cli/test_latex.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/cli/test_notebooks.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/cli/test_overleaf.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/cli/test_update.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/dvc/__init__.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/dvc/test_core.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/dvc/test_zip.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/jupyterlab/__init__.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/jupyterlab/test_routes.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/models/__init__.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/models/test_iteration.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/models/test_pipeline.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_calc.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_check.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_conda.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_core.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_detect.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_docker.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_environments.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_fs.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_git.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_invenio.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_julia.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_jupyter.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_magics.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_matlab.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_notebooks.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_pipeline.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_releases.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/calkit/tests/test_templates.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/conftest.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/CNAME +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/ai-tools.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/apps.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/calculations.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/calkit-yaml.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/cloud-integration.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/datasets.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/dependencies.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/environments.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/examples.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/governance.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/help.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/img/c-to-the-k-white.svg +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/img/calkit-fragmentation-compendium.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/img/calkit-no-bg.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/img/connect-zenodo.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/img/jupyterlab/all-green.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/img/jupyterlab/collect-data-stale.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/img/jupyterlab/new-env.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/img/jupyterlab/new-notebook.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/img/jupyterlab/pipeline-badge.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/img/jupyterlab-params.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/img/plos-osi-code-2024-03.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/img/vscode-nb-params.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/index.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/installation.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/jupyterlab.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/local-server.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/notebooks.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/overleaf.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/pipeline/index.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/pipeline/manual-steps.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/pipeline/running-and-logging.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/pipeline/slurm.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/references.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/releases.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/reproducibility.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/adding-latex-pub-docker.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/conda-envs.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/existing-project.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/first-project.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/github-actions.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/actions-repo-secrets.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/latex-codespaces/push.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/chart-more-rows.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/create-project.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/excel-chart.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/excel-data.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/needs-clone.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/new-stage.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/status-more-rows.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/untracked-data.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/updated-publication.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/office/workflow-page.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/openfoam/clone.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/openfoam/create-project.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/openfoam/new-token.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/openfoam/reclone.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/quick-actions.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/run-proc.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/vscode-slurm-notebook/create-calkit-env.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/vscode-slurm-notebook/create-inner-env.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/vscode-slurm-notebook/create-new-calkit-env.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/vscode-slurm-notebook/select-calkit-env.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/vscode-slurm-notebook/slurm-job-running.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/vscode-slurm-notebook/slurm-launch-options.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/img/vscode-slurm-notebook/starting-slurm-job.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/index.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/jupyterlab.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/latex-codespaces.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/matlab.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/notebook-pipeline.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/office.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/openfoam.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/procedures.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/tutorials/vscode-slurm-notebook.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/docs/version-control.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/install.json +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/jest.config.js +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/jupyter-config/server-config/calkit.json +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/mkdocs.yml +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/package.json +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/schema/plugin.json +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/scripts/make-calk9.sh +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/scripts/sync-docs.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/__tests__/useQueries.spec.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/calkit-config.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/cell-output-marker.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/components/commit-dialog.tsx +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/components/environment-editor.tsx +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/components/notebook-registration.tsx +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/components/notebook-toolbar.tsx +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/components/pipeline-status-bar.tsx +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/components/project-info-editor.tsx +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/components/sidebar-settings.tsx +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/components/sidebar.tsx +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/components/stage-editor.tsx +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/feature-flags.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/file-browser-menu.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/hooks/__tests__/useQueries.test.tsx +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/hooks/useQueries.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/icons.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/index.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/io-tracker.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/pipeline-state.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/queryClient.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/request.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/src/shims-mainmenu.d.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/style/base.css +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/style/cell-output-marker.css +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/style/environment-editor.css +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/style/environment-selector.css +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/style/img/calkit-no-bg.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/style/index.css +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/style/index.js +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/style/notebook-toolbar.css +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/style/pipeline-status-bar.css +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/style/sidebar.css +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/test/dvc-md5-dir/osx-arm64.txt +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/test/nb-julia.ipynb +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/test/nb-params.ipynb +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/test/nb-subdir.ipynb +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/test/pipeline.ipynb +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/test/script.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/test/test-log.log +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/tsconfig.json +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/tsconfig.test.json +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/ui-tests/.gitignore +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/ui-tests/README.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/ui-tests/jupyter_server_test_config.py +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/ui-tests/package.json +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/ui-tests/playwright.config.js +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/ui-tests/tests/calkit.spec.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/ui-tests/yarn.lock +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/uv.lock +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/.gitignore +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/.vscodeignore +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/CHANGELOG.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/LICENSE +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/README.md +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/images/calkit-no-bg.png +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/package-lock.json +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/scripts/set-proposed-api.js +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/src/environments.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/src/extension.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/src/notebooks.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/src/test/environments.test.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/src/test/kernel-selection.test.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/src/test/notebooks.test.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/src/types.ts +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/vscode-ext/tsconfig.json +0 -0
- {calkit_python-0.38.2 → calkit_python-0.38.3}/yarn.lock +0 -0
|
@@ -18,3 +18,6 @@ Wrap prose at natural breakpoints in phrases or punctuation to keep max
|
|
|
18
18
|
line length below 80 characters.
|
|
19
19
|
|
|
20
20
|
Agents should never make commits to Git.
|
|
21
|
+
|
|
22
|
+
Prefer tests that include multiple scenarios to comprehensively test
|
|
23
|
+
a feature in one function over many different test functions.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: calkit-python
|
|
3
|
-
Version: 0.38.
|
|
3
|
+
Version: 0.38.3
|
|
4
4
|
Summary: Reproducibility simplified.
|
|
5
5
|
Project-URL: Homepage, https://calkit.org
|
|
6
6
|
Project-URL: Issues, https://github.com/calkit/calkit/issues
|
|
@@ -209,6 +209,11 @@ all scientific or analytical computing projects.
|
|
|
209
209
|
|
|
210
210
|
<!-- INCLUDE: docs/quickstart.md +1 -->
|
|
211
211
|
|
|
212
|
+
<!-- prettier-ignore -->
|
|
213
|
+
!!! note
|
|
214
|
+
`ck` is an abbreviated alias for the `calkit` executable.
|
|
215
|
+
All `calkit` commands can be run as `ck` instead, e.g., `ck save -am "..."`.
|
|
216
|
+
|
|
212
217
|
### From an existing project
|
|
213
218
|
|
|
214
219
|
If you want to use Calkit with an existing project,
|
|
@@ -150,6 +150,11 @@ all scientific or analytical computing projects.
|
|
|
150
150
|
|
|
151
151
|
<!-- INCLUDE: docs/quickstart.md +1 -->
|
|
152
152
|
|
|
153
|
+
<!-- prettier-ignore -->
|
|
154
|
+
!!! note
|
|
155
|
+
`ck` is an abbreviated alias for the `calkit` executable.
|
|
156
|
+
All `calkit` commands can be run as `ck` instead, e.g., `ck save -am "..."`.
|
|
157
|
+
|
|
153
158
|
### From an existing project
|
|
154
159
|
|
|
155
160
|
If you want to use Calkit with an existing project,
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
from importlib.metadata import version as _version
|
|
2
|
+
|
|
3
|
+
__version__ = _version("calkit-python")
|
|
4
|
+
|
|
5
|
+
from .core import * # noqa: F403, I001
|
|
6
|
+
|
|
7
|
+
# Lazy-load submodules to speed up imports
|
|
8
|
+
_SUBMODULES = {
|
|
9
|
+
"git",
|
|
10
|
+
"dvc",
|
|
11
|
+
"cloud",
|
|
12
|
+
"fs",
|
|
13
|
+
"jupyter",
|
|
14
|
+
"config",
|
|
15
|
+
"models",
|
|
16
|
+
"office",
|
|
17
|
+
"templates",
|
|
18
|
+
"conda",
|
|
19
|
+
"calc",
|
|
20
|
+
"check",
|
|
21
|
+
"github",
|
|
22
|
+
"invenio",
|
|
23
|
+
"releases",
|
|
24
|
+
"licenses",
|
|
25
|
+
"overleaf",
|
|
26
|
+
"julia",
|
|
27
|
+
"notebooks",
|
|
28
|
+
"environments",
|
|
29
|
+
"pipeline",
|
|
30
|
+
"matlab",
|
|
31
|
+
"datasets",
|
|
32
|
+
"detect",
|
|
33
|
+
"docker",
|
|
34
|
+
"gui",
|
|
35
|
+
"magics",
|
|
36
|
+
"ops",
|
|
37
|
+
"server",
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def __getattr__(name: str):
|
|
42
|
+
if name in _SUBMODULES:
|
|
43
|
+
import importlib
|
|
44
|
+
|
|
45
|
+
mod = importlib.import_module(f"calkit.{name}")
|
|
46
|
+
globals()[name] = mod
|
|
47
|
+
return mod
|
|
48
|
+
if name == "declare_notebook":
|
|
49
|
+
from .notebooks import declare_notebook
|
|
50
|
+
|
|
51
|
+
globals()["declare_notebook"] = declare_notebook
|
|
52
|
+
return declare_notebook
|
|
53
|
+
raise AttributeError(f"module 'calkit' has no attribute {name!r}")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _jupyter_labextension_paths():
|
|
57
|
+
return [{"src": "labextension", "dest": "calkit"}]
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _jupyter_server_extension_points():
|
|
61
|
+
return [{"module": "calkit"}]
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _load_jupyter_server_extension(server_app):
|
|
65
|
+
"""Registers the API handler to receive HTTP requests from the frontend
|
|
66
|
+
extension.
|
|
67
|
+
|
|
68
|
+
Parameters
|
|
69
|
+
----------
|
|
70
|
+
server_app: jupyterlab.labapp.LabApp
|
|
71
|
+
JupyterLab application instance
|
|
72
|
+
"""
|
|
73
|
+
import os
|
|
74
|
+
|
|
75
|
+
from .jupyterlab.routes import setup_route_handlers
|
|
76
|
+
|
|
77
|
+
# Change to root_dir so all handlers work in the correct directory context
|
|
78
|
+
root_dir = server_app.root_dir
|
|
79
|
+
os.chdir(root_dir)
|
|
80
|
+
server_app.log.info(f"Changed working directory to {root_dir}")
|
|
81
|
+
setup_route_handlers(server_app.web_app)
|
|
82
|
+
name = "calkit"
|
|
83
|
+
server_app.log.info(f"Registered {name} server extension")
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
import os
|
|
4
4
|
from typing import Callable
|
|
5
5
|
|
|
6
|
-
import git
|
|
7
|
-
from git.exc import InvalidGitRepositoryError
|
|
8
6
|
from pydantic import BaseModel, computed_field
|
|
9
7
|
|
|
10
8
|
import calkit
|
|
@@ -176,6 +174,9 @@ def check_reproducibility(
|
|
|
176
174
|
wdir: str = ".", log_func: Callable | None = None
|
|
177
175
|
) -> ReproCheck:
|
|
178
176
|
"""Check the reproducibility of a project."""
|
|
177
|
+
import git
|
|
178
|
+
from git.exc import InvalidGitRepositoryError
|
|
179
|
+
|
|
179
180
|
res = dict()
|
|
180
181
|
if log_func is None:
|
|
181
182
|
log_func = print
|
|
@@ -11,22 +11,11 @@ import subprocess
|
|
|
11
11
|
from typing import Annotated, Callable
|
|
12
12
|
|
|
13
13
|
import dotenv
|
|
14
|
-
import git
|
|
15
14
|
import typer
|
|
16
15
|
|
|
17
16
|
import calkit
|
|
18
|
-
import calkit.environments
|
|
19
|
-
import calkit.matlab
|
|
20
|
-
import calkit.pipeline
|
|
21
|
-
from calkit.check import check_reproducibility
|
|
22
17
|
from calkit.cli import raise_error, warn
|
|
23
18
|
from calkit.core import get_md5
|
|
24
|
-
from calkit.environments import (
|
|
25
|
-
get_all_conda_lock_fpaths,
|
|
26
|
-
get_all_docker_lock_fpaths,
|
|
27
|
-
get_all_venv_lock_fpaths,
|
|
28
|
-
get_env_lock_fpath,
|
|
29
|
-
)
|
|
30
19
|
|
|
31
20
|
check_app = typer.Typer(no_args_is_help=True)
|
|
32
21
|
|
|
@@ -249,6 +238,8 @@ def check_repro(
|
|
|
249
238
|
] = ".",
|
|
250
239
|
) -> None:
|
|
251
240
|
"""Check the reproducibility of a project."""
|
|
241
|
+
from calkit.check import check_reproducibility
|
|
242
|
+
|
|
252
243
|
res = check_reproducibility(wdir=wdir, log_func=typer.echo)
|
|
253
244
|
calkit.echo(res.to_pretty())
|
|
254
245
|
|
|
@@ -268,6 +259,13 @@ def check_environment(
|
|
|
268
259
|
] = False,
|
|
269
260
|
) -> str | None:
|
|
270
261
|
"""Check that an environment is up-to-date."""
|
|
262
|
+
from calkit.environments import (
|
|
263
|
+
get_all_conda_lock_fpaths,
|
|
264
|
+
get_all_docker_lock_fpaths,
|
|
265
|
+
get_all_venv_lock_fpaths,
|
|
266
|
+
get_env_lock_fpath,
|
|
267
|
+
)
|
|
268
|
+
|
|
271
269
|
dotenv.load_dotenv(dotenv_path=".env", verbose=verbose)
|
|
272
270
|
ck_info = calkit.load_calkit_info(process_includes="environments")
|
|
273
271
|
envs = ck_info.get("environments", {})
|
|
@@ -353,8 +351,8 @@ def check_environment(
|
|
|
353
351
|
raise_error("venv environments require a prefix")
|
|
354
352
|
if "path" not in env:
|
|
355
353
|
raise_error("venv environments require a path")
|
|
356
|
-
prefix = env["prefix"]
|
|
357
|
-
path = env["path"]
|
|
354
|
+
prefix = os.path.expandvars(env["prefix"])
|
|
355
|
+
path = os.path.expandvars(env["path"])
|
|
358
356
|
lock_fpath = get_env_lock_fpath(
|
|
359
357
|
env=env, env_name=env_name, as_posix=False
|
|
360
358
|
)
|
|
@@ -457,6 +455,10 @@ def check_environments(
|
|
|
457
455
|
if not envs:
|
|
458
456
|
typer.echo("No environments defined in calkit.yaml")
|
|
459
457
|
return
|
|
458
|
+
# Set any project-level environmental variables before checking
|
|
459
|
+
# environments
|
|
460
|
+
dotenv.load_dotenv(dotenv_path=".env", verbose=verbose)
|
|
461
|
+
calkit.set_env_vars(ck_info=ck_info, cli=True)
|
|
460
462
|
failures = []
|
|
461
463
|
for env_name, env in envs.items():
|
|
462
464
|
if env.get("kind") in calkit.environments.KINDS_NO_CHECK:
|
|
@@ -1290,6 +1292,8 @@ def check_env_vars(
|
|
|
1290
1292
|
dotenv_path=".env", key_to_set=name, value_to_set=value
|
|
1291
1293
|
)
|
|
1292
1294
|
# Ensure that .env is ignored by git
|
|
1295
|
+
import git
|
|
1296
|
+
|
|
1293
1297
|
repo = git.Repo()
|
|
1294
1298
|
if not repo.ignored(".env"):
|
|
1295
1299
|
typer.echo("Adding .env to .gitignore")
|
|
@@ -8,7 +8,6 @@ import webbrowser
|
|
|
8
8
|
from typing import Annotated
|
|
9
9
|
|
|
10
10
|
import typer
|
|
11
|
-
from requests.exceptions import HTTPError
|
|
12
11
|
|
|
13
12
|
import calkit
|
|
14
13
|
from calkit.cli import raise_error
|
|
@@ -47,6 +46,8 @@ def login(
|
|
|
47
46
|
First try a GET request to the /user endpoint to check if the user is
|
|
48
47
|
already logged in. If not, perform OAuth device flow.
|
|
49
48
|
"""
|
|
49
|
+
from requests.exceptions import HTTPError
|
|
50
|
+
|
|
50
51
|
try:
|
|
51
52
|
calkit.cloud.get("/user")
|
|
52
53
|
calkit.echo("Authenticated successfully ✅")
|
|
@@ -6,15 +6,11 @@ import glob
|
|
|
6
6
|
import os
|
|
7
7
|
import subprocess
|
|
8
8
|
|
|
9
|
-
import git
|
|
10
9
|
import typer
|
|
11
|
-
from git.exc import InvalidGitRepositoryError
|
|
12
10
|
from typing_extensions import Annotated
|
|
13
11
|
|
|
14
12
|
import calkit
|
|
15
|
-
from calkit import config
|
|
16
13
|
from calkit.cli.core import raise_error
|
|
17
|
-
from calkit.dvc import configure_remote, get_remotes, set_remote_auth
|
|
18
14
|
|
|
19
15
|
config_app = typer.Typer(no_args_is_help=True)
|
|
20
16
|
|
|
@@ -22,6 +18,8 @@ config_app = typer.Typer(no_args_is_help=True)
|
|
|
22
18
|
@config_app.command(name="set")
|
|
23
19
|
def set_config_value(key: str, value: str):
|
|
24
20
|
"""Set a value in the config."""
|
|
21
|
+
from calkit import config
|
|
22
|
+
|
|
25
23
|
keys = config.Settings.model_fields.keys()
|
|
26
24
|
if key not in keys:
|
|
27
25
|
raise_error(
|
|
@@ -38,6 +36,8 @@ def set_config_value(key: str, value: str):
|
|
|
38
36
|
@config_app.command(name="get")
|
|
39
37
|
def get_config_value(key: str) -> None:
|
|
40
38
|
"""Get and print a value from the config."""
|
|
39
|
+
from calkit import config
|
|
40
|
+
|
|
41
41
|
cfg = config.read().model_dump()
|
|
42
42
|
if key not in cfg:
|
|
43
43
|
raise_error(
|
|
@@ -53,6 +53,8 @@ def get_config_value(key: str) -> None:
|
|
|
53
53
|
@config_app.command(name="unset")
|
|
54
54
|
def unset_config_value(key: str):
|
|
55
55
|
"""Unset a value in the config, returning it to default."""
|
|
56
|
+
from calkit import config
|
|
57
|
+
|
|
56
58
|
model_fields = config.Settings.model_fields
|
|
57
59
|
if key not in model_fields:
|
|
58
60
|
raise_error(
|
|
@@ -90,6 +92,11 @@ def setup_remote(
|
|
|
90
92
|
"""Setup the Calkit cloud as the default DVC remote and store a token in
|
|
91
93
|
the local config.
|
|
92
94
|
"""
|
|
95
|
+
import git
|
|
96
|
+
from git.exc import InvalidGitRepositoryError
|
|
97
|
+
|
|
98
|
+
from calkit.dvc import configure_remote, set_remote_auth
|
|
99
|
+
|
|
93
100
|
try:
|
|
94
101
|
remote_name = configure_remote(use_ck=not http)
|
|
95
102
|
set_remote_auth(remote_name=remote_name)
|
|
@@ -119,6 +126,8 @@ def setup_remote_auth():
|
|
|
119
126
|
"""Store a Calkit cloud token in the local DVC config for all Calkit
|
|
120
127
|
remotes.
|
|
121
128
|
"""
|
|
129
|
+
from calkit.dvc import get_remotes, set_remote_auth
|
|
130
|
+
|
|
122
131
|
try:
|
|
123
132
|
remotes = get_remotes()
|
|
124
133
|
except Exception:
|
|
@@ -132,6 +141,8 @@ def setup_remote_auth():
|
|
|
132
141
|
@config_app.command(name="list")
|
|
133
142
|
def list_config_keys():
|
|
134
143
|
"""List keys in the config."""
|
|
144
|
+
from calkit import config
|
|
145
|
+
|
|
135
146
|
cfg = config.read()
|
|
136
147
|
for key in cfg.model_dump():
|
|
137
148
|
typer.echo(key)
|
|
@@ -140,6 +151,8 @@ def list_config_keys():
|
|
|
140
151
|
@config_app.command(name="github-ssh")
|
|
141
152
|
def config_github_ssh():
|
|
142
153
|
"""Walk through the process of adding an SSH key to GitHub."""
|
|
154
|
+
import git
|
|
155
|
+
|
|
143
156
|
typer.echo("Checking if you can already connect to GitHub via SSH")
|
|
144
157
|
# First check if we can already connect to GitHub
|
|
145
158
|
ssh_test_cmd = ["ssh", "-T", "git@github.com"]
|
|
@@ -4,9 +4,38 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
6
|
import subprocess
|
|
7
|
+
from typing import TYPE_CHECKING
|
|
7
8
|
|
|
8
9
|
import typer
|
|
9
10
|
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
import click
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def complete_stage_names(
|
|
16
|
+
ctx: "click.Context",
|
|
17
|
+
param: "click.Parameter",
|
|
18
|
+
incomplete: str,
|
|
19
|
+
) -> list:
|
|
20
|
+
"""Return pipeline stage names for shell tab-completion."""
|
|
21
|
+
if not os.path.isfile("calkit.yaml"):
|
|
22
|
+
return []
|
|
23
|
+
try:
|
|
24
|
+
import ruamel.yaml
|
|
25
|
+
from click.shell_completion import CompletionItem
|
|
26
|
+
|
|
27
|
+
ryaml = ruamel.yaml.YAML()
|
|
28
|
+
with open("calkit.yaml") as f:
|
|
29
|
+
info = ryaml.load(f) or {}
|
|
30
|
+
stages = info.get("pipeline", {}).get("stages", {})
|
|
31
|
+
return [
|
|
32
|
+
CompletionItem(name)
|
|
33
|
+
for name in stages
|
|
34
|
+
if name.startswith(incomplete)
|
|
35
|
+
]
|
|
36
|
+
except Exception:
|
|
37
|
+
return []
|
|
38
|
+
|
|
10
39
|
|
|
11
40
|
def print_sep(name: str):
|
|
12
41
|
width = 66
|
|
@@ -9,16 +9,10 @@ import os
|
|
|
9
9
|
from copy import deepcopy
|
|
10
10
|
from typing import Annotated
|
|
11
11
|
|
|
12
|
-
import git
|
|
13
|
-
import requests
|
|
14
12
|
import typer
|
|
15
|
-
from tqdm import tqdm
|
|
16
13
|
|
|
17
14
|
import calkit
|
|
18
|
-
import calkit.invenio
|
|
19
15
|
from calkit.cli import raise_error
|
|
20
|
-
from calkit.dvc import run_dvc_command
|
|
21
|
-
from calkit.models.core import _ImportedFromProject
|
|
22
16
|
|
|
23
17
|
import_app = typer.Typer(no_args_is_help=True)
|
|
24
18
|
|
|
@@ -72,12 +66,19 @@ def import_dataset(
|
|
|
72
66
|
"remote instead of ck://."
|
|
73
67
|
),
|
|
74
68
|
),
|
|
75
|
-
] =
|
|
69
|
+
] = False,
|
|
76
70
|
):
|
|
77
71
|
"""Import a dataset.
|
|
78
72
|
|
|
79
73
|
Currently only supports datasets kept in DVC, not Git.
|
|
80
74
|
"""
|
|
75
|
+
import git
|
|
76
|
+
import requests
|
|
77
|
+
from tqdm import tqdm
|
|
78
|
+
|
|
79
|
+
from calkit.dvc import run_dvc_command
|
|
80
|
+
from calkit.models.core import _ImportedFromProject
|
|
81
|
+
|
|
81
82
|
# Ensure we don't already have a dataset at this path
|
|
82
83
|
path_split = src_path.split("/")
|
|
83
84
|
owner_name = path_split[0]
|
|
@@ -260,6 +261,8 @@ def import_environment(
|
|
|
260
261
|
] = False,
|
|
261
262
|
) -> None:
|
|
262
263
|
"""Import an environment from another project."""
|
|
264
|
+
import git
|
|
265
|
+
|
|
263
266
|
raise_error(
|
|
264
267
|
"This command is not yet implemented; "
|
|
265
268
|
"please thumbs-up this issue if you'd like to see "
|
|
@@ -368,6 +371,11 @@ def import_from_zenodo(
|
|
|
368
371
|
] = False,
|
|
369
372
|
):
|
|
370
373
|
"""Import files from a Zenodo record."""
|
|
374
|
+
import git
|
|
375
|
+
import requests
|
|
376
|
+
|
|
377
|
+
from calkit.dvc import run_dvc_command
|
|
378
|
+
|
|
371
379
|
# Ensure destination directory either doesn't exist or is empty
|
|
372
380
|
if os.path.isdir(dest_dir):
|
|
373
381
|
if os.listdir(dest_dir):
|
|
@@ -140,3 +140,23 @@ def list_stages(
|
|
|
140
140
|
if kinds is not None and stage.get("kind") not in kinds:
|
|
141
141
|
continue
|
|
142
142
|
typer.echo(name)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
@list_app.command(name="remotes")
|
|
146
|
+
def list_remotes():
|
|
147
|
+
"""List Git and DVC remotes."""
|
|
148
|
+
import git
|
|
149
|
+
|
|
150
|
+
try:
|
|
151
|
+
repo = git.Repo()
|
|
152
|
+
for remote in repo.remotes:
|
|
153
|
+
typer.echo(f"(Git) {remote.name}: {remote.url}")
|
|
154
|
+
except Exception as e:
|
|
155
|
+
warn(f"Could not list Git remotes: {e}")
|
|
156
|
+
# Now DVC remotes
|
|
157
|
+
try:
|
|
158
|
+
dvc_remotes = calkit.dvc.get_remotes()
|
|
159
|
+
for name, url in dvc_remotes.items():
|
|
160
|
+
typer.echo(f"(DVC) {name}: {url}")
|
|
161
|
+
except Exception as e:
|
|
162
|
+
warn(f"Could not list DVC remotes: {e}")
|