calkit-python 0.39.1__tar.gz → 0.40.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 (330) hide show
  1. {calkit_python-0.39.1 → calkit_python-0.40.0}/PKG-INFO +1 -1
  2. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/check.py +7 -0
  3. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/main/core.py +47 -22
  4. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/new.py +96 -4
  5. calkit_python-0.40.0/calkit/cli/scheduler.py +606 -0
  6. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/conda.py +182 -10
  7. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/environments.py +62 -2
  8. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/models/core.py +9 -0
  9. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/models/pipeline.py +317 -101
  10. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/pipeline.py +119 -8
  11. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/models/test_pipeline.py +83 -41
  12. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_conda.py +59 -0
  13. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_detect.py +2 -2
  14. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_environments.py +60 -0
  15. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_pipeline.py +616 -76
  16. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/cli-reference.md +69 -40
  17. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/environments.md +1 -2
  18. calkit_python-0.40.0/docs/hpc.md +142 -0
  19. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/pipeline/index.md +1 -11
  20. {calkit_python-0.39.1 → calkit_python-0.40.0}/mkdocs.yml +1 -1
  21. calkit_python-0.39.1/calkit/cli/slurm.py +0 -415
  22. calkit_python-0.39.1/docs/pipeline/slurm.md +0 -114
  23. {calkit_python-0.39.1 → calkit_python-0.40.0}/.claude-plugin/marketplace.json +0 -0
  24. {calkit_python-0.39.1 → calkit_python-0.40.0}/.gitignore +0 -0
  25. {calkit_python-0.39.1 → calkit_python-0.40.0}/.pre-commit-config.yaml +0 -0
  26. {calkit_python-0.39.1 → calkit_python-0.40.0}/.prettierignore +0 -0
  27. {calkit_python-0.39.1 → calkit_python-0.40.0}/.python-version +0 -0
  28. {calkit_python-0.39.1 → calkit_python-0.40.0}/.vscode/launch.json +0 -0
  29. {calkit_python-0.39.1 → calkit_python-0.40.0}/.vscode/tasks.json +0 -0
  30. {calkit_python-0.39.1 → calkit_python-0.40.0}/.yarnrc.yml +0 -0
  31. {calkit_python-0.39.1 → calkit_python-0.40.0}/AGENTS.md +0 -0
  32. {calkit_python-0.39.1 → calkit_python-0.40.0}/CITATION.cff +0 -0
  33. {calkit_python-0.39.1 → calkit_python-0.40.0}/CODE_OF_CONDUCT.md +0 -0
  34. {calkit_python-0.39.1 → calkit_python-0.40.0}/CONTRIBUTING.md +0 -0
  35. {calkit_python-0.39.1 → calkit_python-0.40.0}/LICENSE +0 -0
  36. {calkit_python-0.39.1 → calkit_python-0.40.0}/Makefile +0 -0
  37. {calkit_python-0.39.1 → calkit_python-0.40.0}/README.md +0 -0
  38. {calkit_python-0.39.1 → calkit_python-0.40.0}/agent-plugin/.claude-plugin/plugin.json +0 -0
  39. {calkit_python-0.39.1 → calkit_python-0.40.0}/agent-plugin/skills/add-pipeline-stage/SKILL.md +0 -0
  40. {calkit_python-0.39.1 → calkit_python-0.40.0}/agent-plugin/skills/conventions/SKILL.md +0 -0
  41. {calkit_python-0.39.1 → calkit_python-0.40.0}/agent-plugin/skills/create-pipeline/SKILL.md +0 -0
  42. {calkit_python-0.39.1 → calkit_python-0.40.0}/babel.config.js +0 -0
  43. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/__init__.py +0 -0
  44. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/__main__.py +0 -0
  45. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/calc.py +0 -0
  46. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/check.py +0 -0
  47. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/__init__.py +0 -0
  48. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/cloud.py +0 -0
  49. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/config.py +0 -0
  50. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/core.py +0 -0
  51. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/describe.py +0 -0
  52. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/dev.py +0 -0
  53. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/import_.py +0 -0
  54. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/latex.py +0 -0
  55. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/list.py +0 -0
  56. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/main/__init__.py +0 -0
  57. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/main/xr.py +0 -0
  58. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/notebooks.py +0 -0
  59. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/office.py +0 -0
  60. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/overleaf.py +0 -0
  61. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cli/update.py +0 -0
  62. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/cloud.py +0 -0
  63. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/config.py +0 -0
  64. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/core.py +0 -0
  65. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/datasets.py +0 -0
  66. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/detect.py +0 -0
  67. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/docker.py +0 -0
  68. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/dvc/__init__.py +0 -0
  69. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/dvc/core.py +0 -0
  70. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/dvc/zip.py +0 -0
  71. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/fs.py +0 -0
  72. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/git.py +0 -0
  73. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/github.py +0 -0
  74. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/gui.py +0 -0
  75. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/invenio.py +0 -0
  76. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/julia.py +0 -0
  77. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/jupyter.py +0 -0
  78. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/jupyterlab/__init__.py +0 -0
  79. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/jupyterlab/routes.py +0 -0
  80. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/labextension/package.json +0 -0
  81. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/labextension/schemas/calkit/package.json.orig +0 -0
  82. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/labextension/schemas/calkit/plugin.json +0 -0
  83. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/labextension/static/502.9a2c5772a15466e923ef.js +0 -0
  84. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/labextension/static/695.2c41003a452d43d2b358.js +0 -0
  85. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/labextension/static/867.a42a046aa5108f54f8fb.js +0 -0
  86. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/labextension/static/909.e3f9cc3408834a7fdcc3.js +0 -0
  87. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js +0 -0
  88. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt +0 -0
  89. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/labextension/static/b2f1c3efe70cb539d121.png +0 -0
  90. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/labextension/static/remoteEntry.65469af996e7a96aa983.js +0 -0
  91. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/labextension/static/style.js +0 -0
  92. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/labextension/static/third-party-licenses.json +0 -0
  93. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/licenses.py +0 -0
  94. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/magics.py +0 -0
  95. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/matlab.py +0 -0
  96. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/models/__init__.py +0 -0
  97. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/models/io.py +0 -0
  98. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/models/iteration.py +0 -0
  99. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/notebooks.py +0 -0
  100. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/office.py +0 -0
  101. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/ops.py +0 -0
  102. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/overleaf.py +0 -0
  103. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/releases.py +0 -0
  104. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/server.py +0 -0
  105. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/templates/__init__.py +0 -0
  106. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/templates/core.py +0 -0
  107. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/templates/latex/__init__.py +0 -0
  108. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/templates/latex/article/paper.tex +0 -0
  109. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/templates/latex/core.py +0 -0
  110. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/templates/latex/jfm/jfm.bst +0 -0
  111. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/templates/latex/jfm/jfm.cls +0 -0
  112. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
  113. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/templates/latex/jfm/paper.tex +0 -0
  114. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/templates/latex/jfm/upmath.sty +0 -0
  115. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/__init__.py +0 -0
  116. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/cli/__init__.py +0 -0
  117. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/cli/main/__init__.py +0 -0
  118. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/cli/main/test_core.py +0 -0
  119. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/cli/main/test_subprojects.py +0 -0
  120. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/cli/main/test_xr.py +0 -0
  121. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/cli/test_check.py +0 -0
  122. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/cli/test_cloud.py +0 -0
  123. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/cli/test_config.py +0 -0
  124. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/cli/test_import.py +0 -0
  125. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/cli/test_latex.py +0 -0
  126. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/cli/test_list.py +0 -0
  127. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/cli/test_new.py +0 -0
  128. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/cli/test_notebooks.py +0 -0
  129. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/cli/test_overleaf.py +0 -0
  130. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/cli/test_update.py +0 -0
  131. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/dvc/__init__.py +0 -0
  132. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/dvc/test_core.py +0 -0
  133. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/dvc/test_zip.py +0 -0
  134. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/jupyterlab/__init__.py +0 -0
  135. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/jupyterlab/test_routes.py +0 -0
  136. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/models/__init__.py +0 -0
  137. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/models/test_iteration.py +0 -0
  138. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_calc.py +0 -0
  139. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_check.py +0 -0
  140. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_cloud.py +0 -0
  141. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_core.py +0 -0
  142. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_docker.py +0 -0
  143. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_fs.py +0 -0
  144. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_git.py +0 -0
  145. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_invenio.py +0 -0
  146. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_julia.py +0 -0
  147. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_jupyter.py +0 -0
  148. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_magics.py +0 -0
  149. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_matlab.py +0 -0
  150. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_notebooks.py +0 -0
  151. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_releases.py +0 -0
  152. {calkit_python-0.39.1 → calkit_python-0.40.0}/calkit/tests/test_templates.py +0 -0
  153. {calkit_python-0.39.1 → calkit_python-0.40.0}/conftest.py +0 -0
  154. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/CNAME +0 -0
  155. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/ai-tools.md +0 -0
  156. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/apps.md +0 -0
  157. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/calculations.md +0 -0
  158. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/calkit-yaml.md +0 -0
  159. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/cloud-integration.md +0 -0
  160. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/datasets.md +0 -0
  161. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/dependencies.md +0 -0
  162. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/examples.md +0 -0
  163. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/governance.md +0 -0
  164. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/help.md +0 -0
  165. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/img/c-to-the-k-white.svg +0 -0
  166. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/img/calkit-fragmentation-compendium.png +0 -0
  167. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/img/calkit-no-bg.png +0 -0
  168. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/img/connect-zenodo.png +0 -0
  169. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/img/jupyterlab/all-green.png +0 -0
  170. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/img/jupyterlab/collect-data-stale.png +0 -0
  171. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/img/jupyterlab/new-env.png +0 -0
  172. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/img/jupyterlab/new-notebook.png +0 -0
  173. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/img/jupyterlab/pipeline-badge.png +0 -0
  174. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/img/jupyterlab-params.png +0 -0
  175. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/img/plos-osi-code-2024-03.png +0 -0
  176. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/img/vscode-nb-params.png +0 -0
  177. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/index.md +0 -0
  178. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/installation.md +0 -0
  179. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/jupyterlab.md +0 -0
  180. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/local-server.md +0 -0
  181. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/notebooks.md +0 -0
  182. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/overleaf.md +0 -0
  183. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/pipeline/manual-steps.md +0 -0
  184. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/pipeline/running-and-logging.md +0 -0
  185. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/quickstart.md +0 -0
  186. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/references.md +0 -0
  187. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/releases.md +0 -0
  188. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/reproducibility.md +0 -0
  189. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/subprojects.md +0 -0
  190. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/adding-latex-pub-docker.md +0 -0
  191. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/conda-envs.md +0 -0
  192. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/existing-project.md +0 -0
  193. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/first-project.md +0 -0
  194. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/github-actions.md +0 -0
  195. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/actions-repo-secrets.png +0 -0
  196. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
  197. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
  198. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
  199. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
  200. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
  201. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
  202. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
  203. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
  204. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
  205. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
  206. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/latex-codespaces/push.png +0 -0
  207. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
  208. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
  209. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/chart-more-rows.png +0 -0
  210. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/create-project.png +0 -0
  211. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
  212. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/excel-chart.png +0 -0
  213. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/excel-data.png +0 -0
  214. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
  215. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/needs-clone.png +0 -0
  216. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/new-stage.png +0 -0
  217. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
  218. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
  219. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/status-more-rows.png +0 -0
  220. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
  221. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/untracked-data.png +0 -0
  222. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/updated-publication.png +0 -0
  223. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
  224. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/office/workflow-page.png +0 -0
  225. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/openfoam/clone.png +0 -0
  226. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/openfoam/create-project.png +0 -0
  227. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
  228. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
  229. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
  230. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/openfoam/new-token.png +0 -0
  231. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/openfoam/reclone.png +0 -0
  232. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
  233. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/quick-actions.png +0 -0
  234. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/run-proc.png +0 -0
  235. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/vscode-slurm-notebook/create-calkit-env.png +0 -0
  236. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/vscode-slurm-notebook/create-inner-env.png +0 -0
  237. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/vscode-slurm-notebook/create-new-calkit-env.png +0 -0
  238. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/vscode-slurm-notebook/select-calkit-env.png +0 -0
  239. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/vscode-slurm-notebook/slurm-job-running.png +0 -0
  240. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/vscode-slurm-notebook/slurm-launch-options.png +0 -0
  241. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/img/vscode-slurm-notebook/starting-slurm-job.png +0 -0
  242. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/index.md +0 -0
  243. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/jupyterlab.md +0 -0
  244. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/latex-codespaces.md +0 -0
  245. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/matlab.md +0 -0
  246. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/notebook-pipeline.md +0 -0
  247. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/office.md +0 -0
  248. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/openfoam.md +0 -0
  249. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/procedures.md +0 -0
  250. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/tutorials/vscode-slurm-notebook.md +0 -0
  251. {calkit_python-0.39.1 → calkit_python-0.40.0}/docs/version-control.md +0 -0
  252. {calkit_python-0.39.1 → calkit_python-0.40.0}/install.json +0 -0
  253. {calkit_python-0.39.1 → calkit_python-0.40.0}/jest.config.js +0 -0
  254. {calkit_python-0.39.1 → calkit_python-0.40.0}/jupyter-config/server-config/calkit.json +0 -0
  255. {calkit_python-0.39.1 → calkit_python-0.40.0}/package.json +0 -0
  256. {calkit_python-0.39.1 → calkit_python-0.40.0}/pyproject.toml +0 -0
  257. {calkit_python-0.39.1 → calkit_python-0.40.0}/schema/plugin.json +0 -0
  258. {calkit_python-0.39.1 → calkit_python-0.40.0}/scripts/generate-docs-references.py +0 -0
  259. {calkit_python-0.39.1 → calkit_python-0.40.0}/scripts/install.ps1 +0 -0
  260. {calkit_python-0.39.1 → calkit_python-0.40.0}/scripts/install.sh +0 -0
  261. {calkit_python-0.39.1 → calkit_python-0.40.0}/scripts/make-calk9.sh +0 -0
  262. {calkit_python-0.39.1 → calkit_python-0.40.0}/scripts/sync-docs.py +0 -0
  263. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/__tests__/useQueries.spec.ts +0 -0
  264. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/calkit-config.ts +0 -0
  265. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/cell-output-marker.ts +0 -0
  266. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/components/commit-dialog.tsx +0 -0
  267. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/components/environment-editor.tsx +0 -0
  268. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/components/notebook-registration.tsx +0 -0
  269. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/components/notebook-toolbar.tsx +0 -0
  270. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/components/pipeline-status-bar.tsx +0 -0
  271. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/components/project-info-editor.tsx +0 -0
  272. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/components/sidebar-settings.tsx +0 -0
  273. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/components/sidebar.tsx +0 -0
  274. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/components/stage-editor.tsx +0 -0
  275. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/feature-flags.ts +0 -0
  276. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/file-browser-menu.ts +0 -0
  277. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/hooks/__tests__/useQueries.test.tsx +0 -0
  278. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/hooks/useQueries.ts +0 -0
  279. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/icons.ts +0 -0
  280. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/index.ts +0 -0
  281. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/io-tracker.ts +0 -0
  282. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/pipeline-state.ts +0 -0
  283. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/queryClient.ts +0 -0
  284. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/request.ts +0 -0
  285. {calkit_python-0.39.1 → calkit_python-0.40.0}/src/shims-mainmenu.d.ts +0 -0
  286. {calkit_python-0.39.1 → calkit_python-0.40.0}/style/base.css +0 -0
  287. {calkit_python-0.39.1 → calkit_python-0.40.0}/style/cell-output-marker.css +0 -0
  288. {calkit_python-0.39.1 → calkit_python-0.40.0}/style/environment-editor.css +0 -0
  289. {calkit_python-0.39.1 → calkit_python-0.40.0}/style/environment-selector.css +0 -0
  290. {calkit_python-0.39.1 → calkit_python-0.40.0}/style/img/calkit-no-bg.png +0 -0
  291. {calkit_python-0.39.1 → calkit_python-0.40.0}/style/index.css +0 -0
  292. {calkit_python-0.39.1 → calkit_python-0.40.0}/style/index.js +0 -0
  293. {calkit_python-0.39.1 → calkit_python-0.40.0}/style/notebook-toolbar.css +0 -0
  294. {calkit_python-0.39.1 → calkit_python-0.40.0}/style/pipeline-status-bar.css +0 -0
  295. {calkit_python-0.39.1 → calkit_python-0.40.0}/style/sidebar.css +0 -0
  296. {calkit_python-0.39.1 → calkit_python-0.40.0}/test/dvc-md5-dir/osx-arm64.txt +0 -0
  297. {calkit_python-0.39.1 → calkit_python-0.40.0}/test/nb-julia.ipynb +0 -0
  298. {calkit_python-0.39.1 → calkit_python-0.40.0}/test/nb-params.ipynb +0 -0
  299. {calkit_python-0.39.1 → calkit_python-0.40.0}/test/nb-subdir.ipynb +0 -0
  300. {calkit_python-0.39.1 → calkit_python-0.40.0}/test/pipeline.ipynb +0 -0
  301. {calkit_python-0.39.1 → calkit_python-0.40.0}/test/script.py +0 -0
  302. {calkit_python-0.39.1 → calkit_python-0.40.0}/test/test-log.log +0 -0
  303. {calkit_python-0.39.1 → calkit_python-0.40.0}/tsconfig.json +0 -0
  304. {calkit_python-0.39.1 → calkit_python-0.40.0}/tsconfig.test.json +0 -0
  305. {calkit_python-0.39.1 → calkit_python-0.40.0}/ui-tests/.gitignore +0 -0
  306. {calkit_python-0.39.1 → calkit_python-0.40.0}/ui-tests/README.md +0 -0
  307. {calkit_python-0.39.1 → calkit_python-0.40.0}/ui-tests/jupyter_server_test_config.py +0 -0
  308. {calkit_python-0.39.1 → calkit_python-0.40.0}/ui-tests/package.json +0 -0
  309. {calkit_python-0.39.1 → calkit_python-0.40.0}/ui-tests/playwright.config.js +0 -0
  310. {calkit_python-0.39.1 → calkit_python-0.40.0}/ui-tests/tests/calkit.spec.ts +0 -0
  311. {calkit_python-0.39.1 → calkit_python-0.40.0}/ui-tests/yarn.lock +0 -0
  312. {calkit_python-0.39.1 → calkit_python-0.40.0}/uv.lock +0 -0
  313. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/.gitignore +0 -0
  314. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/.vscodeignore +0 -0
  315. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/CHANGELOG.md +0 -0
  316. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/LICENSE +0 -0
  317. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/README.md +0 -0
  318. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/images/calkit-no-bg.png +0 -0
  319. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/package-lock.json +0 -0
  320. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/package.json +0 -0
  321. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/scripts/set-proposed-api.js +0 -0
  322. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/src/environments.ts +0 -0
  323. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/src/extension.ts +0 -0
  324. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/src/notebooks.ts +0 -0
  325. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/src/test/environments.test.ts +0 -0
  326. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/src/test/kernel-selection.test.ts +0 -0
  327. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/src/test/notebooks.test.ts +0 -0
  328. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/src/types.ts +0 -0
  329. {calkit_python-0.39.1 → calkit_python-0.40.0}/vscode-ext/tsconfig.json +0 -0
  330. {calkit_python-0.39.1 → calkit_python-0.40.0}/yarn.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: calkit-python
