calkit-python 0.41.21__tar.gz → 0.41.22__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.
Files changed (356) hide show
  1. {calkit_python-0.41.21 → calkit_python-0.41.22}/AGENTS.md +6 -0
  2. {calkit_python-0.41.21 → calkit_python-0.41.22}/PKG-INFO +1 -1
  3. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/main/core.py +53 -6
  4. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/main/test_core.py +79 -0
  5. {calkit_python-0.41.21 → calkit_python-0.41.22}/.claude-plugin/marketplace.json +0 -0
  6. {calkit_python-0.41.21 → calkit_python-0.41.22}/.gitattributes +0 -0
  7. {calkit_python-0.41.21 → calkit_python-0.41.22}/.gitignore +0 -0
  8. {calkit_python-0.41.21 → calkit_python-0.41.22}/.gitmodules +0 -0
  9. {calkit_python-0.41.21 → calkit_python-0.41.22}/.pre-commit-config.yaml +0 -0
  10. {calkit_python-0.41.21 → calkit_python-0.41.22}/.prettierignore +0 -0
  11. {calkit_python-0.41.21 → calkit_python-0.41.22}/.prettierrc.json +0 -0
  12. {calkit_python-0.41.21 → calkit_python-0.41.22}/.python-version +0 -0
  13. {calkit_python-0.41.21 → calkit_python-0.41.22}/.vscode/launch.json +0 -0
  14. {calkit_python-0.41.21 → calkit_python-0.41.22}/.vscode/tasks.json +0 -0
  15. {calkit_python-0.41.21 → calkit_python-0.41.22}/CITATION.cff +0 -0
  16. {calkit_python-0.41.21 → calkit_python-0.41.22}/CODE_OF_CONDUCT.md +0 -0
  17. {calkit_python-0.41.21 → calkit_python-0.41.22}/CONTRIBUTING.md +0 -0
  18. {calkit_python-0.41.21 → calkit_python-0.41.22}/LICENSE +0 -0
  19. {calkit_python-0.41.21 → calkit_python-0.41.22}/Makefile +0 -0
  20. {calkit_python-0.41.21 → calkit_python-0.41.22}/README.md +0 -0
  21. {calkit_python-0.41.21 → calkit_python-0.41.22}/agent-plugin/.claude-plugin/plugin.json +0 -0
  22. {calkit_python-0.41.21 → calkit_python-0.41.22}/agent-plugin/skills/add-pipeline-stage/SKILL.md +0 -0
  23. {calkit_python-0.41.21 → calkit_python-0.41.22}/agent-plugin/skills/conventions/SKILL.md +0 -0
  24. {calkit_python-0.41.21 → calkit_python-0.41.22}/agent-plugin/skills/create-pipeline/SKILL.md +0 -0
  25. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/__init__.py +0 -0
  26. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/__main__.py +0 -0
  27. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/calc.py +0 -0
  28. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/check.py +0 -0
  29. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/__init__.py +0 -0
  30. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/check.py +0 -0
  31. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/cloud.py +0 -0
  32. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/config.py +0 -0
  33. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/core.py +0 -0
  34. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/delete.py +0 -0
  35. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/describe.py +0 -0
  36. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/dev.py +0 -0
  37. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/import_.py +0 -0
  38. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/latex.py +0 -0
  39. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/list.py +0 -0
  40. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/main/__init__.py +0 -0
  41. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/main/xr.py +0 -0
  42. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/new.py +0 -0
  43. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/notebooks.py +0 -0
  44. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/office.py +0 -0
  45. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/overleaf.py +0 -0
  46. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/scheduler.py +0 -0
  47. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cli/update.py +0 -0
  48. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/cloud.py +0 -0
  49. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/conda.py +0 -0
  50. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/config.py +0 -0
  51. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/core.py +0 -0
  52. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/datasets.py +0 -0
  53. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/dependencies.py +0 -0
  54. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/detect.py +0 -0
  55. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/docker.py +0 -0
  56. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/dvc/__init__.py +0 -0
  57. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/dvc/core.py +0 -0
  58. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/dvc/zip.py +0 -0
  59. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/environments.py +0 -0
  60. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/fs.py +0 -0
  61. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/git.py +0 -0
  62. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/github.py +0 -0
  63. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/gui.py +0 -0
  64. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/install.py +0 -0
  65. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/invenio.py +0 -0
  66. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/julia.py +0 -0
  67. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/jupyter.py +0 -0
  68. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/jupyterlab/__init__.py +0 -0
  69. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/jupyterlab/routes.py +0 -0
  70. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/labextension/package.json +0 -0
  71. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/labextension/schemas/calkit/package.json.orig +0 -0
  72. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/labextension/schemas/calkit/plugin.json +0 -0
  73. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/labextension/static/502.9a2c5772a15466e923ef.js +0 -0
  74. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/labextension/static/695.2c41003a452d43d2b358.js +0 -0
  75. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/labextension/static/867.a42a046aa5108f54f8fb.js +0 -0
  76. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/labextension/static/909.e3f9cc3408834a7fdcc3.js +0 -0
  77. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js +0 -0
  78. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt +0 -0
  79. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/labextension/static/b2f1c3efe70cb539d121.png +0 -0
  80. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/labextension/static/remoteEntry.ac9035764d5b2adbb542.js +0 -0
  81. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/labextension/static/style.js +0 -0
  82. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/labextension/static/third-party-licenses.json +0 -0
  83. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/licenses.py +0 -0
  84. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/magics.py +0 -0
  85. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/matlab.py +0 -0
  86. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/models/__init__.py +0 -0
  87. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/models/core.py +0 -0
  88. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/models/io.py +0 -0
  89. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/models/iteration.py +0 -0
  90. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/models/pipeline.py +0 -0
  91. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/notebooks.py +0 -0
  92. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/office.py +0 -0
  93. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/ops.py +0 -0
  94. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/overleaf.py +0 -0
  95. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/pipeline.py +0 -0
  96. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/releases.py +0 -0
  97. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/server.py +0 -0
  98. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/templates/__init__.py +0 -0
  99. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/templates/core.py +0 -0
  100. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/templates/latex/__init__.py +0 -0
  101. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/templates/latex/article/paper.tex +0 -0
  102. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/templates/latex/core.py +0 -0
  103. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/templates/latex/jfm/jfm.bst +0 -0
  104. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/templates/latex/jfm/jfm.cls +0 -0
  105. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
  106. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/templates/latex/jfm/paper.tex +0 -0
  107. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/templates/latex/jfm/upmath.sty +0 -0
  108. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/__init__.py +0 -0
  109. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/__init__.py +0 -0
  110. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/main/__init__.py +0 -0
  111. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/main/test_lock.py +0 -0
  112. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/main/test_subprojects.py +0 -0
  113. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/main/test_xr.py +0 -0
  114. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/test_check.py +0 -0
  115. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/test_cloud.py +0 -0
  116. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/test_config.py +0 -0
  117. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/test_delete.py +0 -0
  118. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/test_import.py +0 -0
  119. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/test_latex.py +0 -0
  120. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/test_list.py +0 -0
  121. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/test_new.py +0 -0
  122. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/test_notebooks.py +0 -0
  123. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/test_overleaf.py +0 -0
  124. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/test_scheduler.py +0 -0
  125. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/cli/test_update.py +0 -0
  126. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/dvc/__init__.py +0 -0
  127. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/dvc/test_core.py +0 -0
  128. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/dvc/test_zip.py +0 -0
  129. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/jupyterlab/__init__.py +0 -0
  130. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/jupyterlab/conftest.py +0 -0
  131. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/jupyterlab/test_routes.py +0 -0
  132. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/models/__init__.py +0 -0
  133. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/models/test_core.py +0 -0
  134. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/models/test_iteration.py +0 -0
  135. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/models/test_pipeline.py +0 -0
  136. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_calc.py +0 -0
  137. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_check.py +0 -0
  138. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_cloud.py +0 -0
  139. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_conda.py +0 -0
  140. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_core.py +0 -0
  141. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_dependencies.py +0 -0
  142. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_detect.py +0 -0
  143. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_docker.py +0 -0
  144. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_environments.py +0 -0
  145. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_fs.py +0 -0
  146. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_git.py +0 -0
  147. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_install.py +0 -0
  148. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_invenio.py +0 -0
  149. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_julia.py +0 -0
  150. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_jupyter.py +0 -0
  151. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_licenses.py +0 -0
  152. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_magics.py +0 -0
  153. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_matlab.py +0 -0
  154. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_notebooks.py +0 -0
  155. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_pipeline.py +0 -0
  156. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_releases.py +0 -0
  157. {calkit_python-0.41.21 → calkit_python-0.41.22}/calkit/tests/test_templates.py +0 -0
  158. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/CNAME +0 -0
  159. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/acknowledgements.md +0 -0
  160. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/ai-tools.md +0 -0
  161. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/apps.md +0 -0
  162. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/calculations.md +0 -0
  163. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/calkit-yaml.md +0 -0
  164. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/cli-reference.md +0 -0
  165. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/cloud-integration.md +0 -0
  166. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/datasets.md +0 -0
  167. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/dependencies.md +0 -0
  168. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/environments.md +0 -0
  169. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/examples.md +0 -0
  170. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/governance.md +0 -0
  171. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/help.md +0 -0
  172. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/hpc.md +0 -0
  173. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/img/c-to-the-k-white.svg +0 -0
  174. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/img/calkit-fragmentation-compendium.png +0 -0
  175. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/img/calkit-no-bg.png +0 -0
  176. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/img/caltech.png +0 -0
  177. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/img/connect-zenodo.png +0 -0
  178. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/img/jupyterlab/all-green.png +0 -0
  179. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/img/jupyterlab/collect-data-stale.png +0 -0
  180. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/img/jupyterlab/new-env.png +0 -0
  181. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/img/jupyterlab/new-notebook.png +0 -0
  182. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/img/jupyterlab/pipeline-badge.png +0 -0
  183. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/img/jupyterlab-params.png +0 -0
  184. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/img/pipeline.png +0 -0
  185. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/img/plos-osi-code-2024-03.png +0 -0
  186. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/img/schmidt-sciences.png +0 -0
  187. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/img/vscode-nb-params.png +0 -0
  188. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/index.md +0 -0
  189. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/installation.md +0 -0
  190. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/jupyterlab.md +0 -0
  191. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/local-server.md +0 -0
  192. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/notebooks.md +0 -0
  193. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/overleaf.md +0 -0
  194. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/pipeline/index.md +0 -0
  195. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/pipeline/manual-steps.md +0 -0
  196. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/pipeline/running-and-logging.md +0 -0
  197. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/questions.md +0 -0
  198. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/quickstart.md +0 -0
  199. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/references.md +0 -0
  200. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/releases.md +0 -0
  201. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/reproducibility.md +0 -0
  202. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/subprojects.md +0 -0
  203. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/adding-latex-pub-docker.md +0 -0
  204. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/ai-agents.md +0 -0
  205. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/conda-envs.md +0 -0
  206. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/existing-project.md +0 -0
  207. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/first-project.md +0 -0
  208. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/github-actions.md +0 -0
  209. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/actions-repo-secrets.png +0 -0
  210. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
  211. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
  212. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
  213. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
  214. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
  215. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
  216. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
  217. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
  218. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
  219. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
  220. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/latex-codespaces/push.png +0 -0
  221. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
  222. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
  223. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/chart-more-rows.png +0 -0
  224. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/create-project.png +0 -0
  225. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
  226. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/excel-chart.png +0 -0
  227. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/excel-data.png +0 -0
  228. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
  229. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/needs-clone.png +0 -0
  230. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/new-stage.png +0 -0
  231. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
  232. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
  233. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/status-more-rows.png +0 -0
  234. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
  235. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/untracked-data.png +0 -0
  236. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/updated-publication.png +0 -0
  237. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
  238. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/office/workflow-page.png +0 -0
  239. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/openfoam/clone.png +0 -0
  240. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/openfoam/create-project.png +0 -0
  241. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
  242. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
  243. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
  244. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/openfoam/new-token.png +0 -0
  245. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/openfoam/reclone.png +0 -0
  246. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
  247. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/quick-actions.png +0 -0
  248. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/run-proc.png +0 -0
  249. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/vscode-slurm-notebook/create-calkit-env.png +0 -0
  250. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/vscode-slurm-notebook/create-inner-env.png +0 -0
  251. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/vscode-slurm-notebook/create-new-calkit-env.png +0 -0
  252. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/vscode-slurm-notebook/select-calkit-env.png +0 -0
  253. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/vscode-slurm-notebook/slurm-job-running.png +0 -0
  254. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/vscode-slurm-notebook/slurm-launch-options.png +0 -0
  255. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/img/vscode-slurm-notebook/starting-slurm-job.png +0 -0
  256. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/index.md +0 -0
  257. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/jupyterlab.md +0 -0
  258. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/latex-codespaces.md +0 -0
  259. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/matlab.md +0 -0
  260. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/notebook-pipeline.md +0 -0
  261. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/office.md +0 -0
  262. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/openfoam.md +0 -0
  263. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/procedures.md +0 -0
  264. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/tutorials/vscode-slurm-notebook.md +0 -0
  265. {calkit_python-0.41.21 → calkit_python-0.41.22}/docs/version-control.md +0 -0
  266. {calkit_python-0.41.21 → calkit_python-0.41.22}/flake.lock +0 -0
  267. {calkit_python-0.41.21 → calkit_python-0.41.22}/flake.nix +0 -0
  268. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/.yarnrc.yml +0 -0
  269. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/babel.config.js +0 -0
  270. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/install.json +0 -0
  271. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/jest.config.js +0 -0
  272. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/jupyter-config/server-config/calkit.json +0 -0
  273. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/package.json +0 -0
  274. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/schema/plugin.json +0 -0
  275. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/__tests__/useQueries.spec.ts +0 -0
  276. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/calkit-config.ts +0 -0
  277. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/cell-output-marker.ts +0 -0
  278. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/components/commit-dialog.tsx +0 -0
  279. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/components/environment-editor.tsx +0 -0
  280. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/components/notebook-registration.tsx +0 -0
  281. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/components/notebook-toolbar.tsx +0 -0
  282. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/components/pipeline-status-bar.tsx +0 -0
  283. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/components/project-info-editor.tsx +0 -0
  284. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/components/sidebar-settings.tsx +0 -0
  285. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/components/sidebar.tsx +0 -0
  286. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/components/stage-editor.tsx +0 -0
  287. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/feature-flags.ts +0 -0
  288. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/file-browser-menu.ts +0 -0
  289. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/hooks/__tests__/useQueries.test.tsx +0 -0
  290. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/hooks/useQueries.ts +0 -0
  291. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/icons.ts +0 -0
  292. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/index.ts +0 -0
  293. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/io-tracker.ts +0 -0
  294. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/pipeline-state.ts +0 -0
  295. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/queryClient.ts +0 -0
  296. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/request.ts +0 -0
  297. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/src/shims-mainmenu.d.ts +0 -0
  298. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/style/base.css +0 -0
  299. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/style/cell-output-marker.css +0 -0
  300. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/style/environment-editor.css +0 -0
  301. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/style/environment-selector.css +0 -0
  302. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/style/img/calkit-no-bg.png +0 -0
  303. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/style/index.css +0 -0
  304. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/style/index.js +0 -0
  305. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/style/notebook-toolbar.css +0 -0
  306. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/style/pipeline-status-bar.css +0 -0
  307. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/style/sidebar.css +0 -0
  308. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/tsconfig.json +0 -0
  309. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/tsconfig.test.json +0 -0
  310. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/ui-tests/.gitignore +0 -0
  311. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/ui-tests/README.md +0 -0
  312. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/ui-tests/jupyter_server_test_config.py +0 -0
  313. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/ui-tests/package.json +0 -0
  314. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/ui-tests/playwright.config.js +0 -0
  315. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/ui-tests/tests/calkit.spec.ts +0 -0
  316. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/ui-tests/yarn.lock +0 -0
  317. {calkit_python-0.41.21 → calkit_python-0.41.22}/jupyterlab-ext/yarn.lock +0 -0
  318. {calkit_python-0.41.21 → calkit_python-0.41.22}/mkdocs.yml +0 -0
  319. {calkit_python-0.41.21 → calkit_python-0.41.22}/pyproject.toml +0 -0
  320. {calkit_python-0.41.21 → calkit_python-0.41.22}/scripts/generate-docs-references.py +0 -0
  321. {calkit_python-0.41.21 → calkit_python-0.41.22}/scripts/install.ps1 +0 -0
  322. {calkit_python-0.41.21 → calkit_python-0.41.22}/scripts/install.sh +0 -0
  323. {calkit_python-0.41.21 → calkit_python-0.41.22}/scripts/make-calk9.sh +0 -0
  324. {calkit_python-0.41.21 → calkit_python-0.41.22}/scripts/sync-docs.py +0 -0
  325. {calkit_python-0.41.21 → calkit_python-0.41.22}/test/dvc-md5-dir/osx-arm64.txt +0 -0
  326. {calkit_python-0.41.21 → calkit_python-0.41.22}/test/nb-julia.ipynb +0 -0
  327. {calkit_python-0.41.21 → calkit_python-0.41.22}/test/nb-params.ipynb +0 -0
  328. {calkit_python-0.41.21 → calkit_python-0.41.22}/test/nb-subdir.ipynb +0 -0
  329. {calkit_python-0.41.21 → calkit_python-0.41.22}/test/pipeline.ipynb +0 -0
  330. {calkit_python-0.41.21 → calkit_python-0.41.22}/test/script.py +0 -0
  331. {calkit_python-0.41.21 → calkit_python-0.41.22}/test/test-log.log +0 -0
  332. {calkit_python-0.41.21 → calkit_python-0.41.22}/uv.lock +0 -0
  333. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/.gitignore +0 -0
  334. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/.vscodeignore +0 -0
  335. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/CHANGELOG.md +0 -0
  336. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/LICENSE +0 -0
  337. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/README.md +0 -0
  338. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/images/calkit-icon.svg +0 -0
  339. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/images/calkit-no-bg.png +0 -0
  340. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/package-lock.json +0 -0
  341. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/package.json +0 -0
  342. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/scripts/set-proposed-api.js +0 -0
  343. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/src/environments.ts +0 -0
  344. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/src/extension.ts +0 -0
  345. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/src/figures/core.ts +0 -0
  346. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/src/figures/view.ts +0 -0
  347. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/src/notebooks.ts +0 -0
  348. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/src/pipeline/core.ts +0 -0
  349. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/src/sidebar.ts +0 -0
  350. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/src/test/environments.test.ts +0 -0
  351. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/src/test/figures.test.ts +0 -0
  352. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/src/test/kernel-selection.test.ts +0 -0
  353. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/src/test/notebooks.test.ts +0 -0
  354. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/src/test/pipeline.test.ts +0 -0
  355. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/src/types.ts +0 -0
  356. {calkit_python-0.41.21 → calkit_python-0.41.22}/vscode-ext/tsconfig.json +0 -0
