jupyverse 0.7.6__tar.gz → 0.7.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. {jupyverse-0.7.6 → jupyverse-0.7.7}/CHANGELOG.md +18 -2
  2. {jupyverse-0.7.6 → jupyverse-0.7.7}/PKG-INFO +2 -1
  3. jupyverse-0.7.7/jupyverse/__init__.py +1 -0
  4. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/__init__.py +9 -9
  5. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/app/__init__.py +2 -3
  6. jupyverse-0.7.7/jupyverse_api/jupyverse_api/auth/__init__.py +27 -0
  7. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/auth/models.py +4 -4
  8. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/cli.py +10 -17
  9. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/contents/__init__.py +20 -37
  10. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/contents/models.py +9 -9
  11. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/jupyterlab/__init__.py +5 -10
  12. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/kernels/__init__.py +19 -33
  13. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/kernels/models.py +3 -3
  14. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/lab/__init__.py +15 -26
  15. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/login/__init__.py +1 -2
  16. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/main/__init__.py +3 -4
  17. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/nbconvert/__init__.py +2 -4
  18. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/notebook/__init__.py +5 -10
  19. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/resource_usage/__init__.py +1 -2
  20. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/terminals/__init__.py +7 -14
  21. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/yjs/__init__.py +3 -6
  22. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/pyproject.toml +1 -1
  23. jupyverse-0.7.7/plugins/auth/fps_auth/__init__.py +1 -0
  24. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth/fps_auth/backends.py +13 -11
  25. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth/fps_auth/config.py +4 -3
  26. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth/fps_auth/db.py +3 -2
  27. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth/fps_auth/models.py +1 -2
  28. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth/fps_auth/routes.py +10 -7
  29. jupyverse-0.7.7/plugins/auth_fief/fps_auth_fief/__init__.py +1 -0
  30. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_fief/fps_auth_fief/backend.py +7 -5
  31. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_fief/fps_auth_fief/routes.py +9 -6
  32. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_jupyterhub/fps_auth_jupyterhub/__init__.py +1 -1
  33. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_jupyterhub/fps_auth_jupyterhub/models.py +1 -2
  34. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_jupyterhub/fps_auth_jupyterhub/routes.py +11 -11
  35. jupyverse-0.7.7/plugins/contents/fps_contents/__init__.py +1 -0
  36. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/contents/fps_contents/fileid.py +15 -12
  37. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/contents/fps_contents/routes.py +9 -9
  38. jupyverse-0.7.7/plugins/frontend/fps_frontend/__init__.py +1 -0
  39. jupyverse-0.7.7/plugins/jupyterlab/fps_jupyterlab/__init__.py +1 -0
  40. jupyverse-0.7.7/plugins/kernels/fps_kernels/__init__.py +1 -0
  41. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_driver/connect.py +9 -9
  42. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_driver/driver.py +8 -6
  43. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_driver/message.py +22 -20
  44. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_driver/paths.py +4 -5
  45. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_server/message.py +12 -10
  46. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_server/server.py +12 -10
  47. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/routes.py +8 -7
  48. jupyverse-0.7.7/plugins/lab/fps_lab/__init__.py +1 -0
  49. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/lab/fps_lab/routes.py +4 -3
  50. jupyverse-0.7.7/plugins/login/fps_login/__init__.py +1 -0
  51. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/fps_login/routes.py +4 -2
  52. jupyverse-0.7.7/plugins/nbconvert/fps_nbconvert/__init__.py +1 -0
  53. jupyverse-0.7.7/plugins/noauth/fps_noauth/__init__.py +1 -0
  54. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/noauth/fps_noauth/backends.py +6 -4
  55. jupyverse-0.7.7/plugins/notebook/fps_notebook/__init__.py +1 -0
  56. jupyverse-0.7.7/plugins/resource_usage/fps_resource_usage/__init__.py +1 -0
  57. jupyverse-0.7.7/plugins/terminals/fps_terminals/__init__.py +1 -0
  58. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/terminals/fps_terminals/main.py +1 -2
  59. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/terminals/fps_terminals/routes.py +3 -3
  60. jupyverse-0.7.7/plugins/webdav/fps_webdav/__init__.py +1 -0
  61. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/webdav/fps_webdav/config.py +3 -4
  62. jupyverse-0.7.7/plugins/yjs/fps_yjs/__init__.py +1 -0
  63. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/routes.py +5 -6
  64. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ydocs/utils.py +5 -5
  65. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ydocs/ybasedoc.py +8 -6
  66. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ydocs/yblob.py +5 -3
  67. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ydocs/ynotebook.py +10 -8
  68. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ydocs/yunicode.py +4 -2
  69. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/asgi_server.py +2 -1
  70. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/websocket.py +1 -5
  71. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/yroom.py +2 -1
  72. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/ystore.py +2 -1
  73. {jupyverse-0.7.6 → jupyverse-0.7.7}/pyproject.toml +2 -1
  74. {jupyverse-0.7.6 → jupyverse-0.7.7}/tests/utils.py +5 -5
  75. jupyverse-0.7.6/jupyverse/__init__.py +0 -1
  76. jupyverse-0.7.6/jupyverse_api/jupyverse_api/auth/__init__.py +0 -27
  77. jupyverse-0.7.6/plugins/auth/fps_auth/__init__.py +0 -1
  78. jupyverse-0.7.6/plugins/auth_fief/fps_auth_fief/__init__.py +0 -1
  79. jupyverse-0.7.6/plugins/contents/fps_contents/__init__.py +0 -1
  80. jupyverse-0.7.6/plugins/frontend/fps_frontend/__init__.py +0 -1
  81. jupyverse-0.7.6/plugins/jupyterlab/fps_jupyterlab/__init__.py +0 -1
  82. jupyverse-0.7.6/plugins/kernels/fps_kernels/__init__.py +0 -1
  83. jupyverse-0.7.6/plugins/lab/fps_lab/__init__.py +0 -1
  84. jupyverse-0.7.6/plugins/login/fps_login/__init__.py +0 -1
  85. jupyverse-0.7.6/plugins/nbconvert/fps_nbconvert/__init__.py +0 -1
  86. jupyverse-0.7.6/plugins/noauth/fps_noauth/__init__.py +0 -1
  87. jupyverse-0.7.6/plugins/notebook/fps_notebook/__init__.py +0 -1
  88. jupyverse-0.7.6/plugins/resource_usage/fps_resource_usage/__init__.py +0 -1
  89. jupyverse-0.7.6/plugins/terminals/fps_terminals/__init__.py +0 -1
  90. jupyverse-0.7.6/plugins/webdav/fps_webdav/__init__.py +0 -1
  91. jupyverse-0.7.6/plugins/yjs/fps_yjs/__init__.py +0 -1
  92. {jupyverse-0.7.6 → jupyverse-0.7.7}/.devcontainer/devcontainer.json +0 -0
  93. {jupyverse-0.7.6 → jupyverse-0.7.7}/.devcontainer/requirements.txt +0 -0
  94. {jupyverse-0.7.6 → jupyverse-0.7.7}/.github/workflows/check-release.yml +0 -0
  95. {jupyverse-0.7.6 → jupyverse-0.7.7}/.github/workflows/prep-release.yml +0 -0
  96. {jupyverse-0.7.6 → jupyverse-0.7.7}/.github/workflows/publish-release.yml +0 -0
  97. {jupyverse-0.7.6 → jupyverse-0.7.7}/.github/workflows/test.yml +0 -0
  98. {jupyverse-0.7.6 → jupyverse-0.7.7}/.gitignore +0 -0
  99. {jupyverse-0.7.6 → jupyverse-0.7.7}/.pre-commit-config.yaml +0 -0
  100. {jupyverse-0.7.6 → jupyverse-0.7.7}/CONTRIBUTING.md +0 -0
  101. {jupyverse-0.7.6 → jupyverse-0.7.7}/COPYING.md +0 -0
  102. {jupyverse-0.7.6 → jupyverse-0.7.7}/README.md +0 -0
  103. {jupyverse-0.7.6 → jupyverse-0.7.7}/binder/environment.yml +0 -0
  104. {jupyverse-0.7.6 → jupyverse-0.7.7}/binder/jupyter_notebook_config.py +0 -0
  105. {jupyverse-0.7.6 → jupyverse-0.7.7}/binder/postBuild +0 -0
  106. {jupyverse-0.7.6 → jupyverse-0.7.7}/binder/start +0 -0
  107. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/index.md +0 -0
  108. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/install.md +0 -0
  109. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/jupyter.svg +0 -0
  110. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/plugins/auth.md +0 -0
  111. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/plugins/contents.md +0 -0
  112. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/plugins/frontend.md +0 -0
  113. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/plugins/jupyterlab.md +0 -0
  114. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/plugins/kernels.md +0 -0
  115. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/plugins/lab.md +0 -0
  116. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/plugins/login.md +0 -0
  117. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/plugins/nbconvert.md +0 -0
  118. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/plugins/notebook.md +0 -0
  119. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/plugins/resource_usage.md +0 -0
  120. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/plugins/terminals.md +0 -0
  121. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/plugins/yjs.md +0 -0
  122. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/tutorials/jupyterhub_jupyverse_deployment.md +0 -0
  123. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/tutorials/standalone_jupyverse_deployment.md +0 -0
  124. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/usage/microservices.md +0 -0
  125. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/usage/multi_user.md +0 -0
  126. {jupyverse-0.7.6 → jupyverse-0.7.7}/docs/usage/single_user.md +0 -0
  127. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse/py.typed +0 -0
  128. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/COPYING.md +0 -0
  129. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/README.md +0 -0
  130. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/exceptions.py +0 -0
  131. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/frontend/__init__.py +0 -0
  132. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/py.typed +0 -0
  133. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/terminals/models.py +0 -0
  134. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/jupyverse_api/yjs/models.py +0 -0
  135. {jupyverse-0.7.6 → jupyverse-0.7.7}/jupyverse_api/tests/test_resource_lock.py +0 -0
  136. {jupyverse-0.7.6 → jupyverse-0.7.7}/mkdocs.yml +0 -0
  137. {jupyverse-0.7.6 → jupyverse-0.7.7}/notebooks/admin_users.ipynb +0 -0
  138. {jupyverse-0.7.6 → jupyverse-0.7.7}/notebooks/admin_users.py +0 -0
  139. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth/COPYING.md +0 -0
  140. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth/README.md +0 -0
  141. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth/fps_auth/main.py +0 -0
  142. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth/fps_auth/py.typed +0 -0
  143. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth/pyproject.toml +0 -0
  144. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_fief/COPYING.md +0 -0
  145. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_fief/README.md +0 -0
  146. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_fief/fps_auth_fief/config.py +0 -0
  147. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_fief/fps_auth_fief/main.py +0 -0
  148. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_fief/fps_auth_fief/py.typed +0 -0
  149. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_fief/pyproject.toml +0 -0
  150. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_jupyterhub/COPYING.md +0 -0
  151. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_jupyterhub/README.md +0 -0
  152. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_jupyterhub/fps_auth_jupyterhub/config.py +0 -0
  153. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_jupyterhub/fps_auth_jupyterhub/db.py +0 -0
  154. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_jupyterhub/fps_auth_jupyterhub/launch.py +0 -0
  155. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_jupyterhub/fps_auth_jupyterhub/main.py +0 -0
  156. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_jupyterhub/fps_auth_jupyterhub/py.typed +0 -0
  157. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/auth_jupyterhub/pyproject.toml +0 -0
  158. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/contents/COPYING.md +0 -0
  159. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/contents/README.md +0 -0
  160. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/contents/fps_contents/main.py +0 -0
  161. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/contents/fps_contents/py.typed +0 -0
  162. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/contents/pyproject.toml +0 -0
  163. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/frontend/COPYING.md +0 -0
  164. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/frontend/README.md +0 -0
  165. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/frontend/fps_frontend/main.py +0 -0
  166. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/frontend/fps_frontend/py.typed +0 -0
  167. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/frontend/pyproject.toml +0 -0
  168. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/jupyterlab/COPYING.md +0 -0
  169. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/jupyterlab/README.md +0 -0
  170. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/jupyterlab/fps_jupyterlab/index.py +0 -0
  171. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/jupyterlab/fps_jupyterlab/main.py +0 -0
  172. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/jupyterlab/fps_jupyterlab/py.typed +0 -0
  173. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/jupyterlab/fps_jupyterlab/routes.py +0 -0
  174. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/jupyterlab/pyproject.toml +0 -0
  175. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/kernels/COPYING.md +0 -0
  176. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/kernels/README.md +0 -0
  177. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_driver/__init__.py +0 -0
  178. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_driver/kernelspec.py +0 -0
  179. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/kernel_server/__init__.py +0 -0
  180. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/main.py +0 -0
  181. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/kernels/fps_kernels/py.typed +0 -0
  182. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/kernels/pyproject.toml +0 -0
  183. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/lab/COPYING.md +0 -0
  184. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/lab/README.md +0 -0
  185. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/lab/fps_lab/main.py +0 -0
  186. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/lab/fps_lab/py.typed +0 -0
  187. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/lab/fps_lab/static/favicon.ico +0 -0
  188. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/lab/pyproject.toml +0 -0
  189. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/COPYING.md +0 -0
  190. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/README.md +0 -0
  191. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/fps_login/main.py +0 -0
  192. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/fps_login/py.typed +0 -0
  193. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/fps_login/static/favicons/favicon-busy-1.ico +0 -0
  194. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/fps_login/static/favicons/favicon-busy-2.ico +0 -0
  195. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/fps_login/static/favicons/favicon-busy-3.ico +0 -0
  196. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/fps_login/static/favicons/favicon-file.ico +0 -0
  197. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/fps_login/static/favicons/favicon-notebook.ico +0 -0
  198. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/fps_login/static/favicons/favicon-terminal.ico +0 -0
  199. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/fps_login/static/favicons/favicon.ico +0 -0
  200. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/fps_login/static/index.html +0 -0
  201. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/fps_login/static/logo/github.svg +0 -0
  202. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/fps_login/static/logo/logo.png +0 -0
  203. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/fps_login/static/style/index.css +0 -0
  204. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/login/pyproject.toml +0 -0
  205. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/nbconvert/COPYING.md +0 -0
  206. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/nbconvert/README.md +0 -0
  207. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/nbconvert/fps_nbconvert/main.py +0 -0
  208. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/nbconvert/fps_nbconvert/py.typed +0 -0
  209. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/nbconvert/fps_nbconvert/routes.py +0 -0
  210. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/nbconvert/pyproject.toml +0 -0
  211. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/noauth/COPYING.md +0 -0
  212. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/noauth/README.md +0 -0
  213. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/noauth/fps_noauth/main.py +0 -0
  214. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/noauth/fps_noauth/py.typed +0 -0
  215. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/noauth/pyproject.toml +0 -0
  216. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/notebook/COPYING.md +0 -0
  217. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/notebook/README.md +0 -0
  218. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/notebook/fps_notebook/main.py +0 -0
  219. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/notebook/fps_notebook/py.typed +0 -0
  220. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/notebook/fps_notebook/routes.py +0 -0
  221. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/notebook/pyproject.toml +0 -0
  222. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/resource_usage/COPYING.md +0 -0
  223. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/resource_usage/README.md +0 -0
  224. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/resource_usage/fps_resource_usage/main.py +0 -0
  225. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/resource_usage/fps_resource_usage/py.typed +0 -0
  226. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/resource_usage/fps_resource_usage/routes.py +0 -0
  227. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/resource_usage/pyproject.toml +0 -0
  228. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/terminals/COPYING.md +0 -0
  229. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/terminals/README.md +0 -0
  230. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/terminals/fps_terminals/py.typed +0 -0
  231. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/terminals/fps_terminals/server.py +0 -0
  232. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/terminals/fps_terminals/win_server.py +0 -0
  233. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/terminals/pyproject.toml +0 -0
  234. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/webdav/COPYING.md +0 -0
  235. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/webdav/README.md +0 -0
  236. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/webdav/fps_webdav/main.py +0 -0
  237. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/webdav/fps_webdav/py.typed +0 -0
  238. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/webdav/fps_webdav/routes.py +0 -0
  239. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/webdav/pyproject.toml +0 -0
  240. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/webdav/tests/conftest.py +0 -0
  241. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/webdav/tests/test_webdav.py +0 -0
  242. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/COPYING.md +0 -0
  243. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/README.md +0 -0
  244. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/main.py +0 -0
  245. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/py.typed +0 -0
  246. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ydocs/__init__.py +0 -0
  247. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ydocs/yfile.py +0 -0
  248. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/__init__.py +0 -0
  249. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/awareness.py +0 -0
  250. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/django_channels_consumer.py +0 -0
  251. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/websocket_provider.py +0 -0
  252. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/websocket_server.py +0 -0
  253. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywebsocket/yutils.py +0 -0
  254. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywidgets/__init__.py +0 -0
  255. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/fps_yjs/ywidgets/widgets.py +0 -0
  256. {jupyverse-0.7.6 → jupyverse-0.7.7}/plugins/yjs/pyproject.toml +0 -0
  257. {jupyverse-0.7.6 → jupyverse-0.7.7}/pytest.ini +0 -0
  258. {jupyverse-0.7.6 → jupyverse-0.7.7}/tests/conftest.py +0 -0
  259. {jupyverse-0.7.6 → jupyverse-0.7.7}/tests/data/notebook0.ipynb +0 -0
  260. {jupyverse-0.7.6 → jupyverse-0.7.7}/tests/data/notebook1.ipynb +0 -0
  261. {jupyverse-0.7.6 → jupyverse-0.7.7}/tests/test_app.py +0 -0
  262. {jupyverse-0.7.6 → jupyverse-0.7.7}/tests/test_auth.py +0 -0
  263. {jupyverse-0.7.6 → jupyverse-0.7.7}/tests/test_contents.py +0 -0
  264. {jupyverse-0.7.6 → jupyverse-0.7.7}/tests/test_execute.py +0 -0
  265. {jupyverse-0.7.6 → jupyverse-0.7.7}/tests/test_kernels.py +0 -0
  266. {jupyverse-0.7.6 → jupyverse-0.7.7}/tests/test_server.py +0 -0
  267. {jupyverse-0.7.6 → jupyverse-0.7.7}/tests/test_settings.py +0 -0
