calkit-python 0.34.6__tar.gz → 0.35.0__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 (283) hide show
  1. {calkit_python-0.34.6 → calkit_python-0.35.0}/PKG-INFO +6 -3
  2. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/__init__.py +2 -0
  3. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cli/check.py +29 -7
  4. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cli/config.py +2 -1
  5. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cli/import_.py +8 -11
  6. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cli/main.py +73 -33
  7. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cli/new.py +33 -164
  8. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cli/notebooks.py +9 -2
  9. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cli/slurm.py +56 -25
  10. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cloud.py +29 -15
  11. calkit_python-0.35.0/calkit/dvc.py +497 -0
  12. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/environments.py +52 -1
  13. calkit_python-0.35.0/calkit/fs.py +1008 -0
  14. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/git.py +53 -12
  15. calkit_python-0.35.0/calkit/julia.py +65 -0
  16. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/jupyterlab/routes.py +7 -11
  17. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/labextension/package.json +1 -1
  18. calkit_python-0.35.0/calkit/labextension/static/909.651be47ca47390b78a92.js +1 -0
  19. calkit_python-0.34.6/calkit/labextension/static/remoteEntry.63846b8de2465d49bd89.js → calkit_python-0.35.0/calkit/labextension/static/remoteEntry.c091821b3d7f2d287a67.js +1 -1
  20. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/magics.py +7 -20
  21. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/models/pipeline.py +199 -30
  22. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/pipeline.py +9 -9
  23. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/server.py +20 -12
  24. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/cli/test_new.py +0 -175
  25. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/test_check.py +2 -2
  26. calkit_python-0.35.0/calkit/tests/test_dvc.py +91 -0
  27. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/test_environments.py +55 -0
  28. calkit_python-0.35.0/calkit/tests/test_fs.py +158 -0
  29. calkit_python-0.35.0/calkit/tests/test_git.py +99 -0
  30. calkit_python-0.35.0/calkit/tests/test_julia.py +31 -0
  31. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/test_pipeline.py +191 -15
  32. calkit_python-0.35.0/docs/pipeline/slurm.md +114 -0
  33. {calkit_python-0.34.6 → calkit_python-0.35.0}/pyproject.toml +8 -3
  34. calkit_python-0.35.0/uv.lock +7189 -0
  35. calkit_python-0.34.6/calkit/dvc.py +0 -299
  36. calkit_python-0.34.6/calkit/labextension/static/909.99b13e1e3c2a6e1ceb30.js +0 -1
  37. calkit_python-0.34.6/calkit/tests/test_dvc.py +0 -48
  38. calkit_python-0.34.6/calkit/tests/test_git.py +0 -34
  39. calkit_python-0.34.6/docs/pipeline/slurm.md +0 -63
  40. calkit_python-0.34.6/uv.lock +0 -5538
  41. {calkit_python-0.34.6 → calkit_python-0.35.0}/.gitignore +0 -0
  42. {calkit_python-0.34.6 → calkit_python-0.35.0}/.pre-commit-config.yaml +0 -0
  43. {calkit_python-0.34.6 → calkit_python-0.35.0}/.prettierignore +0 -0
  44. {calkit_python-0.34.6 → calkit_python-0.35.0}/.python-version +0 -0
  45. {calkit_python-0.34.6 → calkit_python-0.35.0}/.yarnrc.yml +0 -0
  46. {calkit_python-0.34.6 → calkit_python-0.35.0}/CITATION.cff +0 -0
  47. {calkit_python-0.34.6 → calkit_python-0.35.0}/CODE_OF_CONDUCT.md +0 -0
  48. {calkit_python-0.34.6 → calkit_python-0.35.0}/CONTRIBUTING.md +0 -0
  49. {calkit_python-0.34.6 → calkit_python-0.35.0}/LICENSE +0 -0
  50. {calkit_python-0.34.6 → calkit_python-0.35.0}/Makefile +0 -0
  51. {calkit_python-0.34.6 → calkit_python-0.35.0}/README.md +0 -0
  52. {calkit_python-0.34.6 → calkit_python-0.35.0}/babel.config.js +0 -0
  53. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/__main__.py +0 -0
  54. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/calc.py +0 -0
  55. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/check.py +0 -0
  56. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cli/__init__.py +0 -0
  57. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cli/cloud.py +0 -0
  58. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cli/core.py +0 -0
  59. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cli/describe.py +0 -0
  60. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cli/latex.py +0 -0
  61. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cli/list.py +0 -0
  62. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cli/office.py +0 -0
  63. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cli/overleaf.py +0 -0
  64. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/cli/update.py +0 -0
  65. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/conda.py +0 -0
  66. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/config.py +0 -0
  67. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/core.py +0 -0
  68. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/datasets.py +0 -0
  69. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/detect.py +0 -0
  70. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/docker.py +0 -0
  71. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/github.py +0 -0
  72. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/gui.py +0 -0
  73. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/invenio.py +0 -0
  74. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/jupyter.py +0 -0
  75. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/jupyterlab/__init__.py +0 -0
  76. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/labextension/schemas/calkit/package.json.orig +0 -0
  77. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/labextension/schemas/calkit/plugin.json +0 -0
  78. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/labextension/static/502.9a2c5772a15466e923ef.js +0 -0
  79. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/labextension/static/695.2c41003a452d43d2b358.js +0 -0
  80. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/labextension/static/867.a42a046aa5108f54f8fb.js +0 -0
  81. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js +0 -0
  82. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt +0 -0
  83. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/labextension/static/b2f1c3efe70cb539d121.png +0 -0
  84. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/labextension/static/style.js +0 -0
  85. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/labextension/static/third-party-licenses.json +0 -0
  86. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/licenses.py +0 -0
  87. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/matlab.py +0 -0
  88. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/models/__init__.py +0 -0
  89. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/models/core.py +0 -0
  90. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/models/io.py +0 -0
  91. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/models/iteration.py +0 -0
  92. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/notebooks.py +0 -0
  93. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/office.py +0 -0
  94. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/ops.py +0 -0
  95. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/overleaf.py +0 -0
  96. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/releases.py +0 -0
  97. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/templates/__init__.py +0 -0
  98. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/templates/core.py +0 -0
  99. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/templates/latex/__init__.py +0 -0
  100. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/templates/latex/article/paper.tex +0 -0
  101. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/templates/latex/core.py +0 -0
  102. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/templates/latex/jfm/jfm.bst +0 -0
  103. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/templates/latex/jfm/jfm.cls +0 -0
  104. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
  105. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/templates/latex/jfm/paper.tex +0 -0
  106. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/templates/latex/jfm/upmath.sty +0 -0
  107. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/__init__.py +0 -0
  108. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/cli/__init__.py +0 -0
  109. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/cli/test_check.py +0 -0
  110. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/cli/test_config.py +0 -0
  111. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/cli/test_import.py +0 -0
  112. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/cli/test_latex.py +0 -0
  113. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/cli/test_list.py +0 -0
  114. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/cli/test_main.py +0 -0
  115. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/cli/test_notebooks.py +0 -0
  116. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/cli/test_overleaf.py +0 -0
  117. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/jupyterlab/__init__.py +0 -0
  118. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/jupyterlab/test_routes.py +0 -0
  119. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/models/__init__.py +0 -0
  120. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/models/test_iteration.py +0 -0
  121. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/models/test_pipeline.py +0 -0
  122. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/test_calc.py +0 -0
  123. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/test_conda.py +0 -0
  124. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/test_core.py +0 -0
  125. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/test_detect.py +0 -0
  126. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/test_invenio.py +0 -0
  127. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/test_jupyter.py +0 -0
  128. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/test_magics.py +0 -0
  129. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/test_matlab.py +0 -0
  130. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/test_notebooks.py +0 -0
  131. {calkit_python-0.34.6 → calkit_python-0.35.0}/calkit/tests/test_templates.py +0 -0
  132. {calkit_python-0.34.6 → calkit_python-0.35.0}/conftest.py +0 -0
  133. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/CNAME +0 -0
  134. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/apps.md +0 -0
  135. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/calculations.md +0 -0
  136. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/calkit-yaml.md +0 -0
  137. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/cli-reference.md +0 -0
  138. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/cloud-integration.md +0 -0
  139. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/datasets.md +0 -0
  140. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/dependencies.md +0 -0
  141. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/environments.md +0 -0
  142. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/examples.md +0 -0
  143. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/governance.md +0 -0
  144. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/help.md +0 -0
  145. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/img/c-to-the-k-white.svg +0 -0
  146. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/img/calkit-fragmentation-compendium.png +0 -0
  147. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/img/calkit-no-bg.png +0 -0
  148. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/img/connect-zenodo.png +0 -0
  149. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/img/jupyterlab/all-green.png +0 -0
  150. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/img/jupyterlab/collect-data-stale.png +0 -0
  151. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/img/jupyterlab/new-env.png +0 -0
  152. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/img/jupyterlab/new-notebook.png +0 -0
  153. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/img/jupyterlab/pipeline-badge.png +0 -0
  154. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/img/jupyterlab-params.png +0 -0
  155. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/img/plos-osi-code-2024-03.png +0 -0
  156. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/img/vscode-nb-params.png +0 -0
  157. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/index.md +0 -0
  158. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/installation.md +0 -0
  159. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/jupyterlab.md +0 -0
  160. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/local-server.md +0 -0
  161. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/notebooks.md +0 -0
  162. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/overleaf.md +0 -0
  163. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/pipeline/index.md +0 -0
  164. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/pipeline/manual-steps.md +0 -0
  165. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/pipeline/running-and-logging.md +0 -0
  166. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/quickstart.md +0 -0
  167. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/references.md +0 -0
  168. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/releases.md +0 -0
  169. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/reproducibility.md +0 -0
  170. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/adding-latex-pub-docker.md +0 -0
  171. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/conda-envs.md +0 -0
  172. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/existing-project.md +0 -0
  173. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/first-project.md +0 -0
  174. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/github-actions.md +0 -0
  175. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/actions-repo-secrets.png +0 -0
  176. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
  177. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
  178. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
  179. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
  180. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
  181. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
  182. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
  183. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
  184. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
  185. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
  186. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/latex-codespaces/push.png +0 -0
  187. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
  188. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
  189. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/chart-more-rows.png +0 -0
  190. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/create-project.png +0 -0
  191. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
  192. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/excel-chart.png +0 -0
  193. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/excel-data.png +0 -0
  194. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
  195. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/needs-clone.png +0 -0
  196. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/new-stage.png +0 -0
  197. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
  198. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
  199. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/status-more-rows.png +0 -0
  200. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
  201. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/untracked-data.png +0 -0
  202. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/updated-publication.png +0 -0
  203. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
  204. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/office/workflow-page.png +0 -0
  205. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/openfoam/clone.png +0 -0
  206. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/openfoam/create-project.png +0 -0
  207. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
  208. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
  209. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
  210. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/openfoam/new-token.png +0 -0
  211. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/openfoam/reclone.png +0 -0
  212. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
  213. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/quick-actions.png +0 -0
  214. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/img/run-proc.png +0 -0
  215. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/index.md +0 -0
  216. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/jupyterlab.md +0 -0
  217. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/latex-codespaces.md +0 -0
  218. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/matlab.md +0 -0
  219. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/notebook-pipeline.md +0 -0
  220. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/office.md +0 -0
  221. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/openfoam.md +0 -0
  222. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/tutorials/procedures.md +0 -0
  223. {calkit_python-0.34.6 → calkit_python-0.35.0}/docs/version-control.md +0 -0
  224. {calkit_python-0.34.6 → calkit_python-0.35.0}/install.json +0 -0
  225. {calkit_python-0.34.6 → calkit_python-0.35.0}/jest.config.js +0 -0
  226. {calkit_python-0.34.6 → calkit_python-0.35.0}/jupyter-config/server-config/calkit.json +0 -0
  227. {calkit_python-0.34.6 → calkit_python-0.35.0}/mkdocs.yml +0 -0
  228. {calkit_python-0.34.6 → calkit_python-0.35.0}/package.json +0 -0
  229. {calkit_python-0.34.6 → calkit_python-0.35.0}/schema/plugin.json +0 -0
  230. {calkit_python-0.34.6 → calkit_python-0.35.0}/scripts/install.ps1 +0 -0
  231. {calkit_python-0.34.6 → calkit_python-0.35.0}/scripts/install.sh +0 -0
  232. {calkit_python-0.34.6 → calkit_python-0.35.0}/scripts/make-calk9.sh +0 -0
  233. {calkit_python-0.34.6 → calkit_python-0.35.0}/scripts/sync-docs.py +0 -0
  234. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/__tests__/useQueries.spec.ts +0 -0
  235. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/calkit-config.ts +0 -0
  236. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/cell-output-marker.ts +0 -0
  237. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/components/commit-dialog.tsx +0 -0
  238. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/components/environment-editor.tsx +0 -0
  239. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/components/notebook-registration.tsx +0 -0
  240. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/components/notebook-toolbar.tsx +0 -0
  241. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/components/pipeline-status-bar.tsx +0 -0
  242. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/components/project-info-editor.tsx +0 -0
  243. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/components/sidebar-settings.tsx +0 -0
  244. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/components/sidebar.tsx +0 -0
  245. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/components/stage-editor.tsx +0 -0
  246. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/feature-flags.ts +0 -0
  247. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/file-browser-menu.ts +0 -0
  248. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/hooks/__tests__/useQueries.test.tsx +0 -0
  249. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/hooks/useQueries.ts +0 -0
  250. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/icons.ts +0 -0
  251. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/index.ts +0 -0
  252. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/io-tracker.ts +0 -0
  253. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/pipeline-state.ts +0 -0
  254. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/queryClient.ts +0 -0
  255. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/request.ts +0 -0
  256. {calkit_python-0.34.6 → calkit_python-0.35.0}/src/shims-mainmenu.d.ts +0 -0
  257. {calkit_python-0.34.6 → calkit_python-0.35.0}/style/base.css +0 -0
  258. {calkit_python-0.34.6 → calkit_python-0.35.0}/style/cell-output-marker.css +0 -0
  259. {calkit_python-0.34.6 → calkit_python-0.35.0}/style/environment-editor.css +0 -0
  260. {calkit_python-0.34.6 → calkit_python-0.35.0}/style/environment-selector.css +0 -0
  261. {calkit_python-0.34.6 → calkit_python-0.35.0}/style/img/calkit-no-bg.png +0 -0
  262. {calkit_python-0.34.6 → calkit_python-0.35.0}/style/index.css +0 -0
  263. {calkit_python-0.34.6 → calkit_python-0.35.0}/style/index.js +0 -0
  264. {calkit_python-0.34.6 → calkit_python-0.35.0}/style/notebook-toolbar.css +0 -0
  265. {calkit_python-0.34.6 → calkit_python-0.35.0}/style/pipeline-status-bar.css +0 -0
  266. {calkit_python-0.34.6 → calkit_python-0.35.0}/style/sidebar.css +0 -0
  267. {calkit_python-0.34.6 → calkit_python-0.35.0}/test/dvc-md5-dir/osx-arm64.txt +0 -0
  268. {calkit_python-0.34.6 → calkit_python-0.35.0}/test/nb-julia.ipynb +0 -0
  269. {calkit_python-0.34.6 → calkit_python-0.35.0}/test/nb-params.ipynb +0 -0
  270. {calkit_python-0.34.6 → calkit_python-0.35.0}/test/nb-subdir.ipynb +0 -0
  271. {calkit_python-0.34.6 → calkit_python-0.35.0}/test/pipeline.ipynb +0 -0
  272. {calkit_python-0.34.6 → calkit_python-0.35.0}/test/script.py +0 -0
  273. {calkit_python-0.34.6 → calkit_python-0.35.0}/test/test-log.log +0 -0
  274. {calkit_python-0.34.6 → calkit_python-0.35.0}/tsconfig.json +0 -0
  275. {calkit_python-0.34.6 → calkit_python-0.35.0}/tsconfig.test.json +0 -0
  276. {calkit_python-0.34.6 → calkit_python-0.35.0}/ui-tests/.gitignore +0 -0
  277. {calkit_python-0.34.6 → calkit_python-0.35.0}/ui-tests/README.md +0 -0
  278. {calkit_python-0.34.6 → calkit_python-0.35.0}/ui-tests/jupyter_server_test_config.py +0 -0
  279. {calkit_python-0.34.6 → calkit_python-0.35.0}/ui-tests/package.json +0 -0
  280. {calkit_python-0.34.6 → calkit_python-0.35.0}/ui-tests/playwright.config.js +0 -0
  281. {calkit_python-0.34.6 → calkit_python-0.35.0}/ui-tests/tests/calkit.spec.ts +0 -0
  282. {calkit_python-0.34.6 → calkit_python-0.35.0}/ui-tests/yarn.lock +0 -0
  283. {calkit_python-0.34.6 → calkit_python-0.35.0}/yarn.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: calkit-python
