calkit-python 0.26.5__tar.gz → 0.26.6__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 (167) hide show
  1. {calkit_python-0.26.5 → calkit_python-0.26.6}/PKG-INFO +79 -9
  2. {calkit_python-0.26.5 → calkit_python-0.26.6}/README.md +78 -8
  3. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/__init__.py +1 -1
  4. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/cli/new.py +54 -35
  5. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/cli/test_new.py +31 -0
  6. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/help.md +2 -3
  7. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/index.md +18 -16
  8. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/installation.md +6 -0
  9. calkit_python-0.26.6/docs/quickstart.md +94 -0
  10. {calkit_python-0.26.5 → calkit_python-0.26.6}/mkdocs.yml +2 -1
  11. {calkit_python-0.26.5 → calkit_python-0.26.6}/.github/FUNDING.yml +0 -0
  12. {calkit_python-0.26.5 → calkit_python-0.26.6}/.github/workflows/docs.yml +0 -0
  13. {calkit_python-0.26.5 → calkit_python-0.26.6}/.github/workflows/format.yml +0 -0
  14. {calkit_python-0.26.5 → calkit_python-0.26.6}/.github/workflows/publish-test.yml +0 -0
  15. {calkit_python-0.26.5 → calkit_python-0.26.6}/.github/workflows/publish.yml +0 -0
  16. {calkit_python-0.26.5 → calkit_python-0.26.6}/.github/workflows/test.yml +0 -0
  17. {calkit_python-0.26.5 → calkit_python-0.26.6}/.gitignore +0 -0
  18. {calkit_python-0.26.5 → calkit_python-0.26.6}/.pre-commit-config.yaml +0 -0
  19. {calkit_python-0.26.5 → calkit_python-0.26.6}/.python-version +0 -0
  20. {calkit_python-0.26.5 → calkit_python-0.26.6}/CONTRIBUTING.md +0 -0
  21. {calkit_python-0.26.5 → calkit_python-0.26.6}/LICENSE +0 -0
  22. {calkit_python-0.26.5 → calkit_python-0.26.6}/Makefile +0 -0
  23. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/__main__.py +0 -0
  24. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/calc.py +0 -0
  25. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/check.py +0 -0
  26. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/cli/__init__.py +0 -0
  27. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/cli/check.py +0 -0
  28. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/cli/cloud.py +0 -0
  29. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/cli/config.py +0 -0
  30. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/cli/core.py +0 -0
  31. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/cli/describe.py +0 -0
  32. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/cli/import_.py +0 -0
  33. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/cli/list.py +0 -0
  34. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/cli/main.py +0 -0
  35. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/cli/notebooks.py +0 -0
  36. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/cli/office.py +0 -0
  37. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/cli/overleaf.py +0 -0
  38. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/cli/update.py +0 -0
  39. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/cloud.py +0 -0
  40. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/conda.py +0 -0
  41. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/config.py +0 -0
  42. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/core.py +0 -0
  43. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/datasets.py +0 -0
  44. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/docker.py +0 -0
  45. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/dvc.py +0 -0
  46. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/environments.py +0 -0
  47. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/git.py +0 -0
  48. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/github.py +0 -0
  49. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/gui.py +0 -0
  50. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/jupyter.py +0 -0
  51. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/magics.py +0 -0
  52. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/matlab.py +0 -0
  53. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/models/__init__.py +0 -0
  54. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/models/core.py +0 -0
  55. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/models/io.py +0 -0
  56. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/models/iteration.py +0 -0
  57. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/models/pipeline.py +0 -0
  58. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/notebooks.py +0 -0
  59. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/office.py +0 -0
  60. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/ops.py +0 -0
  61. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/pipeline.py +0 -0
  62. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/releases.py +0 -0
  63. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/server.py +0 -0
  64. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/templates/__init__.py +0 -0
  65. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/templates/core.py +0 -0
  66. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/templates/latex/__init__.py +0 -0
  67. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/templates/latex/article/paper.tex +0 -0
  68. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/templates/latex/core.py +0 -0
  69. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/templates/latex/jfm/jfm.bst +0 -0
  70. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/templates/latex/jfm/jfm.cls +0 -0
  71. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
  72. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/templates/latex/jfm/paper.tex +0 -0
  73. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/templates/latex/jfm/upmath.sty +0 -0
  74. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/__init__.py +0 -0
  75. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/cli/__init__.py +0 -0
  76. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/cli/test_check.py +0 -0
  77. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/cli/test_config.py +0 -0
  78. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/cli/test_list.py +0 -0
  79. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/cli/test_main.py +0 -0
  80. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/models/__init__.py +0 -0
  81. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/models/test_pipeline.py +0 -0
  82. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/test_calc.py +0 -0
  83. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/test_check.py +0 -0
  84. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/test_conda.py +0 -0
  85. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/test_core.py +0 -0
  86. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/test_dvc.py +0 -0
  87. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/test_jupyter.py +0 -0
  88. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/test_magics.py +0 -0
  89. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/test_notebooks.py +0 -0
  90. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/test_pipeline.py +0 -0
  91. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/tests/test_templates.py +0 -0
  92. {calkit_python-0.26.5 → calkit_python-0.26.6}/calkit/zenodo.py +0 -0
  93. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/CNAME +0 -0
  94. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/apps.md +0 -0
  95. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/calculations.md +0 -0
  96. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/calkit-yaml.md +0 -0
  97. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/cli-reference.md +0 -0
  98. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/cloud-integration.md +0 -0
  99. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/datasets.md +0 -0
  100. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/dependencies.md +0 -0
  101. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/environments.md +0 -0
  102. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/examples.md +0 -0
  103. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/img/c-to-the-k-white.svg +0 -0
  104. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/img/calkit-no-bg.png +0 -0
  105. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/img/connect-zenodo.png +0 -0
  106. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/local-server.md +0 -0
  107. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/notebooks.md +0 -0
  108. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/overleaf.md +0 -0
  109. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/pipeline/index.md +0 -0
  110. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/pipeline/manual-steps.md +0 -0
  111. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/pipeline/running-and-logging.md +0 -0
  112. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/references.md +0 -0
  113. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/releases.md +0 -0
  114. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/adding-latex-pub-docker.md +0 -0
  115. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/conda-envs.md +0 -0
  116. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/existing-project.md +0 -0
  117. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/first-project.md +0 -0
  118. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
  119. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
  120. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
  121. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
  122. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
  123. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
  124. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
  125. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
  126. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
  127. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
  128. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/latex-codespaces/push.png +0 -0
  129. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
  130. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
  131. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/chart-more-rows.png +0 -0
  132. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/create-project.png +0 -0
  133. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
  134. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/excel-chart.png +0 -0
  135. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/excel-data.png +0 -0
  136. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
  137. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/needs-clone.png +0 -0
  138. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/new-stage.png +0 -0
  139. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
  140. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
  141. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/status-more-rows.png +0 -0
  142. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
  143. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/untracked-data.png +0 -0
  144. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/updated-publication.png +0 -0
  145. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
  146. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/office/workflow-page.png +0 -0
  147. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/openfoam/clone.png +0 -0
  148. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/openfoam/create-project.png +0 -0
  149. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
  150. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
  151. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
  152. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/openfoam/new-token.png +0 -0
  153. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/openfoam/reclone.png +0 -0
  154. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
  155. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/img/run-proc.png +0 -0
  156. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/index.md +0 -0
  157. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/latex-codespaces.md +0 -0
  158. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/matlab.md +0 -0
  159. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/notebook-pipeline.md +0 -0
  160. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/office.md +0 -0
  161. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/openfoam.md +0 -0
  162. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/tutorials/procedures.md +0 -0
  163. {calkit_python-0.26.5 → calkit_python-0.26.6}/docs/version-control.md +0 -0
  164. {calkit_python-0.26.5 → calkit_python-0.26.6}/pyproject.toml +0 -0
  165. {calkit_python-0.26.5 → calkit_python-0.26.6}/test/pipeline.ipynb +0 -0
  166. {calkit_python-0.26.5 → calkit_python-0.26.6}/test/test-log.log +0 -0
  167. {calkit_python-0.26.5 → calkit_python-0.26.6}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: calkit-python
