calkit-python 0.26.3__tar.gz → 0.26.5__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 (166) hide show
  1. {calkit_python-0.26.3 → calkit_python-0.26.5}/PKG-INFO +1 -1
  2. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/__init__.py +1 -1
  3. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/cli/check.py +18 -3
  4. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/cli/main.py +18 -11
  5. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/cli/new.py +5 -0
  6. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/conda.py +15 -3
  7. calkit_python-0.26.5/calkit/tests/cli/test_check.py +45 -0
  8. {calkit_python-0.26.3 → calkit_python-0.26.5}/.github/FUNDING.yml +0 -0
  9. {calkit_python-0.26.3 → calkit_python-0.26.5}/.github/workflows/docs.yml +0 -0
  10. {calkit_python-0.26.3 → calkit_python-0.26.5}/.github/workflows/format.yml +0 -0
  11. {calkit_python-0.26.3 → calkit_python-0.26.5}/.github/workflows/publish-test.yml +0 -0
  12. {calkit_python-0.26.3 → calkit_python-0.26.5}/.github/workflows/publish.yml +0 -0
  13. {calkit_python-0.26.3 → calkit_python-0.26.5}/.github/workflows/test.yml +0 -0
  14. {calkit_python-0.26.3 → calkit_python-0.26.5}/.gitignore +0 -0
  15. {calkit_python-0.26.3 → calkit_python-0.26.5}/.pre-commit-config.yaml +0 -0
  16. {calkit_python-0.26.3 → calkit_python-0.26.5}/.python-version +0 -0
  17. {calkit_python-0.26.3 → calkit_python-0.26.5}/CONTRIBUTING.md +0 -0
  18. {calkit_python-0.26.3 → calkit_python-0.26.5}/LICENSE +0 -0
  19. {calkit_python-0.26.3 → calkit_python-0.26.5}/Makefile +0 -0
  20. {calkit_python-0.26.3 → calkit_python-0.26.5}/README.md +0 -0
  21. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/__main__.py +0 -0
  22. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/calc.py +0 -0
  23. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/check.py +0 -0
  24. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/cli/__init__.py +0 -0
  25. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/cli/cloud.py +0 -0
  26. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/cli/config.py +0 -0
  27. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/cli/core.py +0 -0
  28. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/cli/describe.py +0 -0
  29. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/cli/import_.py +0 -0
  30. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/cli/list.py +0 -0
  31. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/cli/notebooks.py +0 -0
  32. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/cli/office.py +0 -0
  33. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/cli/overleaf.py +0 -0
  34. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/cli/update.py +0 -0
  35. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/cloud.py +0 -0
  36. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/config.py +0 -0
  37. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/core.py +0 -0
  38. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/datasets.py +0 -0
  39. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/docker.py +0 -0
  40. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/dvc.py +0 -0
  41. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/environments.py +0 -0
  42. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/git.py +0 -0
  43. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/github.py +0 -0
  44. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/gui.py +0 -0
  45. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/jupyter.py +0 -0
  46. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/magics.py +0 -0
  47. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/matlab.py +0 -0
  48. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/models/__init__.py +0 -0
  49. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/models/core.py +0 -0
  50. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/models/io.py +0 -0
  51. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/models/iteration.py +0 -0
  52. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/models/pipeline.py +0 -0
  53. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/notebooks.py +0 -0
  54. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/office.py +0 -0
  55. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/ops.py +0 -0
  56. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/pipeline.py +0 -0
  57. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/releases.py +0 -0
  58. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/server.py +0 -0
  59. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/templates/__init__.py +0 -0
  60. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/templates/core.py +0 -0
  61. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/templates/latex/__init__.py +0 -0
  62. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/templates/latex/article/paper.tex +0 -0
  63. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/templates/latex/core.py +0 -0
  64. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/templates/latex/jfm/jfm.bst +0 -0
  65. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/templates/latex/jfm/jfm.cls +0 -0
  66. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
  67. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/templates/latex/jfm/paper.tex +0 -0
  68. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/templates/latex/jfm/upmath.sty +0 -0
  69. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/__init__.py +0 -0
  70. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/cli/__init__.py +0 -0
  71. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/cli/test_config.py +0 -0
  72. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/cli/test_list.py +0 -0
  73. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/cli/test_main.py +0 -0
  74. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/cli/test_new.py +0 -0
  75. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/models/__init__.py +0 -0
  76. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/models/test_pipeline.py +0 -0
  77. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/test_calc.py +0 -0
  78. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/test_check.py +0 -0
  79. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/test_conda.py +0 -0
  80. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/test_core.py +0 -0
  81. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/test_dvc.py +0 -0
  82. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/test_jupyter.py +0 -0
  83. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/test_magics.py +0 -0
  84. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/test_notebooks.py +0 -0
  85. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/test_pipeline.py +0 -0
  86. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/tests/test_templates.py +0 -0
  87. {calkit_python-0.26.3 → calkit_python-0.26.5}/calkit/zenodo.py +0 -0
  88. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/CNAME +0 -0
  89. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/apps.md +0 -0
  90. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/calculations.md +0 -0
  91. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/calkit-yaml.md +0 -0
  92. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/cli-reference.md +0 -0
  93. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/cloud-integration.md +0 -0
  94. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/datasets.md +0 -0
  95. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/dependencies.md +0 -0
  96. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/environments.md +0 -0
  97. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/examples.md +0 -0
  98. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/help.md +0 -0
  99. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/img/c-to-the-k-white.svg +0 -0
  100. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/img/calkit-no-bg.png +0 -0
  101. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/img/connect-zenodo.png +0 -0
  102. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/index.md +0 -0
  103. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/installation.md +0 -0
  104. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/local-server.md +0 -0
  105. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/notebooks.md +0 -0
  106. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/overleaf.md +0 -0
  107. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/pipeline/index.md +0 -0
  108. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/pipeline/manual-steps.md +0 -0
  109. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/pipeline/running-and-logging.md +0 -0
  110. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/references.md +0 -0
  111. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/releases.md +0 -0
  112. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/adding-latex-pub-docker.md +0 -0
  113. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/conda-envs.md +0 -0
  114. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/existing-project.md +0 -0
  115. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/first-project.md +0 -0
  116. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
  117. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
  118. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
  119. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
  120. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
  121. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
  122. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
  123. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
  124. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
  125. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
  126. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/latex-codespaces/push.png +0 -0
  127. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
  128. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
  129. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/chart-more-rows.png +0 -0
  130. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/create-project.png +0 -0
  131. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
  132. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/excel-chart.png +0 -0
  133. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/excel-data.png +0 -0
  134. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
  135. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/needs-clone.png +0 -0
  136. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/new-stage.png +0 -0
  137. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
  138. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
  139. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/status-more-rows.png +0 -0
  140. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
  141. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/untracked-data.png +0 -0
  142. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/updated-publication.png +0 -0
  143. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
  144. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/office/workflow-page.png +0 -0
  145. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/openfoam/clone.png +0 -0
  146. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/openfoam/create-project.png +0 -0
  147. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
  148. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
  149. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
  150. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/openfoam/new-token.png +0 -0
  151. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/openfoam/reclone.png +0 -0
  152. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
  153. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/img/run-proc.png +0 -0
  154. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/index.md +0 -0
  155. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/latex-codespaces.md +0 -0
  156. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/matlab.md +0 -0
  157. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/notebook-pipeline.md +0 -0
  158. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/office.md +0 -0
  159. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/openfoam.md +0 -0
  160. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/tutorials/procedures.md +0 -0
  161. {calkit_python-0.26.3 → calkit_python-0.26.5}/docs/version-control.md +0 -0
  162. {calkit_python-0.26.3 → calkit_python-0.26.5}/mkdocs.yml +0 -0
  163. {calkit_python-0.26.3 → calkit_python-0.26.5}/pyproject.toml +0 -0
  164. {calkit_python-0.26.3 → calkit_python-0.26.5}/test/pipeline.ipynb +0 -0
  165. {calkit_python-0.26.3 → calkit_python-0.26.5}/test/test-log.log +0 -0
  166. {calkit_python-0.26.3 → calkit_python-0.26.5}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: calkit-python