3
- Version: 0.39.1
3
+ Version: 0.40.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
@@ -264,6 +264,7 @@ def check_environment(
264
264
  get_all_docker_lock_fpaths,
265
265
  get_all_venv_lock_fpaths,
266
266
  get_env_lock_fpath,
267
+ write_scheduler_env_lock,
267
268
  )
268
269
 
269
270
  dotenv.load_dotenv(dotenv_path=".env", verbose=verbose)
@@ -405,6 +406,12 @@ def check_environment(
405
406
  verbose=verbose,
406
407
  cache_key=env_name,
407
408
  )
409
+ elif env["kind"] in ("slurm", "pbs"):
410
+ # Job-scheduler envs have no external manifest to validate; the
411
+ # "check" is just writing a deterministic JSON lock file from the
412
+ # env config so DVC stages that depend on the env get invalidated
413
+ # when the config changes.
414
+ write_scheduler_env_lock(env_name=env_name, env=env)
408
415
  else:
409
416
  raise_error(f"Environment kind '{env['kind']}' not supported")
410
417
  return get_env_lock_fpath(env=env, env_name=env_name, as_posix=False)
@@ -57,7 +57,7 @@ from calkit.cli.new import new_app
57
57
  from calkit.cli.notebooks import notebooks_app
58
58
  from calkit.cli.office import office_app