3
- Version: 0.26.5
3
+ Version: 0.26.6
4
4
  Summary: Reproducibility simplified.
5
5
  Project-URL: Homepage, https://calkit.org
6
6
  Project-URL: Issues, https://github.com/calkit/calkit/issues
@@ -55,21 +55,33 @@ Description-Content-Type: text/markdown
55
55
  </a>
56
56
  </p>
57
57
 
58
- Calkit's mission is to make every scientific study reproducible.
59
- That is,
60
- it should be possible to go from raw data to research article
61
- by "pressing a single button"
62
- ([Claerbout and Karrenbach (1992)](https://doi.org/10.1190/1.1822162)).
58
+ Calkit makes it easy to create
59
+ ["single button"](https://doi.org/10.1190/1.1822162)
60
+ reproducible research projects.
61
+
62
+ Instead of a loosely related collection of files
63
+ and manual instructions,
64
+ turn your project into a version-controlled,
65
+ self-contained "calculation kit,"
66
+ tying together all phases or stages of the project:
67
+ data collection, analysis, visualization, and writing,
68
+ each of which can make use of the latest and greatest computational
69
+ tools and languages.
70
+ In other words, you, your collaborators, and readers will be able to go
71
+ from raw data to research article with a single command,
72
+ improving efficiency via faster iteration cycle time,
73
+ reducing the likelihood of mistakes,
74
+ and allowing others to more effectively build upon your work.
63
75
 
64
76
  Calkit makes this level of automation possible without extensive software
65
77
  engineering expertise by providing a project framework and toolset that unifies
66
- and simplifies the use of enabling technologies like Git,
78
+ and simplifies the use of powerful enabling technologies like Git,
67
79
  DVC, Conda, Docker, and more,
68
80
  while guiding users away from common reproducibility pitfalls.
69
81
 
70
82
  ## Features
71
83
 
72
- - A declarative pipeline that forces users to define an environment
84
+ - A declarative pipeline that guides users to define an environment
73
85
  for every stage, so long lists of instructions in a README and
74
86
  "but it works on my machine" are things of the past.
75
87
  - A CLI to run the project's pipeline to verify it's reproducible,
@@ -136,6 +148,64 @@ calkit config set token ${YOUR_TOKEN_HERE}
136
148
 
137
149
  ## Quickstart
138
150
 
151
+ ### From an existing project
152
+
153
+ If you want to use Calkit with an existing project,
154
+ navigate into its working directory and run:
155
+
156
+ ```sh
157
+ calkit new project --public --cloud .
158
+ ```
159
+
160
+ Note that the `--public` and `--cloud` options can be omitted,
161
+ but you'll need to configure your own DVC remote or use Git to store
162
+ pipeline outputs.
163
+
164
+ Next, create your [environment(s)](https://docs.calkit.org/environments).
165
+ In this example, imagine we have a `requirements.txt` file we want to use to
166
+ define a uv virtual environment, or venv:
167
+
168
+ ```sh
169
+ calkit new uv-venv --name main --path requirements.txt --python 3.13
170
+ ```
171
+
172
+ If you're using Conda for environment management,
173
+ e.g., with an `environment.yml` file,
174
+ you can use the `calkit new conda-env` command.
175
+
176
+ Next, we can start building our [pipeline](https://docs.calkit.org/pipeline).
177
+ Let's say we have a Jupyter notebook called `collect-data.ipynb`
178
+ that produces raw data at `data/raw.h5`.
179
+ We can add a pipeline stage to run this notebook in the `main` environment
180
+ we just created with:
181
+
182
+ ```sh
183
+ calkit new jupyter-notebook-stage \
184
+ --name collect-data \
185
+ --environment main \
186
+ --notebook-path collect-data.ipynb \
187
+ --output data/raw.h5
188
+ ```
189
+
190
+ We can then run the pipeline with:
191
+
192
+ ```sh
193
+ calkit run
194
+ ```
195
+
196
+ and save and back up our results with:
197
+
198
+ ```sh
199
+ calkit save -am "Run pipeline"
200
+ ```
201
+
202
+ After that,
203
+ you can add more environments, pipeline stages,
204
+ [start a publication with LaTeX](https://docs.calkit.org/tutorials/adding-latex-pub-docker/),
205
+ or [link a publication with Overleaf](https://docs.calkit.org/overleaf/).
206
+
207
+ ### Fresh from a Calkit project template
208
+
139
209
  After installing Calkit and setting your token as described above, run:
140
210
 
141
211
  ```sh
@@ -157,7 +227,7 @@ cd calkit-project-1
157
227
  calkit run
158
228
  ```
159
229
 
160
- This will reproduce the project's pipeline.
230
+ This will run the project's pipeline.
161
231
  Next, you can start adding stages to the pipeline,
162
232
  modifying the Python environments and scripts,
163
233
  and editing the paper.
@@ -17,21 +17,33 @@
17
17
  </a>
18
18
  </p>
19
19
 
20
- Calkit's mission is to make every scientific study reproducible.
21
- That is,
22
- it should be possible to go from raw data to research article
23
- by "pressing a single button"
24
- ([Claerbout and Karrenbach (1992)](https://doi.org/10.1190/1.1822162)).
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.
25
37
 
26
38
  Calkit makes this level of automation possible without extensive software
27
39
  engineering expertise by providing a project framework and toolset that unifies
28
- and simplifies the use of enabling technologies like Git,
40
+ and simplifies the use of powerful enabling technologies like Git,
29
41
  DVC, Conda, Docker, and more,
30
42
  while guiding users away from common reproducibility pitfalls.
31
43
 
32
44
  ## Features
33
45
 
34
- - A declarative pipeline that forces users to define an environment
46
+ - A declarative pipeline that guides users to define an environment
35
47
  for every stage, so long lists of instructions in a README and
36
48
  "but it works on my machine" are things of the past.
37
49
  - A CLI to run the project's pipeline to verify it's reproducible,
@@ -98,6 +110,64 @@ calkit config set token ${YOUR_TOKEN_HERE}
98
110
 
99
111
  ## Quickstart
100
112
 
113
+ ### From an existing project
114
+
115
+ If you want to use Calkit with an existing project,
116
+ navigate into its working directory and run:
117
+
118
+ ```sh
119
+ calkit new project --public --cloud .
120
+ ```
121
+
122
+ Note that the `--public` and `--cloud` options can be omitted,
123
+ but you'll need to configure your own DVC remote or use Git to store
124
+ pipeline outputs.
125
+
126
+ Next, create your [environment(s)](https://docs.calkit.org/environments).
127
+ In this example, imagine we have a `requirements.txt` file we want to use to
128
+ define a uv virtual environment, or venv:
129
+
130
+ ```sh
131
+ calkit new uv-venv --name main --path requirements.txt --python 3.13
132
+ ```
133
+
134
+ If you're using Conda for environment management,
135
+ e.g., with an `environment.yml` file,
136
+ you can use the `calkit new conda-env` command.
137
+
138
+ Next, we can start building our [pipeline](https://docs.calkit.org/pipeline).
139
+ Let's say we have a Jupyter notebook called `collect-data.ipynb`
140
+ that produces raw data at `data/raw.h5`.
141
+ We can add a pipeline stage to run this notebook in the `main` environment
142
+ we just created with:
143
+
144
+ ```sh
145
+ calkit new jupyter-notebook-stage \
146
+ --name collect-data \
147
+ --environment main \
148
+ --notebook-path collect-data.ipynb \
149
+ --output data/raw.h5
150
+ ```
151
+
152
+ We can then run the pipeline with:
153
+
154
+ ```sh
155
+ calkit run
156
+ ```
157
+
158
+ and save and back up our results with:
159
+
160
+ ```sh
161
+ calkit save -am "Run pipeline"
162
+ ```
163
+
164
+ After that,
165
+ you can add more environments, pipeline stages,
166
+ [start a publication with LaTeX](https://docs.calkit.org/tutorials/adding-latex-pub-docker/),
167
+ or [link a publication with Overleaf](https://docs.calkit.org/overleaf/).
168
+
169
+ ### Fresh from a Calkit project template
170
+
101
171
  After installing Calkit and setting your token as described above, run:
102
172
 
103
173
  ```sh
@@ -119,7 +189,7 @@ cd calkit-project-1
119
189
  calkit run
120
190
  ```
121
191
 
122
- This will reproduce the project's pipeline.
192
+ This will run the project's pipeline.
123
193
  Next, you can start adding stages to the pipeline,
124
194
  modifying the Python environments and scripts,
125
195
  and editing the paper.
@@ -1,4 +1,4 @@
1
- __version__ = "0.26.5"
1
+ __version__ = "0.26.6"
2
2
 
3
3
  from .core import * # noqa: F403, I001
4
4
  from . import git # noqa: F401
@@ -1079,15 +1079,15 @@ def new_publication(
1079
1079
 
1080
1080
  @new_app.command("conda-env")
1081
1081
  def new_conda_env(
1082
- packages: Annotated[
1083
- list[str],
1084
- typer.Argument(help="Packages to include in the environment."),
1085
- ],
1086
1082
  name: Annotated[
1087
1083
  str, typer.Option("--name", "-n", help="Environment name.")
1088
1084
  ],
1085
+ packages: Annotated[
1086
+ list[str] | None,
1087
+ typer.Argument(help="Packages to include in the environment."),
1088
+ ] = None,
1089
1089
  conda_name: Annotated[
1090
- str,
1090
+ str | None,
1091
1091
  typer.Option(
1092
1092
  "--conda-name",
1093
1093
  help=(
@@ -1105,10 +1105,11 @@ def new_conda_env(
1105
1105
  list[str], typer.Option("--pip", help="Packages to install with pip.")
1106
1106
  ] = [],
1107
1107
  prefix: Annotated[
1108
- str, typer.Option("--prefix", help="Prefix for environment location.")
1108
+ str | None,
1109
+ typer.Option("--prefix", help="Prefix for environment location."),
1109
1110
  ] = None,
1110
1111
  description: Annotated[
1111
- str, typer.Option("--description", help="Description.")
1112
+ str | None, typer.Option("--description", help="Description.")
1112
1113
  ] = None,
1113
1114
  overwrite: Annotated[
1114
1115
  bool,
@@ -1130,8 +1131,10 @@ def new_conda_env(
1130
1131
  ] = False,
1131
1132
  ):
1132
1133
  """Create a new Conda environment."""
1133
- if os.path.isfile(path) and not overwrite:
1134
+ if packages is not None and os.path.isfile(path) and not overwrite:
1134
1135
  raise_error("Output path already exists (use -f to overwrite)")
1136
+ elif packages is None and not os.path.isfile(path):
1137
+ raise_error("Packages must be provided if path doesn't exist")
1135
1138
  repo = git.Repo()
1136
1139
  # Add environment to Calkit info
1137
1140
  ck_info = calkit.load_calkit_info()
@@ -1150,21 +1153,34 @@ def new_conda_env(
1150
1153
  if project_name is None:
1151
1154
  project_name = os.path.basename(os.getcwd())
1152
1155
  conda_name = calkit.to_kebab_case(project_name) + "-" + name
1153
- # Write environment to path
1154
- _check_path_dir(path)
1155
- conda_env = dict(
1156
- name=conda_name, channels=["conda-forge"], dependencies=packages
1157
- )
1158
- if prefix is not None:
1159
- from calkit.cli.main import ignore
1156
+ if packages is not None:
1157
+ assert isinstance(packages, list)
1158
+ # Write environment to path
1159
+ _check_path_dir(path)
1160
+ conda_env = dict(
1161
+ name=conda_name, channels=["conda-forge"], dependencies=packages
1162
+ )
1163
+ if prefix is not None:
1164
+ from calkit.cli.main import ignore
1160
1165
 
1161
- conda_env["prefix"] = prefix
1162
- ignore(prefix, no_commit=True)
1163
- repo.git.add(".gitignore")
1164
- if pip_packages:
1165
- conda_env["dependencies"].append(dict(pip=pip_packages))
1166
- with open(path, "w") as f:
1167
- ryaml.dump(conda_env, f)
1166
+ conda_env["prefix"] = prefix
1167
+ ignore(prefix, no_commit=True)
1168
+ repo.git.add(".gitignore")
1169
+ if pip_packages:
1170
+ conda_env["dependencies"].append(dict(pip=pip_packages))
1171
+ with open(path, "w") as f:
1172
+ ryaml.dump(conda_env, f)
1173
+ elif packages is None and os.path.isfile(path):
1174
+ with open(path) as f:
1175
+ conda_env: dict = ryaml.load(f)
1176
+ # Remove prefix
1177
+ conda_env.pop("prefix", None)
1178
+ if prefix is not None:
1179
+ conda_env["prefix"] = prefix
1180
+ # Rename so we can track it more uniquely
1181
+ conda_env["name"] = conda_name
1182
+ with open(path, "w") as f:
1183
+ ryaml.dump(conda_env, f)
1168
1184
  repo.git.add(path)
1169
1185
  typer.echo("Adding environment to calkit.yaml")
1170
1186
  env = dict(path=path, kind="conda")
@@ -1187,13 +1203,13 @@ def new_conda_env(
1187
1203
 
1188
1204
  @new_app.command("uv-venv")
1189
1205
  def new_uv_venv(
1190
- packages: Annotated[
1191
- list[str],
1192
- typer.Argument(help="Packages to include in the environment."),
1193
- ],
1194
1206
  name: Annotated[
1195
1207
  str, typer.Option("--name", "-n", help="Environment name.")
1196
1208
  ],
1209
+ packages: Annotated[
1210
+ list[str] | None,
1211
+ typer.Argument(help="Packages to include in the environment."),
1212
+ ] = None,
1197
1213
  path: Annotated[
1198
1214
  str, typer.Option("--path", help="Path for requirements file.")
1199
1215
  ] = "requirements.txt",
@@ -1201,10 +1217,10 @@ def new_uv_venv(
1201
1217
  str, typer.Option("--prefix", help="Prefix for environment location.")
1202
1218
  ] = ".venv",
1203
1219
  python_version: Annotated[
1204
- str, typer.Option("--python", "-p", help="Python version.")
1205
- ] = None,
1220
+ str | None, typer.Option("--python", "-p", help="Python version.")
1221
+ ] = "3.13",
1206
1222
  description: Annotated[
1207
- str, typer.Option("--description", help="Description.")
1223
+ str | None, typer.Option("--description", help="Description.")
1208
1224
  ] = None,
1209
1225
  overwrite: Annotated[
1210
1226
  bool,
@@ -1226,8 +1242,10 @@ def new_uv_venv(
1226
1242
  ] = False,
1227
1243
  ):
1228
1244
  """Create a new uv virtual environment."""
1229
- if os.path.isfile(path) and not overwrite:
1245
+ if os.path.isfile(path) and packages and not overwrite:
1230
1246
  raise_error("Output path already exists (use -f to overwrite)")
1247
+ elif packages is None and not os.path.isfile(path):
1248
+ raise_error("If path doesn't exist, packages must be specified")
1231
1249
  repo = git.Repo()
1232
1250
  # Add environment to Calkit info
1233
1251
  ck_info = calkit.load_calkit_info()
@@ -1249,11 +1267,12 @@ def new_uv_venv(
1249
1267
  f"Environment '{env_name}' already exists with "
1250
1268
  f"prefix '{prefix}'"
1251
1269
  )
1252
- packages_txt = "\n".join(packages)
1253
- # Write environment to path
1254
- _check_path_dir(path)
1255
- with open(path, "w") as f:
1256
- f.write(packages_txt)
1270
+ if packages is not None:
1271
+ packages_txt = "\n".join(packages)
1272
+ # Write environment to path
1273
+ _check_path_dir(path)
1274
+ with open(path, "w") as f:
1275
+ f.write(packages_txt)
1257
1276
  repo.git.add(path)
1258
1277
  typer.echo("Adding environment to calkit.yaml")
1259
1278
  env = dict(path=path, kind="uv-venv", prefix=prefix)
@@ -212,6 +212,37 @@ def test_new_uv_venv(tmp_dir):
212
212
  assert env.kind == "uv-venv"
213
213
 
214
214
 
215
+ def test_new_conda_env(tmp_dir):
216
+ with open("environment.yml", "w") as f:
217
+ calkit.ryaml.dump(
218
+ {
219
+ "dependencies": ["python", "requests"],
220
+ "name": "whatever",
221
+ "channels": ["conda-forge"],
222
+ },
223
+ f,
224
+ )
225
+ subprocess.check_call(
226
+ ["calkit", "new", "project", ".", "--name", "test", "--title", "Test"]
227
+ )
228
+ subprocess.check_call(
229
+ [
230
+ "calkit",
231
+ "new",
232
+ "conda-env",
233
+ "--path",
234
+ "environment.yml",
235
+ "--name",
236
+ "e1",
237
+ "--no-check",
238
+ ]
239
+ )
240
+ with open("environment.yml") as f:
241
+ env = calkit.ryaml.load(f)
242
+ assert env["name"] == "test-e1"
243
+ assert env["dependencies"] == ["python", "requests"]
244
+
245
+
215
246
  def test_new_project(tmp_dir):
216
247
  subprocess.check_call(
217
248
  ["calkit", "new", "project", ".", "--title", "My new project"]
@@ -7,9 +7,8 @@ To get in touch with the community,
7
7
  check out the
8
8
  [discussion forum](https://github.com/orgs/calkit/discussions)
9
9
  or the
10
- [Discord server](https://discord.gg/QHEDz7G6).
10
+ [Discord server](https://discord.gg/ryDkGarc).
11
11
 
12
12
  If you want to get in touch directly,
13
13
  feel free to
14
- [send an email](mailto:help@calkit.io) or
15
- [schedule a video chat](https://calendar.app.google/fGDwYrqJm3diKegr8).
14
+ [send an email](mailto:help@calkit.io).
@@ -1,27 +1,29 @@
1
1
  # Home
2
2
 
3
- Calkit's mission is to make every scientific study reproducible.
4
- That is,
5
- it should be possible to go from raw data to research article
6
- by "pressing a single button"
7
- ([Claerbout and Karrenbach (1992)](https://doi.org/10.1190/1.1822162)).
3
+ Calkit makes it easy to create
4
+ ["single button"](https://doi.org/10.1190/1.1822162)
5
+ reproducible research projects.
6
+
7
+ Instead of a loosely related collection of files
8
+ and manual instructions,
9
+ turn your project into a version-controlled,
10
+ self-contained "calculation kit,"
11
+ tying together all phases or stages of the project:
12
+ data collection, analysis, visualization, and writing,
13
+ each of which can make use of the latest and greatest computational
14
+ tools and languages.
15
+ In other words, you, your collaborators, and readers will be able to go
16
+ from raw data to research article with a single command,
17
+ improving efficiency via faster iteration cycle time,
18
+ reducing the likelihood of mistakes,
19
+ and allowing others to more effectively build upon your work.
8
20
 
9
21
  Calkit makes this level of automation possible without extensive software
10
22
  engineering expertise by providing a project framework and toolset that unifies
11
- and simplifies the use of enabling technologies like Git,
23
+ and simplifies the use of powerful enabling technologies like Git,
12
24
  DVC, Conda, Docker, and more,
13
25
  while guiding users away from common reproducibility pitfalls.
14
26
 
15
- When your project is reproducible,
16
- you'll be able to iterate more quickly and more often,
17
- easily onboard collaborators,
18
- make fewer mistakes,
19
- and feel confident sharing all of your project materials
20
- with your research articles,
21
- because you'll know the code will actually run!
22
- This will allow others to reuse parts of your project in their own research,
23
- accelerating the pace of discovery.
24
-
25
27
  ## Features
26
28
 
27
29
  - A declarative pipeline that forces users to define an environment
@@ -19,6 +19,12 @@ Alternatively, but less ideally, you can install with your system Python:
19
19
  pip install calkit-python
20
20
  ```
21
21
 
22
+ Next,
23
+ [connect to a Calkit Hub](cloud-integration.md)
24
+ for collaboration and backup.
25
+
26
+ ## Calkit Assistant
27
+
22
28
  For Windows users, the
23
29
  [Calkit Assistant](https://github.com/calkit/calkit-assistant)
24
30
  app is the easiest way to get everything set up and ready to work in
@@ -0,0 +1,94 @@
1
+ # Quickstart
2
+
3
+ ## From an existing project
4
+
5
+ If you want to use Calkit with an existing project,
6
+ navigate into its working directory and run:
7
+
8
+ ```sh
9
+ calkit new project --public --cloud .
10
+ ```
11
+
12
+ Note that the `--public` and `--cloud` options can be omitted,
13
+ but then you'll need to configure your own DVC remote or use Git to store
14
+ pipeline outputs.
15
+
16
+ Next, create your [environment(s)](environments.md).
17
+ In this example, imagine we have a `requirements.txt` file we want to use to
18
+ define a uv virtual environment, or venv:
19
+
20
+ ```sh
21
+ calkit new uv-venv --name main --path requirements.txt --python 3.13
22
+ ```
23
+
24
+ If you're using Conda for environment management,
25
+ e.g., with an `environment.yml` file,
26
+ you can use the `calkit new conda-env` command.
27
+
28
+ Next, we can start building our [pipeline](pipeline.md).
29
+ Let's say we have a Jupyter notebook called `collect-data.ipynb`
30
+ that produces raw data at `data/raw.h5`.
31
+ We can add a pipeline stage to run this notebook in the `main` environment
32
+ we just created with:
33
+
34
+ ```sh
35
+ calkit new jupyter-notebook-stage \
36
+ --name collect-data \
37
+ --environment main \
38
+ --notebook-path collect-data.ipynb \
39
+ --output data/raw.h5
40
+ ```
41
+
42
+ We can then run the pipeline with:
43
+
44
+ ```sh
45
+ calkit run
46
+ ```
47
+
48
+ and save and back up our results with:
49
+
50
+ ```sh
51
+ calkit save -am "Run pipeline"
52
+ ```
53
+
54
+ After that,
55
+ you can add more environments, pipeline stages,
56
+ [start a publication with LaTeX](tutorials/adding-latex-pub-docker.md),
57
+ or [link a publication with Overleaf](overleaf.md).
58
+
59
+ ## Fresh from a Calkit project template
60
+
61
+ After installing Calkit and setting your token as described above, run:
62
+
63
+ ```sh
64
+ calkit new project calkit-project-1 \
65
+ --title "My first Calkit project" \
66
+ --template calkit/example-basic \
67
+ --cloud \
68
+ --public
69
+ ```
70
+
71
+ This will create a new project from the
72
+ [`calkit/example-basic`](https://github.com/calkit/example-basic)
73
+ template,
74
+ creating it in the cloud and cloning to `calkit-project-1`.
75
+ You should now be able to run:
76
+
77
+ ```sh
78
+ cd calkit-project-1
79
+ calkit run
80
+ ```
81
+
82
+ This will run the project's pipeline.
83
+ Next, you can start adding stages to the pipeline,
84
+ modifying the Python environments and scripts,
85
+ and editing the paper.
86
+ All will be kept in sync with the `calkit run` command.
87
+
88
+ To back up all of your work, execute:
89
+
90
+ ```sh
91
+ calkit save -am "Run pipeline"
92
+ ```
93
+
94
+ This will commit and push to both GitHub and the Calkit Cloud.
@@ -35,8 +35,8 @@ theme:
35
35
  name: Switch to system preference
36
36
  nav:
37
37
  - Home: index.md
38
- - Help and support: help.md
39
38
  - Installation: installation.md
39
+ - Quickstart: quickstart.md
40
40
  - Cloud integration: cloud-integration.md
41
41
  - Version control: version-control.md
42
42
  - The calkit.yaml file: calkit-yaml.md
@@ -68,6 +68,7 @@ nav:
68
68
  - tutorials/office.md
69
69
  - tutorials/matlab.md
70
70
  - CLI reference: cli-reference.md
71
+ - Help and support: help.md
71
72
  markdown_extensions:
72
73
  - admonition
73
74
  - attr_list
File without changes
File without changes