@@ -2,6 +2,24 @@
2
2
 
3
3
  <!-- <START NEW CHANGELOG ENTRY> -->
4
4
 
5
+ ## 0.7.7
6
+
7
+ ([Full Changelog](https://github.com/jupyter-server/jupyverse/compare/v0.7.6...69a1ecaa8f61a83c441d1c8e69a02835085fceb6))
8
+
9
+ ### Merged PRs
10
+
11
+ - Check if file exists before inserting it in fileids [#478](https://github.com/jupyter-server/jupyverse/pull/478) ([@davidbrochart](https://github.com/davidbrochart))
12
+ - Bump fps >=0.2.1 [#476](https://github.com/jupyter-server/jupyverse/pull/476) ([@davidbrochart](https://github.com/davidbrochart))
13
+ - Update types [#475](https://github.com/jupyter-server/jupyverse/pull/475) ([@davidbrochart](https://github.com/davidbrochart))
14
+
15
+ ### Contributors to this release
16
+
17
+ ([GitHub contributors page for this release](https://github.com/jupyter-server/jupyverse/graphs/contributors?from=2025-03-28&to=2025-04-04&type=c))
18
+
19
+ [@davidbrochart](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyverse+involves%3Adavidbrochart+updated%3A2025-03-28..2025-04-04&type=Issues)
20
+
21
+ <!-- <END NEW CHANGELOG ENTRY> -->
22
+
5
23
  ## 0.7.6
6
24
 
7
25
  ([Full Changelog](https://github.com/jupyter-server/jupyverse/compare/v0.7.5...510ab6902fb8701df90fb542511b7daa2f7a9537))
@@ -21,8 +39,6 @@
21
39
 
22
40
  [@davidbrochart](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyverse+involves%3Adavidbrochart+updated%3A2025-02-26..2025-03-28&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyverse+involves%3Apre-commit-ci+updated%3A2025-02-26..2025-03-28&type=Issues)
23
41
 
24
- <!-- <END NEW CHANGELOG ENTRY> -->
25
-
26
42
  ## 0.7.5
27
43
 
28
44
  ([Full Changelog](https://github.com/jupyter-server/jupyverse/compare/v0.7.4...3c652e450d8ce5e46d7ea1bb00c402d611c4f54f))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jupyverse
3
- Version: 0.7.6
3
+ Version: 0.7.7
4
4
  Summary: A set of FPS plugins implementing a Jupyter server
5
5
  Project-URL: Homepage, https://jupyter.org
6
6
  Author-email: Jupyter Development Team <jupyter@googlegroups.com>
@@ -8,6 +8,7 @@ License: BSD 3-Clause License
8
8
  License-File: COPYING.md
9
9
  Keywords: fastapi,jupyter,plugins,server
10
10
  Requires-Python: >=3.9
11
+ Requires-Dist: eval-type-backport; python_version < '3.10'
11
12
  Requires-Dist: fps-contents<1,>=0.7.0
12
13
  Requires-Dist: fps-frontend<1,>=0.7.0
13
14
  Requires-Dist: fps-kernels<1,>=0.7.0
@@ -0,0 +1 @@
1
+ __version__ = "0.7.7"
@@ -1,19 +1,19 @@
1
- from typing import Any, Dict
1
+ from typing import Any
2
2
 
3
3
  from anyio import Event
4
4
  from pydantic import BaseModel
5
5
 
6
6
  from .app import App
7
7
 
8
- __version__ = "0.7.6"
8
+ __version__ = "0.7.7"
9
9
 
10
10
 
11
11
  class Singleton(type):
12
- _instances: Dict = {}
12
+ _instances: dict = {}
13
13
 
14
14
  def __call__(cls, *args, **kwargs):
15
15
  if cls not in cls._instances:
16
- cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
16
+ cls._instances[cls] = super().__call__(*args, **kwargs)
17
17
  return cls._instances[cls]
18
18
 
19
19
 
@@ -45,9 +45,9 @@ class Router:
45
45
 
46
46
 
47
47
  class ResourceLock:
48
- """ResourceLock ensures that accesses cannot be done concurrently on the same resource.
49
- """
50
- _locks: Dict[Any, Event]
48
+ """ResourceLock ensures that accesses cannot be done concurrently on the same resource."""
49
+
50
+ _locks: dict[Any, Event]
51
51
 
52
52
  def __init__(self):
53
53
  self._locks = {}
@@ -58,10 +58,10 @@ class ResourceLock:
58
58
 
59
59
  class _ResourceLock:
60
60
  _idx: Any
61
- _locks: Dict[Any, Event]
61
+ _locks: dict[Any, Event]
62
62
  _lock: Event
63
63
 
64
- def __init__(self, idx: Any, locks: Dict[Any, Event]):
64
+ def __init__(self, idx: Any, locks: dict[Any, Event]):
65
65
  self._idx = idx
66
66
  self._locks = locks
67
67
 
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  from collections import defaultdict
4
4
  from datetime import datetime, timezone
5
- from typing import Dict, List
6
5
 
7
6
  import structlog
8
7
  from fastapi import FastAPI, Request
@@ -16,7 +15,7 @@ class App:
16
15
  """A wrapper around FastAPI that checks for endpoint path conflicts."""
17
16
 
18
17
  _app: FastAPI
19
- _router_paths: Dict[str, List[str]]
18
+ _router_paths: dict[str, list[str]]
20
19
 
21
20
  def __init__(self, app: FastAPI, mount_path: str | None = None):
22
21
  if mount_path is None:
@@ -66,7 +65,7 @@ class App:
66
65
  for _router, _paths in self._router_paths.items():
67
66
  if path in _paths:
68
67
  raise RuntimeError(
69
- f"{_type } mounts a path that is already defined in {_router}: {path}"
68
+ f"{_type} mounts a path that is already defined in {_router}: {path}"
70
69
  )
71
70
  self._router_paths[_type].append(path)
72
71
  logger.debug("Path mounted", type=_type, path=path)
@@ -0,0 +1,27 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+ from collections.abc import Awaitable
5
+ from typing import Any, Callable
6
+
7
+ from jupyverse_api import Config
8
+
9
+ from .models import User # noqa
10
+
11
+
12
+ class Auth(ABC):
13
+ @abstractmethod
14
+ def current_user(self, permissions: dict[str, list[str]] | None = None) -> Callable: ...
15
+
16
+ @abstractmethod
17
+ async def update_user(self) -> Callable: ...
18
+
19
+ @abstractmethod
20
+ def websocket_auth(
21
+ self,
22
+ permissions: dict[str, list[str]] | None = None,
23
+ ) -> Callable[[Any], Awaitable[tuple[Any, dict[str, list[str]] | None] | None]]: ...
24
+
25
+
26
+ class AuthConfig(Config):
27
+ pass
@@ -1,4 +1,4 @@
1
- from typing import Optional
1
+ from __future__ import annotations
2
2
 
3
3
  from pydantic import BaseModel
4
4
 
@@ -7,8 +7,8 @@ class User(BaseModel):
7
7
  username: str = ""
8
8
  name: str = ""
9
9
  display_name: str = ""
10
- initials: Optional[str] = None
11
- color: Optional[str] = None
12
- avatar_url: Optional[str] = None
10
+ initials: str | None = None
11
+ color: str | None = None
12
+ avatar_url: str | None = None
13
13
  workspace: str = "{}"
14
14
  settings: str = "{}"
@@ -1,7 +1,7 @@
1
1
  import io
2
2
  import json
3
3
  import sys
4
- from typing import Any, List, Tuple
4
+ from typing import Any
5
5
 
6
6
  import rich_click as click
7
7
  from fps import main as fps_main
@@ -92,10 +92,10 @@ def main(
92
92
  open_browser: bool = False,
93
93
  host: str = "127.0.0.1",
94
94
  port: int = 8000,
95
- set_: Tuple[str, ...] = (),
96
- disable: Tuple[str, ...] = (),
97
- allow_origin: Tuple[str, ...] = (),
98
- query_param: Tuple[str, ...] = (),
95
+ set_: tuple[str, ...] = (),
96
+ disable: tuple[str, ...] = (),
97
+ allow_origin: tuple[str, ...] = (),
98
+ query_param: tuple[str, ...] = (),
99
99
  ) -> None:
100
100
  query_params_dict = {}
101
101
  for qp in query_param:
@@ -103,7 +103,7 @@ def main(
103
103
  query_params_dict[key] = value
104
104
  query_params_str = json.dumps(query_params_dict)
105
105
  allow_origins_str = json.dumps(allow_origin)
106
- set_list: List[str] = list(set_)
106
+ set_list: list[str] = list(set_)
107
107
  set_list.append(f"debug={debug}")
108
108
  set_list.append(f"open_browser={open_browser}")
109
109
  set_list.append(f"host={host}")
@@ -121,21 +121,14 @@ def main(
121
121
  ) # type: ignore
122
122
 
123
123
 
124
- def get_pluggin_config(disable: Tuple[str, ...]) -> dict[str, Any]:
124
+ def get_pluggin_config(disable: tuple[str, ...]) -> dict[str, Any]:
125
125
  jupyverse_modules = [
126
- ep.name
127
- for ep in entry_points(group="jupyverse.modules")
128
- if ep.name not in disable
126
+ ep.name for ep in entry_points(group="jupyverse.modules") if ep.name not in disable
129
127
  ]
130
128
  config = {
131
129
  "jupyverse": {
132
- "type":"jupyverse_api.main:JupyverseModule",
133
- "modules": {
134
- module: {
135
- "type": module
136
- }
137
- for module in jupyverse_modules
138
- }
130
+ "type": "jupyverse_api.main:JupyverseModule",
131
+ "modules": {module: {"type": module} for module in jupyverse_modules},
139
132
  }
140
133
  }
141
134
  return config
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  from abc import ABC, abstractmethod
4
4
  from pathlib import Path
5
- from typing import Dict, List, Optional, Union
6
5
 
7
6
  from fastapi import APIRouter, Depends, Request, Response
8
7
 
@@ -15,26 +14,20 @@ from .models import Checkpoint, Content, SaveContent
15
14
 
16
15
  class FileIdManager(ABC):
17
16
  @abstractmethod
18
- async def start(self) -> None:
19
- ...
17
+ async def start(self) -> None: ...
20
18
 
21
19
  @abstractmethod
22
- async def stop(self) -> None:
23
- ...
20
+ async def stop(self) -> None: ...
24
21
 
25
22
  @abstractmethod
26
- async def get_path(self, file_id: str) -> str:
27
- ...
23
+ async def get_path(self, file_id: str) -> str: ...
28
24
 
29
25
  @abstractmethod
30
- async def get_id(self, file_path: str) -> str:
31
- ...
26
+ async def get_id(self, file_path: str) -> str: ...
32
27
 
33
- def watch(self, path: str):
34
- ...
28
+ def watch(self, path: str): ...
35
29
 
36
- def unwatch(self, path: str, watcher):
37
- ...
30
+ def unwatch(self, path: str, watcher): ...
38
31
 
39
32
 
40
33
  class Contents(Router, ABC):
@@ -59,7 +52,7 @@ class Contents(Router, ABC):
59
52
  status_code=201,
60
53
  )
61
54
  async def create_content(
62
- path: Optional[str],
55
+ path: str | None,
63
56
  request: Request,
64
57
  user: User = Depends(auth.current_user(permissions={"contents": ["write"]})),
65
58
  ) -> Content:
@@ -75,7 +68,7 @@ class Contents(Router, ABC):
75
68
  @router.get("/api/contents/{path:path}/checkpoints")
76
69
  async def get_checkpoint(
77
70
  path, user: User = Depends(auth.current_user(permissions={"contents": ["read"]}))
78
- ) -> List[Checkpoint]:
71
+ ) -> list[Checkpoint]:
79
72
  return await self.get_checkpoint(path, user)
80
73
 
81
74
  @router.get("/api/contents/{path:path}")
@@ -117,35 +110,30 @@ class Contents(Router, ABC):
117
110
 
118
111
  @property
119
112
  @abstractmethod
120
- def file_id_manager(self) -> FileIdManager:
121
- ...
113
+ def file_id_manager(self) -> FileIdManager: ...
122
114
 
123
115
  @abstractmethod
124
116
  async def read_content(
125
- self, path: Union[str, Path], get_content: bool, file_format: Optional[str] = None
126
- ) -> Content:
127
- ...
117
+ self, path: str | Path, get_content: bool, file_format: str | None = None
118
+ ) -> Content: ...
128
119
 
129
120
  @abstractmethod
130
- async def write_content(self, content: Union[SaveContent, Dict]) -> None:
131
- ...
121
+ async def write_content(self, content: SaveContent | dict) -> None: ...
132
122
 
133
123
  @abstractmethod
134
124
  async def create_checkpoint(
135
125
  self,
136
126
  path,
137
127
  user: User,
138
- ) -> Checkpoint:
139
- ...
128
+ ) -> Checkpoint: ...
140
129
 
141
130
  @abstractmethod
142
131
  async def create_content(
143
132
  self,
144
- path: Optional[str],
133
+ path: str | None,
145
134
  request: Request,
146
135
  user: User,
147
- ) -> Content:
148
- ...
136
+ ) -> Content: ...
149
137
 
150
138
  @abstractmethod
151
139
  async def get_root_content(
@@ -160,8 +148,7 @@ class Contents(Router, ABC):
160
148
  self,
161
149
  path,
162
150
  user: User,
163
- ) -> List[Checkpoint]:
164
- ...
151
+ ) -> list[Checkpoint]: ...
165
152
 
166
153
  @abstractmethod
167
154
  async def get_content(
@@ -169,8 +156,7 @@ class Contents(Router, ABC):
169
156
  path: str,
170
157
  content: int,
171
158
  user: User,
172
- ) -> Content:
173
- ...
159
+ ) -> Content: ...
174
160
 
175
161
  @abstractmethod
176
162
  async def save_content(
@@ -179,16 +165,14 @@ class Contents(Router, ABC):
179
165
  request: Request,
180
166
  response: Response,
181
167
  user: User,
182
- ) -> Content:
183
- ...
168
+ ) -> Content: ...
184
169
 
185
170
  @abstractmethod
186
171
  async def delete_content(
187
172
  self,
188
173
  path,
189
174
  user: User,
190
- ):
191
- ...
175
+ ): ...
192
176
 
193
177
  @abstractmethod
194
178
  async def rename_content(
@@ -196,5 +180,4 @@ class Contents(Router, ABC):
196
180
  path,
197
181
  request: Request,
198
182
  user: User,
199
- ) -> Content:
200
- ...
183
+ ) -> Content: ...
@@ -1,4 +1,4 @@
1
- from typing import Dict, List, Optional, Union
1
+ from __future__ import annotations
2
2
 
3
3
  from pydantic import BaseModel
4
4
 
@@ -11,24 +11,24 @@ class Checkpoint(BaseModel):
11
11
  class Content(BaseModel):
12
12
  name: str
13
13
  path: str
14
- last_modified: Optional[str] = None
15
- created: Optional[str] = None
16
- content: Optional[Union[List[Dict], str, Dict]] = None
17
- format: Optional[str] = None
18
- mimetype: Optional[str] = None
19
- size: Optional[int] = None
14
+ last_modified: str | None = None
15
+ created: str | None = None
16
+ content: list[dict] | str | dict | None = None
17
+ format: str | None = None
18
+ mimetype: str | None = None
19
+ size: int | None = None
20
20
  writable: bool
21
21
  type: str
22
22
 
23
23
 
24
24
  class CreateContent(BaseModel):
25
- ext: Optional[str] = None
25
+ ext: str | None = None
26
26
  path: str
27
27
  type: str
28
28
 
29
29
 
30
30
  class SaveContent(BaseModel):
31
- content: Optional[Union[str, Dict]] = None
31
+ content: str | dict | None = None
32
32
  format: str
33
33
  path: str
34
34
  type: str
@@ -55,19 +55,16 @@ class JupyterLab(Router, ABC):
55
55
  async def get_lab(
56
56
  self,
57
57
  user: User,
58
- ):
59
- ...
58
+ ): ...
60
59
 
61
60
  @abstractmethod
62
61
  async def load_workspace(
63
62
  self,
64
63
  path,
65
- ):
66
- ...
64
+ ): ...
67
65
 
