streamlit-nightly 1.43.2.dev20250307__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 (563) hide show
  1. streamlit/__init__.py +306 -0
  2. streamlit/__main__.py +20 -0
  3. streamlit/auth_util.py +218 -0
  4. streamlit/cli_util.py +105 -0
  5. streamlit/column_config.py +56 -0
  6. streamlit/commands/__init__.py +13 -0
  7. streamlit/commands/echo.py +126 -0
  8. streamlit/commands/execution_control.py +238 -0
  9. streamlit/commands/experimental_query_params.py +169 -0
  10. streamlit/commands/logo.py +189 -0
  11. streamlit/commands/navigation.py +385 -0
  12. streamlit/commands/page_config.py +311 -0
  13. streamlit/components/__init__.py +13 -0
  14. streamlit/components/lib/__init__.py +13 -0
  15. streamlit/components/lib/local_component_registry.py +84 -0
  16. streamlit/components/types/__init__.py +13 -0
  17. streamlit/components/types/base_component_registry.py +99 -0
  18. streamlit/components/types/base_custom_component.py +150 -0
  19. streamlit/components/v1/__init__.py +31 -0
  20. streamlit/components/v1/component_arrow.py +141 -0
  21. streamlit/components/v1/component_registry.py +130 -0
  22. streamlit/components/v1/components.py +38 -0
  23. streamlit/components/v1/custom_component.py +243 -0
  24. streamlit/config.py +1513 -0
  25. streamlit/config_option.py +311 -0
  26. streamlit/config_util.py +177 -0
  27. streamlit/connections/__init__.py +28 -0
  28. streamlit/connections/base_connection.py +174 -0
  29. streamlit/connections/snowflake_connection.py +562 -0
  30. streamlit/connections/snowpark_connection.py +213 -0
  31. streamlit/connections/sql_connection.py +425 -0
  32. streamlit/connections/util.py +97 -0
  33. streamlit/cursor.py +210 -0
  34. streamlit/dataframe_util.py +1416 -0
  35. streamlit/delta_generator.py +602 -0
  36. streamlit/delta_generator_singletons.py +204 -0
  37. streamlit/deprecation_util.py +209 -0
  38. streamlit/development.py +21 -0
  39. streamlit/elements/__init__.py +13 -0
  40. streamlit/elements/alert.py +234 -0
  41. streamlit/elements/arrow.py +962 -0
  42. streamlit/elements/balloons.py +47 -0
  43. streamlit/elements/bokeh_chart.py +133 -0
  44. streamlit/elements/code.py +114 -0
  45. streamlit/elements/deck_gl_json_chart.py +546 -0
  46. streamlit/elements/dialog_decorator.py +267 -0
  47. streamlit/elements/doc_string.py +558 -0
  48. streamlit/elements/empty.py +130 -0
  49. streamlit/elements/exception.py +331 -0
  50. streamlit/elements/form.py +354 -0
  51. streamlit/elements/graphviz_chart.py +150 -0
  52. streamlit/elements/heading.py +302 -0
  53. streamlit/elements/html.py +105 -0
  54. streamlit/elements/iframe.py +191 -0
  55. streamlit/elements/image.py +196 -0
  56. streamlit/elements/json.py +139 -0
  57. streamlit/elements/layouts.py +879 -0
  58. streamlit/elements/lib/__init__.py +13 -0
  59. streamlit/elements/lib/built_in_chart_utils.py +1157 -0
  60. streamlit/elements/lib/color_util.py +263 -0
  61. streamlit/elements/lib/column_config_utils.py +542 -0
  62. streamlit/elements/lib/column_types.py +2188 -0
  63. streamlit/elements/lib/dialog.py +147 -0
  64. streamlit/elements/lib/dicttools.py +154 -0
  65. streamlit/elements/lib/event_utils.py +37 -0
  66. streamlit/elements/lib/file_uploader_utils.py +66 -0
  67. streamlit/elements/lib/form_utils.py +77 -0
  68. streamlit/elements/lib/image_utils.py +441 -0
  69. streamlit/elements/lib/js_number.py +105 -0
  70. streamlit/elements/lib/mutable_status_container.py +183 -0
  71. streamlit/elements/lib/options_selector_utils.py +250 -0
  72. streamlit/elements/lib/pandas_styler_utils.py +274 -0
  73. streamlit/elements/lib/policies.py +194 -0
  74. streamlit/elements/lib/streamlit_plotly_theme.py +207 -0
  75. streamlit/elements/lib/subtitle_utils.py +176 -0
  76. streamlit/elements/lib/utils.py +250 -0
  77. streamlit/elements/map.py +508 -0
  78. streamlit/elements/markdown.py +277 -0
  79. streamlit/elements/media.py +793 -0
  80. streamlit/elements/metric.py +301 -0
  81. streamlit/elements/plotly_chart.py +546 -0
  82. streamlit/elements/progress.py +156 -0
  83. streamlit/elements/pyplot.py +194 -0
  84. streamlit/elements/snow.py +47 -0
  85. streamlit/elements/spinner.py +113 -0
  86. streamlit/elements/text.py +76 -0
  87. streamlit/elements/toast.py +98 -0
  88. streamlit/elements/vega_charts.py +1984 -0
  89. streamlit/elements/widgets/__init__.py +13 -0
  90. streamlit/elements/widgets/audio_input.py +310 -0
  91. streamlit/elements/widgets/button.py +1123 -0
  92. streamlit/elements/widgets/button_group.py +1008 -0
  93. streamlit/elements/widgets/camera_input.py +263 -0
  94. streamlit/elements/widgets/chat.py +647 -0
  95. streamlit/elements/widgets/checkbox.py +352 -0
  96. streamlit/elements/widgets/color_picker.py +265 -0
  97. streamlit/elements/widgets/data_editor.py +983 -0
  98. streamlit/elements/widgets/file_uploader.py +486 -0
  99. streamlit/elements/widgets/multiselect.py +338 -0
  100. streamlit/elements/widgets/number_input.py +545 -0
  101. streamlit/elements/widgets/radio.py +407 -0
  102. streamlit/elements/widgets/select_slider.py +437 -0
  103. streamlit/elements/widgets/selectbox.py +366 -0
  104. streamlit/elements/widgets/slider.py +880 -0
  105. streamlit/elements/widgets/text_widgets.py +628 -0
  106. streamlit/elements/widgets/time_widgets.py +970 -0
  107. streamlit/elements/write.py +574 -0
  108. streamlit/emojis.py +34 -0
  109. streamlit/env_util.py +61 -0
  110. streamlit/error_util.py +105 -0
  111. streamlit/errors.py +452 -0
  112. streamlit/external/__init__.py +13 -0
  113. streamlit/external/langchain/__init__.py +23 -0
  114. streamlit/external/langchain/streamlit_callback_handler.py +406 -0
  115. streamlit/file_util.py +247 -0
  116. streamlit/git_util.py +173 -0
  117. streamlit/hello/__init__.py +13 -0
  118. streamlit/hello/animation_demo.py +82 -0
  119. streamlit/hello/dataframe_demo.py +71 -0
  120. streamlit/hello/hello.py +37 -0
  121. streamlit/hello/mapping_demo.py +114 -0
  122. streamlit/hello/plotting_demo.py +55 -0
  123. streamlit/hello/streamlit_app.py +55 -0
  124. streamlit/hello/utils.py +28 -0
  125. streamlit/logger.py +130 -0
  126. streamlit/material_icon_names.py +25 -0
  127. streamlit/navigation/__init__.py +13 -0
  128. streamlit/navigation/page.py +302 -0
  129. streamlit/net_util.py +125 -0
  130. streamlit/platform.py +33 -0
  131. streamlit/proto/Alert_pb2.py +29 -0
  132. streamlit/proto/Alert_pb2.pyi +90 -0
  133. streamlit/proto/AppPage_pb2.py +27 -0
  134. streamlit/proto/AppPage_pb2.pyi +64 -0
  135. streamlit/proto/ArrowNamedDataSet_pb2.py +28 -0
  136. streamlit/proto/ArrowNamedDataSet_pb2.pyi +57 -0
  137. streamlit/proto/ArrowVegaLiteChart_pb2.py +29 -0
  138. streamlit/proto/ArrowVegaLiteChart_pb2.pyi +84 -0
  139. streamlit/proto/Arrow_pb2.py +33 -0
  140. streamlit/proto/Arrow_pb2.pyi +188 -0
  141. streamlit/proto/AudioInput_pb2.py +28 -0
  142. streamlit/proto/AudioInput_pb2.pyi +58 -0
  143. streamlit/proto/Audio_pb2.py +27 -0
  144. streamlit/proto/Audio_pb2.pyi +58 -0
  145. streamlit/proto/AuthRedirect_pb2.py +27 -0
  146. streamlit/proto/AuthRedirect_pb2.pyi +41 -0
  147. streamlit/proto/AutoRerun_pb2.py +27 -0
  148. streamlit/proto/AutoRerun_pb2.pyi +45 -0
  149. streamlit/proto/BackMsg_pb2.py +29 -0
  150. streamlit/proto/BackMsg_pb2.pyi +105 -0
  151. streamlit/proto/Balloons_pb2.py +27 -0
  152. streamlit/proto/Balloons_pb2.pyi +43 -0
  153. streamlit/proto/Block_pb2.py +53 -0
  154. streamlit/proto/Block_pb2.pyi +322 -0
  155. streamlit/proto/BokehChart_pb2.py +27 -0
  156. streamlit/proto/BokehChart_pb2.pyi +49 -0
  157. streamlit/proto/ButtonGroup_pb2.py +36 -0
  158. streamlit/proto/ButtonGroup_pb2.pyi +169 -0
  159. streamlit/proto/Button_pb2.py +27 -0
  160. streamlit/proto/Button_pb2.pyi +71 -0
  161. streamlit/proto/CameraInput_pb2.py +28 -0
  162. streamlit/proto/CameraInput_pb2.pyi +58 -0
  163. streamlit/proto/ChatInput_pb2.py +31 -0
  164. streamlit/proto/ChatInput_pb2.pyi +111 -0
  165. streamlit/proto/Checkbox_pb2.py +30 -0
  166. streamlit/proto/Checkbox_pb2.pyi +90 -0
  167. streamlit/proto/ClientState_pb2.py +30 -0
  168. streamlit/proto/ClientState_pb2.pyi +90 -0
  169. streamlit/proto/Code_pb2.py +27 -0
  170. streamlit/proto/Code_pb2.pyi +55 -0
  171. streamlit/proto/ColorPicker_pb2.py +28 -0
  172. streamlit/proto/ColorPicker_pb2.pyi +67 -0
  173. streamlit/proto/Common_pb2.py +51 -0
  174. streamlit/proto/Common_pb2.pyi +293 -0
  175. streamlit/proto/Components_pb2.py +35 -0
  176. streamlit/proto/Components_pb2.pyi +172 -0
  177. streamlit/proto/DataFrame_pb2.py +56 -0
  178. streamlit/proto/DataFrame_pb2.pyi +397 -0
  179. streamlit/proto/DateInput_pb2.py +28 -0
  180. streamlit/proto/DateInput_pb2.pyi +83 -0
  181. streamlit/proto/DeckGlJsonChart_pb2.py +29 -0
  182. streamlit/proto/DeckGlJsonChart_pb2.pyi +102 -0
  183. streamlit/proto/Delta_pb2.py +31 -0
  184. streamlit/proto/Delta_pb2.pyi +74 -0
  185. streamlit/proto/DocString_pb2.py +29 -0
  186. streamlit/proto/DocString_pb2.pyi +93 -0
  187. streamlit/proto/DownloadButton_pb2.py +27 -0
  188. streamlit/proto/DownloadButton_pb2.pyi +70 -0
  189. streamlit/proto/Element_pb2.py +78 -0
  190. streamlit/proto/Element_pb2.pyi +312 -0
  191. streamlit/proto/Empty_pb2.py +27 -0
  192. streamlit/proto/Empty_pb2.pyi +36 -0
  193. streamlit/proto/Exception_pb2.py +27 -0
  194. streamlit/proto/Exception_pb2.pyi +72 -0
  195. streamlit/proto/Favicon_pb2.py +27 -0
  196. streamlit/proto/Favicon_pb2.pyi +40 -0
  197. streamlit/proto/FileUploader_pb2.py +28 -0
  198. streamlit/proto/FileUploader_pb2.pyi +78 -0
  199. streamlit/proto/ForwardMsg_pb2.py +53 -0
  200. streamlit/proto/ForwardMsg_pb2.pyi +293 -0
  201. streamlit/proto/GitInfo_pb2.py +29 -0
  202. streamlit/proto/GitInfo_pb2.pyi +83 -0
  203. streamlit/proto/GraphVizChart_pb2.py +27 -0
  204. streamlit/proto/GraphVizChart_pb2.pyi +53 -0
  205. streamlit/proto/Heading_pb2.py +27 -0
  206. streamlit/proto/Heading_pb2.pyi +56 -0
  207. streamlit/proto/Html_pb2.py +27 -0
  208. streamlit/proto/Html_pb2.pyi +42 -0
  209. streamlit/proto/IFrame_pb2.py +27 -0
  210. streamlit/proto/IFrame_pb2.pyi +59 -0
  211. streamlit/proto/Image_pb2.py +29 -0
  212. streamlit/proto/Image_pb2.pyi +84 -0
  213. streamlit/proto/Json_pb2.py +27 -0
  214. streamlit/proto/Json_pb2.pyi +53 -0
  215. streamlit/proto/LabelVisibilityMessage_pb2.py +29 -0
  216. streamlit/proto/LabelVisibilityMessage_pb2.pyi +68 -0
  217. streamlit/proto/LinkButton_pb2.py +27 -0
  218. streamlit/proto/LinkButton_pb2.pyi +58 -0
  219. streamlit/proto/Logo_pb2.py +27 -0
  220. streamlit/proto/Logo_pb2.pyi +51 -0
  221. streamlit/proto/Markdown_pb2.py +29 -0
  222. streamlit/proto/Markdown_pb2.pyi +86 -0
  223. streamlit/proto/Metric_pb2.py +32 -0
  224. streamlit/proto/Metric_pb2.pyi +101 -0
  225. streamlit/proto/MetricsEvent_pb2.py +30 -0
  226. streamlit/proto/MetricsEvent_pb2.pyi +200 -0
  227. streamlit/proto/MultiSelect_pb2.py +28 -0
  228. streamlit/proto/MultiSelect_pb2.pyi +81 -0
  229. streamlit/proto/NamedDataSet_pb2.py +28 -0
  230. streamlit/proto/NamedDataSet_pb2.pyi +59 -0
  231. streamlit/proto/Navigation_pb2.py +30 -0
  232. streamlit/proto/Navigation_pb2.pyi +84 -0
  233. streamlit/proto/NewSession_pb2.py +51 -0
  234. streamlit/proto/NewSession_pb2.pyi +481 -0
  235. streamlit/proto/NumberInput_pb2.py +30 -0
  236. streamlit/proto/NumberInput_pb2.pyi +121 -0
  237. streamlit/proto/PageConfig_pb2.py +33 -0
  238. streamlit/proto/PageConfig_pb2.pyi +126 -0
  239. streamlit/proto/PageInfo_pb2.py +27 -0
  240. streamlit/proto/PageInfo_pb2.pyi +43 -0
  241. streamlit/proto/PageLink_pb2.py +27 -0
  242. streamlit/proto/PageLink_pb2.pyi +63 -0
  243. streamlit/proto/PageNotFound_pb2.py +27 -0
  244. streamlit/proto/PageNotFound_pb2.pyi +42 -0
  245. streamlit/proto/PageProfile_pb2.py +31 -0
  246. streamlit/proto/PageProfile_pb2.pyi +127 -0
  247. streamlit/proto/PagesChanged_pb2.py +28 -0
  248. streamlit/proto/PagesChanged_pb2.pyi +48 -0
  249. streamlit/proto/ParentMessage_pb2.py +27 -0
  250. streamlit/proto/ParentMessage_pb2.pyi +46 -0
  251. streamlit/proto/PlotlyChart_pb2.py +31 -0
  252. streamlit/proto/PlotlyChart_pb2.pyi +131 -0
  253. streamlit/proto/Progress_pb2.py +27 -0
  254. streamlit/proto/Progress_pb2.pyi +43 -0
  255. streamlit/proto/Radio_pb2.py +28 -0
  256. streamlit/proto/Radio_pb2.pyi +84 -0
  257. streamlit/proto/RootContainer_pb2.py +27 -0
  258. streamlit/proto/RootContainer_pb2.pyi +56 -0
  259. streamlit/proto/Selectbox_pb2.py +28 -0
  260. streamlit/proto/Selectbox_pb2.pyi +80 -0
  261. streamlit/proto/SessionEvent_pb2.py +28 -0
  262. streamlit/proto/SessionEvent_pb2.pyi +62 -0
  263. streamlit/proto/SessionStatus_pb2.py +27 -0
  264. streamlit/proto/SessionStatus_pb2.pyi +57 -0
  265. streamlit/proto/Skeleton_pb2.py +29 -0
  266. streamlit/proto/Skeleton_pb2.pyi +71 -0
  267. streamlit/proto/Slider_pb2.py +32 -0
  268. streamlit/proto/Slider_pb2.pyi +142 -0
  269. streamlit/proto/Snow_pb2.py +27 -0
  270. streamlit/proto/Snow_pb2.pyi +43 -0
  271. streamlit/proto/Spinner_pb2.py +27 -0
  272. streamlit/proto/Spinner_pb2.pyi +49 -0
  273. streamlit/proto/TextArea_pb2.py +28 -0
  274. streamlit/proto/TextArea_pb2.pyi +80 -0
  275. streamlit/proto/TextInput_pb2.py +30 -0
  276. streamlit/proto/TextInput_pb2.pyi +107 -0
  277. streamlit/proto/Text_pb2.py +27 -0
  278. streamlit/proto/Text_pb2.pyi +46 -0
  279. streamlit/proto/TimeInput_pb2.py +28 -0
  280. streamlit/proto/TimeInput_pb2.pyi +74 -0
  281. streamlit/proto/Toast_pb2.py +27 -0
  282. streamlit/proto/Toast_pb2.pyi +45 -0
  283. streamlit/proto/VegaLiteChart_pb2.py +29 -0
  284. streamlit/proto/VegaLiteChart_pb2.pyi +71 -0
  285. streamlit/proto/Video_pb2.py +31 -0
  286. streamlit/proto/Video_pb2.pyi +117 -0
  287. streamlit/proto/WidgetStates_pb2.py +31 -0
  288. streamlit/proto/WidgetStates_pb2.pyi +126 -0
  289. streamlit/proto/__init__.py +15 -0
  290. streamlit/proto/openmetrics_data_model_pb2.py +60 -0
  291. streamlit/proto/openmetrics_data_model_pb2.pyi +522 -0
  292. streamlit/py.typed +0 -0
  293. streamlit/runtime/__init__.py +50 -0
  294. streamlit/runtime/app_session.py +982 -0
  295. streamlit/runtime/caching/__init__.py +98 -0
  296. streamlit/runtime/caching/cache_data_api.py +665 -0
  297. streamlit/runtime/caching/cache_errors.py +142 -0
  298. streamlit/runtime/caching/cache_resource_api.py +527 -0
  299. streamlit/runtime/caching/cache_type.py +33 -0
  300. streamlit/runtime/caching/cache_utils.py +523 -0
  301. streamlit/runtime/caching/cached_message_replay.py +290 -0
  302. streamlit/runtime/caching/hashing.py +637 -0
  303. streamlit/runtime/caching/legacy_cache_api.py +169 -0
  304. streamlit/runtime/caching/storage/__init__.py +29 -0
  305. streamlit/runtime/caching/storage/cache_storage_protocol.py +239 -0
  306. streamlit/runtime/caching/storage/dummy_cache_storage.py +60 -0
  307. streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +145 -0
  308. streamlit/runtime/caching/storage/local_disk_cache_storage.py +223 -0
  309. streamlit/runtime/connection_factory.py +436 -0
  310. streamlit/runtime/context.py +280 -0
  311. streamlit/runtime/credentials.py +364 -0
  312. streamlit/runtime/forward_msg_cache.py +296 -0
  313. streamlit/runtime/forward_msg_queue.py +240 -0
  314. streamlit/runtime/fragment.py +477 -0
  315. streamlit/runtime/media_file_manager.py +234 -0
  316. streamlit/runtime/media_file_storage.py +143 -0
  317. streamlit/runtime/memory_media_file_storage.py +181 -0
  318. streamlit/runtime/memory_session_storage.py +77 -0
  319. streamlit/runtime/memory_uploaded_file_manager.py +138 -0
  320. streamlit/runtime/metrics_util.py +486 -0
  321. streamlit/runtime/pages_manager.py +165 -0
  322. streamlit/runtime/runtime.py +792 -0
  323. streamlit/runtime/runtime_util.py +106 -0
  324. streamlit/runtime/script_data.py +46 -0
  325. streamlit/runtime/scriptrunner/__init__.py +38 -0
  326. streamlit/runtime/scriptrunner/exec_code.py +159 -0
  327. streamlit/runtime/scriptrunner/magic.py +273 -0
  328. streamlit/runtime/scriptrunner/magic_funcs.py +32 -0
  329. streamlit/runtime/scriptrunner/script_cache.py +89 -0
  330. streamlit/runtime/scriptrunner/script_runner.py +756 -0
  331. streamlit/runtime/scriptrunner_utils/__init__.py +19 -0
  332. streamlit/runtime/scriptrunner_utils/exceptions.py +48 -0
  333. streamlit/runtime/scriptrunner_utils/script_requests.py +307 -0
  334. streamlit/runtime/scriptrunner_utils/script_run_context.py +287 -0
  335. streamlit/runtime/secrets.py +534 -0
  336. streamlit/runtime/session_manager.py +394 -0
  337. streamlit/runtime/state/__init__.py +41 -0
  338. streamlit/runtime/state/common.py +191 -0
  339. streamlit/runtime/state/query_params.py +205 -0
  340. streamlit/runtime/state/query_params_proxy.py +218 -0
  341. streamlit/runtime/state/safe_session_state.py +138 -0
  342. streamlit/runtime/state/session_state.py +772 -0
  343. streamlit/runtime/state/session_state_proxy.py +153 -0
  344. streamlit/runtime/state/widgets.py +135 -0
  345. streamlit/runtime/stats.py +109 -0
  346. streamlit/runtime/uploaded_file_manager.py +148 -0
  347. streamlit/runtime/websocket_session_manager.py +167 -0
  348. streamlit/source_util.py +98 -0
  349. streamlit/static/favicon.png +0 -0
  350. streamlit/static/index.html +61 -0
  351. streamlit/static/static/css/index.Bmkmz40k.css +1 -0
  352. streamlit/static/static/css/index.DpJG_94W.css +1 -0
  353. streamlit/static/static/css/index.DzuxGC_t.css +1 -0
  354. streamlit/static/static/js/FileDownload.esm.Bp9m5jrx.js +1 -0
  355. streamlit/static/static/js/FileHelper.D_3pbilj.js +5 -0
  356. streamlit/static/static/js/FormClearHelper.Ct2rwLXo.js +1 -0
  357. streamlit/static/static/js/Hooks.BKdzj5MJ.js +1 -0
  358. streamlit/static/static/js/InputInstructions.DB3QGNJP.js +1 -0
  359. streamlit/static/static/js/ProgressBar.D40A5xc2.js +2 -0
  360. streamlit/static/static/js/RenderInPortalIfExists.DLUCooTN.js +1 -0
  361. streamlit/static/static/js/Toolbar.BiGGIQun.js +1 -0
  362. streamlit/static/static/js/UploadFileInfo.C-jY39rj.js +1 -0
  363. streamlit/static/static/js/base-input.CQBQT24M.js +4 -0
  364. streamlit/static/static/js/checkbox.Buj8gd_M.js +9 -0
  365. streamlit/static/static/js/createDownloadLinkElement.DZMwyjvU.js +1 -0
  366. streamlit/static/static/js/createSuper.CesK3I23.js +1 -0
  367. streamlit/static/static/js/data-grid-overlay-editor.B69OOFM4.js +1 -0
  368. streamlit/static/static/js/downloader.BZQhlBNT.js +1 -0
  369. streamlit/static/static/js/es6.D9Zhqujy.js +2 -0
  370. streamlit/static/static/js/iframeResizer.contentWindow.CAzcBpCC.js +1 -0
  371. streamlit/static/static/js/index.08vcOOvb.js +1 -0
  372. streamlit/static/static/js/index.0uqKfJUS.js +1 -0
  373. streamlit/static/static/js/index.B02M5u69.js +203 -0
  374. streamlit/static/static/js/index.B7mcZKMx.js +1 -0
  375. streamlit/static/static/js/index.BAQDHFA_.js +1 -0
  376. streamlit/static/static/js/index.BI60cMVr.js +2 -0
  377. streamlit/static/static/js/index.BLug2inK.js +1 -0
  378. streamlit/static/static/js/index.BM6TMY8g.js +2 -0
  379. streamlit/static/static/js/index.BZ9p1t7G.js +1 -0
  380. streamlit/static/static/js/index.BZqa87a1.js +2 -0
  381. streamlit/static/static/js/index.BcsRUzZZ.js +1 -0
  382. streamlit/static/static/js/index.BgVMiY_P.js +197 -0
  383. streamlit/static/static/js/index.BtuGy7By.js +6 -0
  384. streamlit/static/static/js/index.BuDuBmrs.js +1 -0
  385. streamlit/static/static/js/index.BvXU2oKV.js +1 -0
  386. streamlit/static/static/js/index.BxcwPacT.js +73 -0
  387. streamlit/static/static/js/index.CWX8KB81.js +1 -0
  388. streamlit/static/static/js/index.CXzZTo_q.js +1 -0
  389. streamlit/static/static/js/index.CcRWp_KL.js +1 -0
  390. streamlit/static/static/js/index.Cd-_xe55.js +3 -0
  391. streamlit/static/static/js/index.CdG2PXln.js +4537 -0
  392. streamlit/static/static/js/index.CjXvXmcP.js +1 -0
  393. streamlit/static/static/js/index.D1HZENZx.js +776 -0
  394. streamlit/static/static/js/index.D21Efo64.js +1617 -0
  395. streamlit/static/static/js/index.D9WgGVBx.js +7 -0
  396. streamlit/static/static/js/index.DEcsHtvb.js +12 -0
  397. streamlit/static/static/js/index.DFeMfr_K.js +1 -0
  398. streamlit/static/static/js/index.DHFBoItz.js +1 -0
  399. streamlit/static/static/js/index.D_PrBKnJ.js +3 -0
  400. streamlit/static/static/js/index.DmuRkekN.js +3855 -0
  401. streamlit/static/static/js/index.Do6eY8sf.js +1 -0
  402. streamlit/static/static/js/index.Dz3lP2P-.js +1 -0
  403. streamlit/static/static/js/index.Dz_UqF-s.js +1 -0
  404. streamlit/static/static/js/index.GkSUsPhJ.js +1 -0
  405. streamlit/static/static/js/index.H1U1IC_d.js +3 -0
  406. streamlit/static/static/js/index.g6p_4DPr.js +1 -0
  407. streamlit/static/static/js/index.g9x_GKss.js +1 -0
  408. streamlit/static/static/js/index.zo9jm08y.js +1 -0
  409. streamlit/static/static/js/input.DnaFglHq.js +2 -0
  410. streamlit/static/static/js/inputUtils.CQWz5UKz.js +1 -0
  411. streamlit/static/static/js/memory.Crb9x4-F.js +1 -0
  412. streamlit/static/static/js/mergeWith.ouAz0sK3.js +1 -0
  413. streamlit/static/static/js/number-overlay-editor._UaN-O48.js +9 -0
  414. streamlit/static/static/js/possibleConstructorReturn.CtGjGFHz.js +1 -0
  415. streamlit/static/static/js/sandbox.CBybYOhV.js +1 -0
  416. streamlit/static/static/js/sprintf.D7DtBTRn.js +1 -0
  417. streamlit/static/static/js/textarea.Cb_uJt5U.js +2 -0
  418. streamlit/static/static/js/threshold.DjX0wlsa.js +1 -0
  419. streamlit/static/static/js/timepicker.DKT7pfoF.js +4 -0
  420. streamlit/static/static/js/timer.CAwTRJ_g.js +1 -0
  421. streamlit/static/static/js/toConsumableArray.05Ikp13-.js +3 -0
  422. streamlit/static/static/js/uniqueId.D2FMWUEI.js +1 -0
  423. streamlit/static/static/js/useBasicWidgetState.urnZLANY.js +1 -0
  424. streamlit/static/static/js/useOnInputChange.BOKIIdJ1.js +1 -0
  425. streamlit/static/static/js/value.CgPGBV_l.js +1 -0
  426. streamlit/static/static/js/withFullScreenWrapper.C_N8J0Xx.js +1 -0
  427. streamlit/static/static/media/KaTeX_AMS-Regular.BQhdFMY1.woff2 +0 -0
  428. streamlit/static/static/media/KaTeX_AMS-Regular.DMm9YOAa.woff +0 -0
  429. streamlit/static/static/media/KaTeX_AMS-Regular.DRggAlZN.ttf +0 -0
  430. streamlit/static/static/media/KaTeX_Caligraphic-Bold.ATXxdsX0.ttf +0 -0
  431. streamlit/static/static/media/KaTeX_Caligraphic-Bold.BEiXGLvX.woff +0 -0
  432. streamlit/static/static/media/KaTeX_Caligraphic-Bold.Dq_IR9rO.woff2 +0 -0
  433. streamlit/static/static/media/KaTeX_Caligraphic-Regular.CTRA-rTL.woff +0 -0
  434. streamlit/static/static/media/KaTeX_Caligraphic-Regular.Di6jR-x-.woff2 +0 -0
  435. streamlit/static/static/media/KaTeX_Caligraphic-Regular.wX97UBjC.ttf +0 -0
  436. streamlit/static/static/media/KaTeX_Fraktur-Bold.BdnERNNW.ttf +0 -0
  437. streamlit/static/static/media/KaTeX_Fraktur-Bold.BsDP51OF.woff +0 -0
  438. streamlit/static/static/media/KaTeX_Fraktur-Bold.CL6g_b3V.woff2 +0 -0
  439. streamlit/static/static/media/KaTeX_Fraktur-Regular.CB_wures.ttf +0 -0
  440. streamlit/static/static/media/KaTeX_Fraktur-Regular.CTYiF6lA.woff2 +0 -0
  441. streamlit/static/static/media/KaTeX_Fraktur-Regular.Dxdc4cR9.woff +0 -0
  442. streamlit/static/static/media/KaTeX_Main-Bold.Cx986IdX.woff2 +0 -0
  443. streamlit/static/static/media/KaTeX_Main-Bold.Jm3AIy58.woff +0 -0
  444. streamlit/static/static/media/KaTeX_Main-Bold.waoOVXN0.ttf +0 -0
  445. streamlit/static/static/media/KaTeX_Main-BoldItalic.DxDJ3AOS.woff2 +0 -0
  446. streamlit/static/static/media/KaTeX_Main-BoldItalic.DzxPMmG6.ttf +0 -0
  447. streamlit/static/static/media/KaTeX_Main-BoldItalic.SpSLRI95.woff +0 -0
  448. streamlit/static/static/media/KaTeX_Main-Italic.3WenGoN9.ttf +0 -0
  449. streamlit/static/static/media/KaTeX_Main-Italic.BMLOBm91.woff +0 -0
  450. streamlit/static/static/media/KaTeX_Main-Italic.NWA7e6Wa.woff2 +0 -0
  451. streamlit/static/static/media/KaTeX_Main-Regular.B22Nviop.woff2 +0 -0
  452. streamlit/static/static/media/KaTeX_Main-Regular.Dr94JaBh.woff +0 -0
  453. streamlit/static/static/media/KaTeX_Main-Regular.ypZvNtVU.ttf +0 -0
  454. streamlit/static/static/media/KaTeX_Math-BoldItalic.B3XSjfu4.ttf +0 -0
  455. streamlit/static/static/media/KaTeX_Math-BoldItalic.CZnvNsCZ.woff2 +0 -0
  456. streamlit/static/static/media/KaTeX_Math-BoldItalic.iY-2wyZ7.woff +0 -0
  457. streamlit/static/static/media/KaTeX_Math-Italic.DA0__PXp.woff +0 -0
  458. streamlit/static/static/media/KaTeX_Math-Italic.flOr_0UB.ttf +0 -0
  459. streamlit/static/static/media/KaTeX_Math-Italic.t53AETM-.woff2 +0 -0
  460. streamlit/static/static/media/KaTeX_SansSerif-Bold.CFMepnvq.ttf +0 -0
  461. streamlit/static/static/media/KaTeX_SansSerif-Bold.D1sUS0GD.woff2 +0 -0
  462. streamlit/static/static/media/KaTeX_SansSerif-Bold.DbIhKOiC.woff +0 -0
  463. streamlit/static/static/media/KaTeX_SansSerif-Italic.C3H0VqGB.woff2 +0 -0
  464. streamlit/static/static/media/KaTeX_SansSerif-Italic.DN2j7dab.woff +0 -0
  465. streamlit/static/static/media/KaTeX_SansSerif-Italic.YYjJ1zSn.ttf +0 -0
  466. streamlit/static/static/media/KaTeX_SansSerif-Regular.BNo7hRIc.ttf +0 -0
  467. streamlit/static/static/media/KaTeX_SansSerif-Regular.CS6fqUqJ.woff +0 -0
  468. streamlit/static/static/media/KaTeX_SansSerif-Regular.DDBCnlJ7.woff2 +0 -0
  469. streamlit/static/static/media/KaTeX_Script-Regular.C5JkGWo-.ttf +0 -0
  470. streamlit/static/static/media/KaTeX_Script-Regular.D3wIWfF6.woff2 +0 -0
  471. streamlit/static/static/media/KaTeX_Script-Regular.D5yQViql.woff +0 -0
  472. streamlit/static/static/media/KaTeX_Size1-Regular.C195tn64.woff +0 -0
  473. streamlit/static/static/media/KaTeX_Size1-Regular.Dbsnue_I.ttf +0 -0
  474. streamlit/static/static/media/KaTeX_Size1-Regular.mCD8mA8B.woff2 +0 -0
  475. streamlit/static/static/media/KaTeX_Size2-Regular.B7gKUWhC.ttf +0 -0
  476. streamlit/static/static/media/KaTeX_Size2-Regular.Dy4dx90m.woff2 +0 -0
  477. streamlit/static/static/media/KaTeX_Size2-Regular.oD1tc_U0.woff +0 -0
  478. streamlit/static/static/media/KaTeX_Size3-Regular.CTq5MqoE.woff +0 -0
  479. streamlit/static/static/media/KaTeX_Size3-Regular.DgpXs0kz.ttf +0 -0
  480. streamlit/static/static/media/KaTeX_Size4-Regular.BF-4gkZK.woff +0 -0
  481. streamlit/static/static/media/KaTeX_Size4-Regular.DWFBv043.ttf +0 -0
  482. streamlit/static/static/media/KaTeX_Size4-Regular.Dl5lxZxV.woff2 +0 -0
  483. streamlit/static/static/media/KaTeX_Typewriter-Regular.C0xS9mPB.woff +0 -0
  484. streamlit/static/static/media/KaTeX_Typewriter-Regular.CO6r4hn1.woff2 +0 -0
  485. streamlit/static/static/media/KaTeX_Typewriter-Regular.D3Ib7_Hf.ttf +0 -0
  486. streamlit/static/static/media/MaterialSymbols-Rounded.DcZbplWk.woff2 +0 -0
  487. streamlit/static/static/media/SourceCodePro-Bold.CFEfr7-q.woff2 +0 -0
  488. streamlit/static/static/media/SourceCodePro-BoldItalic.C-LkFXxa.woff2 +0 -0
  489. streamlit/static/static/media/SourceCodePro-Italic.CxFOx7N-.woff2 +0 -0
  490. streamlit/static/static/media/SourceCodePro-Regular.CBOlD63d.woff2 +0 -0
  491. streamlit/static/static/media/SourceCodePro-SemiBold.CFHwW3Wd.woff2 +0 -0
  492. streamlit/static/static/media/SourceCodePro-SemiBoldItalic.Cg2yRu82.woff2 +0 -0
  493. streamlit/static/static/media/SourceSansPro-Bold.-6c9oR8J.woff2 +0 -0
  494. streamlit/static/static/media/SourceSansPro-BoldItalic.DmM_grLY.woff2 +0 -0
  495. streamlit/static/static/media/SourceSansPro-Italic.I1ipWe7Q.woff2 +0 -0
  496. streamlit/static/static/media/SourceSansPro-Regular.DZLUzqI4.woff2 +0 -0
  497. streamlit/static/static/media/SourceSansPro-SemiBold.sKQIyTMz.woff2 +0 -0
  498. streamlit/static/static/media/SourceSansPro-SemiBoldItalic.C0wP0icr.woff2 +0 -0
  499. streamlit/static/static/media/SourceSerifPro-Bold.8TUnKj4x.woff2 +0 -0
  500. streamlit/static/static/media/SourceSerifPro-BoldItalic.CBVO7Ve7.woff2 +0 -0
  501. streamlit/static/static/media/SourceSerifPro-Italic.DkFgL2HZ.woff2 +0 -0
  502. streamlit/static/static/media/SourceSerifPro-Regular.CNJNET2S.woff2 +0 -0
  503. streamlit/static/static/media/SourceSerifPro-SemiBold.CHyh9GC5.woff2 +0 -0
  504. streamlit/static/static/media/SourceSerifPro-SemiBoldItalic.CBtz8sWN.woff2 +0 -0
  505. streamlit/static/static/media/balloon-0.Czj7AKwE.png +0 -0
  506. streamlit/static/static/media/balloon-1.CNvFFrND.png +0 -0
  507. streamlit/static/static/media/balloon-2.DTvC6B1t.png +0 -0
  508. streamlit/static/static/media/balloon-3.CgSk4tbL.png +0 -0
  509. streamlit/static/static/media/balloon-4.mbtFrzxf.png +0 -0
  510. streamlit/static/static/media/balloon-5.CSwkUfRA.png +0 -0
  511. streamlit/static/static/media/fireworks.B4d-_KUe.gif +0 -0
  512. streamlit/static/static/media/flake-0.DgWaVvm5.png +0 -0
  513. streamlit/static/static/media/flake-1.B2r5AHMK.png +0 -0
  514. streamlit/static/static/media/flake-2.BnWSExPC.png +0 -0
  515. streamlit/static/static/media/snowflake.JU2jBHL8.svg +11 -0
  516. streamlit/string_util.py +203 -0
  517. streamlit/temporary_directory.py +56 -0
  518. streamlit/testing/__init__.py +13 -0
  519. streamlit/testing/v1/__init__.py +17 -0
  520. streamlit/testing/v1/app_test.py +1050 -0
  521. streamlit/testing/v1/element_tree.py +2083 -0
  522. streamlit/testing/v1/local_script_runner.py +180 -0
  523. streamlit/testing/v1/util.py +53 -0
  524. streamlit/time_util.py +75 -0
  525. streamlit/type_util.py +460 -0
  526. streamlit/url_util.py +122 -0
  527. streamlit/user_info.py +519 -0
  528. streamlit/util.py +72 -0
  529. streamlit/vendor/__init__.py +0 -0
  530. streamlit/vendor/pympler/__init__.py +0 -0
  531. streamlit/vendor/pympler/asizeof.py +2869 -0
  532. streamlit/version.py +18 -0
  533. streamlit/watcher/__init__.py +28 -0
  534. streamlit/watcher/event_based_path_watcher.py +406 -0
  535. streamlit/watcher/folder_black_list.py +82 -0
  536. streamlit/watcher/local_sources_watcher.py +233 -0
  537. streamlit/watcher/path_watcher.py +185 -0
  538. streamlit/watcher/polling_path_watcher.py +124 -0
  539. streamlit/watcher/util.py +207 -0
  540. streamlit/web/__init__.py +13 -0
  541. streamlit/web/bootstrap.py +353 -0
  542. streamlit/web/cache_storage_manager_config.py +38 -0
  543. streamlit/web/cli.py +369 -0
  544. streamlit/web/server/__init__.py +26 -0
  545. streamlit/web/server/app_static_file_handler.py +93 -0
  546. streamlit/web/server/authlib_tornado_integration.py +60 -0
  547. streamlit/web/server/browser_websocket_handler.py +246 -0
  548. streamlit/web/server/component_request_handler.py +116 -0
  549. streamlit/web/server/media_file_handler.py +141 -0
  550. streamlit/web/server/oauth_authlib_routes.py +176 -0
  551. streamlit/web/server/oidc_mixin.py +108 -0
  552. streamlit/web/server/routes.py +295 -0
  553. streamlit/web/server/server.py +479 -0
  554. streamlit/web/server/server_util.py +161 -0
  555. streamlit/web/server/stats_request_handler.py +95 -0
  556. streamlit/web/server/upload_file_request_handler.py +137 -0
  557. streamlit/web/server/websocket_headers.py +56 -0
  558. streamlit_nightly-1.43.2.dev20250307.data/scripts/streamlit.cmd +16 -0
  559. streamlit_nightly-1.43.2.dev20250307.dist-info/METADATA +207 -0
  560. streamlit_nightly-1.43.2.dev20250307.dist-info/RECORD +563 -0
  561. streamlit_nightly-1.43.2.dev20250307.dist-info/WHEEL +5 -0
  562. streamlit_nightly-1.43.2.dev20250307.dist-info/entry_points.txt +2 -0
  563. streamlit_nightly-1.43.2.dev20250307.dist-info/top_level.txt +1 -0
