calkit-python 0.32.8__tar.gz → 0.32.10__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 (195) hide show
  1. calkit_python-0.32.10/CODE_OF_CONDUCT.md +125 -0
  2. {calkit_python-0.32.8 → calkit_python-0.32.10}/PKG-INFO +4 -3
  3. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/__init__.py +1 -1
  4. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/models/pipeline.py +39 -7
  5. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/models/test_pipeline.py +34 -0
  6. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/calkit-yaml.md +2 -2
  7. calkit_python-0.32.10/docs/governance.md +125 -0
  8. calkit_python-0.32.10/docs/img/calkit-fragmentation-compendium.png +0 -0
  9. calkit_python-0.32.10/docs/img/plos-osi-code-2024-03.png +0 -0
  10. {calkit_python-0.32.8 → calkit_python-0.32.10}/mkdocs.yml +1 -0
  11. {calkit_python-0.32.8 → calkit_python-0.32.10}/pyproject.toml +3 -2
  12. {calkit_python-0.32.8 → calkit_python-0.32.10}/uv.lock +924 -968
  13. {calkit_python-0.32.8 → calkit_python-0.32.10}/.github/FUNDING.yml +0 -0
  14. {calkit_python-0.32.8 → calkit_python-0.32.10}/.github/workflows/docs.yml +0 -0
  15. {calkit_python-0.32.8 → calkit_python-0.32.10}/.github/workflows/format.yml +0 -0
  16. {calkit_python-0.32.8 → calkit_python-0.32.10}/.github/workflows/publish-test.yml +0 -0
  17. {calkit_python-0.32.8 → calkit_python-0.32.10}/.github/workflows/publish.yml +0 -0
  18. {calkit_python-0.32.8 → calkit_python-0.32.10}/.github/workflows/test.yml +0 -0
  19. {calkit_python-0.32.8 → calkit_python-0.32.10}/.gitignore +0 -0
  20. {calkit_python-0.32.8 → calkit_python-0.32.10}/.pre-commit-config.yaml +0 -0
  21. {calkit_python-0.32.8 → calkit_python-0.32.10}/.python-version +0 -0
  22. {calkit_python-0.32.8 → calkit_python-0.32.10}/CITATION.cff +0 -0
  23. {calkit_python-0.32.8 → calkit_python-0.32.10}/CONTRIBUTING.md +0 -0
  24. {calkit_python-0.32.8 → calkit_python-0.32.10}/LICENSE +0 -0
  25. {calkit_python-0.32.8 → calkit_python-0.32.10}/Makefile +0 -0
  26. {calkit_python-0.32.8 → calkit_python-0.32.10}/README.md +0 -0
  27. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/__main__.py +0 -0
  28. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/calc.py +0 -0
  29. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/check.py +0 -0
  30. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cli/__init__.py +0 -0
  31. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cli/check.py +0 -0
  32. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cli/cloud.py +0 -0
  33. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cli/config.py +0 -0
  34. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cli/core.py +0 -0
  35. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cli/describe.py +0 -0
  36. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cli/import_.py +0 -0
  37. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cli/latex.py +0 -0
  38. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cli/list.py +0 -0
  39. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cli/main.py +0 -0
  40. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cli/new.py +0 -0
  41. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cli/notebooks.py +0 -0
  42. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cli/office.py +0 -0
  43. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cli/overleaf.py +0 -0
  44. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cli/slurm.py +0 -0
  45. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cli/update.py +0 -0
  46. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/cloud.py +0 -0
  47. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/conda.py +0 -0
  48. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/config.py +0 -0
  49. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/core.py +0 -0
  50. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/datasets.py +0 -0
  51. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/docker.py +0 -0
  52. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/dvc.py +0 -0
  53. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/environments.py +0 -0
  54. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/git.py +0 -0
  55. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/github.py +0 -0
  56. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/gui.py +0 -0
  57. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/invenio.py +0 -0
  58. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/jupyter.py +0 -0
  59. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/licenses.py +0 -0
  60. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/magics.py +0 -0
  61. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/matlab.py +0 -0
  62. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/models/__init__.py +0 -0
  63. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/models/core.py +0 -0
  64. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/models/io.py +0 -0
  65. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/models/iteration.py +0 -0
  66. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/notebooks.py +0 -0
  67. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/office.py +0 -0
  68. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/ops.py +0 -0
  69. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/overleaf.py +0 -0
  70. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/pipeline.py +0 -0
  71. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/releases.py +0 -0
  72. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/server.py +0 -0
  73. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/templates/__init__.py +0 -0
  74. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/templates/core.py +0 -0
  75. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/templates/latex/__init__.py +0 -0
  76. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/templates/latex/article/paper.tex +0 -0
  77. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/templates/latex/core.py +0 -0
  78. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/templates/latex/jfm/jfm.bst +0 -0
  79. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/templates/latex/jfm/jfm.cls +0 -0
  80. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
  81. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/templates/latex/jfm/paper.tex +0 -0
  82. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/templates/latex/jfm/upmath.sty +0 -0
  83. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/__init__.py +0 -0
  84. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/cli/__init__.py +0 -0
  85. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/cli/test_check.py +0 -0
  86. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/cli/test_config.py +0 -0
  87. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/cli/test_latex.py +0 -0
  88. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/cli/test_list.py +0 -0
  89. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/cli/test_main.py +0 -0
  90. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/cli/test_new.py +0 -0
  91. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/cli/test_notebooks.py +0 -0
  92. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/cli/test_overleaf.py +0 -0
  93. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/models/__init__.py +0 -0
  94. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/models/test_iteration.py +0 -0
  95. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/test_calc.py +0 -0
  96. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/test_check.py +0 -0
  97. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/test_conda.py +0 -0
  98. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/test_core.py +0 -0
  99. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/test_dvc.py +0 -0
  100. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/test_environments.py +0 -0
  101. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/test_git.py +0 -0
  102. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/test_invenio.py +0 -0
  103. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/test_jupyter.py +0 -0
  104. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/test_magics.py +0 -0
  105. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/test_notebooks.py +0 -0
  106. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/test_pipeline.py +0 -0
  107. {calkit_python-0.32.8 → calkit_python-0.32.10}/calkit/tests/test_templates.py +0 -0
  108. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/CNAME +0 -0
  109. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/apps.md +0 -0
  110. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/calculations.md +0 -0
  111. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/cli-reference.md +0 -0
  112. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/cloud-integration.md +0 -0
  113. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/datasets.md +0 -0
  114. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/dependencies.md +0 -0
  115. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/environments.md +0 -0
  116. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/examples.md +0 -0
  117. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/help.md +0 -0
  118. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/img/c-to-the-k-white.svg +0 -0
  119. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/img/calkit-no-bg.png +0 -0
  120. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/img/connect-zenodo.png +0 -0
  121. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/img/jupyterlab-params.png +0 -0
  122. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/img/vscode-nb-params.png +0 -0
  123. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/index.md +0 -0
  124. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/installation.md +0 -0
  125. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/local-server.md +0 -0
  126. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/notebooks.md +0 -0
  127. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/overleaf.md +0 -0
  128. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/pipeline/index.md +0 -0
  129. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/pipeline/manual-steps.md +0 -0
  130. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/pipeline/running-and-logging.md +0 -0
  131. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/pipeline/slurm.md +0 -0
  132. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/quickstart.md +0 -0
  133. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/references.md +0 -0
  134. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/releases.md +0 -0
  135. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/adding-latex-pub-docker.md +0 -0
  136. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/conda-envs.md +0 -0
  137. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/existing-project.md +0 -0
  138. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/first-project.md +0 -0
  139. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/github-actions.md +0 -0
  140. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/actions-repo-secrets.png +0 -0
  141. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
  142. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
  143. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
  144. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
  145. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
  146. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
  147. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
  148. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
  149. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
  150. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
  151. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/latex-codespaces/push.png +0 -0
  152. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
  153. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
  154. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/chart-more-rows.png +0 -0
  155. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/create-project.png +0 -0
  156. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
  157. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/excel-chart.png +0 -0
  158. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/excel-data.png +0 -0
  159. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
  160. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/needs-clone.png +0 -0
  161. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/new-stage.png +0 -0
  162. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
  163. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
  164. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/status-more-rows.png +0 -0
  165. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
  166. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/untracked-data.png +0 -0
  167. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/updated-publication.png +0 -0
  168. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
  169. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/office/workflow-page.png +0 -0
  170. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/openfoam/clone.png +0 -0
  171. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/openfoam/create-project.png +0 -0
  172. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
  173. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
  174. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
  175. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/openfoam/new-token.png +0 -0
  176. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/openfoam/reclone.png +0 -0
  177. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
  178. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/quick-actions.png +0 -0
  179. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/img/run-proc.png +0 -0
  180. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/index.md +0 -0
  181. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/latex-codespaces.md +0 -0
  182. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/matlab.md +0 -0
  183. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/notebook-pipeline.md +0 -0
  184. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/office.md +0 -0
  185. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/openfoam.md +0 -0
  186. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/tutorials/procedures.md +0 -0
  187. {calkit_python-0.32.8 → calkit_python-0.32.10}/docs/version-control.md +0 -0
  188. {calkit_python-0.32.8 → calkit_python-0.32.10}/scripts/install.ps1 +0 -0
  189. {calkit_python-0.32.8 → calkit_python-0.32.10}/scripts/install.sh +0 -0
  190. {calkit_python-0.32.8 → calkit_python-0.32.10}/test/nb-julia.ipynb +0 -0
  191. {calkit_python-0.32.8 → calkit_python-0.32.10}/test/nb-params.ipynb +0 -0
  192. {calkit_python-0.32.8 → calkit_python-0.32.10}/test/nb-subdir.ipynb +0 -0
  193. {calkit_python-0.32.8 → calkit_python-0.32.10}/test/pipeline.ipynb +0 -0
  194. {calkit_python-0.32.8 → calkit_python-0.32.10}/test/script.py +0 -0
  195. {calkit_python-0.32.8 → calkit_python-0.32.10}/test/test-log.log +0 -0