3
- Version: 0.34.6
3
+ Version: 0.35.0
4
4
  Summary: Reproducibility simplified.
5
5
  Project-URL: Homepage, https://calkit.org
6
6
  Project-URL: Issues, https://github.com/calkit/calkit/issues
@@ -26,8 +26,9 @@ Requires-Dist: arithmeval
26
26
  Requires-Dist: bibtexparser
27
27
  Requires-Dist: checksumdir
28
28
  Requires-Dist: docx2pdf
29
- Requires-Dist: dvc==3.64.2
29
+ Requires-Dist: dvc==3.66.1
30
30
  Requires-Dist: fastapi
31
+ Requires-Dist: fsspec>=2026.2.0
31
32
  Requires-Dist: gitpython
32
33
  Requires-Dist: json2latex>=0.0.3
33
34
  Requires-Dist: jupyterlab>=4.4.5
@@ -47,11 +48,13 @@ Requires-Dist: sqlitedict>=2.1.0
47
48
  Requires-Dist: texsoup>=0.3.1
48
49
  Requires-Dist: toml>=0.10.2
49
50
  Requires-Dist: tqdm>=4.67.1
50
- Requires-Dist: typer==0.21.1
51
+ Requires-Dist: typer==0.24.1
51
52
  Requires-Dist: uvicorn
