calkit-python 0.37.1__tar.gz → 0.37.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.37.1 → calkit_python-0.37.3}/Makefile +3 -6
- {calkit_python-0.37.1 → calkit_python-0.37.3}/PKG-INFO +56 -45
- {calkit_python-0.37.1 → calkit_python-0.37.3}/README.md +55 -44
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/check.py +247 -105
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/main/core.py +3 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/new.py +16 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/notebooks.py +7 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/slurm.py +41 -9
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/dvc/zip.py +82 -12
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/environments.py +126 -13
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/fs.py +53 -2
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/git.py +1 -1
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/julia.py +30 -2
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/labextension/package.json +1 -1
- calkit_python-0.37.1/calkit/labextension/static/909.651be47ca47390b78a92.js → calkit_python-0.37.3/calkit/labextension/static/909.e3f9cc3408834a7fdcc3.js +1 -1
- calkit_python-0.37.1/calkit/labextension/static/remoteEntry.c091821b3d7f2d287a67.js → calkit_python-0.37.3/calkit/labextension/static/remoteEntry.65469af996e7a96aa983.js +1 -1
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/matlab.py +1 -1
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/models/core.py +29 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/models/pipeline.py +18 -15
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/pipeline.py +2 -2
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/cli/test_check.py +35 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/dvc/test_zip.py +8 -1
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/models/test_pipeline.py +13 -1
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_environments.py +155 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_fs.py +119 -1
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_git.py +5 -5
- calkit_python-0.37.3/calkit/tests/test_julia.py +97 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_pipeline.py +38 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/cli-reference.md +53 -25
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/environments.md +143 -0
- calkit_python-0.37.3/docs/index.md +59 -0
- calkit_python-0.37.3/docs/pipeline/index.md +460 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/github-actions.md +10 -14
- calkit_python-0.37.3/docs/tutorials/img/vscode-slurm-notebook/create-calkit-env.png +0 -0
- calkit_python-0.37.3/docs/tutorials/img/vscode-slurm-notebook/create-inner-env.png +0 -0
- calkit_python-0.37.3/docs/tutorials/img/vscode-slurm-notebook/create-new-calkit-env.png +0 -0
- calkit_python-0.37.3/docs/tutorials/img/vscode-slurm-notebook/select-calkit-env.png +0 -0
- calkit_python-0.37.3/docs/tutorials/img/vscode-slurm-notebook/slurm-job-running.png +0 -0
- calkit_python-0.37.3/docs/tutorials/img/vscode-slurm-notebook/slurm-launch-options.png +0 -0
- calkit_python-0.37.3/docs/tutorials/img/vscode-slurm-notebook/starting-slurm-job.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/index.md +1 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/openfoam.md +3 -3
- calkit_python-0.37.3/docs/tutorials/vscode-slurm-notebook.md +79 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/mkdocs.yml +1 -0
- calkit_python-0.37.3/scripts/generate-docs-references.py +752 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/scripts/install.ps1 +1 -1
- {calkit_python-0.37.1 → calkit_python-0.37.3}/scripts/install.sh +2 -2
- {calkit_python-0.37.1 → calkit_python-0.37.3}/scripts/sync-docs.py +15 -5
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/components/project-info-editor.tsx +1 -1
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/components/sidebar.tsx +2 -3
- {calkit_python-0.37.1 → calkit_python-0.37.3}/vscode-ext/package-lock.json +6 -6
- {calkit_python-0.37.1 → calkit_python-0.37.3}/vscode-ext/package.json +6 -3
- {calkit_python-0.37.1 → calkit_python-0.37.3}/vscode-ext/src/environments.ts +1 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/vscode-ext/src/extension.ts +162 -17
- {calkit_python-0.37.1 → calkit_python-0.37.3}/vscode-ext/src/types.ts +4 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/vscode-ext/tsconfig.json +1 -0
- calkit_python-0.37.1/calkit/tests/test_julia.py +0 -31
- calkit_python-0.37.1/docs/index.md +0 -56
- calkit_python-0.37.1/docs/pipeline/index.md +0 -280
- calkit_python-0.37.1/scripts/generate-cli-reference.py +0 -395
- {calkit_python-0.37.1 → calkit_python-0.37.3}/.gitignore +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/.pre-commit-config.yaml +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/.prettierignore +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/.python-version +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/.vscode/launch.json +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/.vscode/tasks.json +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/.yarnrc.yml +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/CITATION.cff +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/CODE_OF_CONDUCT.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/CONTRIBUTING.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/LICENSE +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/babel.config.js +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/__init__.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/__main__.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/calc.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/check.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/__init__.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/cloud.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/config.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/core.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/describe.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/import_.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/latex.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/list.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/main/__init__.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/main/xr.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/office.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/overleaf.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cli/update.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/cloud.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/conda.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/config.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/core.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/datasets.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/detect.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/docker.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/dvc/__init__.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/dvc/core.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/github.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/gui.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/invenio.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/jupyter.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/jupyterlab/__init__.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/jupyterlab/routes.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/labextension/schemas/calkit/package.json.orig +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/labextension/schemas/calkit/plugin.json +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/labextension/static/502.9a2c5772a15466e923ef.js +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/labextension/static/695.2c41003a452d43d2b358.js +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/labextension/static/867.a42a046aa5108f54f8fb.js +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/labextension/static/b2f1c3efe70cb539d121.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/labextension/static/style.js +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/labextension/static/third-party-licenses.json +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/licenses.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/magics.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/models/__init__.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/models/io.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/models/iteration.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/notebooks.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/office.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/ops.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/overleaf.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/releases.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/server.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/templates/__init__.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/templates/core.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/templates/latex/__init__.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/templates/latex/article/paper.tex +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/templates/latex/core.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/templates/latex/jfm/jfm.bst +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/templates/latex/jfm/jfm.cls +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/templates/latex/jfm/paper.tex +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/templates/latex/jfm/upmath.sty +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/__init__.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/cli/__init__.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/cli/main/__init__.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/cli/main/test_core.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/cli/main/test_xr.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/cli/test_config.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/cli/test_import.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/cli/test_latex.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/cli/test_list.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/cli/test_new.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/cli/test_notebooks.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/cli/test_overleaf.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/cli/test_update.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/dvc/__init__.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/dvc/test_core.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/jupyterlab/__init__.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/jupyterlab/test_routes.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/models/__init__.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/models/test_iteration.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_calc.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_check.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_conda.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_core.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_detect.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_docker.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_invenio.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_jupyter.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_magics.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_matlab.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_notebooks.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_releases.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/calkit/tests/test_templates.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/conftest.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/CNAME +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/apps.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/calculations.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/calkit-yaml.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/cloud-integration.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/datasets.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/dependencies.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/examples.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/governance.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/help.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/img/c-to-the-k-white.svg +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/img/calkit-fragmentation-compendium.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/img/calkit-no-bg.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/img/connect-zenodo.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/img/jupyterlab/all-green.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/img/jupyterlab/collect-data-stale.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/img/jupyterlab/new-env.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/img/jupyterlab/new-notebook.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/img/jupyterlab/pipeline-badge.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/img/jupyterlab-params.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/img/plos-osi-code-2024-03.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/img/vscode-nb-params.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/installation.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/jupyterlab.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/local-server.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/notebooks.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/overleaf.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/pipeline/manual-steps.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/pipeline/running-and-logging.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/pipeline/slurm.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/quickstart.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/references.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/releases.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/reproducibility.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/adding-latex-pub-docker.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/conda-envs.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/existing-project.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/first-project.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/actions-repo-secrets.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/latex-codespaces/push.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/chart-more-rows.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/create-project.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/excel-chart.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/excel-data.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/needs-clone.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/new-stage.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/status-more-rows.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/untracked-data.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/updated-publication.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/office/workflow-page.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/openfoam/clone.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/openfoam/create-project.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/openfoam/new-token.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/openfoam/reclone.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/quick-actions.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/img/run-proc.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/jupyterlab.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/latex-codespaces.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/matlab.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/notebook-pipeline.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/office.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/tutorials/procedures.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/docs/version-control.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/install.json +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/jest.config.js +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/jupyter-config/server-config/calkit.json +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/package.json +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/pyproject.toml +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/schema/plugin.json +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/scripts/make-calk9.sh +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/__tests__/useQueries.spec.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/calkit-config.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/cell-output-marker.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/components/commit-dialog.tsx +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/components/environment-editor.tsx +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/components/notebook-registration.tsx +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/components/notebook-toolbar.tsx +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/components/pipeline-status-bar.tsx +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/components/sidebar-settings.tsx +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/components/stage-editor.tsx +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/feature-flags.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/file-browser-menu.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/hooks/__tests__/useQueries.test.tsx +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/hooks/useQueries.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/icons.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/index.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/io-tracker.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/pipeline-state.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/queryClient.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/request.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/src/shims-mainmenu.d.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/style/base.css +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/style/cell-output-marker.css +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/style/environment-editor.css +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/style/environment-selector.css +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/style/img/calkit-no-bg.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/style/index.css +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/style/index.js +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/style/notebook-toolbar.css +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/style/pipeline-status-bar.css +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/style/sidebar.css +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/test/dvc-md5-dir/osx-arm64.txt +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/test/nb-julia.ipynb +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/test/nb-params.ipynb +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/test/nb-subdir.ipynb +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/test/pipeline.ipynb +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/test/script.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/test/test-log.log +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/tsconfig.json +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/tsconfig.test.json +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/ui-tests/.gitignore +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/ui-tests/README.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/ui-tests/jupyter_server_test_config.py +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/ui-tests/package.json +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/ui-tests/playwright.config.js +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/ui-tests/tests/calkit.spec.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/ui-tests/yarn.lock +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/uv.lock +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/vscode-ext/.gitignore +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/vscode-ext/.vscodeignore +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/vscode-ext/CHANGELOG.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/vscode-ext/LICENSE +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/vscode-ext/README.md +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/vscode-ext/images/calkit-no-bg.png +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/vscode-ext/scripts/set-proposed-api.js +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/vscode-ext/src/notebooks.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/vscode-ext/src/test/environments.test.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/vscode-ext/src/test/notebooks.test.ts +0 -0
- {calkit_python-0.37.1 → calkit_python-0.37.3}/yarn.lock +0 -0
|
@@ -37,15 +37,12 @@ test-docs: sync-docs ## Test if documentation can be built without warnings or e
|
|
|
37
37
|
@uv run mkdocs build -s
|
|
38
38
|
|
|
39
39
|
.PHONY: sync-docs
|
|
40
|
-
sync-docs:
|
|
40
|
+
sync-docs: ## Sync documentation content from docs/*.md into README.md.
|
|
41
|
+
@echo "🚀 Generating docs references"
|
|
42
|
+
@uv run python scripts/generate-docs-references.py
|
|
41
43
|
@echo "🚀 Syncing documentation"
|
|
42
44
|
@uv run python scripts/sync-docs.py
|
|
43
45
|
|
|
44
|
-
.PHONY: cli-reference
|
|
45
|
-
cli-reference: ## Generate docs/cli-reference.md from CLI help output.
|
|
46
|
-
@echo "🚀 Generating CLI reference"
|
|
47
|
-
@uv run python scripts/generate-cli-reference.py
|
|
48
|
-
|
|
49
46
|
.PHONY: docs
|
|
50
47
|
docs: sync-docs ## Build and serve the documentation.
|
|
51
48
|
@uv run mkdocs serve --livereload
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: calkit-python
|
|
3
|
-
Version: 0.37.
|
|
3
|
+
Version: 0.37.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
|
|
@@ -76,56 +76,67 @@ Description-Content-Type: text/markdown
|
|
|
76
76
|
</a>
|
|
77
77
|
</p>
|
|
78
78
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
79
|
+
<!-- INCLUDE: docs/index.md -->
|
|
80
|
+
|
|
81
|
+
Calkit helps you manage and automate research projects like a software
|
|
82
|
+
engineer.
|
|
83
|
+
|
|
84
|
+
Define computational environments,
|
|
85
|
+
steps that process your data, create figures,
|
|
86
|
+
presentations, and publications, connect to external tools,
|
|
87
|
+
then iterate quickly and painlessly until your research questions are
|
|
88
|
+
answered, tracking changes to all files along the way.
|
|
89
|
+
At the end, deliver your entire project as a self-contained, self-documenting,
|
|
90
|
+
version-controlled, and
|
|
91
|
+
[single button reproducible](https://doi.org/10.1190/1.1822162)
|
|
92
|
+
"calculation kit" so you and others can easily verify
|
|
93
|
+
and build upon the results.
|
|
94
|
+
|
|
95
|
+
## Guiding principles
|
|
96
|
+
|
|
97
|
+
- Quality comes from iteration. Automation reduces the time and effort
|
|
98
|
+
needed to iterate, thereby increasing iteration and quality.
|
|
99
|
+
- Automating a step can and should take roughly
|
|
100
|
+
the same amount of time as doing it once manually,
|
|
101
|
+
therefore it's almost always worth it.
|
|
102
|
+
- Working in a "quick and dirty" way can easily become _not quick_ when
|
|
103
|
+
the dirtiness results in mistakes and/or discourages working in small steps.
|
|
102
104
|
|
|
103
105
|
## Features
|
|
104
106
|
|
|
105
|
-
- A
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
107
|
+
- A simplified [version control](https://docs.calkit.org/version-control)
|
|
108
|
+
interface that unifies Git and DVC (Data Version Control),
|
|
109
|
+
so all materials can be kept in the same project repository.
|
|
110
|
+
This way, code doesn't need to be siloed away from other
|
|
111
|
+
important artifacts like datasets, models, figures, or article PDFs,
|
|
112
|
+
allowing you to work on all parts of a project without hopping around to
|
|
113
|
+
different tools.
|
|
114
|
+
- [Computational environment management](https://docs.calkit.org/environments) with support for many
|
|
115
|
+
languages and environment managers: Conda, Docker, uv, Julia, Renv, and more.
|
|
116
|
+
No need to create and update environments on your own. Calkit will handle
|
|
117
|
+
them as needed.
|
|
118
|
+
- An environment-aware build system or [pipeline](https://docs.calkit.org/pipeline) with
|
|
119
|
+
a simple declarative syntax and
|
|
120
|
+
output caching so you don't need to think about which steps or stages
|
|
121
|
+
need to be rerun after changing any part of the project.
|
|
122
|
+
Simply call `calkit run`.
|
|
123
|
+
Compose your pipeline from many different kinds of stages,
|
|
124
|
+
including simple scripts, commands, Jupyter Notebooks, LaTeX, and more.
|
|
122
125
|
- A complementary self-hostable and GitHub-integrated
|
|
123
|
-
[cloud
|
|
126
|
+
[cloud platform](https://github.com/calkit/calkit-cloud)
|
|
124
127
|
to facilitate backup, collaboration,
|
|
125
128
|
and sharing throughout the entire research lifecycle.
|
|
126
|
-
- [Overleaf integration](https://docs.calkit.org/overleaf/), so
|
|
127
|
-
|
|
128
|
-
|
|
129
|
+
- [Overleaf integration](https://docs.calkit.org/overleaf/), so
|
|
130
|
+
analysis, visualization, and writing can all stay in sync
|
|
131
|
+
(no more manual uploads!)
|
|
132
|
+
- Support for running on high performance computing (HPC) systems that use
|
|
133
|
+
[SLURM schedulers](https://docs.calkit.org/pipeline/slurm).
|
|
134
|
+
- Support for running with [GitHub Actions](https://docs.calkit.org/tutorials/github-actions).
|
|
135
|
+
- Extensions for doing all of the above graphically in
|
|
136
|
+
[JupyterLab](https://docs.calkit.org/jupyterlab) and
|
|
137
|
+
[VS Code](https://marketplace.visualstudio.com/items?itemName=Calkit.calkit-vscode).
|
|
138
|
+
|
|
139
|
+
<!-- END INCLUDE -->
|
|
129
140
|
|
|
130
141
|
## Installation
|
|
131
142
|
|
|
@@ -17,56 +17,67 @@
|
|
|
17
17
|
</a>
|
|
18
18
|
</p>
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
20
|
+
<!-- INCLUDE: docs/index.md -->
|
|
21
|
+
|
|
22
|
+
Calkit helps you manage and automate research projects like a software
|
|
23
|
+
engineer.
|
|
24
|
+
|
|
25
|
+
Define computational environments,
|
|
26
|
+
steps that process your data, create figures,
|
|
27
|
+
presentations, and publications, connect to external tools,
|
|
28
|
+
then iterate quickly and painlessly until your research questions are
|
|
29
|
+
answered, tracking changes to all files along the way.
|
|
30
|
+
At the end, deliver your entire project as a self-contained, self-documenting,
|
|
31
|
+
version-controlled, and
|
|
32
|
+
[single button reproducible](https://doi.org/10.1190/1.1822162)
|
|
33
|
+
"calculation kit" so you and others can easily verify
|
|
34
|
+
and build upon the results.
|
|
35
|
+
|
|
36
|
+
## Guiding principles
|
|
37
|
+
|
|
38
|
+
- Quality comes from iteration. Automation reduces the time and effort
|
|
39
|
+
needed to iterate, thereby increasing iteration and quality.
|
|
40
|
+
- Automating a step can and should take roughly
|
|
41
|
+
the same amount of time as doing it once manually,
|
|
42
|
+
therefore it's almost always worth it.
|
|
43
|
+
- Working in a "quick and dirty" way can easily become _not quick_ when
|
|
44
|
+
the dirtiness results in mistakes and/or discourages working in small steps.
|
|
43
45
|
|
|
44
46
|
## Features
|
|
45
47
|
|
|
46
|
-
- A
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
48
|
+
- A simplified [version control](https://docs.calkit.org/version-control)
|
|
49
|
+
interface that unifies Git and DVC (Data Version Control),
|
|
50
|
+
so all materials can be kept in the same project repository.
|
|
51
|
+
This way, code doesn't need to be siloed away from other
|
|
52
|
+
important artifacts like datasets, models, figures, or article PDFs,
|
|
53
|
+
allowing you to work on all parts of a project without hopping around to
|
|
54
|
+
different tools.
|
|
55
|
+
- [Computational environment management](https://docs.calkit.org/environments) with support for many
|
|
56
|
+
languages and environment managers: Conda, Docker, uv, Julia, Renv, and more.
|
|
57
|
+
No need to create and update environments on your own. Calkit will handle
|
|
58
|
+
them as needed.
|
|
59
|
+
- An environment-aware build system or [pipeline](https://docs.calkit.org/pipeline) with
|
|
60
|
+
a simple declarative syntax and
|
|
61
|
+
output caching so you don't need to think about which steps or stages
|
|
62
|
+
need to be rerun after changing any part of the project.
|
|
63
|
+
Simply call `calkit run`.
|
|
64
|
+
Compose your pipeline from many different kinds of stages,
|
|
65
|
+
including simple scripts, commands, Jupyter Notebooks, LaTeX, and more.
|
|
63
66
|
- A complementary self-hostable and GitHub-integrated
|
|
64
|
-
[cloud
|
|
67
|
+
[cloud platform](https://github.com/calkit/calkit-cloud)
|
|
65
68
|
to facilitate backup, collaboration,
|
|
66
69
|
and sharing throughout the entire research lifecycle.
|
|
67
|
-
- [Overleaf integration](https://docs.calkit.org/overleaf/), so
|
|
68
|
-
|
|
69
|
-
|
|
70
|
+
- [Overleaf integration](https://docs.calkit.org/overleaf/), so
|
|
71
|
+
analysis, visualization, and writing can all stay in sync
|
|
72
|
+
(no more manual uploads!)
|
|
73
|
+
- Support for running on high performance computing (HPC) systems that use
|
|
74
|
+
[SLURM schedulers](https://docs.calkit.org/pipeline/slurm).
|
|
75
|
+
- Support for running with [GitHub Actions](https://docs.calkit.org/tutorials/github-actions).
|
|
76
|
+
- Extensions for doing all of the above graphically in
|
|
77
|
+
[JupyterLab](https://docs.calkit.org/jupyterlab) and
|
|
78
|
+
[VS Code](https://marketplace.visualstudio.com/items?itemName=Calkit.calkit-vscode).
|
|
79
|
+
|
|
80
|
+
<!-- END INCLUDE -->
|
|
70
81
|
|
|
71
82
|
## Installation
|
|
72
83
|
|
|
@@ -31,6 +31,217 @@ from calkit.environments import (
|
|
|
31
31
|
check_app = typer.Typer(no_args_is_help=True)
|
|
32
32
|
|
|
33
33
|
|
|
34
|
+
def _juliaup_version_installed(julia_version: str) -> bool:
|
|
35
|
+
"""Return True if juliaup already has the given channel installed locally."""
|
|
36
|
+
try:
|
|
37
|
+
result = subprocess.run(
|
|
38
|
+
["juliaup", "status"],
|
|
39
|
+
capture_output=True,
|
|
40
|
+
text=True,
|
|
41
|
+
check=False,
|
|
42
|
+
timeout=10,
|
|
43
|
+
)
|
|
44
|
+
except FileNotFoundError:
|
|
45
|
+
return False
|
|
46
|
+
except subprocess.TimeoutExpired:
|
|
47
|
+
warn("Timed out while running `juliaup status`.")
|
|
48
|
+
return False
|
|
49
|
+
if result.returncode != 0:
|
|
50
|
+
err_output = (result.stderr or result.stdout or "").strip()
|
|
51
|
+
if err_output:
|
|
52
|
+
warn(f"`juliaup status` failed: {err_output}")
|
|
53
|
+
else:
|
|
54
|
+
warn(
|
|
55
|
+
f"`juliaup status` failed with exit code {result.returncode}."
|
|
56
|
+
)
|
|
57
|
+
return False
|
|
58
|
+
for line in result.stdout.splitlines():
|
|
59
|
+
parts = line.split()
|
|
60
|
+
if not parts:
|
|
61
|
+
continue
|
|
62
|
+
# Columns: [Default?] Channel Version [Update?]
|
|
63
|
+
# Default column is either empty or "*", so channel is parts[0] or parts[1]
|
|
64
|
+
for col in parts[:2]:
|
|
65
|
+
if col == julia_version:
|
|
66
|
+
return True
|
|
67
|
+
return False
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _check_julia_env(
|
|
71
|
+
env_path: str,
|
|
72
|
+
julia_version: str | None = None,
|
|
73
|
+
verbose: bool = False,
|
|
74
|
+
cache_key: str | None = None,
|
|
75
|
+
) -> str:
|
|
76
|
+
"""Check a Julia environment and instantiate only when needed."""
|
|
77
|
+
abs_env_path = os.path.abspath(env_path)
|
|
78
|
+
env_fname = os.path.basename(abs_env_path)
|
|
79
|
+
if env_fname != "Project.toml":
|
|
80
|
+
raise_error(
|
|
81
|
+
"Julia environments require a path pointing to Project.toml"
|
|
82
|
+
)
|
|
83
|
+
env_dir = os.path.dirname(abs_env_path) or "."
|
|
84
|
+
env_path_for_cache = os.path.basename(abs_env_path)
|
|
85
|
+
env = {
|
|
86
|
+
"kind": "julia",
|
|
87
|
+
"path": env_path_for_cache,
|
|
88
|
+
"julia": julia_version or "",
|
|
89
|
+
}
|
|
90
|
+
cache_env_name = cache_key or (
|
|
91
|
+
f"julia::{abs_env_path}::{julia_version or ''}"
|
|
92
|
+
)
|
|
93
|
+
if calkit.environments.check_cache(
|
|
94
|
+
env_name=cache_env_name,
|
|
95
|
+
env=env,
|
|
96
|
+
wdir=env_dir,
|
|
97
|
+
respect_ttl=False,
|
|
98
|
+
):
|
|
99
|
+
if verbose:
|
|
100
|
+
typer.echo(
|
|
101
|
+
"Julia environment cache is valid; skipping Pkg.instantiate()"
|
|
102
|
+
)
|
|
103
|
+
lock_fpath = calkit.environments.get_env_lock_fpath(
|
|
104
|
+
env=env,
|
|
105
|
+
env_name=cache_env_name,
|
|
106
|
+
wdir=env_dir,
|
|
107
|
+
as_posix=False,
|
|
108
|
+
)
|
|
109
|
+
return lock_fpath or os.path.join(env_dir, "Manifest.toml")
|
|
110
|
+
if julia_version:
|
|
111
|
+
if shutil.which("juliaup") is not None:
|
|
112
|
+
if _juliaup_version_installed(julia_version):
|
|
113
|
+
if verbose:
|
|
114
|
+
typer.echo(
|
|
115
|
+
f"Julia {julia_version} is already installed; "
|
|
116
|
+
"skipping juliaup add"
|
|
117
|
+
)
|
|
118
|
+
else:
|
|
119
|
+
cmd = ["juliaup", "add", julia_version]
|
|
120
|
+
if verbose:
|
|
121
|
+
typer.echo(f"Running command: {cmd}")
|
|
122
|
+
try:
|
|
123
|
+
subprocess.run(cmd, check=True)
|
|
124
|
+
except subprocess.CalledProcessError:
|
|
125
|
+
raise_error(
|
|
126
|
+
f"Failed to install Julia version {julia_version}"
|
|
127
|
+
)
|
|
128
|
+
else:
|
|
129
|
+
try:
|
|
130
|
+
compatible = calkit.julia.current_version_is_compatible(
|
|
131
|
+
julia_version
|
|
132
|
+
)
|
|
133
|
+
except ValueError as e:
|
|
134
|
+
raise_error(str(e))
|
|
135
|
+
if not compatible:
|
|
136
|
+
raise_error(
|
|
137
|
+
"Current Julia version is not compatible with required "
|
|
138
|
+
f"version ({julia_version}), and juliaup is not "
|
|
139
|
+
"available to install it"
|
|
140
|
+
)
|
|
141
|
+
deps_to_add: list[str] = []
|
|
142
|
+
try:
|
|
143
|
+
with open(abs_env_path, "r") as f:
|
|
144
|
+
content = f.read()
|
|
145
|
+
lines = [line.rstrip() for line in content.splitlines()]
|
|
146
|
+
deps_section = False
|
|
147
|
+
deps_found = False
|
|
148
|
+
for line in lines:
|
|
149
|
+
stripped = line.strip()
|
|
150
|
+
if stripped == "[deps]":
|
|
151
|
+
deps_section = True
|
|
152
|
+
continue
|
|
153
|
+
if deps_section:
|
|
154
|
+
if stripped.startswith("[") and stripped.endswith("]"):
|
|
155
|
+
break
|
|
156
|
+
if stripped and not stripped.startswith("#"):
|
|
157
|
+
if "=" in stripped:
|
|
158
|
+
deps_found = True
|
|
159
|
+
break
|
|
160
|
+
if not deps_found:
|
|
161
|
+
for idx, line in enumerate(lines):
|
|
162
|
+
marker = "# Dependencies (add with Julia's Pkg.add):"
|
|
163
|
+
if line.strip() == marker and idx + 1 < len(lines):
|
|
164
|
+
dep_line = lines[idx + 1].strip()
|
|
165
|
+
if dep_line.startswith("#"):
|
|
166
|
+
dep_line = dep_line.lstrip("#").strip()
|
|
167
|
+
deps_to_add = [
|
|
168
|
+
dep.strip()
|
|
169
|
+
for dep in dep_line.split(",")
|
|
170
|
+
if dep.strip()
|
|
171
|
+
]
|
|
172
|
+
break
|
|
173
|
+
except OSError:
|
|
174
|
+
deps_to_add = []
|
|
175
|
+
if deps_to_add:
|
|
176
|
+
pkg_list = ", ".join(f'"{dep}"' for dep in deps_to_add)
|
|
177
|
+
cmd = ["julia"]
|
|
178
|
+
if julia_version:
|
|
179
|
+
cmd.append(f"+{julia_version}")
|
|
180
|
+
cmd += [
|
|
181
|
+
f"--project={env_dir}",
|
|
182
|
+
"-e",
|
|
183
|
+
f"using Pkg; Pkg.add([{pkg_list}]);",
|
|
184
|
+
]
|
|
185
|
+
if julia_version:
|
|
186
|
+
try:
|
|
187
|
+
cmd = calkit.julia.check_version_in_command(cmd)
|
|
188
|
+
except Exception as e:
|
|
189
|
+
raise_error(f"Failed to check Julia version: {e}")
|
|
190
|
+
cmd = calkit.julia.ensure_startup_file_disabled_in_command(cmd)
|
|
191
|
+
try:
|
|
192
|
+
subprocess.check_call(
|
|
193
|
+
cmd,
|
|
194
|
+
env=os.environ.copy() | {"JULIA_LOAD_PATH": "@:@stdlib"},
|
|
195
|
+
)
|
|
196
|
+
except subprocess.CalledProcessError:
|
|
197
|
+
calkit.environments.save_cache(
|
|
198
|
+
env_name=cache_env_name,
|
|
199
|
+
env=env,
|
|
200
|
+
wdir=env_dir,
|
|
201
|
+
success=False,
|
|
202
|
+
)
|
|
203
|
+
raise_error("Failed to add Julia dependencies")
|
|
204
|
+
cmd = ["julia"]
|
|
205
|
+
if julia_version:
|
|
206
|
+
cmd.append(f"+{julia_version}")
|
|
207
|
+
cmd += [
|
|
208
|
+
f"--project={env_dir}",
|
|
209
|
+
"-e",
|
|
210
|
+
"using Pkg; Pkg.instantiate();",
|
|
211
|
+
]
|
|
212
|
+
if julia_version:
|
|
213
|
+
try:
|
|
214
|
+
cmd = calkit.julia.check_version_in_command(cmd)
|
|
215
|
+
except Exception as e:
|
|
216
|
+
raise_error(f"Failed to check Julia version: {e}")
|
|
217
|
+
cmd = calkit.julia.ensure_startup_file_disabled_in_command(cmd)
|
|
218
|
+
try:
|
|
219
|
+
subprocess.check_call(
|
|
220
|
+
cmd, env=os.environ.copy() | {"JULIA_LOAD_PATH": "@:@stdlib"}
|
|
221
|
+
)
|
|
222
|
+
except subprocess.CalledProcessError:
|
|
223
|
+
calkit.environments.save_cache(
|
|
224
|
+
env_name=cache_env_name,
|
|
225
|
+
env=env,
|
|
226
|
+
wdir=env_dir,
|
|
227
|
+
success=False,
|
|
228
|
+
)
|
|
229
|
+
raise_error("Failed to check julia environment")
|
|
230
|
+
calkit.environments.save_cache(
|
|
231
|
+
env_name=cache_env_name,
|
|
232
|
+
env=env,
|
|
233
|
+
wdir=env_dir,
|
|
234
|
+
success=True,
|
|
235
|
+
)
|
|
236
|
+
lock_fpath = calkit.environments.get_env_lock_fpath(
|
|
237
|
+
env=env,
|
|
238
|
+
env_name=cache_env_name,
|
|
239
|
+
wdir=env_dir,
|
|
240
|
+
as_posix=False,
|
|
241
|
+
)
|
|
242
|
+
return lock_fpath or os.path.join(env_dir, "Manifest.toml")
|
|
243
|
+
|
|
244
|
+
|
|
34
245
|
@check_app.command(name="repro")
|
|
35
246
|
def check_repro(
|
|
36
247
|
wdir: Annotated[
|
|
@@ -190,116 +401,47 @@ def check_environment(
|
|
|
190
401
|
julia_version = env.get("julia")
|
|
191
402
|
if julia_version is None:
|
|
192
403
|
raise_error("Julia environments require a Julia version")
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
if shutil.which("juliaup") is not None:
|
|
200
|
-
cmd = ["juliaup", "add", julia_version]
|
|
201
|
-
if verbose:
|
|
202
|
-
typer.echo(f"Running command: {cmd}")
|
|
203
|
-
try:
|
|
204
|
-
subprocess.run(cmd, check=True)
|
|
205
|
-
except subprocess.CalledProcessError:
|
|
206
|
-
raise_error(f"Failed to install Julia version {julia_version}")
|
|
207
|
-
else:
|
|
208
|
-
try:
|
|
209
|
-
compatible = calkit.julia.current_version_is_compatible(
|
|
210
|
-
julia_version
|
|
211
|
-
)
|
|
212
|
-
except ValueError as e:
|
|
213
|
-
raise_error(str(e))
|
|
214
|
-
if not compatible:
|
|
215
|
-
raise_error(
|
|
216
|
-
f"Current Julia version is not compatible with required "
|
|
217
|
-
f"version ({julia_version}), and juliaup is not available to "
|
|
218
|
-
"install it"
|
|
219
|
-
)
|
|
220
|
-
env_dir = os.path.dirname(env_path)
|
|
221
|
-
if not env_dir:
|
|
222
|
-
env_dir = "."
|
|
223
|
-
# If auto-detection couldn't resolve UUIDs, Project.toml includes a
|
|
224
|
-
# commented dependency list
|
|
225
|
-
# In that case, add those packages with
|
|
226
|
-
# Pkg.add before instantiating so the env is usable at run time
|
|
227
|
-
deps_to_add: list[str] = []
|
|
228
|
-
try:
|
|
229
|
-
with open(env_path, "r") as f:
|
|
230
|
-
content = f.read()
|
|
231
|
-
lines = [line.rstrip() for line in content.splitlines()]
|
|
232
|
-
deps_section = False
|
|
233
|
-
deps_found = False
|
|
234
|
-
for line in lines:
|
|
235
|
-
stripped = line.strip()
|
|
236
|
-
if stripped == "[deps]":
|
|
237
|
-
deps_section = True
|
|
238
|
-
continue
|
|
239
|
-
if deps_section:
|
|
240
|
-
if stripped.startswith("[") and stripped.endswith("]"):
|
|
241
|
-
break
|
|
242
|
-
if stripped and not stripped.startswith("#"):
|
|
243
|
-
if "=" in stripped:
|
|
244
|
-
deps_found = True
|
|
245
|
-
break
|
|
246
|
-
if not deps_found:
|
|
247
|
-
for idx, line in enumerate(lines):
|
|
248
|
-
marker = "# Dependencies (add with Julia's Pkg.add):"
|
|
249
|
-
if line.strip() == marker and idx + 1 < len(lines):
|
|
250
|
-
dep_line = lines[idx + 1].strip()
|
|
251
|
-
if dep_line.startswith("#"):
|
|
252
|
-
dep_line = dep_line.lstrip("#").strip()
|
|
253
|
-
deps_to_add = [
|
|
254
|
-
dep.strip()
|
|
255
|
-
for dep in dep_line.split(",")
|
|
256
|
-
if dep.strip()
|
|
257
|
-
]
|
|
258
|
-
break
|
|
259
|
-
except OSError:
|
|
260
|
-
deps_to_add = []
|
|
261
|
-
if deps_to_add:
|
|
262
|
-
pkg_list = ", ".join(f'"{dep}"' for dep in deps_to_add)
|
|
263
|
-
cmd = [
|
|
264
|
-
"julia",
|
|
265
|
-
f"+{julia_version}",
|
|
266
|
-
f"--project={env_dir}",
|
|
267
|
-
"-e",
|
|
268
|
-
f"using Pkg; Pkg.add([{pkg_list}]);",
|
|
269
|
-
]
|
|
270
|
-
try:
|
|
271
|
-
cmd = calkit.julia.check_version_in_command(cmd)
|
|
272
|
-
except Exception as e:
|
|
273
|
-
raise_error(f"Failed to check Julia version: {e}")
|
|
274
|
-
try:
|
|
275
|
-
subprocess.check_call(
|
|
276
|
-
cmd,
|
|
277
|
-
env=os.environ.copy() | {"JULIA_LOAD_PATH": "@:@stdlib"},
|
|
278
|
-
)
|
|
279
|
-
except subprocess.CalledProcessError:
|
|
280
|
-
raise_error("Failed to add Julia dependencies")
|
|
281
|
-
cmd = [
|
|
282
|
-
"julia",
|
|
283
|
-
f"+{julia_version}",
|
|
284
|
-
f"--project={env_dir}",
|
|
285
|
-
"-e",
|
|
286
|
-
"using Pkg; Pkg.instantiate();",
|
|
287
|
-
]
|
|
288
|
-
try:
|
|
289
|
-
cmd = calkit.julia.check_version_in_command(cmd)
|
|
290
|
-
except Exception as e:
|
|
291
|
-
raise_error(f"Failed to check Julia version: {e}")
|
|
292
|
-
try:
|
|
293
|
-
subprocess.check_call(
|
|
294
|
-
cmd, env=os.environ.copy() | {"JULIA_LOAD_PATH": "@:@stdlib"}
|
|
295
|
-
)
|
|
296
|
-
except subprocess.CalledProcessError:
|
|
297
|
-
raise_error("Failed to check julia environment")
|
|
404
|
+
_check_julia_env(
|
|
405
|
+
env_path=env_path,
|
|
406
|
+
julia_version=julia_version,
|
|
407
|
+
verbose=verbose,
|
|
408
|
+
cache_key=env_name,
|
|
409
|
+
)
|
|
298
410
|
else:
|
|
299
411
|
raise_error(f"Environment kind '{env['kind']}' not supported")
|
|
300
412
|
return get_env_lock_fpath(env=env, env_name=env_name, as_posix=False)
|
|
301
413
|
|
|
302
414
|
|
|
415
|
+
@check_app.command(
|
|
416
|
+
name="julia-env",
|
|
417
|
+
help=(
|
|
418
|
+
"Check a Julia environment and instantiate only when project, "
|
|
419
|
+
"manifest, and package cache state have changed."
|
|
420
|
+
),
|
|
421
|
+
)
|
|
422
|
+
def check_julia_env(
|
|
423
|
+
env_path: Annotated[
|
|
424
|
+
str,
|
|
425
|
+
typer.Argument(help="Path to Julia Project.toml file."),
|
|
426
|
+
] = "Project.toml",
|
|
427
|
+
julia_version: Annotated[
|
|
428
|
+
str | None,
|
|
429
|
+
typer.Option(
|
|
430
|
+
"--julia",
|
|
431
|
+
help="Julia version to enforce (e.g., 1.11).",
|
|
432
|
+
),
|
|
433
|
+
] = None,
|
|
434
|
+
verbose: Annotated[
|
|
435
|
+
bool, typer.Option("--verbose", help="Print verbose output.")
|
|
436
|
+
] = False,
|
|
437
|
+
) -> str:
|
|
438
|
+
return _check_julia_env(
|
|
439
|
+
env_path=env_path,
|
|
440
|
+
julia_version=julia_version,
|
|
441
|
+
verbose=verbose,
|
|
442
|
+
)
|
|
443
|
+
|
|
444
|
+
|
|
303
445
|
@check_app.command(
|
|
304
446
|
name="envs",
|
|
305
447
|
help="Check that all environments are up-to-date.",
|
|
@@ -1910,6 +1910,9 @@ def run_in_env(
|
|
|
1910
1910
|
julia_cmd = calkit.julia.check_version_in_command(julia_cmd)
|
|
1911
1911
|
except Exception as e:
|
|
1912
1912
|
raise_error(f"Failed to check Julia version: {e}")
|
|
1913
|
+
julia_cmd = calkit.julia.ensure_startup_file_disabled_in_command(
|
|
1914
|
+
julia_cmd
|
|
1915
|
+
)
|
|
1913
1916
|
if verbose:
|
|
1914
1917
|
typer.echo(f"Running command: {julia_cmd}")
|
|
1915
1918
|
try:
|