calkit-python 0.37.0__tar.gz → 0.37.2__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.0 → calkit_python-0.37.2}/PKG-INFO +1 -1
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/config.py +8 -1
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/main/core.py +4 -4
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/new.py +1 -3
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/update.py +1 -3
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/dvc/core.py +47 -11
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/dvc/zip.py +73 -9
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/pipeline.py +31 -19
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/releases.py +15 -10
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/dvc/test_core.py +69 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/dvc/test_zip.py +8 -1
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_releases.py +6 -6
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/cli-reference.md +788 -752
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/version-control.md +1 -1
- {calkit_python-0.37.0 → calkit_python-0.37.2}/scripts/generate-cli-reference.py +174 -36
- {calkit_python-0.37.0 → calkit_python-0.37.2}/.gitignore +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/.pre-commit-config.yaml +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/.prettierignore +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/.python-version +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/.vscode/launch.json +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/.vscode/tasks.json +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/.yarnrc.yml +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/CITATION.cff +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/CODE_OF_CONDUCT.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/CONTRIBUTING.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/LICENSE +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/Makefile +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/README.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/babel.config.js +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/__init__.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/__main__.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/calc.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/check.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/__init__.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/check.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/cloud.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/core.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/describe.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/import_.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/latex.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/list.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/main/__init__.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/main/xr.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/notebooks.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/office.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/overleaf.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cli/slurm.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/cloud.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/conda.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/config.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/core.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/datasets.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/detect.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/docker.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/dvc/__init__.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/environments.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/fs.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/git.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/github.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/gui.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/invenio.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/julia.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/jupyter.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/jupyterlab/__init__.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/jupyterlab/routes.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/labextension/package.json +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/labextension/schemas/calkit/package.json.orig +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/labextension/schemas/calkit/plugin.json +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/labextension/static/502.9a2c5772a15466e923ef.js +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/labextension/static/695.2c41003a452d43d2b358.js +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/labextension/static/867.a42a046aa5108f54f8fb.js +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/labextension/static/909.651be47ca47390b78a92.js +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/labextension/static/b2f1c3efe70cb539d121.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/labextension/static/remoteEntry.c091821b3d7f2d287a67.js +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/labextension/static/style.js +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/labextension/static/third-party-licenses.json +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/licenses.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/magics.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/matlab.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/models/__init__.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/models/core.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/models/io.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/models/iteration.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/models/pipeline.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/notebooks.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/office.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/ops.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/overleaf.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/server.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/templates/__init__.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/templates/core.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/templates/latex/__init__.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/templates/latex/article/paper.tex +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/templates/latex/core.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/templates/latex/jfm/jfm.bst +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/templates/latex/jfm/jfm.cls +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/templates/latex/jfm/paper.tex +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/templates/latex/jfm/upmath.sty +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/__init__.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/cli/__init__.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/cli/main/__init__.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/cli/main/test_core.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/cli/main/test_xr.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/cli/test_check.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/cli/test_config.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/cli/test_import.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/cli/test_latex.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/cli/test_list.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/cli/test_new.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/cli/test_notebooks.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/cli/test_overleaf.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/cli/test_update.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/dvc/__init__.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/jupyterlab/__init__.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/jupyterlab/test_routes.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/models/__init__.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/models/test_iteration.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/models/test_pipeline.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_calc.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_check.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_conda.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_core.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_detect.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_docker.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_environments.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_fs.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_git.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_invenio.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_julia.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_jupyter.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_magics.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_matlab.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_notebooks.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_pipeline.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/calkit/tests/test_templates.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/conftest.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/CNAME +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/apps.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/calculations.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/calkit-yaml.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/cloud-integration.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/datasets.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/dependencies.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/environments.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/examples.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/governance.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/help.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/img/c-to-the-k-white.svg +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/img/calkit-fragmentation-compendium.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/img/calkit-no-bg.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/img/connect-zenodo.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/img/jupyterlab/all-green.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/img/jupyterlab/collect-data-stale.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/img/jupyterlab/new-env.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/img/jupyterlab/new-notebook.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/img/jupyterlab/pipeline-badge.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/img/jupyterlab-params.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/img/plos-osi-code-2024-03.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/img/vscode-nb-params.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/index.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/installation.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/jupyterlab.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/local-server.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/notebooks.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/overleaf.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/pipeline/index.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/pipeline/manual-steps.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/pipeline/running-and-logging.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/pipeline/slurm.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/quickstart.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/references.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/releases.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/reproducibility.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/adding-latex-pub-docker.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/conda-envs.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/existing-project.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/first-project.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/github-actions.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/actions-repo-secrets.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/latex-codespaces/push.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/chart-more-rows.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/create-project.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/excel-chart.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/excel-data.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/needs-clone.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/new-stage.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/status-more-rows.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/untracked-data.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/updated-publication.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/office/workflow-page.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/openfoam/clone.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/openfoam/create-project.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/openfoam/new-token.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/openfoam/reclone.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/quick-actions.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/img/run-proc.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/index.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/jupyterlab.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/latex-codespaces.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/matlab.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/notebook-pipeline.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/office.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/openfoam.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/docs/tutorials/procedures.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/install.json +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/jest.config.js +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/jupyter-config/server-config/calkit.json +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/mkdocs.yml +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/package.json +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/pyproject.toml +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/schema/plugin.json +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/scripts/install.ps1 +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/scripts/install.sh +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/scripts/make-calk9.sh +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/scripts/sync-docs.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/__tests__/useQueries.spec.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/calkit-config.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/cell-output-marker.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/components/commit-dialog.tsx +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/components/environment-editor.tsx +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/components/notebook-registration.tsx +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/components/notebook-toolbar.tsx +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/components/pipeline-status-bar.tsx +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/components/project-info-editor.tsx +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/components/sidebar-settings.tsx +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/components/sidebar.tsx +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/components/stage-editor.tsx +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/feature-flags.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/file-browser-menu.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/hooks/__tests__/useQueries.test.tsx +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/hooks/useQueries.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/icons.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/index.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/io-tracker.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/pipeline-state.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/queryClient.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/request.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/src/shims-mainmenu.d.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/style/base.css +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/style/cell-output-marker.css +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/style/environment-editor.css +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/style/environment-selector.css +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/style/img/calkit-no-bg.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/style/index.css +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/style/index.js +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/style/notebook-toolbar.css +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/style/pipeline-status-bar.css +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/style/sidebar.css +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/test/dvc-md5-dir/osx-arm64.txt +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/test/nb-julia.ipynb +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/test/nb-params.ipynb +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/test/nb-subdir.ipynb +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/test/pipeline.ipynb +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/test/script.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/test/test-log.log +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/tsconfig.json +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/tsconfig.test.json +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/ui-tests/.gitignore +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/ui-tests/README.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/ui-tests/jupyter_server_test_config.py +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/ui-tests/package.json +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/ui-tests/playwright.config.js +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/ui-tests/tests/calkit.spec.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/ui-tests/yarn.lock +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/uv.lock +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/vscode-ext/.gitignore +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/vscode-ext/.vscodeignore +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/vscode-ext/CHANGELOG.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/vscode-ext/LICENSE +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/vscode-ext/README.md +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/vscode-ext/images/calkit-no-bg.png +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/vscode-ext/package-lock.json +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/vscode-ext/package.json +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/vscode-ext/scripts/set-proposed-api.js +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/vscode-ext/src/environments.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/vscode-ext/src/extension.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/vscode-ext/src/notebooks.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/vscode-ext/src/test/environments.test.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/vscode-ext/src/test/notebooks.test.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/vscode-ext/src/types.ts +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/vscode-ext/tsconfig.json +0 -0
- {calkit_python-0.37.0 → calkit_python-0.37.2}/yarn.lock +0 -0
|
@@ -70,6 +70,13 @@ def unset_config_value(key: str):
|
|
|
70
70
|
@config_app.command(name="setup-remote", help="Alias for 'remote'.")
|
|
71
71
|
@config_app.command(name="remote")
|
|
72
72
|
def setup_remote(
|
|
73
|
+
ck: Annotated[
|
|
74
|
+
bool,
|
|
75
|
+
typer.Option(
|
|
76
|
+
"--ck",
|
|
77
|
+
help="Use a ck:// URL for the 'calkit' DVC remote.",
|
|
78
|
+
),
|
|
79
|
+
] = False,
|
|
73
80
|
no_commit: Annotated[
|
|
74
81
|
bool,
|
|
75
82
|
typer.Option(
|
|
@@ -81,7 +88,7 @@ def setup_remote(
|
|
|
81
88
|
the local config.
|
|
82
89
|
"""
|
|
83
90
|
try:
|
|
84
|
-
configure_remote()
|
|
91
|
+
configure_remote(use_ck=ck)
|
|
85
92
|
set_remote_auth()
|
|
86
93
|
except subprocess.CalledProcessError:
|
|
87
94
|
if not os.path.isfile(".dvc/config"):
|
|
@@ -347,8 +347,6 @@ def get_status(
|
|
|
347
347
|
clean_notebooks=True,
|
|
348
348
|
compile_to_dvc=True,
|
|
349
349
|
)
|
|
350
|
-
for error in pipeline_status.errors:
|
|
351
|
-
warn(error)
|
|
352
350
|
if pipeline_status.failed_environment_checks:
|
|
353
351
|
warn(
|
|
354
352
|
"Failed pipeline environment checks for: "
|
|
@@ -469,7 +467,9 @@ def get_status(
|
|
|
469
467
|
print_sep("Pipeline")
|
|
470
468
|
# Nicely format the results from pipeline status
|
|
471
469
|
if pipeline_status and pipeline_status.errors:
|
|
472
|
-
warn("Pipeline status unavailable due to errors
|
|
470
|
+
warn("Pipeline status unavailable due to errors:")
|
|
471
|
+
for error in pipeline_status.errors:
|
|
472
|
+
warn(error)
|
|
473
473
|
return
|
|
474
474
|
if pipeline_status and not pipeline_status.has_pipeline:
|
|
475
475
|
typer.echo("This project has no pipeline.")
|
|
@@ -482,7 +482,7 @@ def get_status(
|
|
|
482
482
|
continue
|
|
483
483
|
typer.echo(f" {typer.style(stage_name, fg='yellow')}:")
|
|
484
484
|
if stale_stage.modified_command:
|
|
485
|
-
typer.echo("
|
|
485
|
+
typer.echo(" modified command")
|
|
486
486
|
# Show stale outputs for this stage
|
|
487
487
|
if stale_stage.stale_outputs:
|
|
488
488
|
typer.echo(" stale outputs:")
|
|
@@ -7,7 +7,6 @@ import os
|
|
|
7
7
|
import pathlib
|
|
8
8
|
import shutil
|
|
9
9
|
import subprocess
|
|
10
|
-
import zipfile
|
|
11
10
|
from enum import Enum
|
|
12
11
|
|
|
13
12
|
import dotenv
|
|
@@ -2686,8 +2685,7 @@ def new_release(
|
|
|
2686
2685
|
zip_path = release_files_dir + "/archive.zip"
|
|
2687
2686
|
all_paths = calkit.releases.ls_files()
|
|
2688
2687
|
typer.echo(f"Adding files to {zip_path}")
|
|
2689
|
-
|
|
2690
|
-
calkit.releases.add_paths_to_zip(zipf, all_paths)
|
|
2688
|
+
calkit.releases.zip_paths(zip_path, all_paths)
|
|
2691
2689
|
typer.echo("Checking extracted project release archive")
|
|
2692
2690
|
try:
|
|
2693
2691
|
calkit.releases.check_project_release_archive(
|
|
@@ -4,7 +4,6 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import json
|
|
6
6
|
import os
|
|
7
|
-
import zipfile
|
|
8
7
|
from datetime import datetime
|
|
9
8
|
|
|
10
9
|
import git
|
|
@@ -266,8 +265,7 @@ def update_release(
|
|
|
266
265
|
zip_path = release_files_dir + "/archive.zip"
|
|
267
266
|
all_paths = calkit.releases.ls_files()
|
|
268
267
|
typer.echo(f"Adding files to {zip_path}")
|
|
269
|
-
|
|
270
|
-
calkit.releases.add_paths_to_zip(zipf, all_paths)
|
|
268
|
+
calkit.releases.zip_paths(zip_path, all_paths)
|
|
271
269
|
typer.echo("Checking project release archive")
|
|
272
270
|
try:
|
|
273
271
|
calkit.releases.check_project_release_archive(zip_path)
|
|
@@ -11,6 +11,7 @@ from typing import Any
|
|
|
11
11
|
|
|
12
12
|
import dvc.repo
|
|
13
13
|
import git
|
|
14
|
+
from configobj import ConfigObj
|
|
14
15
|
from dvc.utils.objects import cached_property
|
|
15
16
|
from dvc_objects.fs.base import ObjectFileSystem
|
|
16
17
|
from fsspec import Callback
|
|
@@ -251,10 +252,10 @@ def run_dvc_command(argv: list[str], cwd: str | None = None) -> int:
|
|
|
251
252
|
return run_dvc_cli(argv)
|
|
252
253
|
|
|
253
254
|
|
|
254
|
-
def configure_remote(wdir: str | None = None) -> str:
|
|
255
|
+
def configure_remote(wdir: str | None = None, use_ck: bool = False) -> str:
|
|
255
256
|
"""Configure a DVC remote for the current project.
|
|
256
257
|
|
|
257
|
-
TODO: Use the ck:// scheme.
|
|
258
|
+
TODO: Use the ck:// scheme by default once it's deemed stable.
|
|
258
259
|
"""
|
|
259
260
|
try:
|
|
260
261
|
project_name = calkit.detect_project_name(wdir=wdir)
|
|
@@ -275,8 +276,12 @@ def configure_remote(wdir: str | None = None) -> str:
|
|
|
275
276
|
if not url.endswith(".git"):
|
|
276
277
|
url += ".git"
|
|
277
278
|
repo.git.remote(["add", "origin", url])
|
|
278
|
-
|
|
279
|
-
|
|
279
|
+
if use_ck:
|
|
280
|
+
clear_remote_local_http_auth(wdir=wdir)
|
|
281
|
+
remote_url = f"ck://{project_name}"
|
|
282
|
+
else:
|
|
283
|
+
base_url = calkit.cloud.get_base_url()
|
|
284
|
+
remote_url = f"{base_url}/projects/{project_name}/dvc"
|
|
280
285
|
remote_name = get_app_name()
|
|
281
286
|
result = run_dvc_command(
|
|
282
287
|
["remote", "add", "-d", "-f", remote_name, remote_url],
|
|
@@ -284,17 +289,47 @@ def configure_remote(wdir: str | None = None) -> str:
|
|
|
284
289
|
)
|
|
285
290
|
if result != 0:
|
|
286
291
|
raise RuntimeError(f"Failed to add DVC remote {remote_name}")
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
if result != 0:
|
|
292
|
-
raise RuntimeError(
|
|
293
|
-
f"Failed to configure auth for DVC remote {remote_name}"
|
|
292
|
+
if not use_ck:
|
|
293
|
+
result = run_dvc_command(
|
|
294
|
+
["remote", "modify", remote_name, "auth", "custom"],
|
|
295
|
+
cwd=wdir,
|
|
294
296
|
)
|
|
297
|
+
if result != 0:
|
|
298
|
+
raise RuntimeError(
|
|
299
|
+
f"Failed to configure auth for DVC remote {remote_name}"
|
|
300
|
+
)
|
|
295
301
|
return remote_name
|
|
296
302
|
|
|
297
303
|
|
|
304
|
+
def clear_remote_local_http_auth(
|
|
305
|
+
remote_name: str | None = None, wdir: str | None = None
|
|
306
|
+
) -> None:
|
|
307
|
+
"""Remove HTTP-specific local auth settings for a DVC remote.
|
|
308
|
+
|
|
309
|
+
This clears values written to ``.dvc/config.local`` by HTTP auth setup.
|
|
310
|
+
"""
|
|
311
|
+
if remote_name is None:
|
|
312
|
+
remote_name = get_app_name()
|
|
313
|
+
config_local = Path(wdir or ".") / ".dvc" / "config.local"
|
|
314
|
+
if not config_local.is_file():
|
|
315
|
+
return
|
|
316
|
+
cfg = ConfigObj(str(config_local), encoding="utf-8")
|
|
317
|
+
section_name = f'remote "{remote_name}"'
|
|
318
|
+
remote = cfg.get(section_name)
|
|
319
|
+
if not isinstance(remote, dict):
|
|
320
|
+
return
|
|
321
|
+
changed = False
|
|
322
|
+
for option in ("custom_auth_header", "password", "auth"):
|
|
323
|
+
if option in remote:
|
|
324
|
+
remote.pop(option)
|
|
325
|
+
changed = True
|
|
326
|
+
if not changed:
|
|
327
|
+
return
|
|
328
|
+
if not remote:
|
|
329
|
+
cfg.pop(section_name, None)
|
|
330
|
+
cfg.write()
|
|
331
|
+
|
|
332
|
+
|
|
298
333
|
def set_remote_auth(
|
|
299
334
|
remote_name: str | None = None,
|
|
300
335
|
always_auth: bool = False,
|
|
@@ -312,6 +347,7 @@ def set_remote_auth(
|
|
|
312
347
|
remotes = get_remotes(wdir=wdir)
|
|
313
348
|
remote_url = remotes.get(remote_name, "")
|
|
314
349
|
if remote_url.startswith("ck://"):
|
|
350
|
+
clear_remote_local_http_auth(remote_name=remote_name, wdir=wdir)
|
|
315
351
|
logger.info(
|
|
316
352
|
f"Remote {remote_name} uses ck:// scheme; skipping HTTP auth setup"
|
|
317
353
|
)
|
|
@@ -25,6 +25,7 @@ from tqdm import tqdm
|
|
|
25
25
|
import calkit
|
|
26
26
|
import calkit.git
|
|
27
27
|
from calkit.core import DVC_SIZE_THRESH_BYTES
|
|
28
|
+
from calkit.dvc.core import run_dvc_command
|
|
28
29
|
|
|
29
30
|
LOCAL_DIR = ".calkit/local"
|
|
30
31
|
ZIPS_DIR = ".calkit/zip"
|
|
@@ -38,6 +39,12 @@ ZIP_CANDIDATE_AVG_FILE_SIZE_BYTES = 10_000_000 # 10 MB
|
|
|
38
39
|
# Minimum number of files a directory must contain to be a zip candidate;
|
|
39
40
|
# a single large file is better tracked directly by DVC
|
|
40
41
|
ZIP_CANDIDATE_MIN_FILE_COUNT = 10
|
|
42
|
+
# Favor speed for dvc-zip by default; users can tune 0..9 via env var
|
|
43
|
+
# CALKIT_DVC_ZIP_COMPRESS_LEVEL
|
|
44
|
+
ZIP_COMPRESS_LEVEL = 1
|
|
45
|
+
# Use Python zipfile by default; set CALKIT_DVC_ZIP_USE_SYSTEM=1 to try
|
|
46
|
+
# the system zip/unzip tools instead (may be faster for very large files)
|
|
47
|
+
ZIP_USE_SYSTEM_CLI = False
|
|
41
48
|
|
|
42
49
|
|
|
43
50
|
def _check_local_dir() -> Path:
|
|
@@ -285,16 +292,59 @@ def get_zip_path(workspace_path: str) -> str:
|
|
|
285
292
|
raise ValueError(f"No zip path defined for {workspace_path}")
|
|
286
293
|
|
|
287
294
|
|
|
295
|
+
def _get_zip_compress_level() -> int:
|
|
296
|
+
raw = os.getenv("CALKIT_DVC_ZIP_COMPRESS_LEVEL", str(ZIP_COMPRESS_LEVEL))
|
|
297
|
+
try:
|
|
298
|
+
level = int(raw)
|
|
299
|
+
except ValueError:
|
|
300
|
+
typer.echo(
|
|
301
|
+
"Invalid CALKIT_DVC_ZIP_COMPRESS_LEVEL value; "
|
|
302
|
+
f"using default {ZIP_COMPRESS_LEVEL}.",
|
|
303
|
+
err=True,
|
|
304
|
+
)
|
|
305
|
+
return ZIP_COMPRESS_LEVEL
|
|
306
|
+
return min(max(level, 0), 9)
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
def _should_use_system_zip_cli() -> bool:
|
|
310
|
+
raw = os.getenv("CALKIT_DVC_ZIP_USE_SYSTEM")
|
|
311
|
+
if raw is None:
|
|
312
|
+
return ZIP_USE_SYSTEM_CLI
|
|
313
|
+
return raw.strip().lower() not in {"0", "false", "no", "off"}
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def _iter_files(path: str):
|
|
317
|
+
for foldername, _, filenames in os.walk(path):
|
|
318
|
+
for filename in filenames:
|
|
319
|
+
yield os.path.join(foldername, filename)
|
|
320
|
+
|
|
321
|
+
|
|
288
322
|
def zip_(workspace_path: str, zip_path: str):
|
|
289
323
|
"""Zip a path."""
|
|
324
|
+
zip_path = os.path.abspath(zip_path)
|
|
290
325
|
output_dir = os.path.dirname(zip_path)
|
|
291
326
|
os.makedirs(output_dir, exist_ok=True)
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
327
|
+
compress_level = _get_zip_compress_level()
|
|
328
|
+
if _should_use_system_zip_cli() and shutil.which("zip"):
|
|
329
|
+
try:
|
|
330
|
+
subprocess.run(
|
|
331
|
+
["zip", "-q", f"-{compress_level}", "-r", zip_path, "."],
|
|
332
|
+
check=True,
|
|
333
|
+
cwd=workspace_path,
|
|
334
|
+
)
|
|
335
|
+
return
|
|
336
|
+
except Exception:
|
|
337
|
+
typer.echo(
|
|
338
|
+
"System zip failed; falling back to Python zipfile.",
|
|
339
|
+
err=True,
|
|
340
|
+
)
|
|
341
|
+
all_files = list(_iter_files(workspace_path))
|
|
342
|
+
with ZipFile(
|
|
343
|
+
zip_path,
|
|
344
|
+
"w",
|
|
345
|
+
compression=zipfile.ZIP_DEFLATED,
|
|
346
|
+
compresslevel=compress_level,
|
|
347
|
+
) as zip_file:
|
|
298
348
|
for file_path in tqdm(all_files, desc="Zipping", unit="file"):
|
|
299
349
|
zip_file.write(
|
|
300
350
|
file_path, os.path.relpath(file_path, workspace_path)
|
|
@@ -303,11 +353,25 @@ def zip_(workspace_path: str, zip_path: str):
|
|
|
303
353
|
|
|
304
354
|
def unzip(workspace_path: str, zip_path: str):
|
|
305
355
|
"""Unzip from zip to workspace."""
|
|
356
|
+
zip_path = os.path.abspath(zip_path)
|
|
306
357
|
input_dir = os.path.dirname(workspace_path)
|
|
307
358
|
if input_dir:
|
|
308
359
|
os.makedirs(input_dir, exist_ok=True)
|
|
360
|
+
if _should_use_system_zip_cli() and shutil.which("unzip"):
|
|
361
|
+
try:
|
|
362
|
+
os.makedirs(workspace_path, exist_ok=True)
|
|
363
|
+
subprocess.run(
|
|
364
|
+
["unzip", "-oq", zip_path, "-d", workspace_path],
|
|
365
|
+
check=True,
|
|
366
|
+
)
|
|
367
|
+
return
|
|
368
|
+
except Exception:
|
|
369
|
+
typer.echo(
|
|
370
|
+
"System unzip failed; falling back to Python zipfile.",
|
|
371
|
+
err=True,
|
|
372
|
+
)
|
|
309
373
|
with ZipFile(zip_path, "r") as zip_file:
|
|
310
|
-
members = zip_file.
|
|
374
|
+
members = zip_file.infolist()
|
|
311
375
|
for member in tqdm(members, desc="Unzipping", unit="file"):
|
|
312
376
|
zip_file.extract(member, workspace_path)
|
|
313
377
|
|
|
@@ -407,7 +471,7 @@ def sync_one(
|
|
|
407
471
|
if zip_deleted and direction == "to-zip":
|
|
408
472
|
typer.echo(f"Rezipping '{workspace_path}' (zip was deleted)")
|
|
409
473
|
zip_(workspace_path=workspace_path, zip_path=zip_path)
|
|
410
|
-
|
|
474
|
+
run_dvc_command(["add", zip_path])
|
|
411
475
|
zip_hash = get_hash(zip_path)
|
|
412
476
|
# Workspace was deleted but zip exists and direction is to-workspace:
|
|
413
477
|
# restore workspace
|
|
@@ -429,7 +493,7 @@ def sync_one(
|
|
|
429
493
|
if workspace_changed and (direction in ["to-zip", "both"]):
|
|
430
494
|
typer.echo(f"Zipping '{workspace_path}' (workspace has changed)")
|
|
431
495
|
zip_(workspace_path=workspace_path, zip_path=zip_path)
|
|
432
|
-
|
|
496
|
+
run_dvc_command(["add", zip_path])
|
|
433
497
|
zip_hash = get_hash(zip_path)
|
|
434
498
|
# If we unzip, we need to update the hash
|
|
435
499
|
if zip_changed and (direction in ["to-workspace", "both"]):
|
|
@@ -383,10 +383,31 @@ def get_status(
|
|
|
383
383
|
if v != ["always changed"] and not k.endswith(".dvc")
|
|
384
384
|
}
|
|
385
385
|
stages_config = ck_info.get("pipeline", {}).get("stages", {})
|
|
386
|
+
# Build an ordered list of stage names from dvc.yaml to preserve
|
|
387
|
+
# pipeline order, since dvc_repo.status() returns stages alphabetically
|
|
388
|
+
dvc_yaml_stages: list[str] = []
|
|
389
|
+
if os.path.isfile("dvc.yaml"):
|
|
390
|
+
try:
|
|
391
|
+
with open("dvc.yaml") as f:
|
|
392
|
+
dvc_yaml = calkit.ryaml.load(f)
|
|
393
|
+
dvc_yaml_stages = list(
|
|
394
|
+
(dvc_yaml or {}).get("stages", {}).keys()
|
|
395
|
+
)
|
|
396
|
+
except Exception:
|
|
397
|
+
pass
|
|
386
398
|
ordered_stale_stages = {}
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
399
|
+
# First, add stages in dvc.yaml order, matching expanded stage names
|
|
400
|
+
# (e.g. benchmark-boom@1-3-1) against their base template name
|
|
401
|
+
# (benchmark-boom) using the position in dvc.yaml
|
|
402
|
+
dvc_yaml_stage_order = {
|
|
403
|
+
name: i for i, name in enumerate(dvc_yaml_stages)
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
def _stage_sort_key(stage_name: str) -> int:
|
|
407
|
+
base = stage_name.split("@")[0]
|
|
408
|
+
return dvc_yaml_stage_order.get(base, len(dvc_yaml_stages))
|
|
409
|
+
|
|
410
|
+
for stage_name in sorted(raw_stale_stages.keys(), key=_stage_sort_key):
|
|
390
411
|
status_data = raw_stale_stages[stage_name]
|
|
391
412
|
ordered_stale_stages[stage_name] = StaleStage.from_status_data(
|
|
392
413
|
status_data=status_data,
|
|
@@ -399,23 +420,14 @@ def get_status(
|
|
|
399
420
|
)
|
|
400
421
|
],
|
|
401
422
|
)
|
|
402
|
-
# Keep any stale stages not present in ck_info at the end
|
|
403
|
-
for stage_name, status_data in raw_stale_stages.items():
|
|
404
|
-
if stage_name in ordered_stale_stages:
|
|
405
|
-
continue
|
|
406
|
-
ordered_stale_stages[stage_name] = StaleStage.from_status_data(
|
|
407
|
-
status_data=status_data,
|
|
408
|
-
configured_outputs=[
|
|
409
|
-
output.get("path", str(output))
|
|
410
|
-
if isinstance(output, dict)
|
|
411
|
-
else str(output)
|
|
412
|
-
for output in stages_config.get(stage_name, {}).get(
|
|
413
|
-
"outputs", []
|
|
414
|
-
)
|
|
415
|
-
],
|
|
416
|
-
)
|
|
417
423
|
result["stale_stages"] = ordered_stale_stages
|
|
418
|
-
return PipelineStatus
|
|
424
|
+
return PipelineStatus(
|
|
425
|
+
has_pipeline=result["has_pipeline"],
|
|
426
|
+
environment_checks=result["environment_checks"],
|
|
427
|
+
cleaned_notebooks=result["cleaned_notebooks"],
|
|
428
|
+
stale_stages=result["stale_stages"],
|
|
429
|
+
errors=result["errors"],
|
|
430
|
+
)
|
|
419
431
|
finally:
|
|
420
432
|
if wdir is not None:
|
|
421
433
|
os.chdir(prev_cwd)
|
|
@@ -184,16 +184,21 @@ def make_dvc_md5s(
|
|
|
184
184
|
return resp
|
|
185
185
|
|
|
186
186
|
|
|
187
|
-
def
|
|
188
|
-
"""
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
187
|
+
def zip_paths(zip_path: str, paths: list[str]) -> None:
|
|
188
|
+
"""Create a compressed ZIP from a list of file or directory paths."""
|
|
189
|
+
with zipfile.ZipFile(
|
|
190
|
+
zip_path,
|
|
191
|
+
"w",
|
|
192
|
+
compression=zipfile.ZIP_DEFLATED,
|
|
193
|
+
) as zipf:
|
|
194
|
+
for path in paths:
|
|
195
|
+
if os.path.isdir(path):
|
|
196
|
+
for root, _, files in os.walk(path):
|
|
197
|
+
for filename in files:
|
|
198
|
+
fpath = os.path.join(root, filename)
|
|
199
|
+
zipf.write(fpath)
|
|
200
|
+
elif os.path.isfile(path):
|
|
201
|
+
zipf.write(path)
|
|
197
202
|
|
|
198
203
|
|
|
199
204
|
def populate_dvc_cache():
|
|
@@ -4,6 +4,8 @@ import os
|
|
|
4
4
|
import subprocess
|
|
5
5
|
|
|
6
6
|
import dvc.repo
|
|
7
|
+
import git
|
|
8
|
+
from configobj import ConfigObj
|
|
7
9
|
from dvc.config_schema import SCHEMA, Invalid
|
|
8
10
|
from dvc_objects.fs import known_implementations
|
|
9
11
|
|
|
@@ -89,3 +91,70 @@ def test_list_files_paths(tmp_dir):
|
|
|
89
91
|
repo = dvc.repo.Repo()
|
|
90
92
|
repo.add("file1.txt") # type: ignore
|
|
91
93
|
assert "file1.txt" in calkit.dvc.list_paths()
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def test_configure_remote_ck_uses_ck_scheme_and_skips_http_auth(monkeypatch):
|
|
97
|
+
monkeypatch.setattr(calkit, "detect_project_name", lambda wdir=None: "o/p")
|
|
98
|
+
|
|
99
|
+
class DummyRepo:
|
|
100
|
+
def remote(self):
|
|
101
|
+
return "origin"
|
|
102
|
+
|
|
103
|
+
monkeypatch.setattr(git, "Repo", lambda wdir=None: DummyRepo())
|
|
104
|
+
calls = []
|
|
105
|
+
events = []
|
|
106
|
+
|
|
107
|
+
def fake_run(argv, cwd=None):
|
|
108
|
+
events.append("run")
|
|
109
|
+
calls.append((argv, cwd))
|
|
110
|
+
return 0
|
|
111
|
+
|
|
112
|
+
monkeypatch.setattr(calkit.dvc.core, "run_dvc_command", fake_run)
|
|
113
|
+
monkeypatch.setattr(
|
|
114
|
+
calkit.dvc.core,
|
|
115
|
+
"clear_remote_local_http_auth",
|
|
116
|
+
lambda remote_name=None, wdir=None: events.append("clear"),
|
|
117
|
+
)
|
|
118
|
+
out = calkit.dvc.configure_remote(use_ck=True)
|
|
119
|
+
assert out == calkit.config.get_app_name()
|
|
120
|
+
assert events and events[0] == "clear"
|
|
121
|
+
assert calls == [
|
|
122
|
+
(
|
|
123
|
+
[
|
|
124
|
+
"remote",
|
|
125
|
+
"add",
|
|
126
|
+
"-d",
|
|
127
|
+
"-f",
|
|
128
|
+
calkit.config.get_app_name(),
|
|
129
|
+
"ck://o/p",
|
|
130
|
+
],
|
|
131
|
+
None,
|
|
132
|
+
)
|
|
133
|
+
]
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def test_set_remote_auth_ck_remote_clears_local_http_auth(
|
|
137
|
+
monkeypatch, tmp_path
|
|
138
|
+
):
|
|
139
|
+
remote_name = calkit.config.get_app_name()
|
|
140
|
+
monkeypatch.setattr(
|
|
141
|
+
calkit.dvc.core,
|
|
142
|
+
"get_remotes",
|
|
143
|
+
lambda wdir=None: {remote_name: "ck://owner/proj"},
|
|
144
|
+
)
|
|
145
|
+
dvc_dir = tmp_path / ".dvc"
|
|
146
|
+
dvc_dir.mkdir()
|
|
147
|
+
fpath = dvc_dir / "config.local"
|
|
148
|
+
with open(fpath, "w") as f:
|
|
149
|
+
f.write(
|
|
150
|
+
f'[remote "{remote_name}"]\n'
|
|
151
|
+
" custom_auth_header = Authorization\n"
|
|
152
|
+
" password = Bearer token\n"
|
|
153
|
+
" url = https://example.com\n"
|
|
154
|
+
)
|
|
155
|
+
calkit.dvc.set_remote_auth(wdir=str(tmp_path))
|
|
156
|
+
cfg = ConfigObj(str(fpath), encoding="utf-8")
|
|
157
|
+
section = cfg[f'remote "{remote_name}"']
|
|
158
|
+
assert "custom_auth_header" not in section
|
|
159
|
+
assert "password" not in section
|
|
160
|
+
assert section["url"] == "https://example.com" # type: ignore
|
|
@@ -200,7 +200,14 @@ def test_get_sync_status(tmp_dir):
|
|
|
200
200
|
|
|
201
201
|
|
|
202
202
|
def test_sync_one(tmp_dir, monkeypatch):
|
|
203
|
-
|
|
203
|
+
real_run = calkit.dvc.zip.subprocess.run
|
|
204
|
+
|
|
205
|
+
def _run(cmd, *args, **kwargs):
|
|
206
|
+
if cmd and cmd[0] == "dvc":
|
|
207
|
+
return None
|
|
208
|
+
return real_run(cmd, *args, **kwargs)
|
|
209
|
+
|
|
210
|
+
monkeypatch.setattr("calkit.dvc.zip.subprocess.run", _run)
|
|
204
211
|
# to-zip: zips input and writes sync record
|
|
205
212
|
src = tmp_dir / "src"
|
|
206
213
|
src.mkdir()
|
|
@@ -10,10 +10,10 @@ import git
|
|
|
10
10
|
import pytest
|
|
11
11
|
|
|
12
12
|
from calkit.releases import (
|
|
13
|
-
add_paths_to_zip,
|
|
14
13
|
check_project_release_archive,
|
|
15
14
|
create_bibtex,
|
|
16
15
|
ls_files,
|
|
16
|
+
zip_paths,
|
|
17
17
|
)
|
|
18
18
|
|
|
19
19
|
|
|
@@ -135,16 +135,16 @@ def test_create_bibtex():
|
|
|
135
135
|
assert len(entries) == 1
|
|
136
136
|
|
|
137
137
|
|
|
138
|
-
def
|
|
138
|
+
def test_zip_paths(tmp_dir):
|
|
139
139
|
os.makedirs("data/sub", exist_ok=True)
|
|
140
140
|
with open("data/sub/file.txt", "w") as f:
|
|
141
141
|
f.write("hello")
|
|
142
142
|
with open("root.txt", "w") as f:
|
|
143
143
|
f.write("root")
|
|
144
144
|
zip_path = "archive.zip"
|
|
145
|
-
|
|
146
|
-
add_paths_to_zip(zipf, ["data", "root.txt"])
|
|
145
|
+
zip_paths(zip_path, ["data", "root.txt"])
|
|
147
146
|
with zipfile.ZipFile(zip_path) as zipf:
|
|
148
147
|
names = set(zipf.namelist())
|
|
149
|
-
|
|
150
|
-
|
|
148
|
+
assert "data/sub/file.txt" in names
|
|
149
|
+
assert "root.txt" in names
|
|
150
|
+
assert zipf.getinfo("root.txt").compress_type == zipfile.ZIP_DEFLATED
|