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.
Files changed (279) hide show
  1. {jupyverse-0.10.12 → jupyverse-0.10.14}/.pre-commit-config.yaml +2 -2
  2. {jupyverse-0.10.12 → jupyverse-0.10.14}/CHANGELOG.md +8 -0
  3. {jupyverse-0.10.12 → jupyverse-0.10.14}/PKG-INFO +5 -5
  4. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/kernels/__init__.py +1 -0
  5. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/pyproject.toml +1 -1
  6. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/fps_kernel_subprocess/kernel_subprocess.py +56 -20
  7. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/fps_kernel_subprocess/main.py +1 -1
  8. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/pyproject.toml +2 -2
  9. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/kernel_server/server.py +4 -0
  10. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/routes.py +1 -0
  11. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/pyproject.toml +2 -2
  12. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/routes.py +37 -8
  13. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/pyproject.toml +1 -1
  14. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/tests/test_yjs.py +11 -1
  15. {jupyverse-0.10.12 → jupyverse-0.10.14}/pyproject.toml +6 -5
  16. {jupyverse-0.10.12 → jupyverse-0.10.14}/.devcontainer/devcontainer.json +0 -0
  17. {jupyverse-0.10.12 → jupyverse-0.10.14}/.devcontainer/requirements.txt +0 -0
  18. {jupyverse-0.10.12 → jupyverse-0.10.14}/.github/workflows/publish-release.yml +0 -0
  19. {jupyverse-0.10.12 → jupyverse-0.10.14}/.github/workflows/test.yml +0 -0
  20. {jupyverse-0.10.12 → jupyverse-0.10.14}/.gitignore +0 -0
  21. {jupyverse-0.10.12 → jupyverse-0.10.14}/COPYING.md +0 -0
  22. {jupyverse-0.10.12 → jupyverse-0.10.14}/README.md +0 -0
  23. {jupyverse-0.10.12 → jupyverse-0.10.14}/binder/environment.yml +0 -0
  24. {jupyverse-0.10.12 → jupyverse-0.10.14}/binder/jupyter_notebook_config.py +0 -0
  25. {jupyverse-0.10.12 → jupyverse-0.10.14}/binder/postBuild +0 -0
  26. {jupyverse-0.10.12 → jupyverse-0.10.14}/binder/start +0 -0
  27. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/index.md +0 -0
  28. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/install.md +0 -0
  29. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/jupyter.svg +0 -0
  30. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/auth.md +0 -0
  31. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/contents.md +0 -0
  32. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/frontend.md +0 -0
  33. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/jupyterlab.md +0 -0
  34. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/kernels.md +0 -0
  35. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/lab.md +0 -0
  36. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/login.md +0 -0
  37. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/nbconvert.md +0 -0
  38. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/notebook.md +0 -0
  39. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/resource_usage.md +0 -0
  40. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/terminals.md +0 -0
  41. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/plugins/yjs.md +0 -0
  42. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/tutorials/jupyterhub_jupyverse_deployment.md +0 -0
  43. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/tutorials/standalone_jupyverse_deployment.md +0 -0
  44. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/usage/microservices.md +0 -0
  45. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/usage/multi_user.md +0 -0
  46. {jupyverse-0.10.12 → jupyverse-0.10.14}/docs/usage/single_user.md +0 -0
  47. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse/__init__.py +0 -0
  48. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse/py.typed +0 -0
  49. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/COPYING.md +0 -0
  50. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/README.md +0 -0
  51. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/__init__.py +0 -0
  52. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/app/__init__.py +0 -0
  53. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/asgi_websocket_transport.py +0 -0
  54. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/auth/__init__.py +0 -0
  55. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/auth/models.py +0 -0
  56. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/cli.py +0 -0
  57. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/contents/__init__.py +0 -0
  58. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/contents/models.py +0 -0
  59. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/exceptions.py +0 -0
  60. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/file_id/__init__.py +0 -0
  61. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/file_watcher/__init__.py +0 -0
  62. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/frontend/__init__.py +0 -0
  63. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/jupyterlab/__init__.py +0 -0
  64. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/kernel/__init__.py +0 -0
  65. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/kernels/models.py +0 -0
  66. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/lab/__init__.py +0 -0
  67. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/login/__init__.py +0 -0
  68. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/main/__init__.py +0 -0
  69. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/nbconvert/__init__.py +0 -0
  70. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/notebook/__init__.py +0 -0
  71. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/py.typed +0 -0
  72. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/resource_usage/__init__.py +0 -0
  73. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/terminals/__init__.py +0 -0
  74. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/terminals/models.py +0 -0
  75. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/yjs/__init__.py +0 -0
  76. {jupyverse-0.10.12 → jupyverse-0.10.14}/jupyverse_api/jupyverse_api/yjs/models.py +0 -0
  77. {jupyverse-0.10.12 → jupyverse-0.10.14}/mkdocs.yml +0 -0
  78. {jupyverse-0.10.12 → jupyverse-0.10.14}/notebooks/admin_users.ipynb +0 -0
  79. {jupyverse-0.10.12 → jupyverse-0.10.14}/notebooks/admin_users.py +0 -0
  80. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/COPYING.md +0 -0
  81. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/README.md +0 -0
  82. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/fps_auth/__init__.py +0 -0
  83. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/fps_auth/backends.py +0 -0
  84. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/fps_auth/config.py +0 -0
  85. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/fps_auth/db.py +0 -0
  86. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/fps_auth/main.py +0 -0
  87. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/fps_auth/models.py +0 -0
  88. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/fps_auth/py.typed +0 -0
  89. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/fps_auth/routes.py +0 -0
  90. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth/pyproject.toml +0 -0
  91. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/COPYING.md +0 -0
  92. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/README.md +0 -0
  93. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/fps_auth_fief/__init__.py +0 -0
  94. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/fps_auth_fief/backend.py +0 -0
  95. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/fps_auth_fief/config.py +0 -0
  96. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/fps_auth_fief/main.py +0 -0
  97. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/fps_auth_fief/py.typed +0 -0
  98. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/fps_auth_fief/routes.py +0 -0
  99. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_fief/pyproject.toml +0 -0
  100. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/COPYING.md +0 -0
  101. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/README.md +0 -0
  102. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/fps_auth_jupyterhub/__init__.py +0 -0
  103. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/fps_auth_jupyterhub/config.py +0 -0
  104. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/fps_auth_jupyterhub/db.py +0 -0
  105. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/fps_auth_jupyterhub/launch.py +0 -0
  106. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/fps_auth_jupyterhub/main.py +0 -0
  107. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/fps_auth_jupyterhub/models.py +0 -0
  108. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/fps_auth_jupyterhub/py.typed +0 -0
  109. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/fps_auth_jupyterhub/routes.py +0 -0
  110. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/auth_jupyterhub/pyproject.toml +0 -0
  111. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/contents/COPYING.md +0 -0
  112. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/contents/README.md +0 -0
  113. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/contents/fps_contents/__init__.py +0 -0
  114. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/contents/fps_contents/main.py +0 -0
  115. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/contents/fps_contents/py.typed +0 -0
  116. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/contents/fps_contents/routes.py +0 -0
  117. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/contents/pyproject.toml +0 -0
  118. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_id/COPYING.md +0 -0
  119. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_id/README.md +0 -0
  120. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_id/fps_file_id/__init__.py +0 -0
  121. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_id/fps_file_id/file_id.py +0 -0
  122. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_id/fps_file_id/main.py +0 -0
  123. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_id/fps_file_id/py.typed +0 -0
  124. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_id/pyproject.toml +0 -0
  125. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher/COPYING.md +0 -0
  126. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher/README.md +0 -0
  127. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher/fps_file_watcher/__init__.py +0 -0
  128. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher/fps_file_watcher/file_watcher.py +0 -0
  129. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher/fps_file_watcher/main.py +0 -0
  130. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher/fps_file_watcher/py.typed +0 -0
  131. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher/pyproject.toml +0 -0
  132. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher_poll/COPYING.md +0 -0
  133. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher_poll/README.md +0 -0
  134. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher_poll/fps_file_watcher_poll/__init__.py +0 -0
  135. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher_poll/fps_file_watcher_poll/file_watcher.py +0 -0
  136. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher_poll/fps_file_watcher_poll/main.py +0 -0
  137. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher_poll/fps_file_watcher_poll/py.typed +0 -0
  138. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/file_watcher_poll/pyproject.toml +0 -0
  139. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/frontend/COPYING.md +0 -0
  140. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/frontend/README.md +0 -0
  141. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/frontend/fps_frontend/__init__.py +0 -0
  142. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/frontend/fps_frontend/main.py +0 -0
  143. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/frontend/fps_frontend/py.typed +0 -0
  144. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/frontend/pyproject.toml +0 -0
  145. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/jupyterlab/COPYING.md +0 -0
  146. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/jupyterlab/README.md +0 -0
  147. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/jupyterlab/fps_jupyterlab/__init__.py +0 -0
  148. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/jupyterlab/fps_jupyterlab/index.py +0 -0
  149. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/jupyterlab/fps_jupyterlab/main.py +0 -0
  150. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/jupyterlab/fps_jupyterlab/py.typed +0 -0
  151. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/jupyterlab/fps_jupyterlab/routes.py +0 -0
  152. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/jupyterlab/pyproject.toml +0 -0
  153. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/COPYING.md +0 -0
  154. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/README.md +0 -0
  155. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/fps_kernel_subprocess/__init__.py +0 -0
  156. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/fps_kernel_subprocess/connect.py +0 -0
  157. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_subprocess/fps_kernel_subprocess/py.typed +0 -0
  158. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_web_worker/COPYING.md +0 -0
  159. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_web_worker/README.md +0 -0
  160. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_web_worker/fps_kernel_web_worker/__init__.py +0 -0
  161. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_web_worker/fps_kernel_web_worker/kernel_web_worker.py +0 -0
  162. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_web_worker/fps_kernel_web_worker/main.py +0 -0
  163. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_web_worker/fps_kernel_web_worker/py.typed +0 -0
  164. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernel_web_worker/pyproject.toml +0 -0
  165. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/COPYING.md +0 -0
  166. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/README.md +0 -0
  167. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/__init__.py +0 -0
  168. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/kernel_driver/__init__.py +0 -0
  169. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/kernel_driver/driver.py +0 -0
  170. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/kernel_driver/kernelspec.py +0 -0
  171. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/kernel_driver/message.py +0 -0
  172. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/kernel_driver/paths.py +0 -0
  173. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/kernel_server/__init__.py +0 -0
  174. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/kernel_server/message.py +0 -0
  175. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/main.py +0 -0
  176. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/fps_kernels/py.typed +0 -0
  177. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/kernels/tests/test_kernel_launcher.py +0 -0
  178. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/lab/COPYING.md +0 -0
  179. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/lab/README.md +0 -0
  180. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/lab/fps_lab/__init__.py +0 -0
  181. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/lab/fps_lab/main.py +0 -0
  182. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/lab/fps_lab/py.typed +0 -0
  183. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/lab/fps_lab/routes.py +0 -0
  184. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/lab/fps_lab/static/favicon.ico +0 -0
  185. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/lab/pyproject.toml +0 -0
  186. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/COPYING.md +0 -0
  187. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/README.md +0 -0
  188. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/__init__.py +0 -0
  189. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/main.py +0 -0
  190. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/py.typed +0 -0
  191. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/routes.py +0 -0
  192. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/favicons/favicon-busy-1.ico +0 -0
  193. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/favicons/favicon-busy-2.ico +0 -0
  194. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/favicons/favicon-busy-3.ico +0 -0
  195. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/favicons/favicon-file.ico +0 -0
  196. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/favicons/favicon-notebook.ico +0 -0
  197. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/favicons/favicon-terminal.ico +0 -0
  198. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/favicons/favicon.ico +0 -0
  199. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/index.html +0 -0
  200. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/logo/github.svg +0 -0
  201. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/logo/logo.png +0 -0
  202. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/fps_login/static/style/index.css +0 -0
  203. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/login/pyproject.toml +0 -0
  204. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/nbconvert/COPYING.md +0 -0
  205. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/nbconvert/README.md +0 -0
  206. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/nbconvert/fps_nbconvert/__init__.py +0 -0
  207. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/nbconvert/fps_nbconvert/main.py +0 -0
  208. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/nbconvert/fps_nbconvert/py.typed +0 -0
  209. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/nbconvert/fps_nbconvert/routes.py +0 -0
  210. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/nbconvert/pyproject.toml +0 -0
  211. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/noauth/COPYING.md +0 -0
  212. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/noauth/README.md +0 -0
  213. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/noauth/fps_noauth/__init__.py +0 -0
  214. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/noauth/fps_noauth/backends.py +0 -0
  215. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/noauth/fps_noauth/main.py +0 -0
  216. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/noauth/fps_noauth/py.typed +0 -0
  217. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/noauth/pyproject.toml +0 -0
  218. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/notebook/COPYING.md +0 -0
  219. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/notebook/README.md +0 -0
  220. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/notebook/fps_notebook/__init__.py +0 -0
  221. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/notebook/fps_notebook/main.py +0 -0
  222. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/notebook/fps_notebook/py.typed +0 -0
  223. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/notebook/fps_notebook/routes.py +0 -0
  224. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/notebook/pyproject.toml +0 -0
  225. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/resource_usage/COPYING.md +0 -0
  226. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/resource_usage/README.md +0 -0
  227. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/resource_usage/fps_resource_usage/__init__.py +0 -0
  228. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/resource_usage/fps_resource_usage/main.py +0 -0
  229. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/resource_usage/fps_resource_usage/py.typed +0 -0
  230. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/resource_usage/fps_resource_usage/routes.py +0 -0
  231. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/resource_usage/pyproject.toml +0 -0
  232. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/COPYING.md +0 -0
  233. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/README.md +0 -0
  234. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/fps_terminals/__init__.py +0 -0
  235. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/fps_terminals/main.py +0 -0
  236. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/fps_terminals/py.typed +0 -0
  237. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/fps_terminals/routes.py +0 -0
  238. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/fps_terminals/server.py +0 -0
  239. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/fps_terminals/win_server.py +0 -0
  240. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/terminals/pyproject.toml +0 -0
  241. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/COPYING.md +0 -0
  242. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/README.md +0 -0
  243. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/fps_webdav/__init__.py +0 -0
  244. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/fps_webdav/config.py +0 -0
  245. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/fps_webdav/main.py +0 -0
  246. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/fps_webdav/py.typed +0 -0
  247. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/fps_webdav/routes.py +0 -0
  248. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/pyproject.toml +0 -0
  249. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/tests/conftest.py +0 -0
  250. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/webdav/tests/test_webdav.py +0 -0
  251. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/COPYING.md +0 -0
  252. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/README.md +0 -0
  253. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/__init__.py +0 -0
  254. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/main.py +0 -0
  255. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/py.typed +0 -0
  256. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/__init__.py +0 -0
  257. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/asgi_server.py +0 -0
  258. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/awareness.py +0 -0
  259. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/django_channels_consumer.py +0 -0
  260. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/websocket.py +0 -0
  261. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/websocket_provider.py +0 -0
  262. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/websocket_server.py +0 -0
  263. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/yroom.py +0 -0
  264. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/ystore.py +0 -0
  265. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywebsocket/yutils.py +0 -0
  266. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywidgets/__init__.py +0 -0
  267. {jupyverse-0.10.12 → jupyverse-0.10.14}/plugins/yjs/fps_yjs/ywidgets/widgets.py +0 -0
  268. {jupyverse-0.10.12 → jupyverse-0.10.14}/pytest.ini +0 -0
  269. {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/conftest.py +0 -0
  270. {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/data/notebook0.ipynb +0 -0
  271. {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/data/notebook1.ipynb +0 -0
  272. {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/test_app.py +0 -0
  273. {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/test_auth.py +0 -0
  274. {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/test_contents.py +0 -0
  275. {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/test_execute.py +0 -0
  276. {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/test_kernels.py +0 -0
  277. {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/test_server.py +0 -0
  278. {jupyverse-0.10.12 → jupyverse-0.10.14}/tests/test_settings.py +0 -0
  279. {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: v5.0.0
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.7
19
+ rev: v0.12.11
20
20
  hooks:
21
21
  - id: ruff
22
22
  args: ["--fix"]
@@ -1,5 +1,13 @@
1
1
  # Version history
2
2
 
3
+ ## 0.10.14
4
+
5
+ - Fix document duplication with out-of-band changes.
6
+
7
+ ## 0.10.13
8
+
9
+ - Support separate kernel environment.
10
+
3
11
  ## 0.10.12
4
12
 
5
13
  - Add `FileWatcher` API.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jupyverse
3
- Version: 0.10.12
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.2
17
- Requires-Dist: fps-kernels<0.11.0,>=0.10.2
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.11.0,>=0.10.5
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.2
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'
@@ -251,3 +251,4 @@ class KernelsConfig(Config):
251
251
  default=None,
252
252
  )
253
253
  require_yjs: bool = False
254
+ kernelenv_path: str = ""
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "jupyverse_api"
7
- version = "0.11.2"
7
+ version = "0.11.3"
8
8
  description = "The public API for Jupyverse"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -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 open(self.kernelspec_path) as f:
68
- kernelspec = json.load(f)
69
- cmd = [s.format(connection_file=self.connection_file) for s in kernelspec["argv"]]
70
- if cmd and cmd[0] in {
71
- "python",
72
- f"python{sys.version_info[0]}",
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
- self._process = await open_process(cmd, stdout=stdout, stderr=stderr, cwd=kernel_cwd)
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
- try:
112
- self._process.terminate()
113
- except ProcessLookupError:
114
- pass
115
- await self._process.wait()
116
- if self.write_connection_file:
117
- path = anyio.Path(self.connection_file)
118
- await path.unlink(missing_ok=True)
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.send_signal(signal.SIGINT)
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:
@@ -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, DefaultKernelFactory)
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.2"
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.0,<0.12.0",
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.2"
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.2,<0.12.0",
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(self, file_format: str, file_id: str, document: YBaseDoc) -> None:
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(self, file_format: str, file_path: str, file_id: str) -> None:
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, file_id: str, file_type: str, file_format: str, document: YBaseDoc, target, event
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, file_id: str, file_type: str, file_format: str, document: YBaseDoc
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:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "fps_yjs"
7
- version = "0.10.5"
7
+ version = "0.11.0"
8
8
  description = "An FPS plugin for the Yjs API"
9
9
  keywords = [ "jupyter", "server", "fastapi", "plugins" ]
10
10
  requires-python = ">=3.9"
@@ -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.12"
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.2,<0.2.0",
17
- "fps-kernels >=0.10.2,<0.11.0",
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.10.5,<0.11.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.2,<0.12.0",
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