52
53
  Provides-Extra: data
53
54
  Requires-Dist: pandas>=2.2.3; extra == 'data'
54
55
  Requires-Dist: polars>=1.18.0; extra == 'data'
56
+ Provides-Extra: xet
57
+ Requires-Dist: xet>=0.0.1; extra == 'xet'
55
58
  Description-Content-Type: text/markdown
56
59
 
57
60
  <p align="center">
@@ -6,6 +6,7 @@ from .core import * # noqa: F403, I001
6
6
  from . import git # noqa: F401
7
7
  from . import dvc # noqa: F401
8
8
  from . import cloud # noqa: F401
9
+ from . import fs # noqa: F401
9
10
  from . import jupyter # noqa: F401
10
11
  from . import config # noqa: F401
11
12
  from . import models # noqa: F401
@@ -19,6 +20,7 @@ from . import invenio # noqa: F401
19
20
  from . import releases # noqa: F401
20
21
  from . import licenses # noqa: F401
21
22
  from . import overleaf # noqa: F401
23
+ from . import julia # noqa: F401
22
24
  from .notebooks import declare_notebook # noqa: F401
23
25
  from .jupyterlab.routes import setup_route_handlers
24
26
 
@@ -196,13 +196,27 @@ def check_environment(
196
196
  "Julia environments require a path pointing to Project.toml"
197
197
  )
