calkit-python 0.19.0__tar.gz → 0.19.1__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 (132) hide show
  1. {calkit_python-0.19.0 → calkit_python-0.19.1}/PKG-INFO +1 -1
  2. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/__init__.py +1 -1
  3. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/cli/main.py +10 -0
  4. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/existing-project.md +74 -28
  5. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/version-control.md +6 -1
  6. {calkit_python-0.19.0 → calkit_python-0.19.1}/.github/FUNDING.yml +0 -0
  7. {calkit_python-0.19.0 → calkit_python-0.19.1}/.github/workflows/docs.yml +0 -0
  8. {calkit_python-0.19.0 → calkit_python-0.19.1}/.github/workflows/publish-test.yml +0 -0
  9. {calkit_python-0.19.0 → calkit_python-0.19.1}/.github/workflows/publish.yml +0 -0
  10. {calkit_python-0.19.0 → calkit_python-0.19.1}/.gitignore +0 -0
  11. {calkit_python-0.19.0 → calkit_python-0.19.1}/LICENSE +0 -0
  12. {calkit_python-0.19.0 → calkit_python-0.19.1}/README.md +0 -0
  13. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/__main__.py +0 -0
  14. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/calc.py +0 -0
  15. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/check.py +0 -0
  16. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/cli/__init__.py +0 -0
  17. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/cli/check.py +0 -0
  18. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/cli/config.py +0 -0
  19. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/cli/core.py +0 -0
  20. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/cli/import_.py +0 -0
  21. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/cli/list.py +0 -0
  22. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/cli/new.py +0 -0
  23. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/cli/notebooks.py +0 -0
  24. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/cli/office.py +0 -0
  25. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/cli/update.py +0 -0
  26. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/cloud.py +0 -0
  27. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/conda.py +0 -0
  28. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/config.py +0 -0
  29. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/core.py +0 -0
  30. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/datasets.py +0 -0
  31. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/docker.py +0 -0
  32. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/dvc.py +0 -0
  33. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/git.py +0 -0
  34. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/gui.py +0 -0
  35. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/jupyter.py +0 -0
  36. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/magics.py +0 -0
  37. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/models.py +0 -0
  38. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/office.py +0 -0
  39. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/ops.py +0 -0
  40. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/server.py +0 -0
  41. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/templates/__init__.py +0 -0
  42. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/templates/core.py +0 -0
  43. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/templates/latex/__init__.py +0 -0
  44. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/templates/latex/article/paper.tex +0 -0
  45. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/templates/latex/core.py +0 -0
  46. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/templates/latex/jfm/jfm.bst +0 -0
  47. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/templates/latex/jfm/jfm.cls +0 -0
  48. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
  49. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/templates/latex/jfm/paper.tex +0 -0
  50. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/templates/latex/jfm/upmath.sty +0 -0
  51. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/tests/__init__.py +0 -0
  52. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/tests/cli/__init__.py +0 -0
  53. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/tests/cli/test_list.py +0 -0
  54. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/tests/cli/test_main.py +0 -0
  55. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/tests/cli/test_new.py +0 -0
  56. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/tests/test_calc.py +0 -0
  57. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/tests/test_check.py +0 -0
  58. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/tests/test_conda.py +0 -0
  59. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/tests/test_core.py +0 -0
  60. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/tests/test_dvc.py +0 -0
  61. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/tests/test_jupyter.py +0 -0
  62. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/tests/test_magics.py +0 -0
  63. {calkit_python-0.19.0 → calkit_python-0.19.1}/calkit/tests/test_templates.py +0 -0
  64. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/CNAME +0 -0
  65. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/apps.md +0 -0
  66. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/calculations.md +0 -0
  67. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/calkit-yaml.md +0 -0
  68. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/cli-reference.md +0 -0
  69. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/cloud-integration.md +0 -0
  70. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/datasets.md +0 -0
  71. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/environments.md +0 -0
  72. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/examples.md +0 -0
  73. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/help.md +0 -0
  74. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/img/c-to-the-k-white.svg +0 -0
  75. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/img/calkit-no-bg.png +0 -0
  76. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/index.md +0 -0
  77. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/installation.md +0 -0
  78. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/local-server.md +0 -0
  79. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/pipeline/index.md +0 -0
  80. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/pipeline/manual-steps.md +0 -0
  81. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/references.md +0 -0
  82. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/adding-latex-pub-docker.md +0 -0
  83. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/conda-envs.md +0 -0
  84. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/first-project.md +0 -0
  85. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
  86. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
  87. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
  88. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
  89. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
  90. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
  91. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
  92. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
  93. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
  94. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
  95. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/latex-codespaces/push.png +0 -0
  96. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
  97. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
  98. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/chart-more-rows.png +0 -0
  99. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/create-project.png +0 -0
  100. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
  101. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/excel-chart.png +0 -0
  102. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/excel-data.png +0 -0
  103. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
  104. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/needs-clone.png +0 -0
  105. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/new-stage.png +0 -0
  106. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
  107. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
  108. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/status-more-rows.png +0 -0
  109. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
  110. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/untracked-data.png +0 -0
  111. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/updated-publication.png +0 -0
  112. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
  113. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/office/workflow-page.png +0 -0
  114. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/openfoam/clone.png +0 -0
  115. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/openfoam/create-project.png +0 -0
  116. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
  117. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
  118. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
  119. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/openfoam/new-token.png +0 -0
  120. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/openfoam/reclone.png +0 -0
  121. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
  122. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/img/run-proc.png +0 -0
  123. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/latex-codespaces.md +0 -0
  124. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/matlab.md +0 -0
  125. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/notebook-pipeline.md +0 -0
  126. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/office.md +0 -0
  127. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/openfoam.md +0 -0
  128. {calkit_python-0.19.0 → calkit_python-0.19.1}/docs/tutorials/procedures.md +0 -0
  129. {calkit_python-0.19.0 → calkit_python-0.19.1}/mkdocs.yml +0 -0
  130. {calkit_python-0.19.0 → calkit_python-0.19.1}/pyproject.toml +0 -0
  131. {calkit_python-0.19.0 → calkit_python-0.19.1}/test/pipeline.ipynb +0 -0
  132. {calkit_python-0.19.0 → calkit_python-0.19.1}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: calkit-python
