calkit-python 0.28.0__tar.gz → 0.28.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 (175) hide show
  1. {calkit_python-0.28.0 → calkit_python-0.28.1}/PKG-INFO +1 -1
  2. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/__init__.py +1 -1
  3. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/cli/list.py +2 -0
  4. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/cli/main.py +5 -5
  5. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/models/pipeline.py +14 -0
  6. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/models/test_pipeline.py +10 -0
  7. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/pipeline/index.md +4 -0
  8. {calkit_python-0.28.0 → calkit_python-0.28.1}/.github/FUNDING.yml +0 -0
  9. {calkit_python-0.28.0 → calkit_python-0.28.1}/.github/workflows/docs.yml +0 -0
  10. {calkit_python-0.28.0 → calkit_python-0.28.1}/.github/workflows/format.yml +0 -0
  11. {calkit_python-0.28.0 → calkit_python-0.28.1}/.github/workflows/publish-test.yml +0 -0
  12. {calkit_python-0.28.0 → calkit_python-0.28.1}/.github/workflows/publish.yml +0 -0
  13. {calkit_python-0.28.0 → calkit_python-0.28.1}/.github/workflows/test.yml +0 -0
  14. {calkit_python-0.28.0 → calkit_python-0.28.1}/.gitignore +0 -0
  15. {calkit_python-0.28.0 → calkit_python-0.28.1}/.pre-commit-config.yaml +0 -0
  16. {calkit_python-0.28.0 → calkit_python-0.28.1}/.python-version +0 -0
  17. {calkit_python-0.28.0 → calkit_python-0.28.1}/CITATION.cff +0 -0
  18. {calkit_python-0.28.0 → calkit_python-0.28.1}/CONTRIBUTING.md +0 -0
  19. {calkit_python-0.28.0 → calkit_python-0.28.1}/LICENSE +0 -0
  20. {calkit_python-0.28.0 → calkit_python-0.28.1}/Makefile +0 -0
  21. {calkit_python-0.28.0 → calkit_python-0.28.1}/README.md +0 -0
  22. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/__main__.py +0 -0
  23. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/calc.py +0 -0
  24. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/check.py +0 -0
  25. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/cli/__init__.py +0 -0
  26. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/cli/check.py +0 -0
  27. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/cli/cloud.py +0 -0
  28. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/cli/config.py +0 -0
  29. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/cli/core.py +0 -0
  30. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/cli/describe.py +0 -0
  31. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/cli/import_.py +0 -0
  32. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/cli/new.py +0 -0
  33. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/cli/notebooks.py +0 -0
  34. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/cli/office.py +0 -0
  35. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/cli/overleaf.py +0 -0
  36. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/cli/update.py +0 -0
  37. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/cloud.py +0 -0
  38. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/conda.py +0 -0
  39. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/config.py +0 -0
  40. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/core.py +0 -0
  41. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/datasets.py +0 -0
  42. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/docker.py +0 -0
  43. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/dvc.py +0 -0
  44. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/environments.py +0 -0
  45. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/git.py +0 -0
  46. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/github.py +0 -0
  47. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/gui.py +0 -0
  48. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/jupyter.py +0 -0
  49. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/magics.py +0 -0
  50. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/matlab.py +0 -0
  51. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/models/__init__.py +0 -0
  52. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/models/core.py +0 -0
  53. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/models/io.py +0 -0
  54. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/models/iteration.py +0 -0
  55. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/notebooks.py +0 -0
  56. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/office.py +0 -0
  57. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/ops.py +0 -0
  58. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/pipeline.py +0 -0
  59. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/releases.py +0 -0
  60. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/server.py +0 -0
  61. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/templates/__init__.py +0 -0
  62. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/templates/core.py +0 -0
  63. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/templates/latex/__init__.py +0 -0
  64. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/templates/latex/article/paper.tex +0 -0
  65. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/templates/latex/core.py +0 -0
  66. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/templates/latex/jfm/jfm.bst +0 -0
  67. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/templates/latex/jfm/jfm.cls +0 -0
  68. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
  69. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/templates/latex/jfm/paper.tex +0 -0
  70. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/templates/latex/jfm/upmath.sty +0 -0
  71. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/__init__.py +0 -0
  72. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/cli/__init__.py +0 -0
  73. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/cli/test_check.py +0 -0
  74. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/cli/test_config.py +0 -0
  75. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/cli/test_list.py +0 -0
  76. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/cli/test_main.py +0 -0
  77. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/cli/test_new.py +0 -0
  78. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/cli/test_notebooks.py +0 -0
  79. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/models/__init__.py +0 -0
  80. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/models/test_iteration.py +0 -0
  81. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/test_calc.py +0 -0
  82. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/test_check.py +0 -0
  83. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/test_conda.py +0 -0
  84. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/test_core.py +0 -0
  85. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/test_dvc.py +0 -0
  86. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/test_jupyter.py +0 -0
  87. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/test_magics.py +0 -0
  88. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/test_notebooks.py +0 -0
  89. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/test_pipeline.py +0 -0
  90. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/tests/test_templates.py +0 -0
  91. {calkit_python-0.28.0 → calkit_python-0.28.1}/calkit/zenodo.py +0 -0
  92. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/CNAME +0 -0
  93. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/apps.md +0 -0
  94. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/calculations.md +0 -0
  95. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/calkit-yaml.md +0 -0
  96. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/cli-reference.md +0 -0
  97. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/cloud-integration.md +0 -0
  98. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/datasets.md +0 -0
  99. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/dependencies.md +0 -0
  100. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/environments.md +0 -0
  101. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/examples.md +0 -0
  102. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/help.md +0 -0
  103. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/img/c-to-the-k-white.svg +0 -0
  104. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/img/calkit-no-bg.png +0 -0
  105. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/img/connect-zenodo.png +0 -0
  106. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/img/jupyterlab-params.png +0 -0
  107. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/img/vscode-nb-params.png +0 -0
  108. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/index.md +0 -0
  109. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/installation.md +0 -0
  110. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/local-server.md +0 -0
  111. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/notebooks.md +0 -0
  112. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/overleaf.md +0 -0
  113. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/pipeline/manual-steps.md +0 -0
  114. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/pipeline/running-and-logging.md +0 -0
  115. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/quickstart.md +0 -0
  116. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/references.md +0 -0
  117. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/releases.md +0 -0
  118. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/adding-latex-pub-docker.md +0 -0
  119. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/conda-envs.md +0 -0
  120. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/existing-project.md +0 -0
  121. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/first-project.md +0 -0
  122. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
  123. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
  124. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
  125. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
  126. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
  127. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
  128. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
  129. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
  130. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
  131. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
  132. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/latex-codespaces/push.png +0 -0
  133. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
  134. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
  135. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/chart-more-rows.png +0 -0
  136. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/create-project.png +0 -0
  137. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
  138. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/excel-chart.png +0 -0
  139. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/excel-data.png +0 -0
  140. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
  141. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/needs-clone.png +0 -0
  142. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/new-stage.png +0 -0
  143. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
  144. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
  145. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/status-more-rows.png +0 -0
  146. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
  147. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/untracked-data.png +0 -0
  148. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/updated-publication.png +0 -0
  149. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
  150. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/office/workflow-page.png +0 -0
  151. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/openfoam/clone.png +0 -0
  152. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/openfoam/create-project.png +0 -0
  153. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
  154. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
  155. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
  156. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/openfoam/new-token.png +0 -0
  157. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/openfoam/reclone.png +0 -0
  158. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
  159. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/img/run-proc.png +0 -0
  160. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/index.md +0 -0
  161. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/latex-codespaces.md +0 -0
  162. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/matlab.md +0 -0
  163. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/notebook-pipeline.md +0 -0
  164. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/office.md +0 -0
  165. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/openfoam.md +0 -0
  166. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/tutorials/procedures.md +0 -0
  167. {calkit_python-0.28.0 → calkit_python-0.28.1}/docs/version-control.md +0 -0
  168. {calkit_python-0.28.0 → calkit_python-0.28.1}/mkdocs.yml +0 -0
  169. {calkit_python-0.28.0 → calkit_python-0.28.1}/pyproject.toml +0 -0
  170. {calkit_python-0.28.0 → calkit_python-0.28.1}/scripts/install.ps1 +0 -0
  171. {calkit_python-0.28.0 → calkit_python-0.28.1}/scripts/install.sh +0 -0
  172. {calkit_python-0.28.0 → calkit_python-0.28.1}/test/nb-subdir.ipynb +0 -0
  173. {calkit_python-0.28.0 → calkit_python-0.28.1}/test/pipeline.ipynb +0 -0
  174. {calkit_python-0.28.0 → calkit_python-0.28.1}/test/test-log.log +0 -0
  175. {calkit_python-0.28.0 → calkit_python-0.28.1}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: calkit-python
