calkit-python 0.37.2__tar.gz → 0.37.3__tar.gz

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