68
66
  @abstractmethod
69
- async def get_workspace_data(self, user: User):
70
- ...
67
+ async def get_workspace_data(self, user: User): ...
71
68
 
72
69
  @abstractmethod
73
70
  async def set_workspace(
@@ -75,16 +72,14 @@ class JupyterLab(Router, ABC):
75
72
  request: Request,
76
73
  user: User,
77
74
  user_update,
78
- ):
79
- ...
75
+ ): ...
80
76
 
81
77
  @abstractmethod
82
78
  async def get_workspace(
83
79
  self,
84
80
  name,
85
81
  user: User,
86
- ):
87
- ...
82
+ ): ...
88
83
 
89
84
 
90
85
  class JupyterLabConfig(Config):
@@ -1,6 +1,7 @@
1
+ from __future__ import annotations
2
+
1
3
  from abc import ABC, abstractmethod
2
4
  from pathlib import Path
3
- from typing import List, Optional
4
5
 
5
6
  from fastapi import APIRouter, Depends, Request
6
7
  from pydantic import Field
@@ -61,7 +62,7 @@ class Kernels(Router, ABC):
61
62
  @router.get("/api/sessions")
62
63
  async def get_sessions(
63
64
  user: User = Depends(auth.current_user(permissions={"sessions": ["read"]})),
64
- ) -> List[Session]:
65
+ ) -> list[Session]:
65
66
  return await self.get_sessions(user)