3
- Version: 0.19.0
3
+ Version: 0.19.1
4
4
  Summary: Reproducibility simplified.
5
5
  Project-URL: Homepage, https://calkit.org
6
6
  Project-URL: Issues, https://github.com/calkit/calkit/issues
@@ -1,4 +1,4 @@
1
- __version__ = "0.19.0"
1
+ __version__ = "0.19.1"
2
2
 
3
3
  from .core import *
4
4
  from . import git
@@ -536,6 +536,16 @@ def push(
536
536
  raise_error("DVC push failed")
537
537
 
538
538
 
539
+ @app.command(name="sync")
540
+ def sync(
541
+ no_check_auth: Annotated[bool, typer.Option("--no-check-auth")] = False,
542
+ ):
543
+ """Sync the project repo by pulling and then pushing."""
544
+ # TODO: Walk users through merge conflicts if they arise
545
+ pull(no_check_auth=no_check_auth)
546
+ push(no_check_auth=no_check_auth)
547
+
548
+
539
549
  @app.command(name="ignore")
540
550
  def ignore(
541
551
  path: Annotated[str, typer.Argument(help="Path to ignore.")],
@@ -39,16 +39,14 @@ If you're a grad student, you might work on a single topic throughout
39
39
  grad school, which means all of your research-related files can
40
40
  go into a single project.
41
41
  Note that we don't want to include things like coursework
42
- or personal things like your CV or transcripts.
42
+ or personal documents like your CV or transcripts.
43
43
  The folder should only include materials relevant to planning,
44
44
  performing, and publishing
45
45
  the research.
46
46
  Anything to be shared with the outside world,
47
47
  and anything required to produce those things should be included.
48
- That is,
49
- if you have a script referencing some data outside the folder,
50
- move the data into the folder and update the script accordingly.
51
- Make it all local.
48
+ If you have a script referencing some data outside this parent folder,
49
+ move the data inside and update the script accordingly.
52
50
 
53
51
  Here's an example project folder layout:
54
52
 
@@ -95,6 +93,14 @@ Here's an example project folder layout:
95
93
  It's okay if the structure doesn't match exactly.
96
94
  It's just important that everything is in there.
97
95
  You can reorganize later.
96
+ We're mainly focused on minimizing external dependencies to
97
+ improve reproducibility.
98
+ That is,
99
+ the more self-contained we can make the project,
100
+ the easier it will be to reproduce,
101
+ since getting all of those external dependencies documented properly
102
+ and setup in a different context can be
103
+ a challenge.
98
104
 
99
105
  It's a good idea to keep your library of references
100
106
  (the BibTeX file `references.bib` in the example above)
@@ -106,10 +112,9 @@ or a reference collection in an app like Zotero.
106
112
  Similarly,
107
113
  if you have files in cloud services like Dropbox or Overleaf,
108
114
  download all of them to the project folder.
109
- Locality helps keep things simple and reduce external dependencies.
110
115
  This project folder should be the single source of truth.
111
- You can potentially work on things in other tools,
112
- and if so,
116
+ You can work on materials in other tools,
117
+ but if so,
113
118
  the files should always be downloaded back to the main project folder.
114
119
 
115
120
  !!! tip
@@ -137,8 +142,9 @@ the files should always be downloaded back to the main project folder.
137
142
 
138
143
  ## Create/initialize the project
139
144
 
140
- Inside the project folder, i.e., after calling `cd my-phd-research`,
141
- create a new Calkit project inside with:
145
+ With a terminal open inside the project folder
146
+ (`my-phd-research` in the example above),
147
+ initialize it as a new Calkit project with:
142
148
 
143
149
  ```sh
144
150
  calkit new project . \
@@ -151,7 +157,7 @@ calkit new project . \
151
157
  In this command, the `.` means the current working directory,
152
158
  or "here."
153
159
  The name, title, and description should be adapted to your own
154
- project.
160
+ project of course.
155
161
  The name should be "kebab-case" (all lowercase with hyphens separating words),
156
162
  the title should be sentence or title case,
157
163
  and the description should include punctuation,
@@ -318,7 +324,8 @@ Pushing
318
324
 
319
325
  Now that we have all of our files in version control,
320
326
  we need to ensure that our output artifacts like derived datasets,
321
- figures, and publication PDFs are generated with the pipeline.
327
+ figures, and publication PDFs are generated with
328
+ [the pipeline](../pipeline/index.md).
322
329
  This will ensure that they stay up to date if any of their
323
330
  input data or dependencies change.
324
331
 
@@ -346,13 +353,18 @@ In the command above we're specifying two packages to exist in the environment,
346
353
  `pandas` and `matplotlib`.
347
354
  However, you may have many more than this.
348
355
  You can add them to the command or add them to the resulting
349
- environment definition file later.
356
+ environment definition file
357
+ (`environment.yml` by default for Conda environments) later.
350
358
  If you prefer Python's built-in `venv` module to manage your environment,
351
359
  you can replace `conda-env` with `venv`,
352
360
  and similarly, if you prefer `uv`, you can replace it with `uv-venv`.
353
361
 
362
+ After an environment is created,
363
+ it will be stored in the `environments` section of the `calkit.yaml` file.
364
+ It can also be modified (or removed) by editing that file.
365
+
354
366
  If you have multiple Python scripts that require different,
355
- possibly conflicting sets of package,
367
+ possibly conflicting sets of packages,
356
368
  you can simply create multiple environments and name them descriptively.
357
369
  For example, instead of one environment called `py`,
358
370
  you can create one called `processing` and one called `plotting`.
@@ -369,9 +381,12 @@ We can create a Docker environment called `tex` for these with:
369
381
  calkit new docker-env --name tex --image texlive/texlive:latest-full
370
382
  ```
371
383
 
384
+ This environment is referencing a TeXLive Docker image from Docker Hub,
385
+ which requires [Docker](https://docker.com) to be installed,
386
+ but will not require a separate LaTeX distribution to be installed.
372
387
  If you don't need the full TeXLive distribution, you can
373
388
  select any other image you'd like from
374
- [this list on Docker Hub](https://hub.docker.com/r/texlive/texlive/tags).
389
+ [this list](https://hub.docker.com/r/texlive/texlive/tags).
375
390
 
376
391
  ### Add pipeline stages
377
392
 
@@ -393,7 +408,28 @@ calkit new stage \
393
408
  --out data/processed
394
409
  ```
395
410
 
396
- Then plotting:
411
+ This will add a stage to the `dvc.yaml` file that looks like:
412
+
413
+ ```yaml
414
+ stages:
415
+ process-data:
416
+ cmd: calkit xenv -n py -- python scripts/process.py
417
+ deps:
418
+ - data/raw
419
+ - environment.yml
420
+ - scripts/process.py
421
+ outs:
422
+ - data/processed
423
+ ```
424
+
425
+ This stage can also be modified later, e.g.,
426
+ if there end up being additional dependencies
427
+ (files or folders which if changed, require the script to be rerun).
428
+ See the
429
+ [DVC documentation](https://dvc.org/doc/user-guide/pipelines/defining-pipelines#stages)
430
+ for more information about defining pipeline stages.
431
+
432
+ Next, create a stage for plotting:
397
433
 
398
434
  ```sh
399
435
  calkit new stage \
@@ -406,7 +442,7 @@ calkit new stage \
406
442
  --out figures
407
443
  ```
408
444
 
409
- Now add stages to build our LaTeX documents:
445
+ Then add stages to build our LaTeX documents:
410
446
 
411
447
  ```sh
412
448
  calkit new stage \
@@ -440,7 +476,7 @@ calkit run
440
476
  ```
441
477
 
442
478
  If there are no errors,
443
- we can commit the outputs and push them up to the cloud with:
479
+ we can commit the outputs and push them up to the cloud with `calkit save`:
444
480
 
445
481
  ```sh
446
482
  calkit save -am "Run pipeline"
@@ -456,6 +492,8 @@ users can run `calkit import dataset` in their own project to reuse
456
492
  one of yours,
457
493
  and your project will be listed as the source in that project's
458
494
  `calkit.yaml` file.
495
+ See the [FAIR principles](https://www.go-fair.org/fair-principles/)
496
+ to learn more about why this is important.
459
497
 
460
498
  Note that when they are ready for public consumption,
461
499
  we can create a "release" that will archive these materials
@@ -463,9 +501,9 @@ to a service like
463
501
  Figshare, Zenodo, or OSF, and give them a
464
502
  digital object identifier (DOI) for citation and traceability.
465
503
  It's a good idea to create a release of the project before submitting
466
- a journal article and citing inside,
504
+ a journal article and to cite it therein,
467
505
  so readers can find their way back to the project and inspect how
468
- things were created.
506
+ the materials were created.
469
507
 
470
508
  Let's go ahead an add our raw and processed datasets to `calkit.yaml`:
471
509
 
@@ -482,7 +520,7 @@ or definitions for the columns,
482
520
  but at the very least we need to define a path and title.
483
521
 
484
522
  Next, add the figures to `calkit.yaml`.
485
- This will make them show up on the figures section of the project homepage
523
+ This will make them show up in the figures section of the project homepage
486
524
  on [calkit.io](https://calkit.io).
487
525
 
488
526
  ```yaml
@@ -522,7 +560,7 @@ publications:
522
560
  stage: build-thesis
523
561
  ```
524
562
 
525
- Commit and push these changes with:
563
+ We can then commit and push the changes to `calkit.yaml` with:
526
564
 
527
565
  ```sh
528
566
  calkit save calkit.yaml -m "Add artifacts to calkit.yaml"
@@ -531,20 +569,28 @@ calkit save calkit.yaml -m "Add artifacts to calkit.yaml"
531
569
  ## Next steps
532
570
 
533
571
  Now that our project is fully version-controlled and reproducible,
534
- maybe we have some new figures to generate,
572
+ we have a solid baseline to return to if anything breaks
573
+ due to future changes.
574
+ Maybe we have some new figures to generate,
535
575
  or maybe we have a new idea for a derived dataset we can create.
536
576
  A good way to go about doing this is to create a scratch script or notebook,
537
577
  ignoring it with `calkit ignore`,
538
- prototyping in there,
578
+ prototyping in that scratch space,
539
579
  and moving any valuable code out into a version-controlled script once it
540
580
  works the way you want it to.
541
581
 
542
- Then, add a new pipeline stage to run that script with `calkit new stage`.
582
+ After producing a new working script,
583
+ add a new pipeline stage to run that script with `calkit new stage`.
543
584
  If you need a different environment, you can create one,
544
- or you can update an existing environment by editing its definition file,
545
- e.g., `environment.yml` for a Conda environment.
585
+ or you can update an existing environment by editing its definition file.
546
586
  If you execute `calkit run` again, only the stages that are missing outputs
547
- or have updated dependencies will change.
587
+ or have updated dependencies will be executed,
588
+ ensuring the project remains reproducible as efficiently as possible.
589
+ If you continue to commit all changes along the way,
590
+ you'll always be able to get back to something that works
591
+ if something goes wrong,
592
+ sort of like climbing with a safety harness,
593
+ clipping it onto higher and higher anchors as you ascend.
548
594
 
549
595
  ## Questions or comments?
550
596
 
@@ -134,7 +134,7 @@ calkit clone petebachant/strava-analysis
134
134
  `calkit status` will show the combined status from both Git and DVC.
135
135
  For example:
136
136
 
137
- ```
137
+ ```sh
138
138
  $ calkit status
139
139
  --------------------------- Code (Git) ---------------------------
140
140
  On branch main
@@ -165,6 +165,11 @@ Options:
165
165
  prompted for one.
166
166
  - `--no-push`: Do not push after committing.
167
167
 
168
+ ### `sync`
169
+
170
+ `calkit sync` will pull from then push to the cloud,
171
+ ensuring both copies are in sync.
172
+
168
173
  ### `add`
169
174
 
170
175
  `calkit add` will add a file to the repo "staging area,"
File without changes
File without changes
File without changes