@@ -0,0 +1,125 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in our
6
+ community a harassment-free experience for everyone, regardless of age, body size,
7
+ visible or invisible disability, ethnicity, sex characteristics, gender identity
8
+ and expression, level of experience, education, socio-economic status,
9
+ nationality, personal appearance, race, caste, color, religion, or sexual identity and
10
+ orientation.
11
+
12
+ We pledge to act and interact in ways that contribute to an open, welcoming,
13
+ diverse, inclusive, and healthy community.
14
+
15
+ ## Our Standards
16
+
17
+ Examples of behavior that contributes to a positive environment for our
18
+ community include:
19
+
20
+ - Demonstrating empathy and kindness toward other people
21
+ - Being respectful of differing opinions, viewpoints, and experiences
22
+ - Giving and gracefully accepting constructive feedback
23
+ - Accepting responsibility and apologizing to those affected by our mistakes, and
24
+ learning from the experience
25
+ - Focusing on what is best not just for us as individuals, but for the overall
26
+ community
27
+
28
+ Examples of unacceptable behavior include:
29
+
30
+ - The use of sexualized language or imagery, and sexual attention or advances of
31
+ any kind
32
+ - Trolling, insulting or derogatory comments, and personal or political attacks
33
+ - Public or private harassment
34
+ - Publishing others' private information, such as a physical or email address,
35
+ without their explicit permission
36
+ - Other conduct which could reasonably be considered inappropriate in a
37
+ professional setting
38
+
39
+ ## Enforcement Responsibilities
40
+
41
+ Community leaders are responsible for clarifying and enforcing our standards of
42
+ acceptable behavior and will take appropriate and fair corrective action in
43
+ response to any behavior that they deem inappropriate, threatening, offensive, or
44
+ harmful.
45
+
46
+ Community leaders have the right and responsibility to remove, edit, or reject
47
+ comments, commits, code, wiki edits, issues, and other contributions that are not
48
+ aligned to this Code of Conduct, and will communicate reasons for moderation
49
+ decisions when appropriate.
50
+
51
+ ## Scope
52
+
53
+ This Code of Conduct applies within all community spaces, and also applies when
54
+ an individual is officially representing the community in public spaces.
55
+ Examples of representing our community include using an official e-mail address,
56
+ posting via an official social media account, or acting as an appointed representative
57
+ at an online or offline event.
58
+
59
+ ## Enforcement
60
+
61
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+ reported to the community leaders responsible for enforcement at info@calkit.org.
63
+ All complaints will be reviewed and investigated promptly and fairly.
64
+
65
+ All community leaders are obligated to respect the privacy and security of the
66
+ reporter of any incident.
67
+
68
+ ## Enforcement Guidelines
69
+
70
+ Community leaders will follow these Community Impact Guidelines in determining
71
+ the consequences for any action they deem in violation of this Code of Conduct:
72
+
73
+ ### 1. Correction
74
+
75
+ Community Impact: Use of inappropriate language or other behavior deemed unprofessional or
76
+ unwelcome in the community.
77
+
78
+ Consequence: A private, written warning from community leaders, providing clarity around
79
+ the nature of the violation and an explanation of why the behavior was
80
+ inappropriate. A public apology may be requested.
81
+
82
+ ### 2. Warning
83
+
84
+ Community Impact: A violation through a single incident or series of actions.
85
+
86
+ Consequence: A warning with consequences for continued behavior. No interaction with the
87
+ people involved, including unsolicited interaction with those enforcing the Code
88
+ of Conduct, for a specified period of time. This includes avoiding interactions
89
+ in community spaces as well as external channels like social media. Violating
90
+ these terms may lead to a temporary or permanent ban.
91
+
92
+ ### 3. Temporary Ban
93
+
94
+ Community Impact: A serious violation of community standards, including sustained inappropriate
95
+ behavior.
96
+
97
+ Consequence: A temporary ban from any sort of interaction or public communication with the
98
+ community for a specified period of time. No public or private interaction with
99
+ the people involved, including unsolicited interaction with those enforcing the Code of Conduct,
100
+ is allowed during this period. Violating these terms may lead to a permanent ban.
101
+
102
+ ### 4. Permanent Ban
103
+
104
+ Community Impact: Demonstrating a pattern of violation of community standards, including
105
+ sustained inappropriate behavior, harassment of an individual, or aggression toward or
106
+ disparagement of classes of individuals.
107
+
108
+ Consequence: A permanent ban from any sort of public interaction within the community.
109
+
110
+ ## Attribution
111
+
112
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1,
113
+ available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
114
+
115
+ Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
116
+
117
+ For answers to common questions about this code of conduct, see the FAQ at
118
+ [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
119
+ [https://www.contributor-covenant.org/translations][translations].
120
+
121
+ [homepage]: https://www.contributor-covenant.org
122
+ [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
123
+ [Mozilla CoC]: https://github.com/mozilla/diversity
124
+ [FAQ]: https://www.contributor-covenant.org/faq
125
+ [translations]: https://www.contributor-covenant.org/translations
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: calkit-python
3
- Version: 0.32.8
3
+ Version: 0.32.10
4
4
  Summary: Reproducibility simplified.
5
5
  Project-URL: Homepage, https://calkit.org
6
6
  Project-URL: Issues, https://github.com/calkit/calkit/issues
@@ -15,14 +15,15 @@ Requires-Dist: arithmeval
15
15
  Requires-Dist: bibtexparser
16
16
  Requires-Dist: checksumdir
17
17
  Requires-Dist: docx2pdf
18
- Requires-Dist: dvc==3.64.0
18
+ Requires-Dist: dvc==3.64.2
19
19
  Requires-Dist: fastapi
20
20
  Requires-Dist: gitpython
21
- Requires-Dist: json2latex>=0.0.2
21
+ Requires-Dist: json2latex>=0.0.3
22
22
  Requires-Dist: jupyterlab>=4.4.5
23
23
  Requires-Dist: keyring
24
24
  Requires-Dist: nbconvert
25
25
  Requires-Dist: papermill>=2.6.0
26
+ Requires-Dist: pathspec<1.0.0
26
27
  Requires-Dist: pillow
27
28
  Requires-Dist: psutil>=7.0.0
28
29
  Requires-Dist: pydantic-settings
@@ -1,4 +1,4 @@
1
- __version__ = "0.32.8"
1
+ __version__ = "0.32.10"
2
2
 
3
3
  from .core import * # noqa: F403, I001
4
4
  from . import git # noqa: F401
@@ -8,6 +8,7 @@ from pathlib import Path
8
8
  from typing import Any, Literal
9
9
 
10
10
  from pydantic import (
11
+ AfterValidator,
11
12
  BaseModel,
12
13
  ConfigDict,
13
14
  Discriminator,
@@ -30,6 +31,32 @@ from calkit.notebooks import (
30
31
  )
31
32
 
32
33
 
34
+ def _check_path_relative_and_child_of_cwd(s: str) -> str:
35
+ p = Path(s)
36
+ # Enforce that the path is relative
37
+ if p.is_absolute():
38
+ raise ValueError(f"Path must be relative: {p}")
39
+ # Enforce that the path is a child of the (resolved) CWD
40
+ cwd = Path.cwd().resolve()
41
+ # Resolve the path relative to the resolved CWD to get a full path for
42
+ # comparison
43
+ absolute_path = p.resolve(strict=False)
44
+ # Check if the absolute path starts with the resolved CWD, ensuring it's a
45
+ # child
46
+ try:
47
+ absolute_path.relative_to(cwd)
48
+ except ValueError:
49
+ raise ValueError(
50
+ f"Path is not a child of the current working directory: {p}"
51
+ )
52
+ return p.as_posix()
53
+
54
+
55
+ RelativeChildPathString = Annotated[
56
+ str, AfterValidator(_check_path_relative_and_child_of_cwd)
57
+ ]
58
+
59
+
33
60
  class StageIteration(BaseModel):
34
61
  """A model for the ``iterate_over`` key in a stage definition.
35
62
 
@@ -194,7 +221,7 @@ class Stage(BaseModel):
194
221
 
195
222
  class PythonScriptStage(Stage):
196
223
  kind: Literal["python-script"] = "python-script"
197
- script_path: str
224
+ script_path: RelativeChildPathString
198
225
  args: list[str] = []
199
226
 
200
227
  @property
@@ -379,7 +406,8 @@ class JsonToLatexStage(Stage):
379
406
 
380
407
  class MatlabScriptStage(Stage):
381
408
  kind: Literal["matlab-script"]
382
- script_path: str
409
+ script_path: RelativeChildPathString
410
+ matlab_path: RelativeChildPathString | None = None
383
411
 
384
412
  @property
385
413
  def dvc_deps(self) -> list[str]:
@@ -390,7 +418,11 @@ class MatlabScriptStage(Stage):
390
418
  cmd = self.xenv_cmd
391
419
  if self.environment == "_system":
392
420
  cmd += "matlab -batch"
393
- cmd += f" \"run('{self.script_path}');\""
421
+ matlab_cmd = ""
422
+ if self.matlab_path is not None:
423
+ matlab_cmd += f"addpath(genpath('{self.matlab_path}')); "
424
+ matlab_cmd += f"run('{self.script_path}');"
425
+ cmd += f' "{matlab_cmd}"'
394
426
  return cmd
395
427
 
396
428
 
@@ -428,7 +460,7 @@ class ShellCommandStage(Stage):
428
460
 
429
461
  class ShellScriptStage(Stage):
430
462
  kind: Literal["shell-script"]
431
- script_path: str
463
+ script_path: RelativeChildPathString
432
464
  args: list[str] = []
433
465
  shell: Literal["sh", "bash", "zsh"] = "bash"
434
466
 
@@ -460,7 +492,7 @@ class DockerCommandStage(Stage):
460
492
 
461
493
  class RScriptStage(Stage):
462
494
  kind: Literal["r-script"]
463
- script_path: str
495
+ script_path: RelativeChildPathString
464
496
  args: list[str] = []
465
497
 
466
498
  @property
@@ -479,7 +511,7 @@ class RScriptStage(Stage):
479
511
 
480
512
  class JuliaScriptStage(Stage):
481
513
  kind: Literal["julia-script"] = "julia-script"
482
- script_path: str
514
+ script_path: RelativeChildPathString
483
515
  args: list[str] = []
484
516
 
485
517
  @property
@@ -508,7 +540,7 @@ class JuliaCommandStage(Stage):
508
540
 
509
541
  class SBatchStage(Stage):
510
542
  kind: Literal["sbatch"] = "sbatch"
511
- script_path: str
543
+ script_path: RelativeChildPathString
512
544
  args: list[str] = []
513
545
  sbatch_options: list[str] = []
514
546
  log_storage: Literal["git", "dvc"] | None = "git"
@@ -11,6 +11,7 @@ from calkit.models.pipeline import (
11
11
  LatexStage,
12
12
  MapPathsStage,
13
13
  MatlabCommandStage,
14
+ MatlabScriptStage,
14
15
  PythonScriptStage,
15
16
  SBatchStage,
16
17
  StageIteration,
@@ -186,6 +187,39 @@ def test_matlabcommandstage():
186
187
  assert sd["cmd"] == 'matlab -batch "disp(\\"Hello, MATLAB!\\");"'
187
188
 
188
189
 
190
+ def test_matlabscriptstage():
191
+ s = MatlabScriptStage(
192
+ name="a",
193
+ kind="matlab-script",
194
+ environment="_system",
195
+ script_path="scripts/my_script.m",
196
+ matlab_path="scripts",
197
+ )
198
+ sd = s.to_dvc()
199
+ print(sd)
200
+ assert (
201
+ sd["cmd"]
202
+ == "matlab -batch \"addpath(genpath('scripts')); run('scripts/my_script.m');\""
203
+ )
204
+ with pytest.raises(ValidationError):
205
+ s = MatlabScriptStage(
206
+ name="b",
207
+ kind="matlab-script",
208
+ environment="_system",
209
+ script_path="scripts/my_script.m",
210
+ matlab_path="/some/abs/path",
211
+ )
212
+ # Ensure we can't use a relative path outside the project folder
213
+ with pytest.raises(ValidationError):
214
+ s = MatlabScriptStage(
215
+ name="b",
216
+ kind="matlab-script",
217
+ environment="_system",
218
+ script_path="scripts/my_script.m",
219
+ matlab_path="../up/a/dir",
220
+ )
221
+
222
+
189
223
  def test_sbatchstage():
190
224
  s = SBatchStage(
191
225
  name="job1",
@@ -3,8 +3,8 @@
3
3
  The `calkit.yaml` file serves as a small "database"
4
4
  for the project's important metadata, which includes its:
5
5
 
6
- - Global or system-level [dependencies](dependencies.md)
7
- (applications, libraries, environmental variables)
6
+ - Global or system-level [dependencies](dependencies.md) or requirements
7
+ (applications, environmental variables, or other configuration steps)
8
8
  - Questions the project seeks to answer
9
9
  - [Environments](environments.md)
10
10
  - [The pipeline](pipeline/index.md)
@@ -0,0 +1,125 @@
1
+ # Governance
2
+
3
+ Calkit is a free, open-source, and openly-governed project.
4
+ All [issues and ideas](https://github.com/calkit/calkit/issues)
5
+ are discussed publicly and are open to input from anyone.
6
+ Because the project is still early-stage,
7
+ the [founder](https://github.com/petebachant)
8
+ serves as the primary maintainer and decision maker.
9
+ As the number of
10
+ [contributors](https://github.com/calkit/calkit/graphs/contributors) grows,
11
+ maintainers will be added to share review and release duties.
12
+ The contributor's guide can be found
13
+ [here](https://github.com/calkit/calkit/blob/main/CONTRIBUTING.md)
14
+ and our code of conduct can be found
15
+ [here](https://github.com/calkit/calkit/blob/main/CODE_OF_CONDUCT.md).
16
+
17
+ ## Vision
18
+
19
+ We envision a future where nearly every research article is delivered as part
20
+ of a [single-button](https://petebachant.me/single-button/)
21
+ reproducible
22
+ [compendium](https://book.the-turing-way.org/reproducible-research/compendia/)
23
+ (or ["repro pack"](https://lorenabarba.com/blog/how-repro-packs-can-save-your-future-self/)).
24
+ That is, all primary artifacts like source code and raw data are available,
25
+ and all secondary artifacts like figures and article PDFs
26
+ can be produced with a single command.
27
+
28
+ ![The single-button reproducible future.](img/calkit-fragmentation-compendium.png)
29
+
30
+ <!-- Source: https://docs.google.com/drawings/d/1vAjGju_MOLD40oMXBTvIQfG-eZt9SRhEW9SDBzUt6xI/edit -->
31
+
32
+ We believe that this will increase the pace of collective knowledge creation
33
+ by enabling faster:
34
+
35
+ 1. **Discovery of errors.**
36
+ Computational methods will be fully described and auditable.
37
+ 2. **Replication.**
38
+ Studies can be replicated by simply replacing the raw input data and
39
+ rerunning the pipeline.
40
+ 3. **Extension.**
41
+ Innovation in science largely occurs at the level of
42
+ hypotheses and conceptual models,
43
+ not in mundane pipeline construction and execution.
44
+ There is also a network effect as more types of single-button projects are
45
+ published,
46
+ making it easier to find something similar to a desired workflow to start
47
+ from and adapt to new questions.
48
+
49
+ ### The status quo
50
+
51
+ The figure below from the PLOS Open Science Indicators dataset
52
+ shows how far away we are from our target.
53
+ Code sharing rates are only ~10%,
54
+ and of what is shared, it's reasonable to assume
55
+ [only ~10% of that code will even run](https://doi.org/10.1093/bib/bbad375),
56
+ never mind be included in a complete, automated pipeline.
57
+
58
+ ![Code sharing rates from PLOS OSI 2024.](img/plos-osi-code-2024-03.png){ style="max-width: 500px; width: auto; height: auto;" }
59
+ /// caption
60
+ Code sharing rates from
61
+ [PLOS Open Science Indicators](https://theplosblog.plos.org/2024/03/six-years-of-open-science-indicators-data/).
62
+ ///
63
+
64
+ ## Strategy
65
+
66
+ We believe one major hurdle preventing researchers from working reproducibly is
67
+ the expectation that they become software engineering experts,
68
+ choose and integrate multiple tools,
69
+ and assemble a custom workflow.
70
+ We want to provide a vertically-integrated, purpose-built,
71
+ and user-friendly project format and toolset that reduces the required
72
+ expertise and decision fatigue.
73
+ That is not to say that policy, education, and support are not part of the
74
+ solution—they certainly are—but we are focused on improving
75
+ tooling and infrastructure.
76
+
77
+ - **Path of least resistance:**
78
+ Make it faster to work in a clean,
79
+ reproducible way than it is to work in an ad-hoc, disorganized way.
80
+ - **Intuitive tooling:**
81
+ Simplify the "hard parts" of modern scientific computing:
82
+ caching, version control, and environment management.
83
+ - **Bridging the gap:**
84
+ Create a natural transition from interactive discovery (notebooks/shells)
85
+ to automated batch pipelines.
86
+ - **Builder's pride:**
87
+ Enable researchers to take pride in what they create so
88
+ they will be more likely to share their projects openly.
89
+
90
+ ## Objective and key results (OKRs)
91
+
92
+ ### 2026-Q1
93
+
94
+ 1. Objective: Empower researchers to create and share single-button
95
+ reproducible research projects.
96
+ 1. Key result: 5 researchers (excluding direct collaborators) create
97
+ single-button reproducible research projects this quarter.
98
+ 2. Key result: Of those who create projects, at least half share them
99
+ openly and cite them in submitted articles.
100
+ 3. Key result: At least half of those who create projects agree that they
101
+ would have been slower to finish (typically submit a paper) without
102
+ Calkit.
103
+
104
+ ## Funding and sustainability
105
+
106
+ Calkit is committed to remaining free and open source forever.
107
+ The project is sustained through a combination of:
108
+
109
+ - **Volunteer contributions** from the community.
110
+ - **Institutional support** through allocated work time.
111
+ - **Calkit Cloud** optional paid plans to help cover infrastructure costs
112
+ for the cloud storage and compute service hosted at
113
+ [calkit.io](https://calkit.io).
114
+
115
+ The cloud service operates on a freemium model:
116
+ a generous free tier for most users,
117
+ with paid options for those who need additional storage or compute resources.
118
+ This helps ensure the service remains available and reliable
119
+ without requiring payment for typical research projects.
120
+
121
+ All Calkit software remains MIT-licensed and can be self-hosted
122
+ and used with any compatible storage backend.
123
+ In fact, we would prefer institutions host their own instance
124
+ as part of a
125
+ [decentralized, federated network](https://github.com/calkit/calkit-cloud/issues/190).
@@ -71,6 +71,7 @@ nav:
71
71
  - tutorials/github-actions.md
72
72
  - CLI reference: cli-reference.md
73
73
  - Help and support: help.md
74
+ - Governance: governance.md
74
75
  markdown_extensions:
75
76
  - admonition
76
77
  - attr_list
@@ -16,11 +16,12 @@ dependencies = [
16
16
  "bibtexparser",
17
17
  "checksumdir",
18
18
  "docx2pdf",
19
- "dvc==3.64.0",
19
+ "dvc==3.64.2",
20
20
  "fastapi",
21
21
  "gitpython",
22
22
  "keyring",
23
23
  "nbconvert",
24
+ "pathspec<1.0.0",
24
25
  "pillow",
25
26
  "pydantic[email]",
26
27
  "pydantic-settings",
@@ -35,7 +36,7 @@ dependencies = [
35
36
  "papermill>=2.6.0",
36
37
  "jupyterlab>=4.4.5",
37
38
  "sqlitedict>=2.1.0",
38
- "json2latex>=0.0.2",
39
+ "json2latex>=0.0.3",
39
40
  ]
40
41
  description = "Reproducibility simplified."
41
42
  dynamic = ["version"]