66
67
 
67
68
  @router.post(
@@ -124,22 +125,19 @@ class Kernels(Router, ABC):
124
125
  self.include_router(router)
125
126
 
126
127
  @abstractmethod
127
- async def watch_connection_files(self, path: Path) -> None:
128
- ...
128
+ async def watch_connection_files(self, path: Path) -> None: ...
129
129
 
130
130
  @abstractmethod
131
131
  async def get_status(
132
132
  self,
133
133
  user: User,
134
- ):
135
- ...
134
+ ): ...
136
135
 
137
136
  @abstractmethod
138
137
  async def get_kernelspecs(
139
138
  self,
140
139
  user: User,
141
- ):
142
- ...
140
+ ): ...
143
141
 
144
142
  @abstractmethod
145
143
  async def get_kernelspec(
@@ -147,62 +145,54 @@ class Kernels(Router, ABC):
147
145
  kernel_name,
148
146
  file_name,
149
147
  user: User,
150
- ):
151
- ...
148
+ ): ...
152
149
 
153
150
  @abstractmethod
154
151
  async def get_kernels(
155
152
  self,
156
153
  user: User,
157
- ):
158
- ...
154
+ ): ...
159
155
 
160
156
  @abstractmethod
161
157
  async def delete_session(
162
158
  self,
163
159
  session_id: str,
164
160
  user: User,
165
- ):
166
- ...
161
+ ): ...
167
162
 
