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,205 @@
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 collections.abc import Iterable, Iterator, MutableMapping
18
+ from dataclasses import dataclass, field
19
+ from typing import TYPE_CHECKING, Final
20
+ from urllib import parse
21
+
22
+ from streamlit.errors import StreamlitAPIException
23
+ from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
24
+ from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
25
+
26
+ if TYPE_CHECKING:
27
+ from _typeshed import SupportsKeysAndGetItem
28
+
29
+
30
+ EMBED_QUERY_PARAM: Final[str] = "embed"
31
+ EMBED_OPTIONS_QUERY_PARAM: Final[str] = "embed_options"
32
+ EMBED_QUERY_PARAMS_KEYS: Final[list[str]] = [
33
+ EMBED_QUERY_PARAM,
34
+ EMBED_OPTIONS_QUERY_PARAM,
35
+ ]
36
+
37
+
38
+ @dataclass
39
+ class QueryParams(MutableMapping[str, str]):
40
+ """A lightweight wrapper of a dict that sends forwardMsgs when state changes.
41
+ It stores str keys with str and List[str] values.
42
+ """
43
+
44
+ _query_params: dict[str, list[str] | str] = field(default_factory=dict)
45
+
46
+ def __iter__(self) -> Iterator[str]:
47
+ self._ensure_single_query_api_used()
48
+
49
+ return iter(
50
+ key
51
+ for key in self._query_params.keys()
52
+ if key not in EMBED_QUERY_PARAMS_KEYS
53
+ )
54
+
55
+ def __getitem__(self, key: str) -> str:
56
+ """Retrieves a value for a given key in query parameters.
57
+ Returns the last item in a list or an empty string if empty.
58
+ If the key is not present, raise KeyError.
59
+ """
60
+ self._ensure_single_query_api_used()
61
+ try:
62
+ if key in EMBED_QUERY_PARAMS_KEYS:
63
+ raise KeyError(missing_key_error_message(key))
64
+ value = self._query_params[key]
65
+ if isinstance(value, list):
66
+ if len(value) == 0:
67
+ return ""
68
+ else:
69
+ # Return the last value to mimic Tornado's behavior
70
+ # https://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.get_query_argument
71
+ return value[-1]
72
+ return value
73
+ except KeyError:
74
+ raise KeyError(missing_key_error_message(key))
75
+
76
+ def __setitem__(self, key: str, value: str | Iterable[str]) -> None:
77
+ self._ensure_single_query_api_used()
78
+ self.__set_item_internal(key, value)
79
+ self._send_query_param_msg()
80
+
81
+ def __set_item_internal(self, key: str, value: str | Iterable[str]) -> None:
82
+ if isinstance(value, dict):
83
+ raise StreamlitAPIException(
84
+ f"You cannot set a query params key `{key}` to a dictionary."
85
+ )
86
+
87
+ if key in EMBED_QUERY_PARAMS_KEYS:
88
+ raise StreamlitAPIException(
89
+ "Query param embed and embed_options (case-insensitive) cannot be set programmatically."
90
+ )
91
+ # Type checking users should handle the string serialization themselves
92
+ # We will accept any type for the list and serialize to str just in case
93
+ if isinstance(value, Iterable) and not isinstance(value, str):
94
+ self._query_params[key] = [str(item) for item in value]
95
+ else:
96
+ self._query_params[key] = str(value)
97
+
98
+ def __delitem__(self, key: str) -> None:
99
+ self._ensure_single_query_api_used()
100
+ try:
101
+ if key in EMBED_QUERY_PARAMS_KEYS:
102
+ raise KeyError(missing_key_error_message(key))
103
+ del self._query_params[key]
104
+ self._send_query_param_msg()
105
+ except KeyError:
106
+ raise KeyError(missing_key_error_message(key))
107
+
108
+ def update(
109
+ self,
110
+ other: Iterable[tuple[str, str | Iterable[str]]]
111
+ | SupportsKeysAndGetItem[str, str | Iterable[str]] = (),
112
+ /,
113
+ **kwds: str,
114
+ ):
115
+ # This overrides the `update` provided by MutableMapping
116
+ # to ensure only one one ForwardMsg is sent.
117
+ self._ensure_single_query_api_used()
118
+ if hasattr(other, "keys") and hasattr(other, "__getitem__"):
119
+ for key in other.keys():
120
+ self.__set_item_internal(key, other[key])
121
+ else:
122
+ for key, value in other:
123
+ self.__set_item_internal(key, value)
124
+ for key, value in kwds.items():
125
+ self.__set_item_internal(key, value)
126
+ self._send_query_param_msg()
127
+
128
+ def get_all(self, key: str) -> list[str]:
129
+ self._ensure_single_query_api_used()
130
+ if key not in self._query_params or key in EMBED_QUERY_PARAMS_KEYS:
131
+ return []
132
+ value = self._query_params[key]
133
+ return value if isinstance(value, list) else [value]
134
+
135
+ def __len__(self) -> int:
136
+ self._ensure_single_query_api_used()
137
+ return len(
138
+ {key for key in self._query_params if key not in EMBED_QUERY_PARAMS_KEYS}
139
+ )
140
+
141
+ def __str__(self) -> str:
142
+ self._ensure_single_query_api_used()
143
+ return str(self._query_params)
144
+
145
+ def _send_query_param_msg(self) -> None:
146
+ ctx = get_script_run_ctx()
147
+ if ctx is None:
148
+ return
149
+ self._ensure_single_query_api_used()
150
+
151
+ msg = ForwardMsg()
152
+ msg.page_info_changed.query_string = parse.urlencode(
153
+ self._query_params, doseq=True
154
+ )
155
+ ctx.query_string = msg.page_info_changed.query_string
156
+ ctx.enqueue(msg)
157
+
158
+ def clear(self) -> None:
159
+ self._ensure_single_query_api_used()
160
+ self.clear_with_no_forward_msg(preserve_embed=True)
161
+ self._send_query_param_msg()
162
+
163
+ def to_dict(self) -> dict[str, str]:
164
+ self._ensure_single_query_api_used()
165
+ # return the last query param if multiple values are set
166
+ return {
167
+ key: self[key]
168
+ for key in self._query_params
169
+ if key not in EMBED_QUERY_PARAMS_KEYS
170
+ }
171
+
172
+ def from_dict(
173
+ self,
174
+ _dict: Iterable[tuple[str, str | Iterable[str]]]
175
+ | SupportsKeysAndGetItem[str, str | Iterable[str]],
176
+ ):
177
+ self._ensure_single_query_api_used()
178
+ old_value = self._query_params.copy()
179
+ self.clear_with_no_forward_msg(preserve_embed=True)
180
+ try:
181
+ self.update(_dict)
182
+ except StreamlitAPIException:
183
+ # restore the original from before we made any changes.
184
+ self._query_params = old_value
185
+ raise
186
+
187
+ def set_with_no_forward_msg(self, key: str, val: list[str] | str) -> None:
188
+ self._query_params[key] = val
189
+
190
+ def clear_with_no_forward_msg(self, preserve_embed: bool = False) -> None:
191
+ self._query_params = {
192
+ key: value
193
+ for key, value in self._query_params.items()
194
+ if key in EMBED_QUERY_PARAMS_KEYS and preserve_embed
195
+ }
196
+
197
+ def _ensure_single_query_api_used(self):
198
+ ctx = get_script_run_ctx()
199
+ if ctx is None:
200
+ return
201
+ ctx.mark_production_query_params_used()
202
+
203
+
204
+ def missing_key_error_message(key: str) -> str:
205
+ return f'st.query_params has no key "{key}".'
@@ -0,0 +1,218 @@
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 collections.abc import Iterable, Iterator, MutableMapping
18
+ from typing import TYPE_CHECKING, overload
19
+
20
+ from streamlit.runtime.metrics_util import gather_metrics
21
+ from streamlit.runtime.state.session_state_proxy import get_session_state
22
+
23
+ if TYPE_CHECKING:
24
+ from _typeshed import SupportsKeysAndGetItem
25
+
26
+
27
+ class QueryParamsProxy(MutableMapping[str, str]):
28
+ """
29
+ A stateless singleton that proxies ``st.query_params`` interactions
30
+ to the current script thread's QueryParams instance.
31
+ """
32
+
33
+ def __iter__(self) -> Iterator[str]:
34
+ with get_session_state().query_params() as qp:
35
+ return iter(qp)
36
+
37
+ def __len__(self) -> int:
38
+ with get_session_state().query_params() as qp:
39
+ return len(qp)
40
+
41
+ def __str__(self) -> str:
42
+ with get_session_state().query_params() as qp:
43
+ return str(qp)
44
+
45
+ @gather_metrics("query_params.get_item")
46
+ def __getitem__(self, key: str) -> str:
47
+ with get_session_state().query_params() as qp:
48
+ try:
49
+ return qp[key]
50
+ except KeyError:
51
+ raise KeyError(self.missing_key_error_message(key))
52
+
53
+ def __delitem__(self, key: str) -> None:
54
+ with get_session_state().query_params() as qp:
55
+ del qp[key]
56
+
57
+ @gather_metrics("query_params.set_item")
58
+ def __setitem__(self, key: str, value: str | Iterable[str]) -> None:
59
+ with get_session_state().query_params() as qp:
60
+ qp[key] = value
61
+
62
+ @gather_metrics("query_params.get_attr")
63
+ def __getattr__(self, key: str) -> str:
64
+ with get_session_state().query_params() as qp:
65
+ try:
66
+ return qp[key]
67
+ except KeyError:
68
+ raise AttributeError(self.missing_attr_error_message(key))
69
+
70
+ def __delattr__(self, key: str) -> None:
71
+ with get_session_state().query_params() as qp:
72
+ try:
73
+ del qp[key]
74
+ except KeyError:
75
+ raise AttributeError(self.missing_key_error_message(key))
76
+
77
+ @overload
78
+ def update(
79
+ self, mapping: SupportsKeysAndGetItem[str, str | Iterable[str]], /, **kwds: str
80
+ ) -> None: ...
81
+
82
+ @overload
83
+ def update(
84
+ self, keys_and_values: Iterable[tuple[str, str | Iterable[str]]], /, **kwds: str
85
+ ) -> None: ...
86
+
87
+ @overload
88
+ def update(self, **kwds: str | Iterable[str]) -> None: ...
89
+
90
+ def update(self, other=(), /, **kwds):
91
+ """
92
+ Update one or more values in query_params at once from a dictionary or
93
+ dictionary-like object.
94
+
95
+ See `Mapping.update()` from Python's `collections` library.
96
+
97
+ Parameters
98
+ ----------
99
+ other: SupportsKeysAndGetItem[str, str] | Iterable[tuple[str, str]]
100
+ A dictionary or mapping of strings to strings.
101
+ **kwds: str
102
+ Additional key/value pairs to update passed as keyword arguments.
103
+ """
104
+ with get_session_state().query_params() as qp:
105
+ qp.update(other, **kwds)
106
+
107
+ @gather_metrics("query_params.set_attr")
108
+ def __setattr__(self, key: str, value: str | Iterable[str]) -> None:
109
+ with get_session_state().query_params() as qp:
110
+ qp[key] = value
111
+
112
+ @gather_metrics("query_params.get_all")
113
+ def get_all(self, key: str) -> list[str]:
114
+ """
115
+ Get a list of all query parameter values associated to a given key.
116
+
117
+ When a key is repeated as a query parameter within the URL, this method
118
+ allows all values to be obtained. In contrast, dict-like methods only
119
+ retrieve the last value when a key is repeated in the URL.
120
+
121
+ Parameters
122
+ ----------
123
+ key: str
124
+ The label of the query parameter in the URL.
125
+
126
+ Returns
127
+ -------
128
+ List[str]
129
+ A list of values associated to the given key. May return zero, one,
130
+ or multiple values.
131
+ """
132
+ with get_session_state().query_params() as qp:
133
+ return qp.get_all(key)
134
+
135
+ @gather_metrics("query_params.clear")
136
+ def clear(self) -> None:
137
+ """
138
+ Clear all query parameters from the URL of the app.
139
+
140
+ Returns
141
+ -------
142
+ None
143
+ """
144
+ with get_session_state().query_params() as qp:
145
+ qp.clear()
146
+
147
+ @gather_metrics("query_params.to_dict")
148
+ def to_dict(self) -> dict[str, str]:
149
+ """
150
+ Get all query parameters as a dictionary.
151
+
152
+ This method primarily exists for internal use and is not needed for
153
+ most cases. ``st.query_params`` returns an object that inherits from
154
+ ``dict`` by default.
155
+
156
+ When a key is repeated as a query parameter within the URL, this method
157
+ will return only the last value of each unique key.
158
+
159
+ Returns
160
+ -------
161
+ Dict[str,str]
162
+ A dictionary of the current query paramters in the app's URL.
163
+ """
164
+ with get_session_state().query_params() as qp:
165
+ return qp.to_dict()
166
+
167
+ @overload
168
+ def from_dict(
169
+ self, keys_and_values: Iterable[tuple[str, str | Iterable[str]]]
170
+ ) -> None: ...
171
+
172
+ @overload
173
+ def from_dict(
174
+ self, mapping: SupportsKeysAndGetItem[str, str | Iterable[str]]
175
+ ) -> None: ...
176
+
177
+ @gather_metrics("query_params.from_dict")
178
+ def from_dict(self, params):
179
+ """
180
+ Set all of the query parameters from a dictionary or dictionary-like object.
181
+
182
+ This method primarily exists for advanced users who want to control
183
+ multiple query parameters in a single update. To set individual query
184
+ parameters, use key or attribute notation instead.
185
+
186
+ This method inherits limitations from ``st.query_params`` and can't be
187
+ used to set embedding options as described in `Embed your app \
188
+ <https://docs.streamlit.io/deploy/streamlit-community-cloud/share-your-app/embed-your-app#embed-options>`_.
189
+
190
+ To handle repeated keys, the value in a key-value pair should be a list.
191
+
192
+ .. note::
193
+ ``.from_dict()`` is not a direct inverse of ``.to_dict()`` if
194
+ you are working with repeated keys. A true inverse operation is
195
+ ``{key: st.query_params.get_all(key) for key in st.query_params}``.
196
+
197
+ Parameters
198
+ ----------
199
+ params: dict
200
+ A dictionary used to replace the current query parameters.
201
+
202
+ Example
203
+ -------
204
+ >>> import streamlit as st
205
+ >>>
206
+ >>> st.query_params.from_dict({"foo": "bar", "baz": [1, "two"]})
207
+
208
+ """
209
+ with get_session_state().query_params() as qp:
210
+ return qp.from_dict(params)
211
+
212
+ @staticmethod
213
+ def missing_key_error_message(key: str) -> str:
214
+ return f'st.query_params has no key "{key}".'
215
+
216
+ @staticmethod
217
+ def missing_attr_error_message(key: str) -> str:
218
+ return f'st.query_params has no attribute "{key}".'
@@ -0,0 +1,138 @@
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 contextlib import contextmanager
19
+ from typing import TYPE_CHECKING, Any, Callable
20
+
21
+ if TYPE_CHECKING:
22
+ from collections.abc import Iterator
23
+
24
+ from streamlit.proto.WidgetStates_pb2 import WidgetState as WidgetStateProto
25
+ from streamlit.proto.WidgetStates_pb2 import WidgetStates as WidgetStatesProto
26
+ from streamlit.runtime.state.common import RegisterWidgetResult, T, WidgetMetadata
27
+ from streamlit.runtime.state.query_params import QueryParams
28
+ from streamlit.runtime.state.session_state import SessionState
29
+
30
+
31
+ class SafeSessionState:
32
+ """Thread-safe wrapper around SessionState.
33
+
34
+ When AppSession gets a re-run request, it can interrupt its existing
35
+ ScriptRunner and spin up a new ScriptRunner to handle the request.
36
+ When this happens, the existing ScriptRunner will continue executing
37
+ its script until it reaches a yield point - but during this time, it
38
+ must not mutate its SessionState.
39
+ """
40
+
41
+ _state: SessionState
42
+ _lock: threading.RLock
43
+ _yield_callback: Callable[[], None]
44
+
45
+ def __init__(self, state: SessionState, yield_callback: Callable[[], None]):
46
+ # Fields must be set using the object's setattr method to avoid
47
+ # infinite recursion from trying to look up the fields we're setting.
48
+ object.__setattr__(self, "_state", state)
49
+ # TODO: we'd prefer this be a threading.Lock instead of RLock -
50
+ # but `call_callbacks` first needs to be rewritten.
51
+ object.__setattr__(self, "_lock", threading.RLock())
52
+ object.__setattr__(self, "_yield_callback", yield_callback)
53
+
54
+ def register_widget(
55
+ self, metadata: WidgetMetadata[T], user_key: str | None
56
+ ) -> RegisterWidgetResult[T]:
57
+ self._yield_callback()
58
+ with self._lock:
59
+ return self._state.register_widget(metadata, user_key)
60
+
61
+ def on_script_will_rerun(self, latest_widget_states: WidgetStatesProto) -> None:
62
+ self._yield_callback()
63
+ with self._lock:
64
+ # TODO: rewrite this to copy the callbacks list into a local
65
+ # variable so that we don't need to hold our lock for the
66
+ # duration. (This will also allow us to downgrade our RLock
67
+ # to a Lock.)
68
+ self._state.on_script_will_rerun(latest_widget_states)
69
+
70
+ def on_script_finished(self, widget_ids_this_run: set[str]) -> None:
71
+ with self._lock:
72
+ self._state.on_script_finished(widget_ids_this_run)
73
+
74
+ def maybe_check_serializable(self) -> None:
75
+ with self._lock:
76
+ self._state.maybe_check_serializable()
77
+
78
+ def get_widget_states(self) -> list[WidgetStateProto]:
79
+ """Return a list of serialized widget values for each widget with a value."""
80
+ with self._lock:
81
+ return self._state.get_widget_states()
82
+
83
+ def is_new_state_value(self, user_key: str) -> bool:
84
+ with self._lock:
85
+ return self._state.is_new_state_value(user_key)
86
+
87
+ @property
88
+ def filtered_state(self) -> dict[str, Any]:
89
+ """The combined session and widget state, excluding keyless widgets."""
90
+ with self._lock:
91
+ return self._state.filtered_state
92
+
93
+ def __getitem__(self, key: str) -> Any:
94
+ self._yield_callback()
95
+ with self._lock:
96
+ return self._state[key]
97
+
98
+ def __setitem__(self, key: str, value: Any) -> None:
99
+ self._yield_callback()
100
+ with self._lock:
101
+ self._state[key] = value
102
+
103
+ def __delitem__(self, key: str) -> None:
104
+ self._yield_callback()
105
+ with self._lock:
106
+ del self._state[key]
107
+
108
+ def __contains__(self, key: str) -> bool:
109
+ self._yield_callback()
110
+ with self._lock:
111
+ return key in self._state
112
+
113
+ def __getattr__(self, key: str) -> Any:
114
+ try:
115
+ return self[key]
116
+ except KeyError:
117
+ raise AttributeError(f"{key} not found in session_state.")
118
+
119
+ def __setattr__(self, key: str, value: Any) -> None:
120
+ self[key] = value
121
+
122
+ def __delattr__(self, key: str) -> None:
123
+ try:
124
+ del self[key]
125
+ except KeyError:
126
+ raise AttributeError(f"{key} not found in session_state.")
127
+
128
+ def __repr__(self):
129
+ """Presents itself as a simple dict of the underlying SessionState instance"""
130
+ kv = ((k, self._state[k]) for k in self._state._keys())
131
+ s = ", ".join(f"{k}: {v!r}" for k, v in kv)
132
+ return f"{{{s}}}"
133
+
134
+ @contextmanager
135
+ def query_params(self) -> Iterator[QueryParams]:
136
+ self._yield_callback()
137
+ with self._lock:
138
+ yield self._state.query_params