jupyverse 0.7.7__tar.gz → 0.7.8__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.7 → jupyverse-0.7.8}/.pre-commit-config.yaml +1 -1
- {jupyverse-0.7.7 → jupyverse-0.7.8}/CHANGELOG.md +18 -2
- {jupyverse-0.7.7 → jupyverse-0.7.8}/PKG-INFO +1 -1
- jupyverse-0.7.8/jupyverse/__init__.py +1 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/__init__.py +1 -1
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/pyproject.toml +1 -1
- jupyverse-0.7.8/plugins/auth/fps_auth/__init__.py +1 -0
- jupyverse-0.7.8/plugins/auth_fief/fps_auth_fief/__init__.py +1 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_jupyterhub/fps_auth_jupyterhub/__init__.py +1 -1
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_jupyterhub/fps_auth_jupyterhub/main.py +1 -5
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_jupyterhub/fps_auth_jupyterhub/routes.py +1 -0
- jupyverse-0.7.8/plugins/contents/fps_contents/__init__.py +1 -0
- jupyverse-0.7.8/plugins/frontend/fps_frontend/__init__.py +1 -0
- jupyverse-0.7.8/plugins/jupyterlab/fps_jupyterlab/__init__.py +1 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/jupyterlab/pyproject.toml +1 -1
- jupyverse-0.7.8/plugins/kernels/fps_kernels/__init__.py +1 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/kernels/fps_kernels/kernel_driver/driver.py +4 -8
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/kernels/fps_kernels/main.py +1 -4
- jupyverse-0.7.8/plugins/lab/fps_lab/__init__.py +1 -0
- jupyverse-0.7.8/plugins/login/fps_login/__init__.py +1 -0
- jupyverse-0.7.8/plugins/nbconvert/fps_nbconvert/__init__.py +1 -0
- jupyverse-0.7.8/plugins/noauth/fps_noauth/__init__.py +1 -0
- jupyverse-0.7.8/plugins/notebook/fps_notebook/__init__.py +1 -0
- jupyverse-0.7.8/plugins/resource_usage/fps_resource_usage/__init__.py +1 -0
- jupyverse-0.7.8/plugins/terminals/fps_terminals/__init__.py +1 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/terminals/fps_terminals/main.py +1 -4
- jupyverse-0.7.8/plugins/webdav/fps_webdav/__init__.py +1 -0
- jupyverse-0.7.8/plugins/yjs/fps_yjs/__init__.py +1 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/fps_yjs/main.py +2 -7
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/fps_yjs/routes.py +4 -2
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/pyproject.toml +1 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/tests/test_execute.py +1 -1
- {jupyverse-0.7.7 → jupyverse-0.7.8}/tests/test_server.py +2 -2
- jupyverse-0.7.7/jupyverse/__init__.py +0 -1
- jupyverse-0.7.7/plugins/auth/fps_auth/__init__.py +0 -1
- jupyverse-0.7.7/plugins/auth_fief/fps_auth_fief/__init__.py +0 -1
- jupyverse-0.7.7/plugins/contents/fps_contents/__init__.py +0 -1
- jupyverse-0.7.7/plugins/frontend/fps_frontend/__init__.py +0 -1
- jupyverse-0.7.7/plugins/jupyterlab/fps_jupyterlab/__init__.py +0 -1
- jupyverse-0.7.7/plugins/kernels/fps_kernels/__init__.py +0 -1
- jupyverse-0.7.7/plugins/lab/fps_lab/__init__.py +0 -1
- jupyverse-0.7.7/plugins/login/fps_login/__init__.py +0 -1
- jupyverse-0.7.7/plugins/nbconvert/fps_nbconvert/__init__.py +0 -1
- jupyverse-0.7.7/plugins/noauth/fps_noauth/__init__.py +0 -1
- jupyverse-0.7.7/plugins/notebook/fps_notebook/__init__.py +0 -1
- jupyverse-0.7.7/plugins/resource_usage/fps_resource_usage/__init__.py +0 -1
- jupyverse-0.7.7/plugins/terminals/fps_terminals/__init__.py +0 -1
- jupyverse-0.7.7/plugins/webdav/fps_webdav/__init__.py +0 -1
- jupyverse-0.7.7/plugins/yjs/fps_yjs/__init__.py +0 -1
- jupyverse-0.7.7/plugins/yjs/fps_yjs/ydocs/__init__.py +0 -8
- jupyverse-0.7.7/plugins/yjs/fps_yjs/ydocs/utils.py +0 -26
- jupyverse-0.7.7/plugins/yjs/fps_yjs/ydocs/ybasedoc.py +0 -82
- jupyverse-0.7.7/plugins/yjs/fps_yjs/ydocs/yblob.py +0 -43
- jupyverse-0.7.7/plugins/yjs/fps_yjs/ydocs/yfile.py +0 -5
- jupyverse-0.7.7/plugins/yjs/fps_yjs/ydocs/ynotebook.py +0 -151
- jupyverse-0.7.7/plugins/yjs/fps_yjs/ydocs/yunicode.py +0 -35
- {jupyverse-0.7.7 → jupyverse-0.7.8}/.devcontainer/devcontainer.json +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/.devcontainer/requirements.txt +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/.github/workflows/check-release.yml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/.github/workflows/prep-release.yml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/.github/workflows/publish-release.yml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/.github/workflows/test.yml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/.gitignore +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/CONTRIBUTING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/binder/environment.yml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/binder/jupyter_notebook_config.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/binder/postBuild +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/binder/start +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/index.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/install.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/jupyter.svg +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/plugins/auth.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/plugins/contents.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/plugins/frontend.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/plugins/jupyterlab.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/plugins/kernels.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/plugins/lab.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/plugins/login.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/plugins/nbconvert.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/plugins/notebook.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/plugins/resource_usage.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/plugins/terminals.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/plugins/yjs.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/tutorials/jupyterhub_jupyverse_deployment.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/tutorials/standalone_jupyverse_deployment.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/usage/microservices.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/usage/multi_user.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/docs/usage/single_user.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/app/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/auth/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/auth/models.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/cli.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/contents/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/contents/models.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/exceptions.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/frontend/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/jupyterlab/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/kernels/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/kernels/models.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/lab/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/login/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/main/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/nbconvert/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/notebook/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/resource_usage/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/terminals/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/terminals/models.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/yjs/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/jupyverse_api/yjs/models.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/jupyverse_api/tests/test_resource_lock.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/mkdocs.yml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/notebooks/admin_users.ipynb +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/notebooks/admin_users.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth/fps_auth/backends.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth/fps_auth/config.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth/fps_auth/db.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth/fps_auth/main.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth/fps_auth/models.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth/fps_auth/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth/fps_auth/routes.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth/pyproject.toml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_fief/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_fief/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_fief/fps_auth_fief/backend.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_fief/fps_auth_fief/config.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_fief/fps_auth_fief/main.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_fief/fps_auth_fief/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_fief/fps_auth_fief/routes.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_fief/pyproject.toml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_jupyterhub/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_jupyterhub/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_jupyterhub/fps_auth_jupyterhub/config.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_jupyterhub/fps_auth_jupyterhub/db.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_jupyterhub/fps_auth_jupyterhub/launch.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_jupyterhub/fps_auth_jupyterhub/models.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_jupyterhub/fps_auth_jupyterhub/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/auth_jupyterhub/pyproject.toml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/contents/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/contents/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/contents/fps_contents/fileid.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/contents/fps_contents/main.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/contents/fps_contents/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/contents/fps_contents/routes.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/contents/pyproject.toml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/frontend/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/frontend/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/frontend/fps_frontend/main.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/frontend/fps_frontend/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/frontend/pyproject.toml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/jupyterlab/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/jupyterlab/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/jupyterlab/fps_jupyterlab/index.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/jupyterlab/fps_jupyterlab/main.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/jupyterlab/fps_jupyterlab/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/jupyterlab/fps_jupyterlab/routes.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/kernels/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/kernels/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/kernels/fps_kernels/kernel_driver/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/kernels/fps_kernels/kernel_driver/connect.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/kernels/fps_kernels/kernel_driver/kernelspec.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/kernels/fps_kernels/kernel_driver/message.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/kernels/fps_kernels/kernel_driver/paths.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/kernels/fps_kernels/kernel_server/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/kernels/fps_kernels/kernel_server/message.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/kernels/fps_kernels/kernel_server/server.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/kernels/fps_kernels/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/kernels/fps_kernels/routes.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/kernels/pyproject.toml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/lab/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/lab/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/lab/fps_lab/main.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/lab/fps_lab/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/lab/fps_lab/routes.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/lab/fps_lab/static/favicon.ico +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/lab/pyproject.toml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/fps_login/main.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/fps_login/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/fps_login/routes.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/fps_login/static/favicons/favicon-busy-1.ico +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/fps_login/static/favicons/favicon-busy-2.ico +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/fps_login/static/favicons/favicon-busy-3.ico +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/fps_login/static/favicons/favicon-file.ico +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/fps_login/static/favicons/favicon-notebook.ico +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/fps_login/static/favicons/favicon-terminal.ico +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/fps_login/static/favicons/favicon.ico +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/fps_login/static/index.html +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/fps_login/static/logo/github.svg +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/fps_login/static/logo/logo.png +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/fps_login/static/style/index.css +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/login/pyproject.toml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/nbconvert/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/nbconvert/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/nbconvert/fps_nbconvert/main.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/nbconvert/fps_nbconvert/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/nbconvert/fps_nbconvert/routes.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/nbconvert/pyproject.toml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/noauth/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/noauth/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/noauth/fps_noauth/backends.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/noauth/fps_noauth/main.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/noauth/fps_noauth/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/noauth/pyproject.toml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/notebook/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/notebook/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/notebook/fps_notebook/main.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/notebook/fps_notebook/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/notebook/fps_notebook/routes.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/notebook/pyproject.toml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/resource_usage/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/resource_usage/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/resource_usage/fps_resource_usage/main.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/resource_usage/fps_resource_usage/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/resource_usage/fps_resource_usage/routes.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/resource_usage/pyproject.toml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/terminals/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/terminals/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/terminals/fps_terminals/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/terminals/fps_terminals/routes.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/terminals/fps_terminals/server.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/terminals/fps_terminals/win_server.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/terminals/pyproject.toml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/webdav/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/webdav/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/webdav/fps_webdav/config.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/webdav/fps_webdav/main.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/webdav/fps_webdav/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/webdav/fps_webdav/routes.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/webdav/pyproject.toml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/webdav/tests/conftest.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/webdav/tests/test_webdav.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/COPYING.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/README.md +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/fps_yjs/py.typed +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/fps_yjs/ywebsocket/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/fps_yjs/ywebsocket/asgi_server.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/fps_yjs/ywebsocket/awareness.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/fps_yjs/ywebsocket/django_channels_consumer.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/fps_yjs/ywebsocket/websocket.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/fps_yjs/ywebsocket/websocket_provider.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/fps_yjs/ywebsocket/websocket_server.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/fps_yjs/ywebsocket/yroom.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/fps_yjs/ywebsocket/ystore.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/fps_yjs/ywebsocket/yutils.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/fps_yjs/ywidgets/__init__.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/plugins/yjs/fps_yjs/ywidgets/widgets.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/pyproject.toml +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/pytest.ini +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/tests/conftest.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/tests/data/notebook0.ipynb +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/tests/data/notebook1.ipynb +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/tests/test_app.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/tests/test_auth.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/tests/test_contents.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/tests/test_kernels.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/tests/test_settings.py +0 -0
- {jupyverse-0.7.7 → jupyverse-0.7.8}/tests/utils.py +0 -0
@@ -2,6 +2,24 @@
|
|
2
2
|
|
3
3
|
<!-- <START NEW CHANGELOG ENTRY> -->
|
4
4
|
|
5
|
+
## 0.7.8
|
6
|
+
|
7
|
+
([Full Changelog](https://github.com/jupyter-server/jupyverse/compare/v0.7.7...aef97417f06bbb76e9a6b060b5f662dd555caaae))
|
8
|
+
|
9
|
+
### Merged PRs
|
10
|
+
|
11
|
+
- Use jupyter-ydoc instead of vendored version [#484](https://github.com/jupyter-server/jupyverse/pull/484) ([@davidbrochart](https://github.com/davidbrochart))
|
12
|
+
- Upgrade FPS to v0.3.0 [#482](https://github.com/jupyter-server/jupyverse/pull/482) ([@davidbrochart](https://github.com/davidbrochart))
|
13
|
+
- Fix stream outputs [#480](https://github.com/jupyter-server/jupyverse/pull/480) ([@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-04-04&to=2025-04-23&type=c))
|
18
|
+
|
19
|
+
[@davidbrochart](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyverse+involves%3Adavidbrochart+updated%3A2025-04-04..2025-04-23&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyverse+involves%3Apre-commit-ci+updated%3A2025-04-04..2025-04-23&type=Issues)
|
20
|
+
|
21
|
+
<!-- <END NEW CHANGELOG ENTRY> -->
|
22
|
+
|
5
23
|
## 0.7.7
|
6
24
|
|
7
25
|
([Full Changelog](https://github.com/jupyter-server/jupyverse/compare/v0.7.6...69a1ecaa8f61a83c441d1c8e69a02835085fceb6))
|
@@ -18,8 +36,6 @@
|
|
18
36
|
|
19
37
|
[@davidbrochart](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyverse+involves%3Adavidbrochart+updated%3A2025-03-28..2025-04-04&type=Issues)
|
20
38
|
|
21
|
-
<!-- <END NEW CHANGELOG ENTRY> -->
|
22
|
-
|
23
39
|
## 0.7.6
|
24
40
|
|
25
41
|
([Full Changelog](https://github.com/jupyter-server/jupyverse/compare/v0.7.5...510ab6902fb8701df90fb542511b7daa2f7a9537))
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.8"
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.8"
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.8"
|
@@ -21,9 +21,5 @@ class AuthJupyterHubModule(Module):
|
|
21
21
|
|
22
22
|
async with create_task_group() as self.tg:
|
23
23
|
await self.tg.start(self.auth_jupyterhub.start)
|
24
|
-
self.put(self.auth_jupyterhub, Auth)
|
24
|
+
self.put(self.auth_jupyterhub, Auth, teardown_callback=self.auth_jupyterhub.stop)
|
25
25
|
self.done()
|
26
|
-
|
27
|
-
async def stop(self) -> None:
|
28
|
-
await self.auth_jupyterhub.stop()
|
29
|
-
self.tg.cancel_scope.cancel()
|
@@ -170,6 +170,7 @@ def auth_factory(
|
|
170
170
|
await self.http_client.aclose()
|
171
171
|
await self.db_session.close()
|
172
172
|
await self.db_engine.dispose()
|
173
|
+
self.task_group.cancel_scope.cancel()
|
173
174
|
|
174
175
|
async def update_user(
|
175
176
|
self, jupyverse_jupyterhub_token: Annotated[str | None, Cookie()] = None
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.8"
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.8"
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.8"
|
@@ -8,7 +8,7 @@ description = "An FPS plugin for the JupyterLab API"
|
|
8
8
|
keywords = [ "jupyter", "server", "fastapi", "plugins" ]
|
9
9
|
requires-python = ">=3.9"
|
10
10
|
dependencies = [
|
11
|
-
"jupyterlab >=4.
|
11
|
+
"jupyterlab >=4.4.1,<5",
|
12
12
|
"jupyverse-api >=0.7.0,<1",
|
13
13
|
]
|
14
14
|
dynamic = [ "version",]
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.8"
|
@@ -1,6 +1,5 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
import os
|
4
3
|
import time
|
5
4
|
import uuid
|
6
5
|
from typing import Any, cast
|
@@ -15,7 +14,7 @@ from anyio import (
|
|
15
14
|
)
|
16
15
|
from anyio.abc import TaskGroup, TaskStatus
|
17
16
|
from anyio.streams.stapled import StapledObjectStream
|
18
|
-
from pycrdt import Array, Map
|
17
|
+
from pycrdt import Array, Map, Text
|
19
18
|
|
20
19
|
from jupyverse_api.yjs import Yjs
|
21
20
|
|
@@ -271,22 +270,19 @@ class KernelDriver:
|
|
271
270
|
content = msg["content"]
|
272
271
|
if msg_type == "stream":
|
273
272
|
with outputs.doc.transaction():
|
274
|
-
# TODO: uncomment when changes are made in jupyter-ydoc
|
275
|
-
text = content["text"]
|
276
|
-
if text.endswith((os.linesep, "\n")):
|
277
|
-
text = text[:-1]
|
278
273
|
if (not outputs) or (outputs[-1]["name"] != content["name"]): # type: ignore
|
279
274
|
outputs.append(
|
280
275
|
Map(
|
281
276
|
{
|
282
277
|
"name": content["name"],
|
283
278
|
"output_type": msg_type,
|
284
|
-
"text":
|
279
|
+
"text": Text(content["text"]),
|
285
280
|
}
|
286
281
|
)
|
287
282
|
)
|
288
283
|
else:
|
289
|
-
outputs[-1]["text"]
|
284
|
+
text = outputs[-1]["text"]
|
285
|
+
text += content["text"] # type: ignore
|
290
286
|
elif msg_type in ("display_data", "execute_result"):
|
291
287
|
if "application/vnd.jupyter.ywidget-view+json" in content["data"]:
|
292
288
|
# this is a collaborative widget
|
@@ -35,11 +35,8 @@ class KernelsModule(Module):
|
|
35
35
|
)
|
36
36
|
|
37
37
|
self.kernels = _Kernels(app, self.config, auth, frontend_config, yjs, lifespan)
|
38
|
-
self.put(self.kernels, Kernels)
|
38
|
+
self.put(self.kernels, Kernels, teardown_callback=self.kernels.stop)
|
39
39
|
|
40
40
|
async with create_task_group() as tg:
|
41
41
|
tg.start_soon(self.kernels.start)
|
42
42
|
self.done()
|
43
|
-
|
44
|
-
async def stop(self) -> None:
|
45
|
-
await self.kernels.stop()
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.8"
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.8"
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.8"
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.8"
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.8"
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.8"
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.8"
|
@@ -22,10 +22,7 @@ class TerminalsModule(Module):
|
|
22
22
|
auth = await self.get(Auth) # type: ignore[type-abstract]
|
23
23
|
|
24
24
|
self.terminals = _Terminals(app, auth, _TerminalServer)
|
25
|
-
self.put(self.terminals, Terminals)
|
26
25
|
async with create_task_group() as tg:
|
27
26
|
tg.start_soon(self.terminals.start)
|
27
|
+
self.put(self.terminals, Terminals, teardown_callback=self.terminals.stop)
|
28
28
|
self.done()
|
29
|
-
|
30
|
-
async def stop(self) -> None:
|
31
|
-
await self.terminals.stop()
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.8"
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.7.8"
|
@@ -26,13 +26,8 @@ class YjsModule(Module):
|
|
26
26
|
lifespan = await self.get(Lifespan)
|
27
27
|
|
28
28
|
self.yjs = _Yjs(app, auth, self.contents, lifespan)
|
29
|
-
self.put(self.yjs, Yjs)
|
30
29
|
|
31
30
|
async with create_task_group() as tg:
|
32
|
-
tg.
|
33
|
-
|
31
|
+
await tg.start(self.yjs.start)
|
32
|
+
self.put(self.yjs, Yjs, teardown_callback=self.yjs.stop)
|
34
33
|
self.done()
|
35
|
-
|
36
|
-
async def stop(self) -> None:
|
37
|
-
await self.yjs.stop()
|
38
|
-
await self.contents.file_id_manager.stop()
|
@@ -15,6 +15,8 @@ from fastapi import (
|
|
15
15
|
WebSocketDisconnect,
|
16
16
|
status,
|
17
17
|
)
|
18
|
+
from jupyter_ydoc import ydocs as YDOCS
|
19
|
+
from jupyter_ydoc.ybasedoc import YBaseDoc
|
18
20
|
from pycrdt import Doc, YMessageType, YSyncMessageType
|
19
21
|
from websockets.exceptions import ConnectionClosedOK
|
20
22
|
|
@@ -26,8 +28,6 @@ from jupyverse_api.main import Lifespan
|
|
26
28
|
from jupyverse_api.yjs import Yjs
|
27
29
|
from jupyverse_api.yjs.models import CreateDocumentSession
|
28
30
|
|
29
|
-
from .ydocs import ydocs as YDOCS
|
30
|
-
from .ydocs.ybasedoc import YBaseDoc
|
31
31
|
from .ywebsocket.websocket_server import WebsocketServer, YRoom
|
32
32
|
from .ywebsocket.ystore import SQLiteYStore, YDocNotFound
|
33
33
|
from .ywidgets import Widgets
|
@@ -62,10 +62,12 @@ class _Yjs(Yjs):
|
|
62
62
|
async with create_task_group() as tg:
|
63
63
|
self.room_manager = RoomManager(self.contents, self.lifespan)
|
64
64
|
tg.start_soon(self.room_manager.start)
|
65
|
+
tg.start_soon(self.contents.file_id_manager.start)
|
65
66
|
task_status.started()
|
66
67
|
|
67
68
|
async def stop(self) -> None:
|
68
69
|
await self.room_manager.stop()
|
70
|
+
await self.contents.file_id_manager.stop()
|
69
71
|
|
70
72
|
async def collaboration_room_websocket(
|
71
73
|
self,
|
@@ -5,10 +5,10 @@ from pathlib import Path
|
|
5
5
|
import anyio
|
6
6
|
import pytest
|
7
7
|
from fps import get_root_module, merge_config
|
8
|
-
from fps_yjs.ydocs import ydocs
|
9
8
|
from fps_yjs.ywebsocket import WebsocketProvider
|
10
9
|
from httpx import AsyncClient
|
11
10
|
from httpx_ws import aconnect_ws
|
11
|
+
from jupyter_ydoc import ydocs
|
12
12
|
from pycrdt import Doc, Map, Text
|
13
13
|
|
14
14
|
os.environ["PYDEVD_DISABLE_FILE_VALIDATION"] = "1"
|
@@ -5,9 +5,9 @@ from pathlib import Path
|
|
5
5
|
import anyio
|
6
6
|
import pytest
|
7
7
|
import requests
|
8
|
-
from fps_yjs.ydocs import ydocs
|
9
8
|
from fps_yjs.ywebsocket import WebsocketProvider
|
10
9
|
from httpx_ws import aconnect_ws
|
10
|
+
from jupyter_ydoc import ydocs
|
11
11
|
from pycrdt import Array, Doc, Map, Text
|
12
12
|
from utils import Websocket
|
13
13
|
|
@@ -113,7 +113,7 @@ async def test_rest_api(start_jupyverse):
|
|
113
113
|
}
|
114
114
|
]
|
115
115
|
assert cells[1]["outputs"] == [
|
116
|
-
{"name": "stdout", "output_type": "stream", "text":
|
116
|
+
{"name": "stdout", "output_type": "stream", "text": "Hello World!\n"}
|
117
117
|
]
|
118
118
|
assert cells[2]["outputs"] == [
|
119
119
|
{
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.7.7"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.7.7"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.7.7"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.7.7"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.7.7"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.7.7"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.7.7"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.7.7"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.7.7"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.7.7"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.7.7"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.7.7"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.7.7"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.7.7"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.7.7"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.7.7"
|
@@ -1,26 +0,0 @@
|
|
1
|
-
from typing import Union
|
2
|
-
|
3
|
-
INT = type[int]
|
4
|
-
FLOAT = type[float]
|
5
|
-
|
6
|
-
|
7
|
-
def cast_all(
|
8
|
-
o: Union[list, dict], from_type: Union[INT, FLOAT], to_type: Union[FLOAT, INT]
|
9
|
-
) -> Union[list, dict]:
|
10
|
-
if isinstance(o, list):
|
11
|
-
for i, v in enumerate(o):
|
12
|
-
if type(v) is from_type:
|
13
|
-
v2 = to_type(v)
|
14
|
-
if v == v2:
|
15
|
-
o[i] = v2
|
16
|
-
elif isinstance(v, (list, dict)):
|
17
|
-
cast_all(v, from_type, to_type)
|
18
|
-
elif isinstance(o, dict):
|
19
|
-
for k, v in o.items():
|
20
|
-
if type(v) is from_type:
|
21
|
-
v2 = to_type(v)
|
22
|
-
if v == v2:
|
23
|
-
o[k] = v2
|
24
|
-
elif isinstance(v, (list, dict)):
|
25
|
-
cast_all(v, from_type, to_type)
|
26
|
-
return o
|
@@ -1,82 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from abc import ABC, abstractmethod
|
4
|
-
from typing import Any, Callable
|
5
|
-
|
6
|
-
from pycrdt import Doc, Map, Subscription
|
7
|
-
|
8
|
-
|
9
|
-
class YBaseDoc(ABC):
|
10
|
-
_ydoc: Doc
|
11
|
-
_ystate: Map
|
12
|
-
|
13
|
-
def __init__(self, ydoc: Doc | None = None):
|
14
|
-
if ydoc is None:
|
15
|
-
self._ydoc = Doc()
|
16
|
-
else:
|
17
|
-
self._ydoc = ydoc
|
18
|
-
self._ystate = Map()
|
19
|
-
self._ydoc["state"] = self._ystate
|
20
|
-
self._subscriptions: dict[Any, Subscription] = {}
|
21
|
-
|
22
|
-
@property
|
23
|
-
@abstractmethod
|
24
|
-
def version(self) -> str:
|
25
|
-
...
|
26
|
-
|
27
|
-
@property
|
28
|
-
def ystate(self) -> Map:
|
29
|
-
return self._ystate
|
30
|
-
|
31
|
-
@property
|
32
|
-
def ydoc(self) -> Doc:
|
33
|
-
return self._ydoc
|
34
|
-
|
35
|
-
@property
|
36
|
-
def source(self) -> Any:
|
37
|
-
return self.get()
|
38
|
-
|
39
|
-
@source.setter
|
40
|
-
def source(self, value: Any):
|
41
|
-
return self.set(value)
|
42
|
-
|
43
|
-
@property
|
44
|
-
def dirty(self) -> bool | None:
|
45
|
-
return self._ystate.get("dirty")
|
46
|
-
|
47
|
-
@dirty.setter
|
48
|
-
def dirty(self, value: bool) -> None:
|
49
|
-
self._ystate["dirty"] = value
|
50
|
-
|
51
|
-
@property
|
52
|
-
def path(self) -> str | None:
|
53
|
-
return self._ystate.get("path")
|
54
|
-
|
55
|
-
@path.setter
|
56
|
-
def path(self, value: str) -> None:
|
57
|
-
self._ystate["path"] = value
|
58
|
-
|
59
|
-
@property
|
60
|
-
def file_id(self) -> str | None:
|
61
|
-
return self._ystate.get("file_id")
|
62
|
-
|
63
|
-
@file_id.setter
|
64
|
-
def file_id(self, value: str) -> None:
|
65
|
-
self._ystate["file_id"] = value
|
66
|
-
|
67
|
-
@abstractmethod
|
68
|
-
def get(self) -> Any:
|
69
|
-
...
|
70
|
-
|
71
|
-
@abstractmethod
|
72
|
-
def set(self, value: Any) -> None:
|
73
|
-
...
|
74
|
-
|
75
|
-
@abstractmethod
|
76
|
-
def observe(self, callback: Callable[[str, Any], None]) -> None:
|
77
|
-
...
|
78
|
-
|
79
|
-
def unobserve(self) -> None:
|
80
|
-
for k, v in self._subscriptions.items():
|
81
|
-
k.unobserve(v)
|
82
|
-
self._subscriptions = {}
|
@@ -1,43 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
import base64
|
4
|
-
from functools import partial
|
5
|
-
from typing import Any, Callable
|
6
|
-
|
7
|
-
from pycrdt import Doc, Map
|
8
|
-
|
9
|
-
from .ybasedoc import YBaseDoc
|
10
|
-
|
11
|
-
|
12
|
-
class YBlob(YBaseDoc):
|
13
|
-
"""
|
14
|
-
Extends :class:`YBaseDoc`, and represents a blob document.
|
15
|
-
It is currently encoded as base64 because of:
|
16
|
-
https://github.com/y-crdt/ypy/issues/108#issuecomment-1377055465
|
17
|
-
The Y document can be set from bytes or from str, in which case it is assumed to be encoded as
|
18
|
-
base64.
|
19
|
-
"""
|
20
|
-
|
21
|
-
_ysource: Map
|
22
|
-
|
23
|
-
def __init__(self, ydoc: Doc | None = None):
|
24
|
-
super().__init__(ydoc)
|
25
|
-
self._ysource = Map()
|
26
|
-
self._ydoc["source"] = self._ysource
|
27
|
-
|
28
|
-
@property
|
29
|
-
def version(self) -> str:
|
30
|
-
return "1.0.0"
|
31
|
-
|
32
|
-
def get(self) -> bytes:
|
33
|
-
return base64.b64decode(self._ysource["base64"].encode())
|
34
|
-
|
35
|
-
def set(self, value: bytes | str) -> None:
|
36
|
-
if isinstance(value, bytes):
|
37
|
-
value = base64.b64encode(value).decode()
|
38
|
-
self._ysource["base64"] = value
|
39
|
-
|
40
|
-
def observe(self, callback: Callable[[str, Any], None]) -> None:
|
41
|
-
self.unobserve()
|
42
|
-
self._subscriptions[self._ystate] = self._ystate.observe(partial(callback, "state"))
|
43
|
-
self._subscriptions[self._ysource] = self._ysource.observe(partial(callback, "source"))
|