calkit-python 0.41.22__tar.gz → 0.41.23__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.41.22 → calkit_python-0.41.23}/PKG-INFO +1 -1
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/overleaf.py +24 -50
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/overleaf.py +63 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/test_overleaf.py +32 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/.claude-plugin/marketplace.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/.gitattributes +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/.gitignore +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/.gitmodules +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/.pre-commit-config.yaml +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/.prettierignore +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/.prettierrc.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/.python-version +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/.vscode/launch.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/.vscode/tasks.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/AGENTS.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/CITATION.cff +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/CODE_OF_CONDUCT.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/CONTRIBUTING.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/LICENSE +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/Makefile +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/README.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/agent-plugin/.claude-plugin/plugin.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/agent-plugin/skills/add-pipeline-stage/SKILL.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/agent-plugin/skills/conventions/SKILL.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/agent-plugin/skills/create-pipeline/SKILL.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/__init__.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/__main__.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/calc.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/check.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/__init__.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/check.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/cloud.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/config.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/core.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/delete.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/describe.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/dev.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/import_.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/latex.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/list.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/main/__init__.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/main/core.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/main/xr.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/new.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/notebooks.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/office.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/scheduler.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cli/update.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/cloud.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/conda.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/config.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/core.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/datasets.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/dependencies.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/detect.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/docker.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/dvc/__init__.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/dvc/core.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/dvc/zip.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/environments.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/fs.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/git.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/github.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/gui.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/install.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/invenio.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/julia.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/jupyter.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/jupyterlab/__init__.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/jupyterlab/routes.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/package.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/schemas/calkit/package.json.orig +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/schemas/calkit/plugin.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/static/502.9a2c5772a15466e923ef.js +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/static/695.2c41003a452d43d2b358.js +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/static/867.a42a046aa5108f54f8fb.js +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/static/909.e3f9cc3408834a7fdcc3.js +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/static/b2f1c3efe70cb539d121.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/static/remoteEntry.ac9035764d5b2adbb542.js +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/static/style.js +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/static/third-party-licenses.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/licenses.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/magics.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/matlab.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/models/__init__.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/models/core.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/models/io.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/models/iteration.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/models/pipeline.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/notebooks.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/office.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/ops.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/pipeline.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/releases.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/server.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/templates/__init__.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/templates/core.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/templates/latex/__init__.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/templates/latex/article/paper.tex +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/templates/latex/core.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/templates/latex/jfm/jfm.bst +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/templates/latex/jfm/jfm.cls +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/templates/latex/jfm/paper.tex +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/templates/latex/jfm/upmath.sty +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/__init__.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/__init__.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/main/__init__.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/main/test_core.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/main/test_lock.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/main/test_subprojects.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/main/test_xr.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/test_check.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/test_cloud.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/test_config.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/test_delete.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/test_import.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/test_latex.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/test_list.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/test_new.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/test_notebooks.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/test_scheduler.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/cli/test_update.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/dvc/__init__.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/dvc/test_core.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/dvc/test_zip.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/jupyterlab/__init__.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/jupyterlab/conftest.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/jupyterlab/test_routes.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/models/__init__.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/models/test_core.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/models/test_iteration.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/models/test_pipeline.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_calc.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_check.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_cloud.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_conda.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_core.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_dependencies.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_detect.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_docker.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_environments.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_fs.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_git.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_install.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_invenio.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_julia.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_jupyter.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_licenses.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_magics.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_matlab.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_notebooks.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_pipeline.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_releases.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/tests/test_templates.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/CNAME +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/acknowledgements.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/ai-tools.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/apps.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/calculations.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/calkit-yaml.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/cli-reference.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/cloud-integration.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/datasets.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/dependencies.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/environments.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/examples.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/governance.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/help.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/hpc.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/img/c-to-the-k-white.svg +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/img/calkit-fragmentation-compendium.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/img/calkit-no-bg.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/img/caltech.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/img/connect-zenodo.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/img/jupyterlab/all-green.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/img/jupyterlab/collect-data-stale.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/img/jupyterlab/new-env.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/img/jupyterlab/new-notebook.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/img/jupyterlab/pipeline-badge.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/img/jupyterlab-params.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/img/pipeline.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/img/plos-osi-code-2024-03.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/img/schmidt-sciences.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/img/vscode-nb-params.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/index.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/installation.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/jupyterlab.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/local-server.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/notebooks.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/overleaf.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/pipeline/index.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/pipeline/manual-steps.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/pipeline/running-and-logging.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/questions.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/quickstart.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/references.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/releases.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/reproducibility.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/subprojects.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/adding-latex-pub-docker.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/ai-agents.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/conda-envs.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/existing-project.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/first-project.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/github-actions.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/actions-repo-secrets.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/latex-codespaces/push.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/chart-more-rows.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/create-project.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/excel-chart.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/excel-data.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/needs-clone.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/new-stage.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/status-more-rows.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/untracked-data.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/updated-publication.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/office/workflow-page.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/openfoam/clone.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/openfoam/create-project.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/openfoam/new-token.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/openfoam/reclone.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/quick-actions.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/run-proc.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/vscode-slurm-notebook/create-calkit-env.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/vscode-slurm-notebook/create-inner-env.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/vscode-slurm-notebook/create-new-calkit-env.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/vscode-slurm-notebook/select-calkit-env.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/vscode-slurm-notebook/slurm-job-running.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/vscode-slurm-notebook/slurm-launch-options.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/img/vscode-slurm-notebook/starting-slurm-job.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/index.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/jupyterlab.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/latex-codespaces.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/matlab.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/notebook-pipeline.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/office.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/openfoam.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/procedures.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/tutorials/vscode-slurm-notebook.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/docs/version-control.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/flake.lock +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/flake.nix +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/.yarnrc.yml +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/babel.config.js +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/install.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/jest.config.js +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/jupyter-config/server-config/calkit.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/package.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/schema/plugin.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/__tests__/useQueries.spec.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/calkit-config.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/cell-output-marker.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/components/commit-dialog.tsx +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/components/environment-editor.tsx +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/components/notebook-registration.tsx +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/components/notebook-toolbar.tsx +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/components/pipeline-status-bar.tsx +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/components/project-info-editor.tsx +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/components/sidebar-settings.tsx +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/components/sidebar.tsx +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/components/stage-editor.tsx +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/feature-flags.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/file-browser-menu.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/hooks/__tests__/useQueries.test.tsx +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/hooks/useQueries.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/icons.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/index.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/io-tracker.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/pipeline-state.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/queryClient.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/request.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/src/shims-mainmenu.d.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/style/base.css +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/style/cell-output-marker.css +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/style/environment-editor.css +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/style/environment-selector.css +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/style/img/calkit-no-bg.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/style/index.css +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/style/index.js +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/style/notebook-toolbar.css +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/style/pipeline-status-bar.css +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/style/sidebar.css +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/tsconfig.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/tsconfig.test.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/ui-tests/.gitignore +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/ui-tests/README.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/ui-tests/jupyter_server_test_config.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/ui-tests/package.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/ui-tests/playwright.config.js +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/ui-tests/tests/calkit.spec.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/ui-tests/yarn.lock +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/jupyterlab-ext/yarn.lock +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/mkdocs.yml +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/pyproject.toml +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/scripts/generate-docs-references.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/scripts/install.ps1 +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/scripts/install.sh +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/scripts/make-calk9.sh +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/scripts/sync-docs.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/test/dvc-md5-dir/osx-arm64.txt +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/test/nb-julia.ipynb +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/test/nb-params.ipynb +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/test/nb-subdir.ipynb +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/test/pipeline.ipynb +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/test/script.py +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/test/test-log.log +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/uv.lock +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/.gitignore +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/.vscodeignore +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/CHANGELOG.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/LICENSE +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/README.md +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/images/calkit-icon.svg +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/images/calkit-no-bg.png +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/package-lock.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/package.json +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/scripts/set-proposed-api.js +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/src/environments.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/src/extension.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/src/figures/core.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/src/figures/view.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/src/notebooks.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/src/pipeline/core.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/src/sidebar.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/src/test/environments.test.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/src/test/figures.test.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/src/test/kernel-selection.test.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/src/test/notebooks.test.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/src/test/pipeline.test.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/src/types.ts +0 -0
- {calkit_python-0.41.22 → calkit_python-0.41.23}/vscode-ext/tsconfig.json +0 -0
|
@@ -16,6 +16,20 @@ from calkit.cli import AliasGroup, raise_error, warn
|
|
|
16
16
|
|
|
17
17
|
overleaf_app = typer.Typer(cls=AliasGroup, no_args_is_help=True)
|
|
18
18
|
|
|
19
|
+
# Shown when a pull from Overleaf fails, most commonly due to an invalid or
|
|
20
|
+
# expired token. Calkit authenticates only with the token in its config, but a
|
|
21
|
+
# stale token cached by the OS credential manager from an earlier version can
|
|
22
|
+
# still interfere, so we point users there as a fallback.
|
|
23
|
+
PULL_FAILED_MESSAGE = (
|
|
24
|
+
"Failed to pull from Overleaf; "
|
|
25
|
+
"check that your Overleaf token is valid\n"
|
|
26
|
+
"Run 'calkit config get overleaf_token' and ensure that it matches one in "
|
|
27
|
+
"your Overleaf account settings (https://overleaf.com/user/settings).\n"
|
|
28
|
+
"If it looks correct but pulling still fails, delete any saved "
|
|
29
|
+
"'git.overleaf.com' credential from your OS credential manager (Windows "
|
|
30
|
+
"Credential Manager, macOS Keychain, or your Linux keyring) and try again."
|
|
31
|
+
)
|
|
32
|
+
|
|
19
33
|
|
|
20
34
|
def _extract_title_from_tex(tex_file_path: str) -> str | None:
|
|
21
35
|
"""Extract the title from a LaTeX file."""
|
|
@@ -169,8 +183,6 @@ def import_publication(
|
|
|
169
183
|
] = False,
|
|
170
184
|
):
|
|
171
185
|
"""Import a publication from an Overleaf project."""
|
|
172
|
-
import git
|
|
173
|
-
|
|
174
186
|
from calkit.cli.main import ignore as git_ignore
|
|
175
187
|
from calkit.cli.new import new_latex_stage
|
|
176
188
|
|
|
@@ -202,16 +214,13 @@ def import_publication(
|
|
|
202
214
|
overleaf_dir = os.path.join(".calkit", "overleaf")
|
|
203
215
|
os.makedirs(overleaf_dir, exist_ok=True)
|
|
204
216
|
git_ignore(overleaf_dir, no_commit=no_commit)
|
|
205
|
-
overleaf_project_dir =
|
|
206
|
-
git_clone_url = calkit.overleaf.get_git_remote_url(
|
|
207
|
-
project_id=overleaf_project_id, token=overleaf_token
|
|
208
|
-
)
|
|
217
|
+
overleaf_project_dir = calkit.overleaf.get_project_dir(overleaf_project_id)
|
|
209
218
|
if os.path.isdir(overleaf_project_dir):
|
|
210
219
|
warn("This Overleaf project has already been cloned; removing")
|
|
211
220
|
shutil.rmtree(overleaf_project_dir)
|
|
212
221
|
# Clone the Overleaf project
|
|
213
222
|
typer.echo("Cloning Overleaf project")
|
|
214
|
-
|
|
223
|
+
calkit.overleaf.clone(overleaf_project_id, overleaf_token)
|
|
215
224
|
# Detect target path if not specified
|
|
216
225
|
if target_path is None:
|
|
217
226
|
ol_contents = os.listdir(
|
|
@@ -428,8 +437,6 @@ def sync(
|
|
|
428
437
|
] = False,
|
|
429
438
|
):
|
|
430
439
|
"""Sync folders with Overleaf."""
|
|
431
|
-
import git
|
|
432
|
-
|
|
433
440
|
# TODO: We should probably ensure the pipeline isn't stale
|
|
434
441
|
# Read all synced folders, fixing legacy schema if applicable
|
|
435
442
|
overleaf_info = calkit.overleaf.get_sync_info(fix_legacy=True)
|
|
@@ -504,32 +511,15 @@ def sync(
|
|
|
504
511
|
"or use --auto-commit/-a to automatically commit them."
|
|
505
512
|
)
|
|
506
513
|
# Ensure we've cloned the Overleaf project
|
|
507
|
-
|
|
508
|
-
|
|
514
|
+
overleaf_repo = calkit.overleaf.get_repo(
|
|
515
|
+
overleaf_project_id, str(overleaf_token)
|
|
509
516
|
)
|
|
510
|
-
overleaf_remote_url = calkit.overleaf.get_git_remote_url(
|
|
511
|
-
project_id=overleaf_project_id, token=str(overleaf_token)
|
|
512
|
-
)
|
|
513
|
-
if not os.path.isdir(overleaf_project_dir):
|
|
514
|
-
overleaf_repo = git.Repo.clone_from(
|
|
515
|
-
overleaf_remote_url, to_path=overleaf_project_dir
|
|
516
|
-
)
|
|
517
|
-
else:
|
|
518
|
-
overleaf_repo = calkit.git.get_repo(overleaf_project_dir)
|
|
519
517
|
# Pull the latest version in the Overleaf project
|
|
520
518
|
typer.echo("Pulling the latest version from Overleaf")
|
|
521
|
-
# Ensure that our current Overleaf remote URL is correct
|
|
522
|
-
overleaf_repo.git.remote("set-url", "origin", overleaf_remote_url)
|
|
523
519
|
try:
|
|
524
520
|
overleaf_repo.git.pull()
|
|
525
521
|
except Exception:
|
|
526
|
-
raise_error(
|
|
527
|
-
"Failed to pull from Overleaf; "
|
|
528
|
-
"check that your Overleaf token is valid\n"
|
|
529
|
-
"Run 'calkit config get overleaf_token' and ensure that "
|
|
530
|
-
"it matches one in your Overleaf account settings "
|
|
531
|
-
"(https://overleaf.com/user/settings)"
|
|
532
|
-
)
|
|
522
|
+
raise_error(PULL_FAILED_MESSAGE)
|
|
533
523
|
if resolve:
|
|
534
524
|
last_sync_commit = resolving_info["last_overleaf_commit"]
|
|
535
525
|
else:
|
|
@@ -608,8 +598,6 @@ def get_status(
|
|
|
608
598
|
] = None,
|
|
609
599
|
):
|
|
610
600
|
"""Check the status of folders synced with Overleaf in a project."""
|
|
611
|
-
import git
|
|
612
|
-
|
|
613
601
|
# Read all synced folders, fixing legacy schema if applicable
|
|
614
602
|
overleaf_info = calkit.overleaf.get_sync_info(fix_legacy=False)
|
|
615
603
|
if not overleaf_info:
|
|
@@ -642,32 +630,18 @@ def get_status(
|
|
|
642
630
|
)
|
|
643
631
|
wdir = path_in_project
|
|
644
632
|
# Ensure we've cloned the Overleaf project
|
|
645
|
-
overleaf_project_dir =
|
|
646
|
-
|
|
633
|
+
overleaf_project_dir = calkit.overleaf.get_project_dir(
|
|
634
|
+
overleaf_project_id
|
|
647
635
|
)
|
|
648
|
-
|
|
649
|
-
|
|
636
|
+
overleaf_repo = calkit.overleaf.get_repo(
|
|
637
|
+
overleaf_project_id, str(overleaf_token)
|
|
650
638
|
)
|
|
651
|
-
if not os.path.isdir(overleaf_project_dir):
|
|
652
|
-
overleaf_repo = git.Repo.clone_from(
|
|
653
|
-
overleaf_remote_url, to_path=overleaf_project_dir
|
|
654
|
-
)
|
|
655
|
-
else:
|
|
656
|
-
overleaf_repo = calkit.git.get_repo(overleaf_project_dir)
|
|
657
639
|
# Pull the latest version in the Overleaf project
|
|
658
640
|
typer.echo("Pulling the latest version from Overleaf")
|
|
659
|
-
# Ensure that our current Overleaf remote URL is correct
|
|
660
|
-
overleaf_repo.git.remote("set-url", "origin", overleaf_remote_url)
|
|
661
641
|
try:
|
|
662
642
|
overleaf_repo.git.pull()
|
|
663
643
|
except Exception:
|
|
664
|
-
raise_error(
|
|
665
|
-
"Failed to pull from Overleaf; "
|
|
666
|
-
"check that your Overleaf token is valid\n"
|
|
667
|
-
"Run 'calkit config get overleaf_token' and ensure that "
|
|
668
|
-
"it matches one in your Overleaf account settings "
|
|
669
|
-
"(https://overleaf.com/user/settings)"
|
|
670
|
-
)
|
|
644
|
+
raise_error(PULL_FAILED_MESSAGE)
|
|
671
645
|
last_sync_commit = sync_data.get("last_sync_commit")
|
|
672
646
|
if last_sync_commit:
|
|
673
647
|
commits_since = calkit.overleaf.get_commits_since_last_sync(
|
|
@@ -30,6 +30,69 @@ def get_git_remote_url(project_id: str, token: str) -> str:
|
|
|
30
30
|
return f"https://git:{token}@git.overleaf.com/{project_id}"
|
|
31
31
|
|
|
32
32
|
|
|
33
|
+
# Git config options that force authentication to use only the token embedded
|
|
34
|
+
# in the Overleaf remote URL, never a credential saved in the operating
|
|
35
|
+
# system's credential store (macOS Keychain, Windows Credential Manager, etc.).
|
|
36
|
+
# An expired token can linger in that store and shadow a freshly set one, which
|
|
37
|
+
# otherwise makes it impossible to recover a project after a token expires.
|
|
38
|
+
_CREDENTIAL_CLONE_OPTIONS = [
|
|
39
|
+
"-c credential.helper=",
|
|
40
|
+
"-c credential.interactive=false",
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _disable_credential_store(repo: git.Repo) -> None:
|
|
45
|
+
"""Configure a cloned Overleaf repo so git authenticates only with the
|
|
46
|
+
token embedded in its remote URL, ignoring the OS credential store.
|
|
47
|
+
|
|
48
|
+
Setting an empty ``credential.helper`` in the repo's local config resets
|
|
49
|
+
the list of helpers inherited from the system and global config, so no
|
|
50
|
+
stale token can be read from (or written to) the credential store.
|
|
51
|
+
"""
|
|
52
|
+
repo.git.config("credential.helper", "")
|
|
53
|
+
repo.git.config("credential.interactive", "false")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def get_project_dir(project_id: str) -> str:
|
|
57
|
+
"""Return the local directory into which an Overleaf project is cloned,
|
|
58
|
+
relative to the Calkit project working directory.
|
|
59
|
+
"""
|
|
60
|
+
return os.path.join(".calkit", "overleaf", project_id)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def clone(project_id: str, token: str) -> git.Repo:
|
|
64
|
+
"""Clone an Overleaf project, authenticating only with ``token``."""
|
|
65
|
+
repo = git.Repo.clone_from(
|
|
66
|
+
get_git_remote_url(project_id=project_id, token=token),
|
|
67
|
+
get_project_dir(project_id),
|
|
68
|
+
multi_options=_CREDENTIAL_CLONE_OPTIONS,
|
|
69
|
+
allow_unsafe_options=True,
|
|
70
|
+
)
|
|
71
|
+
_disable_credential_store(repo)
|
|
72
|
+
return repo
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def get_repo(project_id: str, token: str) -> git.Repo:
|
|
76
|
+
"""Return the Overleaf repo for ``project_id``, cloning it if it does not
|
|
77
|
+
yet exist.
|
|
78
|
+
|
|
79
|
+
When the repo already exists, its remote URL is refreshed so a freshly set
|
|
80
|
+
token takes effect, and credential handling is reset so a stale token from
|
|
81
|
+
the OS credential store is never used.
|
|
82
|
+
"""
|
|
83
|
+
dest = get_project_dir(project_id)
|
|
84
|
+
if not os.path.isdir(dest):
|
|
85
|
+
return clone(project_id, token)
|
|
86
|
+
repo = calkit.git.get_repo(dest)
|
|
87
|
+
repo.git.remote(
|
|
88
|
+
"set-url",
|
|
89
|
+
"origin",
|
|
90
|
+
get_git_remote_url(project_id=project_id, token=token),
|
|
91
|
+
)
|
|
92
|
+
_disable_credential_store(repo)
|
|
93
|
+
return repo
|
|
94
|
+
|
|
95
|
+
|
|
33
96
|
def project_id_to_url(project_id: str) -> str:
|
|
34
97
|
return f"https://www.overleaf.com/project/{project_id}"
|
|
35
98
|
|
|
@@ -409,3 +409,35 @@ def test_overleaf_sync_trailing_slash_or_space(tmp_dir):
|
|
|
409
409
|
text=True,
|
|
410
410
|
)
|
|
411
411
|
assert res2.returncode == 0, f"Trailing space sync failed: {res2.stderr}"
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
def test_get_repo_disables_credential_store(tmp_dir):
|
|
415
|
+
# Set up a repo to act as the Overleaf remote (in the test env the remote
|
|
416
|
+
# URL is a local directory)
|
|
417
|
+
pid = str(uuid.uuid4())
|
|
418
|
+
_make_temp_overleaf_project(pid)
|
|
419
|
+
dest = calkit.overleaf.get_project_dir(pid)
|
|
420
|
+
# A fresh clone should reset the credential helper for that repo so only
|
|
421
|
+
# the token in its remote URL is used, never a stale one from the OS
|
|
422
|
+
# credential store
|
|
423
|
+
repo = calkit.overleaf.clone(pid, "sometoken")
|
|
424
|
+
assert os.path.isdir(os.path.join(dest, ".git"))
|
|
425
|
+
assert repo.git.config(["--local", "--get", "credential.helper"]) == ""
|
|
426
|
+
assert (
|
|
427
|
+
repo.git.config(["--local", "--get", "credential.interactive"])
|
|
428
|
+
== "false"
|
|
429
|
+
)
|
|
430
|
+
# Opening an already-cloned project should refresh the remote URL so an
|
|
431
|
+
# updated token takes effect, and keep the credential store disabled
|
|
432
|
+
repo2 = calkit.overleaf.get_repo(pid, "newtoken")
|
|
433
|
+
assert repo2.git.remote(
|
|
434
|
+
["get-url", "origin"]
|
|
435
|
+
) == calkit.overleaf.get_git_remote_url(pid, "newtoken")
|
|
436
|
+
assert repo2.git.config(["--local", "--get", "credential.helper"]) == ""
|
|
437
|
+
# A project that has not yet been cloned should be cloned
|
|
438
|
+
pid2 = str(uuid.uuid4())
|
|
439
|
+
_make_temp_overleaf_project(pid2)
|
|
440
|
+
calkit.overleaf.get_repo(pid2, "sometoken")
|
|
441
|
+
assert os.path.isdir(
|
|
442
|
+
os.path.join(calkit.overleaf.get_project_dir(pid2), ".git")
|
|
443
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{calkit_python-0.41.22 → calkit_python-0.41.23}/agent-plugin/skills/add-pipeline-stage/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
{calkit_python-0.41.22 → calkit_python-0.41.23}/agent-plugin/skills/create-pipeline/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/schemas/calkit/package.json.orig
RENAMED
|
File without changes
|
{calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/schemas/calkit/plugin.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/static/b2f1c3efe70cb539d121.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{calkit_python-0.41.22 → calkit_python-0.41.23}/calkit/labextension/static/third-party-licenses.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|