@@ -0,0 +1,106 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Runtime-related utility functions"""
16
+
17
+ from __future__ import annotations
18
+
19
+ from typing import TYPE_CHECKING, Any
20
+
21
+ from streamlit import config
22
+ from streamlit.errors import MarkdownFormattedException, StreamlitAPIException
23
+ from streamlit.runtime.forward_msg_cache import populate_hash_if_needed
24
+
25
+ if TYPE_CHECKING:
26
+ from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
27
+
28
+
29
+ class MessageSizeError(MarkdownFormattedException):
30
+ """Exception raised when a websocket message is larger than the configured limit."""
31
+
32
+ def __init__(self, failed_msg_str: Any):
33
+ msg = self._get_message(failed_msg_str)
34
+ super().__init__(msg)
35
+
36
+ def _get_message(self, failed_msg_str: Any) -> str:
37
+ # This needs to have zero indentation otherwise the markdown will render incorrectly.
38
+ return (
39
+ f"""
40
+ **Data of size {len(failed_msg_str) / 1e6:.1f} MB exceeds the message size limit of {get_max_message_size_bytes() / 1e6} MB.**
41
+
42
+ This is often caused by a large chart or dataframe. Please decrease the amount of data sent
43
+ to the browser, or increase the limit by setting the config option `server.maxMessageSize`.
44
+ [Click here to learn more about config options](https://docs.streamlit.io/develop/api-reference/configuration/config.toml).
45
+
46
+ _Note that increasing the limit may lead to long loading times and large memory consumption
47
+ of the client's browser and the Streamlit server._
48
+ """
49
+ ).strip("\n")
50
+
51
+
52
+ class BadDurationStringError(StreamlitAPIException):
53
+ """Raised when a bad duration argument string is passed."""
54
+
55
+ def __init__(self, duration: str):
56
+ MarkdownFormattedException.__init__(
57
+ self,
58
+ "TTL string doesn't look right. It should be formatted as"
59
+ f"`'1d2h34m'` or `2 days`, for example. Got: {duration}",
60
+ )
61
+
62
+
63
+ def is_cacheable_msg(msg: ForwardMsg) -> bool:
64
+ """True if the given message qualifies for caching."""
65
+ if msg.WhichOneof("type") in {"ref_hash", "initialize"}:
66
+ # Some message types never get cached
67
+ return False
68
+ return msg.ByteSize() >= int(config.get_option("global.minCachedMessageSize"))
69
+
70
+
71
+ def serialize_forward_msg(msg: ForwardMsg) -> bytes:
72
+ """Serialize a ForwardMsg to send to a client.
73
+
74
+ If the message is too large, it will be converted to an exception message
75
+ instead.
76
+ """
77
+ populate_hash_if_needed(msg)
78
+ msg_str = msg.SerializeToString()
79
+
80
+ if len(msg_str) > get_max_message_size_bytes():
81
+ import streamlit.elements.exception as exception
82
+
83
+ # Overwrite the offending ForwardMsg.delta with an error to display.
84
+ # This assumes that the size limit wasn't exceeded due to metadata.
85
+ exception.marshall(msg.delta.new_element.exception, MessageSizeError(msg_str))
86
+ msg_str = msg.SerializeToString()
87
+
88
+ return msg_str
89
+
90
+
91
+ # This needs to be initialized lazily to avoid calling config.get_option() and
92
+ # thus initializing config options when this file is first imported.
93
+ _max_message_size_bytes: int | None = None
94
+
95
+
96
+ def get_max_message_size_bytes() -> int:
97
+ """Returns the max websocket message size in bytes.
98
+
99
+ This will lazyload the value from the config and store it in the global symbol table.
100
+ """
101
+ global _max_message_size_bytes
102
+
103
+ if _max_message_size_bytes is None:
104
+ _max_message_size_bytes = config.get_option("server.maxMessageSize") * int(1e6)
105
+
106
+ return _max_message_size_bytes
@@ -0,0 +1,46 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ import os
18
+ from dataclasses import dataclass, field
19
+
20
+
21
+ @dataclass(frozen=True)
22
+ class ScriptData:
23
+ """Contains parameters related to running a script."""
24
+
25
+ main_script_path: str
26
+ is_hello: bool = False
27
+ script_folder: str = field(init=False)
28
+ name: str = field(init=False)
29
+
30
+ def __post_init__(self) -> None:
31
+ """Set some computed values derived from main_script_path.
32
+
33
+ The usage of object.__setattr__ is necessary because trying to set
34
+ self.script_folder or self.name normally, even within the __init__ method, will
35
+ explode since we declared this dataclass to be frozen.
36
+
37
+ We do this in __post_init__ so that we can use the auto-generated __init__
38
+ method that most dataclasses use.
39
+ """
40
+ main_script_path = os.path.abspath(self.main_script_path)
41
+ script_folder = os.path.dirname(main_script_path)
42
+ object.__setattr__(self, "script_folder", script_folder)
43
+
44
+ basename = os.path.basename(main_script_path)
45
+ name = str(os.path.splitext(basename)[0])
46
+ object.__setattr__(self, "name", name)
@@ -0,0 +1,38 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from streamlit.runtime.scriptrunner.script_runner import ScriptRunner, ScriptRunnerEvent
16
+ from streamlit.runtime.scriptrunner_utils.exceptions import (
17
+ RerunException,
18
+ StopException,
19
+ )
20
+ from streamlit.runtime.scriptrunner_utils.script_requests import RerunData
21
+ from streamlit.runtime.scriptrunner_utils.script_run_context import (
22
+ ScriptRunContext,
23
+ add_script_run_ctx,
24
+ enqueue_message,
25
+ get_script_run_ctx,
26
+ )
27
+
28
+ __all__ = [
29
+ "RerunData",
30
+ "ScriptRunContext",
31
+ "add_script_run_ctx",
32
+ "get_script_run_ctx",
33
+ "enqueue_message",
34
+ "RerunException",
35
+ "ScriptRunner",
36
+ "ScriptRunnerEvent",
37
+ "StopException",
38
+ ]
@@ -0,0 +1,159 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ import sys
18
+ from typing import TYPE_CHECKING, Any, Callable
19
+
20
+ from streamlit import util
21
+ from streamlit.delta_generator_singletons import (
22
+ context_dg_stack,
23
+ get_default_dg_stack_value,
24
+ )
25
+ from streamlit.error_util import handle_uncaught_app_exception
26
+ from streamlit.errors import FragmentHandledException
27
+ from streamlit.runtime.scriptrunner_utils.exceptions import (
28
+ RerunException,
29
+ StopException,
30
+ )
31
+
32
+ if TYPE_CHECKING:
33
+ from streamlit.runtime.scriptrunner_utils.script_requests import RerunData
34
+ from streamlit.runtime.scriptrunner_utils.script_run_context import ScriptRunContext
35
+
36
+
37
+ class modified_sys_path:
38
+ """A context for prepending a directory to sys.path for a second.
39
+
40
+ Code inspired by IPython:
41
+ Source: https://github.com/ipython/ipython/blob/master/IPython/utils/syspathcontext.py#L42
42
+ """
43
+
44
+ def __init__(self, main_script_path: str):
45
+ self._main_script_path = main_script_path
46
+ self._added_path = False
47
+
48
+ def __repr__(self) -> str:
49
+ return util.repr_(self)
50
+
51
+ def __enter__(self):
52
+ if self._main_script_path not in sys.path:
53
+ sys.path.insert(0, self._main_script_path)
54
+ self._added_path = True
55
+
56
+ def __exit__(self, type, value, traceback):
57
+ if self._added_path:
58
+ try:
59
+ sys.path.remove(self._main_script_path)
60
+ except ValueError:
61
+ # It's already removed.
62
+ pass
63
+
64
+ # Returning False causes any exceptions to be re-raised.
65
+ return False
66
+
67
+
68
+ def exec_func_with_error_handling(
69
+ func: Callable[[], Any], ctx: ScriptRunContext
70
+ ) -> tuple[
71
+ Any | None,
72
+ bool,
73
+ RerunData | None,
74
+ bool,
75
+ Exception | None,
76
+ ]:
77
+ """Execute the passed function wrapped in a try/except block.
78
+
79
+ This function is called by the script runner to execute the user's script or
80
+ fragment reruns, but also for the execution of fragment code in context of a normal
81
+ app run. This wrapper ensures that handle_uncaught_exception messages show up in the
82
+ correct context.
83
+
84
+ Parameters
85
+ ----------
86
+ func : callable
87
+ The function to execute wrapped in the try/except block.
88
+ ctx : ScriptRunContext
89
+ The context in which the script is being run.
90
+
91
+ Returns
92
+ -------
93
+ tuple
94
+ A tuple containing:
95
+ - The result of the passed function.
96
+ - A boolean indicating whether the script ran without errors (RerunException and
97
+ StopException don't count as errors).
98
+ - The RerunData instance belonging to a RerunException if the script was
99
+ interrupted by a RerunException.
100
+ - A boolean indicating whether the script was stopped prematurely (False for
101
+ RerunExceptions, True for all other exceptions).
102
+ - The uncaught exception if one occurred, None otherwise
103
+ """
104
+ run_without_errors = True
105
+
106
+ # This will be set to a RerunData instance if our execution
107
+ # is interrupted by a RerunException.
108
+ rerun_exception_data: RerunData | None = None
109
+
110
+ # If the script stops early, we don't want to remove unseen widgets,
111
+ # so we track this to potentially skip session state cleanup later.
112
+ premature_stop: bool = False
113
+
114
+ # The result of the passed function
115
+ result: Any | None = None
116
+
117
+ # The uncaught exception if one occurred, None otherwise
118
+ uncaught_exception: Exception | None = None
119
+
120
+ try:
121
+ result = func()
122
+ except RerunException as e:
123
+ rerun_exception_data = e.rerun_data
124
+
125
+ # Since the script is about to rerun, we may need to reset our cursors/dg_stack
126
+ # so that we write to the right place in the app. For full script runs, this
127
+ # needs to happen in case the same thread reruns our script (a different thread
128
+ # would automatically come with fresh cursors/dg_stack values). For fragments,
129
+ # it doesn't matter either way since the fragment resets these values from its
130
+ # snapshot before execution.
131
+ ctx.cursors.clear()
132
+ context_dg_stack.set(get_default_dg_stack_value())
133
+
134
+ # Interruption due to a rerun is usually from `st.rerun()`, which
135
+ # we want to count as a script completion so triggers reset.
136
+ # It is also possible for this to happen if fast reruns is off,
137
+ # but this is very rare.
138
+ premature_stop = False
139
+
140
+ except StopException:
141
+ # This is thrown when the script executes `st.stop()`.
142
+ # We don't have to do anything here.
143
+ premature_stop = True
144
+ except FragmentHandledException:
145
+ run_without_errors = False
146
+ premature_stop = True
147
+ except Exception as ex:
148
+ run_without_errors = False
149
+ premature_stop = True
150
+ handle_uncaught_app_exception(ex)
151
+ uncaught_exception = ex
152
+
153
+ return (
154
+ result,
155
+ run_without_errors,
156
+ rerun_exception_data,
157
+ premature_stop,
158
+ uncaught_exception,
159
+ )
@@ -0,0 +1,273 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ import ast
18
+ import sys
19
+ from typing import Any, Final
20
+
21
+ from streamlit import config
22
+
23
+ # When a Streamlit app is magicified, we insert a `magic_funcs` import near the top of
24
+ # its module's AST:
25
+ # import streamlit.runtime.scriptrunner.magic_funcs as __streamlitmagic__
26
+ MAGIC_MODULE_NAME: Final = "__streamlitmagic__"
27
+
28
+
29
+ def add_magic(code: str, script_path: str) -> Any:
30
+ """Modifies the code to support magic Streamlit commands.
31
+
32
+ Parameters
33
+ ----------
34
+ code : str
35
+ The Python code.
36
+ script_path : str
37
+ The path to the script file.
38
+
39
+ Returns
40
+ -------
41
+ ast.Module
42
+ The syntax tree for the code.
43
+
44
+ """
45
+ # Pass script_path so we get pretty exceptions.
46
+ tree = ast.parse(code, script_path, "exec")
47
+
48
+ file_ends_in_semicolon = _does_file_end_in_semicolon(tree, code)
49
+
50
+ _modify_ast_subtree(
51
+ tree, is_root=True, file_ends_in_semicolon=file_ends_in_semicolon
52
+ )
53
+
54
+ return tree
55
+
56
+
57
+ def _modify_ast_subtree(
58
+ tree: Any,
59
+ body_attr: str = "body",
60
+ is_root: bool = False,
61
+ file_ends_in_semicolon: bool = False,
62
+ ):
63
+ """Parses magic commands and modifies the given AST (sub)tree."""
64
+
65
+ body = getattr(tree, body_attr)
66
+
67
+ for i, node in enumerate(body):
68
+ node_type = type(node)
69
+
70
+ # Recursively parses the content of the statements
71
+ # `with` as well as function definitions.
72
+ # Also covers their async counterparts
73
+ if (
74
+ node_type is ast.FunctionDef
75
+ or node_type is ast.With
76
+ or node_type is ast.AsyncFunctionDef
77
+ or node_type is ast.AsyncWith
78
+ ):
79
+ _modify_ast_subtree(node)
80
+
81
+ # Recursively parses the content of the statements
82
+ # `for` and `while`.
83
+ # Also covers their async counterparts
84
+ elif (
85
+ node_type is ast.For or node_type is ast.While or node_type is ast.AsyncFor
86
+ ):
87
+ _modify_ast_subtree(node)
88
+ _modify_ast_subtree(node, "orelse")
89
+
90
+ # Recursively parses methods in a class.
91
+ elif node_type is ast.ClassDef:
92
+ for inner_node in node.body:
93
+ if type(inner_node) in {ast.FunctionDef, ast.AsyncFunctionDef}:
94
+ _modify_ast_subtree(inner_node)
95
+
96
+ # Recursively parses the contents of try statements,
97
+ # all their handlers (except and else) and the finally body
98
+ elif node_type is ast.Try or (
99
+ sys.version_info >= (3, 11) and node_type is ast.TryStar
100
+ ):
101
+ _modify_ast_subtree(node)
102
+ _modify_ast_subtree(node, body_attr="finalbody")
103
+ _modify_ast_subtree(node, body_attr="orelse")
104
+ for handler_node in node.handlers:
105
+ _modify_ast_subtree(handler_node)
106
+
107
+ # Recursively parses if blocks, as well as their else/elif blocks
108
+ # (else/elif are both mapped to orelse)
109
+ # it intentionally does not parse the test expression.
110
+ elif node_type is ast.If:
111
+ _modify_ast_subtree(node)
112
+ _modify_ast_subtree(node, "orelse")
113
+
114
+ elif sys.version_info >= (3, 10) and node_type is ast.Match:
115
+ for case_node in node.cases:
116
+ _modify_ast_subtree(case_node)
117
+
118
+ # Convert standalone expression nodes to st.write
119
+ elif node_type is ast.Expr:
120
+ value = _get_st_write_from_expr(
121
+ node,
122
+ i,
123
+ parent_type=type(tree),
124
+ is_root=is_root,
125
+ is_last_expr=(i == len(body) - 1),
126
+ file_ends_in_semicolon=file_ends_in_semicolon,
127
+ )
128
+ if value is not None:
129
+ node.value = value
130
+
131
+ if is_root:
132
+ # Import Streamlit so we can use it in the new_value above.
133
+ _insert_import_statement(tree)
134
+
135
+ ast.fix_missing_locations(tree)
136
+
137
+
138
+ def _insert_import_statement(tree: Any) -> None:
139
+ """Insert Streamlit import statement at the top(ish) of the tree."""
140
+
141
+ st_import = _build_st_import_statement()
142
+
143
+ # If the 0th node is already an import statement, put the Streamlit
144
+ # import below that, so we don't break "from __future__ import".
145
+ if tree.body and type(tree.body[0]) in {ast.ImportFrom, ast.Import}:
146
+ tree.body.insert(1, st_import)
147
+
148
+ # If the 0th node is a docstring and the 1st is an import statement,
149
+ # put the Streamlit import below those, so we don't break "from
150
+ # __future__ import".
151
+ elif (
152
+ len(tree.body) > 1
153
+ and (
154
+ type(tree.body[0]) is ast.Expr
155
+ and _is_string_constant_node(tree.body[0].value)
156
+ )
157
+ and type(tree.body[1]) in {ast.ImportFrom, ast.Import}
158
+ ):
159
+ tree.body.insert(2, st_import)
160
+
161
+ else:
162
+ tree.body.insert(0, st_import)
163
+
164
+
165
+ def _build_st_import_statement():
166
+ """Build AST node for `import magic_funcs as __streamlitmagic__`."""
167
+ return ast.Import(
168
+ names=[
169
+ ast.alias(
170
+ name="streamlit.runtime.scriptrunner.magic_funcs",
171
+ asname=MAGIC_MODULE_NAME,
172
+ )
173
+ ]
174
+ )
175
+
176
+
177
+ def _build_st_write_call(nodes):
178
+ """Build AST node for `__streamlitmagic__.transparent_write(*nodes)`."""
179
+ return ast.Call(
180
+ func=ast.Attribute(
181
+ attr="transparent_write",
182
+ value=ast.Name(id=MAGIC_MODULE_NAME, ctx=ast.Load()),
183
+ ctx=ast.Load(),
184
+ ),
185
+ args=nodes,
186
+ keywords=[],
187
+ )
188
+
189
+
190
+ def _get_st_write_from_expr(
191
+ node, i, parent_type, is_root, is_last_expr, file_ends_in_semicolon
192
+ ):
193
+ # Don't wrap function calls
194
+ # (Unless the function call happened at the end of the root node, AND
195
+ # magic.displayLastExprIfNoSemicolon is True. This allows us to support notebook-like
196
+ # behavior, where we display the last function in a cell)
197
+ if type(node.value) is ast.Call and not _is_displayable_last_expr(
198
+ is_root, is_last_expr, file_ends_in_semicolon
199
+ ):
200
+ return None
201
+
202
+ # Don't wrap DocString nodes
203
+ # (Unless magic.displayRootDocString, in which case we do wrap the root-level
204
+ # docstring with st.write. This allows us to support notebook-like behavior
205
+ # where you can have a cell with a markdown string)
206
+ if _is_docstring_node(
207
+ node.value, i, parent_type
208
+ ) and not _should_display_docstring_like_node_anyway(is_root):
209
+ return None
210
+
211
+ # Don't wrap yield nodes
212
+ if type(node.value) is ast.Yield or type(node.value) is ast.YieldFrom:
213
+ return None
214
+
215
+ # Don't wrap await nodes
216
+ if type(node.value) is ast.Await:
217
+ return None
218
+
219
+ # If tuple, call st.write(*the_tuple). This allows us to add a comma at the end of a
220
+ # statement to turn it into an expression that should be st-written. Ex:
221
+ # "np.random.randn(1000, 2),"
222
+ args = node.value.elts if type(node.value) is ast.Tuple else [node.value]
223
+ return _build_st_write_call(args)
224
+
225
+
226
+ def _is_string_constant_node(node) -> bool:
227
+ return isinstance(node, ast.Constant) and isinstance(node.value, str)
228
+
229
+
230
+ def _is_docstring_node(node, node_index, parent_type) -> bool:
231
+ return (
232
+ node_index == 0
233
+ and _is_string_constant_node(node)
234
+ and parent_type in {ast.FunctionDef, ast.AsyncFunctionDef, ast.Module}
235
+ )
236
+
237
+
238
+ def _does_file_end_in_semicolon(tree, code: str) -> bool:
239
+ file_ends_in_semicolon = False
240
+
241
+ # Avoid spending time with this operation if magic.displayLastExprIfNoSemicolon is
242
+ # not set.
243
+ if config.get_option("magic.displayLastExprIfNoSemicolon"):
244
+ if len(tree.body) == 0:
245
+ return False
246
+
247
+ last_line_num = getattr(tree.body[-1], "end_lineno", None)
248
+
249
+ if last_line_num is not None:
250
+ last_line_str: str = code.split("\n")[last_line_num - 1]
251
+ file_ends_in_semicolon = last_line_str.strip(" ").endswith(";")
252
+
253
+ return file_ends_in_semicolon
254
+
255
+
256
+ def _is_displayable_last_expr(
257
+ is_root: bool, is_last_expr: bool, file_ends_in_semicolon: bool
258
+ ) -> bool:
259
+ return (
260
+ # This is a "displayable last expression" if...
261
+ # ...it's actually the last expression...
262
+ is_last_expr
263
+ # ...in the root scope...
264
+ and is_root
265
+ # ...it does not end in a semicolon...
266
+ and not file_ends_in_semicolon
267
+ # ...and this config option is telling us to show it
268
+ and config.get_option("magic.displayLastExprIfNoSemicolon")
269
+ )
270
+
271
+
272
+ def _should_display_docstring_like_node_anyway(is_root: bool) -> bool:
273
+ return config.get_option("magic.displayRootDocString") and is_root
@@ -0,0 +1,32 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ from typing import Any
18
+
19
+ from streamlit.runtime.metrics_util import gather_metrics
20
+
21
+
22
+ @gather_metrics("magic")
23
+ def transparent_write(*args: Any) -> Any:
24
+ """The function that gets magic-ified into Streamlit apps.
25
+ This is just st.write, but returns the arguments you passed to it.
26
+ """
27
+ import streamlit as st
28
+
29
+ st.write(*args)
30
+ if len(args) == 1:
31
+ return args[0]
32
+ return args