solara-ui 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. prefix/etc/jupyter/jupyter_notebook_config.d/solara.json +7 -0
  2. prefix/etc/jupyter/jupyter_server_config.d/solara.json +7 -0
  3. solara/__init__.py +124 -0
  4. solara/__main__.py +734 -0
  5. solara/alias.py +6 -0
  6. solara/autorouting.py +546 -0
  7. solara/cache.py +303 -0
  8. solara/checks.html +71 -0
  9. solara/checks.py +224 -0
  10. solara/comm.py +28 -0
  11. solara/components/__init__.py +59 -0
  12. solara/components/alert.py +155 -0
  13. solara/components/applayout.py +393 -0
  14. solara/components/button.py +85 -0
  15. solara/components/card.py +87 -0
  16. solara/components/checkbox.py +50 -0
  17. solara/components/code_highlight_css.py +11 -0
  18. solara/components/code_highlight_css.vue +63 -0
  19. solara/components/columns.py +159 -0
  20. solara/components/component_vue.py +110 -0
  21. solara/components/cross_filter.py +335 -0
  22. solara/components/dataframe.py +546 -0
  23. solara/components/datatable.py +221 -0
  24. solara/components/datatable.vue +175 -0
  25. solara/components/details.py +21 -0
  26. solara/components/download.vue +35 -0
  27. solara/components/echarts.py +75 -0
  28. solara/components/echarts.vue +128 -0
  29. solara/components/figure_altair.py +39 -0
  30. solara/components/file_browser.py +182 -0
  31. solara/components/file_download.py +199 -0
  32. solara/components/file_drop.py +139 -0
  33. solara/components/file_drop.vue +83 -0
  34. solara/components/file_list_widget.vue +78 -0
  35. solara/components/head.py +27 -0
  36. solara/components/head_tag.py +49 -0
  37. solara/components/head_tag.vue +60 -0
  38. solara/components/image.py +173 -0
  39. solara/components/input.py +436 -0
  40. solara/components/link.py +55 -0
  41. solara/components/markdown.py +378 -0
  42. solara/components/markdown_editor.py +25 -0
  43. solara/components/markdown_editor.vue +362 -0
  44. solara/components/matplotlib.py +74 -0
  45. solara/components/meta.py +47 -0
  46. solara/components/misc.py +333 -0
  47. solara/components/pivot_table.py +258 -0
  48. solara/components/pivot_table.vue +158 -0
  49. solara/components/progress.py +47 -0
  50. solara/components/select.py +182 -0
  51. solara/components/select.vue +27 -0
  52. solara/components/slider.py +442 -0
  53. solara/components/slider_date.vue +56 -0
  54. solara/components/spinner-solara.vue +105 -0
  55. solara/components/spinner.py +30 -0
  56. solara/components/sql_code.py +33 -0
  57. solara/components/sql_code.vue +128 -0
  58. solara/components/style.py +105 -0
  59. solara/components/switch.py +68 -0
  60. solara/components/tab_navigation.py +37 -0
  61. solara/components/title.py +90 -0
  62. solara/components/title.vue +38 -0
  63. solara/components/togglebuttons.py +200 -0
  64. solara/components/tooltip.py +61 -0
  65. solara/datatypes.py +143 -0
  66. solara/express.py +241 -0
  67. solara/hooks/__init__.py +4 -0
  68. solara/hooks/dataframe.py +99 -0
  69. solara/hooks/misc.py +263 -0
  70. solara/hooks/use_reactive.py +129 -0
  71. solara/hooks/use_thread.py +129 -0
  72. solara/kitchensink.py +8 -0
  73. solara/lab/__init__.py +34 -0
  74. solara/lab/components/__init__.py +6 -0
  75. solara/lab/components/chat.py +203 -0
  76. solara/lab/components/confirmation_dialog.py +163 -0
  77. solara/lab/components/cross_filter.py +7 -0
  78. solara/lab/components/input_date.py +298 -0
  79. solara/lab/components/menu.py +181 -0
  80. solara/lab/components/menu.vue +38 -0
  81. solara/lab/components/tabs.py +274 -0
  82. solara/lab/components/theming.py +98 -0
  83. solara/lab/components/theming.vue +72 -0
  84. solara/lab/hooks/__init__.py +0 -0
  85. solara/lab/hooks/dataframe.py +12 -0
  86. solara/lab/toestand.py +3 -0
  87. solara/lab/utils/__init__.py +2 -0
  88. solara/lab/utils/cookies.py +5 -0
  89. solara/lab/utils/dataframe.py +115 -0
  90. solara/lab/utils/headers.py +5 -0
  91. solara/layout.py +44 -0
  92. solara/lifecycle.py +46 -0
  93. solara/minisettings.py +133 -0
  94. solara/py.typed +0 -0
  95. solara/reactive.py +93 -0
  96. solara/routing.py +268 -0
  97. solara/scope/__init__.py +88 -0
  98. solara/scope/types.py +55 -0
  99. solara/server/__init__.py +0 -0
  100. solara/server/app.py +491 -0
  101. solara/server/assets/custom.css +1 -0
  102. solara/server/assets/custom.js +1 -0
  103. solara/server/assets/favicon.png +0 -0
  104. solara/server/assets/favicon.svg +5 -0
  105. solara/server/assets/style.css +1665 -0
  106. solara/server/assets/theme-dark.css +437 -0
  107. solara/server/assets/theme-light.css +420 -0
  108. solara/server/assets/theme.js +3 -0
  109. solara/server/cdn_helper.py +77 -0
  110. solara/server/esm.py +69 -0
  111. solara/server/fastapi.py +5 -0
  112. solara/server/flask.py +286 -0
  113. solara/server/jupyter/__init__.py +2 -0
  114. solara/server/jupyter/cdn_handler.py +28 -0
  115. solara/server/jupyter/server_extension.py +29 -0
  116. solara/server/jupytertools.py +46 -0
  117. solara/server/kernel.py +338 -0
  118. solara/server/kernel_context.py +357 -0
  119. solara/server/patch.py +552 -0
  120. solara/server/reload.py +242 -0
  121. solara/server/server.py +456 -0
  122. solara/server/settings.py +215 -0
  123. solara/server/shell.py +251 -0
  124. solara/server/starlette.py +601 -0
  125. solara/server/static/ansi.js +270 -0
  126. solara/server/static/highlight-dark.css +82 -0
  127. solara/server/static/highlight.css +43 -0
  128. solara/server/static/main-vuetify.js +260 -0
  129. solara/server/static/main.js +163 -0
  130. solara/server/static/solara_bootstrap.py +129 -0
  131. solara/server/static/sun.svg +23 -0
  132. solara/server/static/webworker.js +42 -0
  133. solara/server/telemetry.py +212 -0
  134. solara/server/templates/index.html.j2 +1 -0
  135. solara/server/templates/loader-plain.css +11 -0
  136. solara/server/templates/loader-plain.html +20 -0
  137. solara/server/templates/loader-solara.css +111 -0
  138. solara/server/templates/loader-solara.html +40 -0
  139. solara/server/templates/plain.html +82 -0
  140. solara/server/templates/solara.html.j2 +446 -0
  141. solara/server/threaded.py +75 -0
  142. solara/server/utils.py +30 -0
  143. solara/server/websocket.py +45 -0
  144. solara/settings.py +56 -0
  145. solara/tasks.py +837 -0
  146. solara/template/button.py +16 -0
  147. solara/template/markdown.py +42 -0
  148. solara/template/portal/.flake8 +6 -0
  149. solara/template/portal/.pre-commit-config.yaml +28 -0
  150. solara/template/portal/LICENSE +21 -0
  151. solara/template/portal/Procfile +7 -0
  152. solara/template/portal/mypy.ini +3 -0
  153. solara/template/portal/pyproject.toml +26 -0
  154. solara/template/portal/solara_portal/__init__.py +4 -0
  155. solara/template/portal/solara_portal/components/__init__.py +2 -0
  156. solara/template/portal/solara_portal/components/article.py +28 -0
  157. solara/template/portal/solara_portal/components/data.py +28 -0
  158. solara/template/portal/solara_portal/components/header.py +6 -0
  159. solara/template/portal/solara_portal/components/layout.py +6 -0
  160. solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +85 -0
  161. solara/template/portal/solara_portal/content/articles/substiterat-vati.md +70 -0
  162. solara/template/portal/solara_portal/data.py +60 -0
  163. solara/template/portal/solara_portal/pages/__init__.py +67 -0
  164. solara/template/portal/solara_portal/pages/article/__init__.py +26 -0
  165. solara/template/portal/solara_portal/pages/tabular.py +29 -0
  166. solara/template/portal/solara_portal/pages/viz/__init__.py +70 -0
  167. solara/template/portal/solara_portal/pages/viz/overview.py +14 -0
  168. solara/test/__init__.py +0 -0
  169. solara/test/pytest_plugin.py +697 -0
  170. solara/toestand.py +772 -0
  171. solara/util.py +308 -0
  172. solara/website/__init__.py +0 -0
  173. solara/website/assets/custom.css +468 -0
  174. solara/website/assets/images/logo-small.png +0 -0
  175. solara/website/assets/images/logo.svg +17 -0
  176. solara/website/assets/images/logo_white.svg +50 -0
  177. solara/website/assets/theme.js +8 -0
  178. solara/website/components/__init__.py +5 -0
  179. solara/website/components/algolia.vue +24 -0
  180. solara/website/components/algolia_api.vue +187 -0
  181. solara/website/components/docs.py +118 -0
  182. solara/website/components/header.py +72 -0
  183. solara/website/components/hero.py +15 -0
  184. solara/website/components/mailchimp.py +12 -0
  185. solara/website/components/mailchimp.vue +47 -0
  186. solara/website/components/markdown.py +30 -0
  187. solara/website/components/notebook.py +171 -0
  188. solara/website/pages/__init__.py +575 -0
  189. solara/website/pages/apps/__init__.py +16 -0
  190. solara/website/pages/apps/authorization/__init__.py +119 -0
  191. solara/website/pages/apps/authorization/admin.py +12 -0
  192. solara/website/pages/apps/authorization/users.py +12 -0
  193. solara/website/pages/apps/jupyter-dashboard-1.py +116 -0
  194. solara/website/pages/apps/layout-demo.py +40 -0
  195. solara/website/pages/apps/multipage/__init__.py +38 -0
  196. solara/website/pages/apps/multipage/page1.py +26 -0
  197. solara/website/pages/apps/multipage/page2.py +34 -0
  198. solara/website/pages/apps/scatter.py +136 -0
  199. solara/website/pages/apps/scrolling.py +63 -0
  200. solara/website/pages/apps/tutorial-streamlit.py +18 -0
  201. solara/website/pages/changelog/__init__.py +8 -0
  202. solara/website/pages/changelog/changelog.md +204 -0
  203. solara/website/pages/contact/__init__.py +8 -0
  204. solara/website/pages/contact/contact.md +17 -0
  205. solara/website/pages/doc_use_download.py +85 -0
  206. solara/website/pages/documentation/__init__.py +184 -0
  207. solara/website/pages/documentation/advanced/__init__.py +9 -0
  208. solara/website/pages/documentation/advanced/content/00-overview.md +1 -0
  209. solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +6 -0
  210. solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +196 -0
  211. solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +125 -0
  212. solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +162 -0
  213. solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +69 -0
  214. solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +49 -0
  215. solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +124 -0
  216. solara/website/pages/documentation/advanced/content/15-reference/00-overview.md +3 -0
  217. solara/website/pages/documentation/advanced/content/15-reference/40-static_files.md +31 -0
  218. solara/website/pages/documentation/advanced/content/15-reference/41-asset-files.md +36 -0
  219. solara/website/pages/documentation/advanced/content/15-reference/60-static-site-generation.md +59 -0
  220. solara/website/pages/documentation/advanced/content/15-reference/70-search.md +34 -0
  221. solara/website/pages/documentation/advanced/content/15-reference/80-reloading.md +34 -0
  222. solara/website/pages/documentation/advanced/content/15-reference/90-notebook-support.md +7 -0
  223. solara/website/pages/documentation/advanced/content/15-reference/95-caching.md +148 -0
  224. solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +10 -0
  225. solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +35 -0
  226. solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +42 -0
  227. solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +28 -0
  228. solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +108 -0
  229. solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +23 -0
  230. solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +7 -0
  231. solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +166 -0
  232. solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +18 -0
  233. solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +240 -0
  234. solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +97 -0
  235. solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +12 -0
  236. solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +1 -0
  237. solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +171 -0
  238. solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  239. solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +45 -0
  240. solara/website/pages/documentation/advanced/content/40-development/10-setup.md +76 -0
  241. solara/website/pages/documentation/api/__init__.py +19 -0
  242. solara/website/pages/documentation/api/cross_filter/__init__.py +9 -0
  243. solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +23 -0
  244. solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +22 -0
  245. solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +22 -0
  246. solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +22 -0
  247. solara/website/pages/documentation/api/hooks/__init__.py +9 -0
  248. solara/website/pages/documentation/api/hooks/use_cross_filter.py +25 -0
  249. solara/website/pages/documentation/api/hooks/use_dark_effective.py +12 -0
  250. solara/website/pages/documentation/api/hooks/use_effect.md +43 -0
  251. solara/website/pages/documentation/api/hooks/use_effect.py +9 -0
  252. solara/website/pages/documentation/api/hooks/use_exception.py +33 -0
  253. solara/website/pages/documentation/api/hooks/use_memo.md +16 -0
  254. solara/website/pages/documentation/api/hooks/use_memo.py +9 -0
  255. solara/website/pages/documentation/api/hooks/use_previous.py +33 -0
  256. solara/website/pages/documentation/api/hooks/use_reactive.py +16 -0
  257. solara/website/pages/documentation/api/hooks/use_state.py +10 -0
  258. solara/website/pages/documentation/api/hooks/use_state_or_update.py +69 -0
  259. solara/website/pages/documentation/api/hooks/use_thread.md +58 -0
  260. solara/website/pages/documentation/api/hooks/use_thread.py +44 -0
  261. solara/website/pages/documentation/api/hooks/use_trait_observe.py +12 -0
  262. solara/website/pages/documentation/api/routing/__init__.py +9 -0
  263. solara/website/pages/documentation/api/routing/generate_routes.py +10 -0
  264. solara/website/pages/documentation/api/routing/generate_routes_directory.py +10 -0
  265. solara/website/pages/documentation/api/routing/resolve_path.py +35 -0
  266. solara/website/pages/documentation/api/routing/route.py +31 -0
  267. solara/website/pages/documentation/api/routing/use_route.py +80 -0
  268. solara/website/pages/documentation/api/routing/use_router.py +16 -0
  269. solara/website/pages/documentation/api/utilities/__init__.py +9 -0
  270. solara/website/pages/documentation/api/utilities/component_vue.py +10 -0
  271. solara/website/pages/documentation/api/utilities/computed.py +16 -0
  272. solara/website/pages/documentation/api/utilities/display.py +16 -0
  273. solara/website/pages/documentation/api/utilities/get_kernel_id.py +16 -0
  274. solara/website/pages/documentation/api/utilities/get_session_id.py +16 -0
  275. solara/website/pages/documentation/api/utilities/memoize.py +35 -0
  276. solara/website/pages/documentation/api/utilities/on_kernel_start.py +27 -0
  277. solara/website/pages/documentation/api/utilities/reactive.py +16 -0
  278. solara/website/pages/documentation/api/utilities/widget.py +104 -0
  279. solara/website/pages/documentation/components/__init__.py +12 -0
  280. solara/website/pages/documentation/components/advanced/__init__.py +9 -0
  281. solara/website/pages/documentation/components/advanced/link.py +27 -0
  282. solara/website/pages/documentation/components/advanced/meta.py +20 -0
  283. solara/website/pages/documentation/components/advanced/style.py +45 -0
  284. solara/website/pages/documentation/components/common.py +9 -0
  285. solara/website/pages/documentation/components/data/__init__.py +9 -0
  286. solara/website/pages/documentation/components/data/dataframe.py +44 -0
  287. solara/website/pages/documentation/components/data/pivot_table.py +81 -0
  288. solara/website/pages/documentation/components/enterprise/__init__.py +9 -0
  289. solara/website/pages/documentation/components/enterprise/avatar.py +24 -0
  290. solara/website/pages/documentation/components/enterprise/avatar_menu.py +25 -0
  291. solara/website/pages/documentation/components/input/__init__.py +9 -0
  292. solara/website/pages/documentation/components/input/button.py +23 -0
  293. solara/website/pages/documentation/components/input/checkbox.py +10 -0
  294. solara/website/pages/documentation/components/input/file_browser.py +32 -0
  295. solara/website/pages/documentation/components/input/file_drop.py +76 -0
  296. solara/website/pages/documentation/components/input/input.py +19 -0
  297. solara/website/pages/documentation/components/input/select.py +22 -0
  298. solara/website/pages/documentation/components/input/slider.py +29 -0
  299. solara/website/pages/documentation/components/input/switch.py +10 -0
  300. solara/website/pages/documentation/components/input/togglebuttons.py +21 -0
  301. solara/website/pages/documentation/components/lab/__init__.py +9 -0
  302. solara/website/pages/documentation/components/lab/chat.py +109 -0
  303. solara/website/pages/documentation/components/lab/confirmation_dialog.py +55 -0
  304. solara/website/pages/documentation/components/lab/cookies_headers.py +48 -0
  305. solara/website/pages/documentation/components/lab/input_date.py +20 -0
  306. solara/website/pages/documentation/components/lab/menu.py +22 -0
  307. solara/website/pages/documentation/components/lab/tab.py +25 -0
  308. solara/website/pages/documentation/components/lab/tabs.py +45 -0
  309. solara/website/pages/documentation/components/lab/task.py +11 -0
  310. solara/website/pages/documentation/components/lab/theming.py +72 -0
  311. solara/website/pages/documentation/components/lab/use_task.py +11 -0
  312. solara/website/pages/documentation/components/layout/__init__.py +9 -0
  313. solara/website/pages/documentation/components/layout/app_bar.py +16 -0
  314. solara/website/pages/documentation/components/layout/app_bar_title.py +16 -0
  315. solara/website/pages/documentation/components/layout/app_layout.py +24 -0
  316. solara/website/pages/documentation/components/layout/card.py +15 -0
  317. solara/website/pages/documentation/components/layout/card_actions.py +16 -0
  318. solara/website/pages/documentation/components/layout/column.py +30 -0
  319. solara/website/pages/documentation/components/layout/columns.py +27 -0
  320. solara/website/pages/documentation/components/layout/columns_responsive.py +68 -0
  321. solara/website/pages/documentation/components/layout/griddraggable.py +62 -0
  322. solara/website/pages/documentation/components/layout/gridfixed.py +21 -0
  323. solara/website/pages/documentation/components/layout/hbox.py +18 -0
  324. solara/website/pages/documentation/components/layout/row.py +30 -0
  325. solara/website/pages/documentation/components/layout/sidebar.py +24 -0
  326. solara/website/pages/documentation/components/layout/vbox.py +19 -0
  327. solara/website/pages/documentation/components/output/__init__.py +9 -0
  328. solara/website/pages/documentation/components/output/file_download.py +11 -0
  329. solara/website/pages/documentation/components/output/html.py +21 -0
  330. solara/website/pages/documentation/components/output/image.py +11 -0
  331. solara/website/pages/documentation/components/output/markdown.py +57 -0
  332. solara/website/pages/documentation/components/output/markdown_editor.py +51 -0
  333. solara/website/pages/documentation/components/output/sql_code.py +85 -0
  334. solara/website/pages/documentation/components/output/tooltip.py +11 -0
  335. solara/website/pages/documentation/components/page/__init__.py +9 -0
  336. solara/website/pages/documentation/components/page/head.py +18 -0
  337. solara/website/pages/documentation/components/page/title.py +27 -0
  338. solara/website/pages/documentation/components/status/__init__.py +9 -0
  339. solara/website/pages/documentation/components/status/error.py +40 -0
  340. solara/website/pages/documentation/components/status/info.py +40 -0
  341. solara/website/pages/documentation/components/status/progress.py +10 -0
  342. solara/website/pages/documentation/components/status/spinner.py +11 -0
  343. solara/website/pages/documentation/components/status/success.py +40 -0
  344. solara/website/pages/documentation/components/status/warning.py +47 -0
  345. solara/website/pages/documentation/components/viz/__init__.py +9 -0
  346. solara/website/pages/documentation/components/viz/altair.py +42 -0
  347. solara/website/pages/documentation/components/viz/echarts.py +75 -0
  348. solara/website/pages/documentation/components/viz/matplotlib.py +30 -0
  349. solara/website/pages/documentation/components/viz/plotly.py +63 -0
  350. solara/website/pages/documentation/components/viz/plotly_express.py +41 -0
  351. solara/website/pages/documentation/examples/__init__.py +52 -0
  352. solara/website/pages/documentation/examples/ai/__init__.py +11 -0
  353. solara/website/pages/documentation/examples/ai/chatbot.py +95 -0
  354. solara/website/pages/documentation/examples/ai/tokenizer.py +107 -0
  355. solara/website/pages/documentation/examples/basics/__init__.py +10 -0
  356. solara/website/pages/documentation/examples/basics/sine.py +28 -0
  357. solara/website/pages/documentation/examples/fullscreen/__init__.py +10 -0
  358. solara/website/pages/documentation/examples/fullscreen/authorization.py +3 -0
  359. solara/website/pages/documentation/examples/fullscreen/layout_demo.py +3 -0
  360. solara/website/pages/documentation/examples/fullscreen/multipage.py +3 -0
  361. solara/website/pages/documentation/examples/fullscreen/scatter.py +3 -0
  362. solara/website/pages/documentation/examples/fullscreen/scrolling.py +3 -0
  363. solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +3 -0
  364. solara/website/pages/documentation/examples/general/__init__.py +10 -0
  365. solara/website/pages/documentation/examples/general/custom_storage.py +70 -0
  366. solara/website/pages/documentation/examples/general/deploy_model.py +115 -0
  367. solara/website/pages/documentation/examples/general/live_update.py +38 -0
  368. solara/website/pages/documentation/examples/general/login_oauth.py +81 -0
  369. solara/website/pages/documentation/examples/general/mycard.vue +58 -0
  370. solara/website/pages/documentation/examples/general/pokemon_search.py +51 -0
  371. solara/website/pages/documentation/examples/general/vue_component.py +50 -0
  372. solara/website/pages/documentation/examples/ipycanvas.py +49 -0
  373. solara/website/pages/documentation/examples/libraries/__init__.py +10 -0
  374. solara/website/pages/documentation/examples/libraries/altair.py +64 -0
  375. solara/website/pages/documentation/examples/libraries/bqplot.py +39 -0
  376. solara/website/pages/documentation/examples/libraries/ipyleaflet.py +33 -0
  377. solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +66 -0
  378. solara/website/pages/documentation/examples/utilities/__init__.py +10 -0
  379. solara/website/pages/documentation/examples/utilities/calculator.py +157 -0
  380. solara/website/pages/documentation/examples/utilities/countdown_timer.py +64 -0
  381. solara/website/pages/documentation/examples/utilities/todo.py +196 -0
  382. solara/website/pages/documentation/examples/visualization/__init__.py +6 -0
  383. solara/website/pages/documentation/examples/visualization/annotator.py +69 -0
  384. solara/website/pages/documentation/examples/visualization/linked_views.py +84 -0
  385. solara/website/pages/documentation/examples/visualization/plotly.py +44 -0
  386. solara/website/pages/documentation/faq/__init__.py +12 -0
  387. solara/website/pages/documentation/faq/content/99-faq.md +76 -0
  388. solara/website/pages/documentation/getting_started/__init__.py +9 -0
  389. solara/website/pages/documentation/getting_started/content/00-quickstart.md +89 -0
  390. solara/website/pages/documentation/getting_started/content/01-introduction.md +125 -0
  391. solara/website/pages/documentation/getting_started/content/02-installing.md +134 -0
  392. solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +14 -0
  393. solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +13 -0
  394. solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +89 -0
  395. solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +124 -0
  396. solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +146 -0
  397. solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +144 -0
  398. solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +64 -0
  399. solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  400. solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +445 -0
  401. solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +1000 -0
  402. solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +11 -0
  403. solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +223 -0
  404. solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +88 -0
  405. solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +7 -0
  406. solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +273 -0
  407. solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +80 -0
  408. solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +7 -0
  409. solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +26 -0
  410. solara/website/pages/docutils.py +38 -0
  411. solara/website/pages/showcase/__init__.py +105 -0
  412. solara/website/pages/showcase/domino_code_assist.py +60 -0
  413. solara/website/pages/showcase/planeto_tessa.py +19 -0
  414. solara/website/pages/showcase/solara_dev.py +54 -0
  415. solara/website/pages/showcase/solarathon_2023_team_2.py +22 -0
  416. solara/website/pages/showcase/solarathon_2023_team_4.py +22 -0
  417. solara/website/pages/showcase/solarathon_2023_team_5.py +23 -0
  418. solara/website/pages/showcase/solarathon_2023_team_6.py +34 -0
  419. solara/website/pages/showcase/wanderlust.py +27 -0
  420. solara/website/public/beach.jpeg +0 -0
  421. solara/website/public/logo.svg +6 -0
  422. solara/website/public/social/discord.svg +1 -0
  423. solara/website/public/social/github.svg +1 -0
  424. solara/website/public/social/twitter.svg +3 -0
  425. solara/website/public/success.html +25 -0
  426. solara/website/templates/index.html.j2 +117 -0
  427. solara/website/utils.py +51 -0
  428. solara/widgets/__init__.py +1 -0
  429. solara/widgets/vue/gridlayout.vue +110 -0
  430. solara/widgets/vue/html.vue +4 -0
  431. solara/widgets/vue/navigator.vue +104 -0
  432. solara/widgets/vue/vegalite.vue +115 -0
  433. solara/widgets/widgets.py +66 -0
  434. solara_ui-1.31.0.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json +7 -0
  435. solara_ui-1.31.0.data/data/etc/jupyter/jupyter_server_config.d/solara.json +7 -0
  436. solara_ui-1.31.0.dist-info/METADATA +158 -0
  437. solara_ui-1.31.0.dist-info/RECORD +439 -0
  438. solara_ui-1.31.0.dist-info/WHEEL +5 -0
  439. solara_ui-1.31.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,215 @@
