calkit-python 0.24.6__tar.gz → 0.24.8__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 (159) hide show
  1. {calkit_python-0.24.6 → calkit_python-0.24.8}/PKG-INFO +15 -39
  2. {calkit_python-0.24.6 → calkit_python-0.24.8}/README.md +14 -38
  3. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/__init__.py +1 -1
  4. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/cli/check.py +3 -2
  5. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/cli/new.py +56 -0
  6. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/cli/test_new.py +4 -0
  7. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/test_conda.py +7 -0
  8. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/index.md +14 -28
  9. {calkit_python-0.24.6 → calkit_python-0.24.8}/.github/FUNDING.yml +0 -0
  10. {calkit_python-0.24.6 → calkit_python-0.24.8}/.github/workflows/docs.yml +0 -0
  11. {calkit_python-0.24.6 → calkit_python-0.24.8}/.github/workflows/format.yml +0 -0
  12. {calkit_python-0.24.6 → calkit_python-0.24.8}/.github/workflows/publish-test.yml +0 -0
  13. {calkit_python-0.24.6 → calkit_python-0.24.8}/.github/workflows/publish.yml +0 -0
  14. {calkit_python-0.24.6 → calkit_python-0.24.8}/.github/workflows/test.yml +0 -0
  15. {calkit_python-0.24.6 → calkit_python-0.24.8}/.gitignore +0 -0
  16. {calkit_python-0.24.6 → calkit_python-0.24.8}/.pre-commit-config.yaml +0 -0
  17. {calkit_python-0.24.6 → calkit_python-0.24.8}/.python-version +0 -0
  18. {calkit_python-0.24.6 → calkit_python-0.24.8}/CONTRIBUTING.md +0 -0
  19. {calkit_python-0.24.6 → calkit_python-0.24.8}/LICENSE +0 -0
  20. {calkit_python-0.24.6 → calkit_python-0.24.8}/Makefile +0 -0
  21. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/__main__.py +0 -0
  22. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/calc.py +0 -0
  23. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/check.py +0 -0
  24. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/cli/__init__.py +0 -0
  25. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/cli/cloud.py +0 -0
  26. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/cli/config.py +0 -0
  27. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/cli/core.py +0 -0
  28. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/cli/import_.py +0 -0
  29. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/cli/list.py +0 -0
  30. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/cli/main.py +0 -0
  31. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/cli/notebooks.py +0 -0
  32. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/cli/office.py +0 -0
  33. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/cli/overleaf.py +0 -0
  34. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/cli/update.py +0 -0
  35. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/cloud.py +0 -0
  36. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/conda.py +0 -0
  37. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/config.py +0 -0
  38. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/core.py +0 -0
  39. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/datasets.py +0 -0
  40. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/docker.py +0 -0
  41. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/dvc.py +0 -0
  42. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/environments.py +0 -0
  43. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/git.py +0 -0
  44. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/github.py +0 -0
  45. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/gui.py +0 -0
  46. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/jupyter.py +0 -0
  47. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/magics.py +0 -0
  48. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/matlab.py +0 -0
  49. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/models/__init__.py +0 -0
  50. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/models/core.py +0 -0
  51. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/models/iteration.py +0 -0
  52. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/models/pipeline.py +0 -0
  53. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/notebooks.py +0 -0
  54. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/office.py +0 -0
  55. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/ops.py +0 -0
  56. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/pipeline.py +0 -0
  57. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/releases.py +0 -0
  58. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/server.py +0 -0
  59. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/templates/__init__.py +0 -0
  60. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/templates/core.py +0 -0
  61. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/templates/latex/__init__.py +0 -0
  62. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/templates/latex/article/paper.tex +0 -0
  63. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/templates/latex/core.py +0 -0
  64. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/templates/latex/jfm/jfm.bst +0 -0
  65. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/templates/latex/jfm/jfm.cls +0 -0
  66. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
  67. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/templates/latex/jfm/paper.tex +0 -0
  68. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/templates/latex/jfm/upmath.sty +0 -0
  69. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/__init__.py +0 -0
  70. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/cli/__init__.py +0 -0
  71. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/cli/test_config.py +0 -0
  72. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/cli/test_list.py +0 -0
  73. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/cli/test_main.py +0 -0
  74. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/models/__init__.py +0 -0
  75. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/models/test_pipeline.py +0 -0
  76. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/test_calc.py +0 -0
  77. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/test_check.py +0 -0
  78. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/test_core.py +0 -0
  79. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/test_dvc.py +0 -0
  80. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/test_jupyter.py +0 -0
  81. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/test_magics.py +0 -0
  82. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/test_pipeline.py +0 -0
  83. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/tests/test_templates.py +0 -0
  84. {calkit_python-0.24.6 → calkit_python-0.24.8}/calkit/zenodo.py +0 -0
  85. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/CNAME +0 -0
  86. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/apps.md +0 -0
  87. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/calculations.md +0 -0
  88. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/calkit-yaml.md +0 -0
  89. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/cli-reference.md +0 -0
  90. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/cloud-integration.md +0 -0
  91. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/datasets.md +0 -0
  92. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/dependencies.md +0 -0
  93. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/environments.md +0 -0
  94. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/examples.md +0 -0
  95. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/help.md +0 -0
  96. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/img/c-to-the-k-white.svg +0 -0
  97. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/img/calkit-no-bg.png +0 -0
  98. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/img/connect-zenodo.png +0 -0
  99. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/installation.md +0 -0
  100. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/local-server.md +0 -0
  101. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/overleaf.md +0 -0
  102. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/pipeline/index.md +0 -0
  103. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/pipeline/manual-steps.md +0 -0
  104. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/references.md +0 -0
  105. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/releases.md +0 -0
  106. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/adding-latex-pub-docker.md +0 -0
  107. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/conda-envs.md +0 -0
  108. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/existing-project.md +0 -0
  109. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/first-project.md +0 -0
  110. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
  111. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
  112. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
  113. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
  114. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
  115. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
  116. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
  117. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
  118. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
  119. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
  120. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/latex-codespaces/push.png +0 -0
  121. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
  122. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
  123. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/chart-more-rows.png +0 -0
  124. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/create-project.png +0 -0
  125. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
  126. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/excel-chart.png +0 -0
  127. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/excel-data.png +0 -0
  128. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
  129. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/needs-clone.png +0 -0
  130. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/new-stage.png +0 -0
  131. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
  132. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
  133. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/status-more-rows.png +0 -0
  134. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
  135. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/untracked-data.png +0 -0
  136. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/updated-publication.png +0 -0
  137. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
  138. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/office/workflow-page.png +0 -0
  139. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/openfoam/clone.png +0 -0
  140. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/openfoam/create-project.png +0 -0
  141. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
  142. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
  143. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
  144. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/openfoam/new-token.png +0 -0
  145. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/openfoam/reclone.png +0 -0
  146. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
  147. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/img/run-proc.png +0 -0
  148. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/index.md +0 -0
  149. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/latex-codespaces.md +0 -0
  150. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/matlab.md +0 -0
  151. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/notebook-pipeline.md +0 -0
  152. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/office.md +0 -0
  153. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/openfoam.md +0 -0
  154. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/tutorials/procedures.md +0 -0
  155. {calkit_python-0.24.6 → calkit_python-0.24.8}/docs/version-control.md +0 -0
  156. {calkit_python-0.24.6 → calkit_python-0.24.8}/mkdocs.yml +0 -0
  157. {calkit_python-0.24.6 → calkit_python-0.24.8}/pyproject.toml +0 -0
  158. {calkit_python-0.24.6 → calkit_python-0.24.8}/test/pipeline.ipynb +0 -0
  159. {calkit_python-0.24.6 → calkit_python-0.24.8}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: calkit-python