168
163
  @abstractmethod
169
164
  async def rename_session(
170
165
  self,
171
166
  request: Request,
172
167
  user: User,
173
- ) -> Session:
174
- ...
168
+ ) -> Session: ...
175
169
 
176
170
  @abstractmethod
177
171
  async def get_sessions(
178
172
  self,
179
173
  user: User,
180
- ) -> List[Session]:
181
- ...
174
+ ) -> list[Session]: ...
182
175
 
183
176
  @abstractmethod
184
177
  async def create_session(
185
178
  self,
186
179
  request: Request,
187
180
  user: User,
188
- ) -> Session:
189
- ...
181
+ ) -> Session: ...
190
182
 
191
183
  @abstractmethod
192
184
  async def interrupt_kernel(
193
185
  self,
194
186
  kernel_id,
195
187
  user: User,
196
- ):
197
- ...
188
+ ): ...
198
189
 
199
190
  @abstractmethod
200
191
  async def restart_kernel(
201
192
  self,
202
193
  kernel_id,
203
194
  user: User,
204
- ):
205
- ...
195
+ ): ...
206
196
 
207
197
  @abstractmethod
208
198
  async def execute_cell(
@@ -210,24 +200,21 @@ class Kernels(Router, ABC):
210
200
  request: Request,
211
201
  kernel_id,
212
202
  user: User,
213
- ):
214
- ...
203
+ ): ...
215
204
 
