solara 1.30.1__py2.py3-none-any.whl → 1.32.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 (438) hide show
  1. {solara-1.30.1.dist-info → solara-1.32.0.dist-info}/METADATA +12 -42
  2. solara-1.32.0.dist-info/RECORD +5 -0
  3. {solara-1.30.1.dist-info → solara-1.32.0.dist-info}/WHEEL +1 -1
  4. {solara/template/portal → solara-1.32.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 -545
  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 -110
  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 -88
  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 -396
  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/markdown.py +0 -30
  187. solara/website/components/notebook.py +0 -172
  188. solara/website/pages/__init__.py +0 -575
  189. solara/website/pages/apps/__init__.py +0 -16
  190. solara/website/pages/apps/authorization/__init__.py +0 -118
  191. solara/website/pages/apps/authorization/admin.py +0 -12
  192. solara/website/pages/apps/authorization/users.py +0 -12
  193. solara/website/pages/apps/jupyter-dashboard-1.py +0 -116
  194. solara/website/pages/apps/layout-demo.py +0 -40
  195. solara/website/pages/apps/multipage/__init__.py +0 -38
  196. solara/website/pages/apps/multipage/page1.py +0 -26
  197. solara/website/pages/apps/multipage/page2.py +0 -34
  198. solara/website/pages/apps/scatter.py +0 -136
  199. solara/website/pages/apps/scrolling.py +0 -63
  200. solara/website/pages/apps/tutorial-streamlit.py +0 -18
  201. solara/website/pages/changelog/__init__.py +0 -8
  202. solara/website/pages/changelog/changelog.md +0 -195
  203. solara/website/pages/contact/__init__.py +0 -8
  204. solara/website/pages/contact/contact.md +0 -17
  205. solara/website/pages/doc_use_download.py +0 -85
  206. solara/website/pages/documentation/__init__.py +0 -184
  207. solara/website/pages/documentation/advanced/__init__.py +0 -9
  208. solara/website/pages/documentation/advanced/content/00-overview.md +0 -1
  209. solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +0 -6
  210. solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +0 -196
  211. solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +0 -125
  212. solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +0 -154
  213. solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +0 -69
  214. solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +0 -49
  215. solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +0 -124
  216. solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +0 -10
  217. solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +0 -35
  218. solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +0 -42
  219. solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +0 -28
  220. solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +0 -108
  221. solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +0 -23
  222. solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +0 -7
  223. solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +0 -166
  224. solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +0 -18
  225. solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +0 -240
  226. solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +0 -86
  227. solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +0 -12
  228. solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +0 -1
  229. solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +0 -171
  230. solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  231. solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +0 -45
  232. solara/website/pages/documentation/advanced/content/40-development/10-setup.md +0 -76
  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 -12
  379. solara/website/pages/documentation/faq/content/99-faq.md +0 -76
  380. solara/website/pages/documentation/getting_started/__init__.py +0 -9
  381. solara/website/pages/documentation/getting_started/content/00-quickstart.md +0 -89
  382. solara/website/pages/documentation/getting_started/content/01-introduction.md +0 -125
  383. solara/website/pages/documentation/getting_started/content/02-installing.md +0 -85
  384. solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +0 -14
  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 -89
  387. solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +0 -124
  388. solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +0 -146
  389. solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +0 -144
  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 -11
  395. solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +0 -223
  396. solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +0 -88
  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 -31
  399. solara/website/pages/documentation/getting_started/content/06-reference/41-asset-files.md +0 -36
  400. solara/website/pages/documentation/getting_started/content/06-reference/60-static-site-generation.md +0 -59
  401. solara/website/pages/documentation/getting_started/content/06-reference/70-search.md +0 -34
  402. solara/website/pages/documentation/getting_started/content/06-reference/80-reloading.md +0 -34
  403. solara/website/pages/documentation/getting_started/content/06-reference/90-notebook-support.md +0 -7
  404. solara/website/pages/documentation/getting_started/content/06-reference/95-caching.md +0 -148
  405. solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +0 -7
  406. solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +0 -273
  407. solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +0 -80
  408. solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +0 -7
  409. solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +0 -26
  410. solara/website/pages/docutils.py +0 -38
  411. solara/website/pages/showcase/__init__.py +0 -105
  412. solara/website/pages/showcase/domino_code_assist.py +0 -60
  413. solara/website/pages/showcase/planeto_tessa.py +0 -19
  414. solara/website/pages/showcase/solara_dev.py +0 -54
  415. solara/website/pages/showcase/solarathon_2023_team_2.py +0 -22
  416. solara/website/pages/showcase/solarathon_2023_team_4.py +0 -22
  417. solara/website/pages/showcase/solarathon_2023_team_5.py +0 -23
  418. solara/website/pages/showcase/solarathon_2023_team_6.py +0 -34
  419. solara/website/pages/showcase/wanderlust.py +0 -27
  420. solara/website/public/beach.jpeg +0 -0
  421. solara/website/public/logo.svg +0 -6
  422. solara/website/public/social/discord.svg +0 -1
  423. solara/website/public/social/github.svg +0 -1
  424. solara/website/public/social/twitter.svg +0 -3
  425. solara/website/public/success.html +0 -25
  426. solara/website/templates/index.html.j2 +0 -117
  427. solara/website/utils.py +0 -51
  428. solara/widgets/__init__.py +0 -1
  429. solara/widgets/vue/gridlayout.vue +0 -110
  430. solara/widgets/vue/html.vue +0 -4
  431. solara/widgets/vue/navigator.vue +0 -104
  432. solara/widgets/vue/vegalite.vue +0 -115
  433. solara/widgets/widgets.py +0 -65
  434. solara-1.30.1.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -7
  435. solara-1.30.1.data/data/etc/jupyter/jupyter_server_config.d/solara.json +0 -7
  436. solara-1.30.1.dist-info/RECORD +0 -437
  437. solara-1.30.1.dist-info/entry_points.txt +0 -5
  438. /solara-1.30.1.dist-info/licenses/LICENSE → /LICENSE +0 -0
@@ -1,396 +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
- if self.closed_event.is_set():
154
- logger.error("Tried to close a kernel context that is already closed: %s", self.id)
155
- return
156
- logger.info("Shut down virtual kernel: %s", self.id)
157
- with self:
158
- for f in reversed(self._on_close_callbacks):
159
- f()
160
- with self:
161
- if self.app_object is not None:
162
- if isinstance(self.app_object, reacton.core._RenderContext):
163
- try:
164
- self.app_object.close()
165
- except Exception as e:
166
- logger.exception("Could not close render context: %s", e)
167
- # we want to continue, so we at least close all widgets
168
- widgets.Widget.close_all()
169
- # what if we reference each other
170
- # import gc
171
- # gc.collect()
172
- self.kernel.session.close()
173
- if self.id in contexts:
174
- del contexts[self.id]
175
- self.closed_event.set()
176
-
177
- def _state_reset(self):
178
- state_directory = Path(".") / "states"
179
- state_directory.mkdir(exist_ok=True)
180
- path = state_directory / f"{self.id}.pickle"
181
- path = path.absolute()
182
- try:
183
- path.unlink()
184
- except: # noqa
185
- pass
186
- del contexts[self.id]
187
- key = get_current_thread_key()
188
- del current_context[key]
189
-
190
- def state_save(self, state_directory: os.PathLike):
191
- path = Path(state_directory) / f"{self.id}.pickle"
192
- render_context = self.app_object
193
- if render_context is not None:
194
- render_context = cast(reacton.core._RenderContext, render_context)
195
- state = render_context.state_get()
196
- with path.open("wb") as f:
197
- logger.debug("State: %r", state)
198
- pickle.dump(state, f)
199
-
200
- def page_connect(self, page_id: str):
201
- logger.info("Connect page %s for kernel %s", page_id, self.id)
202
- assert self.page_status.get(page_id) != PageStatus.CLOSED, "cannot connect with the same page_id after a close"
203
- self.page_status[page_id] = PageStatus.CONNECTED
204
- if self._last_kernel_cull_task:
205
- self._last_kernel_cull_task.cancel()
206
-
207
- def page_disconnect(self, page_id: str) -> "asyncio.Future[None]":
208
- """Signal that a page has disconnected, and schedule a kernel cull if needed.
209
-
210
- During the kernel reconnect window, we will keep the kernel alive, even if all pages have disconnected.
211
-
212
- Returns a future that is set when the kernel cull is done.
213
- The scheduled kernel cull can be cancelled when a new page connects, a new disconnect is scheduled,
214
- or a page if explicitly closed.
215
- """
216
- logger.info("Disconnect page %s for kernel %s", page_id, self.id)
217
- future: "asyncio.Future[None]" = asyncio.Future()
218
- self.page_status[page_id] = PageStatus.DISCONNECTED
219
- current_event_loop = asyncio.get_event_loop()
220
-
221
- async def kernel_cull():
222
- try:
223
- cull_timeout_sleep_seconds = solara.util.parse_timedelta(solara.server.settings.kernel.cull_timeout)
224
- logger.info("Scheduling kernel cull, will wait for max %s before shutting down the virtual kernel %s", cull_timeout_sleep_seconds, self.id)
225
- await asyncio.sleep(cull_timeout_sleep_seconds)
226
- has_connected_pages = PageStatus.CONNECTED in self.page_status.values()
227
- if has_connected_pages:
228
- logger.info("We have (re)connected pages, keeping the virtual kernel %s alive", self.id)
229
- else:
230
- logger.info("No connected pages, and timeout reached, shutting down virtual kernel %s", self.id)
231
- self.close()
232
- current_event_loop.call_soon_threadsafe(future.set_result, None)
233
- except asyncio.CancelledError:
234
- current_event_loop.call_soon_threadsafe(future.cancel, "cancelled because a new cull task was scheduled")
235
- raise
236
-
237
- has_connected_pages = PageStatus.CONNECTED in self.page_status.values()
238
- if not has_connected_pages:
239
- # when we have no connected pages, we will schedule a kernel cull
240
- if self._last_kernel_cull_task:
241
- self._last_kernel_cull_task.cancel()
242
-
243
- async def create_task():
244
- task = asyncio.create_task(kernel_cull())
245
- # create a reference to the task so we can cancel it later
246
- self._last_kernel_cull_task = task
247
- await task
248
-
249
- asyncio.run_coroutine_threadsafe(create_task(), keep_alive_event_loop)
250
- else:
251
- future.set_result(None)
252
- return future
253
-
254
- def page_close(self, page_id: str):
255
- """Signal that a page has closed, and close the context if needed.
256
-
257
- Closing the browser tab or a page navigation means an explicit close, which is
258
- different from a websocket/page disconnect, which we might want to recover from.
259
-
260
- """
261
- self.page_status[page_id] = PageStatus.CLOSED
262
- logger.info("Close page %s for kernel %s", page_id, self.id)
263
- has_connected_pages = PageStatus.CONNECTED in self.page_status.values()
264
- has_disconnected_pages = PageStatus.DISCONNECTED in self.page_status.values()
265
- if not (has_connected_pages or has_disconnected_pages):
266
- logger.info("No connected or disconnected pages, shutting down virtual kernel %s", self.id)
267
- if self._last_kernel_cull_task:
268
- self._last_kernel_cull_task.cancel()
269
- self.close()
270
-
271
-
272
- try:
273
- # Normal Python
274
- keep_alive_event_loop = asyncio.new_event_loop()
275
-
276
- def _run():
277
- asyncio.set_event_loop(keep_alive_event_loop)
278
- try:
279
- keep_alive_event_loop.run_forever()
280
- except Exception:
281
- logger.exception("Error in keep alive event loop")
282
- raise
283
-
284
- threading.Thread(target=_run, daemon=True).start()
285
- except RuntimeError:
286
- # Emscripten/pyodide/lite
287
- keep_alive_event_loop = asyncio.get_event_loop()
288
-
289
- contexts: Dict[str, VirtualKernelContext] = {}
290
- # maps from thread key to VirtualKernelContext, if VirtualKernelContext is None, it exists, but is not set as current
291
- current_context: Dict[str, Optional[VirtualKernelContext]] = {}
292
-
293
-
294
- def create_dummy_context():
295
- from . import kernel
296
-
297
- kernel_context = VirtualKernelContext(
298
- id="dummy",
299
- session_id="dummy",
300
- kernel=kernel.Kernel(),
301
- )
302
- return kernel_context
303
-
304
-
305
- if contextvars is not None:
306
- if typing.TYPE_CHECKING:
307
- async_context_id = contextvars.ContextVar[str]("async_context_id")
308
- else:
309
- async_context_id = contextvars.ContextVar("async_context_id")
310
- async_context_id.set("default")
311
- else:
312
- async_context_id = None
313
-
314
-
315
- def get_current_thread_key() -> str:
316
- if not solara.server.settings.kernel.threaded:
317
- if async_context_id is not None:
318
- try:
319
- key = async_context_id.get()
320
- except LookupError:
321
- raise RuntimeError("no kernel context set")
322
- else:
323
- raise RuntimeError("No threading support, and no contextvars support (Python 3.6 is not supported for this)")
324
- else:
325
- thread = threading.current_thread()
326
- key = get_thread_key(thread)
327
- return key
328
-
329
-
330
- def get_thread_key(thread: threading.Thread) -> str:
331
- if not solara.server.settings.kernel.threaded:
332
- if async_context_id is not None:
333
- return async_context_id.get()
334
- thread_key = thread._name + str(thread._ident) # type: ignore
335
- return thread_key
336
-
337
-
338
- def set_context_for_thread(context: VirtualKernelContext, thread: threading.Thread):
339
- key = get_thread_key(thread)
340
- current_context[key] = context
341
-
342
-
343
- def has_current_context() -> bool:
344
- thread_key = get_current_thread_key()
345
- return (thread_key in current_context) and (current_context[thread_key] is not None)
346
-
347
-
348
- def get_current_context() -> VirtualKernelContext:
349
- thread_key = get_current_thread_key()
350
- if thread_key not in current_context:
351
- raise RuntimeError(
352
- f"Tried to get the current context for thread {thread_key}, but no known context found. This might be a bug in Solara. "
353
- f"(known contexts: {list(current_context.keys())}"
354
- )
355
- context = current_context[thread_key]
356
- if context is None:
357
- raise RuntimeError(
358
- f"Tried to get the current context for thread {thread_key!r}, although the context is know, it was not set for this thread. "
359
- + "This might be a bug in Solara."
360
- )
361
- return context
362
-
363
-
364
- def set_current_context(context: Optional[VirtualKernelContext]):
365
- thread_key = get_current_thread_key()
366
- current_context[thread_key] = context
367
-
368
-
369
- def initialize_virtual_kernel(session_id: str, kernel_id: str, websocket: websocket.WebsocketWrapper):
370
- from solara.server import app as appmodule
371
-
372
- if kernel_id in contexts:
373
- logger.info("reusing virtual kernel: %s", kernel_id)
374
- context = contexts[kernel_id]
375
- if context.session_id != session_id:
376
- logger.critical("Session id mismatch when reusing kernel (hack attempt?): %s != %s", context.session_id, session_id)
377
- websocket.send_text("Session id mismatch when reusing kernel (hack attempt?)")
378
- # to avoid very fast reconnects (we are in a thread anyway)
379
- time.sleep(0.5)
380
- raise ValueError("Session id mismatch")
381
- kernel = context.kernel
382
- else:
383
- kernel = Kernel()
384
- logger.info("new virtual kernel: %s", kernel_id)
385
- context = contexts[kernel_id] = VirtualKernelContext(id=kernel_id, session_id=session_id, kernel=kernel, control_sockets=[], widgets={}, templates={})
386
-
387
- with context:
388
- widgets.register_comm_target(kernel)
389
- appmodule.register_solara_comm_target(kernel)
390
- with context:
391
- assert has_current_context()
392
- assert kernel is Kernel.instance()
393
- kernel.shell_stream = WebsocketStreamWrapper(websocket, "shell")
394
- kernel.control_stream = WebsocketStreamWrapper(websocket, "control")
395
- kernel.session.websockets.add(websocket)
396
- return context