solara 1.30.0__py2.py3-none-any.whl → 1.31.0__py2.py3-none-any.whl

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 (439) hide show
  1. {solara-1.30.0.dist-info → solara-1.31.0.dist-info}/METADATA +7 -42
  2. solara-1.31.0.dist-info/RECORD +5 -0
  3. {solara-1.30.0.dist-info → solara-1.31.0.dist-info}/WHEEL +1 -1
  4. {solara/template/portal → solara-1.31.0.dist-info/licenses}/LICENSE +1 -1
  5. solara/__init__.py +0 -123
  6. solara/__main__.py +0 -734
  7. solara/alias.py +0 -6
  8. solara/autorouting.py +0 -554
  9. solara/cache.py +0 -294
  10. solara/checks.html +0 -71
  11. solara/checks.py +0 -224
  12. solara/comm.py +0 -28
  13. solara/components/__init__.py +0 -59
  14. solara/components/alert.py +0 -155
  15. solara/components/applayout.py +0 -393
  16. solara/components/button.py +0 -85
  17. solara/components/card.py +0 -87
  18. solara/components/checkbox.py +0 -50
  19. solara/components/code_highlight_css.py +0 -11
  20. solara/components/code_highlight_css.vue +0 -63
  21. solara/components/columns.py +0 -159
  22. solara/components/component_vue.py +0 -109
  23. solara/components/cross_filter.py +0 -335
  24. solara/components/dataframe.py +0 -546
  25. solara/components/datatable.py +0 -221
  26. solara/components/datatable.vue +0 -175
  27. solara/components/details.py +0 -21
  28. solara/components/download.vue +0 -35
  29. solara/components/echarts.py +0 -75
  30. solara/components/echarts.vue +0 -128
  31. solara/components/figure_altair.py +0 -39
  32. solara/components/file_browser.py +0 -182
  33. solara/components/file_download.py +0 -199
  34. solara/components/file_drop.py +0 -139
  35. solara/components/file_drop.vue +0 -83
  36. solara/components/file_list_widget.vue +0 -78
  37. solara/components/head.py +0 -27
  38. solara/components/head_tag.py +0 -49
  39. solara/components/head_tag.vue +0 -60
  40. solara/components/image.py +0 -173
  41. solara/components/input.py +0 -440
  42. solara/components/link.py +0 -55
  43. solara/components/markdown.py +0 -371
  44. solara/components/markdown_editor.py +0 -25
  45. solara/components/markdown_editor.vue +0 -362
  46. solara/components/matplotlib.py +0 -74
  47. solara/components/meta.py +0 -47
  48. solara/components/misc.py +0 -333
  49. solara/components/pivot_table.py +0 -258
  50. solara/components/pivot_table.vue +0 -158
  51. solara/components/progress.py +0 -47
  52. solara/components/select.py +0 -186
  53. solara/components/select.vue +0 -27
  54. solara/components/slider.py +0 -442
  55. solara/components/slider_date.vue +0 -56
  56. solara/components/spinner-solara.vue +0 -105
  57. solara/components/spinner.py +0 -30
  58. solara/components/sql_code.py +0 -33
  59. solara/components/sql_code.vue +0 -128
  60. solara/components/style.py +0 -105
  61. solara/components/switch.py +0 -68
  62. solara/components/tab_navigation.py +0 -37
  63. solara/components/title.py +0 -90
  64. solara/components/title.vue +0 -38
  65. solara/components/togglebuttons.py +0 -202
  66. solara/components/tooltip.py +0 -61
  67. solara/datatypes.py +0 -143
  68. solara/express.py +0 -241
  69. solara/hooks/__init__.py +0 -4
  70. solara/hooks/dataframe.py +0 -99
  71. solara/hooks/misc.py +0 -263
  72. solara/hooks/use_reactive.py +0 -129
  73. solara/hooks/use_thread.py +0 -129
  74. solara/kitchensink.py +0 -8
  75. solara/lab/__init__.py +0 -34
  76. solara/lab/components/__init__.py +0 -6
  77. solara/lab/components/chat.py +0 -203
  78. solara/lab/components/confirmation_dialog.py +0 -165
  79. solara/lab/components/cross_filter.py +0 -7
  80. solara/lab/components/input_date.py +0 -298
  81. solara/lab/components/menu.py +0 -181
  82. solara/lab/components/menu.vue +0 -38
  83. solara/lab/components/tabs.py +0 -274
  84. solara/lab/components/theming.py +0 -98
  85. solara/lab/components/theming.vue +0 -72
  86. solara/lab/hooks/__init__.py +0 -0
  87. solara/lab/hooks/dataframe.py +0 -12
  88. solara/lab/toestand.py +0 -3
  89. solara/lab/utils/__init__.py +0 -2
  90. solara/lab/utils/cookies.py +0 -5
  91. solara/lab/utils/dataframe.py +0 -115
  92. solara/lab/utils/headers.py +0 -5
  93. solara/layout.py +0 -44
  94. solara/minisettings.py +0 -133
  95. solara/py.typed +0 -0
  96. solara/reactive.py +0 -93
  97. solara/routing.py +0 -268
  98. solara/scope/__init__.py +0 -87
  99. solara/scope/types.py +0 -55
  100. solara/server/__init__.py +0 -0
  101. solara/server/app.py +0 -490
  102. solara/server/assets/custom.css +0 -1
  103. solara/server/assets/custom.js +0 -1
  104. solara/server/assets/favicon.png +0 -0
  105. solara/server/assets/favicon.svg +0 -5
  106. solara/server/assets/style.css +0 -1665
  107. solara/server/assets/theme-dark.css +0 -437
  108. solara/server/assets/theme-light.css +0 -420
  109. solara/server/assets/theme.js +0 -3
  110. solara/server/cdn_helper.py +0 -77
  111. solara/server/esm.py +0 -69
  112. solara/server/fastapi.py +0 -5
  113. solara/server/flask.py +0 -286
  114. solara/server/jupyter/__init__.py +0 -2
  115. solara/server/jupyter/cdn_handler.py +0 -28
  116. solara/server/jupyter/server_extension.py +0 -29
  117. solara/server/jupytertools.py +0 -46
  118. solara/server/kernel.py +0 -319
  119. solara/server/kernel_context.py +0 -393
  120. solara/server/patch.py +0 -552
  121. solara/server/reload.py +0 -242
  122. solara/server/server.py +0 -437
  123. solara/server/settings.py +0 -212
  124. solara/server/shell.py +0 -240
  125. solara/server/starlette.py +0 -597
  126. solara/server/static/ansi.js +0 -270
  127. solara/server/static/highlight-dark.css +0 -82
  128. solara/server/static/highlight.css +0 -43
  129. solara/server/static/main-vuetify.js +0 -260
  130. solara/server/static/main.js +0 -163
  131. solara/server/static/solara_bootstrap.py +0 -129
  132. solara/server/static/sun.svg +0 -23
  133. solara/server/static/webworker.js +0 -42
  134. solara/server/telemetry.py +0 -212
  135. solara/server/templates/index.html.j2 +0 -1
  136. solara/server/templates/loader-plain.css +0 -11
  137. solara/server/templates/loader-plain.html +0 -20
  138. solara/server/templates/loader-solara.css +0 -111
  139. solara/server/templates/loader-solara.html +0 -40
  140. solara/server/templates/plain.html +0 -82
  141. solara/server/templates/solara.html.j2 +0 -446
  142. solara/server/threaded.py +0 -75
  143. solara/server/utils.py +0 -30
  144. solara/server/websocket.py +0 -44
  145. solara/settings.py +0 -56
  146. solara/tasks.py +0 -847
  147. solara/template/button.py +0 -16
  148. solara/template/markdown.py +0 -42
  149. solara/template/portal/.flake8 +0 -6
  150. solara/template/portal/.pre-commit-config.yaml +0 -28
  151. solara/template/portal/Procfile +0 -7
  152. solara/template/portal/mypy.ini +0 -3
  153. solara/template/portal/pyproject.toml +0 -26
  154. solara/template/portal/solara_portal/__init__.py +0 -3
  155. solara/template/portal/solara_portal/components/__init__.py +0 -2
  156. solara/template/portal/solara_portal/components/article.py +0 -28
  157. solara/template/portal/solara_portal/components/data.py +0 -28
  158. solara/template/portal/solara_portal/components/header.py +0 -6
  159. solara/template/portal/solara_portal/components/layout.py +0 -6
  160. solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +0 -85
  161. solara/template/portal/solara_portal/content/articles/substiterat-vati.md +0 -70
  162. solara/template/portal/solara_portal/data.py +0 -60
  163. solara/template/portal/solara_portal/pages/__init__.py +0 -67
  164. solara/template/portal/solara_portal/pages/article/__init__.py +0 -26
  165. solara/template/portal/solara_portal/pages/tabular.py +0 -29
  166. solara/template/portal/solara_portal/pages/viz/__init__.py +0 -69
  167. solara/template/portal/solara_portal/pages/viz/overview.py +0 -14
  168. solara/test/__init__.py +0 -0
  169. solara/test/pytest_plugin.py +0 -698
  170. solara/toestand.py +0 -772
  171. solara/util.py +0 -308
  172. solara/website/__init__.py +0 -0
  173. solara/website/assets/custom.css +0 -462
  174. solara/website/assets/images/logo-small.png +0 -0
  175. solara/website/assets/images/logo.svg +0 -17
  176. solara/website/assets/images/logo_white.svg +0 -50
  177. solara/website/assets/theme.js +0 -8
  178. solara/website/components/__init__.py +0 -5
  179. solara/website/components/algolia.vue +0 -24
  180. solara/website/components/algolia_api.vue +0 -157
  181. solara/website/components/docs.py +0 -118
  182. solara/website/components/header.py +0 -72
  183. solara/website/components/hero.py +0 -15
  184. solara/website/components/mailchimp.py +0 -12
  185. solara/website/components/mailchimp.vue +0 -47
  186. solara/website/components/notebook.py +0 -172
  187. solara/website/pages/__init__.py +0 -564
  188. solara/website/pages/apps/__init__.py +0 -16
  189. solara/website/pages/apps/authorization/__init__.py +0 -118
  190. solara/website/pages/apps/authorization/admin.py +0 -12
  191. solara/website/pages/apps/authorization/users.py +0 -12
  192. solara/website/pages/apps/jupyter-dashboard-1.py +0 -116
  193. solara/website/pages/apps/layout-demo.py +0 -40
  194. solara/website/pages/apps/multipage/__init__.py +0 -38
  195. solara/website/pages/apps/multipage/page1.py +0 -26
  196. solara/website/pages/apps/multipage/page2.py +0 -34
  197. solara/website/pages/apps/scatter.py +0 -136
  198. solara/website/pages/apps/scrolling.py +0 -63
  199. solara/website/pages/apps/tutorial-streamlit.py +0 -18
  200. solara/website/pages/changelog/__init__.py +0 -8
  201. solara/website/pages/changelog/changelog.md +0 -180
  202. solara/website/pages/contact/__init__.py +0 -8
  203. solara/website/pages/contact/contact.md +0 -17
  204. solara/website/pages/doc_use_download.py +0 -85
  205. solara/website/pages/documentation/__init__.py +0 -184
  206. solara/website/pages/documentation/advanced/__init__.py +0 -36
  207. solara/website/pages/documentation/advanced/content/00-overview.md +0 -1
  208. solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +0 -1
  209. solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +0 -191
  210. solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +0 -120
  211. solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +0 -149
  212. solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +0 -66
  213. solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +0 -43
  214. solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +0 -120
  215. solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +0 -4
  216. solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +0 -30
  217. solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +0 -38
  218. solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +0 -24
  219. solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +0 -104
  220. solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +0 -19
  221. solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +0 -3
  222. solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +0 -160
  223. solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +0 -13
  224. solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +0 -236
  225. solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +0 -81
  226. solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +0 -7
  227. solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +0 -1
  228. solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +0 -167
  229. solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  230. solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +0 -41
  231. solara/website/pages/documentation/advanced/content/40-development/10-setup.md +0 -72
  232. solara/website/pages/documentation/advanced/content/__init__.py +0 -0
  233. solara/website/pages/documentation/api/__init__.py +0 -19
  234. solara/website/pages/documentation/api/cross_filter/__init__.py +0 -9
  235. solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +0 -23
  236. solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +0 -22
  237. solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +0 -22
  238. solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +0 -22
  239. solara/website/pages/documentation/api/hooks/__init__.py +0 -9
  240. solara/website/pages/documentation/api/hooks/use_cross_filter.py +0 -25
  241. solara/website/pages/documentation/api/hooks/use_dark_effective.py +0 -13
  242. solara/website/pages/documentation/api/hooks/use_effect.md +0 -43
  243. solara/website/pages/documentation/api/hooks/use_effect.py +0 -9
  244. solara/website/pages/documentation/api/hooks/use_exception.py +0 -33
  245. solara/website/pages/documentation/api/hooks/use_memo.md +0 -16
  246. solara/website/pages/documentation/api/hooks/use_memo.py +0 -9
  247. solara/website/pages/documentation/api/hooks/use_previous.py +0 -32
  248. solara/website/pages/documentation/api/hooks/use_reactive.py +0 -15
  249. solara/website/pages/documentation/api/hooks/use_state.py +0 -11
  250. solara/website/pages/documentation/api/hooks/use_state_or_update.py +0 -68
  251. solara/website/pages/documentation/api/hooks/use_thread.md +0 -58
  252. solara/website/pages/documentation/api/hooks/use_thread.py +0 -44
  253. solara/website/pages/documentation/api/hooks/use_trait_observe.py +0 -13
  254. solara/website/pages/documentation/api/routing/__init__.py +0 -9
  255. solara/website/pages/documentation/api/routing/generate_routes.py +0 -11
  256. solara/website/pages/documentation/api/routing/generate_routes_directory.py +0 -11
  257. solara/website/pages/documentation/api/routing/resolve_path.py +0 -36
  258. solara/website/pages/documentation/api/routing/route.py +0 -32
  259. solara/website/pages/documentation/api/routing/use_route.py +0 -80
  260. solara/website/pages/documentation/api/routing/use_router.py +0 -15
  261. solara/website/pages/documentation/api/utilities/__init__.py +0 -9
  262. solara/website/pages/documentation/api/utilities/component_vue.py +0 -11
  263. solara/website/pages/documentation/api/utilities/computed.py +0 -16
  264. solara/website/pages/documentation/api/utilities/display.py +0 -15
  265. solara/website/pages/documentation/api/utilities/get_kernel_id.py +0 -16
  266. solara/website/pages/documentation/api/utilities/get_session_id.py +0 -16
  267. solara/website/pages/documentation/api/utilities/memoize.py +0 -36
  268. solara/website/pages/documentation/api/utilities/on_kernel_start.py +0 -27
  269. solara/website/pages/documentation/api/utilities/reactive.py +0 -15
  270. solara/website/pages/documentation/api/utilities/widget.py +0 -104
  271. solara/website/pages/documentation/components/__init__.py +0 -12
  272. solara/website/pages/documentation/components/advanced/__init__.py +0 -9
  273. solara/website/pages/documentation/components/advanced/link.py +0 -28
  274. solara/website/pages/documentation/components/advanced/meta.py +0 -21
  275. solara/website/pages/documentation/components/advanced/style.py +0 -44
  276. solara/website/pages/documentation/components/common.py +0 -9
  277. solara/website/pages/documentation/components/data/__init__.py +0 -9
  278. solara/website/pages/documentation/components/data/dataframe.py +0 -44
  279. solara/website/pages/documentation/components/data/pivot_table.py +0 -81
  280. solara/website/pages/documentation/components/enterprise/__init__.py +0 -9
  281. solara/website/pages/documentation/components/enterprise/avatar.py +0 -19
  282. solara/website/pages/documentation/components/enterprise/avatar_menu.py +0 -20
  283. solara/website/pages/documentation/components/input/__init__.py +0 -9
  284. solara/website/pages/documentation/components/input/button.py +0 -22
  285. solara/website/pages/documentation/components/input/checkbox.py +0 -12
  286. solara/website/pages/documentation/components/input/file_browser.py +0 -33
  287. solara/website/pages/documentation/components/input/file_drop.py +0 -75
  288. solara/website/pages/documentation/components/input/input.py +0 -18
  289. solara/website/pages/documentation/components/input/select.py +0 -21
  290. solara/website/pages/documentation/components/input/slider.py +0 -28
  291. solara/website/pages/documentation/components/input/switch.py +0 -12
  292. solara/website/pages/documentation/components/input/togglebuttons.py +0 -20
  293. solara/website/pages/documentation/components/lab/__init__.py +0 -9
  294. solara/website/pages/documentation/components/lab/chat.py +0 -108
  295. solara/website/pages/documentation/components/lab/confirmation_dialog.py +0 -55
  296. solara/website/pages/documentation/components/lab/cookies_headers.py +0 -48
  297. solara/website/pages/documentation/components/lab/input_date.py +0 -19
  298. solara/website/pages/documentation/components/lab/menu.py +0 -21
  299. solara/website/pages/documentation/components/lab/tab.py +0 -24
  300. solara/website/pages/documentation/components/lab/tabs.py +0 -44
  301. solara/website/pages/documentation/components/lab/task.py +0 -12
  302. solara/website/pages/documentation/components/lab/theming.py +0 -72
  303. solara/website/pages/documentation/components/lab/use_task.py +0 -12
  304. solara/website/pages/documentation/components/layout/__init__.py +0 -9
  305. solara/website/pages/documentation/components/layout/app_bar.py +0 -15
  306. solara/website/pages/documentation/components/layout/app_bar_title.py +0 -15
  307. solara/website/pages/documentation/components/layout/app_layout.py +0 -23
  308. solara/website/pages/documentation/components/layout/card.py +0 -14
  309. solara/website/pages/documentation/components/layout/card_actions.py +0 -15
  310. solara/website/pages/documentation/components/layout/column.py +0 -29
  311. solara/website/pages/documentation/components/layout/columns.py +0 -26
  312. solara/website/pages/documentation/components/layout/columns_responsive.py +0 -67
  313. solara/website/pages/documentation/components/layout/griddraggable.py +0 -61
  314. solara/website/pages/documentation/components/layout/gridfixed.py +0 -21
  315. solara/website/pages/documentation/components/layout/hbox.py +0 -17
  316. solara/website/pages/documentation/components/layout/row.py +0 -29
  317. solara/website/pages/documentation/components/layout/sidebar.py +0 -23
  318. solara/website/pages/documentation/components/layout/vbox.py +0 -19
  319. solara/website/pages/documentation/components/output/__init__.py +0 -9
  320. solara/website/pages/documentation/components/output/file_download.py +0 -12
  321. solara/website/pages/documentation/components/output/html.py +0 -22
  322. solara/website/pages/documentation/components/output/image.py +0 -12
  323. solara/website/pages/documentation/components/output/markdown.py +0 -59
  324. solara/website/pages/documentation/components/output/markdown_editor.py +0 -53
  325. solara/website/pages/documentation/components/output/sql_code.py +0 -84
  326. solara/website/pages/documentation/components/output/tooltip.py +0 -12
  327. solara/website/pages/documentation/components/page/__init__.py +0 -9
  328. solara/website/pages/documentation/components/page/head.py +0 -19
  329. solara/website/pages/documentation/components/page/title.py +0 -28
  330. solara/website/pages/documentation/components/status/__init__.py +0 -9
  331. solara/website/pages/documentation/components/status/error.py +0 -40
  332. solara/website/pages/documentation/components/status/info.py +0 -40
  333. solara/website/pages/documentation/components/status/progress.py +0 -10
  334. solara/website/pages/documentation/components/status/spinner.py +0 -10
  335. solara/website/pages/documentation/components/status/success.py +0 -40
  336. solara/website/pages/documentation/components/status/warning.py +0 -47
  337. solara/website/pages/documentation/components/viz/__init__.py +0 -9
  338. solara/website/pages/documentation/components/viz/altair.py +0 -44
  339. solara/website/pages/documentation/components/viz/echarts.py +0 -78
  340. solara/website/pages/documentation/components/viz/matplotlib.py +0 -32
  341. solara/website/pages/documentation/components/viz/plotly.py +0 -63
  342. solara/website/pages/documentation/components/viz/plotly_express.py +0 -41
  343. solara/website/pages/documentation/examples/__init__.py +0 -52
  344. solara/website/pages/documentation/examples/ai/__init__.py +0 -10
  345. solara/website/pages/documentation/examples/ai/chatbot.py +0 -96
  346. solara/website/pages/documentation/examples/ai/tokenizer.py +0 -106
  347. solara/website/pages/documentation/examples/basics/__init__.py +0 -2
  348. solara/website/pages/documentation/examples/basics/sine.py +0 -28
  349. solara/website/pages/documentation/examples/fullscreen/__init__.py +0 -9
  350. solara/website/pages/documentation/examples/fullscreen/authorization.py +0 -3
  351. solara/website/pages/documentation/examples/fullscreen/layout_demo.py +0 -3
  352. solara/website/pages/documentation/examples/fullscreen/multipage.py +0 -3
  353. solara/website/pages/documentation/examples/fullscreen/scatter.py +0 -3
  354. solara/website/pages/documentation/examples/fullscreen/scrolling.py +0 -3
  355. solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +0 -3
  356. solara/website/pages/documentation/examples/general/__init__.py +0 -9
  357. solara/website/pages/documentation/examples/general/custom_storage.py +0 -69
  358. solara/website/pages/documentation/examples/general/deploy_model.py +0 -114
  359. solara/website/pages/documentation/examples/general/live_update.py +0 -38
  360. solara/website/pages/documentation/examples/general/login_oauth.py +0 -76
  361. solara/website/pages/documentation/examples/general/mycard.vue +0 -58
  362. solara/website/pages/documentation/examples/general/pokemon_search.py +0 -51
  363. solara/website/pages/documentation/examples/general/vue_component.py +0 -50
  364. solara/website/pages/documentation/examples/ipycanvas.py +0 -49
  365. solara/website/pages/documentation/examples/libraries/__init__.py +0 -9
  366. solara/website/pages/documentation/examples/libraries/altair.py +0 -63
  367. solara/website/pages/documentation/examples/libraries/bqplot.py +0 -39
  368. solara/website/pages/documentation/examples/libraries/ipyleaflet.py +0 -32
  369. solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +0 -65
  370. solara/website/pages/documentation/examples/utilities/__init__.py +0 -9
  371. solara/website/pages/documentation/examples/utilities/calculator.py +0 -157
  372. solara/website/pages/documentation/examples/utilities/countdown_timer.py +0 -64
  373. solara/website/pages/documentation/examples/utilities/todo.py +0 -195
  374. solara/website/pages/documentation/examples/visualization/__init__.py +0 -6
  375. solara/website/pages/documentation/examples/visualization/annotator.py +0 -68
  376. solara/website/pages/documentation/examples/visualization/linked_views.py +0 -84
  377. solara/website/pages/documentation/examples/visualization/plotly.py +0 -43
  378. solara/website/pages/documentation/faq/__init__.py +0 -11
  379. solara/website/pages/documentation/faq/content/99-faq.md +0 -73
  380. solara/website/pages/documentation/getting_started/__init__.py +0 -15
  381. solara/website/pages/documentation/getting_started/content/00-quickstart.md +0 -84
  382. solara/website/pages/documentation/getting_started/content/01-introduction.md +0 -121
  383. solara/website/pages/documentation/getting_started/content/02-installing.md +0 -81
  384. solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +0 -9
  385. solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +0 -13
  386. solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +0 -84
  387. solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +0 -120
  388. solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +0 -141
  389. solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +0 -140
  390. solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +0 -64
  391. solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  392. solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +0 -445
  393. solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +0 -1000
  394. solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +0 -7
  395. solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +0 -218
  396. solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +0 -83
  397. solara/website/pages/documentation/getting_started/content/06-reference/00-overview.md +0 -3
  398. solara/website/pages/documentation/getting_started/content/06-reference/40-static_files.md +0 -27
  399. solara/website/pages/documentation/getting_started/content/06-reference/41-asset-files.md +0 -32
  400. solara/website/pages/documentation/getting_started/content/06-reference/60-static-site-generation.md +0 -55
  401. solara/website/pages/documentation/getting_started/content/06-reference/70-search.md +0 -30
  402. solara/website/pages/documentation/getting_started/content/06-reference/80-reloading.md +0 -30
  403. solara/website/pages/documentation/getting_started/content/06-reference/90-notebook-support.md +0 -4
  404. solara/website/pages/documentation/getting_started/content/06-reference/95-caching.md +0 -143
  405. solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +0 -3
  406. solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +0 -269
  407. solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +0 -76
  408. solara/website/pages/documentation/getting_started/content/08-lab/00-what-is-lab.md +0 -3
  409. solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +0 -22
  410. solara/website/pages/documentation/getting_started/content/__init__.py +0 -0
  411. solara/website/pages/docutils.py +0 -38
  412. solara/website/pages/showcase/__init__.py +0 -105
  413. solara/website/pages/showcase/domino_code_assist.py +0 -60
  414. solara/website/pages/showcase/planeto_tessa.py +0 -19
  415. solara/website/pages/showcase/solara_dev.py +0 -54
  416. solara/website/pages/showcase/solarathon_2023_team_2.py +0 -22
  417. solara/website/pages/showcase/solarathon_2023_team_4.py +0 -22
  418. solara/website/pages/showcase/solarathon_2023_team_5.py +0 -23
  419. solara/website/pages/showcase/solarathon_2023_team_6.py +0 -34
  420. solara/website/pages/showcase/wanderlust.py +0 -27
  421. solara/website/public/beach.jpeg +0 -0
  422. solara/website/public/logo.svg +0 -6
  423. solara/website/public/social/discord.svg +0 -1
  424. solara/website/public/social/github.svg +0 -1
  425. solara/website/public/social/twitter.svg +0 -3
  426. solara/website/public/success.html +0 -25
  427. solara/website/templates/index.html.j2 +0 -117
  428. solara/website/utils.py +0 -51
  429. solara/widgets/__init__.py +0 -1
  430. solara/widgets/vue/gridlayout.vue +0 -110
  431. solara/widgets/vue/html.vue +0 -4
  432. solara/widgets/vue/navigator.vue +0 -104
  433. solara/widgets/vue/vegalite.vue +0 -115
  434. solara/widgets/widgets.py +0 -65
  435. solara-1.30.0.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -7
  436. solara-1.30.0.data/data/etc/jupyter/jupyter_server_config.d/solara.json +0 -7
  437. solara-1.30.0.dist-info/RECORD +0 -438
  438. solara-1.30.0.dist-info/entry_points.txt +0 -5
  439. /solara-1.30.0.dist-info/licenses/LICENSE → /LICENSE +0 -0