216
205
  @abstractmethod
217
206
  async def get_kernel(
218
207
  self,
219
208
  kernel_id,
220
209
  user: User,
221
- ):
222
- ...
210
+ ): ...
223
211
 
224
212
  @abstractmethod
225
213
  async def shutdown_kernel(
226
214
  self,
227
215
  kernel_id,
228
216
  user: User,
229
- ):
230
- ...
217
+ ): ...
231
218
 
232
219
  @abstractmethod
233
220
  async def kernel_channels(
@@ -235,8 +222,7 @@ class Kernels(Router, ABC):
235
222
  kernel_id,
236
223
  session_id,
237
224
  websocket_permissions,
238
- ):
239
- ...
225
+ ): ...
240
226
 
241
227
 
242
228
  class KernelsConfig(Config):
@@ -248,7 +234,7 @@ class KernelsConfig(Config):
248
234
  ),
249
235
  default=False,
250
236
  )
251
- external_connection_dir: Optional[str] = Field(
237
+ external_connection_dir: str | None = Field(
252
238
  description=(
253
239
  "The directory to look at for external kernel connection files, if "
254
240
  "allow_external_kernels is True. Defaults to Jupyter runtime_dir/external_kernels. "
@@ -1,11 +1,11 @@
1
- from typing import Optional
1
+ from __future__ import annotations
2
2
 
3
3
  from pydantic import BaseModel
4
4
 
5
5
 
6
6
  class KernelInfo(BaseModel):
7
- name: Optional[str] = None
8
- id: Optional[str] = None
7
+ name: str | None = None
8
+ id: str | None = None
9
9
 
10
10
 
11
11
  class CreateSession(BaseModel):