@@ -34,6 +34,12 @@ a feature in one function over many different test functions.
34
34
 
35
35
  Do not write docstrings in test functions.
36
36
 
37
+ Do not put blank lines inside function bodies; separate logical sections with
38
+ comments instead. This only applies to blank lines we write, not ones the
39
+ formatter inserts, e.g., ruff-format adds one after an in-function import
40
+ block. Don't hoist imports to module scope just to avoid those; imports are
41
+ kept inside functions to keep CLI startup fast.
42
+
37
43
  For prose, only use one space after punctuation.
38
44
 
39
45
  Don't overzealously split up functions just because they're long.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: calkit-python
3
- Version: 0.41.21
3
+ Version: 0.41.22
4
4
  Summary: Reproducibility simplified.
5
5
  Project-URL: Homepage, https://calkit.org
6
6
  Project-URL: Issues, https://github.com/calkit/calkit/issues
@@ -1419,6 +1419,39 @@ def _stage_run_info_from_log_content(log_content: str) -> dict:
1419
1419
  return res
1420
1420
 
1421
1421
 
1422
+ def _run_dvc_repro(argv: list[str]) -> int | None:
1423
+ """Run ``dvc repro`` via the DVC CLI, tolerating teardown failures.
1424
+
1425
+ Returns DVC's exit code, or ``None`` if the command ran but DVC's
1426
+ post-command teardown failed to import a module. After ``do_run`` finishes,
1427
+ ``dvc.cli.main`` reports anonymous analytics and cleans up cached repos,
1428
+ importing ``dvc.daemon`` and ``dvc.repo.open_repo`` only at that point. In
1429
+ some broken or mixed installs those submodules can't be imported, so the
1430
+ teardown raises a ``ModuleNotFoundError`` that escapes DVC entirely and
1431
+ crashes the run with a confusing traceback once the pipeline has already
1432
+ finished (see issue #1018). That doesn't affect the pipeline result, so
1433
+ swallow it and signal ``None`` so the caller derives success/failure from
1434
+ the run log instead of a lost exit code.
1435
+
1436
+ Only those two modules are tolerated, and deliberately so. ``dvc.cli.main``
1437
+ runs the command inside a broad ``except Exception`` that turns any failure
1438
+ into an exit code, so nothing from the command itself reaches here; but it
1439
+ also imports ``dvc._debug``/``dvc.config``/``dvc.logger`` *before* that
1440
+ block, and a broken install can fail there too. Swallowing those would leave
1441
+ an empty run log and report a pipeline that never ran as successful, so
1442
+ anything but a teardown module must propagate and fail loudly.
1443
+ """
1444
+ from dvc.cli import main as dvc_cli_main
1445
+
1446
+ try:
1447
+ return int(dvc_cli_main(argv))
1448
+ except ModuleNotFoundError as e:
1449
+ if e.name not in ("dvc.daemon", "dvc.repo.open_repo"):
1450
+ raise
1451
+ warn(f"DVC post-run teardown failed and was ignored ({e})")
1452
+ return None
1453
+
1454
+
1422
1455
  def _prune_run_logs(
1423
1456
  logs_dir: str, keep: int = 10, protect: str | None = None
1424
1457
  ) -> None:
