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,19 @@
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
+ """The modules in this package are separated from
16
+ the scriptrunner-package, because they are more or less
17
+ standalone and other modules import them quite frequently.
18
+ This separation helps us to remove dependency cycles.
19
+ """
@@ -0,0 +1,48 @@
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_utils.script_requests import RerunData
16
+ from streamlit.util import repr_
17
+
18
+
19
+ # We inherit from BaseException to avoid being caught by user code.
20
+ # For example, having it inherit from Exception might make st.rerun not
21
+ # work in a try/except block.
22
+ class ScriptControlException(BaseException): # NOSONAR
23
+ """Base exception for ScriptRunner."""
24
+
25
+ pass
26
+
27
+
28
+ class StopException(ScriptControlException):
29
+ """Silently stop the execution of the user's script."""
30
+
31
+ pass
32
+
33
+
34
+ class RerunException(ScriptControlException):
35
+ """Silently stop and rerun the user's script."""
36
+
37
+ def __init__(self, rerun_data: RerunData):
38
+ """Construct a RerunException
39
+
40
+ Parameters
41
+ ----------
42
+ rerun_data : RerunData
43
+ The RerunData that should be used to rerun the script
44
+ """
45
+ self.rerun_data = rerun_data
46
+
47
+ def __repr__(self) -> str:
48
+ return repr_(self)
@@ -0,0 +1,307 @@
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 threading
18
+ from dataclasses import dataclass, field, replace
19
+ from enum import Enum
20
+ from typing import TYPE_CHECKING, cast
21
+
22
+ from streamlit import util
23
+ from streamlit.proto.Common_pb2 import ChatInputValue as ChatInputValueProto
24
+ from streamlit.proto.Common_pb2 import StringTriggerValue as StringTriggerValueProto
25
+ from streamlit.proto.WidgetStates_pb2 import WidgetState, WidgetStates
26
+
27
+ if TYPE_CHECKING:
28
+ from streamlit.proto.ClientState_pb2 import ContextInfo
29
+
30
+
31
+ class ScriptRequestType(Enum):
32
+ # The ScriptRunner should continue running its script.
33
+ CONTINUE = "CONTINUE"
34
+
35
+ # If the script is running, it should be stopped as soon
36
+ # as the ScriptRunner reaches an interrupt point.
37
+ # This is a terminal state.
38
+ STOP = "STOP"
39
+
40
+ # A script rerun has been requested. The ScriptRunner should
41
+ # handle this request as soon as it reaches an interrupt point.
42
+ RERUN = "RERUN"
43
+
44
+
45
+ @dataclass(frozen=True)
46
+ class RerunData:
47
+ """Data attached to RERUN requests. Immutable."""
48
+
49
+ query_string: str = ""
50
+ widget_states: WidgetStates | None = None
51
+ page_script_hash: str = ""
52
+ page_name: str = ""
53
+
54
+ # A single fragment_id to append to fragment_id_queue.
55
+ fragment_id: str | None = None
56
+ # The queue of fragment_ids waiting to be run.
57
+ fragment_id_queue: list[str] = field(default_factory=list)
58
+ is_fragment_scoped_rerun: bool = False
59
+ # set to true when a script is rerun by the fragment auto-rerun mechanism
60
+ is_auto_rerun: bool = False
61
+ # context_info is used to store information from the user browser (e.g. timezone)
62
+ context_info: ContextInfo | None = None
63
+
64
+ def __repr__(self) -> str:
65
+ return util.repr_(self)
66
+
67
+
68
+ @dataclass(frozen=True)
69
+ class ScriptRequest:
70
+ """A STOP or RERUN request and associated data."""
71
+
72
+ type: ScriptRequestType
73
+ _rerun_data: RerunData | None = None
74
+
75
+ @property
76
+ def rerun_data(self) -> RerunData:
77
+ if self.type is not ScriptRequestType.RERUN:
78
+ raise RuntimeError("RerunData is only set for RERUN requests.")
79
+ return cast(RerunData, self._rerun_data)
80
+
81
+ def __repr__(self) -> str:
82
+ return util.repr_(self)
83
+
84
+
85
+ def _fragment_run_should_not_preempt_script(
86
+ fragment_id_queue: list[str],
87
+ is_fragment_scoped_rerun: bool,
88
+ ) -> bool:
89
+ """Returns whether the currently running script should be preempted due to a
90
+ fragment rerun.
91
+
92
+ Reruns corresponding to fragment runs that weren't caused by calls to
93
+ `st.rerun(scope="fragment")` should *not* cancel the current script run
94
+ as doing so will affect elements outside of the fragment.
95
+ """
96
+ return bool(fragment_id_queue) and not is_fragment_scoped_rerun
97
+
98
+
99
+ def _coalesce_widget_states(
100
+ old_states: WidgetStates | None, new_states: WidgetStates | None
101
+ ) -> WidgetStates | None:
102
+ """Coalesce an older WidgetStates into a newer one, and return a new
103
+ WidgetStates containing the result.
104
+
105
+ For most widget values, we just take the latest version.
106
+
107
+ However, any trigger_values (which are set by buttons) that are True in
108
+ `old_states` will be set to True in the coalesced result, so that button
109
+ presses don't go missing.
110
+ """
111
+ if not old_states and not new_states:
112
+ return None
113
+ elif not old_states:
114
+ return new_states
115
+ elif not new_states:
116
+ return old_states
117
+
118
+ states_by_id: dict[str, WidgetState] = {
119
+ wstate.id: wstate for wstate in new_states.widgets
120
+ }
121
+
122
+ trigger_value_types = [
123
+ ("trigger_value", False),
124
+ ("string_trigger_value", StringTriggerValueProto(data=None)),
125
+ ("chat_input_value", ChatInputValueProto(data=None)),
126
+ ]
127
+ for old_state in old_states.widgets:
128
+ for trigger_value_type, unset_value in trigger_value_types:
129
+ if (
130
+ old_state.WhichOneof("value") == trigger_value_type
131
+ and getattr(old_state, trigger_value_type) != unset_value
132
+ ):
133
+ new_trigger_val = states_by_id.get(old_state.id)
134
+ # It should nearly always be the case that new_trigger_val is None
135
+ # here as trigger values are deleted from the client's WidgetStateManager
136
+ # as soon as a rerun_script BackMsg is sent to the server. Since it's
137
+ # impossible to test that the client sends us state in the expected
138
+ # format in a unit test, we test for this behavior in
139
+ # e2e_playwright/test_fragment_queue_test.py
140
+ if not new_trigger_val or (
141
+ # Ensure the corresponding new_state is also a trigger;
142
+ # otherwise, a widget that was previously a button/chat_input but no
143
+ # longer is could get a bad value.
144
+ new_trigger_val.WhichOneof("value") == trigger_value_type
145
+ # We only want to take the value of old_state if new_trigger_val is
146
+ # unset as the old value may be stale if a newer one was entered.
147
+ and getattr(new_trigger_val, trigger_value_type) == unset_value
148
+ ):
149
+ states_by_id[old_state.id] = old_state
150
+
151
+ coalesced = WidgetStates()
152
+ coalesced.widgets.extend(states_by_id.values())
153
+
154
+ return coalesced
155
+
156
+
157
+ class ScriptRequests:
158
+ """An interface for communicating with a ScriptRunner. Thread-safe.
159
+
160
+ AppSession makes requests of a ScriptRunner through this class, and
161
+ ScriptRunner handles those requests.
162
+ """
163
+
164
+ def __init__(self):
165
+ self._lock = threading.Lock()
166
+ self._state = ScriptRequestType.CONTINUE
167
+ self._rerun_data = RerunData()
168
+
169
+ def request_stop(self) -> None:
170
+ """Request that the ScriptRunner stop running. A stopped ScriptRunner
171
+ can't be used anymore. STOP requests succeed unconditionally.
172
+ """
173
+ with self._lock:
174
+ self._state = ScriptRequestType.STOP
175
+
176
+ def request_rerun(self, new_data: RerunData) -> bool:
177
+ """Request that the ScriptRunner rerun its script.
178
+
179
+ If the ScriptRunner has been stopped, this request can't be honored:
180
+ return False.
181
+
182
+ Otherwise, record the request and return True. The ScriptRunner will
183
+ handle the rerun request as soon as it reaches an interrupt point.
184
+ """
185
+
186
+ with self._lock:
187
+ if self._state == ScriptRequestType.STOP:
188
+ # We can't rerun after being stopped.
189
+ return False
190
+
191
+ if self._state == ScriptRequestType.CONTINUE:
192
+ # The script is currently running, and we haven't received a request to
193
+ # rerun it as of yet. We can handle a rerun request unconditionally so
194
+ # just change self._state and set self._rerun_data.
195
+ self._state = ScriptRequestType.RERUN
196
+
197
+ # Convert from a single fragment_id into fragment_id_queue.
198
+ if new_data.fragment_id:
199
+ new_data = replace(
200
+ new_data,
201
+ fragment_id=None,
202
+ fragment_id_queue=[new_data.fragment_id],
203
+ )
204
+
205
+ self._rerun_data = new_data
206
+ return True
207
+
208
+ if self._state == ScriptRequestType.RERUN:
209
+ # We already have an existing Rerun request, so we can coalesce the new
210
+ # rerun request into the existing one.
211
+
212
+ coalesced_states = _coalesce_widget_states(
213
+ self._rerun_data.widget_states, new_data.widget_states
214
+ )
215
+
216
+ if new_data.fragment_id:
217
+ # This RERUN request corresponds to a new fragment run. We append
218
+ # the new fragment ID to the end of the current fragment_id_queue if
219
+ # it isn't already contained in it.
220
+ fragment_id_queue = [*self._rerun_data.fragment_id_queue]
221
+
222
+ if new_data.fragment_id not in fragment_id_queue:
223
+ fragment_id_queue.append(new_data.fragment_id)
224
+ elif new_data.fragment_id_queue:
225
+ # new_data contains a new fragment_id_queue, so we just use it.
226
+ fragment_id_queue = new_data.fragment_id_queue
227
+ else:
228
+ # Otherwise, this is a request to rerun the full script, so we want
229
+ # to clear out any fragments we have queued to run since they'll all
230
+ # be run with the full script anyway.
231
+ fragment_id_queue = []
232
+
233
+ self._rerun_data = RerunData(
234
+ query_string=new_data.query_string,
235
+ widget_states=coalesced_states,
236
+ page_script_hash=new_data.page_script_hash,
237
+ page_name=new_data.page_name,
238
+ fragment_id_queue=fragment_id_queue,
239
+ is_fragment_scoped_rerun=new_data.is_fragment_scoped_rerun,
240
+ is_auto_rerun=new_data.is_auto_rerun,
241
+ context_info=new_data.context_info,
242
+ )
243
+
244
+ return True
245
+
246
+ # We'll never get here
247
+ raise RuntimeError(f"Unrecognized ScriptRunnerState: {self._state}")
248
+
249
+ def on_scriptrunner_yield(self) -> ScriptRequest | None:
250
+ """Called by the ScriptRunner when it's at a yield point.
251
+
252
+ If we have no request or a RERUN request corresponding to one or more fragments
253
+ (that is not a fragment-scoped rerun), return None.
254
+
255
+ If we have a (full script or fragment-scoped) RERUN request, return the request
256
+ and set our internal state to CONTINUE.
257
+
258
+ If we have a STOP request, return the request and remain stopped.
259
+ """
260
+ if self._state == ScriptRequestType.CONTINUE or (
261
+ self._state == ScriptRequestType.RERUN
262
+ and _fragment_run_should_not_preempt_script(
263
+ self._rerun_data.fragment_id_queue,
264
+ self._rerun_data.is_fragment_scoped_rerun,
265
+ )
266
+ ):
267
+ # We avoid taking the lock in the common cases described above. If a STOP or
268
+ # preempting RERUN request is received after we've taken this code path, it
269
+ # will be handled at the next `on_scriptrunner_yield`, or when
270
+ # `on_scriptrunner_ready` is called.
271
+ return None
272
+
273
+ with self._lock:
274
+ if self._state == ScriptRequestType.RERUN:
275
+ # We already made this check in the fast-path above but need to do so
276
+ # again in case our state changed while we were waiting on the lock.
277
+ if _fragment_run_should_not_preempt_script(
278
+ self._rerun_data.fragment_id_queue,
279
+ self._rerun_data.is_fragment_scoped_rerun,
280
+ ):
281
+ return None
282
+
283
+ self._state = ScriptRequestType.CONTINUE
284
+ return ScriptRequest(ScriptRequestType.RERUN, self._rerun_data)
285
+
286
+ assert self._state == ScriptRequestType.STOP
287
+ return ScriptRequest(ScriptRequestType.STOP)
288
+
289
+ def on_scriptrunner_ready(self) -> ScriptRequest:
290
+ """Called by the ScriptRunner when it's about to run its script for
291
+ the first time, and also after its script has successfully completed.
292
+
293
+ If we have a RERUN request, return the request and set
294
+ our internal state to CONTINUE.
295
+
296
+ If we have a STOP request or no request, set our internal state
297
+ to STOP.
298
+ """
299
+ with self._lock:
300
+ if self._state == ScriptRequestType.RERUN:
301
+ self._state = ScriptRequestType.CONTINUE
302
+ return ScriptRequest(ScriptRequestType.RERUN, self._rerun_data)
303
+
304
+ # If we don't have a rerun request, unconditionally change our
305
+ # state to STOP.
306
+ self._state = ScriptRequestType.STOP
307
+ return ScriptRequest(ScriptRequestType.STOP)
@@ -0,0 +1,287 @@
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 collections
18
+ import contextlib
19
+ import contextvars
20
+ import threading
21
+ from collections import Counter
22
+ from dataclasses import dataclass, field
23
+ from typing import (
24
+ TYPE_CHECKING,
25
+ Callable,
26
+ Final,
27
+ Union,
28
+ )
29
+ from urllib import parse
30
+
31
+ from typing_extensions import TypeAlias
32
+
33
+ from streamlit.errors import (
34
+ NoSessionContext,
35
+ StreamlitAPIException,
36
+ StreamlitSetPageConfigMustBeFirstCommandError,
37
+ )
38
+ from streamlit.logger import get_logger
39
+
40
+ if TYPE_CHECKING:
41
+ from pathlib import Path
42
+
43
+ from streamlit.cursor import RunningCursor
44
+ from streamlit.proto.ClientState_pb2 import ContextInfo
45
+ from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
46
+ from streamlit.proto.PageProfile_pb2 import Command
47
+ from streamlit.runtime.fragment import FragmentStorage
48
+ from streamlit.runtime.pages_manager import PagesManager
49
+ from streamlit.runtime.scriptrunner_utils.script_requests import ScriptRequests
50
+ from streamlit.runtime.state import SafeSessionState
51
+ from streamlit.runtime.uploaded_file_manager import UploadedFileManager
52
+ _LOGGER: Final = get_logger(__name__)
53
+
54
+ UserInfo: TypeAlias = dict[str, Union[str, bool, None]]
55
+
56
+
57
+ # If true, it indicates that we are in a cached function that disallows the usage of
58
+ # widgets. Using contextvars to be thread-safe.
59
+ in_cached_function: contextvars.ContextVar[bool] = contextvars.ContextVar(
60
+ "in_cached_function", default=False
61
+ )
62
+
63
+
64
+ @dataclass
65
+ class ScriptRunContext:
66
+ """A context object that contains data for a "script run" - that is,
67
+ data that's scoped to a single ScriptRunner execution (and therefore also
68
+ scoped to a single connected "session").
69
+
70
+ ScriptRunContext is used internally by virtually every `st.foo()` function.
71
+ It is accessed only from the script thread that's created by ScriptRunner,
72
+ or from app-created helper threads that have been "attached" to the
73
+ ScriptRunContext via `add_script_run_ctx`.
74
+
75
+ Streamlit code typically retrieves the active ScriptRunContext via the
76
+ `get_script_run_ctx` function.
77
+ """
78
+
79
+ session_id: str
80
+ _enqueue: Callable[[ForwardMsg], None]
81
+ query_string: str
82
+ session_state: SafeSessionState
83
+ uploaded_file_mgr: UploadedFileManager
84
+ main_script_path: str
85
+ user_info: UserInfo
86
+ fragment_storage: FragmentStorage
87
+ pages_manager: PagesManager
88
+
89
+ context_info: ContextInfo | None = None
90
+ gather_usage_stats: bool = False
91
+ command_tracking_deactivated: bool = False
92
+ tracked_commands: list[Command] = field(default_factory=list)
93
+ tracked_commands_counter: Counter[str] = field(default_factory=collections.Counter)
94
+ _set_page_config_allowed: bool = True
95
+ _has_script_started: bool = False
96
+ widget_ids_this_run: set[str] = field(default_factory=set)
97
+ widget_user_keys_this_run: set[str] = field(default_factory=set)
98
+ form_ids_this_run: set[str] = field(default_factory=set)
99
+ cursors: dict[int, RunningCursor] = field(default_factory=dict)
100
+ script_requests: ScriptRequests | None = None
101
+ current_fragment_id: str | None = None
102
+ fragment_ids_this_run: list[str] | None = None
103
+ new_fragment_ids: set[str] = field(default_factory=set)
104
+ _active_script_hash: str = ""
105
+ # we allow only one dialog to be open at the same time
106
+ has_dialog_opened: bool = False
107
+
108
+ # TODO(willhuang1997): Remove this variable when experimental query params are removed
109
+ _experimental_query_params_used = False
110
+ _production_query_params_used = False
111
+
112
+ @property
113
+ def page_script_hash(self):
114
+ return self.pages_manager.current_page_script_hash
115
+
116
+ @property
117
+ def active_script_hash(self):
118
+ return self._active_script_hash
119
+
120
+ @property
121
+ def main_script_parent(self) -> Path:
122
+ return self.pages_manager.main_script_parent
123
+
124
+ @contextlib.contextmanager
125
+ def run_with_active_hash(self, page_hash: str):
126
+ original_page_hash = self._active_script_hash
127
+ self._active_script_hash = page_hash
128
+ try:
129
+ yield
130
+ finally:
131
+ # in the event of any exception, ensure we set the active hash back
132
+ self._active_script_hash = original_page_hash
133
+
134
+ def set_mpa_v2_page(self, page_script_hash: str):
135
+ self._active_script_hash = self.pages_manager.main_script_hash
136
+ self.pages_manager.set_current_page_script_hash(page_script_hash)
137
+
138
+ def reset(
139
+ self,
140
+ query_string: str = "",
141
+ page_script_hash: str = "",
142
+ fragment_ids_this_run: list[str] | None = None,
143
+ context_info: ContextInfo | None = None,
144
+ ) -> None:
145
+ self.cursors = {}
146
+ self.widget_ids_this_run = set()
147
+ self.widget_user_keys_this_run = set()
148
+ self.form_ids_this_run = set()
149
+ self.query_string = query_string
150
+ self.context_info = context_info
151
+ self.pages_manager.set_current_page_script_hash(page_script_hash)
152
+ self._active_script_hash = self.pages_manager.main_script_hash
153
+ # Permit set_page_config when the ScriptRunContext is reused on a rerun
154
+ self._set_page_config_allowed = True
155
+ self._has_script_started = False
156
+ self.command_tracking_deactivated: bool = False
157
+ self.tracked_commands = []
158
+ self.tracked_commands_counter = collections.Counter()
159
+ self.current_fragment_id = None
160
+ self.current_fragment_delta_path: list[int] = []
161
+ self.fragment_ids_this_run = fragment_ids_this_run
162
+ self.new_fragment_ids = set()
163
+ self.has_dialog_opened = False
164
+ in_cached_function.set(False)
165
+
166
+ parsed_query_params = parse.parse_qs(query_string, keep_blank_values=True)
167
+ with self.session_state.query_params() as qp:
168
+ qp.clear_with_no_forward_msg()
169
+ for key, val in parsed_query_params.items():
170
+ if len(val) == 0:
171
+ qp.set_with_no_forward_msg(key, val="")
172
+ elif len(val) == 1:
173
+ qp.set_with_no_forward_msg(key, val=val[-1])
174
+ else:
175
+ qp.set_with_no_forward_msg(key, val)
176
+
177
+ def on_script_start(self) -> None:
178
+ self._has_script_started = True
179
+
180
+ def enqueue(self, msg: ForwardMsg) -> None:
181
+ """Enqueue a ForwardMsg for this context's session."""
182
+ if msg.HasField("page_config_changed") and not self._set_page_config_allowed:
183
+ raise StreamlitSetPageConfigMustBeFirstCommandError()
184
+
185
+ # We want to disallow set_page config if one of the following occurs:
186
+ # - set_page_config was called on this message
187
+ # - The script has already started and a different st call occurs (a delta)
188
+ if msg.HasField("page_config_changed") or (
189
+ msg.HasField("delta") and self._has_script_started
190
+ ):
191
+ self._set_page_config_allowed = False
192
+
193
+ msg.metadata.active_script_hash = self.active_script_hash
194
+
195
+ # Pass the message up to our associated ScriptRunner.
196
+ self._enqueue(msg)
197
+
198
+ def ensure_single_query_api_used(self):
199
+ if self._experimental_query_params_used and self._production_query_params_used:
200
+ raise StreamlitAPIException(
201
+ "Using `st.query_params` together with either `st.experimental_get_query_params` "
202
+ "or `st.experimental_set_query_params` is not supported. Please convert your app "
203
+ "to only use `st.query_params`"
204
+ )
205
+
206
+ def mark_experimental_query_params_used(self):
207
+ self._experimental_query_params_used = True
208
+ self.ensure_single_query_api_used()
209
+
210
+ def mark_production_query_params_used(self):
211
+ self._production_query_params_used = True
212
+ self.ensure_single_query_api_used()
213
+
214
+
215
+ SCRIPT_RUN_CONTEXT_ATTR_NAME: Final = "streamlit_script_run_ctx"
216
+
217
+
218
+ def add_script_run_ctx(
219
+ thread: threading.Thread | None = None, ctx: ScriptRunContext | None = None
220
+ ):
221
+ """Adds the current ScriptRunContext to a newly-created thread.
222
+
223
+ This should be called from this thread's parent thread,
224
+ before the new thread starts.
225
+
226
+ Parameters
227
+ ----------
228
+ thread : threading.Thread
229
+ The thread to attach the current ScriptRunContext to.
230
+ ctx : ScriptRunContext or None
231
+ The ScriptRunContext to add, or None to use the current thread's
232
+ ScriptRunContext.
233
+
234
+ Returns
235
+ -------
236
+ threading.Thread
237
+ The same thread that was passed in, for chaining.
238
+
239
+ """
240
+ if thread is None:
241
+ thread = threading.current_thread()
242
+ if ctx is None:
243
+ ctx = get_script_run_ctx()
244
+ if ctx is not None:
245
+ setattr(thread, SCRIPT_RUN_CONTEXT_ATTR_NAME, ctx)
246
+ return thread
247
+
248
+
249
+ def get_script_run_ctx(suppress_warning: bool = False) -> ScriptRunContext | None:
250
+ """
251
+ Parameters
252
+ ----------
253
+ suppress_warning : bool
254
+ If True, don't log a warning if there's no ScriptRunContext.
255
+ Returns
256
+ -------
257
+ ScriptRunContext | None
258
+ The current thread's ScriptRunContext, or None if it doesn't have one.
259
+
260
+ """
261
+ thread = threading.current_thread()
262
+ ctx: ScriptRunContext | None = getattr(thread, SCRIPT_RUN_CONTEXT_ATTR_NAME, None)
263
+ if ctx is None and not suppress_warning:
264
+ # Only warn about a missing ScriptRunContext if suppress_warning is False, and
265
+ # we were started via `streamlit run`. Otherwise, the user is likely running a
266
+ # script "bare", and doesn't need to be warned about streamlit
267
+ # bits that are irrelevant when not connected to a session.
268
+ _LOGGER.warning(
269
+ "Thread '%s': missing ScriptRunContext! This warning can be ignored when "
270
+ "running in bare mode.",
271
+ thread.name,
272
+ )
273
+
274
+ return ctx
275
+
276
+
277
+ def enqueue_message(msg: ForwardMsg) -> None:
278
+ """Enqueues a ForwardMsg proto to send to the app."""
279
+ ctx = get_script_run_ctx()
280
+
281
+ if ctx is None:
282
+ raise NoSessionContext()
283
+
284
+ if ctx.current_fragment_id and msg.WhichOneof("type") == "delta":
285
+ msg.delta.fragment_id = ctx.current_fragment_id
286
+
287
+ ctx.enqueue(msg)