198
198
  # First ensure the Julia version exists
199
- cmd = ["juliaup", "add", julia_version]
200
- if verbose:
201
- typer.echo(f"Running command: {cmd}")
202
- try:
203
- subprocess.run(cmd, check=True)
204
- except subprocess.CalledProcessError:
205
- raise_error(f"Failed to install Julia version {julia_version}")
199
+ if shutil.which("juliaup") is not None:
200
+ cmd = ["juliaup", "add", julia_version]
201
+ if verbose:
202
+ typer.echo(f"Running command: {cmd}")
203
+ try:
204
+ subprocess.run(cmd, check=True)
205
+ except subprocess.CalledProcessError:
206
+ raise_error(f"Failed to install Julia version {julia_version}")
207
+ else:
208
+ try:
209
+ compatible = calkit.julia.current_version_is_compatible(
210
+ julia_version
211
+ )
212
+ except ValueError as e:
213
+ raise_error(str(e))
214
+ if not compatible:
215
+ raise_error(
216
+ f"Current Julia version is not compatible with required "
217
+ f"version ({julia_version}), and juliaup is not available to "
218
+ "install it"
219
+ )
206
220
  env_dir = os.path.dirname(env_path)
207
221
  if not env_dir:
208
222
  env_dir = "."
@@ -253,6 +267,10 @@ def check_environment(
253
267
  "-e",
254
268
  f"using Pkg; Pkg.add([{pkg_list}]);",
255
269
  ]
270
+ try:
271
+ cmd = calkit.julia.check_version_in_command(cmd)
272
+ except Exception as e:
273
+ raise_error(f"Failed to check Julia version: {e}")
256
274
  try:
