calkit-python 0.42.0__tar.gz → 0.42.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.
- {calkit_python-0.42.0 → calkit_python-0.42.1}/PKG-INFO +7 -2
- {calkit_python-0.42.0 → calkit_python-0.42.1}/README.md +5 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/check.py +4 -1
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/main/core.py +59 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/new.py +36 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/scheduler.py +264 -43
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/update.py +19 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/core.py +76 -8
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/environments.py +10 -1
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/models/core.py +8 -1
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/main/test_core.py +49 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_check.py +14 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_scheduler.py +170 -16
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/browser-ext/index.md +6 -2
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/cli-reference.md +33 -28
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/environments.md +8 -7
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/hpc.md +31 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/index.md +5 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/AGENTS.md +3 -1
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/projects/core.py +251 -40
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/core.py +60 -4
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/dvc.py +4 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/git.py +264 -64
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/models/core.py +5 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/pipeline.py +86 -12
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/projects.py +71 -43
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/projects/test_core.py +281 -10
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_git.py +46 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_pipeline.py +97 -2
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_projects.py +66 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_users.py +55 -1
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/users.py +35 -13
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/pyproject.toml +9 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/index.ts +1 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/schemas.gen.ts +40 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/sdk.gen.ts +23 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/types.gen.ts +53 -3
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/ArtifactCompareModal.tsx +68 -22
- calkit_python-0.42.1/hub/frontend/src/components/Notebooks/NotebookView.tsx +84 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/hooks/useProject.ts +34 -9
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/api.test.ts +19 -1
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/api.ts +20 -0
- calkit_python-0.42.1/hub/frontend/src/lib/staleChunks.test.ts +86 -0
- calkit_python-0.42.1/hub/frontend/src/lib/staleChunks.ts +49 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/main.tsx +3 -0
- calkit_python-0.42.1/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/figures.tsx +575 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/notebooks.tsx +1 -70
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/pipeline.tsx +39 -13
- calkit_python-0.42.1/hub/frontend/tests/figures-pagination.spec.ts +237 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/vite.config.ts +9 -5
- {calkit_python-0.42.0 → calkit_python-0.42.1}/pyproject.toml +6 -1
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/environments.ts +1 -0
- calkit_python-0.42.0/hub/frontend/src/components/Notebooks/NotebookView.tsx +0 -37
- calkit_python-0.42.0/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/figures.tsx +0 -350
- {calkit_python-0.42.0 → calkit_python-0.42.1}/.claude-plugin/marketplace.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/.dockerignore +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/.gitattributes +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/.gitignore +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/.gitmodules +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/.pre-commit-config.yaml +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/.prettierignore +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/.prettierrc.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/.python-version +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/.vscode/launch.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/.vscode/tasks.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/AGENTS.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/CITATION.cff +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/CODE_OF_CONDUCT.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/CONTRIBUTING.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/LICENSE +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/Makefile +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/agent-plugin/.claude-plugin/plugin.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/agent-plugin/skills/add-pipeline-stage/SKILL.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/agent-plugin/skills/conventions/SKILL.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/agent-plugin/skills/create-pipeline/SKILL.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/.gitignore +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/README.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/options.html +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/package-lock.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/package.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/popup.html +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/public/icons/calkit-128.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/public/icons/calkit-16.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/public/icons/calkit-32.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/public/icons/calkit-48.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/public/icons/calkit.svg +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/public/manifest.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/scripts/build-content.mjs +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/scripts/package-manifest.mjs +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/scripts/store-screenshots.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/scripts/watch.mjs +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/background/index.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/content/github.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/content/overleaf.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/content/references.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/api.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/auth.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/calkit-yaml.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/calkit-yaml.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/detect.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/detect.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/hub-url.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/hubs.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/hubs.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/latex.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/latex.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/lifecycle.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/messages.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/messages.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/pickers.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/storage.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/types.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/ui.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/core/ui.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/options/options.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/popup/popup.css +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/popup/popup.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/src/viewer/viewer.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/tsconfig.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/viewer.html +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/vite.config.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/vite.content.config.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/browser-ext/vitest.config.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/__main__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/calc.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/check.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/config.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/core.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/delete.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/describe.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/dev.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/hub.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/import_.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/latex.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/list.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/main/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/main/xr.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/notebooks.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/office.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/overleaf.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/cli/sync.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/conda.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/config.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/datasets.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/dependencies.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/detect.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/docker.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/dvc/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/dvc/core.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/dvc/zip.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/fs.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/git.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/github.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/gui.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/hub.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/install.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/invenio.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/julia.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/jupyter.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/jupyterlab/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/jupyterlab/routes.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/package.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/schemas/calkit/package.json.orig +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/schemas/calkit/plugin.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/502.9a2c5772a15466e923ef.js +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/695.2c41003a452d43d2b358.js +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/867.a42a046aa5108f54f8fb.js +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/909.e3f9cc3408834a7fdcc3.js +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/b2f1c3efe70cb539d121.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/remoteEntry.ac9035764d5b2adbb542.js +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/style.js +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/labextension/static/third-party-licenses.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/latex.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/licenses.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/magics.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/matlab.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/models/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/models/io.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/models/iteration.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/models/pipeline.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/notebooks.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/office.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/ops.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/overleaf.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/pipeline.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/releases.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/server.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/core.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/latex/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/latex/article/paper.tex +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/latex/core.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/latex/jfm/jfm.bst +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/latex/jfm/jfm.cls +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/latex/jfm/paper.tex +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/templates/latex/jfm/upmath.sty +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/main/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/main/test_lock.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/main/test_subprojects.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/main/test_xr.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_config.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_core.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_delete.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_describe.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_hub.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_import.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_latex.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_list.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_new.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_notebooks.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_overleaf.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_sync.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/cli/test_update.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/dvc/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/dvc/test_core.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/dvc/test_zip.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/jupyterlab/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/jupyterlab/conftest.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/jupyterlab/test_routes.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/models/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/models/test_core.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/models/test_iteration.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/models/test_pipeline.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_calc.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_check.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_conda.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_config.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_core.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_dependencies.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_detect.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_docker.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_environments.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_fs.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_git.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_hub.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_install.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_invenio.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_julia.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_jupyter.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_keyring_windows.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_licenses.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_magics.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_matlab.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_notebooks.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_overleaf.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_pipeline.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_releases.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/calkit/tests/test_templates.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/CNAME +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/acknowledgements.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/ai-tools.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/apps.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/browser-ext/privacy.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/calculations.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/calkit-yaml.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/cloud-integration.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/datasets.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/dependencies.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/examples.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/governance.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/help.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/hub/index.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/hub/self-hosting.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/c-to-the-k-white.svg +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/calkit-fragmentation-compendium.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/calkit-no-bg.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/caltech.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/connect-zenodo.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/jupyterlab/all-green.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/jupyterlab/collect-data-stale.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/jupyterlab/new-env.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/jupyterlab/new-notebook.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/jupyterlab/pipeline-badge.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/jupyterlab-params.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/pipeline.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/plos-osi-code-2024-03.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/schmidt-sciences.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/img/vscode-nb-params.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/installation.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/jupyterlab.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/latex.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/local-server.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/notebooks.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/overleaf.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/pipeline/index.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/pipeline/manual-steps.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/pipeline/running-and-logging.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/questions.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/quickstart.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/references.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/releases.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/reproducibility.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/subprojects.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/adding-latex-pub-docker.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/ai-agents.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/conda-envs.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/existing-project.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/first-project.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/github-actions.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/actions-repo-secrets.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/push.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/chart-more-rows.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/create-project.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/excel-chart.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/excel-data.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/needs-clone.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/new-stage.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/status-more-rows.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/untracked-data.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/updated-publication.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/office/workflow-page.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/openfoam/clone.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/openfoam/create-project.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/openfoam/new-token.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/openfoam/reclone.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/quick-actions.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/run-proc.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/vscode-slurm-notebook/create-calkit-env.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/vscode-slurm-notebook/create-inner-env.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/vscode-slurm-notebook/create-new-calkit-env.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/vscode-slurm-notebook/select-calkit-env.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/vscode-slurm-notebook/slurm-job-running.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/vscode-slurm-notebook/slurm-launch-options.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/img/vscode-slurm-notebook/starting-slurm-job.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/index.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/jupyterlab.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/latex-codespaces.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/matlab.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/notebook-pipeline.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/office.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/openfoam.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/procedures.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/tutorials/vscode-slurm-notebook.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/docs/version-control.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/flake.lock +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/flake.nix +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/.env.example +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/.gitattributes +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/.gitignore +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/.vscode/launch.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/LICENSE +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/Makefile +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/README.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/.gitignore +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/.python-version +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/Dockerfile +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/Makefile +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/README.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/alembic.ini +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/README +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/env.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/script.py.mako +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/.keep +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/07c8236476c4_add_fields_to_usertoken.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/10a05eaedfbd_add_dataset_table.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/1546aa334cd5_make_project_description_nullable.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/1a31ce608336_add_cascade_delete_relationships.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/1fb6e38eb0e9_add_deviceauth_table.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/208e7457f3ba_add_title_to_project.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/2e7c25a00842_add_is_public_to_project.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/38e178698db2_update_subscription_model_to_use_plan_.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/3b1e67e9c318_add_usertoken_table.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/4dac15c0282a_add_stripe_customer_id_to_user.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/4e1c917fcca4_add_status_columns_to_project_table.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/5ba89308431f_add_project_table.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/5d6f8217c890_add_subscriber_user_id_to_org_.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/65b2d15cc702_add_github_username_field_to_user.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/697c3c1a8a27_add_git_repo_url_to_project.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/6f3a3afbea8b_add_number_field_to_question.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/7076d9b5c887_use_account_for_project_owner.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/71e1d1e69bbd_add_table_for_storing_user_github_tokens.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/799476973bce_add_created_ts_to_user_github_token_.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/7cacee34034c_add_parent_child_relationship_to_.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/9c0a54914c78_add_max_length_for_string_varchar_.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/9c4f70636d73_add_fields_to_usertoken.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/a333fc5aa994_index_project_folders_synced_with_.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/a4af19842927_create_table_to_store_user_zenodo_tokens.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/ab7816be480b_drop_items.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/ac622559475f_save_timestamps_for_github_token_.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/af024967630d_lowercase_account_names.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/c1f9a3e27d48_consolidate_comment_tables.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/c46a78ba506c_add_created_column_to_account.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/c749b39072d3_add_figurecomment.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/c7c41c3f0d22_add_user_external_credential_table.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/d01ce914143d_make_question_a_table.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/d21ed1c9537e_add_zenodo_user_id_column_to_user.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/d3a8021fb433_add_table_for_user_project_access.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/d4e5f6a7b8c9_ghless_membership_and_invitations.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/d6366015af35_add_discount_code_table.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/d98dd8ec85a3_edit_replace_id_integers_in_all_models_.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/dcef842dee10_add_refreshtoken_table.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/e1b0fa2a6d34_backfill_external_credentials_from_legacy_.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/e2412789c190_initialize_models.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/e7671197c00b_add_account_table.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/ed74edb0a9e6_create_table_for_user_overleaf_token.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/edcabfca98df_add_subscription_and_org_membership_.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/f0e23e048b1b_add_fields_to_project.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/f3a9c1b7e240_add_releases_feature.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/f5ad6445ad03_enable_user_project_access_to_be_null.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/alembic/versions/f74a96172dbd_add_table_for_locking_project_files.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/deps.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/main.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/accounts.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/datasets.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/feature_votes.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/login.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/misc.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/orgs.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/projects/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/projects/dvc.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/projects/fs.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/projects/releases.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/references.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/api/routes/users.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/arxiv.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/client.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/config.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/db.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/build/new_account.html +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/build/project_invitation.html +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/build/release_share.html +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/build/reset_password.html +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/build/test_email.html +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/src/new_account.mjml +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/src/project_invitation.mjml +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/src/release_share.mjml +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/src/reset_password.mjml +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/email-templates/src/test_email.mjml +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/github.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/main.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/messaging.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/mixpanel.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/models/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/models/projects.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/models/releases.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/orgs.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/pdftext.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/security.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/storage.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/stripe.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/subscriptions.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/projects/__init__.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/projects/test_dvc.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/projects/test_fs.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/projects/test_overleaf_links.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/test_feature_votes.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/test_login.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/test_misc.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/test_releases.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/api/routes/test_users.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/conftest.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_arxiv.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_client.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_core.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_db.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_dvc.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_pdftext.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/tests/test_version.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/version.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/zenodo.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/app/zotero.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/prestart.sh +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/scripts/backend-pre-start.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/scripts/create-initial-data.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/scripts/format.sh +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/scripts/generate-client.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/scripts/lint.sh +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/scripts/rotate-fernet-secrets.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/scripts/test.sh +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/backend/tests-start.sh +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/config/alloy/config.alloy +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/config/grafana/provisioning/dashboards/dashboards.yml +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/config/grafana/provisioning/dashboards/fastapi.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/config/grafana/provisioning/datasources/datasources.yml +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/config/loki/loki.yml +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/config/prometheus/prometheus.yml +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/docker-compose.override.yml +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/docker-compose.traefik.yml +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/docker-compose.yml +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/docs/dev/database-migrations.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/docs/dev/deployment.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/docs/dev/development.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/.dockerignore +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/.gitignore +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/.nvmrc +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/Dockerfile +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/Makefile +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/README.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/biome.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/index.html +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/modify-openapi-operationids.js +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/nginx-backend-not-found.conf +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/nginx.conf +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/openapi-ts.config.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/package-lock.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/package.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/playwright.config.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/assets/images/c-to-the-k.svg +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/assets/images/calkit-no-bg.svg +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/assets/images/calkit.svg +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/assets/images/fastapi-logo.svg +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/assets/images/favicon.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/assets/images/kdot.svg +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/tex/.gitignore +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/tex/LICENSE-busytex +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/tex/busytex.js +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/tex/busytex.wasm +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/tex/busytex_pipeline.js +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/public/tex/busytex_worker.js +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/scripts/download-tex-engine.sh +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/client/client.gen.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/client/index.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/client/types.gen.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/client/utils.gen.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/client.gen.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/core/auth.gen.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/core/bodySerializer.gen.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/core/params.gen.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/core/pathSerializer.gen.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/core/queryKeySerializer.gen.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/core/serverSentEvents.gen.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/core/types.gen.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/client/core/utils.gen.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Admin/AddUser.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Admin/EditUser.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/ActionsMenu.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/ClearableInput.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/CodeEditorPane.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/CommentsPanel.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/ConnectGitHubPrompt.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/ConnectZoteroPrompt.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/DeleteAlert.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/GlobalSearch.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/LoadingSpinner.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/Markdown.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/Mermaid.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/Navbar.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/NotBuiltAlert.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/NotFound.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/NotificationBell.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/PageMenu.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/PdfCanvas.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/PdfDocumentViewer.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/ProjectCommandPalette.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/RefPicker.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/Sidebar.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/SidebarItems.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/Tooltip.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/Topbar.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Common/UserMenu.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Datasets/DatasetFromExisting.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Datasets/UploadDataset.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Environments/ViewEnvironment.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Figures/FigureFromExisting.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Figures/FigureView.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Figures/UploadFigure.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Files/EditFileInfo.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Files/FileContent.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Files/FileEditorModal.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Files/SelectedItemInfo.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Files/UploadFile.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Local/AddPath.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Local/DiscardChanges.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Local/IgnorePath.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Local/NewStage.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Local/SaveFiles.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Orgs/AddMember.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Orgs/NewOrg.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Pipeline/StageEditorModal.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Presentations/PresentationView.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/AddCollaborator.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/CloneProject.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/CreateIssue.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/CreateQuestion.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/EditProject.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/EditQuestion.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/HelpContent.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/InviteLinks.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/MakeProjectPublic.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/NewProject.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/ProjectShowcase.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Projects/ProjectStatus.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Publications/ImportOverleaf.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Publications/LatexEditor.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Publications/NewPublication.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Publications/PdfAnnotator.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Publications/PublicationView.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/DeleteReferenceItemDialog.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/DeleteReferencesCollectionDialog.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/EditReferenceItemModal.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/FileViewModal.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/ImportFromZoteroModal.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/LabelExistingReferences.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/NewReferencesCollection.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/ReferenceItemModal.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/References/ReferencesInfoPanel.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Releases/ArtifactReleasesPanel.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Releases/NewRelease.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Releases/PathPicker.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Releases/ReleasePdfAnnotator.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Releases/ReleaseViewer.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Releases/ReleasesTable.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Releases/ShareDialog.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/Releases/releaseSort.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/Appearance.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/ChangePassword.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/ConnectedAccounts.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/DeleteAccount.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/DeleteConfirmation.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/NewToken.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/PickSubscription.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/Subscription.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/UpdateOverleafToken.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/UserInformation.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/components/UserSettings/UserTokens.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/hooks/useAuth.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/hooks/useCustomToast.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/analytics.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/analytics.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/auth.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/auth.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/bibtex.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/bibtex.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/core.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/errors.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/github.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/github.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/google.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/keyboard.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/latexCompiler.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/latexProject.mapPaths.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/latexProject.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/latexProject.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/layout.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/pipelineYaml.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/pipelineYaml.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/releases.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/strings.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/strings.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/zenodo.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/lib/zotero.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routeTree.gen.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/__root.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/app.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/collaborators.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/datasets.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/environments.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/files.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/history.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/index.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/local.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/presentations.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/publications.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/references.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/releases.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout/software.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/_layout.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/$projectName/releases/$releaseName.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/$accountName/index.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/admin.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/datasets.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/index.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/learn.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/orgs.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/projects.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout/settings.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/_layout.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/auth/google.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/auth/zenodo.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/auth/zotero.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/checkout.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/join/$token.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/login/device.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/login/index.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/recover-password.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/reset-password.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/routes/signup.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/theme.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/src/vite-env.d.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tests/auth.setup.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tests/config.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tests/login.spec.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tests/reset-password.spec.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tests/user-settings.spec.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tests/utils/mailcatcher.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tests/utils/random.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tests/utils/user.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tsconfig.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/tsconfig.node.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/frontend/vitest.config.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/scripts/build-push.sh +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/scripts/build.sh +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/scripts/deploy.sh +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/scripts/pem-to-env.sh +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/scripts/test-local.sh +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/scripts/test.sh +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/texmf-proxy/Dockerfile +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/texmf-proxy/README.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/hub/texmf-proxy/proxy.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/.yarnrc.yml +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/babel.config.js +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/install.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/jest.config.js +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/jupyter-config/server-config/calkit.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/package.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/schema/plugin.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/__tests__/useQueries.spec.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/calkit-config.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/cell-output-marker.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/commit-dialog.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/environment-editor.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/notebook-registration.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/notebook-toolbar.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/pipeline-status-bar.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/project-info-editor.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/sidebar-settings.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/sidebar.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/components/stage-editor.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/feature-flags.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/file-browser-menu.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/hooks/__tests__/useQueries.test.tsx +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/hooks/useQueries.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/icons.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/index.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/io-tracker.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/pipeline-state.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/queryClient.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/request.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/src/shims-mainmenu.d.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/base.css +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/cell-output-marker.css +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/environment-editor.css +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/environment-selector.css +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/img/calkit-no-bg.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/index.css +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/index.js +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/notebook-toolbar.css +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/pipeline-status-bar.css +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/style/sidebar.css +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/tsconfig.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/tsconfig.test.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/ui-tests/.gitignore +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/ui-tests/README.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/ui-tests/jupyter_server_test_config.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/ui-tests/package.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/ui-tests/playwright.config.js +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/ui-tests/tests/calkit.spec.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/ui-tests/yarn.lock +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/jupyterlab-ext/yarn.lock +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/mkdocs.yml +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/scripts/generate-docs-references.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/scripts/install.ps1 +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/scripts/install.sh +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/scripts/make-calk9.sh +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/scripts/sync-docs.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/test/dvc-md5-dir/osx-arm64.txt +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/test/nb-julia.ipynb +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/test/nb-params.ipynb +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/test/nb-subdir.ipynb +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/test/pipeline.ipynb +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/test/script.py +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/test/test-log.log +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/uv.lock +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/.gitignore +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/.vscodeignore +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/CHANGELOG.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/LICENSE +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/README.md +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/images/calkit-icon.svg +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/images/calkit-no-bg.png +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/package-lock.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/package.json +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/scripts/set-proposed-api.js +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/extension.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/figures/core.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/figures/view.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/notebooks.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/pipeline/core.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/sidebar.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/test/environments.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/test/figures.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/test/kernel-selection.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/test/notebooks.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/test/pipeline.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/test/sidebar.test.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/src/types.ts +0 -0
- {calkit_python-0.42.0 → calkit_python-0.42.1}/vscode-ext/tsconfig.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: calkit-python
|
|
3
|
-
Version: 0.42.
|
|
3
|
+
Version: 0.42.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
|
|
@@ -132,6 +132,11 @@ without the cognitive overhead.
|
|
|
132
132
|
- Extensions for doing all of the above graphically in
|
|
133
133
|
[JupyterLab](https://docs.calkit.org/jupyterlab) and
|
|
134
134
|
[VS Code](https://marketplace.visualstudio.com/items?itemName=Calkit.calkit-vscode).
|
|
135
|
+
- A [browser extension](https://docs.calkit.org/browser-ext) for collecting references
|
|
136
|
+
directly to BibTeX (optionally synced with Zotero),
|
|
137
|
+
viewing DVC-stored files on GitHub,
|
|
138
|
+
and syncing figures and results with Overleaf directly in Chrome,
|
|
139
|
+
Microsoft Edge, and more.
|
|
135
140
|
|
|
136
141
|
<!-- END INCLUDE -->
|
|
137
142
|
|
|
@@ -73,6 +73,11 @@ without the cognitive overhead.
|
|
|
73
73
|
- Extensions for doing all of the above graphically in
|
|
74
74
|
[JupyterLab](https://docs.calkit.org/jupyterlab) and
|
|
75
75
|
[VS Code](https://marketplace.visualstudio.com/items?itemName=Calkit.calkit-vscode).
|
|
76
|
+
- A [browser extension](https://docs.calkit.org/browser-ext) for collecting references
|
|
77
|
+
directly to BibTeX (optionally synced with Zotero),
|
|
78
|
+
viewing DVC-stored files on GitHub,
|
|
79
|
+
and syncing figures and results with Overleaf directly in Chrome,
|
|
80
|
+
Microsoft Edge, and more.
|
|
76
81
|
|
|
77
82
|
<!-- END INCLUDE -->
|
|
78
83
|
|
|
@@ -1203,10 +1203,13 @@ def check_venv(
|
|
|
1203
1203
|
else os.path.join(wdir or ".", prefix)
|
|
1204
1204
|
)
|
|
1205
1205
|
if os.path.isdir(prefix_full_path):
|
|
1206
|
+
# This can fail if the environment is in use, e.g., on
|
|
1207
|
+
# Windows, where files can't be removed while open, in which
|
|
1208
|
+
# case we keep it and fall back to rebuilding from the spec
|
|
1206
1209
|
shutil.rmtree(prefix_full_path)
|
|
1207
1210
|
create_venv()
|
|
1208
1211
|
pip_install_and_freeze(dep_file_txt)
|
|
1209
|
-
except subprocess.CalledProcessError:
|
|
1212
|
+
except (subprocess.CalledProcessError, OSError):
|
|
1210
1213
|
warn(
|
|
1211
1214
|
f"Failed to create environment from lock file ({reqs_to_use}); "
|
|
1212
1215
|
f"attempting rebuild from input file {path}"
|
|
@@ -2440,6 +2440,26 @@ def manual_step(
|
|
|
2440
2440
|
typer.echo("Done")
|
|
2441
2441
|
|
|
2442
2442
|
|
|
2443
|
+
def _env_prefix_exists(
|
|
2444
|
+
env: dict, envs: dict, env_name: str, wdir: str | None
|
|
2445
|
+
) -> bool:
|
|
2446
|
+
"""Check that a venv-like environment's prefix exists on disk.
|
|
2447
|
+
|
|
2448
|
+
The environment check cache only hashes a prefix that's pinned in
|
|
2449
|
+
``calkit.yaml``, so a virtual environment living at its default location
|
|
2450
|
+
could have been deleted since the last check without invalidating the
|
|
2451
|
+
cache, in which case it still needs to be rebuilt.
|
|
2452
|
+
"""
|
|
2453
|
+
if env.get("kind") not in ["uv-venv", "venv"]:
|
|
2454
|
+
return True
|
|
2455
|
+
if env.get("prefix") or "path" not in env:
|
|
2456
|
+
return True
|
|
2457
|
+
prefix = calkit.environments.get_default_venv_prefix(
|
|
2458
|
+
envs, env["path"], env_name
|
|
2459
|
+
)
|
|
2460
|
+
return os.path.isdir(os.path.join(wdir or ".", prefix))
|
|
2461
|
+
|
|
2462
|
+
|
|
2443
2463
|
@app.command(
|
|
2444
2464
|
name="xenv|runenv",
|
|
2445
2465
|
help="Execute a command in an environment.",
|
|
@@ -2529,6 +2549,38 @@ def run_in_env(
|
|
|
2529
2549
|
docker_wdir = posixpath.join(docker_wdir, wdir)
|
|
2530
2550
|
shell = env.get("shell", "sh")
|
|
2531
2551
|
platform = env.get("platform")
|
|
2552
|
+
|
|
2553
|
+
def save_env_check_cache() -> None:
|
|
2554
|
+
"""Record a successful check so repeat calls can skip it."""
|
|
2555
|
+
try:
|
|
2556
|
+
calkit.environments.save_cache(
|
|
2557
|
+
env_name=env_name, env=env, wdir=wdir, success=True
|
|
2558
|
+
)
|
|
2559
|
+
except Exception as e:
|
|
2560
|
+
if verbose:
|
|
2561
|
+
typer.echo(f"Failed to save environment check cache: {e}")
|
|
2562
|
+
|
|
2563
|
+
# This command is typically called once per pipeline stage, so checking
|
|
2564
|
+
# the environment every time is wasteful, and on Windows can fail
|
|
2565
|
+
# outright, e.g., if a package installed into the environment provides
|
|
2566
|
+
# the executable that's currently running. Consult the same cache
|
|
2567
|
+
# ``calkit run`` uses and only check if something relevant has changed.
|
|
2568
|
+
if (
|
|
2569
|
+
not no_check
|
|
2570
|
+
and env["kind"] not in calkit.environments.KINDS_NO_CHECK
|
|
2571
|
+
and calkit.environments.check_cache(
|
|
2572
|
+
env_name=env_name, env=env, wdir=wdir
|
|
2573
|
+
)
|
|
2574
|
+
and _env_prefix_exists(
|
|
2575
|
+
env=env, envs=envs, env_name=env_name, wdir=wdir
|
|
2576
|
+
)
|
|
2577
|
+
):
|
|
2578
|
+
if verbose:
|
|
2579
|
+
typer.echo(
|
|
2580
|
+
f"Skipping check for environment '{env_name}' since it was "
|
|
2581
|
+
"recently checked and nothing has changed"
|
|
2582
|
+
)
|
|
2583
|
+
no_check = True
|
|
2532
2584
|
if env["kind"] == "docker":
|
|
2533
2585
|
if "image" not in env:
|
|
2534
2586
|
raise_error("Image must be defined for Docker environments")
|
|
@@ -2555,6 +2607,7 @@ def run_in_env(
|
|
|
2555
2607
|
args=env.get("args", []),
|
|
2556
2608
|
quiet=not verbose,
|
|
2557
2609
|
)
|
|
2610
|
+
save_env_check_cache()
|
|
2558
2611
|
docker_cmd = [
|
|
2559
2612
|
"docker",
|
|
2560
2613
|
"run",
|
|
@@ -2630,6 +2683,7 @@ def run_in_env(
|
|
|
2630
2683
|
relaxed=relaxed_check,
|
|
2631
2684
|
quiet=not verbose,
|
|
2632
2685
|
)
|
|
2686
|
+
save_env_check_cache()
|
|
2633
2687
|
# TODO: Prefix should only be in the env file or calkit.yaml, not both?
|
|
2634
2688
|
prefix = env.get("prefix")
|
|
2635
2689
|
# Conda is often not on the PATH (especially on Windows), so search
|
|
@@ -2708,6 +2762,7 @@ def run_in_env(
|
|
|
2708
2762
|
quiet=True,
|
|
2709
2763
|
verbose=verbose,
|
|
2710
2764
|
)
|
|
2765
|
+
save_env_check_cache()
|
|
2711
2766
|
# Now run the command
|
|
2712
2767
|
cmd = f"{activate_cmd} && {shell_cmd} && deactivate" # type: ignore
|
|
2713
2768
|
if verbose:
|
|
@@ -2719,6 +2774,7 @@ def run_in_env(
|
|
|
2719
2774
|
elif env["kind"] == "julia":
|
|
2720
2775
|
if not no_check:
|
|
2721
2776
|
check_environment(env_name=env_name, verbose=verbose)
|
|
2777
|
+
save_env_check_cache()
|
|
2722
2778
|
env_path = env.get("path")
|
|
2723
2779
|
if env_path is None:
|
|
2724
2780
|
raise_error(
|
|
@@ -2884,6 +2940,7 @@ def run_in_env(
|
|
|
2884
2940
|
assert isinstance(env_path, str)
|
|
2885
2941
|
if not no_check:
|
|
2886
2942
|
check_renv(env_path=env_path, verbose=verbose)
|
|
2943
|
+
save_env_check_cache()
|
|
2887
2944
|
# For renv, we need to run from the renv project directory so renv
|
|
2888
2945
|
# properly initializes the library, but the script needs to run
|
|
2889
2946
|
# from its original working directory
|
|
@@ -2935,6 +2992,7 @@ def run_in_env(
|
|
|
2935
2992
|
)
|
|
2936
2993
|
if not no_check:
|
|
2937
2994
|
check_nix_env(env=env, verbose=verbose)
|
|
2995
|
+
save_env_check_cache()
|
|
2938
2996
|
env_dir = os.path.dirname(os.path.abspath(env_path)) or "."
|
|
2939
2997
|
flake_ref = f"path:{env_dir}"
|
|
2940
2998
|
shell_name = env.get("shell")
|
|
@@ -2966,6 +3024,7 @@ def run_in_env(
|
|
|
2966
3024
|
env=env, env_name=env_name, as_posix=False
|
|
2967
3025
|
), # type: ignore
|
|
2968
3026
|
)
|
|
3027
|
+
save_env_check_cache()
|
|
2969
3028
|
image_name = calkit.matlab.get_docker_image_name(
|
|
2970
3029
|
ck_info=ck_info,
|
|
2971
3030
|
env_name=env_name,
|
|
@@ -1572,6 +1572,18 @@ def new_slurm_env(
|
|
|
1572
1572
|
),
|
|
1573
1573
|
),
|
|
1574
1574
|
] = [],
|
|
1575
|
+
max_concurrent_jobs: Annotated[
|
|
1576
|
+
int | None,
|
|
1577
|
+
typer.Option(
|
|
1578
|
+
"--max-concurrent-jobs",
|
|
1579
|
+
help=(
|
|
1580
|
+
"Maximum number of this project's jobs allowed in the "
|
|
1581
|
+
"queue at once, or 0 for no limit. Submissions beyond this "
|
|
1582
|
+
"wait for a slot, so an iterated stage does not take over a "
|
|
1583
|
+
"shared cluster's queue. Unlimited by default."
|
|
1584
|
+
),
|
|
1585
|
+
),
|
|
1586
|
+
] = None,
|
|
1575
1587
|
description: Annotated[
|
|
1576
1588
|
str | None, typer.Option("--description", help="Description.")
|
|
1577
1589
|
] = None,
|
|
@@ -1612,6 +1624,12 @@ def new_slurm_env(
|
|
|
1612
1624
|
env["default_options"] = normalized_default_options # type: ignore
|
|
1613
1625
|
if normalized_default_setup:
|
|
1614
1626
|
env["default_setup"] = normalized_default_setup # type: ignore
|
|
1627
|
+
if max_concurrent_jobs is not None:
|
|
1628
|
+
if max_concurrent_jobs < 0:
|
|
1629
|
+
raise_error("--max-concurrent-jobs cannot be negative")
|
|
1630
|
+
# 0 means no limit, the same as it does for `calkit update`.
|
|
1631
|
+
if max_concurrent_jobs:
|
|
1632
|
+
env["max_concurrent_jobs"] = max_concurrent_jobs # type: ignore
|
|
1615
1633
|
if description is not None:
|
|
1616
1634
|
env["description"] = description
|
|
1617
1635
|
envs[name] = env
|
|
@@ -1661,6 +1679,18 @@ def new_pbs_env(
|
|
|
1661
1679
|
),
|
|
1662
1680
|
),
|
|
1663
1681
|
] = [],
|
|
1682
|
+
max_concurrent_jobs: Annotated[
|
|
1683
|
+
int | None,
|
|
1684
|
+
typer.Option(
|
|
1685
|
+
"--max-concurrent-jobs",
|
|
1686
|
+
help=(
|
|
1687
|
+
"Maximum number of this project's jobs allowed in the "
|
|
1688
|
+
"queue at once, or 0 for no limit. Submissions beyond this "
|
|
1689
|
+
"wait for a slot, so an iterated stage does not take over a "
|
|
1690
|
+
"shared cluster's queue. Unlimited by default."
|
|
1691
|
+
),
|
|
1692
|
+
),
|
|
1693
|
+
] = None,
|
|
1664
1694
|
description: Annotated[
|
|
1665
1695
|
str | None, typer.Option("--description", help="Description.")
|
|
1666
1696
|
] = None,
|
|
@@ -1703,6 +1733,12 @@ def new_pbs_env(
|
|
|
1703
1733
|
env["default_options"] = normalized_default_options # type: ignore
|
|
1704
1734
|
if normalized_default_setup:
|
|
1705
1735
|
env["default_setup"] = normalized_default_setup # type: ignore
|
|
1736
|
+
if max_concurrent_jobs is not None:
|
|
1737
|
+
if max_concurrent_jobs < 0:
|
|
1738
|
+
raise_error("--max-concurrent-jobs cannot be negative")
|
|
1739
|
+
# 0 means no limit, the same as it does for `calkit update`.
|
|
1740
|
+
if max_concurrent_jobs:
|
|
1741
|
+
env["max_concurrent_jobs"] = max_concurrent_jobs # type: ignore
|
|
1706
1742
|
if description is not None:
|
|
1707
1743
|
env["description"] = description
|
|
1708
1744
|
envs[name] = env
|
|
@@ -8,12 +8,15 @@ Registered as ``scheduler|sch``.
|
|
|
8
8
|
|
|
9
9
|
from __future__ import annotations
|
|
10
10
|
|
|
11
|
+
import contextlib
|
|
11
12
|
import os
|
|
13
|
+
import random
|
|
12
14
|
import re
|
|
13
15
|
import shlex
|
|
14
16
|
import shutil
|
|
15
17
|
import signal
|
|
16
18
|
import socket
|
|
19
|
+
import sqlite3
|
|
17
20
|
import subprocess
|
|
18
21
|
import sys
|
|
19
22
|
import time
|
|
@@ -44,6 +47,23 @@ LOCAL_DIR = os.path.join(".calkit", "local")
|
|
|
44
47
|
# (e.g. `scheduler queue`) never see a half-written file.
|
|
45
48
|
JOBS_DB_PATH = os.path.join(LOCAL_DIR, "scheduler-jobs.db")
|
|
46
49
|
MOCK_DIR = os.path.join(LOCAL_DIR, "mock-scheduler")
|
|
50
|
+
# Serializes the check-for-a-free-slot-then-submit sequence across the
|
|
51
|
+
# parallel batch processes that fan out an iterated stage. Without it they
|
|
52
|
+
# would all see the same free slot and submit together, which is exactly what
|
|
53
|
+
# an environment's max_concurrent_jobs exists to prevent.
|
|
54
|
+
QUEUE_LOCK_PATH = os.path.join(LOCAL_DIR, "scheduler-queue-lock.db")
|
|
55
|
+
# Seconds SQLite waits for the lock before raising; retried past this, so it
|
|
56
|
+
# only bounds how long a single attempt blocks.
|
|
57
|
+
QUEUE_LOCK_TIMEOUT = 60
|
|
58
|
+
# How often a job waiting for a queue slot rechecks. Long enough not to hammer
|
|
59
|
+
# the scheduler with status queries, short enough that a freed slot is taken
|
|
60
|
+
# promptly relative to the runtime of a job worth queueing.
|
|
61
|
+
QUEUE_SLOT_POLL_INTERVAL = 10.0
|
|
62
|
+
MOCK_QUEUE_SLOT_POLL_INTERVAL = 0.25
|
|
63
|
+
# Fraction by which each waiter randomizes its poll interval. A capped sweep
|
|
64
|
+
# leaves one waiting process per unsubmitted case, and without jitter they all
|
|
65
|
+
# wake, take the lock, and query the scheduler in lockstep.
|
|
66
|
+
QUEUE_SLOT_POLL_JITTER = 0.25
|
|
47
67
|
# When set, scheduler commands run jobs on the local host instead of
|
|
48
68
|
# dispatching to a real SLURM/PBS install (see _mock_enabled).
|
|
49
69
|
MOCK_ENV_VAR = "CALKIT_MOCK_SCHEDULER"
|
|
@@ -434,6 +454,190 @@ def _is_active(kind: str, job_id: str) -> bool:
|
|
|
434
454
|
return _poll_job(kind, job_id)[0]
|
|
435
455
|
|
|
436
456
|
|
|
457
|
+
def _active_job_ids(kind: str, job_ids: list[str]) -> set[str]:
|
|
458
|
+
"""Return which of ``job_ids`` are still queued or running.
|
|
459
|
+
|
|
460
|
+
Answers for the whole set in one scheduler query where possible. Counting
|
|
461
|
+
queue occupancy means asking about every job this project has submitted,
|
|
462
|
+
and doing that one ``squeue`` call per job---from every process waiting
|
|
463
|
+
for a slot, on every poll---would put more load on the scheduler than the
|
|
464
|
+
submissions we are trying to pace.
|
|
465
|
+
"""
|
|
466
|
+
if not job_ids:
|
|
467
|
+
return set()
|
|
468
|
+
if not _mock_enabled() and kind == "slurm":
|
|
469
|
+
# Query our own jobs rather than passing `--jobs <ids>`: squeue errors
|
|
470
|
+
# out when any listed id is unknown, and ids do go unknown once the
|
|
471
|
+
# scheduler purges a finished job, which is the common case here.
|
|
472
|
+
p = subprocess.run(
|
|
473
|
+
["squeue", "--me", "-h", "-o", "%i"],
|
|
474
|
+
capture_output=True,
|
|
475
|
+
text=True,
|
|
476
|
+
check=False,
|
|
477
|
+
)
|
|
478
|
+
if p.returncode == 0:
|
|
479
|
+
wanted = set(job_ids)
|
|
480
|
+
# Array and step ids appear as `123_4` and `123.batch`; both
|
|
481
|
+
# belong to the job we recorded as `123`.
|
|
482
|
+
active = {
|
|
483
|
+
line.strip().split("_")[0].split(".")[0]
|
|
484
|
+
for line in p.stdout.splitlines()
|
|
485
|
+
if line.strip()
|
|
486
|
+
}
|
|
487
|
+
return wanted & active
|
|
488
|
+
# squeue failed---fall through and ask about each job individually
|
|
489
|
+
# rather than reporting an empty queue we have not confirmed.
|
|
490
|
+
return {job_id for job_id in job_ids if _is_active(kind, job_id)}
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
def _count_queued_jobs(environment: str, exclude: str) -> int:
|
|
494
|
+
"""Count this project's jobs sitting in the queue for an environment.
|
|
495
|
+
|
|
496
|
+
Only jobs Calkit submitted for this project are counted; the limit is
|
|
497
|
+
about not monopolizing a shared queue with one project's iterated stage,
|
|
498
|
+
not about the user's jobs at large.
|
|
499
|
+
"""
|
|
500
|
+
by_kind: dict[str, list[str]] = {}
|
|
501
|
+
for job_name, info in _load_jobs().items():
|
|
502
|
+
if job_name == exclude:
|
|
503
|
+
continue
|
|
504
|
+
# Records written before environments were tracked have no
|
|
505
|
+
# environment key. Count them: over-counting delays a submission,
|
|
506
|
+
# while under-counting is what floods the queue.
|
|
507
|
+
job_env = info.get("environment")
|
|
508
|
+
if job_env is not None and job_env != environment:
|
|
509
|
+
continue
|
|
510
|
+
if info.get("exit_code") is not None:
|
|
511
|
+
# Already observed to have finished, so it cannot be in the queue.
|
|
512
|
+
continue
|
|
513
|
+
by_kind.setdefault(info.get("kind", "slurm"), []).append(
|
|
514
|
+
info["job_id"]
|
|
515
|
+
)
|
|
516
|
+
return sum(
|
|
517
|
+
len(_active_job_ids(kind, job_ids))
|
|
518
|
+
for kind, job_ids in by_kind.items()
|
|
519
|
+
)
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
@contextlib.contextmanager
|
|
523
|
+
def _queue_lock():
|
|
524
|
+
"""Cross-process mutex around checking for a slot and then submitting.
|
|
525
|
+
|
|
526
|
+
Built on SQLite's own locking---an IMMEDIATE transaction takes a write
|
|
527
|
+
lock that other connections block on---rather than a lock library, since
|
|
528
|
+
scheduler state already depends on SQLite locking correctly here, and it
|
|
529
|
+
keeps this to the standard library.
|
|
530
|
+
"""
|
|
531
|
+
calkit.ensure_local_dir()
|
|
532
|
+
conn = sqlite3.connect(
|
|
533
|
+
QUEUE_LOCK_PATH, timeout=QUEUE_LOCK_TIMEOUT, isolation_level=None
|
|
534
|
+
)
|
|
535
|
+
try:
|
|
536
|
+
while True:
|
|
537
|
+
try:
|
|
538
|
+
conn.execute("BEGIN IMMEDIATE")
|
|
539
|
+
break
|
|
540
|
+
except sqlite3.OperationalError as e:
|
|
541
|
+
# Another process is mid-submit. It holds the lock only for as
|
|
542
|
+
# long as one submit command takes, so retrying is better than
|
|
543
|
+
# failing the stage. Only contention is worth retrying though:
|
|
544
|
+
# a read-only file or a bad disk would never clear, and
|
|
545
|
+
# retrying those forever would hang the stage with no
|
|
546
|
+
# explanation instead of surfacing the real problem.
|
|
547
|
+
msg = str(e).lower()
|
|
548
|
+
if "locked" not in msg and "busy" not in msg:
|
|
549
|
+
raise
|
|
550
|
+
time.sleep(1)
|
|
551
|
+
try:
|
|
552
|
+
yield
|
|
553
|
+
finally:
|
|
554
|
+
conn.rollback()
|
|
555
|
+
finally:
|
|
556
|
+
conn.close()
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
def _parse_max_concurrent_jobs(environment: str, value: object) -> int | None:
|
|
560
|
+
"""Interpret an environment's ``max_concurrent_jobs``, or ``None``.
|
|
561
|
+
|
|
562
|
+
The value is read straight out of ``calkit.yaml`` rather than through
|
|
563
|
+
``SlurmEnvironment``, so its ``ge=1`` constraint never runs and a
|
|
564
|
+
hand-edited file can put anything here. Reject what we cannot honor
|
|
565
|
+
instead of guessing: silently reading a bad value as "no limit" would
|
|
566
|
+
flood the queue this setting exists to protect, and a negative one would
|
|
567
|
+
leave the wait below with a condition that can never come true.
|
|
568
|
+
"""
|
|
569
|
+
if value is None:
|
|
570
|
+
return None
|
|
571
|
+
# bool is an int subclass, and `max_concurrent_jobs: true` is a mistake,
|
|
572
|
+
# not a limit of one.
|
|
573
|
+
if isinstance(value, bool) or not isinstance(value, int):
|
|
574
|
+
raise_error(
|
|
575
|
+
f"Environment '{environment}' has an invalid "
|
|
576
|
+
f"max_concurrent_jobs ({value!r}); expected a positive integer"
|
|
577
|
+
)
|
|
578
|
+
# 0 means no limit, matching `calkit update slurm-env
|
|
579
|
+
# --max-concurrent-jobs 0`.
|
|
580
|
+
if value == 0:
|
|
581
|
+
return None
|
|
582
|
+
if value < 0:
|
|
583
|
+
raise_error(
|
|
584
|
+
f"Environment '{environment}' has a negative "
|
|
585
|
+
f"max_concurrent_jobs ({value}); it must be at least 1"
|
|
586
|
+
)
|
|
587
|
+
return value
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
@contextlib.contextmanager
|
|
591
|
+
def _queue_slot(environment: str, name: str, max_jobs: int | None):
|
|
592
|
+
"""Hold a slot in the environment's queue for the duration of the block.
|
|
593
|
+
|
|
594
|
+
Blocks until this project has fewer than ``max_jobs`` jobs queued or
|
|
595
|
+
running, then keeps the lock while the caller submits and records the new
|
|
596
|
+
job, so concurrent waiters see it and do not overshoot the limit.
|
|
597
|
+
"""
|
|
598
|
+
max_jobs = _parse_max_concurrent_jobs(environment, max_jobs)
|
|
599
|
+
if max_jobs is None:
|
|
600
|
+
yield
|
|
601
|
+
return
|
|
602
|
+
announced = False
|
|
603
|
+
while True:
|
|
604
|
+
# Check without the lock first. A capped sweep leaves one waiting
|
|
605
|
+
# process per unsubmitted case, and each poll would otherwise hold the
|
|
606
|
+
# exclusive lock across a scheduler query---with enough waiters the
|
|
607
|
+
# lock stays busy and slots go unclaimed long after they free up.
|
|
608
|
+
# A full queue is the common answer while waiting and needs no lock to
|
|
609
|
+
# act on; the authoritative check is still made under it below.
|
|
610
|
+
n_queued = _count_queued_jobs(environment, exclude=name)
|
|
611
|
+
if n_queued < max_jobs:
|
|
612
|
+
with _queue_lock():
|
|
613
|
+
n_queued = _count_queued_jobs(environment, exclude=name)
|
|
614
|
+
if n_queued < max_jobs:
|
|
615
|
+
yield
|
|
616
|
+
return
|
|
617
|
+
if not announced:
|
|
618
|
+
typer.echo(
|
|
619
|
+
f"Waiting for a free slot in environment '{environment}' "
|
|
620
|
+
f"({n_queued} of {max_jobs} jobs queued)"
|
|
621
|
+
)
|
|
622
|
+
announced = True
|
|
623
|
+
# Mocked jobs run locally and finish in seconds, so a full interval
|
|
624
|
+
# would dominate the runtime of anything using the mock scheduler.
|
|
625
|
+
interval = (
|
|
626
|
+
MOCK_QUEUE_SLOT_POLL_INTERVAL
|
|
627
|
+
if _mock_enabled()
|
|
628
|
+
else QUEUE_SLOT_POLL_INTERVAL
|
|
629
|
+
)
|
|
630
|
+
time.sleep(
|
|
631
|
+
interval
|
|
632
|
+
* (
|
|
633
|
+
1
|
|
634
|
+
+ random.uniform(
|
|
635
|
+
-QUEUE_SLOT_POLL_JITTER, QUEUE_SLOT_POLL_JITTER
|
|
636
|
+
)
|
|
637
|
+
)
|
|
638
|
+
)
|
|
639
|
+
|
|
640
|
+
|
|
437
641
|
def _cancel(kind: str, job_id: str) -> tuple[bool, str]:
|
|
438
642
|
if _mock_enabled():
|
|
439
643
|
return _mock_cancel(job_id)
|
|
@@ -655,6 +859,11 @@ def run_batch(
|
|
|
655
859
|
the same name, we'll wait for it to finish. The only exception is if the
|
|
656
860
|
dependencies have changed, in which case any queued or running jobs will
|
|
657
861
|
be canceled and a new one submitted.
|
|
862
|
+
|
|
863
|
+
If the environment sets ``max_concurrent_jobs``, submission waits until
|
|
864
|
+
this project has fewer than that many jobs queued or running, so an
|
|
865
|
+
iterated stage does not put all of its jobs into a shared cluster's queue
|
|
866
|
+
at once.
|
|
658
867
|
"""
|
|
659
868
|
if args is None:
|
|
660
869
|
args = []
|
|
@@ -872,51 +1081,63 @@ def run_batch(
|
|
|
872
1081
|
shutil.rmtree(out)
|
|
873
1082
|
except Exception as e:
|
|
874
1083
|
raise_error(f"Error deleting '{out}': {e}")
|
|
875
|
-
#
|
|
876
|
-
#
|
|
877
|
-
#
|
|
878
|
-
#
|
|
1084
|
+
# Wait for room in the queue before submitting, if the environment caps
|
|
1085
|
+
# how many of this project's jobs may be queued at once. This is done
|
|
1086
|
+
# after deleting outputs (which can be slow) so the slot is held only for
|
|
1087
|
+
# as long as submitting takes.
|
|
1088
|
+
max_jobs = env.get("max_concurrent_jobs")
|
|
879
1089
|
pid = None
|
|
880
1090
|
interrupted: list[bool] = []
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
1091
|
+
# The wait for a slot sits outside the SIGINT deferral below so Ctrl+C
|
|
1092
|
+
# still works while waiting---that wait can be long, and deferring the
|
|
1093
|
+
# signal through it would make it uninterruptible.
|
|
1094
|
+
with _queue_slot(environment, name, max_jobs):
|
|
1095
|
+
# Submit and record atomically with respect to Ctrl+C: a SIGINT here
|
|
1096
|
+
# would otherwise kill the submit command mid-flight or leave a job
|
|
1097
|
+
# submitted but never written to the database (so a re-run would
|
|
1098
|
+
# resubmit it). Defer the signal until the job is safely recorded,
|
|
1099
|
+
# then act on it. The queue slot is held across both, so a concurrent
|
|
1100
|
+
# waiter counts this job before deciding it has room to submit.
|
|
1101
|
+
prev_sigint = signal.signal(
|
|
1102
|
+
signal.SIGINT, lambda *_: interrupted.append(True)
|
|
1103
|
+
)
|
|
1104
|
+
try:
|
|
1105
|
+
if _mock_enabled():
|
|
1106
|
+
job_id = uuid.uuid4().hex[:12]
|
|
1107
|
+
pid = _mock_submit(
|
|
1108
|
+
job_id=job_id, job_command=job_command, log_path=log_path
|
|
1109
|
+
)
|
|
1110
|
+
else:
|
|
1111
|
+
# start_new_session shields the submit command from the
|
|
1112
|
+
# terminal's Ctrl+C so the submission always completes.
|
|
1113
|
+
p = subprocess.run(
|
|
1114
|
+
submit_cmd,
|
|
1115
|
+
input=submit_input,
|
|
1116
|
+
capture_output=True,
|
|
1117
|
+
check=False,
|
|
1118
|
+
text=True,
|
|
1119
|
+
start_new_session=True,
|
|
1120
|
+
)
|
|
1121
|
+
if p.returncode != 0:
|
|
1122
|
+
raise_error(f"Failed to submit new job: {p.stderr}")
|
|
1123
|
+
job_id = p.stdout.strip()
|
|
1124
|
+
typer.echo(f"Submitted job with ID: {job_id}")
|
|
1125
|
+
new_job = {
|
|
1126
|
+
"kind": kind,
|
|
1127
|
+
"environment": environment,
|
|
1128
|
+
"job_id": job_id,
|
|
1129
|
+
"deps": deps,
|
|
1130
|
+
"target": target,
|
|
1131
|
+
"args": args,
|
|
1132
|
+
"setup": setup_cmds,
|
|
1133
|
+
"dep_md5s": current_dep_md5s,
|
|
1134
|
+
"submitted_at": calkit.utcnow().isoformat(),
|
|
1135
|
+
}
|
|
1136
|
+
if pid is not None:
|
|
1137
|
+
new_job["pid"] = pid
|
|
1138
|
+
_record_job(name, new_job)
|
|
1139
|
+
finally:
|
|
1140
|
+
signal.signal(signal.SIGINT, prev_sigint)
|
|
920
1141
|
if interrupted:
|
|
921
1142
|
typer.echo(
|
|
922
1143
|
f"Interrupted after submitting job '{name}' ({job_id}); it will "
|
|
@@ -928,6 +928,16 @@ def update_slurm_env(
|
|
|
928
928
|
"--set-default-setup", help="Replace default setup list."
|
|
929
929
|
),
|
|
930
930
|
] = [],
|
|
931
|
+
max_concurrent_jobs: Annotated[
|
|
932
|
+
int | None,
|
|
933
|
+
typer.Option(
|
|
934
|
+
"--max-concurrent-jobs",
|
|
935
|
+
help=(
|
|
936
|
+
"Maximum number of this project's jobs allowed in the queue "
|
|
937
|
+
"at once, or 0 to remove the limit."
|
|
938
|
+
),
|
|
939
|
+
),
|
|
940
|
+
] = None,
|
|
931
941
|
) -> None:
|
|
932
942
|
"""Update a SLURM environment."""
|
|
933
943
|
ck_info, env = _load_env(env_name)
|
|
@@ -959,6 +969,15 @@ def update_slurm_env(
|
|
|
959
969
|
env["default_setup"] = cmds
|
|
960
970
|
elif "default_setup" in env:
|
|
961
971
|
del env["default_setup"]
|
|
972
|
+
if max_concurrent_jobs is not None:
|
|
973
|
+
if max_concurrent_jobs < 0:
|
|
974
|
+
raise_error("--max-concurrent-jobs cannot be negative")
|
|
975
|
+
# 0 is the way to clear the limit, since omitting the option means
|
|
976
|
+
# "leave it alone" rather than "unlimited".
|
|
977
|
+
if max_concurrent_jobs == 0:
|
|
978
|
+
env.pop("max_concurrent_jobs", None)
|
|
979
|
+
else:
|
|
980
|
+
env["max_concurrent_jobs"] = max_concurrent_jobs
|
|
962
981
|
calkit.save_calkit_info(ck_info)
|
|
963
982
|
typer.echo(f"Updated slurm environment '{env_name}'")
|
|
964
983
|
|