1
+ import os
2
+ import re
3
+ import site
4
+ import sys
5
+ import uuid
6
+ import warnings
7
+ from enum import Enum
8
+ from pathlib import Path
9
+ from typing import Optional
10
+
11
+ try:
12
+ from filelock import FileLock
13
+ except ModuleNotFoundError:
14
+ FileLock = None # type: ignore
15
+
16
+ import solara.util
17
+ from solara.minisettings import BaseSettings
18
+
19
+ from .. import ( # noqa # sidefx is that this module creates the ~/.solara directory
20
+ settings,
21
+ )
22
+ from ..util import get_solara_home
23
+
24
+ if site.getuserbase() and __file__.startswith(site.getuserbase()):
25
+ prefix = site.getuserbase()
26
+ else:
27
+ prefix = sys.prefix
28
+
29
+
30
+ class ThemeVariant(str, Enum):
31
+ light = "light"
32
+ dark = "dark"
33
+ auto = "auto"
34
+
35
+
36
+ class ThemeSettings(BaseSettings):
37
+ variant: ThemeVariant = ThemeVariant.light
38
+ loader: str = "solara"
39
+
40
+ class Config:
41
+ env_prefix = "solara_theme_"
42
+ case_sensitive = False
43
+ env_file = ".env"
44
+
45
+
46
+ class SSG(BaseSettings):
47
+ # the first app create will initialize this if it is not set
48
+ build_path: Optional[Path] = None
49
+ enabled: bool = False
50
+ headed: bool = False
51
+
52
+ class Config:
53
+ env_prefix = "solara_ssg_"
54
+ case_sensitive = False
55
+ env_file = ".env"
56
+
57
+
58
+ class Search(BaseSettings):
59
+ enabled: bool = False
60
+
61
+ class Config:
62
+ env_prefix = "solara_search_"
63
+
64
+
65
+ class Telemetry(BaseSettings):
66
+ mixpanel_token: str = "91845eb13a68e3db4e58d64ad23673b7"
67
+ mixpanel_enable: bool = True
68
+ server_user_id: str = "not_set"
69
+ server_fingerprint: str = str(uuid.getnode())
70
+ server_session_id: str = str(uuid.uuid4())
71
+
72
+ class Config:
73
+ env_prefix = "solara_telemetry_"
74
+ case_sensitive = False
75
+ env_file = ".env"
76
+
77
+
78
+ class Assets(BaseSettings):
79
+ proxy_cache_dir: Path = Path(prefix + "/share/solara/cdn/")
80
+ fontawesome_enabled: bool = True
81
+ fontawesome_path: str = "/font-awesome@4.5.0/css/font-awesome.min.css"
82
+
83
+ class Config:
84
+ env_prefix = "solara_assets_"
85
+ case_sensitive = False
86
+ env_file = ".env"
87
+
88
+
89
+ class Kernel(BaseSettings):
90
+ cull_timeout: str = "24h"
91
+ max_count: Optional[int] = None
92
+ threaded: bool = solara.util.has_threads
93
+
94
+ class Config:
95
+ env_prefix = "solara_kernel_"
96
+ case_sensitive = False
97
+ env_file = ".env"
98
+
99
+
100
+ AUTH0_TEST_CLIENT_ID = "cW7owP5Q52YHMZAnJwT8FPlH2ZKvvL3U"
101
+ AUTH0_TEST_CLIENT_SECRET = "zxITXxoz54OjuSmdn-PluQgAwbeYyoB7ALlnLoodftvAn81usDXW0quchvoNvUYD"
102
+ AUTH0_TEST_API_BASE_URL = "dev-y02f2bpr8skxu785.us.auth0.com"
103
+ AUTH0_LOGOUT_PATH = "v2/logout"
104
+
105
+ FIEF_TEST_CLIENT_ID = "x2np62qgwp6hnEGTP4JYUE3igdZWhT-AvjpjwwDyKXU"
106
+ FIEF_TEST_CLIENT_SECRET = "XQlByE1pVIz5h2SBN2GYDwT_ziqArHJgLD3KqMlCHjg"
107
+ FIEF_TEST_API_BASE_URL = "solara-dev.fief.dev"
108
+ FIEF_LOGOUT_PATH = "logout"
109
+ SESSION_SECRET_KEY_DEFAULT = "change me"
110
+
111
+ OAUTH_TEST_CLIENT_IDs = [AUTH0_TEST_CLIENT_ID, FIEF_TEST_CLIENT_ID]
112
+
113
+
114
+ class Session(BaseSettings):
115
+ secret_key: str = SESSION_SECRET_KEY_DEFAULT
116
+ https_only: Optional[bool] = None
117
+ same_site: str = "lax"
118
+
119
+ class Config:
120
+ env_prefix = "solara_session_"
121
+ case_sensitive = False
122
+ env_file = ".env"
123
+
124
+
125
+ class OAuth(BaseSettings):
126
+ private: bool = False
127
+
128
+ client_id: str = AUTH0_TEST_CLIENT_ID
129
+ client_secret: str = AUTH0_TEST_CLIENT_SECRET
130
+ api_base_url: str = AUTH0_TEST_API_BASE_URL
131
+ logout_path: str = AUTH0_LOGOUT_PATH
132
+ scope: str = "openid profile email"
133
+
134
+ class Config:
135
+ env_prefix = "solara_oauth_"
136
+ case_sensitive = False
137
+ env_file = ".env"
138
+
139
+
140
+ HOST_DEFAULT = os.environ.get("HOST", "localhost")
141
+ is_mac_os_conda = "arm64-apple-darwin" in HOST_DEFAULT
142
+ is_wsl_windows = re.match(r".*?-w1[0-9]", HOST_DEFAULT)
143
+ if is_mac_os_conda or is_wsl_windows:
144
+ HOST_DEFAULT = "localhost"
145
+
146
+
147
+ class MainSettings(BaseSettings):
148
+ use_pdb: bool = False
149
+ mode: str = "production"
150
+ tracer: bool = False
151
+ timing: bool = False
152
+ root_path: Optional[str] = None # e.g. /myapp (without trailing slash)
153
+ base_url: str = "" # e.g. https://myapp.solara.run/myapp/
154
+ platform: str = sys.platform
155
+ host: str = HOST_DEFAULT
156
+ experimental_performance: bool = False
157
+
158
+ class Config:
159
+ env_prefix = "solara_"
160
+ case_sensitive = False
161
+ env_file = ".env"
162
+
163
+
164
+ main = MainSettings()
165
+ theme = ThemeSettings()
166
+ telemetry = Telemetry()
167
+ ssg = SSG()
168
+ search = Search()
169
+ assets = Assets()
170
+ oauth = OAuth()
171
+ session = Session()
172
+ kernel = Kernel()
173
+ # fail early
174
+ solara.util.parse_timedelta(kernel.cull_timeout)
175
+
176
+ if settings.assets.proxy:
177
+ try:
178
+ assets.proxy_cache_dir.mkdir(exist_ok=True, parents=True)
179
+ except OSError as e:
180
+ settings.assets.proxy = False
181
+ warnings.warn(
182
+ f"Could not create {assets.proxy_cache_dir} due to {e}. We will automatically disable the assets proxy for you. "
183
+ "If you want to disable this warning, set SOLARA_ASSETS_PROXY to False (e.g. export SOLARA_ASSETS_PROXY=false). "
184
+ "Or change the SOLARA_PROXY_CACHE_DIR environment variable to a directory where you have write access."
185
+ )
186
+ # that's ok, the user probably doesn't have permission to create the directory
187
+ # in this case, we would need to install solara-assets?
188
+ pass
189
+
190
+ if telemetry.server_user_id == "not_set" and FileLock is not None:
191
+ home = get_solara_home()
192
+ server_user_id_file = home / "server_user_id.txt"
193
+ try:
194
+ with FileLock(str(server_user_id_file) + ".lock"):
195
+ if not server_user_id_file.exists():
196
+ server_user_id_file.write_text(str(uuid.uuid4()))
197
+ telemetry.server_user_id = server_user_id_file.read_text()
198
+ except OSError:
199
+ pass # it's ok
200
+
201
+ if oauth.client_id:
202
+ if oauth.client_id not in OAUTH_TEST_CLIENT_IDs:
203
+ if session.secret_key == SESSION_SECRET_KEY_DEFAULT:
204
+ raise ValueError(
205
+ "You must set a session secret key for oauth, it is not safe to use the default. Please set SOLARA_SESSION_SECRET_KEY in your environment."
206
+ )
207
+ if session.https_only is None:
208
+ raise ValueError(
209
+ "You must set https_only for the session to True (recommended) or False in your are using your own oauth provider."
210
+ "Please set SOLARA_SESSION_HTTPS_ONLY in your environment to True or False"
211
+ )
212
+ else:
213
+ # for the test accounts, this is fine
214
+ if session.https_only is None:
215
+ session.https_only = False
solara/server/shell.py ADDED
@@ -0,0 +1,251 @@
1
+ import io
2
+ import sys
3
+ from binascii import b2a_base64
4
+ from threading import local
5
+ from unittest.mock import Mock
6
+
7
+ import reacton.patch_display
8
+ from IPython.core.displaypub import DisplayPublisher
9
+ from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC
10
+ from jupyter_client.session import Session, extract_header
11
+ from traitlets import Any, CBytes, Dict, Instance, Type, default
12
+
13
+
14
+ def encode_images(obj):
15
+ # no-op in ipykernel
16
+ return obj
17
+
18
+
19
+ def json_clean(obj):
20
+ # no-op in ipykernel
21
+ return obj
22
+
23
+
24
+ # based on the zmq display publisher from ipykernel
25
+ # ideally this goes out of ipykernel
26
+ class SolaraDisplayPublisher(DisplayPublisher):
27
+ """A display publisher that publishes data using a ZeroMQ PUB socket."""
28
+
29
+ session = Instance(Session, allow_none=True)
30
+ pub_socket = Any(allow_none=True)
31
+ parent_header = Dict({})
32
+ topic = CBytes(b"display_data")
33
+
34
+ _thread_local = Any()
35
+
36
+ def set_parent(self, parent):
37
+ """Set the parent for outbound messages."""
38
+ self.parent_header = extract_header(parent)
39
+
40
+ def _flush_streams(self):
41
+ """flush IO Streams prior to display"""
42
+ sys.stdout.flush()
43
+ sys.stderr.flush()
44
+
45
+ @default("_thread_local")
46
+ def _default_thread_local(self):
47
+ """Initialize our thread local storage"""
48
+ return local()
49
+
50
+ @property
51
+ def _hooks(self):
52
+ if not hasattr(self._thread_local, "hooks"):
53
+ # create new list for a new thread
54
+ self._thread_local.hooks = []
55
+ return self._thread_local.hooks
56
+
57
+ def publish(
58
+ self,
59
+ data,
60
+ metadata=None,
61
+ transient=None,
62
+ update=False,
63
+ ):
64
+ """Publish a display-data message
65
+
66
+ Parameters
67
+ ----------
68
+ data : dict
69
+ A mime-bundle dict, keyed by mime-type.
70
+ metadata : dict, optional
71
+ Metadata associated with the data.
72
+ transient : dict, optional, keyword-only
73
+ Transient data that may only be relevant during a live display,
74
+ such as display_id.
75
+ Transient data should not be persisted to documents.
76
+ update : bool, optional, keyword-only
77
+ If True, send an update_display_data message instead of display_data.
78
+ """
79
+ self._flush_streams()
80
+ if metadata is None:
81
+ metadata = {}
82
+ if transient is None:
83
+ transient = {}
84
+ self._validate_data(data, metadata)
85
+ content = {}
86
+ content["data"] = encode_images(data)
87
+ content["metadata"] = metadata
88
+ content["transient"] = transient
89
+
90
+ msg_type = "update_display_data" if update else "display_data"
91
+
92
+ # Use 2-stage process to send a message,
93
+ # in order to put it through the transform
94
+ # hooks before potentially sending.
95
+ assert self.session is not None
96
+ msg = self.session.msg(msg_type, json_clean(content), parent=self.parent_header)
97
+
98
+ # Each transform either returns a new
99
+ # message or None. If None is returned,
100
+ # the message has been 'used' and we return.
101
+ for hook in self._hooks:
102
+ msg = hook(msg)
103
+ if msg is None:
104
+ return
105
+
106
+ self.session.send(
107
+ self.pub_socket,
108
+ msg,
109
+ ident=self.topic,
110
+ )
111
+
112
+ def clear_output(self, wait=False):
113
+ """Clear output associated with the current execution (cell).
114
+
115
+ Parameters
116
+ ----------
117
+ wait : bool (default: False)
118
+ If True, the output will not be cleared immediately,
119
+ instead waiting for the next display before clearing.
120
+ This reduces bounce during repeated clear & display loops.
121
+
122
+ """
123
+ assert self.session is not None
124
+ content = dict(wait=wait)
125
+ self._flush_streams()
126
+ msg = self.session.msg("clear_output", json_clean(content), parent=self.parent_header)
127
+ for hook in self._hooks:
128
+ msg = hook(msg)
129
+ if msg is None:
130
+ return
131
+
132
+ self.session.send(
133
+ self.pub_socket,
134
+ msg,
135
+ ident=self.topic,
136
+ )
137
+
138
+ def register_hook(self, hook):
139
+ """
140
+ Registers a hook with the thread-local storage.
141
+
142
+ Parameters
143
+ ----------
144
+ hook : Any callable object
145
+
146
+ Returns
147
+ -------
148
+ Either a publishable message, or `None`.
149
+ The DisplayHook objects must return a message from
150
+ the __call__ method if they still require the
151
+ `session.send` method to be called after transformation.
152
+ Returning `None` will halt that execution path, and
153
+ session.send will not be called.
154
+ """
155
+ self._hooks.append(hook)
156
+
157
+ def unregister_hook(self, hook):
158
+ """
159
+ Un-registers a hook with the thread-local storage.
160
+
161
+ Parameters
162
+ ----------
163
+ hook : Any callable object which has previously been
164
+ registered as a hook.
165
+
166
+ Returns
167
+ -------
168
+ bool - `True` if the hook was removed, `False` if it wasn't
169
+ found.
170
+ """
171
+ try:
172
+ self._hooks.remove(hook)
173
+ return True
174
+ except ValueError:
175
+ return False
176
+
177
+
178
+ class SolaraInteractiveShell(InteractiveShell):
179
+ display_pub_class = Type(SolaraDisplayPublisher)
180
+ history_manager = Any() # type: ignore
181
+ display_pub: SolaraDisplayPublisher
182
+
183
+ def set_parent(self, parent):
184
+ """Tell the children about the parent message."""
185
+ self.display_pub.set_parent(parent)
186
+
187
+ def init_history(self):
188
+ self.history_manager = Mock() # type: ignore
189
+
190
+ def init_display_formatter(self):
191
+ super().init_display_formatter()
192
+ assert self.display_formatter is not None
193
+ self.display_formatter.ipython_display_formatter = reacton.patch_display.ReactonDisplayFormatter()
194
+
195
+ # matplotlib support for display(figure)
196
+ # IPython.core.pylabtools has support for this, but it requires importing matplotlib
197
+ # which would slow down startup, so we do it here using for_type using a string as argument.
198
+ def encode_png(figure, **kwargs):
199
+ f = io.BytesIO()
200
+ format = "png"
201
+ figure.savefig(f, format=format, **kwargs)
202
+ bytes_data = f.getvalue()
203
+ base64_data = b2a_base64(bytes_data, newline=False).decode("ascii")
204
+ return base64_data
205
+
206
+ formatter = self.display_formatter.formatters["image/png"]
207
+ formatter.for_type("matplotlib.figure.Figure", encode_png)
208
+
209
+ def init_display_pub(self):
210
+ super().init_display_pub()
211
+ self.display_pub.register_hook(self.display_in_reacton_hook)
212
+
213
+ def display_in_reacton_hook(self, msg):
214
+ """Will intercept a display call and add the display data to an output widget when in a reacton context/render function."""
215
+ # similar to reacton.patch_display.publish
216
+ from reacton.core import get_render_context
217
+
218
+ rc = get_render_context(required=False)
219
+ # only during the render phase we want to capture the display calls
220
+ # during the reconsolidation phase we want to let the original display publisher do its thing
221
+ # such as adding it to a output widget
222
+ if rc is not None and not rc.reconsolidating and msg["msg_type"] == "display_data":
223
+ from reacton.ipywidgets import Output
224
+
225
+ Output(
226
+ outputs=[
227
+ {
228
+ "output_type": "display_data",
229
+ "data": msg["content"]["data"],
230
+ "metadata": msg["content"]["metadata"],
231
+ }
232
+ ]
233
+ )
234
+ return None # do not send to the frontend
235
+ return msg
236
+
237
+ def reset(self, new_session=True, aggressive=False):
238
+ # if we dont override this with a dummy, the unittests will take a long time
239
+ # to exit. Hitting ctrl-c showed the following stacktrace:
240
+ # Traceback (most recent call last):
241
+ # File "/Users/maartenbreddels/miniconda3/envs/dev/lib/python3.9/site-packages/IPython/core/interactiveshell.py", line 3924, in atexit_operations
242
+ # self.reset(new_session=False)
243
+ # File "/Users/maartenbreddels/miniconda3/envs/dev/lib/python3.9/site-packages/IPython/core/interactiveshell.py", line 1456, in reset
244
+ # self.displayhook.flush()
245
+ # File "/Users/maartenbreddels/miniconda3/envs/dev/lib/python3.9/site-packages/IPython/core/displayhook.py", line 311, in flush
246
+ # gc.collect()
247
+ # So this dummy will prevent that.
248
+ pass
249
+
250
+
251
+ InteractiveShellABC.register(SolaraInteractiveShell)