257
275
  subprocess.check_call(
258
276
  cmd,
@@ -267,6 +285,10 @@ def check_environment(
267
285
  "-e",
268
286
  "using Pkg; Pkg.instantiate();",
269
287
  ]
288
+ try:
289
+ cmd = calkit.julia.check_version_in_command(cmd)
290
+ except Exception as e:
291
+ raise_error(f"Failed to check Julia version: {e}")
270
292
  try:
271
293
  subprocess.check_call(
272
294
  cmd, env=os.environ.copy() | {"JULIA_LOAD_PATH": "@:@stdlib"}
@@ -113,8 +113,9 @@ def setup_remote_auth():
113
113
  remotes = get_remotes()
114
114
  except Exception:
115
115
  raise_error("Cannot list DVC remotes; check DVC config for errors")
116
+ ck_remote_name = calkit.config.get_app_name()
116
117
  for name, url in remotes.items():
117
- if name == "calkit" or name.startswith("calkit:"):
118
+ if name == ck_remote_name or name.startswith(f"{ck_remote_name}:"):
118
119
  typer.echo(f"Setting up authentication for DVC remote: {name}")
119
120
  set_remote_auth(remote_name=name)
120
121
 
@@ -6,8 +6,6 @@ import base64
6
6
  import fnmatch
7
7
  import json
8
8
  import os
9
- import subprocess
10
- import sys
11
9
  from copy import deepcopy
12
10
  from typing import Annotated
13
11
 
@@ -19,6 +17,7 @@ from tqdm import tqdm
19
17
  import calkit
20
18
  import calkit.invenio
21
19
  from calkit.cli import raise_error
20
+ from calkit.dvc import run_dvc_command
22
21
  from calkit.models.core import _ImportedFromProject
23
22
 
24
23
  import_app = typer.Typer(no_args_is_help=True)
@@ -209,7 +208,9 @@ def import_dataset(
209
208
  if not no_dvc_pull and dvc_import is not None:
210
209
  # Run dvc pull
211
210
  typer.echo("Running dvc pull")
212
- subprocess.call([sys.executable, "-m", "dvc", "pull", dvc_fpath])
211
+ result = run_dvc_command(["pull", dvc_fpath])
212
+ if result != 0:
213
+ raise_error("Failed to pull from DVC")
213
214
 
214
215
 
215
216
  @import_app.command(name="environment")
@@ -423,10 +424,8 @@ def import_from_zenodo(
423
424
  commit_paths = []
424
425
  if storage is None:
425
426
  if calkit.get_size(dest_dir) > calkit.DVC_SIZE_THRESH_BYTES:
426
- res = subprocess.run(
427
- [sys.executable, "-m", "dvc", "add"], check=False
428
- )
429
- if res.returncode != 0:
427
+ result = run_dvc_command(["add"])
428
+ if result != 0:
430
429
  raise_error("Failed to DVC add")
431
430
  # Git add the .dvc file
432
431
  dvc_file = dest_dir + ".dvc"
@@ -436,10 +435,8 @@ def import_from_zenodo(
436
435
  repo.git.add(dest_dir)
437
436
  commit_paths.append(dest_dir)
438
437
  elif storage.lower() == "dvc":
439
- res = subprocess.run(
440
- [sys.executable, "-m", "dvc", "add", dest_dir], check=False
441
- )
442
- if res.returncode != 0:
438
+ result = run_dvc_command(["add", dest_dir])
439
+ if result != 0:
443
440
  raise_error("Failed to DVC add")
444
441
  # Git add the .dvc file
445
442
  dvc_file = dest_dir + ".dvc"
@@ -55,6 +55,7 @@ from calkit.cli.office import office_app
55
55
  from calkit.cli.overleaf import overleaf_app
56
56
  from calkit.cli.slurm import slurm_app
57
57
  from calkit.cli.update import update_app
58
+ from calkit.dvc import register_ck_scheme, run_dvc_command
58
59
  from calkit.environments import get_env_lock_fpath
59
60
  from calkit.models import Procedure
60
61
 
@@ -125,14 +126,13 @@ def init(
125
126
  ):
126
127
  """Initialize the current working directory."""
127
128
  subprocess.run(["git", "init"])
128
- dvc_cmd = [sys.executable, "-m", "dvc", "init"]
129
- if force:
130
- dvc_cmd.append("-f")
131
- subprocess.run(dvc_cmd)
129
+ result = run_dvc_command(["init"] + (["--force"] if force else []))
130
+ if result != 0:
131
+ raise_error("Failed to initialize DVC")
132
132
  # Ensure autostage is enabled for DVC
133
- subprocess.call(
134
- [sys.executable, "-m", "dvc", "config", "core.autostage", "true"]
135
- )
133
+ result = run_dvc_command(["config", "core.autostage", "true"])
134
+ if result != 0:
135
+ raise_error("Failed to configure DVC autostage")
136
136
  # Commit the newly created .dvc directory
137
137
  repo = git.Repo()
138
138
  repo.git.add(".dvc")
@@ -220,13 +220,24 @@ def clone(
220
220
  # DVC pull
221
221
  if not no_dvc_pull:
222
222
  try:
223
- subprocess.check_call([sys.executable, "-m", "dvc", "pull"])
224
- except subprocess.CalledProcessError:
225
- raise_error("Failed to pull from DVC remote(s)")
223
+ result = run_dvc_command(["pull"])
224
+ if result != 0:
225
+ raise_error("Failed to pull from DVC remote(s)")
226
+ except Exception as e:
227
+ raise_error(f"Failed to pull from DVC remote(s): {e}")
226
228
 
227
229
 
228
230
  @app.command(name="status")
229
231
  def get_status(
232
+ targets: Annotated[
233
+ list[str] | None,
234
+ typer.Argument(
235
+ help=(
236
+ "Optional targets to check status for. These may be "
237
+ "pipeline stage names or repo paths."
238
+ ),
239
+ ),
240
+ ] = None,
230
241
  categories: Annotated[
231
242
  list[str] | None,
232
243
  typer.Option(
@@ -282,15 +293,24 @@ def get_status(
282
293
  typer.echo()
283
294
  if "git" in categories:
284
295
  print_sep("Git")
285
- run_cmd(["git", "status"])
296
+ git_cmd = ["git", "status"]
297
+ if targets:
298
+ git_cmd += ["--"] + targets
299
+ run_cmd(git_cmd)
286
300
  typer.echo()
287
301
  if "dvc" in categories:
288
302
  print_sep("DVC")
289
- run_cmd([sys.executable, "-m", "dvc", "data", "status"])
303
+ dvc_data_cmd = ["data", "status"]
304
+ if targets:
305
+ dvc_data_cmd += targets
306
+ run_dvc_command(dvc_data_cmd)
290
307
  typer.echo()
291
308
  if "pipeline" in categories or "dvc" in categories:
292
309
  print_sep("Pipeline")
293
- run_cmd([sys.executable, "-m", "dvc", "status"])
310
+ dvc_pipeline_cmd = ["status"]
311
+ if targets:
312
+ dvc_pipeline_cmd += targets
313
+ run_dvc_command(dvc_pipeline_cmd)
294
314
 
295
315
 
296
316
  @app.command(name="diff")
@@ -309,7 +329,7 @@ def diff(
309
329
  git_cmd.append("--staged")
310
330
  run_cmd(git_cmd)
311
331
  print_sep("Pipeline (DVC)")
312
- run_cmd([sys.executable, "-m", "dvc", "diff"])
332
+ run_dvc_command(["diff"])
313
333
 
314
334
 
315
335
  @app.command(name="add")
@@ -383,13 +403,18 @@ def add(
383
403
  raise_error("Not currently in a Git repo; run `calkit init` first")
384
404
  repo = git.Repo()
385
405
  try:
406
+ register_ck_scheme()
386
407
  dvc_repo = dvc.repo.Repo()
387
408
  except NotDvcRepoError:
388
409
  warn("DVC not initialized yet; initializing")
389
410
  dvc_repo = dvc.repo.Repo.init()
390
411
  # Ensure autostage is enabled for DVC
391
- subprocess.call(
392
- [sys.executable, "-m", "dvc", "config", "core.autostage", "true"]
412
+ run_dvc_command(
413
+ [
414
+ "config",
415
+ "core.autostage",
416
+ "true",
417
+ ]
393
418
  )
394
419
  subprocess.call(["git", "add", ".dvc/config"])
395
420
  dvc_paths = calkit.dvc.list_paths()
@@ -404,7 +429,7 @@ def add(
404
429
  if to == "git":
405
430
  subprocess.call(["git", "add"] + paths)
406
431
  elif to == "dvc":
407
- subprocess.call([sys.executable, "-m", "dvc", "add"] + paths)
432
+ run_dvc_command(["add"] + paths)
408
433
  else:
409
434
  raise_error(f"Invalid option for 'to': {to}")
410
435
  else:
@@ -465,15 +490,15 @@ def add(
465
490
  typer.echo(
466
491
  f"Adding {path} to DVC since it's already tracked with DVC"
467
492
  )
468
- subprocess.call([sys.executable, "-m", "dvc", "add", path])
493
+ run_dvc_command(["add", path])
469
494
  elif os.path.splitext(path)[-1] in DVC_EXTENSIONS:
470
495
  typer.echo(f"Adding {path} to DVC per its extension")
471
- subprocess.call([sys.executable, "-m", "dvc", "add", path])
496
+ run_dvc_command(["add", path])
472
497
  elif calkit.get_size(path) > DVC_SIZE_THRESH_BYTES:
473
498
  typer.echo(
474
499
  f"Adding {path} to DVC since it's greater than 1 MB"
475
500
  )
476
- subprocess.call([sys.executable, "-m", "dvc", "add", path])
501
+ run_dvc_command(["add", path])
477
502
  else:
478
503
  typer.echo(f"Adding {path} to Git")
479
504
  subprocess.call(["git", "add", path])
@@ -694,13 +719,15 @@ def pull(
694
719
  if not no_check_auth:
695
720
  # Check that our dvc remotes all have our DVC token set for them
696
721
  remotes = calkit.dvc.get_remotes()
722
+ ck_remote_name = calkit.config.get_app_name()
697
723
  for name, url in remotes.items():
698
- if name == "calkit" or name.startswith("calkit:"):
724
+ if (
725
+ name == ck_remote_name or name.startswith(f"{ck_remote_name}:")
726
+ ) and url.startswith("http"):
699
727
  typer.echo(f"Checking authentication for DVC remote: {name}")
700
728
  calkit.dvc.set_remote_auth(remote_name=name)
701
- try:
702
- subprocess.check_call([sys.executable, "-m", "dvc", "pull"] + dvc_args)
703
- except subprocess.CalledProcessError:
729
+ result = run_dvc_command(["pull"] + dvc_args)
730
+ if result != 0:
704
731
  raise_error("DVC pull failed")
705
732
 
706
733
 
@@ -734,17 +761,18 @@ def push(
734
761
  if not no_check_auth:
735
762
  # Check that our dvc remotes all have our DVC token set for them
736
763
  remotes = calkit.dvc.get_remotes()
764
+ ck_remote_name = calkit.config.get_app_name()
737
765
  for name, url in remotes.items():
738
- if name == "calkit" or name.startswith("calkit:"):
766
+ if (
767
+ name == ck_remote_name
768
+ or name.startswith(f"{ck_remote_name}:")
769
+ ) and url.startswith("http"):
739
770
  typer.echo(
740
771
  f"Checking authentication for DVC remote: {name}"
741
772
  )
742
773
  calkit.dvc.set_remote_auth(remote_name=name)
743
- try:
744
- subprocess.check_call(
745
- [sys.executable, "-m", "dvc", "push"] + dvc_args
746
- )
747
- except subprocess.CalledProcessError:
774
+ result = run_dvc_command(["push"] + dvc_args)
775
+ if result != 0:
748
776
  raise_error("DVC push failed")
749
777
 
750
778
 
@@ -1109,12 +1137,16 @@ def run(
1109
1137
  os.environ.pop("CALKIT_PIPELINE_RUNNING", None)
1110
1138
  raise_error(f"Pipeline compilation failed: {e}")
1111
1139
  # Initialize DVC repo if necessary
1140
+ # Register the ck:// scheme before accessing DVC repo
1141
+ register_ck_scheme()
1112
1142
  try:
1113
1143
  dvc.repo.Repo()
1114
1144
  except Exception:
1115
1145
  if not quiet:
1116
1146
  typer.echo("Initializing DVC repo")
1117
- dvc.repo.Repo.init()
1147
+ result = run_dvc_command(["init"])
1148
+ if result != 0:
1149
+ raise_error("Failed to initialize DVC repo")
1118
1150
  # Convert deps into target stage names
1119
1151
  # TODO: This could probably be merged back upstream into DVC
1120
1152
  if dvc_stages is None:
@@ -1169,6 +1201,7 @@ def run(
1169
1201
  git_staged_files_before = calkit.git.get_staged_files(repo=repo)
1170
1202
  git_untracked_files_before = calkit.git.get_untracked_files(repo=repo)
1171
1203
  # Get status of DVC repo before running
1204
+ register_ck_scheme()
1172
1205
  dvc_repo = dvc.repo.Repo()
1173
1206
  dvc_status_before = dvc_repo.status()
1174
1207
  dvc_data_status_before = dvc_repo.data_status()
@@ -1616,11 +1649,18 @@ def run_in_env(
1616
1649
  # calling julia
1617
1650
  if cmd[0] == "julia":
1618
1651
  cmd = cmd[1:]
1652
+ # If there are any --project= args, remove them since we are already
1653
+ # specifying the project
1654
+ cmd = [arg for arg in cmd if not arg.startswith("--project=")]
1619
1655
  julia_cmd = [
1620
1656
  "julia",
1621
1657
  f"+{julia_version}",
1622
1658
  "--project=" + env_dir,
1623
1659
  ] + cmd
1660
+ try:
1661
+ julia_cmd = calkit.julia.check_version_in_command(julia_cmd)
1662
+ except Exception as e:
1663
+ raise_error(f"Failed to check Julia version: {e}")
1624
1664
  if verbose:
1625
1665
  typer.echo(f"Running command: {julia_cmd}")
1626
1666
  try:
@@ -2592,8 +2632,8 @@ def call_dvc(
2592
2632
  Useful if Calkit is installed as a tool, e.g., with `uv tool` or `pipx`,
2593
2633
  and DVC is not installed.
2594
2634
  """
2595
- process = subprocess.run([sys.executable, "-m", "dvc"] + sys.argv[2:])
2596
- sys.exit(process.returncode)
2635
+ result = run_dvc_command(sys.argv[2:])
2636
+ sys.exit(result)
2597
2637
 
2598
2638
 
2599
2639
  @app.command(
@@ -7,7 +7,6 @@ import os
7
7
  import pathlib
8
8
  import shutil
9
9
  import subprocess
10
- import sys
11
10
  import zipfile
12
11
  from enum import Enum
13
12
 
@@ -23,6 +22,7 @@ from calkit.cli.check import check_environment
23
22
  from calkit.cli.update import update_devcontainer
24
23
  from calkit.core import ryaml
25
24
  from calkit.docker import LAYERS
25
+ from calkit.dvc import run_dvc_command
26
26
  from calkit.environments import DEFAULT_PYTHON_VERSION
27
27
  from calkit.models.pipeline import LatexStage, StageIteration
28
28
 
@@ -141,15 +141,14 @@ def new_project(
141
141
  if not os.path.isfile(os.path.join(abs_path, ".dvc", "config")):
142
142
  typer.echo("Initializing DVC repository")
143
143
  try:
144
- subprocess.run(
145
- [sys.executable, "-m", "dvc", "init", "-q"],
144
+ result = run_dvc_command(
145
+ ["init", "-q"],
146
146
  cwd=abs_path,
147
- capture_output=True,
148
- check=True,
149
- text=True,
150
147
  )
148
+ if result != 0:
149
+ raise subprocess.CalledProcessError(result, "dvc init")
151
150
  except subprocess.CalledProcessError as e:
152
- raise_error(f"Failed to initialize DVC repository: {e.stderr}")
151
+ raise_error(f"Failed to initialize DVC repository: {e}")
153
152
  # Commit the DVC init changes
154
153
  if not no_commit:
155
154
  repo.git.add(".dvc")
@@ -330,18 +329,12 @@ def new_project(
330
329
  "You will need to manually run `git remote add origin` "
331
330
  "and `calkit config remote`"
332
331
  )
333
- subprocess.call(
334
- [
335
- sys.executable,
336
- "-m",
337
- "dvc",
338
- "remote",
339
- "remove",
340
- "calkit",
341
- "-q",
342
- ],
332
+ result = run_dvc_command(
333
+ ["remote", "remove", "calkit", "-q"],
343
334
  cwd=abs_path,
344
335
  )
336
+ if result != 0:
337
+ warn("Failed to remove DVC remote")
345
338
  try:
346
339
  calkit.dvc.set_remote_auth(wdir=abs_path)
347
340
  except Exception:
@@ -361,9 +354,12 @@ def new_project(
361
354
  repo = git.Repo(abs_path)
362
355
  if not os.path.isfile(os.path.join(abs_path, ".dvc", "config")):
363
356
  typer.echo("Initializing DVC repository")
364
- subprocess.run(
365
- [sys.executable, "-m", "dvc", "init", "-q"], cwd=abs_path
357
+ result = run_dvc_command(
358
+ ["init", "-q"],
359
+ cwd=abs_path,
366
360
  )
361
+ if result != 0:
362
+ raise_error("Failed to initialize DVC repository")
367
363
  # Create calkit.yaml file
368
364
  ck_info = calkit.load_calkit_info(wdir=abs_path)
369
365
  ck_info = dict(name=name, title=title, description=description) | ck_info
@@ -493,13 +489,20 @@ def new_figure(
493
489
  outs_cmd = []
494
490
  for out in outs:
495
491
  outs_cmd += ["-o", out]
496
- subprocess.check_call(
497
- [sys.executable, "-m", "dvc", "stage", "add", "-n", stage_name]
492
+ result = run_dvc_command(
493
+ [
494
+ "stage",
495
+ "add",
496
+ "-n",
497
+ stage_name,
498
+ ]
498
499
  + (["-f"] if overwrite else [])
499
500
  + deps_cmd
500
501
  + outs_cmd
501
502
  + [cmd]
502
503
  )
504
+ if result != 0:
505
+ raise_error(f"Failed to add figure {obj}")
503
506
  figures.append(obj)
504
507
  ck_info["figures"] = figures
505
508
  with open("calkit.yaml", "w") as f:
@@ -910,13 +913,20 @@ def new_dataset(
910
913
  outs_cmd = []
911
914
  for out in outs:
912
915
  outs_cmd += ["-o", out]
913
- subprocess.check_call(
914
- [sys.executable, "-m", "dvc", "stage", "add", "-n", stage_name]
916
+ result = run_dvc_command(
917
+ [
918
+ "stage",
919
+ "add",
920
+ "-n",
921
+ stage_name,
922
+ ]
915
923
  + (["-f"] if overwrite else [])
916
924
  + deps_cmd
917
925
  + outs_cmd
918
926
  + [cmd]
919
927
  )
928
+ if result != 0:
929
+ raise_error(f"Failed to add dataset {obj}")
920
930
  datasets.append(obj)
921
931
  ck_info["datasets"] = datasets
922
932
  with open("calkit.yaml", "w") as f:
@@ -2977,144 +2987,3 @@ def new_release(
2977
2987
  # TODO: Upload assets for GitHub release if they're not too big?
2978
2988
  typer.echo(f"New {release_type} release {name} successfully created")
2979
2989
  return release
2980
-
2981
-
2982
- @new_app.command(name="stage")
2983
- def new_stage(
2984
- name: StageArgs.name,
2985
- kind: Annotated[
2986
- StageKind, typer.Option("--kind", help="What kind of stage to create.")
2987
- ],
2988
- target: Annotated[
2989
- str,
2990
- typer.Option(
2991
- "--target", "-t", help="Target file, e.g., the script to run."
2992
- ),
2993
- ],
2994
- environment: Annotated[
2995
- str | None,
2996
- typer.Option(
2997
- "--environment", "-e", help="Environment to use to run the stage."
2998
- ),
2999
- ] = None,
3000
- deps: Annotated[
3001
- list[str],
3002
- typer.Option("--dep", "-d", help="A path on which the stage depends."),
3003
- ] = [],
3004
- outs: Annotated[
3005
- list[str],
3006
- typer.Option(
3007
- "--out", "-o", help="A path that is produced by the stage."
3008
- ),
3009
- ] = [],
3010
- outs_persist: Annotated[
3011
- list[str],
3012
- typer.Option(
3013
- "--out-persist",
3014
- help="An output that should not be deleted before running.",
3015
- ),
3016
- ] = [],
3017
- outs_no_cache: Annotated[
3018
- list[str],
3019
- typer.Option(
3020
- "--out-git",
3021
- help="An output that should be tracked with Git instead of DVC.",
3022
- ),
3023
- ] = [],
3024
- outs_persist_no_cache: Annotated[
3025
- list[str],
3026
- typer.Option(
3027
- "--out-git-persist",
3028
- help=(
3029
- "An output that should be tracked with Git instead of DVC, "
3030
- "and also should not be deleted before running stage."
3031
- ),
3032
- ),
3033
- ] = [],
3034
- overwrite: Annotated[
3035
- bool,
3036
- typer.Option(
3037
- "--overwrite",
3038
- "--force",
3039
- "-f",
3040
- help="Overwrite an existing stage with this name if necessary.",
3041
- ),
3042
- ] = False,
3043
- no_check: Annotated[
3044
- bool,
3045
- typer.Option(
3046
- "--no-check",
3047
- help="Do not check if the target, deps, environment, etc., exist.",
3048
- ),
3049
- ] = False,
3050
- no_commit: Annotated[
3051
- bool, typer.Option("--no-commit", help="Do not commit changes to Git.")
3052
- ] = False,
3053
- ):
3054
- """Create a new DVC pipeline stage (deprecated)."""
3055
- ck_info = calkit.load_calkit_info(process_includes="environments")
3056
- environments = ck_info.get("environments", {})
3057
- if environment is None:
3058
- warn("No environment is specified")
3059
- cmd = ""
3060
- else:
3061
- if environment not in environments and not no_check:
3062
- raise_error(f"Environment '{environment}' does not exist")
3063
- cmd = f"calkit xenv -n {environment} -- "
3064
- # Add environment path as a dependency if applicable
3065
- env_path = environments.get(environment, {}).get("path")
3066
- if env_path is not None and env_path not in deps:
3067
- deps = [env_path] + deps
3068
- if not os.path.exists(target) and not no_check:
3069
- raise_error(f"Target '{target}' does not exist")
3070
- if kind.value == "python-script":
3071
- cmd += f"python {target}"
3072
- elif kind.value == "latex":
3073
- cmd = f"calkit latex build {target}"
3074
- if environment is not None:
3075
- cmd += f" --environment {environment}"
3076
- out_target = target.removesuffix(".tex") + ".pdf"
3077
- if out_target not in (
3078
- outs + outs_no_cache + outs_persist + outs_persist_no_cache
3079
- ):
3080
- outs = [out_target] + outs
3081
- elif kind.value == "matlab-script":
3082
- cmd += f"matlab -noFigureWindows -batch \"run('{target}');\""
3083
- elif kind.value == "sh-script":
3084
- cmd += f"sh {target}"
3085
- elif kind.value == "bash-script":
3086
- cmd += f"bash {target}"
3087
- elif kind.value == "zsh-script":
3088
- cmd += f"zsh {target}"
3089
- elif kind.value == "r-script":
3090
- cmd += f"Rscript {target}"
3091
- add_cmd = [sys.executable, "-m", "dvc", "stage", "add", "-n", name]
3092
- if target not in deps:
3093
- deps = [target] + deps
3094
- for dep in deps:
3095
- add_cmd += ["-d", dep]
3096
- for out in outs:
3097
- add_cmd += ["-o", out]
3098
- for out in outs_no_cache:
3099
- add_cmd += ["--outs-no-cache", out]
3100
- for out in outs_persist:
3101
- add_cmd += ["--outs-persist", out]
3102
- for out in outs_persist_no_cache:
3103
- add_cmd += ["--outs-persist-no-cache", out]
3104
- if overwrite:
3105
- add_cmd.append("-f")
3106
- add_cmd.append(cmd)
3107
- try:
3108
- subprocess.check_call(add_cmd)
3109
- except subprocess.CalledProcessError:
3110
- raise_error("Failed to create stage")
3111
- if not no_commit:
3112
- try:
3113
- repo = git.Repo()
3114
- except InvalidGitRepositoryError:
3115
- raise_error("Can't commit because this is not a Git repo")
3116
- repo.git.add("dvc.yaml")
3117
- if "dvc.yaml" in calkit.git.get_staged_files():
3118
- repo.git.commit(
3119
- ["dvc.yaml", "-m", f"Add {kind.value} pipeline stage '{name}'"]
3120
- )