calkit-python 0.41.2__tar.gz → 0.41.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.41.2 → calkit_python-0.41.3}/PKG-INFO +1 -1
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/main/core.py +14 -1
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/environments.py +6 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/jupyterlab/routes.py +6 -3
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/pipeline.py +62 -5
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/server.py +3 -5
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_environments.py +34 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_pipeline.py +92 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/.claude-plugin/marketplace.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/.gitignore +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/.pre-commit-config.yaml +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/.prettierignore +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/.python-version +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/.vscode/launch.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/.vscode/tasks.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/.yarnrc.yml +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/AGENTS.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/CITATION.cff +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/CODE_OF_CONDUCT.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/CONTRIBUTING.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/LICENSE +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/Makefile +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/README.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/agent-plugin/.claude-plugin/plugin.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/agent-plugin/skills/add-pipeline-stage/SKILL.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/agent-plugin/skills/conventions/SKILL.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/agent-plugin/skills/create-pipeline/SKILL.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/babel.config.js +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/__init__.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/__main__.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/calc.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/check.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/__init__.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/check.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/cloud.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/config.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/core.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/describe.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/dev.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/import_.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/latex.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/list.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/main/__init__.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/main/xr.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/new.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/notebooks.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/office.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/overleaf.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/scheduler.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cli/update.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/cloud.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/conda.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/config.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/core.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/datasets.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/dependencies.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/detect.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/docker.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/dvc/__init__.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/dvc/core.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/dvc/zip.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/fs.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/git.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/github.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/gui.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/install.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/invenio.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/julia.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/jupyter.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/jupyterlab/__init__.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/package.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/schemas/calkit/package.json.orig +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/schemas/calkit/plugin.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/502.9a2c5772a15466e923ef.js +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/695.2c41003a452d43d2b358.js +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/867.a42a046aa5108f54f8fb.js +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/909.e3f9cc3408834a7fdcc3.js +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/b2f1c3efe70cb539d121.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/remoteEntry.65469af996e7a96aa983.js +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/style.js +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/third-party-licenses.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/licenses.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/magics.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/matlab.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/models/__init__.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/models/core.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/models/io.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/models/iteration.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/models/pipeline.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/notebooks.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/office.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/ops.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/overleaf.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/releases.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/templates/__init__.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/templates/core.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/templates/latex/__init__.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/templates/latex/article/paper.tex +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/templates/latex/core.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/templates/latex/jfm/jfm.bst +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/templates/latex/jfm/jfm.cls +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/templates/latex/jfm/paper.tex +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/templates/latex/jfm/upmath.sty +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/__init__.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/cli/__init__.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/cli/main/__init__.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/cli/main/test_core.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/cli/main/test_subprojects.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/cli/main/test_xr.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/cli/test_check.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/cli/test_cloud.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/cli/test_config.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/cli/test_import.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/cli/test_latex.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/cli/test_list.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/cli/test_new.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/cli/test_notebooks.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/cli/test_overleaf.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/cli/test_scheduler.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/cli/test_update.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/dvc/__init__.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/dvc/test_core.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/dvc/test_zip.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/jupyterlab/__init__.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/jupyterlab/test_routes.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/models/__init__.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/models/test_iteration.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/models/test_pipeline.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_calc.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_check.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_cloud.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_conda.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_core.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_dependencies.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_detect.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_docker.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_fs.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_git.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_install.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_invenio.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_julia.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_jupyter.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_magics.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_matlab.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_notebooks.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_releases.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/tests/test_templates.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/conftest.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/CNAME +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/ai-tools.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/apps.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/calculations.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/calkit-yaml.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/cli-reference.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/cloud-integration.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/datasets.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/dependencies.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/environments.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/examples.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/governance.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/help.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/hpc.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/img/c-to-the-k-white.svg +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/img/calkit-fragmentation-compendium.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/img/calkit-no-bg.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/img/connect-zenodo.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/img/jupyterlab/all-green.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/img/jupyterlab/collect-data-stale.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/img/jupyterlab/new-env.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/img/jupyterlab/new-notebook.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/img/jupyterlab/pipeline-badge.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/img/jupyterlab-params.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/img/plos-osi-code-2024-03.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/img/vscode-nb-params.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/index.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/installation.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/jupyterlab.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/local-server.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/notebooks.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/overleaf.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/pipeline/index.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/pipeline/manual-steps.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/pipeline/running-and-logging.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/quickstart.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/references.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/releases.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/reproducibility.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/subprojects.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/adding-latex-pub-docker.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/conda-envs.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/existing-project.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/first-project.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/github-actions.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/actions-repo-secrets.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/latex-codespaces/push.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/chart-more-rows.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/create-project.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/excel-chart.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/excel-data.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/needs-clone.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/new-stage.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/status-more-rows.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/untracked-data.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/updated-publication.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/office/workflow-page.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/openfoam/clone.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/openfoam/create-project.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/openfoam/new-token.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/openfoam/reclone.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/quick-actions.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/run-proc.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/vscode-slurm-notebook/create-calkit-env.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/vscode-slurm-notebook/create-inner-env.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/vscode-slurm-notebook/create-new-calkit-env.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/vscode-slurm-notebook/select-calkit-env.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/vscode-slurm-notebook/slurm-job-running.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/vscode-slurm-notebook/slurm-launch-options.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/img/vscode-slurm-notebook/starting-slurm-job.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/index.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/jupyterlab.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/latex-codespaces.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/matlab.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/notebook-pipeline.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/office.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/openfoam.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/procedures.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/tutorials/vscode-slurm-notebook.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/docs/version-control.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/flake.lock +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/flake.nix +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/install.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/jest.config.js +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/jupyter-config/server-config/calkit.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/mkdocs.yml +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/package.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/pyproject.toml +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/schema/plugin.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/scripts/generate-docs-references.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/scripts/install.ps1 +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/scripts/install.sh +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/scripts/make-calk9.sh +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/scripts/sync-docs.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/__tests__/useQueries.spec.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/calkit-config.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/cell-output-marker.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/components/commit-dialog.tsx +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/components/environment-editor.tsx +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/components/notebook-registration.tsx +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/components/notebook-toolbar.tsx +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/components/pipeline-status-bar.tsx +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/components/project-info-editor.tsx +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/components/sidebar-settings.tsx +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/components/sidebar.tsx +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/components/stage-editor.tsx +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/feature-flags.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/file-browser-menu.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/hooks/__tests__/useQueries.test.tsx +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/hooks/useQueries.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/icons.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/index.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/io-tracker.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/pipeline-state.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/queryClient.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/request.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/src/shims-mainmenu.d.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/style/base.css +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/style/cell-output-marker.css +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/style/environment-editor.css +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/style/environment-selector.css +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/style/img/calkit-no-bg.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/style/index.css +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/style/index.js +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/style/notebook-toolbar.css +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/style/pipeline-status-bar.css +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/style/sidebar.css +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/test/dvc-md5-dir/osx-arm64.txt +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/test/nb-julia.ipynb +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/test/nb-params.ipynb +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/test/nb-subdir.ipynb +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/test/pipeline.ipynb +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/test/script.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/test/test-log.log +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/tsconfig.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/tsconfig.test.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/ui-tests/.gitignore +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/ui-tests/README.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/ui-tests/jupyter_server_test_config.py +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/ui-tests/package.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/ui-tests/playwright.config.js +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/ui-tests/tests/calkit.spec.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/ui-tests/yarn.lock +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/uv.lock +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/.gitignore +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/.vscodeignore +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/CHANGELOG.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/LICENSE +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/README.md +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/images/calkit-no-bg.png +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/package-lock.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/package.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/scripts/set-proposed-api.js +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/src/environments.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/src/extension.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/src/notebooks.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/src/test/environments.test.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/src/test/kernel-selection.test.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/src/test/notebooks.test.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/src/types.ts +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/vscode-ext/tsconfig.json +0 -0
- {calkit_python-0.41.2 → calkit_python-0.41.3}/yarn.lock +0 -0
|
@@ -579,6 +579,8 @@ def get_status(
|
|
|
579
579
|
if stale_stage is None:
|
|
580
580
|
continue
|
|
581
581
|
typer.echo(f" {typer.style(stage_name, fg='yellow')}:")
|
|
582
|
+
if stale_stage.always_run:
|
|
583
|
+
typer.echo(" always runs")
|
|
582
584
|
if stale_stage.modified_command:
|
|
583
585
|
typer.echo(" modified command")
|
|
584
586
|
# Show stale outputs for this stage
|
|
@@ -596,8 +598,16 @@ def get_status(
|
|
|
596
598
|
typer.echo(" modified inputs:")
|
|
597
599
|
for input_path in stale_stage.modified_inputs:
|
|
598
600
|
typer.echo(f" {input_path}")
|
|
601
|
+
if pipeline_status.always_run_stage_names:
|
|
602
|
+
typer.echo("Always-run stages:")
|
|
603
|
+
for stage_name in pipeline_status.always_run_stage_names:
|
|
604
|
+
typer.echo(f" {typer.style(stage_name, fg='cyan')}")
|
|
599
605
|
elif pipeline_status:
|
|
600
606
|
typer.echo("Pipeline is up to date.")
|
|
607
|
+
if pipeline_status.always_run_stage_names:
|
|
608
|
+
typer.echo("Always-run stages:")
|
|
609
|
+
for stage_name in pipeline_status.always_run_stage_names:
|
|
610
|
+
typer.echo(f" {typer.style(stage_name, fg='cyan')}")
|
|
601
611
|
|
|
602
612
|
|
|
603
613
|
@app.command(name="diff")
|
|
@@ -2421,7 +2431,10 @@ def run_in_env(
|
|
|
2421
2431
|
elif env["kind"] == "pixi":
|
|
2422
2432
|
env_cmd = []
|
|
2423
2433
|
if "name" in env:
|
|
2424
|
-
env_cmd
|
|
2434
|
+
env_cmd += ["--environment", env["name"]]
|
|
2435
|
+
env_path = env.get("path")
|
|
2436
|
+
if env_path and os.path.dirname(env_path):
|
|
2437
|
+
env_cmd += ["--manifest-path", os.path.abspath(env_path)]
|
|
2425
2438
|
cmd = ["pixi", "run"] + env_cmd + cmd
|
|
2426
2439
|
if verbose:
|
|
2427
2440
|
typer.echo(f"Running command: {cmd}")
|
|
@@ -314,6 +314,12 @@ def get_env_lock_fpath(
|
|
|
314
314
|
lock_fpath = os.path.join(env_dir, "uv.lock")
|
|
315
315
|
else:
|
|
316
316
|
lock_fpath = "uv.lock"
|
|
317
|
+
elif env_kind == "pixi":
|
|
318
|
+
env_dir = os.path.dirname(env.get("path") or "")
|
|
319
|
+
if env_dir:
|
|
320
|
+
lock_fpath = os.path.join(env_dir, "pixi.lock")
|
|
321
|
+
else:
|
|
322
|
+
lock_fpath = "pixi.lock"
|
|
317
323
|
elif env_kind in ["venv", "uv-venv"]:
|
|
318
324
|
if legacy:
|
|
319
325
|
lock_fpath += ".txt"
|
|
@@ -903,11 +903,14 @@ class PipelineStatusRouteHandler(APIHandler):
|
|
|
903
903
|
pipeline_status = {
|
|
904
904
|
k.split("dvc.yaml:")[-1]: v
|
|
905
905
|
for k, v in raw_status.items()
|
|
906
|
-
if
|
|
907
|
-
and not k.endswith(".dvc")
|
|
906
|
+
if not k.endswith(".dvc")
|
|
908
907
|
and k.split("dvc.yaml:")[-1].split("@")[0] not in frozen_stages
|
|
909
908
|
}
|
|
910
|
-
|
|
909
|
+
# Always-run-only stages are surfaced in pipeline_status but do
|
|
910
|
+
# not count toward is_outdated, matching the CLI's is_stale logic.
|
|
911
|
+
is_outdated = any(
|
|
912
|
+
v != ["always changed"] for v in pipeline_status.values()
|
|
913
|
+
)
|
|
911
914
|
self.finish(
|
|
912
915
|
json.dumps(
|
|
913
916
|
{
|
|
@@ -91,7 +91,32 @@ class PipelineStatus(BaseModel):
|
|
|
91
91
|
@computed_field
|
|
92
92
|
@property
|
|
93
93
|
def stale_stage_names(self) -> list[str]:
|
|
94
|
-
|
|
94
|
+
# Pure always-run stages aren't truly stale; surface them via
|
|
95
|
+
# always_run_stage_names instead.
|
|
96
|
+
return [
|
|
97
|
+
name
|
|
98
|
+
for name, stage in self.stale_stages.items()
|
|
99
|
+
if not stage.always_run
|
|
100
|
+
or stage.modified_command
|
|
101
|
+
or stage.modified_inputs
|
|
102
|
+
or stage.modified_outputs
|
|
103
|
+
or stage.stale_outputs
|
|
104
|
+
]
|
|
105
|
+
|
|
106
|
+
@computed_field
|
|
107
|
+
@property
|
|
108
|
+
def always_run_stage_names(self) -> list[str]:
|
|
109
|
+
# Only list stages whose sole change indicator is always_run; stages
|
|
110
|
+
# that also have real changes are reported under stale_stage_names.
|
|
111
|
+
return [
|
|
112
|
+
name
|
|
113
|
+
for name, stage in self.stale_stages.items()
|
|
114
|
+
if stage.always_run
|
|
115
|
+
and not stage.modified_command
|
|
116
|
+
and not stage.modified_inputs
|
|
117
|
+
and not stage.modified_outputs
|
|
118
|
+
and not stage.stale_outputs
|
|
119
|
+
]
|
|
95
120
|
|
|
96
121
|
@computed_field
|
|
97
122
|
@property
|
|
@@ -107,7 +132,20 @@ class PipelineStatus(BaseModel):
|
|
|
107
132
|
@computed_field
|
|
108
133
|
@property
|
|
109
134
|
def is_stale(self) -> bool:
|
|
110
|
-
|
|
135
|
+
# A stage whose only listed change is "always_run" is not actually
|
|
136
|
+
# stale — it just always re-executes by design. Treat the pipeline
|
|
137
|
+
# as stale only if some stage has real change indicators.
|
|
138
|
+
for stage in self.stale_stages.values():
|
|
139
|
+
if not stage.always_run:
|
|
140
|
+
return True
|
|
141
|
+
if (
|
|
142
|
+
stage.modified_command
|
|
143
|
+
or stage.modified_inputs
|
|
144
|
+
or stage.modified_outputs
|
|
145
|
+
or stage.stale_outputs
|
|
146
|
+
):
|
|
147
|
+
return True
|
|
148
|
+
return False
|
|
111
149
|
|
|
112
150
|
|
|
113
151
|
class StaleStage(BaseModel):
|
|
@@ -118,6 +156,7 @@ class StaleStage(BaseModel):
|
|
|
118
156
|
modified_inputs: list[str] = Field(default_factory=list)
|
|
119
157
|
modified_outputs: list[str] = Field(default_factory=list)
|
|
120
158
|
modified_command: bool = False
|
|
159
|
+
always_run: bool = False
|
|
121
160
|
|
|
122
161
|
@staticmethod
|
|
123
162
|
def _as_path_list(paths: object) -> list[str]:
|
|
@@ -206,17 +245,22 @@ class StaleStage(BaseModel):
|
|
|
206
245
|
modified_outputs = []
|
|
207
246
|
status_blocks = []
|
|
208
247
|
modified_command = False
|
|
248
|
+
always_run = False
|
|
209
249
|
if isinstance(status_data, dict):
|
|
210
250
|
status_blocks = [status_data]
|
|
211
251
|
elif isinstance(status_data, list):
|
|
212
252
|
status_blocks = [
|
|
213
253
|
item for item in status_data if isinstance(item, dict)
|
|
214
254
|
]
|
|
215
|
-
# DVC may return plain markers like ["changed command"]
|
|
255
|
+
# DVC may return plain markers like ["changed command"] or
|
|
256
|
+
# ["always changed"], possibly alongside other change blocks.
|
|
216
257
|
if "changed command" in status_data:
|
|
217
258
|
modified_command = True
|
|
259
|
+
if "always changed" in status_data:
|
|
260
|
+
always_run = True
|
|
218
261
|
elif isinstance(status_data, str):
|
|
219
262
|
modified_command = status_data == "changed command"
|
|
263
|
+
always_run = status_data == "always changed"
|
|
220
264
|
for block in status_blocks:
|
|
221
265
|
if "changed command" in block:
|
|
222
266
|
changed_command_value = block.get("changed command")
|
|
@@ -264,7 +308,16 @@ class StaleStage(BaseModel):
|
|
|
264
308
|
stale_outputs.extend(
|
|
265
309
|
[path for path in output_paths if path not in modified_outputs]
|
|
266
310
|
)
|
|
267
|
-
if
|
|
311
|
+
# Fallback: if DVC flagged the stage but we couldn't attribute the
|
|
312
|
+
# change to specific paths, mark all configured outputs as stale.
|
|
313
|
+
# Skip the fallback for pure "always_run" stages — they always
|
|
314
|
+
# re-execute by design, not because outputs are out of date.
|
|
315
|
+
if (
|
|
316
|
+
not stale_outputs
|
|
317
|
+
and not modified_outputs
|
|
318
|
+
and configured_outputs
|
|
319
|
+
and not always_run
|
|
320
|
+
):
|
|
268
321
|
stale_outputs.extend(configured_outputs)
|
|
269
322
|
stale_outputs = list(dict.fromkeys(stale_outputs))
|
|
270
323
|
return cls(
|
|
@@ -273,6 +326,7 @@ class StaleStage(BaseModel):
|
|
|
273
326
|
modified_inputs=modified_inputs,
|
|
274
327
|
modified_outputs=modified_outputs,
|
|
275
328
|
modified_command=modified_command,
|
|
329
|
+
always_run=always_run,
|
|
276
330
|
)
|
|
277
331
|
|
|
278
332
|
|
|
@@ -666,7 +720,10 @@ def get_status(
|
|
|
666
720
|
# collisions when a subproject stage shares a name with a root stage.
|
|
667
721
|
raw_stale_stages: dict[str, tuple[str, str | None, list]] = {}
|
|
668
722
|
for k, v in raw_status.items():
|
|
669
|
-
|
|
723
|
+
# Skip DVC-tracked files (.dvc entries) — they are not pipeline
|
|
724
|
+
# stages. Stages marked ["always changed"] are kept so the user
|
|
725
|
+
# sees them in the pipeline status output.
|
|
726
|
+
if k.endswith(".dvc"):
|
|
670
727
|
continue
|
|
671
728
|
if "dvc.yaml:" in k:
|
|
672
729
|
prefix, bare_name = k.split("dvc.yaml:", 1)
|
|
@@ -303,18 +303,16 @@ def get_status(
|
|
|
303
303
|
# ]
|
|
304
304
|
# }
|
|
305
305
|
dvc_pipeline_status = dvc.repo.status.status(dvc_repo)
|
|
306
|
-
# Remove any always changed entries so the pipeline doesn't look
|
|
307
|
-
# out of date
|
|
308
306
|
logger.info(f"Raw DVC pipeline status: {dvc_pipeline_status}")
|
|
309
|
-
# Frozen stages are intentionally pinned and hidden from status
|
|
307
|
+
# Frozen stages are intentionally pinned and hidden from status.
|
|
308
|
+
# Always-run entries are kept so clients can surface them.
|
|
310
309
|
frozen_stages = calkit.pipeline.frozen_stage_base_names(
|
|
311
310
|
wdir=project.wdir
|
|
312
311
|
)
|
|
313
312
|
dvc_pipeline_status = {
|
|
314
313
|
k.split("dvc.yaml:")[-1]: v
|
|
315
314
|
for k, v in dvc_pipeline_status.items()
|
|
316
|
-
if
|
|
317
|
-
and not k.endswith(".dvc")
|
|
315
|
+
if not k.endswith(".dvc")
|
|
318
316
|
and k.split("dvc.yaml:")[-1].split("@")[0] not in frozen_stages
|
|
319
317
|
}
|
|
320
318
|
logger.info(
|
|
@@ -1017,6 +1017,40 @@ def test_nix_env(tmp_dir):
|
|
|
1017
1017
|
assert "devShells" in content
|
|
1018
1018
|
|
|
1019
1019
|
|
|
1020
|
+
def test_pixi_env_lock_fpath(tmp_dir):
|
|
1021
|
+
# Manifest at the repo root: pixi.lock lives next to pixi.toml.
|
|
1022
|
+
root_env = {"kind": "pixi", "path": "pixi.toml"}
|
|
1023
|
+
assert (
|
|
1024
|
+
calkit.environments.get_env_lock_fpath(
|
|
1025
|
+
env=root_env, env_name="main", as_posix=True
|
|
1026
|
+
)
|
|
1027
|
+
== "pixi.lock"
|
|
1028
|
+
)
|
|
1029
|
+
# Manifest in a subdirectory: lock follows the manifest.
|
|
1030
|
+
nested_env = {"kind": "pixi", "path": ".calkit/envs/my-env/pixi.toml"}
|
|
1031
|
+
assert (
|
|
1032
|
+
calkit.environments.get_env_lock_fpath(
|
|
1033
|
+
env=nested_env, env_name="my-env", as_posix=True
|
|
1034
|
+
)
|
|
1035
|
+
== ".calkit/envs/my-env/pixi.lock"
|
|
1036
|
+
)
|
|
1037
|
+
# path may be omitted/None without raising.
|
|
1038
|
+
assert (
|
|
1039
|
+
calkit.environments.get_env_lock_fpath(
|
|
1040
|
+
env={"kind": "pixi"}, env_name="main", as_posix=True
|
|
1041
|
+
)
|
|
1042
|
+
== "pixi.lock"
|
|
1043
|
+
)
|
|
1044
|
+
assert (
|
|
1045
|
+
calkit.environments.get_env_lock_fpath(
|
|
1046
|
+
env={"kind": "pixi", "path": None},
|
|
1047
|
+
env_name="main",
|
|
1048
|
+
as_posix=True,
|
|
1049
|
+
)
|
|
1050
|
+
== "pixi.lock"
|
|
1051
|
+
)
|
|
1052
|
+
|
|
1053
|
+
|
|
1020
1054
|
def test_add_packages_to_nix_flake(tmp_dir):
|
|
1021
1055
|
# Round-trip: generate a flake, add some packages, verify they appear
|
|
1022
1056
|
# in the packages list, that duplicates aren't re-inserted, and that
|
|
@@ -1465,6 +1465,98 @@ def test_get_status_excludes_frozen_stage(tmp_dir):
|
|
|
1465
1465
|
assert "get-data" not in status.stale_stage_names
|
|
1466
1466
|
|
|
1467
1467
|
|
|
1468
|
+
def test_get_status_includes_always_run_stage(tmp_dir):
|
|
1469
|
+
subprocess.check_call(["calkit", "init"])
|
|
1470
|
+
ck_info = {
|
|
1471
|
+
"environments": {
|
|
1472
|
+
"py": {
|
|
1473
|
+
"kind": "uv-venv",
|
|
1474
|
+
"path": "requirements.txt",
|
|
1475
|
+
"prefix": ".venv",
|
|
1476
|
+
}
|
|
1477
|
+
},
|
|
1478
|
+
"pipeline": {
|
|
1479
|
+
"stages": {
|
|
1480
|
+
"ticker": {
|
|
1481
|
+
"kind": "python-script",
|
|
1482
|
+
"environment": "py",
|
|
1483
|
+
"script_path": "something/my-cool-script.py",
|
|
1484
|
+
"outputs": ["ticker.out"],
|
|
1485
|
+
"always_run": True,
|
|
1486
|
+
},
|
|
1487
|
+
"normal": {
|
|
1488
|
+
"kind": "python-script",
|
|
1489
|
+
"environment": "py",
|
|
1490
|
+
"script_path": "something/normal-script.py",
|
|
1491
|
+
"outputs": ["normal.out"],
|
|
1492
|
+
},
|
|
1493
|
+
}
|
|
1494
|
+
},
|
|
1495
|
+
}
|
|
1496
|
+
with open("calkit.yaml", "w") as f:
|
|
1497
|
+
calkit.ryaml.dump(ck_info, f)
|
|
1498
|
+
with open("requirements.txt", "w") as f:
|
|
1499
|
+
f.write("requests\n")
|
|
1500
|
+
os.makedirs("something", exist_ok=True)
|
|
1501
|
+
with open("something/my-cool-script.py", "w") as f:
|
|
1502
|
+
f.write("open('ticker.out', 'w').write('tick')\n")
|
|
1503
|
+
with open("something/normal-script.py", "w") as f:
|
|
1504
|
+
f.write("open('normal.out', 'w').write('hi')\n")
|
|
1505
|
+
# The compiled DVC stage must carry always_changed: true so DVC's status
|
|
1506
|
+
# actually emits the "always changed" marker
|
|
1507
|
+
dvc_stages = calkit.pipeline.to_dvc(ck_info=ck_info)
|
|
1508
|
+
assert dvc_stages["ticker"]["always_changed"] is True
|
|
1509
|
+
# Initial status: outputs missing, both stages are stale for real reasons.
|
|
1510
|
+
# The always-run stage carries the always_run flag too.
|
|
1511
|
+
status = calkit.pipeline.get_status(ck_info=ck_info)
|
|
1512
|
+
assert status.is_stale
|
|
1513
|
+
assert "ticker" in status.stale_stages
|
|
1514
|
+
assert status.stale_stages["ticker"].always_run
|
|
1515
|
+
assert "normal" in status.stale_stage_names
|
|
1516
|
+
assert "ticker" in status.stale_stage_names
|
|
1517
|
+
# Run the pipeline so outputs exist and nothing is "really" stale
|
|
1518
|
+
subprocess.check_call(["calkit", "run"])
|
|
1519
|
+
status = calkit.pipeline.get_status(ck_info=ck_info)
|
|
1520
|
+
# The always-run stage must still be visible — that was the bug
|
|
1521
|
+
assert "ticker" in status.stale_stages
|
|
1522
|
+
assert status.stale_stages["ticker"].always_run
|
|
1523
|
+
assert status.stale_stages["ticker"].stale_outputs == []
|
|
1524
|
+
assert status.stale_stages["ticker"].modified_outputs == []
|
|
1525
|
+
assert status.stale_stages["ticker"].modified_inputs == []
|
|
1526
|
+
assert not status.stale_stages["ticker"].modified_command
|
|
1527
|
+
assert status.always_run_stage_names == ["ticker"]
|
|
1528
|
+
# A pipeline whose only "stale" stage is always_run must not be marked
|
|
1529
|
+
# stale — calkit update relies on is_stale to gate release publication
|
|
1530
|
+
assert not status.is_stale
|
|
1531
|
+
assert "ticker" not in status.stale_stage_names
|
|
1532
|
+
|
|
1533
|
+
|
|
1534
|
+
def test_stale_stage_detects_always_changed_marker():
|
|
1535
|
+
stale_stage = calkit.pipeline.StaleStage.from_status_data(
|
|
1536
|
+
status_data=["always changed"],
|
|
1537
|
+
configured_outputs=["ticker.out"],
|
|
1538
|
+
)
|
|
1539
|
+
assert stale_stage.always_run
|
|
1540
|
+
assert not stale_stage.modified_command
|
|
1541
|
+
assert stale_stage.stale_outputs == []
|
|
1542
|
+
assert stale_stage.modified_outputs == []
|
|
1543
|
+
assert stale_stage.modified_inputs == []
|
|
1544
|
+
|
|
1545
|
+
|
|
1546
|
+
def test_stale_stage_always_changed_with_missing_output():
|
|
1547
|
+
# Mirrors DVC's actual output for an always_changed stage whose output
|
|
1548
|
+
# is missing from cache: ["always changed"] coexists with a change block.
|
|
1549
|
+
stale_stage = calkit.pipeline.StaleStage.from_status_data(
|
|
1550
|
+
status_data=[
|
|
1551
|
+
{"changed outs": {"ticker.out": "deleted"}},
|
|
1552
|
+
"always changed",
|
|
1553
|
+
],
|
|
1554
|
+
configured_outputs=["ticker.out"],
|
|
1555
|
+
)
|
|
1556
|
+
assert stale_stage.always_run
|
|
1557
|
+
assert stale_stage.stale_outputs == ["ticker.out"]
|
|
1558
|
+
|
|
1559
|
+
|
|
1468
1560
|
def test_stale_stage_detects_changed_command():
|
|
1469
1561
|
stale_stage = calkit.pipeline.StaleStage.from_status_data(
|
|
1470
1562
|
status_data=[{"changed command": "python src/new-script.py"}],
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{calkit_python-0.41.2 → calkit_python-0.41.3}/agent-plugin/skills/add-pipeline-stage/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/schemas/calkit/package.json.orig
RENAMED
|
File without changes
|
{calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/schemas/calkit/plugin.json
RENAMED
|
File without changes
|
{calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/502.9a2c5772a15466e923ef.js
RENAMED
|
File without changes
|
{calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/695.2c41003a452d43d2b358.js
RENAMED
|
File without changes
|
{calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/867.a42a046aa5108f54f8fb.js
RENAMED
|
File without changes
|
{calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/909.e3f9cc3408834a7fdcc3.js
RENAMED
|
File without changes
|
{calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js
RENAMED
|
File without changes
|
|
File without changes
|
{calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/b2f1c3efe70cb539d121.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{calkit_python-0.41.2 → calkit_python-0.41.3}/calkit/labextension/static/third-party-licenses.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|