3
- Version: 0.26.3
3
+ Version: 0.26.5
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.26.3"
1
+ __version__ = "0.26.5"
2
2
 
3
3
  from .core import * # noqa: F403, I001
4
4
  from . import git # noqa: F401
@@ -26,7 +26,7 @@ import calkit
26
26
  import calkit.matlab
27
27
  import calkit.pipeline
28
28
  from calkit.check import check_reproducibility
29
- from calkit.cli import raise_error
29
+ from calkit.cli import raise_error, warn
30
30
 
31
31
  check_app = typer.Typer(no_args_is_help=True)
32
32
 
@@ -466,9 +466,13 @@ def check_venv(
466
466
  lock_dir = os.path.dirname(lock_fpath)
467
467
  if lock_dir:
468
468
  os.makedirs(lock_dir, exist_ok=True)
469
+ # If the lock file exists, try to install with that
470
+ dep_file_txt = f"-r {path}"
471
+ if os.path.isfile(lock_fpath):
472
+ dep_file_txt += f" -r {lock_fpath}"
469
473
  check_cmd = (
470
474
  f"{activate_cmd} "
471
- f"&& {pip_cmd} install {pip_install_args} -r {path} "
475
+ f"&& {pip_cmd} install {pip_install_args} {dep_file_txt} "
472
476
  f"&& {pip_freeze_cmd} > {lock_fpath} "
473
477
  "&& deactivate"
474
478
  )
@@ -482,7 +486,18 @@ def check_venv(
482
486
  stderr=subprocess.STDOUT if not verbose else None,
483
487
  )
484
488
  except subprocess.CalledProcessError:
485
- raise_error(f"Failed to check {kind}")
489
+ warn("Failed to create environment from lock file; attempting rebuild")
490
+ check_cmd = (
491
+ f"{activate_cmd} "
492
+ f"&& {pip_cmd} install {pip_install_args} -r {path} "
493
+ f"&& {pip_freeze_cmd} > {lock_fpath} "
494
+ "&& deactivate"
495
+ )
496
+ # Try again and don't capture output
497
+ try:
498
+ subprocess.run(check_cmd, shell=True, cwd=wdir, check=True)
499
+ except subprocess.CalledProcessError:
500
+ raise_error(f"Failed to check {kind}")
486
501
 
487
502
 
488
503
  @check_app.command(name="matlab-env")
@@ -874,7 +874,7 @@ def run(
874
874
  ] = False,
875
875
  no_log: Annotated[
876
876
  bool,
877
- typer.Option("--no-log", help="Do not log the run."),
877
+ typer.Option("--no-log", "-l", help="Do not log the run."),
878
878
  ] = False,
879
879
  save_after_run: Annotated[
880
880
  bool,
@@ -893,16 +893,17 @@ def run(
893
893
  if not quiet:
894
894
  typer.echo("Getting system information")
895
895
  system_info = calkit.get_system_info()
896
- # Save the system to .calkit/systems
897
- if verbose:
898
- typer.echo("Saving system information:")
899
- typer.echo(system_info)
900
- sysinfo_fpath = os.path.join(
901
- ".calkit", "systems", system_info["id"] + ".json"
902
- )
903
- os.makedirs(os.path.dirname(sysinfo_fpath), exist_ok=True)
904
- with open(sysinfo_fpath, "w") as f:
905
- json.dump(system_info, f, indent=2)
896
+ if not no_log:
897
+ # Save the system to .calkit/systems
898
+ if verbose:
899
+ typer.echo("Saving system information:")
900
+ typer.echo(system_info)
901
+ sysinfo_fpath = os.path.join(
902
+ ".calkit", "systems", system_info["id"] + ".json"
903
+ )
904
+ os.makedirs(os.path.dirname(sysinfo_fpath), exist_ok=True)
905
+ with open(sysinfo_fpath, "w") as f:
906
+ json.dump(system_info, f, indent=2)
906
907
  # First check any system-level dependencies exist
907
908
  if not quiet:
908
909
  typer.echo("Checking system-level dependencies")
@@ -1189,6 +1190,12 @@ def run_in_env(
1189
1190
  ),
1190
1191
  platform=env.get("platform"),
1191
1192
  deps=env.get("deps", []),
1193
+ env_vars=env.get("env_vars", []),
1194
+ ports=env.get("ports", []),
1195
+ gpus=env.get("gpus"),
1196
+ user=env.get("user"),
1197
+ wdir=env.get("wdir"),
1198
+ args=env.get("args", []),
1192
1199
  quiet=not verbose,
1193
1200
  )
1194
1201
  shell_cmd = _to_shell_cmd(cmd)
@@ -133,6 +133,11 @@ def new_project(
133
133
  raise_error(
134
134
  f"Could not detect Git repo URL from existing repo: {e}"
135
135
  )
136
+ # We don't have a project name but do have a Git repo URL, the
137
+ # project name will be the Git repo name lowercased, since that's
138
+ # how the Calkit Cloud will create the project name by default
139
+ if name is None and git_repo_url is not None:
140
+ name = git_repo_url.split("/")[-1].lower()
136
141
  # If this isn't a DVC repo, run `dvc init`
137
142
  if not os.path.isfile(os.path.join(abs_path, ".dvc", "config")):
138
143
  typer.echo("Initializing DVC repository")
@@ -17,9 +17,21 @@ from calkit import ryaml
17
17
 
18
18
 
19
19
  def _check_single(req: str, actual: str, conda: bool = False) -> bool:
20
- """Helper function for checking actual versions against requirements."""
21
- req_name = re.split("[=<>]", req)[0]
22
- req_spec = req.removeprefix(req_name)
20
+ """Helper function for checking actual versions against requirements.
21
+
22
+ Note that this also doesn't check optional dependencies.
23
+ """
24
+ # If this is a Git version, we can't check it
25
+ # TODO: Clone Git repos to check?
26
+ if "@git" in req:
27
+ warnings.warn(f"Cannot check Git version for {req}")
28
+ req = req.split("@git")[0]
29
+ req_name = re.split("[=<>]", req)[0].strip()
30
+ req_spec = req.removeprefix(req_name).strip().replace(" ", "")
31
+ if "[" in req_name:
32
+ warnings.warn(f"Cannot check optional dependencies for {req_name}")
33
+ # Remove optional dependencies
34
+ req_name = req_name.split("[")[0].strip()
23
35
  if conda and req_spec.startswith("="):
24
36
  req_spec = "=" + req_spec
25
37
  if not req_spec.endswith(".*"):
@@ -0,0 +1,45 @@
1
+ """Tests for ``calkit.cli.check``."""
2
+
3
+ import shutil
4
+ import subprocess
5
+
6
+
7
+ def test_check_venv(tmp_dir):
8
+ with open("reqs.txt", "w") as f:
9
+ f.write("requests")
10
+ subprocess.check_call(
11
+ ["calkit", "check", "venv", "reqs.txt", "-o", "lock.txt"]
12
+ )
13
+ # Now check that we can install from the lock file
14
+ shutil.rmtree(".venv")
15
+ subprocess.check_call(
16
+ ["calkit", "check", "venv", "reqs.txt", "-o", "lock.txt"]
17
+ )
18
+ with open("lock.txt") as f:
19
+ lock_txt = f.read()
20
+ # Now check that if we add a requirement, the env is rebuilt
21
+ assert "polars" not in lock_txt
22
+ with open("reqs.txt", "w") as f:
23
+ f.write("requests\npolars")
24
+ subprocess.check_call(
25
+ ["calkit", "check", "venv", "reqs.txt", "-o", "lock.txt"]
26
+ )
27
+ with open("lock.txt") as f:
28
+ lock_txt = f.read()
29
+ assert "polars" in lock_txt
30
+ # Now confirm that if we check the env again, nothing happens
31
+ subprocess.check_call(
32
+ ["calkit", "check", "venv", "reqs.txt", "-o", "lock.txt"]
33
+ )
34
+ with open("lock.txt") as f:
35
+ lock_txt_2 = f.read()
36
+ assert lock_txt == lock_txt_2
37
+ # Now check that if we pin a version in reqs.txt, we rebuild
38
+ with open("reqs.txt", "w") as f:
39
+ f.write("requests\npolars==1.0.0")
40
+ subprocess.check_call(
41
+ ["calkit", "check", "venv", "reqs.txt", "-o", "lock.txt"]
42
+ )
43
+ with open("lock.txt") as f:
44
+ lock_txt_3 = f.read()
45
+ assert "polars==1.0.0" in lock_txt_3
File without changes
File without changes
File without changes
File without changes