@@ -1,393 +0,0 @@
1
- import asyncio
2
-
3
- try:
4
- import contextvars
5
- except ModuleNotFoundError:
6
- contextvars = None # type: ignore
7
-
8
- import dataclasses
9
- import enum
10
- import inspect
11
- import logging
12
- import os
13
- import pickle
14
- import threading
15
- import time
16
- import typing
17
- from pathlib import Path
18
- from types import FrameType, ModuleType
19
- from typing import Any, Callable, Dict, List, NamedTuple, Optional, cast
20
-
21
- import ipywidgets as widgets
22
- import reacton
23
- from ipywidgets import DOMWidget, Widget
24
-
25
- import solara.server.settings
26
- import solara.util
27
-
28
- from . import kernel, kernel_context, websocket
29
- from .kernel import Kernel, WebsocketStreamWrapper
30
-
31
- WebSocket = Any
32
- logger = logging.getLogger("solara.server.app")
33
-
34
-
35
- class Local(threading.local):
36
- kernel_context_stack: Optional[List[Optional["kernel_context.VirtualKernelContext"]]] = None
37
-
38
-
39
- local = Local()
40
-
41
-
42
- class PageStatus(enum.Enum):
43
- CONNECTED = "connected"
44
- DISCONNECTED = "disconnected"
45
- CLOSED = "closed"
46
-
47
-
48
- class _on_kernel_callback_entry(NamedTuple):
49
- callback: Callable[[], Optional[Callable[[], None]]]
50
- callpoint: Optional[Path]
51
- module: Optional[ModuleType]
52
- cleanup: Callable[[], None]
53
-
54
-
55
- _on_kernel_start_callbacks: List[_on_kernel_callback_entry] = []
56
-
57
-
58
- def _find_root_module_frame() -> Optional[FrameType]:
59
- # basically the module where the call stack origined from
60
- current_frame = inspect.currentframe()
61
- root_module_frame = None
62
-
63
- while current_frame is not None:
64
- if current_frame.f_code.co_name == "<module>":
65
- root_module_frame = current_frame
66
- break
67
- current_frame = current_frame.f_back
68
-
69
- return root_module_frame
70
-
71
-
72
- def on_kernel_start(f: Callable[[], Optional[Callable[[], None]]]) -> Callable[[], None]:
73
- root = _find_root_module_frame()
74
- path: Optional[Path] = None
75
- module: Optional[ModuleType] = None
76
- if root is not None:
77
- path_str = inspect.getsourcefile(root)
78
- module = inspect.getmodule(root)
79
- if path_str is not None:
80
- path = Path(path_str)
81
-
82
- def cleanup():
83
- return _on_kernel_start_callbacks.remove(kce)
84
-
85
- kce = _on_kernel_callback_entry(f, path, module, cleanup)
86
- _on_kernel_start_callbacks.append(kce)
87
- return cleanup
88
-
89
-
90
- @dataclasses.dataclass
91
- class VirtualKernelContext:
92
- id: str
93
- kernel: kernel.Kernel
94
- # we keep track of the session id to prevent kernel hijacking
95
- # to 'steal' a kernel, one would need to know the session id
96
- # *and* the kernel id
97
- session_id: str
98
- control_sockets: List[WebSocket] = dataclasses.field(default_factory=list)
99
- # this is the 'private' version of the normally global ipywidgets.Widgets.widget dict
100
- # see patch.py
101
- widgets: Dict[str, Widget] = dataclasses.field(default_factory=dict)
102
- # same, for ipyvue templates
103
- # see patch.py
104
- templates: Dict[str, Widget] = dataclasses.field(default_factory=dict)
105
- user_dicts: Dict[str, Dict] = dataclasses.field(default_factory=dict)
106
- # anything we need to attach to the context
107
- # e.g. for a react app the render context, so that we can store/restore the state
108
- app_object: Optional[Any] = None
109
- reload: Callable = lambda: None
110
- state: Any = None
111
- container: Optional[DOMWidget] = None
112
- # we track which pages are connected to implement kernel culling
113
- page_status: Dict[str, PageStatus] = dataclasses.field(default_factory=dict)
114
- # only used for testing
115
- _last_kernel_cull_task: "Optional[asyncio.Future[None]]" = None
116
- closed_event: threading.Event = dataclasses.field(default_factory=threading.Event)
117
- _on_close_callbacks: List[Callable[[], None]] = dataclasses.field(default_factory=list)
118
-
119
- def __post_init__(self):
120
- with self:
121
- for (f, *_) in _on_kernel_start_callbacks:
122
- cleanup = f()
123
- if cleanup:
124
- self.on_close(cleanup)
125
-
126
- def restart(self):
127
- # should we do this, or maybe close the context and create a new one?
128
- with self:
129
- for f in reversed(self._on_close_callbacks):
130
- f()
131
- self._on_close_callbacks.clear()
132
- self.__post_init__()
133
-
134
- def display(self, *args):
135
- print(args) # noqa
136
-
137
- def on_close(self, f: Callable[[], None]):
138
- self._on_close_callbacks.append(f)
139
-
140
- def __enter__(self):
141
- if local.kernel_context_stack is None:
142
- local.kernel_context_stack = []
143
- key = get_current_thread_key()
144
- local.kernel_context_stack.append(current_context.get(key, None))
145
- current_context[key] = self
146
-
147
- def __exit__(self, *args):
148
- key = get_current_thread_key()
149
- assert local.kernel_context_stack is not None
150
- current_context[key] = local.kernel_context_stack.pop()
151
-
152
- def close(self):
153
- logger.info("Shut down virtual kernel: %s", self.id)
154
- with self:
155
- for f in reversed(self._on_close_callbacks):
156
- f()
157
- with self:
158
- if self.app_object is not None:
159
- if isinstance(self.app_object, reacton.core._RenderContext):
160
- try:
161
- self.app_object.close()
162
- except Exception as e:
163
- logger.exception("Could not close render context: %s", e)
164
- # we want to continue, so we at least close all widgets
165
- widgets.Widget.close_all()
166
- # what if we reference each other
167
- # import gc
168
- # gc.collect()
169
- self.kernel.session.close()
170
- if self.id in contexts:
171
- del contexts[self.id]
172
- self.closed_event.set()
173
-
174
- def _state_reset(self):
175
- state_directory = Path(".") / "states"
176
- state_directory.mkdir(exist_ok=True)
177
- path = state_directory / f"{self.id}.pickle"
178
- path = path.absolute()
179
- try:
180
- path.unlink()
181
- except: # noqa
182
- pass
183
- del contexts[self.id]
184
- key = get_current_thread_key()
185
- del current_context[key]
186
-
187
- def state_save(self, state_directory: os.PathLike):
188
- path = Path(state_directory) / f"{self.id}.pickle"
189
- render_context = self.app_object
190
- if render_context is not None:
191
- render_context = cast(reacton.core._RenderContext, render_context)
192
- state = render_context.state_get()
193
- with path.open("wb") as f:
194
- logger.debug("State: %r", state)
195
- pickle.dump(state, f)
196
-
197
- def page_connect(self, page_id: str):
198
- logger.info("Connect page %s for kernel %s", page_id, self.id)
199
- assert self.page_status.get(page_id) != PageStatus.CLOSED, "cannot connect with the same page_id after a close"
200
- self.page_status[page_id] = PageStatus.CONNECTED
201
- if self._last_kernel_cull_task:
202
- self._last_kernel_cull_task.cancel()
203
-
204
- def page_disconnect(self, page_id: str) -> "asyncio.Future[None]":
205
- """Signal that a page has disconnected, and schedule a kernel cull if needed.
206
-
207
- During the kernel reconnect window, we will keep the kernel alive, even if all pages have disconnected.
208
-
209
- Returns a future that is set when the kernel cull is done.
210
- The scheduled kernel cull can be cancelled when a new page connects, a new disconnect is scheduled,
211
- or a page if explicitly closed.
212
- """
213
- logger.info("Disconnect page %s for kernel %s", page_id, self.id)
214
- future: "asyncio.Future[None]" = asyncio.Future()
215
- self.page_status[page_id] = PageStatus.DISCONNECTED
216
- current_event_loop = asyncio.get_event_loop()
217
-
218
- async def kernel_cull():
219
- try:
220
- cull_timeout_sleep_seconds = solara.util.parse_timedelta(solara.server.settings.kernel.cull_timeout)
221
- logger.info("Scheduling kernel cull, will wait for max %s before shutting down the virtual kernel %s", cull_timeout_sleep_seconds, self.id)
222
- await asyncio.sleep(cull_timeout_sleep_seconds)
223
- has_connected_pages = PageStatus.CONNECTED in self.page_status.values()
224
- if has_connected_pages:
225
- logger.info("We have (re)connected pages, keeping the virtual kernel %s alive", self.id)
226
- else:
227
- logger.info("No connected pages, and timeout reached, shutting down virtual kernel %s", self.id)
228
- self.close()
229
- current_event_loop.call_soon_threadsafe(future.set_result, None)
230
- except asyncio.CancelledError:
231
- current_event_loop.call_soon_threadsafe(future.cancel, "cancelled because a new cull task was scheduled")
232
- raise
233
-
234
- has_connected_pages = PageStatus.CONNECTED in self.page_status.values()
235
- if not has_connected_pages:
236
- # when we have no connected pages, we will schedule a kernel cull
237
- if self._last_kernel_cull_task:
238
- self._last_kernel_cull_task.cancel()
239
-
240
- async def create_task():
241
- task = asyncio.create_task(kernel_cull())
242
- # create a reference to the task so we can cancel it later
243
- self._last_kernel_cull_task = task
244
- await task
245
-
246
- asyncio.run_coroutine_threadsafe(create_task(), keep_alive_event_loop)
247
- else:
248
- future.set_result(None)
249
- return future
250
-
251
- def page_close(self, page_id: str):
252
- """Signal that a page has closed, and close the context if needed.
253
-
254
- Closing the browser tab or a page navigation means an explicit close, which is
255
- different from a websocket/page disconnect, which we might want to recover from.
256
-
257
- """
258
- self.page_status[page_id] = PageStatus.CLOSED
259
- logger.info("Close page %s for kernel %s", page_id, self.id)
260
- has_connected_pages = PageStatus.CONNECTED in self.page_status.values()
261
- has_disconnected_pages = PageStatus.DISCONNECTED in self.page_status.values()
262
- if not (has_connected_pages or has_disconnected_pages):
263
- logger.info("No connected or disconnected pages, shutting down virtual kernel %s", self.id)
264
- if self._last_kernel_cull_task:
265
- self._last_kernel_cull_task.cancel()
266
- self.close()
267
-
268
-
269
- try:
270
- # Normal Python
271
- keep_alive_event_loop = asyncio.new_event_loop()
272
-
273
- def _run():
274
- asyncio.set_event_loop(keep_alive_event_loop)
275
- try:
276
- keep_alive_event_loop.run_forever()
277
- except Exception:
278
- logger.exception("Error in keep alive event loop")
279
- raise
280
-
281
- threading.Thread(target=_run, daemon=True).start()
282
- except RuntimeError:
283
- # Emscripten/pyodide/lite
284
- keep_alive_event_loop = asyncio.get_event_loop()
285
-
286
- contexts: Dict[str, VirtualKernelContext] = {}
287
- # maps from thread key to VirtualKernelContext, if VirtualKernelContext is None, it exists, but is not set as current
288
- current_context: Dict[str, Optional[VirtualKernelContext]] = {}
289
-
290
-
291
- def create_dummy_context():
292
- from . import kernel
293
-
294
- kernel_context = VirtualKernelContext(
295
- id="dummy",
296
- session_id="dummy",
297
- kernel=kernel.Kernel(),
298
- )
299
- return kernel_context
300
-
301
-
302
- if contextvars is not None:
303
- if typing.TYPE_CHECKING:
304
- async_context_id = contextvars.ContextVar[str]("async_context_id")
305
- else:
306
- async_context_id = contextvars.ContextVar("async_context_id")
307
- async_context_id.set("default")
308
- else:
309
- async_context_id = None
310
-
311
-
312
- def get_current_thread_key() -> str:
313
- if not solara.server.settings.kernel.threaded:
314
- if async_context_id is not None:
315
- try:
316
- key = async_context_id.get()
317
- except LookupError:
318
- raise RuntimeError("no kernel context set")
319
- else:
320
- raise RuntimeError("No threading support, and no contextvars support (Python 3.6 is not supported for this)")
321
- else:
322
- thread = threading.current_thread()
323
- key = get_thread_key(thread)
324
- return key
325
-
326
-
327
- def get_thread_key(thread: threading.Thread) -> str:
328
- if not solara.server.settings.kernel.threaded:
329
- if async_context_id is not None:
330
- return async_context_id.get()
331
- thread_key = thread._name + str(thread._ident) # type: ignore
332
- return thread_key
333
-
334
-
335
- def set_context_for_thread(context: VirtualKernelContext, thread: threading.Thread):
336
- key = get_thread_key(thread)
337
- current_context[key] = context
338
-
339
-
340
- def has_current_context() -> bool:
341
- thread_key = get_current_thread_key()
342
- return (thread_key in current_context) and (current_context[thread_key] is not None)
343
-
344
-
345
- def get_current_context() -> VirtualKernelContext:
346
- thread_key = get_current_thread_key()
347
- if thread_key not in current_context:
348
- raise RuntimeError(
349
- f"Tried to get the current context for thread {thread_key}, but no known context found. This might be a bug in Solara. "
350
- f"(known contexts: {list(current_context.keys())}"
351
- )
352
- context = current_context[thread_key]
353
- if context is None:
354
- raise RuntimeError(
355
- f"Tried to get the current context for thread {thread_key!r}, although the context is know, it was not set for this thread. "
356
- + "This might be a bug in Solara."
357
- )
358
- return context
359
-
360
-
361
- def set_current_context(context: Optional[VirtualKernelContext]):
362
- thread_key = get_current_thread_key()
363
- current_context[thread_key] = context
364
-
365
-
366
- def initialize_virtual_kernel(session_id: str, kernel_id: str, websocket: websocket.WebsocketWrapper):
367
- from solara.server import app as appmodule
368
-
369
- if kernel_id in contexts:
370
- logger.info("reusing virtual kernel: %s", kernel_id)
371
- context = contexts[kernel_id]
372
- if context.session_id != session_id:
373
- logger.critical("Session id mismatch when reusing kernel (hack attempt?): %s != %s", context.session_id, session_id)
374
- websocket.send_text("Session id mismatch when reusing kernel (hack attempt?)")
375
- # to avoid very fast reconnects (we are in a thread anyway)
376
- time.sleep(0.5)
377
- raise ValueError("Session id mismatch")
378
- kernel = context.kernel
379
- else:
380
- kernel = Kernel()
381
- logger.info("new virtual kernel: %s", kernel_id)
382
- context = contexts[kernel_id] = VirtualKernelContext(id=kernel_id, session_id=session_id, kernel=kernel, control_sockets=[], widgets={}, templates={})
383
-
384
- with context:
385
- widgets.register_comm_target(kernel)
386
- appmodule.register_solara_comm_target(kernel)
387
- with context:
388
- assert has_current_context()
389
- assert kernel is Kernel.instance()
390
- kernel.shell_stream = WebsocketStreamWrapper(websocket, "shell")
391
- kernel.control_stream = WebsocketStreamWrapper(websocket, "control")
392
- kernel.session.websockets.add(websocket)
393
- return context