3
- Version: 0.28.0
3
+ Version: 0.28.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.28.0"
1
+ __version__ = "0.28.1"
2
2
 
3
3
  from .core import * # noqa: F403, I001
4
4
  from . import git # noqa: F401
@@ -71,7 +71,9 @@ def list_references():
71
71
 
72
72
 
73
73
  @list_app.command(name="environments")
74
+ @list_app.command(name="envs")
74
75
  def list_environments():
76
+ """List environments in the project."""
75
77
  envs = calkit.load_calkit_info().get("environments", {})
76
78
  for name, env in envs.items():
77
79
  typer.echo(name + ":")
@@ -931,9 +931,9 @@ def run(
931
931
  no_run_cache: Annotated[
932
932
  bool, typer.Option("--no-run-cache", help="Ignore the run cache.")
933
933
  ] = False,
934
- no_log: Annotated[
934
+ save_log: Annotated[
935
935
  bool,
936
- typer.Option("--no-log", "-l", help="Do not log the run."),
936
+ typer.Option("--log", "-l", help="Log the run."),
937
937
  ] = False,
938
938
  save_after_run: Annotated[
939
939
  bool,
@@ -952,7 +952,7 @@ def run(
952
952
  if not quiet:
953
953
  typer.echo("Getting system information")
954
954
  system_info = calkit.get_system_info()
955
- if not no_log:
955
+ if save_log:
956
956
  # Save the system to .calkit/systems
957
957
  if verbose:
958
958
  typer.echo("Saving system information:")
@@ -1027,7 +1027,7 @@ def run(
1027
1027
  start_time_no_tz = calkit.utcnow(remove_tz=True)
1028
1028
  start_time = calkit.utcnow(remove_tz=False)
1029
1029
  run_id = uuid.uuid4().hex
1030
- if not no_log:
1030
+ if save_log:
1031
1031
  log_fpath = os.path.join(
1032
1032
  ".calkit",
1033
1033
  "logs",
@@ -1055,7 +1055,7 @@ def run(
1055
1055
  dvc.ui.ui.write = lambda *args, **kwargs: None
1056
1056
  res = dvc_cli_main(["repro"] + args)
1057
1057
  failed = res != 0
1058
- if not no_log:
1058
+ if save_log:
1059
1059
  # Get Git status after running
1060
1060
  git_changed_files_after = calkit.git.get_changed_files(repo=repo)
1061
1061
  git_staged_files_after = calkit.git.get_staged_files(repo=repo)
@@ -110,6 +110,7 @@ class Stage(BaseModel):
110
110
  "jupyter-notebook",
111
111
  "r-script",
112
112
  "julia-script",
113
+ "julia-command",
113
114
  "word-to-pdf",
114
115
  ]
115
116
  environment: str
@@ -325,6 +326,18 @@ class JuliaScriptStage(Stage):
325
326
  return [self.script_path] + super().dvc_deps
326
327
 
327
328
 
329
+ class JuliaCommandStage(Stage):
330
+ kind: Literal["julia-command"] = "julia-command"
331
+ command: str
332
+
333
+ @property
334
+ def dvc_cmd(self) -> str:
335
+ # We need to escape quotes in the command
336
+ julia_cmd = self.command.replace('"', '\\"')
337
+ cmd = f'{self.xenv_cmd} -- "{julia_cmd}"'
338
+ return cmd
339
+
340
+
328
341
  class JupyterNotebookStage(Stage):
329
342
  """A stage that runs a Jupyter notebook.
330
343
 
@@ -483,6 +496,7 @@ class Pipeline(BaseModel):
483
496
  | WordToPdfStage
484
497
  | JupyterNotebookStage
485
498
  | JuliaScriptStage
499
+ | JuliaCommandStage
486
500
  ),
487
501
  Discriminator("kind"),
488
502
  ],
@@ -4,6 +4,7 @@ import pytest
4
4
  from pydantic import ValidationError
5
5
 
6
6
  from calkit.models.pipeline import (
7
+ JuliaCommandStage,
7
8
  JupyterNotebookStage,
8
9
  LatexStage,
9
10
  PythonScriptStage,
@@ -119,3 +120,12 @@ def test_stageiteration():
119
120
  i.values
120
121
  exp_vals = i.expand_values(params={})
121
122
  assert exp_vals == [{"param1": 1, "param2": 2}, {"param1": 3, "param2": 4}]
123
+
124
+
125
+ def test_juliacommandstage():
126
+ s = JuliaCommandStage(environment="j1", command='println("sup")')
127
+ sd = s.to_dvc()
128
+ print(sd)
129
+ assert sd["cmd"] == (
130
+ 'calkit xenv -n j1 --no-check -- "println(\\"sup\\")"'
131
+ )
@@ -86,6 +86,10 @@ For more details, see `calkit.models.pipeline`.
86
86
 
87
87
  - `script_path`
88
88
 
89
+ ### `julia-command`
90
+
91
+ - `command`
92
+
89
93
  ## Iteration
90
94
 
91
95
  ### Over a list of values
File without changes
File without changes
File without changes
File without changes