59
59
  from calkit.cli.overleaf import overleaf_app
60
- from calkit.cli.slurm import slurm_app
60
+ from calkit.cli.scheduler import scheduler_app
61
61
  from calkit.cli.update import update_app
62
62
 
63
63
  app = typer.Typer(
@@ -81,7 +81,11 @@ app.add_typer(check_app, name="check", help="Check things.")
81
81
  app.add_typer(latex_app, name="latex|tex", help="Work with LaTeX.")
82
82
  app.add_typer(overleaf_app, name="overleaf|ol", help="Interact with Overleaf.")
83
83
  app.add_typer(cloud_app, name="cloud", help="Interact with a Calkit Cloud.")
84
- app.add_typer(slurm_app, name="slurm", help="Work with SLURM.")
84
+ app.add_typer(
85
+ scheduler_app,
86
+ name="scheduler|sch",
87
+ help="Work with a job scheduler (SLURM or PBS).",
88
+ )
85
89
  app.add_typer(dev_app, name="dev", help="Developer tools.", hidden=True)
86
90
 
87
91
 
@@ -669,9 +673,11 @@ def add(
669
673
  paths.remove(".")
670
674
  if dvc_repo is not None:
671
675
  dvc_status = dvc_repo.data_status()
672
- for dvc_uncommitted in dvc_status["uncommitted"].get(
676
+ uncommitted = dvc_status["uncommitted"]
677
+ dvc_uncommitted_all = uncommitted.get(
673
678
  "modified", []
674
- ):
679
+ ) + uncommitted.get("deleted", [])
680
+ for dvc_uncommitted in dvc_uncommitted_all:
675
681
  if os.path.exists(dvc_uncommitted):
676
682
  if dry_run:
677
683
  typer.echo(
@@ -679,12 +685,25 @@ def add(
679
685
  )
680
686
  else:
681
687
  typer.echo(f"Adding {dvc_uncommitted} to DVC")
682
- dvc_repo.commit(dvc_uncommitted, force=True)
688
+ dvc_repo.commit(
689
+ dvc_uncommitted,
690
+ force=True,
691
+ allow_missing=True,
692
+ )
683
693
  else:
684
- warn(
685
- f"DVC uncommitted '{dvc_uncommitted}' does not "
686
- "exist; skipping"
687
- )
694
+ if dry_run:
695
+ typer.echo(
696
+ f"Would commit deleted {dvc_uncommitted} to DVC"
697
+ )
698
+ else:
699
+ typer.echo(
700
+ f"Committing deleted {dvc_uncommitted} to DVC"
701
+ )
702
+ dvc_repo.commit(
703
+ dvc_uncommitted,
704
+ force=True,
705
+ allow_missing=True,
706
+ )
688
707
  if not disable_auto_ignore:
689
708
  for untracked_file in untracked_git_files:
690
709
  if (
@@ -1453,13 +1472,8 @@ def run(
1453
1472
  raise_error("Failed to initialize Git repo")
1454
1473
  # Set env vars
1455
1474
  calkit.set_env_vars(ck_info=ck_info)
1456
- # Clean all notebooks in the pipeline
1457
- try:
1458
- calkit.notebooks.clean_all_in_pipeline(ck_info=ck_info)
1459
- except Exception as e:
1460
- raise_error(f"Failed to clean notebooks: {e.__class__.__name__}: {e}")
1461
1475
  if not quiet:
1462
- typer.echo("Getting system information")
1476
+ calkit.echo("💻 Getting system information")
1463
1477
  # Get system information
1464
1478
  system_info = calkit.get_system_info()
1465
1479
  if save_logs:
@@ -1475,7 +1489,7 @@ def run(
1475
1489
  json.dump(system_info, f, indent=2)
1476
1490
  # First check any system-level dependencies exist
1477
1491
  if not quiet:
1478
- typer.echo("Checking system-level dependencies")
1492
+ calkit.echo("🔗 Checking system-level dependencies")
1479
1493
  try:
1480
1494
  calkit.check_system_deps(ck_info=ck_info, system_info=system_info)
1481
1495
  except Exception as e:
@@ -1483,7 +1497,7 @@ def run(
1483
1497
  raise_error(str(e))
1484
1498
  # Check all environments in the pipeline (with caching)
1485
1499
  # If any failed, warn the user that we might have problems running
1486
- typer.echo("Checking environments")
1500
+ calkit.echo("📦 Checking environments")
1487
1501
  env_check_results = calkit.environments.check_all_in_pipeline(
1488
1502
  ck_info=ck_info, targets=targets, force=force
1489
1503
  )
@@ -1493,7 +1507,13 @@ def run(
1493
1507
  failed = not result.get("success", False)
1494
1508
  if failed:
1495
1509
  warn(f"Failed to check environment '{env_name}'")
1496
- # Check environments for each subproject so DVC can detect changes
1510
+ # Clean all notebooks in the pipeline
1511
+ try:
1512
+ calkit.echo("📓 Cleaning notebooks")
1513
+ calkit.notebooks.clean_all_in_pipeline(ck_info=ck_info)
1514
+ except Exception as e:
1515
+ raise_error(f"Failed to clean notebooks: {e.__class__.__name__}: {e}")
1516
+ # Check environments and clean notebooks for each subproject
1497
1517
  subprojects = ck_info.get("subprojects", [])
1498
1518
  if subprojects:
1499
1519
  prev_cwd = os.getcwd()
@@ -1503,11 +1523,13 @@ def run(
1503
1523
  sp = Path(subproject["path"]).as_posix()
1504
1524
  if not os.path.isdir(sp):
1505
1525
  continue
1506
- if not quiet:
1507
- typer.echo(f"Checking environments for subproject: {sp}")
1508
1526
  os.chdir(sp)
1509
1527
  try:
1510
1528
  sp_ck_info = calkit.load_calkit_info()
1529
+ if not quiet:
1530
+ calkit.echo(
1531
+ f"📦 Checking environments for subproject: {sp}"
1532
+ )
1511
1533
  sp_env_results = calkit.environments.check_all_in_pipeline(
1512
1534
  ck_info=sp_ck_info, force=force
1513
1535
  )
@@ -1519,9 +1541,12 @@ def run(
1519
1541
  f"Failed to check environment '{env_name}' "
1520
1542
  f"in subproject '{sp}'"
1521
1543
  )
1544
+ if not quiet:
1545
+ calkit.echo(f"📓 Cleaning notebooks for subproject: {sp}")
1546
+ calkit.notebooks.clean_all_in_pipeline(ck_info=sp_ck_info)
1522
1547
  except Exception as e:
1523
1548
  warn(
1524
- f"Failed to check environments for subproject '{sp}': "
1549
+ f"Failed to prepare subproject '{sp}': "
1525
1550
  f"{e.__class__.__name__}: {e}"
1526
1551
  )
1527
1552
  finally:
@@ -1533,7 +1558,7 @@ def run(
1533
1558
  dvc_stages = None
1534
1559
  if ck_info.get("pipeline", {}) or ck_info.get("subprojects"):
1535
1560
  if not quiet:
1536
- typer.echo("Compiling DVC pipeline")
1561
+ calkit.echo("🔀 Compiling DVC pipeline")
1537
1562
  try:
1538
1563
  dvc_stages = calkit.pipeline.to_dvc(ck_info=ck_info, write=True)
1539
1564
  except Exception as e:
@@ -1471,13 +1471,105 @@ def new_slurm_env(
1471
1471
  ck_info["environments"] = envs
1472
1472
  with open("calkit.yaml", "w") as f:
1473
1473
  ryaml.dump(ck_info, f)
1474
+ from calkit.cli.check import check_environment
1475
+
1476
+ env_lock_fpath = check_environment(env_name=name)
1474
1477
  if not no_commit:
1475
1478
  repo = calkit.git.get_repo()
1476
1479
  repo.git.add("calkit.yaml")
1477
- if repo.git.diff(["--staged", "calkit.yaml"]):
1478
- repo.git.commit(
1479
- ["calkit.yaml", "-m", f"Add SLURM environment {name}"]
1480
- )
1480
+ if env_lock_fpath is not None:
1481
+ repo.git.add(str(env_lock_fpath))
1482
+ if repo.git.diff("--staged"):
1483
+ repo.git.commit(["-m", f"Add SLURM environment {name}"])
1484
+
1485
+
1486
+ @new_app.command("pbs-env")
1487
+ def new_pbs_env(
1488
+ name: Annotated[
1489
+ str, typer.Option("--name", "-n", help="Environment name.")
1490
+ ],
1491
+ host: Annotated[
1492
+ str,
1493
+ typer.Option("--host", help="Host where PBS commands should run."),
1494
+ ] = "localhost",
1495
+ default_options: Annotated[
1496
+ list[str],
1497
+ typer.Option(
1498
+ "--default-option",
1499
+ help=(
1500
+ "Default qsub option string (for example "
1501
+ "--default-option=-l --default-option=walltime=01:00:00). "
1502
+ "Repeat for multiple options."
1503
+ ),
1504
+ ),
1505
+ ] = [],
1506
+ default_setup: Annotated[
1507
+ list[str],
1508
+ typer.Option(
1509
+ "--default-setup",
1510
+ help=(
1511
+ "Default shell setup command to run before PBS jobs "
1512
+ "(for example 'module load julia/1.11'). Repeat for "
1513
+ "multiple commands."
1514
+ ),
1515
+ ),
1516
+ ] = [],
1517
+ description: Annotated[
1518
+ str | None, typer.Option("--description", help="Description.")
1519
+ ] = None,
1520
+ overwrite: Annotated[
1521
+ bool,
1522
+ typer.Option(
1523
+ "--overwrite",
1524
+ "-f",
1525
+ help="Overwrite any existing environment with this name.",
1526
+ ),
1527
+ ] = False,
1528
+ no_commit: Annotated[
1529
+ bool, typer.Option("--no-commit", help="Do not commit changes.")
1530
+ ] = False,
1531
+ ):
1532
+ """Create a new PBS environment."""
1533
+ from calkit.cli.check import check_environment
1534
+
1535
+ host = host.strip()
1536
+ if not host:
1537
+ raise_error("Host is required")
1538
+ ck_info = calkit.load_calkit_info()
1539
+ envs = ck_info.get("environments", {})
1540
+ if isinstance(envs, list):
1541
+ typer.echo("Converting environments from list to dict")
1542
+ envs = {env.pop("name"): env for env in envs}
1543
+ if name in envs and not overwrite:
1544
+ raise_error(
1545
+ f"Environment with name {name} already exists "
1546
+ "(use -f to overwrite)"
1547
+ )
1548
+ normalized_default_options = [
1549
+ opt.strip() for opt in default_options if opt.strip()
1550
+ ]
1551
+ normalized_default_setup = [
1552
+ cmd.strip() for cmd in default_setup if cmd.strip()
1553
+ ]
1554
+ env = {"kind": "pbs", "host": host}
1555
+ if normalized_default_options:
1556
+ env["default_options"] = normalized_default_options # type: ignore
1557
+ if normalized_default_setup:
1558
+ env["default_setup"] = normalized_default_setup # type: ignore
1559
+ if description is not None:
1560
+ env["description"] = description
1561
+ envs[name] = env
1562
+ ck_info["environments"] = envs
1563
+ with open("calkit.yaml", "w") as f:
1564
+ ryaml.dump(ck_info, f)
1565
+ env_lock_fpath = check_environment(env_name=name)
1566
+ if not no_commit:
1567
+ repo = calkit.git.get_repo()
1568
+ repo.git.add("calkit.yaml")
1569
+ if env_lock_fpath is not None:
1570
+ repo.git.add(str(env_lock_fpath))
1571
+ if repo.git.diff("--staged"):
1572
+ repo.git.commit(["-m", f"Add PBS environment {name}"])
1481
1573
 
1482
1574
 
1483
1575
  @new_app.command("uv-venv")