jupyverse 0.10.12__tar.gz → 0.10.14__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.10.12 → jupyverse-0.10.14}/.pre-commit-config.yaml +2 -2
- {jupyverse-0.10.12 → jupyverse-0.10.14}/CHANGELOG.md +8 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/PKG-INFO +5 -5
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/kernels/__init__.py +1 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/pyproject.toml +1 -1
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/fps_kernel_subprocess/kernel_subprocess.py +56 -20
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/fps_kernel_subprocess/main.py +1 -1
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/pyproject.toml +2 -2
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/kernel_server/server.py +4 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/routes.py +1 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/pyproject.toml +2 -2
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/routes.py +37 -8
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/pyproject.toml +1 -1
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/tests/test_yjs.py +11 -1
- {jupyverse-0.10.12 → jupyverse-0.10.14}/pyproject.toml +6 -5
- {jupyverse-0.10.12 → jupyverse-0.10.14}/.devcontainer/devcontainer.json +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/.devcontainer/requirements.txt +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/.github/workflows/publish-release.yml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/.github/workflows/test.yml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/.gitignore +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/binder/environment.yml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/binder/jupyter_notebook_config.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/binder/postBuild +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/binder/start +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/index.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/install.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/jupyter.svg +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/auth.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/contents.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/frontend.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/jupyterlab.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/kernels.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/lab.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/login.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/nbconvert.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/notebook.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/resource_usage.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/terminals.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/yjs.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/tutorials/jupyterhub_jupyverse_deployment.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/tutorials/standalone_jupyverse_deployment.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/usage/microservices.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/usage/multi_user.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/usage/single_user.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/app/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/asgi_websocket_transport.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/auth/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/auth/models.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/cli.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/contents/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/contents/models.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/exceptions.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/file_id/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/file_watcher/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/frontend/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/jupyterlab/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/kernel/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/kernels/models.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/lab/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/login/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/main/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/nbconvert/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/notebook/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/resource_usage/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/terminals/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/terminals/models.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/yjs/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/yjs/models.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/mkdocs.yml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/notebooks/admin_users.ipynb +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/notebooks/admin_users.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/fps_auth/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/fps_auth/backends.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/fps_auth/config.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/fps_auth/db.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/fps_auth/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/fps_auth/models.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/fps_auth/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/fps_auth/routes.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/fps_auth_fief/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/fps_auth_fief/backend.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/fps_auth_fief/config.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/fps_auth_fief/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/fps_auth_fief/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/fps_auth_fief/routes.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/fps_auth_jupyterhub/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/fps_auth_jupyterhub/config.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/fps_auth_jupyterhub/db.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/fps_auth_jupyterhub/launch.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/fps_auth_jupyterhub/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/fps_auth_jupyterhub/models.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/fps_auth_jupyterhub/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/fps_auth_jupyterhub/routes.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/contents/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/contents/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/contents/fps_contents/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/contents/fps_contents/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/contents/fps_contents/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/contents/fps_contents/routes.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/contents/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_id/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_id/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_id/fps_file_id/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_id/fps_file_id/file_id.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_id/fps_file_id/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_id/fps_file_id/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_id/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher/fps_file_watcher/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher/fps_file_watcher/file_watcher.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher/fps_file_watcher/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher/fps_file_watcher/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher_poll/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher_poll/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher_poll/fps_file_watcher_poll/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher_poll/fps_file_watcher_poll/file_watcher.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher_poll/fps_file_watcher_poll/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher_poll/fps_file_watcher_poll/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher_poll/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/frontend/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/frontend/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/frontend/fps_frontend/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/frontend/fps_frontend/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/frontend/fps_frontend/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/frontend/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/jupyterlab/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/jupyterlab/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/jupyterlab/fps_jupyterlab/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/jupyterlab/fps_jupyterlab/index.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/jupyterlab/fps_jupyterlab/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/jupyterlab/fps_jupyterlab/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/jupyterlab/fps_jupyterlab/routes.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/jupyterlab/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/fps_kernel_subprocess/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/fps_kernel_subprocess/connect.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/fps_kernel_subprocess/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_web_worker/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_web_worker/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_web_worker/fps_kernel_web_worker/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_web_worker/fps_kernel_web_worker/kernel_web_worker.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_web_worker/fps_kernel_web_worker/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_web_worker/fps_kernel_web_worker/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_web_worker/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/kernel_driver/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/kernel_driver/driver.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/kernel_driver/kernelspec.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/kernel_driver/message.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/kernel_driver/paths.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/kernel_server/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/kernel_server/message.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/tests/test_kernel_launcher.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/lab/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/lab/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/lab/fps_lab/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/lab/fps_lab/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/lab/fps_lab/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/lab/fps_lab/routes.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/lab/fps_lab/static/favicon.ico +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/lab/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/routes.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/favicons/favicon-busy-1.ico +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/favicons/favicon-busy-2.ico +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/favicons/favicon-busy-3.ico +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/favicons/favicon-file.ico +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/favicons/favicon-notebook.ico +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/favicons/favicon-terminal.ico +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/favicons/favicon.ico +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/index.html +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/logo/github.svg +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/logo/logo.png +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/style/index.css +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/nbconvert/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/nbconvert/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/nbconvert/fps_nbconvert/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/nbconvert/fps_nbconvert/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/nbconvert/fps_nbconvert/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/nbconvert/fps_nbconvert/routes.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/nbconvert/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/noauth/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/noauth/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/noauth/fps_noauth/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/noauth/fps_noauth/backends.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/noauth/fps_noauth/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/noauth/fps_noauth/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/noauth/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/notebook/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/notebook/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/notebook/fps_notebook/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/notebook/fps_notebook/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/notebook/fps_notebook/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/notebook/fps_notebook/routes.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/notebook/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/resource_usage/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/resource_usage/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/resource_usage/fps_resource_usage/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/resource_usage/fps_resource_usage/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/resource_usage/fps_resource_usage/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/resource_usage/fps_resource_usage/routes.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/resource_usage/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/fps_terminals/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/fps_terminals/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/fps_terminals/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/fps_terminals/routes.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/fps_terminals/server.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/fps_terminals/win_server.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/fps_webdav/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/fps_webdav/config.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/fps_webdav/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/fps_webdav/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/fps_webdav/routes.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/pyproject.toml +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/tests/conftest.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/tests/test_webdav.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/COPYING.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/README.md +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/main.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/py.typed +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/asgi_server.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/awareness.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/django_channels_consumer.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/websocket.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/websocket_provider.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/websocket_server.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/yroom.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/ystore.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/yutils.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywidgets/__init__.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywidgets/widgets.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/pytest.ini +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/conftest.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/data/notebook0.ipynb +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/data/notebook1.ipynb +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/test_app.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/test_auth.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/test_contents.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/test_execute.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/test_kernels.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/test_server.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/test_settings.py +0 -0
- {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
repos:
|
2
2
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
3
|
-
rev:
|
3
|
+
rev: v6.0.0
|
4
4
|
hooks:
|
5
5
|
- id: end-of-file-fixer
|
6
6
|
- id: check-case-conflict
|
@@ -16,7 +16,7 @@ repos:
|
|
16
16
|
- id: trailing-whitespace
|
17
17
|
|
18
18
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
19
|
-
rev: v0.12.
|
19
|
+
rev: v0.12.11
|
20
20
|
hooks:
|
21
21
|
- id: ruff
|
22
22
|
args: ["--fix"]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: jupyverse
|
3
|
-
Version: 0.10.
|
3
|
+
Version: 0.10.14
|
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>
|
@@ -13,14 +13,14 @@ Requires-Dist: fps-contents<0.11.0,>=0.10.1
|
|
13
13
|
Requires-Dist: fps-file-id<0.4.0,>=0.3.2
|
14
14
|
Requires-Dist: fps-file-watcher<0.2.0,>=0.1.1
|
15
15
|
Requires-Dist: fps-frontend<0.10.0,>=0.9.1
|
16
|
-
Requires-Dist: fps-kernel-subprocess<0.2.0,>=0.1.
|
17
|
-
Requires-Dist: fps-kernels<0.11.0,>=0.10.
|
16
|
+
Requires-Dist: fps-kernel-subprocess<0.2.0,>=0.1.3
|
17
|
+
Requires-Dist: fps-kernels<0.11.0,>=0.10.3
|
18
18
|
Requires-Dist: fps-lab<0.10.0,>=0.9.1
|
19
19
|
Requires-Dist: fps-nbconvert<0.10.0,>=0.9.1
|
20
20
|
Requires-Dist: fps-terminals<0.10.0,>=0.9.1
|
21
|
-
Requires-Dist: fps-yjs<0.
|
21
|
+
Requires-Dist: fps-yjs<0.12.0,>=0.11.0
|
22
22
|
Requires-Dist: fps[anycorn,click,fastapi]<0.6.0,>=0.5.1
|
23
|
-
Requires-Dist: jupyverse-api<0.12.0,>=0.11.
|
23
|
+
Requires-Dist: jupyverse-api<0.12.0,>=0.11.3
|
24
24
|
Requires-Dist: rich-click<2,>=1.6.1
|
25
25
|
Provides-Extra: auth
|
26
26
|
Requires-Dist: fps-auth<0.10.0,>=0.9.1; extra == 'auth'
|
@@ -1,6 +1,7 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
import json
|
4
|
+
import os
|
4
5
|
import signal
|
5
6
|
import subprocess
|
6
7
|
import sys
|
@@ -9,8 +10,9 @@ from dataclasses import dataclass
|
|
9
10
|
from typing import cast
|
10
11
|
|
11
12
|
import anyio
|
12
|
-
from anyio import TASK_STATUS_IGNORED, create_task_group, open_process
|
13
|
+
from anyio import TASK_STATUS_IGNORED, create_task_group, open_file, open_process, run_process
|
13
14
|
from anyio.abc import TaskStatus
|
15
|
+
from anyio.streams.text import TextReceiveStream
|
14
16
|
|
15
17
|
from jupyverse_api.kernel import Kernel
|
16
18
|
|
@@ -32,6 +34,7 @@ class KernelSubprocess(Kernel):
|
|
32
34
|
kernel_cwd: str | None
|
33
35
|
capture_output: bool
|
34
36
|
connection_cfg: cfg_t | None = None
|
37
|
+
kernelenv_path: str = ""
|
35
38
|
|
36
39
|
def __post_init__(self):
|
37
40
|
super().__init__()
|
@@ -45,6 +48,8 @@ class KernelSubprocess(Kernel):
|
|
45
48
|
raise RuntimeError("No connection_cfg")
|
46
49
|
self.key = cast(str, self.connection_cfg["key"])
|
47
50
|
self.wait_for_ready = True
|
51
|
+
self._process = None
|
52
|
+
self._pid = None
|
48
53
|
|
49
54
|
async def start(self, *, task_status: TaskStatus[None] = TASK_STATUS_IGNORED) -> None:
|
50
55
|
async with (
|
@@ -64,15 +69,12 @@ class KernelSubprocess(Kernel):
|
|
64
69
|
self._from_iopub_receive_stream,
|
65
70
|
create_task_group() as self.task_group,
|
66
71
|
):
|
67
|
-
with
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
"
|
72
|
-
|
73
|
-
"python" + ".".join(map(str, sys.version_info[:2])),
|
74
|
-
}:
|
75
|
-
cmd[0] = sys.executable
|
72
|
+
async with await open_file(self.kernelspec_path) as f:
|
73
|
+
contents = await f.read()
|
74
|
+
kernelspec = json.loads(contents)
|
75
|
+
launch_kernel_cmd = [
|
76
|
+
s.format(connection_file=self.connection_file) for s in kernelspec["argv"]
|
77
|
+
]
|
76
78
|
if self.capture_output:
|
77
79
|
stdout = subprocess.DEVNULL
|
78
80
|
stderr = subprocess.STDOUT
|
@@ -80,7 +82,35 @@ class KernelSubprocess(Kernel):
|
|
80
82
|
stdout = None
|
81
83
|
stderr = None
|
82
84
|
kernel_cwd = self.kernel_cwd if self.kernel_cwd else None
|
83
|
-
|
85
|
+
kernelenv = ""
|
86
|
+
if self.kernelenv_path:
|
87
|
+
path = anyio.Path(self.kernelenv_path)
|
88
|
+
if await path.is_file():
|
89
|
+
kernelenv = await path.read_text()
|
90
|
+
if kernelenv:
|
91
|
+
import yaml # type: ignore[import-untyped]
|
92
|
+
env_name = yaml.load(kernelenv, Loader=yaml.CLoader)["name"]
|
93
|
+
cmd = f"micromamba create -f {self.kernelenv_path} --yes"
|
94
|
+
result = await run_process(cmd)
|
95
|
+
if result.returncode == 0:
|
96
|
+
cmd = """bash -c 'eval "$(micromamba shell hook --shell bash)";""" + \
|
97
|
+
f"micromamba activate {env_name};" + \
|
98
|
+
" ".join(launch_kernel_cmd) + "' & echo $!"
|
99
|
+
process = await open_process(cmd)
|
100
|
+
assert process.stdout is not None
|
101
|
+
async for text in TextReceiveStream(process.stdout):
|
102
|
+
self._pid = int(text)
|
103
|
+
break
|
104
|
+
else:
|
105
|
+
if launch_kernel_cmd and launch_kernel_cmd[0] in {
|
106
|
+
"python",
|
107
|
+
f"python{sys.version_info[0]}",
|
108
|
+
"python" + ".".join(map(str, sys.version_info[:2])),
|
109
|
+
}:
|
110
|
+
launch_kernel_cmd[0] = sys.executable
|
111
|
+
self._process = await open_process(
|
112
|
+
launch_kernel_cmd, stdout=stdout, stderr=stderr, cwd=kernel_cwd
|
113
|
+
)
|
84
114
|
|
85
115
|
assert self.connection_cfg is not None
|
86
116
|
identity = uuid.uuid4().hex.encode("ascii")
|
@@ -108,14 +138,17 @@ class KernelSubprocess(Kernel):
|
|
108
138
|
self.started.set()
|
109
139
|
|
110
140
|
async def stop(self) -> None:
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
141
|
+
if self._process:
|
142
|
+
try:
|
143
|
+
self._process.terminate()
|
144
|
+
except ProcessLookupError:
|
145
|
+
pass
|
146
|
+
await self._process.wait()
|
147
|
+
if self.write_connection_file:
|
148
|
+
path = anyio.Path(self.connection_file)
|
149
|
+
await path.unlink(missing_ok=True)
|
150
|
+
else:
|
151
|
+
os.kill(self._pid, signal.SIGTERM)
|
119
152
|
|
120
153
|
await self.shell_channel.stop()
|
121
154
|
await self.stdin_channel.stop()
|
@@ -124,7 +157,10 @@ class KernelSubprocess(Kernel):
|
|
124
157
|
self.task_group.cancel_scope.cancel()
|
125
158
|
|
126
159
|
async def interrupt(self) -> None:
|
127
|
-
self._process
|
160
|
+
if self._process:
|
161
|
+
self._process.send_signal(signal.SIGINT)
|
162
|
+
else:
|
163
|
+
os.kill(self._pid, signal.SIGINT)
|
128
164
|
|
129
165
|
async def forward_messages_to_shell(self) -> None:
|
130
166
|
async for msg in self._to_shell_receive_stream:
|
{jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/fps_kernel_subprocess/main.py
RENAMED
@@ -10,4 +10,4 @@ from .kernel_subprocess import KernelSubprocess
|
|
10
10
|
class KernelSubprocessModule(Module):
|
11
11
|
async def prepare(self) -> None:
|
12
12
|
default_kernel_factory = DefaultKernelFactory(KernelSubprocess)
|
13
|
-
self.put(default_kernel_factory
|
13
|
+
self.put(default_kernel_factory)
|
@@ -4,12 +4,12 @@ build-backend = "hatchling.build"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "fps_kernel_subprocess"
|
7
|
-
version = "0.1.
|
7
|
+
version = "0.1.3"
|
8
8
|
description = "An FPS plugin for the kernel subprocess API"
|
9
9
|
keywords = ["jupyter", "server", "fastapi", "plugins"]
|
10
10
|
requires-python = ">=3.9"
|
11
11
|
dependencies = [
|
12
|
-
"jupyverse-api >=0.11.
|
12
|
+
"jupyverse-api >=0.11.3,<0.12.0",
|
13
13
|
"anyio",
|
14
14
|
"pyzmq",
|
15
15
|
"zmq-anyio >=0.3.1,<0.4.0",
|
@@ -52,6 +52,7 @@ class KernelServer:
|
|
52
52
|
self,
|
53
53
|
default_kernel_factory: DefaultKernelFactory,
|
54
54
|
kernelspec_path: str = "",
|
55
|
+
kernelenv_path: str = "",
|
55
56
|
kernel_cwd: str = "",
|
56
57
|
connection_file: str = "",
|
57
58
|
write_connection_file: bool = True,
|
@@ -60,6 +61,7 @@ class KernelServer:
|
|
60
61
|
self.default_kernel_factory = default_kernel_factory
|
61
62
|
self.capture_kernel_output = capture_kernel_output
|
62
63
|
self.kernelspec_path = kernelspec_path
|
64
|
+
self.kernelenv_path = kernelenv_path
|
63
65
|
self.kernel_cwd = kernel_cwd
|
64
66
|
self.connection_file = connection_file
|
65
67
|
self.write_connection_file = write_connection_file
|
@@ -109,6 +111,7 @@ class KernelServer:
|
|
109
111
|
self.kernel = self.default_kernel_factory(
|
110
112
|
write_connection_file=self.write_connection_file,
|
111
113
|
kernelspec_path=self.kernelspec_path,
|
114
|
+
kernelenv_path=self.kernelenv_path,
|
112
115
|
connection_file=self.connection_file,
|
113
116
|
kernel_cwd=self.kernel_cwd,
|
114
117
|
capture_output=self.capture_kernel_output,
|
@@ -116,6 +119,7 @@ class KernelServer:
|
|
116
119
|
else:
|
117
120
|
self.kernel = kernel_factory(
|
118
121
|
kernelspec_path=self.kernelspec_path,
|
122
|
+
kernelenv_path=self.kernelenv_path,
|
119
123
|
connection_file=self.connection_file,
|
120
124
|
kernel_cwd=self.kernel_cwd,
|
121
125
|
capture_output=self.capture_kernel_output,
|
@@ -223,6 +223,7 @@ class _Kernels(Kernels):
|
|
223
223
|
kernel_cwd = kernel_cwd.parent
|
224
224
|
kernel_server = KernelServer(
|
225
225
|
kernelspec_path=Path(find_kernelspec(kernel_name)).as_posix(),
|
226
|
+
kernelenv_path=self.kernels_config.kernelenv_path,
|
226
227
|
kernel_cwd=str(kernel_cwd),
|
227
228
|
default_kernel_factory=self.default_kernel_factory,
|
228
229
|
)
|
@@ -4,14 +4,14 @@ build-backend = "hatchling.build"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "fps_kernels"
|
7
|
-
version = "0.10.
|
7
|
+
version = "0.10.3"
|
8
8
|
description = "An FPS plugin for the kernels API"
|
9
9
|
keywords = ["jupyter", "server", "fastapi", "plugins"]
|
10
10
|
requires-python = ">=3.9"
|
11
11
|
dependencies = [
|
12
12
|
"python-dateutil",
|
13
13
|
"types-python-dateutil",
|
14
|
-
"jupyverse-api >=0.11.
|
14
|
+
"jupyverse-api >=0.11.3,<0.12.0",
|
15
15
|
"pycrdt >=0.10.3,<0.13.0",
|
16
16
|
"anyio",
|
17
17
|
]
|
@@ -256,12 +256,13 @@ class RoomManager:
|
|
256
256
|
file_type,
|
257
257
|
file_format,
|
258
258
|
document,
|
259
|
+
room,
|
259
260
|
)
|
260
261
|
)
|
261
262
|
# update the document when file changes
|
262
263
|
if file_id not in self.watchers:
|
263
264
|
self.watchers[file_id] = create_task(
|
264
|
-
self.watch_file(file_format, file_id, document),
|
265
|
+
self.watch_file(file_format, file_id, document, room),
|
265
266
|
self.task_group,
|
266
267
|
)
|
267
268
|
|
@@ -317,7 +318,13 @@ class RoomManager:
|
|
317
318
|
document.path = file_path
|
318
319
|
return file_path
|
319
320
|
|
320
|
-
async def watch_file(
|
321
|
+
async def watch_file(
|
322
|
+
self,
|
323
|
+
file_format: str,
|
324
|
+
file_id: str,
|
325
|
+
document: YBaseDoc,
|
326
|
+
room: YRoom,
|
327
|
+
) -> None:
|
321
328
|
file_path = await self.get_file_path(file_id, document)
|
322
329
|
assert file_path is not None
|
323
330
|
logger.info("Watching file", path=file_path)
|
@@ -332,11 +339,17 @@ class RoomManager:
|
|
332
339
|
self.file_id.unwatch(file_path, watcher)
|
333
340
|
file_path = new_file_path
|
334
341
|
# break
|
335
|
-
await self.maybe_load_file(file_format, file_path, file_id)
|
342
|
+
await self.maybe_load_file(file_format, file_path, file_id, room)
|
336
343
|
if file_id in self.watchers:
|
337
344
|
del self.watchers[file_id]
|
338
345
|
|
339
|
-
async def maybe_load_file(
|
346
|
+
async def maybe_load_file(
|
347
|
+
self,
|
348
|
+
file_format: str,
|
349
|
+
file_path: str,
|
350
|
+
file_id: str,
|
351
|
+
room: YRoom,
|
352
|
+
) -> None:
|
340
353
|
model = await self.contents.read_content(file_path, False)
|
341
354
|
# do nothing if the file was saved by us
|
342
355
|
assert model.last_modified is not None
|
@@ -347,10 +360,19 @@ class RoomManager:
|
|
347
360
|
documents = [v for k, v in self.documents.items() if k.split(":", 2)[2] == file_id]
|
348
361
|
for document in documents:
|
349
362
|
document.source = model.content
|
363
|
+
assert room.ystore is not None
|
364
|
+
await room.ystore.encode_state_as_update(room.ydoc)
|
350
365
|
self.last_modified[file_id] = to_datetime(model.last_modified)
|
351
366
|
|
352
367
|
def on_document_change(
|
353
|
-
self,
|
368
|
+
self,
|
369
|
+
file_id: str,
|
370
|
+
file_type: str,
|
371
|
+
file_format: str,
|
372
|
+
document: YBaseDoc,
|
373
|
+
room: YRoom,
|
374
|
+
target,
|
375
|
+
event,
|
354
376
|
) -> None:
|
355
377
|
if target == "state" and "dirty" in event.keys:
|
356
378
|
dirty = event.keys["dirty"]["newValue"]
|
@@ -361,17 +383,22 @@ class RoomManager:
|
|
361
383
|
# e.g. a new cell added to a notebook
|
362
384
|
document.unobserve()
|
363
385
|
document.observe(
|
364
|
-
partial(self.on_document_change, file_id, file_type, file_format, document)
|
386
|
+
partial(self.on_document_change, file_id, file_type, file_format, document, room)
|
365
387
|
)
|
366
388
|
if file_id in self.savers:
|
367
389
|
self.savers[file_id].cancel(raise_exception=False)
|
368
390
|
self.savers[file_id] = create_task(
|
369
|
-
self.maybe_save_document(file_id, file_type, file_format, document),
|
391
|
+
self.maybe_save_document(file_id, file_type, file_format, document, room),
|
370
392
|
self.task_group,
|
371
393
|
)
|
372
394
|
|
373
395
|
async def maybe_save_document(
|
374
|
-
self,
|
396
|
+
self,
|
397
|
+
file_id: str,
|
398
|
+
file_type: str,
|
399
|
+
file_format: str,
|
400
|
+
document: YBaseDoc,
|
401
|
+
room: YRoom,
|
375
402
|
) -> None:
|
376
403
|
# save after configured delay to prevent too frequent saving
|
377
404
|
await sleep(self.config.document_save_delay)
|
@@ -386,6 +413,8 @@ class RoomManager:
|
|
386
413
|
if self.last_modified[file_id] < to_datetime(model.last_modified):
|
387
414
|
# file changed on disk, let's revert
|
388
415
|
document.source = model.content
|
416
|
+
assert room.ystore is not None
|
417
|
+
await room.ystore.encode_state_as_update(room.ydoc)
|
389
418
|
self.last_modified[file_id] = to_datetime(model.last_modified)
|
390
419
|
return
|
391
420
|
if model.content != document.source:
|
@@ -1,3 +1,5 @@
|
|
1
|
+
import sys
|
2
|
+
|
1
3
|
import pytest
|
2
4
|
from anyio import create_task_group
|
3
5
|
from fps import get_root_module
|
@@ -10,7 +12,15 @@ from jupyverse_api.yjs.models import CreateDocumentSession
|
|
10
12
|
|
11
13
|
|
12
14
|
@pytest.mark.anyio
|
13
|
-
async def test_concurrent_disconnect(tmp_path):
|
15
|
+
async def test_concurrent_disconnect(tmp_path, anyio_backend_name):
|
16
|
+
if (
|
17
|
+
anyio_backend_name == "trio" and
|
18
|
+
sys.version_info >= (3, 13) and
|
19
|
+
sys.version_info < (3, 14) and
|
20
|
+
sys.platform == "darwin"
|
21
|
+
):
|
22
|
+
pytest.skip("Timeout")
|
23
|
+
|
14
24
|
config = {
|
15
25
|
"jupyverse": {
|
16
26
|
"type": "jupyverse",
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "jupyverse"
|
7
|
-
version = "0.10.
|
7
|
+
version = "0.10.14"
|
8
8
|
description = "A set of FPS plugins implementing a Jupyter server"
|
9
9
|
keywords = ["jupyter", "server", "fastapi", "plugins"]
|
10
10
|
requires-python = ">=3.9"
|
@@ -13,14 +13,14 @@ dependencies = [
|
|
13
13
|
"fps-contents >=0.10.1,<0.11.0",
|
14
14
|
"fps-file-id >=0.3.2,<0.4.0",
|
15
15
|
"fps-file-watcher >=0.1.1,<0.2.0",
|
16
|
-
"fps-kernel-subprocess >=0.1.
|
17
|
-
"fps-kernels >=0.10.
|
16
|
+
"fps-kernel-subprocess >=0.1.3,<0.2.0",
|
17
|
+
"fps-kernels >=0.10.3,<0.11.0",
|
18
18
|
"fps-terminals >=0.9.1,<0.10.0",
|
19
19
|
"fps-nbconvert >=0.9.1,<0.10.0",
|
20
|
-
"fps-yjs >=0.
|
20
|
+
"fps-yjs >=0.11.0,<0.12.0",
|
21
21
|
"fps-lab >=0.9.1,<0.10.0",
|
22
22
|
"fps-frontend >=0.9.1,<0.10.0",
|
23
|
-
"jupyverse-api >=0.11.
|
23
|
+
"jupyverse-api >=0.11.3,<0.12.0",
|
24
24
|
"rich-click >=1.6.1,<2",
|
25
25
|
"eval-type-backport; python_version<'3.10'",
|
26
26
|
]
|
@@ -89,6 +89,7 @@ pre-install-commands = [
|
|
89
89
|
"pip install -e ./plugins/auth_jupyterhub",
|
90
90
|
"pip install -e ./plugins/jupyterlab",
|
91
91
|
"pip install -e ./plugins/notebook",
|
92
|
+
"pip install pyyaml",
|
92
93
|
]
|
93
94
|
features = ["test"]
|
94
95
|
|
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
|
{jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/asgi_websocket_transport.py
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
|
{jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/file_watcher/__init__.py
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
|
{jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/resource_usage/__init__.py
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
|