jupyverse 0.7.5__tar.gz → 0.7.7__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.
- {jupyverse-0.7.5 → jupyverse-0.7.7}/.github/workflows/check-release.yml +1 -1
- jupyverse-0.7.7/.github/workflows/prep-release.yml +48 -0
- jupyverse-0.7.7/.github/workflows/publish-release.yml +58 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/.pre-commit-config.yaml +1 -1
- {jupyverse-0.7.5 → jupyverse-0.7.7}/CHANGELOG.md +37 -2
- {jupyverse-0.7.5 → jupyverse-0.7.7}/PKG-INFO +2 -1
- jupyverse-0.7.7/jupyverse/__init__.py +1 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/__init__.py +9 -9
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/app/__init__.py +2 -3
- jupyverse-0.7.7/jupyverse_api/jupyverse_api/auth/__init__.py +27 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/auth/models.py +4 -4
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/cli.py +36 -17
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/contents/__init__.py +20 -37
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/contents/models.py +9 -9
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/jupyterlab/__init__.py +5 -10
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/kernels/__init__.py +19 -33
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/kernels/models.py +3 -3
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/lab/__init__.py +15 -26
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/login/__init__.py +1 -2
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/main/__init__.py +3 -4
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/nbconvert/__init__.py +2 -4
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/notebook/__init__.py +5 -10
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/resource_usage/__init__.py +1 -2
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/terminals/__init__.py +7 -14
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/yjs/__init__.py +3 -6
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/pyproject.toml +1 -1
- jupyverse-0.7.7/plugins/auth/fps_auth/__init__.py +1 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth/fps_auth/backends.py +13 -11
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth/fps_auth/config.py +4 -3
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth/fps_auth/db.py +3 -2
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth/fps_auth/main.py +10 -10
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth/fps_auth/models.py +1 -2
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth/fps_auth/routes.py +10 -7
- jupyverse-0.7.7/plugins/auth_fief/fps_auth_fief/__init__.py +1 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_fief/fps_auth_fief/backend.py +7 -5
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_fief/fps_auth_fief/main.py +3 -3
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_fief/fps_auth_fief/routes.py +9 -6
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_jupyterhub/fps_auth_jupyterhub/__init__.py +1 -1
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_jupyterhub/fps_auth_jupyterhub/main.py +3 -3
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_jupyterhub/fps_auth_jupyterhub/models.py +1 -2
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_jupyterhub/fps_auth_jupyterhub/routes.py +11 -11
- jupyverse-0.7.7/plugins/contents/fps_contents/__init__.py +1 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/contents/fps_contents/fileid.py +15 -12
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/contents/fps_contents/routes.py +9 -9
- jupyverse-0.7.7/plugins/frontend/fps_frontend/__init__.py +1 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/frontend/fps_frontend/main.py +2 -2
- jupyverse-0.7.7/plugins/jupyterlab/fps_jupyterlab/__init__.py +1 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/jupyterlab/fps_jupyterlab/main.py +3 -3
- jupyverse-0.7.7/plugins/kernels/fps_kernels/__init__.py +1 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_driver/connect.py +36 -12
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_driver/driver.py +19 -6
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_driver/message.py +30 -25
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_driver/paths.py +4 -5
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_server/message.py +16 -14
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_server/server.py +114 -81
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/main.py +4 -4
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/routes.py +23 -15
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/kernels/pyproject.toml +1 -0
- jupyverse-0.7.7/plugins/lab/fps_lab/__init__.py +1 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/lab/fps_lab/routes.py +4 -3
- jupyverse-0.7.7/plugins/login/fps_login/__init__.py +1 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/fps_login/routes.py +4 -2
- jupyverse-0.7.7/plugins/nbconvert/fps_nbconvert/__init__.py +1 -0
- jupyverse-0.7.7/plugins/noauth/fps_noauth/__init__.py +1 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/noauth/fps_noauth/backends.py +6 -4
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/noauth/fps_noauth/main.py +0 -1
- jupyverse-0.7.7/plugins/notebook/fps_notebook/__init__.py +1 -0
- jupyverse-0.7.7/plugins/resource_usage/fps_resource_usage/__init__.py +1 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/resource_usage/fps_resource_usage/main.py +2 -2
- jupyverse-0.7.7/plugins/terminals/fps_terminals/__init__.py +1 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/terminals/fps_terminals/main.py +1 -2
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/terminals/fps_terminals/routes.py +3 -3
- jupyverse-0.7.7/plugins/webdav/fps_webdav/__init__.py +1 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/webdav/fps_webdav/config.py +3 -4
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/webdav/fps_webdav/main.py +2 -2
- jupyverse-0.7.7/plugins/yjs/fps_yjs/__init__.py +1 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/main.py +2 -2
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/routes.py +5 -6
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ydocs/utils.py +5 -5
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ydocs/ybasedoc.py +8 -6
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ydocs/yblob.py +5 -3
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ydocs/ynotebook.py +10 -8
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ydocs/yunicode.py +4 -2
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/asgi_server.py +2 -1
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/websocket.py +1 -5
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/yroom.py +2 -1
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/ystore.py +2 -1
- {jupyverse-0.7.5 → jupyverse-0.7.7}/pyproject.toml +2 -1
- {jupyverse-0.7.5 → jupyverse-0.7.7}/tests/conftest.py +0 -1
- {jupyverse-0.7.5 → jupyverse-0.7.7}/tests/test_kernels.py +1 -1
- {jupyverse-0.7.5 → jupyverse-0.7.7}/tests/utils.py +5 -5
- jupyverse-0.7.5/jupyverse/__init__.py +0 -1
- jupyverse-0.7.5/jupyverse_api/jupyverse_api/auth/__init__.py +0 -27
- jupyverse-0.7.5/plugins/auth/fps_auth/__init__.py +0 -1
- jupyverse-0.7.5/plugins/auth_fief/fps_auth_fief/__init__.py +0 -1
- jupyverse-0.7.5/plugins/contents/fps_contents/__init__.py +0 -1
- jupyverse-0.7.5/plugins/frontend/fps_frontend/__init__.py +0 -1
- jupyverse-0.7.5/plugins/jupyterlab/fps_jupyterlab/__init__.py +0 -1
- jupyverse-0.7.5/plugins/kernels/fps_kernels/__init__.py +0 -1
- jupyverse-0.7.5/plugins/lab/fps_lab/__init__.py +0 -1
- jupyverse-0.7.5/plugins/login/fps_login/__init__.py +0 -1
- jupyverse-0.7.5/plugins/nbconvert/fps_nbconvert/__init__.py +0 -1
- jupyverse-0.7.5/plugins/noauth/fps_noauth/__init__.py +0 -1
- jupyverse-0.7.5/plugins/notebook/fps_notebook/__init__.py +0 -1
- jupyverse-0.7.5/plugins/resource_usage/fps_resource_usage/__init__.py +0 -1
- jupyverse-0.7.5/plugins/terminals/fps_terminals/__init__.py +0 -1
- jupyverse-0.7.5/plugins/webdav/fps_webdav/__init__.py +0 -1
- jupyverse-0.7.5/plugins/yjs/fps_yjs/__init__.py +0 -1
- {jupyverse-0.7.5 → jupyverse-0.7.7}/.devcontainer/devcontainer.json +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/.devcontainer/requirements.txt +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/.github/workflows/test.yml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/.gitignore +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/CONTRIBUTING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/binder/environment.yml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/binder/jupyter_notebook_config.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/binder/postBuild +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/binder/start +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/index.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/install.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/jupyter.svg +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/plugins/auth.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/plugins/contents.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/plugins/frontend.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/plugins/jupyterlab.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/plugins/kernels.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/plugins/lab.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/plugins/login.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/plugins/nbconvert.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/plugins/notebook.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/plugins/resource_usage.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/plugins/terminals.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/plugins/yjs.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/tutorials/jupyterhub_jupyverse_deployment.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/tutorials/standalone_jupyverse_deployment.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/usage/microservices.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/usage/multi_user.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/docs/usage/single_user.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/exceptions.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/frontend/__init__.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/terminals/models.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/yjs/models.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/jupyverse_api/tests/test_resource_lock.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/mkdocs.yml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/notebooks/admin_users.ipynb +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/notebooks/admin_users.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth/fps_auth/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth/pyproject.toml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_fief/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_fief/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_fief/fps_auth_fief/config.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_fief/fps_auth_fief/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_fief/pyproject.toml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_jupyterhub/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_jupyterhub/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_jupyterhub/fps_auth_jupyterhub/config.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_jupyterhub/fps_auth_jupyterhub/db.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_jupyterhub/fps_auth_jupyterhub/launch.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_jupyterhub/fps_auth_jupyterhub/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/auth_jupyterhub/pyproject.toml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/contents/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/contents/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/contents/fps_contents/main.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/contents/fps_contents/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/contents/pyproject.toml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/frontend/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/frontend/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/frontend/fps_frontend/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/frontend/pyproject.toml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/jupyterlab/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/jupyterlab/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/jupyterlab/fps_jupyterlab/index.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/jupyterlab/fps_jupyterlab/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/jupyterlab/fps_jupyterlab/routes.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/jupyterlab/pyproject.toml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/kernels/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/kernels/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_driver/__init__.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_driver/kernelspec.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_server/__init__.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/lab/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/lab/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/lab/fps_lab/main.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/lab/fps_lab/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/lab/fps_lab/static/favicon.ico +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/lab/pyproject.toml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/fps_login/main.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/fps_login/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/fps_login/static/favicons/favicon-busy-1.ico +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/fps_login/static/favicons/favicon-busy-2.ico +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/fps_login/static/favicons/favicon-busy-3.ico +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/fps_login/static/favicons/favicon-file.ico +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/fps_login/static/favicons/favicon-notebook.ico +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/fps_login/static/favicons/favicon-terminal.ico +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/fps_login/static/favicons/favicon.ico +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/fps_login/static/index.html +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/fps_login/static/logo/github.svg +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/fps_login/static/logo/logo.png +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/fps_login/static/style/index.css +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/login/pyproject.toml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/nbconvert/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/nbconvert/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/nbconvert/fps_nbconvert/main.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/nbconvert/fps_nbconvert/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/nbconvert/fps_nbconvert/routes.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/nbconvert/pyproject.toml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/noauth/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/noauth/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/noauth/fps_noauth/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/noauth/pyproject.toml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/notebook/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/notebook/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/notebook/fps_notebook/main.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/notebook/fps_notebook/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/notebook/fps_notebook/routes.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/notebook/pyproject.toml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/resource_usage/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/resource_usage/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/resource_usage/fps_resource_usage/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/resource_usage/fps_resource_usage/routes.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/resource_usage/pyproject.toml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/terminals/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/terminals/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/terminals/fps_terminals/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/terminals/fps_terminals/server.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/terminals/fps_terminals/win_server.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/terminals/pyproject.toml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/webdav/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/webdav/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/webdav/fps_webdav/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/webdav/fps_webdav/routes.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/webdav/pyproject.toml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/webdav/tests/conftest.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/webdav/tests/test_webdav.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/COPYING.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/README.md +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/py.typed +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ydocs/__init__.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ydocs/yfile.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/__init__.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/awareness.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/django_channels_consumer.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/websocket_provider.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/websocket_server.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/yutils.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywidgets/__init__.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywidgets/widgets.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/plugins/yjs/pyproject.toml +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/pytest.ini +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/tests/data/notebook0.ipynb +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/tests/data/notebook1.ipynb +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/tests/test_app.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/tests/test_auth.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/tests/test_contents.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/tests/test_execute.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/tests/test_server.py +0 -0
- {jupyverse-0.7.5 → jupyverse-0.7.7}/tests/test_settings.py +0 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
name: "Step 1: Prep Release"
|
2
|
+
on:
|
3
|
+
workflow_dispatch:
|
4
|
+
inputs:
|
5
|
+
version_spec:
|
6
|
+
description: "New Version Specifier"
|
7
|
+
default: "next"
|
8
|
+
required: false
|
9
|
+
branch:
|
10
|
+
description: "The branch to target"
|
11
|
+
required: false
|
12
|
+
post_version_spec:
|
13
|
+
description: "Post Version Specifier"
|
14
|
+
required: false
|
15
|
+
# silent:
|
16
|
+
# description: "Set a placeholder in the changelog and don't publish the release."
|
17
|
+
# required: false
|
18
|
+
# type: boolean
|
19
|
+
since:
|
20
|
+
description: "Use PRs with activity since this date or git reference"
|
21
|
+
required: false
|
22
|
+
since_last_stable:
|
23
|
+
description: "Use PRs with activity since the last stable git tag"
|
24
|
+
required: false
|
25
|
+
type: boolean
|
26
|
+
jobs:
|
27
|
+
prep_release:
|
28
|
+
runs-on: ubuntu-latest
|
29
|
+
permissions:
|
30
|
+
contents: write
|
31
|
+
steps:
|
32
|
+
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
33
|
+
|
34
|
+
- name: Prep Release
|
35
|
+
id: prep-release
|
36
|
+
uses: jupyter-server/jupyter_releaser/.github/actions/prep-release@v2
|
37
|
+
with:
|
38
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
39
|
+
version_spec: ${{ github.event.inputs.version_spec }}
|
40
|
+
# silent: ${{ github.event.inputs.silent }}
|
41
|
+
post_version_spec: ${{ github.event.inputs.post_version_spec }}
|
42
|
+
branch: ${{ github.event.inputs.branch }}
|
43
|
+
since: ${{ github.event.inputs.since }}
|
44
|
+
since_last_stable: ${{ github.event.inputs.since_last_stable }}
|
45
|
+
|
46
|
+
- name: "** Next Step **"
|
47
|
+
run: |
|
48
|
+
echo "Optional): Review Draft Release: ${{ steps.prep-release.outputs.release_url }}"
|
@@ -0,0 +1,58 @@
|
|
1
|
+
name: "Step 2: Publish Release"
|
2
|
+
on:
|
3
|
+
workflow_dispatch:
|
4
|
+
inputs:
|
5
|
+
branch:
|
6
|
+
description: "The target branch"
|
7
|
+
required: false
|
8
|
+
release_url:
|
9
|
+
description: "The URL of the draft GitHub release"
|
10
|
+
required: false
|
11
|
+
steps_to_skip:
|
12
|
+
description: "Comma separated list of steps to skip"
|
13
|
+
required: false
|
14
|
+
|
15
|
+
jobs:
|
16
|
+
publish_release:
|
17
|
+
runs-on: ubuntu-latest
|
18
|
+
environment: release
|
19
|
+
permissions:
|
20
|
+
id-token: write
|
21
|
+
steps:
|
22
|
+
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
23
|
+
|
24
|
+
- uses: actions/create-github-app-token@v1
|
25
|
+
id: app-token
|
26
|
+
with:
|
27
|
+
app-id: ${{ vars.APP_ID }}
|
28
|
+
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
29
|
+
|
30
|
+
- name: Populate Release
|
31
|
+
id: populate-release
|
32
|
+
uses: jupyter-server/jupyter_releaser/.github/actions/populate-release@v2
|
33
|
+
with:
|
34
|
+
token: ${{ steps.app-token.outputs.token }}
|
35
|
+
branch: ${{ github.event.inputs.branch }}
|
36
|
+
release_url: ${{ github.event.inputs.release_url }}
|
37
|
+
steps_to_skip: ${{ github.event.inputs.steps_to_skip }}
|
38
|
+
|
39
|
+
- name: Finalize Release
|
40
|
+
id: finalize-release
|
41
|
+
env:
|
42
|
+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
43
|
+
uses: jupyter-server/jupyter_releaser/.github/actions/finalize-release@v2
|
44
|
+
with:
|
45
|
+
token: ${{ steps.app-token.outputs.token }}
|
46
|
+
release_url: ${{ steps.populate-release.outputs.release_url }}
|
47
|
+
|
48
|
+
- name: "** Next Step **"
|
49
|
+
if: ${{ success() }}
|
50
|
+
run: |
|
51
|
+
echo "Verify the final release"
|
52
|
+
echo ${{ steps.finalize-release.outputs.release_url }}
|
53
|
+
|
54
|
+
- name: "** Failure Message **"
|
55
|
+
if: ${{ failure() }}
|
56
|
+
run: |
|
57
|
+
echo "Failed to Publish the Draft Release Url:"
|
58
|
+
echo ${{ steps.populate-release.outputs.release_url }}
|
@@ -2,6 +2,43 @@
|
|
2
2
|
|
3
3
|
<!-- <START NEW CHANGELOG ENTRY> -->
|
4
4
|
|
5
|
+
## 0.7.7
|
6
|
+
|
7
|
+
([Full Changelog](https://github.com/jupyter-server/jupyverse/compare/v0.7.6...69a1ecaa8f61a83c441d1c8e69a02835085fceb6))
|
8
|
+
|
9
|
+
### Merged PRs
|
10
|
+
|
11
|
+
- Check if file exists before inserting it in fileids [#478](https://github.com/jupyter-server/jupyverse/pull/478) ([@davidbrochart](https://github.com/davidbrochart))
|
12
|
+
- Bump fps >=0.2.1 [#476](https://github.com/jupyter-server/jupyverse/pull/476) ([@davidbrochart](https://github.com/davidbrochart))
|
13
|
+
- Update types [#475](https://github.com/jupyter-server/jupyverse/pull/475) ([@davidbrochart](https://github.com/davidbrochart))
|
14
|
+
|
15
|
+
### Contributors to this release
|
16
|
+
|
17
|
+
([GitHub contributors page for this release](https://github.com/jupyter-server/jupyverse/graphs/contributors?from=2025-03-28&to=2025-04-04&type=c))
|
18
|
+
|
19
|
+
[@davidbrochart](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyverse+involves%3Adavidbrochart+updated%3A2025-03-28..2025-04-04&type=Issues)
|
20
|
+
|
21
|
+
<!-- <END NEW CHANGELOG ENTRY> -->
|
22
|
+
|
23
|
+
## 0.7.6
|
24
|
+
|
25
|
+
([Full Changelog](https://github.com/jupyter-server/jupyverse/compare/v0.7.5...510ab6902fb8701df90fb542511b7daa2f7a9537))
|
26
|
+
|
27
|
+
### Merged PRs
|
28
|
+
|
29
|
+
- Convert repo to use releaser from repo [#474](https://github.com/jupyter-server/jupyverse/pull/474) ([@davidbrochart](https://github.com/davidbrochart))
|
30
|
+
- Fix kernel shutdown [#473](https://github.com/jupyter-server/jupyverse/pull/473) ([@davidbrochart](https://github.com/davidbrochart))
|
31
|
+
- Bump FPS v0.1.5 [#467](https://github.com/jupyter-server/jupyverse/pull/467) ([@davidbrochart](https://github.com/davidbrochart))
|
32
|
+
- Use zmq-anyio [#466](https://github.com/jupyter-server/jupyverse/pull/466) ([@davidbrochart](https://github.com/davidbrochart))
|
33
|
+
- Fix connection to existing kernel [#463](https://github.com/jupyter-server/jupyverse/pull/463) ([@davidbrochart](https://github.com/davidbrochart))
|
34
|
+
- Bump FPS v0.1.3 [#462](https://github.com/jupyter-server/jupyverse/pull/462) ([@davidbrochart](https://github.com/davidbrochart))
|
35
|
+
|
36
|
+
### Contributors to this release
|
37
|
+
|
38
|
+
([GitHub contributors page for this release](https://github.com/jupyter-server/jupyverse/graphs/contributors?from=2025-02-26&to=2025-03-28&type=c))
|
39
|
+
|
40
|
+
[@davidbrochart](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyverse+involves%3Adavidbrochart+updated%3A2025-02-26..2025-03-28&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyverse+involves%3Apre-commit-ci+updated%3A2025-02-26..2025-03-28&type=Issues)
|
41
|
+
|
5
42
|
## 0.7.5
|
6
43
|
|
7
44
|
([Full Changelog](https://github.com/jupyter-server/jupyverse/compare/v0.7.4...3c652e450d8ce5e46d7ea1bb00c402d611c4f54f))
|
@@ -16,8 +53,6 @@
|
|
16
53
|
|
17
54
|
[@davidbrochart](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyverse+involves%3Adavidbrochart+updated%3A2025-02-17..2025-02-26&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyverse+involves%3Apre-commit-ci+updated%3A2025-02-17..2025-02-26&type=Issues)
|
18
55
|
|
19
|
-
<!-- <END NEW CHANGELOG ENTRY> -->
|
20
|
-
|
21
56
|
## 0.7.4
|
22
57
|
|
23
58
|
([Full Changelog](https://github.com/jupyter-server/jupyverse/compare/v0.7.3...3dee770cdcb8ae2529874a0a73592d2744eed63e))
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: jupyverse
|
3
|
-
Version: 0.7.
|
3
|
+
Version: 0.7.7
|
4
4
|
Summary: A set of FPS plugins implementing a Jupyter server
|
5
5
|
Project-URL: Homepage, https://jupyter.org
|
6
6
|
Author-email: Jupyter Development Team <jupyter@googlegroups.com>
|
@@ -8,6 +8,7 @@ License: BSD 3-Clause License
|
|
8
8
|
License-File: COPYING.md
|
9
9
|
Keywords: fastapi,jupyter,plugins,server
|
10
10
|
Requires-Python: >=3.9
|
11
|
+
Requires-Dist: eval-type-backport; python_version < '3.10'
|
11
12
|
Requires-Dist: fps-contents<1,>=0.7.0
|
12
13
|
Requires-Dist: fps-frontend<1,>=0.7.0
|
13
14
|
Requires-Dist: fps-kernels<1,>=0.7.0
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.7"
|
@@ -1,19 +1,19 @@
|
|
1
|
-
from typing import Any
|
1
|
+
from typing import Any
|
2
2
|
|
3
3
|
from anyio import Event
|
4
4
|
from pydantic import BaseModel
|
5
5
|
|
6
6
|
from .app import App
|
7
7
|
|
8
|
-
__version__ = "0.7.
|
8
|
+
__version__ = "0.7.7"
|
9
9
|
|
10
10
|
|
11
11
|
class Singleton(type):
|
12
|
-
_instances:
|
12
|
+
_instances: dict = {}
|
13
13
|
|
14
14
|
def __call__(cls, *args, **kwargs):
|
15
15
|
if cls not in cls._instances:
|
16
|
-
cls._instances[cls] = super(
|
16
|
+
cls._instances[cls] = super().__call__(*args, **kwargs)
|
17
17
|
return cls._instances[cls]
|
18
18
|
|
19
19
|
|
@@ -45,9 +45,9 @@ class Router:
|
|
45
45
|
|
46
46
|
|
47
47
|
class ResourceLock:
|
48
|
-
"""ResourceLock ensures that accesses cannot be done concurrently on the same resource.
|
49
|
-
|
50
|
-
_locks:
|
48
|
+
"""ResourceLock ensures that accesses cannot be done concurrently on the same resource."""
|
49
|
+
|
50
|
+
_locks: dict[Any, Event]
|
51
51
|
|
52
52
|
def __init__(self):
|
53
53
|
self._locks = {}
|
@@ -58,10 +58,10 @@ class ResourceLock:
|
|
58
58
|
|
59
59
|
class _ResourceLock:
|
60
60
|
_idx: Any
|
61
|
-
_locks:
|
61
|
+
_locks: dict[Any, Event]
|
62
62
|
_lock: Event
|
63
63
|
|
64
|
-
def __init__(self, idx: Any, locks:
|
64
|
+
def __init__(self, idx: Any, locks: dict[Any, Event]):
|
65
65
|
self._idx = idx
|
66
66
|
self._locks = locks
|
67
67
|
|
@@ -2,7 +2,6 @@ from __future__ import annotations
|
|
2
2
|
|
3
3
|
from collections import defaultdict
|
4
4
|
from datetime import datetime, timezone
|
5
|
-
from typing import Dict, List
|
6
5
|
|
7
6
|
import structlog
|
8
7
|
from fastapi import FastAPI, Request
|
@@ -16,7 +15,7 @@ class App:
|
|
16
15
|
"""A wrapper around FastAPI that checks for endpoint path conflicts."""
|
17
16
|
|
18
17
|
_app: FastAPI
|
19
|
-
_router_paths:
|
18
|
+
_router_paths: dict[str, list[str]]
|
20
19
|
|
21
20
|
def __init__(self, app: FastAPI, mount_path: str | None = None):
|
22
21
|
if mount_path is None:
|
@@ -66,7 +65,7 @@ class App:
|
|
66
65
|
for _router, _paths in self._router_paths.items():
|
67
66
|
if path in _paths:
|
68
67
|
raise RuntimeError(
|
69
|
-
f"{_type
|
68
|
+
f"{_type} mounts a path that is already defined in {_router}: {path}"
|
70
69
|
)
|
71
70
|
self._router_paths[_type].append(path)
|
72
71
|
logger.debug("Path mounted", type=_type, path=path)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from abc import ABC, abstractmethod
|
4
|
+
from collections.abc import Awaitable
|
5
|
+
from typing import Any, Callable
|
6
|
+
|
7
|
+
from jupyverse_api import Config
|
8
|
+
|
9
|
+
from .models import User # noqa
|
10
|
+
|
11
|
+
|
12
|
+
class Auth(ABC):
|
13
|
+
@abstractmethod
|
14
|
+
def current_user(self, permissions: dict[str, list[str]] | None = None) -> Callable: ...
|
15
|
+
|
16
|
+
@abstractmethod
|
17
|
+
async def update_user(self) -> Callable: ...
|
18
|
+
|
19
|
+
@abstractmethod
|
20
|
+
def websocket_auth(
|
21
|
+
self,
|
22
|
+
permissions: dict[str, list[str]] | None = None,
|
23
|
+
) -> Callable[[Any], Awaitable[tuple[Any, dict[str, list[str]] | None] | None]]: ...
|
24
|
+
|
25
|
+
|
26
|
+
class AuthConfig(Config):
|
27
|
+
pass
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from
|
1
|
+
from __future__ import annotations
|
2
2
|
|
3
3
|
from pydantic import BaseModel
|
4
4
|
|
@@ -7,8 +7,8 @@ class User(BaseModel):
|
|
7
7
|
username: str = ""
|
8
8
|
name: str = ""
|
9
9
|
display_name: str = ""
|
10
|
-
initials:
|
11
|
-
color:
|
12
|
-
avatar_url:
|
10
|
+
initials: str | None = None
|
11
|
+
color: str | None = None
|
12
|
+
avatar_url: str | None = None
|
13
13
|
workspace: str = "{}"
|
14
14
|
settings: str = "{}"
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import io
|
2
2
|
import json
|
3
3
|
import sys
|
4
|
-
from typing import Any
|
4
|
+
from typing import Any
|
5
5
|
|
6
6
|
import rich_click as click
|
7
7
|
from fps import main as fps_main
|
@@ -20,6 +20,26 @@ else:
|
|
20
20
|
default=False,
|
21
21
|
help="Enable debug mode.",
|
22
22
|
)
|
23
|
+
@click.option(
|
24
|
+
"--show-config",
|
25
|
+
is_flag=True,
|
26
|
+
show_default=True,
|
27
|
+
default=False,
|
28
|
+
help="Show the actual configuration.",
|
29
|
+
)
|
30
|
+
@click.option(
|
31
|
+
"--help-all",
|
32
|
+
is_flag=True,
|
33
|
+
show_default=True,
|
34
|
+
default=False,
|
35
|
+
help="Show the configuration description.",
|
36
|
+
)
|
37
|
+
@click.option(
|
38
|
+
"--backend",
|
39
|
+
show_default=True,
|
40
|
+
default="asyncio",
|
41
|
+
help="The name of the event loop to use (asyncio or trio).",
|
42
|
+
)
|
23
43
|
@click.option(
|
24
44
|
"--open-browser",
|
25
45
|
is_flag=True,
|
@@ -66,13 +86,16 @@ else:
|
|
66
86
|
)
|
67
87
|
def main(
|
68
88
|
debug: bool = False,
|
89
|
+
show_config: bool = False,
|
90
|
+
help_all: bool = False,
|
91
|
+
backend: str = "asyncio",
|
69
92
|
open_browser: bool = False,
|
70
93
|
host: str = "127.0.0.1",
|
71
94
|
port: int = 8000,
|
72
|
-
set_:
|
73
|
-
disable:
|
74
|
-
allow_origin:
|
75
|
-
query_param:
|
95
|
+
set_: tuple[str, ...] = (),
|
96
|
+
disable: tuple[str, ...] = (),
|
97
|
+
allow_origin: tuple[str, ...] = (),
|
98
|
+
query_param: tuple[str, ...] = (),
|
76
99
|
) -> None:
|
77
100
|
query_params_dict = {}
|
78
101
|
for qp in query_param:
|
@@ -80,7 +103,7 @@ def main(
|
|
80
103
|
query_params_dict[key] = value
|
81
104
|
query_params_str = json.dumps(query_params_dict)
|
82
105
|
allow_origins_str = json.dumps(allow_origin)
|
83
|
-
set_list:
|
106
|
+
set_list: list[str] = list(set_)
|
84
107
|
set_list.append(f"debug={debug}")
|
85
108
|
set_list.append(f"open_browser={open_browser}")
|
86
109
|
set_list.append(f"host={host}")
|
@@ -92,24 +115,20 @@ def main(
|
|
92
115
|
"",
|
93
116
|
set_=set_list,
|
94
117
|
config=pluggin_config,
|
118
|
+
show_config=show_config,
|
119
|
+
help_all=help_all,
|
120
|
+
backend=backend,
|
95
121
|
) # type: ignore
|
96
122
|
|
97
123
|
|
98
|
-
def get_pluggin_config(disable:
|
124
|
+
def get_pluggin_config(disable: tuple[str, ...]) -> dict[str, Any]:
|
99
125
|
jupyverse_modules = [
|
100
|
-
ep.name
|
101
|
-
for ep in entry_points(group="jupyverse.modules")
|
102
|
-
if ep.name not in disable
|
126
|
+
ep.name for ep in entry_points(group="jupyverse.modules") if ep.name not in disable
|
103
127
|
]
|
104
128
|
config = {
|
105
129
|
"jupyverse": {
|
106
|
-
"type":"jupyverse_api.main:JupyverseModule",
|
107
|
-
"modules": {
|
108
|
-
module: {
|
109
|
-
"type": module
|
110
|
-
}
|
111
|
-
for module in jupyverse_modules
|
112
|
-
}
|
130
|
+
"type": "jupyverse_api.main:JupyverseModule",
|
131
|
+
"modules": {module: {"type": module} for module in jupyverse_modules},
|
113
132
|
}
|
114
133
|
}
|
115
134
|
return config
|
@@ -2,7 +2,6 @@ from __future__ import annotations
|
|
2
2
|
|
3
3
|
from abc import ABC, abstractmethod
|
4
4
|
from pathlib import Path
|
5
|
-
from typing import Dict, List, Optional, Union
|
6
5
|
|
7
6
|
from fastapi import APIRouter, Depends, Request, Response
|
8
7
|
|
@@ -15,26 +14,20 @@ from .models import Checkpoint, Content, SaveContent
|
|
15
14
|
|
16
15
|
class FileIdManager(ABC):
|
17
16
|
@abstractmethod
|
18
|
-
async def start(self) -> None:
|
19
|
-
...
|
17
|
+
async def start(self) -> None: ...
|
20
18
|
|
21
19
|
@abstractmethod
|
22
|
-
async def stop(self) -> None:
|
23
|
-
...
|
20
|
+
async def stop(self) -> None: ...
|
24
21
|
|
25
22
|
@abstractmethod
|
26
|
-
async def get_path(self, file_id: str) -> str:
|
27
|
-
...
|
23
|
+
async def get_path(self, file_id: str) -> str: ...
|
28
24
|
|
29
25
|
@abstractmethod
|
30
|
-
async def get_id(self, file_path: str) -> str:
|
31
|
-
...
|
26
|
+
async def get_id(self, file_path: str) -> str: ...
|
32
27
|
|
33
|
-
def watch(self, path: str):
|
34
|
-
...
|
28
|
+
def watch(self, path: str): ...
|
35
29
|
|
36
|
-
def unwatch(self, path: str, watcher):
|
37
|
-
...
|
30
|
+
def unwatch(self, path: str, watcher): ...
|
38
31
|
|
39
32
|
|
40
33
|
class Contents(Router, ABC):
|
@@ -59,7 +52,7 @@ class Contents(Router, ABC):
|
|
59
52
|
status_code=201,
|
60
53
|
)
|
61
54
|
async def create_content(
|
62
|
-
path:
|
55
|
+
path: str | None,
|
63
56
|
request: Request,
|
64
57
|
user: User = Depends(auth.current_user(permissions={"contents": ["write"]})),
|
65
58
|
) -> Content:
|
@@ -75,7 +68,7 @@ class Contents(Router, ABC):
|
|
75
68
|
@router.get("/api/contents/{path:path}/checkpoints")
|
76
69
|
async def get_checkpoint(
|
77
70
|
path, user: User = Depends(auth.current_user(permissions={"contents": ["read"]}))
|
78
|
-
) ->
|
71
|
+
) -> list[Checkpoint]:
|
79
72
|
return await self.get_checkpoint(path, user)
|
80
73
|
|
81
74
|
@router.get("/api/contents/{path:path}")
|
@@ -117,35 +110,30 @@ class Contents(Router, ABC):
|
|
117
110
|
|
118
111
|
@property
|
119
112
|
@abstractmethod
|
120
|
-
def file_id_manager(self) -> FileIdManager:
|
121
|
-
...
|
113
|
+
def file_id_manager(self) -> FileIdManager: ...
|
122
114
|
|
123
115
|
@abstractmethod
|
124
116
|
async def read_content(
|
125
|
-
self, path:
|
126
|
-
) -> Content:
|
127
|
-
...
|
117
|
+
self, path: str | Path, get_content: bool, file_format: str | None = None
|
118
|
+
) -> Content: ...
|
128
119
|
|
129
120
|
@abstractmethod
|
130
|
-
async def write_content(self, content:
|
131
|
-
...
|
121
|
+
async def write_content(self, content: SaveContent | dict) -> None: ...
|
132
122
|
|
133
123
|
@abstractmethod
|
134
124
|
async def create_checkpoint(
|
135
125
|
self,
|
136
126
|
path,
|
137
127
|
user: User,
|
138
|
-
) -> Checkpoint:
|
139
|
-
...
|
128
|
+
) -> Checkpoint: ...
|
140
129
|
|
141
130
|
@abstractmethod
|
142
131
|
async def create_content(
|
143
132
|
self,
|
144
|
-
path:
|
133
|
+
path: str | None,
|
145
134
|
request: Request,
|
146
135
|
user: User,
|
147
|
-
) -> Content:
|
148
|
-
...
|
136
|
+
) -> Content: ...
|
149
137
|
|
150
138
|
@abstractmethod
|
151
139
|
async def get_root_content(
|
@@ -160,8 +148,7 @@ class Contents(Router, ABC):
|
|
160
148
|
self,
|
161
149
|
path,
|
162
150
|
user: User,
|
163
|
-
) ->
|
164
|
-
...
|
151
|
+
) -> list[Checkpoint]: ...
|
165
152
|
|
166
153
|
@abstractmethod
|
167
154
|
async def get_content(
|
@@ -169,8 +156,7 @@ class Contents(Router, ABC):
|
|
169
156
|
path: str,
|
170
157
|
content: int,
|
171
158
|
user: User,
|
172
|
-
) -> Content:
|
173
|
-
...
|
159
|
+
) -> Content: ...
|
174
160
|
|
175
161
|
@abstractmethod
|
176
162
|
async def save_content(
|
@@ -179,16 +165,14 @@ class Contents(Router, ABC):
|
|
179
165
|
request: Request,
|
180
166
|
response: Response,
|
181
167
|
user: User,
|
182
|
-
) -> Content:
|
183
|
-
...
|
168
|
+
) -> Content: ...
|
184
169
|
|
185
170
|
@abstractmethod
|
186
171
|
async def delete_content(
|
187
172
|
self,
|
188
173
|
path,
|
189
174
|
user: User,
|
190
|
-
):
|
191
|
-
...
|
175
|
+
): ...
|
192
176
|
|
193
177
|
@abstractmethod
|
194
178
|
async def rename_content(
|
@@ -196,5 +180,4 @@ class Contents(Router, ABC):
|
|
196
180
|
path,
|
197
181
|
request: Request,
|
198
182
|
user: User,
|
199
|
-
) -> Content:
|
200
|
-
...
|
183
|
+
) -> Content: ...
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from
|
1
|
+
from __future__ import annotations
|
2
2
|
|
3
3
|
from pydantic import BaseModel
|
4
4
|
|
@@ -11,24 +11,24 @@ class Checkpoint(BaseModel):
|
|
11
11
|
class Content(BaseModel):
|
12
12
|
name: str
|
13
13
|
path: str
|
14
|
-
last_modified:
|
15
|
-
created:
|
16
|
-
content:
|
17
|
-
format:
|
18
|
-
mimetype:
|
19
|
-
size:
|
14
|
+
last_modified: str | None = None
|
15
|
+
created: str | None = None
|
16
|
+
content: list[dict] | str | dict | None = None
|
17
|
+
format: str | None = None
|
18
|
+
mimetype: str | None = None
|
19
|
+
size: int | None = None
|
20
20
|
writable: bool
|
21
21
|
type: str
|
22
22
|
|
23
23
|
|
24
24
|
class CreateContent(BaseModel):
|
25
|
-
ext:
|
25
|
+
ext: str | None = None
|
26
26
|
path: str
|
27
27
|
type: str
|
28
28
|
|
29
29
|
|
30
30
|
class SaveContent(BaseModel):
|
31
|
-
content:
|
31
|
+
content: str | dict | None = None
|
32
32
|
format: str
|
33
33
|
path: str
|
34
34
|
type: str
|
@@ -55,19 +55,16 @@ class JupyterLab(Router, ABC):
|
|
55
55
|
async def get_lab(
|
56
56
|
self,
|
57
57
|
user: User,
|
58
|
-
):
|
59
|
-
...
|
58
|
+
): ...
|
60
59
|
|
61
60
|
@abstractmethod
|
62
61
|
async def load_workspace(
|
63
62
|
self,
|
64
63
|
path,
|
65
|
-
):
|
66
|
-
...
|
64
|
+
): ...
|
67
65
|
|
68
66
|
@abstractmethod
|
69
|
-
async def get_workspace_data(self, user: User):
|
70
|
-
...
|
67
|
+
async def get_workspace_data(self, user: User): ...
|
71
68
|
|
72
69
|
@abstractmethod
|
73
70
|
async def set_workspace(
|
@@ -75,16 +72,14 @@ class JupyterLab(Router, ABC):
|
|
75
72
|
request: Request,
|
76
73
|
user: User,
|
77
74
|
user_update,
|
78
|
-
):
|
79
|
-
...
|
75
|
+
): ...
|
80
76
|
|
81
77
|
@abstractmethod
|
82
78
|
async def get_workspace(
|
83
79
|
self,
|
84
80
|
name,
|
85
81
|
user: User,
|
86
|
-
):
|
87
|
-
...
|
82
|
+
): ...
|
88
83
|
|
89
84
|
|
90
85
|
class JupyterLabConfig(Config):
|