3
- Version: 0.24.6
3
+ Version: 0.24.8
4
4
  Summary: Reproducibility simplified.
5
5
  Project-URL: Homepage, https://calkit.org
6
6
  Project-URL: Issues, https://github.com/calkit/calkit/issues
@@ -54,47 +54,23 @@ Description-Content-Type: text/markdown
54
54
  </a>
55
55
  </p>
56
56
 
57
- Calkit is a language-agnostic project framework and toolkit
58
- to make your research or analytics project
59
- reproducible to the highest standard,
60
- which means:
61
-
62
- > Inputs and process definitions are provided and sufficiently described
63
- > such that anyone can easily verify that they produced the outputs
64
- > used to support the conclusions.
65
-
66
- "Easily" means that after obtaining your project files,
67
- it should only require executing a single command
68
- (like "pressing a single button" in
69
- [Claerbout and Karrenbach (1992)](https://doi.org/10.1190/1.1822162)),
70
- which should finish in less than 15 minutes
71
- (suggested by
72
- [Vandewalle et al. (2009)](https://doi.org/10.1109/MSP.2009.932122)).
73
-
74
- If the processes are too expensive to rerun in under 15 minutes,
75
- it should be possible to confirm that none of the input data
76
- or process definitions (e.g., environment specifications, scripts)
77
- have changed since saving the current versions of each output artifact
78
- (figure, table, dataset, publication, etc.)
79
-
80
- When your project is reproducible,
81
- you'll be able to iterate more quickly and more often,
82
- easily onboard collaborators,
83
- make fewer mistakes,
84
- and feel confident sharing all of your project materials
85
- with your research articles,
86
- because you'll know the code will actually run!
87
- This will allow others to reuse parts of your project in their own research,
88
- accelerating the pace of discovery.
89
-
90
- Working at this level of automation, discipline, and rigor may sound like
91
- a lot of effort,
92
- but Calkit makes it easy!
57
+ Calkit's mission is to make every scientific study reproducible.
58
+ That is,
59
+ it should be possible to go from raw data to research article
60
+ by "pressing a single button"
61
+ ([Claerbout and Karrenbach (1992)](https://doi.org/10.1190/1.1822162)).
62
+
63
+ Calkit makes this level of automation possible without extensive software
64
+ engineering expertise by providing a project framework and toolset that unifies
65
+ and simplifies the use of enabling technologies like Git,
66
+ DVC, Conda, Docker, and more,
67
+ while guiding users away from common reproducibility pitfalls.
93
68
 
94
69
  ## Features
95
70
 
96
71
  - A declarative pipeline that forces users to define an environment
97
- for every stage, so "but it works on my machine" is a thing of the past.
72
+ for every stage, so long lists of instructions in a README and
73
+ "but it works on my machine" are things of the past.
98
74
  - A CLI to run the project's pipeline to verify it's reproducible,
99
75
  regenerating outputs as needed and
100
76
  ensuring all
@@ -106,7 +82,7 @@ but Calkit makes it easy!
106
82
  - A command line interface (CLI) to simplify keeping code, text, and larger
107
83
  data files backed up in the same project repo using both
108
84
  [Git](https://git-scm.com/) and [DVC](https://dvc.org/).
109
- - A complementary
85
+ - A complementary self-hostable and GitHub-integrated
110
86
  [cloud system](https://github.com/calkit/calkit-cloud)
111
87
  to facilitate backup, collaboration,
112
88
  and sharing throughout the entire research lifecycle.
@@ -17,47 +17,23 @@
17
17
  </a>
18
18
  </p>
19
19
 
20
- Calkit is a language-agnostic project framework and toolkit
21
- to make your research or analytics project
22
- reproducible to the highest standard,
23
- which means:
24
-
25
- > Inputs and process definitions are provided and sufficiently described
26
- > such that anyone can easily verify that they produced the outputs
27
- > used to support the conclusions.
28
-
29
- "Easily" means that after obtaining your project files,
30
- it should only require executing a single command
31
- (like "pressing a single button" in
32
- [Claerbout and Karrenbach (1992)](https://doi.org/10.1190/1.1822162)),
33
- which should finish in less than 15 minutes
34
- (suggested by
35
- [Vandewalle et al. (2009)](https://doi.org/10.1109/MSP.2009.932122)).
36
-
37
- If the processes are too expensive to rerun in under 15 minutes,
38
- it should be possible to confirm that none of the input data
39
- or process definitions (e.g., environment specifications, scripts)
40
- have changed since saving the current versions of each output artifact
41
- (figure, table, dataset, publication, etc.)
42
-
43
- When your project is reproducible,
44
- you'll be able to iterate more quickly and more often,
45
- easily onboard collaborators,
46
- make fewer mistakes,
47
- and feel confident sharing all of your project materials
48
- with your research articles,
49
- because you'll know the code will actually run!
50
- This will allow others to reuse parts of your project in their own research,
51
- accelerating the pace of discovery.
52
-
53
- Working at this level of automation, discipline, and rigor may sound like
54
- a lot of effort,
55
- but Calkit makes it easy!
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)).
25
+
26
+ Calkit makes this level of automation possible without extensive software
27
+ engineering expertise by providing a project framework and toolset that unifies
28
+ and simplifies the use of enabling technologies like Git,
29
+ DVC, Conda, Docker, and more,
30
+ while guiding users away from common reproducibility pitfalls.
56
31
 
57
32
  ## Features
58
33
 
59
34
  - A declarative pipeline that forces users to define an environment
60
- for every stage, so "but it works on my machine" is a thing of the past.
35
+ for every stage, so long lists of instructions in a README and
36
+ "but it works on my machine" are things of the past.
61
37
  - A CLI to run the project's pipeline to verify it's reproducible,
62
38
  regenerating outputs as needed and
63
39
  ensuring all
@@ -69,7 +45,7 @@ but Calkit makes it easy!
69
45
  - A command line interface (CLI) to simplify keeping code, text, and larger
70
46
  data files backed up in the same project repo using both
71
47
  [Git](https://git-scm.com/) and [DVC](https://dvc.org/).
72
- - A complementary
48
+ - A complementary self-hostable and GitHub-integrated
73
49
  [cloud system](https://github.com/calkit/calkit-cloud)
74
50
  to facilitate backup, collaboration,
75
51
  and sharing throughout the entire research lifecycle.
@@ -1,4 +1,4 @@
1
- __version__ = "0.24.6"
1
+ __version__ = "0.24.8"
2
2
 
3
3
  from .core import * # noqa: F403, I001
4
4
  from . import git # noqa: F401
@@ -55,7 +55,7 @@ def check_environment(
55
55
  verbose: Annotated[
56
56
  bool, typer.Option("--verbose", help="Print verbose output.")
57
57
  ] = False,
58
- ):
58
+ ) -> str | None:
59
59
  """Check that an environment is up-to-date."""
60
60
  dotenv.load_dotenv(dotenv_path=".env", verbose=verbose)
61
61
  ck_info = calkit.load_calkit_info(process_includes="environments")
@@ -136,6 +136,7 @@ def check_environment(
136
136
  )
137
137
  else:
138
138
  raise_error(f"Environment kind '{env['kind']}' not supported")
139
+ return get_env_lock_fpath(env=env, env_name=env_name, as_posix=False)
139
140
 
140
141
 
141
142
  @check_app.command(name="docker-env")
@@ -192,11 +193,11 @@ def check_docker_env(
192
193
  # content in the image
193
194
  keys = [
194
195
  "RepoTags",
196
+ "RepoDigests",
195
197
  "Architecture",
196
198
  "Os",
197
199
  "Size",
198
200
  "RootFS",
199
- "Descriptor",
200
201
  ]
201
202
  resp = {}
202
203
  for key in keys:
@@ -21,6 +21,7 @@ from typing_extensions import Annotated
21
21
 
22
22
  import calkit
23
23
  from calkit.cli import raise_error, warn
24
+ from calkit.cli.check import check_environment
24
25
  from calkit.cli.update import update_devcontainer
25
26
  from calkit.core import ryaml
26
27
  from calkit.docker import LAYERS
@@ -593,6 +594,13 @@ def new_docker_env(
593
594
  no_commit: Annotated[
594
595
  bool, typer.Option("--no-commit", help="Do not commit changes.")
595
596
  ] = False,
597
+ no_check: Annotated[
598
+ bool,
599
+ typer.Option(
600
+ "--no-check",
601
+ help="Do not check environment is up-to-date after creation.",
602
+ ),
603
+ ] = False,
596
604
  ):
597
605
  """Create a new Docker environment."""
598
606
  if base is not None and path is None:
@@ -648,6 +656,10 @@ def new_docker_env(
648
656
  with open("calkit.yaml", "w") as f:
649
657
  ryaml.dump(ck_info, f)
650
658
  repo.git.add("calkit.yaml")
659
+ if not no_check:
660
+ env_lock_fpath = check_environment(env_name=name)
661
+ if env_lock_fpath is not None:
662
+ repo.git.add(env_lock_fpath)
651
663
  if not no_commit and repo.git.diff("--staged"):
652
664
  repo.git.commit(["-m", f"Add Docker environment {name}"])
653
665
 
@@ -1033,6 +1045,13 @@ def new_conda_env(
1033
1045
  no_commit: Annotated[
1034
1046
  bool, typer.Option("--no-commit", help="Do not commit changes.")
1035
1047
  ] = False,
1048
+ no_check: Annotated[
1049
+ bool,
1050
+ typer.Option(
1051
+ "--no-check",
1052
+ help="Do not check environment is up-to-date after creation.",
1053
+ ),
1054
+ ] = False,
1036
1055
  ):
1037
1056
  """Create a new Conda environment."""
1038
1057
  if os.path.isfile(path) and not overwrite:
@@ -1081,6 +1100,10 @@ def new_conda_env(
1081
1100
  with open("calkit.yaml", "w") as f:
1082
1101
  ryaml.dump(ck_info, f)
1083
1102
  repo.git.add("calkit.yaml")
1103
+ if not no_check:
1104
+ env_lock_fpath = check_environment(env_name=name)
1105
+ if env_lock_fpath is not None:
1106
+ repo.git.add(env_lock_fpath)
1084
1107
  if not no_commit and repo.git.diff("--staged"):
1085
1108
  repo.git.commit(["-m", f"Add Conda environment {name}"])
1086
1109
 
@@ -1117,6 +1140,13 @@ def new_uv_venv(
1117
1140
  no_commit: Annotated[
1118
1141
  bool, typer.Option("--no-commit", help="Do not commit changes.")
1119
1142
  ] = False,
1143
+ no_check: Annotated[
1144
+ bool,
1145
+ typer.Option(
1146
+ "--no-check",
1147
+ help="Do not check environment is up-to-date after creation.",
1148
+ ),
1149
+ ] = False,
1120
1150
  ):
1121
1151
  """Create a new uv virtual environment."""
1122
1152
  if os.path.isfile(path) and not overwrite:
@@ -1158,6 +1188,10 @@ def new_uv_venv(
1158
1188
  with open("calkit.yaml", "w") as f:
1159
1189
  ryaml.dump(ck_info, f)
1160
1190
  repo.git.add("calkit.yaml")
1191
+ if not no_check:
1192
+ env_lock_fpath = check_environment(env_name=name)
1193
+ if env_lock_fpath is not None:
1194
+ repo.git.add(env_lock_fpath)
1161
1195
  if not no_commit and repo.git.diff("--staged"):
1162
1196
  repo.git.commit(["-m", f"Add uv venv {name}"])
1163
1197
 
@@ -1191,6 +1225,13 @@ def new_venv(
1191
1225
  no_commit: Annotated[
1192
1226
  bool, typer.Option("--no-commit", help="Do not commit changes.")
1193
1227
  ] = False,
1228
+ no_check: Annotated[
1229
+ bool,
1230
+ typer.Option(
1231
+ "--no-check",
1232
+ help="Do not check environment is up-to-date after creation.",
1233
+ ),
1234
+ ] = False,
1194
1235
  ):
1195
1236
  """Create a new Python virtual environment with venv."""
1196
1237
  if os.path.isfile(path) and not overwrite:
@@ -1230,6 +1271,10 @@ def new_venv(
1230
1271
  with open("calkit.yaml", "w") as f:
1231
1272
  ryaml.dump(ck_info, f)
1232
1273
  repo.git.add("calkit.yaml")
1274
+ if not no_check:
1275
+ env_lock_fpath = check_environment(env_name=name)
1276
+ if env_lock_fpath is not None:
1277
+ repo.git.add(env_lock_fpath)
1233
1278
  if not no_commit and repo.git.diff("--staged"):
1234
1279
  repo.git.commit(["-m", f"Add venv {name}"])
1235
1280
 
@@ -1263,6 +1308,13 @@ def new_pixi_env(
1263
1308
  no_commit: Annotated[
1264
1309
  bool, typer.Option("--no-commit", help="Do not commit changes.")
1265
1310
  ] = False,
1311
+ no_check: Annotated[
1312
+ bool,
1313
+ typer.Option(
1314
+ "--no-check",
1315
+ help="Do not check environment is up-to-date after creation.",
1316
+ ),
1317
+ ] = False,
1266
1318
  ):
1267
1319
  """Create a new pixi virtual environment."""
1268
1320
  repo = git.Repo()
@@ -1321,6 +1373,10 @@ def new_pixi_env(
1321
1373
  ryaml.dump(ck_info, f)
1322
1374
  repo.git.add("pixi.toml")
1323
1375
  repo.git.add("calkit.yaml")
1376
+ if not no_check:
1377
+ env_lock_fpath = check_environment(env_name=name)
1378
+ if env_lock_fpath is not None:
1379
+ repo.git.add(env_lock_fpath)
1324
1380
  if not no_commit and repo.git.diff("--staged"):
1325
1381
  repo.git.commit(["-m", f"Add pixi env {name}"])
1326
1382
 
@@ -272,6 +272,7 @@ def test_new_stage(tmp_dir):
272
272
  "tex",
273
273
  "--image",
274
274
  "texlive/texlive:latest-full",
275
+ "--no-check",
275
276
  ]
276
277
  )
277
278
  subprocess.check_call(
@@ -450,6 +451,7 @@ def test_new_python_script_stage(tmp_dir):
450
451
  "--python",
451
452
  "3.13",
452
453
  "requests",
454
+ "--no-check",
453
455
  ]
454
456
  )
455
457
  subprocess.check_call(
@@ -524,6 +526,7 @@ def test_new_latex_stage(tmp_dir):
524
526
  "tex",
525
527
  "--image",
526
528
  "texlive/texlive:latest-full",
529
+ "--no-check",
527
530
  ]
528
531
  )
529
532
  subprocess.check_call(
@@ -567,6 +570,7 @@ def test_new_matlab_script_stage(tmp_dir):
567
570
  "matlab1",
568
571
  "--image",
569
572
  "mathworks/matlab:latest",
573
+ "--no-check",
570
574
  ]
571
575
  )
572
576
  subprocess.check_call(
@@ -50,6 +50,7 @@ def test_check_env(tmp_dir, conda_env_name):
50
50
  "conda-env",
51
51
  "-n",
52
52
  ENV_NAME,
53
+ "--no-check",
53
54
  "python",
54
55
  "pip",
55
56
  "--pip",
@@ -71,6 +72,7 @@ def test_check_env(tmp_dir, conda_env_name):
71
72
  "--overwrite",
72
73
  "-n",
73
74
  ENV_NAME,
75
+ "--no-check",
74
76
  "python=3.11.0",
75
77
  "pip",
76
78
  "--pip",
@@ -94,6 +96,7 @@ def test_check_env(tmp_dir, conda_env_name):
94
96
  "--overwrite",
95
97
  "-n",
96
98
  ENV_NAME,
99
+ "--no-check",
97
100
  "python=3.11.0",
98
101
  "pip",
99
102
  "sqlalchemy",
@@ -121,6 +124,7 @@ def test_check_env(tmp_dir, conda_env_name):
121
124
  "--overwrite",
122
125
  "-n",
123
126
  ENV_NAME,
127
+ "--no-check",
124
128
  "python=3.11.0",
125
129
  "pip",
126
130
  "sqlalchemy",
@@ -136,6 +140,7 @@ def test_check_env(tmp_dir, conda_env_name):
136
140
  "--overwrite",
137
141
  "-n",
138
142
  ENV_NAME,
143
+ "--no-check",
139
144
  "python=3.11.0",
140
145
  "pip",
141
146
  "--pip",
@@ -153,6 +158,7 @@ def test_check_env(tmp_dir, conda_env_name):
153
158
  "--overwrite",
154
159
  "-n",
155
160
  ENV_NAME,
161
+ "--no-check",
156
162
  "python=3.12",
157
163
  "--pip",
158
164
  "numpy>=1",
@@ -185,6 +191,7 @@ def test_check_prefix_env(tmp_dir, conda_env_prefix):
185
191
  "python=3.12",
186
192
  "--prefix",
187
193
  conda_env_prefix,
194
+ "--no-check",
188
195
  ]
189
196
  )
190
197
  res = check_env()
@@ -1,27 +1,16 @@
1
1
  # Home
2
2
 
3
- Calkit is a language-agnostic project framework and toolkit
4
- to make your research or analytics project
5
- reproducible to the highest standard,
6
- which means:
7
-
8
- > Inputs and process definitions are provided and sufficiently described
9
- > such that anyone can easily verify that they produced the outputs
10
- > used to support the conclusions.
11
-
12
- "Easily" means that after obtaining your project files,
13
- it should only require executing a single command
14
- (like "pressing a single button" in
15
- [Claerbout and Karrenbach (1992)](https://doi.org/10.1190/1.1822162)),
16
- which should finish in less than 15 minutes
17
- (suggested by
18
- [Vandewalle et al. (2009)](https://doi.org/10.1109/MSP.2009.932122)).
19
-
20
- If the processes are too expensive to rerun in under 15 minutes,
21
- it should be possible to confirm that none of the input data
22
- or process definitions (e.g., environment specifications, scripts)
23
- have changed since saving the current versions of each output artifact
24
- (figure, table, dataset, publication, etc.)
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)).
8
+
9
+ Calkit makes this level of automation possible without extensive software
10
+ engineering expertise by providing a project framework and toolset that unifies
11
+ and simplifies the use of enabling technologies like Git,
12
+ DVC, Conda, Docker, and more,
13
+ while guiding users away from common reproducibility pitfalls.
25
14
 
26
15
  When your project is reproducible,
27
16
  you'll be able to iterate more quickly and more often,
@@ -33,14 +22,11 @@ because you'll know the code will actually run!
33
22
  This will allow others to reuse parts of your project in their own research,
34
23
  accelerating the pace of discovery.
35
24
 
36
- Working at this level of automation, discipline, and rigor may sound like
37
- a lot of effort,
38
- but Calkit makes it easy!
39
-
40
25
  ## Features
41
26
 
42
27
  - A declarative pipeline that forces users to define an environment
43
- for every stage, so "but it works on my machine" is a thing of the past.
28
+ for every stage, so long lists of instructions in a README and
29
+ "but it works on my machine" are things of the past.
44
30
  - A CLI to run the project's pipeline to verify it's reproducible,
45
31
  regenerating outputs as needed and
46
32
  ensuring all
@@ -52,7 +38,7 @@ but Calkit makes it easy!
52
38
  - A command line interface (CLI) to simplify keeping code, text, and larger
53
39
  data files backed up in the same project repo using both
54
40
  [Git](https://git-scm.com/) and [DVC](https://dvc.org/).
55
- - A complementary
41
+ - A complementary self-hostable and GitHub-integrated
56
42
  [cloud system](https://github.com/calkit/calkit-cloud)
57
43
  to facilitate backup, collaboration,
58
44
  and sharing throughout the entire research lifecycle.
File without changes
File without changes
File without changes