@@ -1828,7 +1861,6 @@ def run(
1828
1861
  import dvc.repo
1829
1862
  import dvc.repo.reproduce
1830
1863
  import dvc.ui
1831
- from dvc.cli import main as dvc_cli_main
1832
1864
  from git.exc import InvalidGitRepositoryError
1833
1865
 
1834
1866
  import calkit.dvc.zip
@@ -2080,13 +2112,21 @@ def run(
2080
2112
  with calkit.dvc.dvc_lock_timeout(
2081
2113
  calkit.dvc.DEFAULT_RUN_LOCK_TIMEOUT
2082
2114
  ):
2083
- sp_res = dvc_cli_main(["repro"] + sp_args)
2115
+ sp_res = _run_dvc_repro(["repro"] + sp_args)
2084
2116
  finally:
2085
2117
  os.chdir(original_dir)
2086
- if sp_res != 0:
2118
+ # ``None`` means the stage ran but DVC's teardown failed; treat that
2119
+ # as success since the exit code is unrecoverable here.
2120
+ if sp_res is not None and sp_res != 0:
2087
2121
  failed = True
2088
2122
  if not args or all(a.startswith("--") for a in args):
2089
- # Only isolated subproject stage targets were given; skip parent run
2123
+ # Only isolated subproject stage targets were given; skip the parent
2124
+ # run, but still report failure the way the parent path does below,
2125
+ # else a failing subproject stage would exit zero.
2126
+ os.environ.pop("CALKIT_PIPELINE_RUNNING", None)
2127
+ if failed:
2128
+ raise_error("Pipeline failed")
2129
+ calkit.echo("Pipeline completed successfully ✅")
2090
2130
  return {}
2091
2131
  if pipeline is not None:
2092
2132
  args += ["--pipeline", pipeline]
@@ -2157,14 +2197,21 @@ def run(
2157
2197
  # the instant it finishes) can all hold it momentarily. Without this,
2158
2198
  # such a collision aborts the whole run with "Unable to acquire lock".
2159
2199
  with calkit.dvc.dvc_lock_timeout(calkit.dvc.DEFAULT_RUN_LOCK_TIMEOUT):
2160
- res = dvc_cli_main(["repro"] + args)
2200
+ res = _run_dvc_repro(["repro"] + args)
2161
2201
  finally:
2162
2202
  os.environ.pop("CALKIT_FORCE", None)
2163
- failed = failed or res != 0
2164
2203
  # Parse log to get timing and which stages ran
2165
2204
  with open(log_fpath, "r") as f:
2166
2205
  log_content = f.read()
2167
2206
  stage_run_info = _stage_run_info_from_log_content(log_content)
2207
+ if res is None:
2208
+ # DVC's exit code was lost to a teardown failure; fall back to the log,
2209
+ # which records any stage that failed to reproduce.
2210
+ failed = failed or any(
2211
+ info.get("status") == "failed" for info in stage_run_info.values()
2212
+ )
2213
+ else:
2214
+ failed = failed or res != 0
2168
2215
  # Zip dvc-zip outputs for stages that actually ran
2169
2216
  if stage_run_info:
2170
2217
  from calkit.models.io import PathOutput
@@ -8,6 +8,7 @@ import sys
8
8
  from datetime import datetime
9
9
  from pathlib import Path
10
10
  from pprint import pprint
11
+ from unittest.mock import Mock
11
12
 
12
13
  import dvc.repo
13
14
  import git
@@ -22,6 +23,7 @@ from calkit.cli.core import complete_stage_names
22
23
  from calkit.cli.main.core import (
23
24
  _get_running_pipeline_status,
24
25
  _prune_run_logs,
26
+ _run_dvc_repro,
25
27
  _stage_run_info_from_log_content,
26
28
  _stage_target_from_cmd,
27
29
  _to_shell_cmd,
@@ -915,6 +917,83 @@ def test_run(tmp_dir):
915
917
  assert "stage_run_info" in res
916
918
 
917
919
 
920
+ def test_run_dvc_repro_tolerates_teardown_failure(monkeypatch, capsys):
921
+ import dvc.cli
922
+
923
+ # Normal invocation returns DVC's exit code unchanged
924
+ monkeypatch.setattr(dvc.cli, "main", Mock(return_value=7))
925
+ assert _run_dvc_repro(["repro", "my-stage"]) == 7
926
+ # DVC lazily imports ``dvc.daemon`` and ``dvc.repo.open_repo`` for
927
+ # analytics/cleanup only after the command has already run. On a broken
928
+ # install those imports fail (issue #1018), crashing the run once the
929
+ # pipeline has finished, so tolerate them and report ``None`` instead.
930
+ for missing in ["dvc.daemon", "dvc.repo.open_repo"]:
931
+ monkeypatch.setattr(
932
+ dvc.cli,
933
+ "main",
934
+ Mock(
935
+ side_effect=ModuleNotFoundError(
936
+ f"No module named {missing!r}", name=missing
937
+ )
938
+ ),
939
+ )
940
+ assert _run_dvc_repro(["repro"]) is None
941
+ assert "teardown failed" in capsys.readouterr().out
942
+ # A module DVC imports *before* running the command (dvc._debug, dvc.config,
943
+ # dvc.logger) failing means the pipeline never ran at all. Swallowing that
944
+ # would leave an empty log and report success, so it must propagate.
945
+ monkeypatch.setattr(
946
+ dvc.cli,
947
+ "main",
948
+ Mock(
949
+ side_effect=ModuleNotFoundError(
950
+ "No module named 'dvc._debug'", name="dvc._debug"
951
+ )
952
+ ),
953
+ )
954
+ with pytest.raises(ModuleNotFoundError, match="dvc._debug"):
955
+ _run_dvc_repro(["repro"])
956
+ # Non-import errors are unexpected too -- DVC turns real command failures
957
+ # into an exit code -- so they must propagate rather than be masked.
958
+ monkeypatch.setattr(
959
+ dvc.cli, "main", Mock(side_effect=RuntimeError("boom"))
960
+ )
961
+ with pytest.raises(RuntimeError, match="boom"):
962
+ _run_dvc_repro(["repro"])
963
+
964
+
965
+ def test_run_isolated_subproject_stage_exit_code(tmp_dir):
966
+ subprocess.check_call(["calkit", "init"])
967
+ # An isolated subproject is its own Git/DVC repo, so its stage targets run
968
+ # directly inside it rather than through the parent pipeline
969
+ os.makedirs("isolated-sp", exist_ok=True)
970
+ subprocess.check_call(["git", "init"], cwd="isolated-sp")
971
+ subprocess.check_call(["calkit", "init"], cwd="isolated-sp")
972
+ ck_info = calkit.load_calkit_info()
973
+ ck_info["subprojects"] = [{"path": "isolated-sp"}]
974
+ with open("calkit.yaml", "w") as f:
975
+ calkit.ryaml.dump(ck_info, f)
976
+ # A failing subproject stage must exit nonzero; the isolated-target path
977
+ # returns before the parent pipeline runs, and used to skip raising
978
+ with open("isolated-sp/dvc.yaml", "w") as f:
979
+ yaml.dump(
980
+ {
981
+ "stages": {
982
+ "stage-b": {"cmd": 'python -c "import sys; sys.exit(1)"'}
983
+ }
984
+ },
985
+ f,
986
+ )
987
+ result = subprocess.run(["calkit", "run", "isolated-sp:stage-b"])
988
+ assert result.returncode != 0
989
+ # A passing one still exits zero
990
+ with open("isolated-sp/dvc.yaml", "w") as f:
991
+ yaml.dump(
992
+ {"stages": {"stage-b": {"cmd": "python -c \"print('ok')\""}}}, f
993
+ )
994
+ subprocess.check_call(["calkit", "run", "isolated-sp:stage-b"])
995
+
996
+
918
997
  def test_run_ignore_errors(tmp_dir):
919
998
  subprocess.check_call(["calkit", "init"])
920
999
  # Create a pipeline with a failing stage and an independent stage
File without changes