streamlit-data-editor-plus 0.1.0__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 (456) hide show
  1. streamlit/__init__.py +292 -0
  2. streamlit/__main__.py +20 -0
  3. streamlit/auth_util.py +583 -0
  4. streamlit/cli_util.py +107 -0
  5. streamlit/column_config.py +60 -0
  6. streamlit/commands/__init__.py +13 -0
  7. streamlit/commands/echo.py +128 -0
  8. streamlit/commands/execution_control.py +318 -0
  9. streamlit/commands/logo.py +250 -0
  10. streamlit/commands/navigation.py +430 -0
  11. streamlit/commands/page_config.py +335 -0
  12. streamlit/components/__init__.py +13 -0
  13. streamlit/components/lib/__init__.py +13 -0
  14. streamlit/components/lib/local_component_registry.py +84 -0
  15. streamlit/components/types/__init__.py +13 -0
  16. streamlit/components/types/base_component_registry.py +99 -0
  17. streamlit/components/types/base_custom_component.py +158 -0
  18. streamlit/components/v1/__init__.py +29 -0
  19. streamlit/components/v1/component_arrow.py +141 -0
  20. streamlit/components/v1/component_registry.py +147 -0
  21. streamlit/components/v1/components.py +38 -0
  22. streamlit/components/v1/custom_component.py +239 -0
  23. streamlit/components/v2/__init__.py +531 -0
  24. streamlit/components/v2/bidi_component/__init__.py +20 -0
  25. streamlit/components/v2/bidi_component/constants.py +29 -0
  26. streamlit/components/v2/bidi_component/main.py +537 -0
  27. streamlit/components/v2/bidi_component/serialization.py +272 -0
  28. streamlit/components/v2/bidi_component/state.py +92 -0
  29. streamlit/components/v2/component_definition_resolver.py +143 -0
  30. streamlit/components/v2/component_file_watcher.py +403 -0
  31. streamlit/components/v2/component_manager.py +439 -0
  32. streamlit/components/v2/component_manifest_handler.py +122 -0
  33. streamlit/components/v2/component_path_utils.py +233 -0
  34. streamlit/components/v2/component_registry.py +426 -0
  35. streamlit/components/v2/get_bidi_component_manager.py +51 -0
  36. streamlit/components/v2/manifest_scanner.py +620 -0
  37. streamlit/components/v2/presentation.py +198 -0
  38. streamlit/components/v2/types.py +317 -0
  39. streamlit/config.py +2977 -0
  40. streamlit/config_option.py +319 -0
  41. streamlit/config_util.py +887 -0
  42. streamlit/connections/__init__.py +32 -0
  43. streamlit/connections/base_connection.py +215 -0
  44. streamlit/connections/snowflake_connection.py +765 -0
  45. streamlit/connections/snowpark_connection.py +213 -0
  46. streamlit/connections/sql_connection.py +427 -0
  47. streamlit/connections/util.py +97 -0
  48. streamlit/cursor.py +314 -0
  49. streamlit/dataframe_util.py +1434 -0
  50. streamlit/delta_generator.py +696 -0
  51. streamlit/delta_generator_singletons.py +243 -0
  52. streamlit/deprecation_util.py +253 -0
  53. streamlit/development.py +21 -0
  54. streamlit/elements/__init__.py +13 -0
  55. streamlit/elements/alert.py +341 -0
  56. streamlit/elements/arrow.py +1065 -0
  57. streamlit/elements/balloons.py +47 -0
  58. streamlit/elements/bokeh_chart.py +75 -0
  59. streamlit/elements/code.py +154 -0
  60. streamlit/elements/deck_gl_json_chart.py +627 -0
  61. streamlit/elements/dialog_decorator.py +320 -0
  62. streamlit/elements/empty.py +130 -0
  63. streamlit/elements/exception.py +370 -0
  64. streamlit/elements/form.py +481 -0
  65. streamlit/elements/graphviz_chart.py +226 -0
  66. streamlit/elements/heading.py +407 -0
  67. streamlit/elements/help.py +565 -0
  68. streamlit/elements/html.py +189 -0
  69. streamlit/elements/iframe.py +245 -0
  70. streamlit/elements/image.py +221 -0
  71. streamlit/elements/json.py +171 -0
  72. streamlit/elements/layouts.py +1534 -0
  73. streamlit/elements/lib/__init__.py +13 -0
  74. streamlit/elements/lib/built_in_chart_utils.py +1316 -0
  75. streamlit/elements/lib/color_util.py +272 -0
  76. streamlit/elements/lib/column_config_utils.py +555 -0
  77. streamlit/elements/lib/column_types.py +2699 -0
  78. streamlit/elements/lib/dialog.py +212 -0
  79. streamlit/elements/lib/dicttools.py +152 -0
  80. streamlit/elements/lib/file_uploader_utils.py +91 -0
  81. streamlit/elements/lib/form_utils.py +77 -0
  82. streamlit/elements/lib/image_utils.py +447 -0
  83. streamlit/elements/lib/js_number.py +105 -0
  84. streamlit/elements/lib/layout_utils.py +325 -0
  85. streamlit/elements/lib/mutable_expander_container.py +73 -0
  86. streamlit/elements/lib/mutable_popover_container.py +73 -0
  87. streamlit/elements/lib/mutable_status_container.py +194 -0
  88. streamlit/elements/lib/mutable_tab_container.py +73 -0
  89. streamlit/elements/lib/options_selector_utils.py +480 -0
  90. streamlit/elements/lib/pandas_styler_utils.py +302 -0
  91. streamlit/elements/lib/policies.py +198 -0
  92. streamlit/elements/lib/shortcut_utils.py +152 -0
  93. streamlit/elements/lib/streamlit_plotly_theme.py +206 -0
  94. streamlit/elements/lib/subtitle_utils.py +175 -0
  95. streamlit/elements/lib/utils.py +274 -0
  96. streamlit/elements/map.py +526 -0
  97. streamlit/elements/markdown.py +529 -0
  98. streamlit/elements/media.py +843 -0
  99. streamlit/elements/metric.py +529 -0
  100. streamlit/elements/pdf.py +190 -0
  101. streamlit/elements/plotly_chart.py +779 -0
  102. streamlit/elements/progress.py +172 -0
  103. streamlit/elements/pyplot.py +240 -0
  104. streamlit/elements/snow.py +47 -0
  105. streamlit/elements/space.py +121 -0
  106. streamlit/elements/spinner.py +152 -0
  107. streamlit/elements/table.py +240 -0
  108. streamlit/elements/text.py +113 -0
  109. streamlit/elements/toast.py +175 -0
  110. streamlit/elements/vega_charts.py +2510 -0
  111. streamlit/elements/widgets/__init__.py +13 -0
  112. streamlit/elements/widgets/audio_input.py +334 -0
  113. streamlit/elements/widgets/button.py +1559 -0
  114. streamlit/elements/widgets/button_group.py +1061 -0
  115. streamlit/elements/widgets/camera_input.py +281 -0
  116. streamlit/elements/widgets/chat.py +1028 -0
  117. streamlit/elements/widgets/checkbox.py +420 -0
  118. streamlit/elements/widgets/color_picker.py +329 -0
  119. streamlit/elements/widgets/data_editor.py +1168 -0
  120. streamlit/elements/widgets/data_editor_plus.py +902 -0
  121. streamlit/elements/widgets/feedback.py +322 -0
  122. streamlit/elements/widgets/file_uploader.py +592 -0
  123. streamlit/elements/widgets/multiselect.py +654 -0
  124. streamlit/elements/widgets/number_input.py +719 -0
  125. streamlit/elements/widgets/radio.py +551 -0
  126. streamlit/elements/widgets/select_slider.py +568 -0
  127. streamlit/elements/widgets/selectbox.py +680 -0
  128. streamlit/elements/widgets/slider.py +1093 -0
  129. streamlit/elements/widgets/text_widgets.py +779 -0
  130. streamlit/elements/widgets/time_widgets.py +1712 -0
  131. streamlit/elements/write.py +585 -0
  132. streamlit/emojis.py +34 -0
  133. streamlit/env_util.py +56 -0
  134. streamlit/error_util.py +112 -0
  135. streamlit/errors.py +680 -0
  136. streamlit/external/__init__.py +13 -0
  137. streamlit/external/langchain/__init__.py +23 -0
  138. streamlit/external/langchain/streamlit_callback_handler.py +410 -0
  139. streamlit/file_util.py +266 -0
  140. streamlit/git_util.py +200 -0
  141. streamlit/hello/__init__.py +13 -0
  142. streamlit/hello/__pycache__/__init__.cpython-312.pyc +0 -0
  143. streamlit/hello/__pycache__/streamlit_app.cpython-312.pyc +0 -0
  144. streamlit/hello/animation_demo.py +82 -0
  145. streamlit/hello/dataframe_demo.py +71 -0
  146. streamlit/hello/hello.py +46 -0
  147. streamlit/hello/mapping_demo.py +113 -0
  148. streamlit/hello/plotting_demo.py +62 -0
  149. streamlit/hello/streamlit_app.py +57 -0
  150. streamlit/hello/utils.py +30 -0
  151. streamlit/logger.py +129 -0
  152. streamlit/material_icon_names.py +25 -0
  153. streamlit/navigation/__init__.py +13 -0
  154. streamlit/navigation/page.py +365 -0
  155. streamlit/net_util.py +125 -0
  156. streamlit/path_security.py +98 -0
  157. streamlit/platform.py +31 -0
  158. streamlit/proto/Alert_pb2.py +28 -0
  159. streamlit/proto/Alert_pb2.pyi +100 -0
  160. streamlit/proto/AppPage_pb2.py +25 -0
  161. streamlit/proto/AppPage_pb2.pyi +75 -0
  162. streamlit/proto/ArrowData_pb2.py +27 -0
  163. streamlit/proto/ArrowData_pb2.pyi +103 -0
  164. streamlit/proto/ArrowNamedDataSet_pb2.py +26 -0
  165. streamlit/proto/ArrowNamedDataSet_pb2.pyi +65 -0
  166. streamlit/proto/AudioInput_pb2.py +26 -0
  167. streamlit/proto/AudioInput_pb2.pyi +72 -0
  168. streamlit/proto/Audio_pb2.py +26 -0
  169. streamlit/proto/Audio_pb2.pyi +75 -0
  170. streamlit/proto/AuthRedirect_pb2.py +25 -0
  171. streamlit/proto/AuthRedirect_pb2.pyi +48 -0
  172. streamlit/proto/AutoRerun_pb2.py +25 -0
  173. streamlit/proto/AutoRerun_pb2.pyi +52 -0
  174. streamlit/proto/BackMsg_pb2.py +29 -0
  175. streamlit/proto/BackMsg_pb2.pyi +132 -0
  176. streamlit/proto/Balloons_pb2.py +25 -0
  177. streamlit/proto/Balloons_pb2.pyi +48 -0
  178. streamlit/proto/BidiComponent_pb2.py +32 -0
  179. streamlit/proto/BidiComponent_pb2.pyi +176 -0
  180. streamlit/proto/Block_pb2.py +62 -0
  181. streamlit/proto/Block_pb2.pyi +518 -0
  182. streamlit/proto/ButtonGroup_pb2.py +32 -0
  183. streamlit/proto/ButtonGroup_pb2.pyi +157 -0
  184. streamlit/proto/ButtonLikeIconPosition_pb2.py +25 -0
  185. streamlit/proto/ButtonLikeIconPosition_pb2.pyi +47 -0
  186. streamlit/proto/Button_pb2.py +26 -0
  187. streamlit/proto/Button_pb2.pyi +82 -0
  188. streamlit/proto/CameraInput_pb2.py +26 -0
  189. streamlit/proto/CameraInput_pb2.pyi +66 -0
  190. streamlit/proto/ChatInput_pb2.py +27 -0
  191. streamlit/proto/ChatInput_pb2.pyi +113 -0
  192. streamlit/proto/Checkbox_pb2.py +28 -0
  193. streamlit/proto/Checkbox_pb2.pyi +99 -0
  194. streamlit/proto/ClientState_pb2.py +28 -0
  195. streamlit/proto/ClientState_pb2.pyi +137 -0
  196. streamlit/proto/Code_pb2.py +25 -0
  197. streamlit/proto/Code_pb2.pyi +59 -0
  198. streamlit/proto/ColorPicker_pb2.py +26 -0
  199. streamlit/proto/ColorPicker_pb2.pyi +82 -0
  200. streamlit/proto/Common_pb2.py +49 -0
  201. streamlit/proto/Common_pb2.pyi +325 -0
  202. streamlit/proto/Components_pb2.py +33 -0
  203. streamlit/proto/Components_pb2.pyi +196 -0
  204. streamlit/proto/Dataframe_pb2.py +30 -0
  205. streamlit/proto/Dataframe_pb2.pyi +172 -0
  206. streamlit/proto/DateInput_pb2.py +26 -0
  207. streamlit/proto/DateInput_pb2.pyi +91 -0
  208. streamlit/proto/DateTimeInput_pb2.py +26 -0
  209. streamlit/proto/DateTimeInput_pb2.pyi +94 -0
  210. streamlit/proto/DeckGlJsonChart_pb2.py +27 -0
  211. streamlit/proto/DeckGlJsonChart_pb2.pyi +91 -0
  212. streamlit/proto/Delta_pb2.py +29 -0
  213. streamlit/proto/Delta_pb2.pyi +82 -0
  214. streamlit/proto/DownloadButton_pb2.py +26 -0
  215. streamlit/proto/DownloadButton_pb2.pyi +92 -0
  216. streamlit/proto/Element_pb2.py +81 -0
  217. streamlit/proto/Element_pb2.pyi +348 -0
  218. streamlit/proto/Empty_pb2.py +25 -0
  219. streamlit/proto/Empty_pb2.pyi +42 -0
  220. streamlit/proto/Exception_pb2.py +26 -0
  221. streamlit/proto/Exception_pb2.pyi +88 -0
  222. streamlit/proto/Favicon_pb2.py +25 -0
  223. streamlit/proto/Favicon_pb2.pyi +47 -0
  224. streamlit/proto/Feedback_pb2.py +27 -0
  225. streamlit/proto/Feedback_pb2.pyi +93 -0
  226. streamlit/proto/FileUploader_pb2.py +26 -0
  227. streamlit/proto/FileUploader_pb2.pyi +90 -0
  228. streamlit/proto/ForwardMsg_pb2.py +48 -0
  229. streamlit/proto/ForwardMsg_pb2.pyi +296 -0
  230. streamlit/proto/GapSize_pb2.py +27 -0
  231. streamlit/proto/GapSize_pb2.pyi +82 -0
  232. streamlit/proto/GitInfo_pb2.py +27 -0
  233. streamlit/proto/GitInfo_pb2.pyi +84 -0
  234. streamlit/proto/GraphVizChart_pb2.py +25 -0
  235. streamlit/proto/GraphVizChart_pb2.pyi +56 -0
  236. streamlit/proto/Heading_pb2.py +25 -0
  237. streamlit/proto/Heading_pb2.pyi +63 -0
  238. streamlit/proto/HeightConfig_pb2.py +25 -0
  239. streamlit/proto/HeightConfig_pb2.pyi +61 -0
  240. streamlit/proto/Help_pb2.py +27 -0
  241. streamlit/proto/Help_pb2.pyi +104 -0
  242. streamlit/proto/Html_pb2.py +25 -0
  243. streamlit/proto/Html_pb2.pyi +52 -0
  244. streamlit/proto/IFrame_pb2.py +25 -0
  245. streamlit/proto/IFrame_pb2.pyi +68 -0
  246. streamlit/proto/Image_pb2.py +27 -0
  247. streamlit/proto/Image_pb2.pyi +73 -0
  248. streamlit/proto/Json_pb2.py +25 -0
  249. streamlit/proto/Json_pb2.pyi +63 -0
  250. streamlit/proto/LabelVisibility_pb2.py +27 -0
  251. streamlit/proto/LabelVisibility_pb2.pyi +69 -0
  252. streamlit/proto/LinkButton_pb2.py +26 -0
  253. streamlit/proto/LinkButton_pb2.pyi +76 -0
  254. streamlit/proto/Logo_pb2.py +27 -0
  255. streamlit/proto/Logo_pb2.pyi +82 -0
  256. streamlit/proto/Markdown_pb2.py +27 -0
  257. streamlit/proto/Markdown_pb2.pyi +83 -0
  258. streamlit/proto/Metric_pb2.py +32 -0
  259. streamlit/proto/Metric_pb2.pyi +145 -0
  260. streamlit/proto/MetricsEvent_pb2.py +28 -0
  261. streamlit/proto/MetricsEvent_pb2.pyi +224 -0
  262. streamlit/proto/MultiSelect_pb2.py +26 -0
  263. streamlit/proto/MultiSelect_pb2.pyi +108 -0
  264. streamlit/proto/Navigation_pb2.py +28 -0
  265. streamlit/proto/Navigation_pb2.pyi +89 -0
  266. streamlit/proto/NewSession_pb2.py +47 -0
  267. streamlit/proto/NewSession_pb2.pyi +753 -0
  268. streamlit/proto/NumberInput_pb2.py +28 -0
  269. streamlit/proto/NumberInput_pb2.pyi +138 -0
  270. streamlit/proto/PageConfig_pb2.py +33 -0
  271. streamlit/proto/PageConfig_pb2.pyi +179 -0
  272. streamlit/proto/PageInfo_pb2.py +25 -0
  273. streamlit/proto/PageInfo_pb2.pyi +50 -0
  274. streamlit/proto/PageLink_pb2.py +26 -0
  275. streamlit/proto/PageLink_pb2.pyi +80 -0
  276. streamlit/proto/PageNotFound_pb2.py +25 -0
  277. streamlit/proto/PageNotFound_pb2.pyi +49 -0
  278. streamlit/proto/PageProfile_pb2.py +29 -0
  279. streamlit/proto/PageProfile_pb2.pyi +146 -0
  280. streamlit/proto/ParentMessage_pb2.py +25 -0
  281. streamlit/proto/ParentMessage_pb2.pyi +53 -0
  282. streamlit/proto/PlotlyChart_pb2.py +27 -0
  283. streamlit/proto/PlotlyChart_pb2.pyi +96 -0
  284. streamlit/proto/Progress_pb2.py +25 -0
  285. streamlit/proto/Progress_pb2.pyi +50 -0
  286. streamlit/proto/Radio_pb2.py +26 -0
  287. streamlit/proto/Radio_pb2.pyi +104 -0
  288. streamlit/proto/RootContainer_pb2.py +25 -0
  289. streamlit/proto/RootContainer_pb2.pyi +56 -0
  290. streamlit/proto/Selectbox_pb2.py +26 -0
  291. streamlit/proto/Selectbox_pb2.pyi +107 -0
  292. streamlit/proto/SessionEvent_pb2.py +26 -0
  293. streamlit/proto/SessionEvent_pb2.pyi +72 -0
  294. streamlit/proto/SessionStatus_pb2.py +25 -0
  295. streamlit/proto/SessionStatus_pb2.pyi +64 -0
  296. streamlit/proto/Skeleton_pb2.py +27 -0
  297. streamlit/proto/Skeleton_pb2.pyi +75 -0
  298. streamlit/proto/Slider_pb2.py +30 -0
  299. streamlit/proto/Slider_pb2.pyi +161 -0
  300. streamlit/proto/Snow_pb2.py +25 -0
  301. streamlit/proto/Snow_pb2.pyi +48 -0
  302. streamlit/proto/Space_pb2.py +25 -0
  303. streamlit/proto/Space_pb2.pyi +48 -0
  304. streamlit/proto/Spinner_pb2.py +25 -0
  305. streamlit/proto/Spinner_pb2.pyi +56 -0
  306. streamlit/proto/Table_pb2.py +28 -0
  307. streamlit/proto/Table_pb2.pyi +83 -0
  308. streamlit/proto/TextAlignmentConfig_pb2.py +27 -0
  309. streamlit/proto/TextAlignmentConfig_pb2.pyi +69 -0
  310. streamlit/proto/TextArea_pb2.py +26 -0
  311. streamlit/proto/TextArea_pb2.pyi +97 -0
  312. streamlit/proto/TextInput_pb2.py +28 -0
  313. streamlit/proto/TextInput_pb2.pyi +124 -0
  314. streamlit/proto/Text_pb2.py +25 -0
  315. streamlit/proto/Text_pb2.pyi +53 -0
  316. streamlit/proto/TimeInput_pb2.py +26 -0
  317. streamlit/proto/TimeInput_pb2.pyi +86 -0
  318. streamlit/proto/Toast_pb2.py +25 -0
  319. streamlit/proto/Toast_pb2.pyi +64 -0
  320. streamlit/proto/Transient_pb2.py +26 -0
  321. streamlit/proto/Transient_pb2.pyi +53 -0
  322. streamlit/proto/VegaLiteChart_pb2.py +27 -0
  323. streamlit/proto/VegaLiteChart_pb2.pyi +92 -0
  324. streamlit/proto/Video_pb2.py +30 -0
  325. streamlit/proto/Video_pb2.pyi +129 -0
  326. streamlit/proto/WidgetStates_pb2.py +31 -0
  327. streamlit/proto/WidgetStates_pb2.pyi +157 -0
  328. streamlit/proto/WidthConfig_pb2.py +25 -0
  329. streamlit/proto/WidthConfig_pb2.pyi +61 -0
  330. streamlit/proto/__init__.py +15 -0
  331. streamlit/proto/openmetrics_data_model_pb2.py +58 -0
  332. streamlit/proto/openmetrics_data_model_pb2.pyi +558 -0
  333. streamlit/py.typed +0 -0
  334. streamlit/runtime/__init__.py +50 -0
  335. streamlit/runtime/app_session.py +1302 -0
  336. streamlit/runtime/caching/__init__.py +118 -0
  337. streamlit/runtime/caching/cache_data_api.py +775 -0
  338. streamlit/runtime/caching/cache_errors.py +143 -0
  339. streamlit/runtime/caching/cache_resource_api.py +756 -0
  340. streamlit/runtime/caching/cache_type.py +33 -0
  341. streamlit/runtime/caching/cache_utils.py +601 -0
  342. streamlit/runtime/caching/cached_message_replay.py +290 -0
  343. streamlit/runtime/caching/hashing.py +655 -0
  344. streamlit/runtime/caching/legacy_cache_api.py +170 -0
  345. streamlit/runtime/caching/storage/__init__.py +29 -0
  346. streamlit/runtime/caching/storage/cache_storage_protocol.py +236 -0
  347. streamlit/runtime/caching/storage/dummy_cache_storage.py +60 -0
  348. streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +159 -0
  349. streamlit/runtime/caching/storage/local_disk_cache_storage.py +223 -0
  350. streamlit/runtime/caching/ttl_cleanup_cache.py +85 -0
  351. streamlit/runtime/connection_factory.py +498 -0
  352. streamlit/runtime/context.py +449 -0
  353. streamlit/runtime/context_util.py +49 -0
  354. streamlit/runtime/credentials.py +355 -0
  355. streamlit/runtime/download_data_util.py +53 -0
  356. streamlit/runtime/forward_msg_cache.py +101 -0
  357. streamlit/runtime/forward_msg_queue.py +263 -0
  358. streamlit/runtime/fragment.py +441 -0
  359. streamlit/runtime/media_file_manager.py +409 -0
  360. streamlit/runtime/media_file_storage.py +143 -0
  361. streamlit/runtime/memory_media_file_storage.py +201 -0
  362. streamlit/runtime/memory_session_storage.py +77 -0
  363. streamlit/runtime/memory_uploaded_file_manager.py +149 -0
  364. streamlit/runtime/metrics_util.py +612 -0
  365. streamlit/runtime/pages_manager.py +160 -0
  366. streamlit/runtime/runtime.py +775 -0
  367. streamlit/runtime/runtime_util.py +108 -0
  368. streamlit/runtime/script_data.py +46 -0
  369. streamlit/runtime/scriptrunner/__init__.py +38 -0
  370. streamlit/runtime/scriptrunner/exec_code.py +167 -0
  371. streamlit/runtime/scriptrunner/magic.py +277 -0
  372. streamlit/runtime/scriptrunner/magic_funcs.py +32 -0
  373. streamlit/runtime/scriptrunner/script_cache.py +89 -0
  374. streamlit/runtime/scriptrunner/script_runner.py +805 -0
  375. streamlit/runtime/scriptrunner_utils/__init__.py +19 -0
  376. streamlit/runtime/scriptrunner_utils/exceptions.py +44 -0
  377. streamlit/runtime/scriptrunner_utils/script_requests.py +311 -0
  378. streamlit/runtime/scriptrunner_utils/script_run_context.py +277 -0
  379. streamlit/runtime/secrets.py +533 -0
  380. streamlit/runtime/session_manager.py +430 -0
  381. streamlit/runtime/state/__init__.py +47 -0
  382. streamlit/runtime/state/common.py +256 -0
  383. streamlit/runtime/state/presentation.py +85 -0
  384. streamlit/runtime/state/query_params.py +767 -0
  385. streamlit/runtime/state/query_params_proxy.py +222 -0
  386. streamlit/runtime/state/safe_session_state.py +146 -0
  387. streamlit/runtime/state/session_state.py +1299 -0
  388. streamlit/runtime/state/session_state_proxy.py +153 -0
  389. streamlit/runtime/state/widgets.py +197 -0
  390. streamlit/runtime/stats.py +356 -0
  391. streamlit/runtime/theme_util.py +148 -0
  392. streamlit/runtime/uploaded_file_manager.py +152 -0
  393. streamlit/runtime/websocket_session_manager.py +301 -0
  394. streamlit/source_util.py +97 -0
  395. streamlit/starlette.py +34 -0
  396. streamlit/string_util.py +264 -0
  397. streamlit/temporary_directory.py +67 -0
  398. streamlit/testing/__init__.py +13 -0
  399. streamlit/testing/v1/__init__.py +17 -0
  400. streamlit/testing/v1/app_test.py +1089 -0
  401. streamlit/testing/v1/element_tree.py +2272 -0
  402. streamlit/testing/v1/local_script_runner.py +176 -0
  403. streamlit/testing/v1/util.py +61 -0
  404. streamlit/time_util.py +73 -0
  405. streamlit/type_util.py +480 -0
  406. streamlit/url_util.py +120 -0
  407. streamlit/user_info.py +698 -0
  408. streamlit/util.py +108 -0
  409. streamlit/vendor/__init__.py +0 -0
  410. streamlit/vendor/pympler/__init__.py +0 -0
  411. streamlit/vendor/pympler/asizeof.py +2870 -0
  412. streamlit/version.py +18 -0
  413. streamlit/watcher/__init__.py +28 -0
  414. streamlit/watcher/event_based_path_watcher.py +500 -0
  415. streamlit/watcher/folder_black_list.py +82 -0
  416. streamlit/watcher/local_sources_watcher.py +297 -0
  417. streamlit/watcher/path_watcher.py +244 -0
  418. streamlit/watcher/polling_path_watcher.py +138 -0
  419. streamlit/watcher/util.py +223 -0
  420. streamlit/web/__init__.py +13 -0
  421. streamlit/web/bootstrap.py +463 -0
  422. streamlit/web/cache_storage_manager_config.py +38 -0
  423. streamlit/web/cli.py +465 -0
  424. streamlit/web/server/__init__.py +30 -0
  425. streamlit/web/server/app_discovery.py +422 -0
  426. streamlit/web/server/app_static_file_handler.py +102 -0
  427. streamlit/web/server/authlib_tornado_integration.py +125 -0
  428. streamlit/web/server/bidi_component_request_handler.py +193 -0
  429. streamlit/web/server/browser_websocket_handler.py +341 -0
  430. streamlit/web/server/component_file_utils.py +105 -0
  431. streamlit/web/server/component_request_handler.py +107 -0
  432. streamlit/web/server/media_file_handler.py +148 -0
  433. streamlit/web/server/oauth_authlib_routes.py +314 -0
  434. streamlit/web/server/oidc_mixin.py +138 -0
  435. streamlit/web/server/routes.py +257 -0
  436. streamlit/web/server/server.py +555 -0
  437. streamlit/web/server/server_util.py +235 -0
  438. streamlit/web/server/starlette/__init__.py +23 -0
  439. streamlit/web/server/starlette/starlette_app.py +541 -0
  440. streamlit/web/server/starlette/starlette_app_utils.py +306 -0
  441. streamlit/web/server/starlette/starlette_auth_routes.py +584 -0
  442. streamlit/web/server/starlette/starlette_gzip_middleware.py +121 -0
  443. streamlit/web/server/starlette/starlette_path_security_middleware.py +97 -0
  444. streamlit/web/server/starlette/starlette_routes.py +884 -0
  445. streamlit/web/server/starlette/starlette_server.py +496 -0
  446. streamlit/web/server/starlette/starlette_server_config.py +55 -0
  447. streamlit/web/server/starlette/starlette_static_routes.py +181 -0
  448. streamlit/web/server/starlette/starlette_websocket.py +560 -0
  449. streamlit/web/server/stats_request_handler.py +116 -0
  450. streamlit/web/server/upload_file_request_handler.py +158 -0
  451. streamlit/web/server/websocket_headers.py +56 -0
  452. streamlit_data_editor_plus-0.1.0.dist-info/METADATA +76 -0
  453. streamlit_data_editor_plus-0.1.0.dist-info/RECORD +456 -0
  454. streamlit_data_editor_plus-0.1.0.dist-info/WHEEL +5 -0
  455. streamlit_data_editor_plus-0.1.0.dist-info/entry_points.txt +2 -0
  456. streamlit_data_editor_plus-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,60 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2026)
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
+ """Column types that can be configured via the ``column_config`` parameter of
16
+ ``st.dataframe`` and ``st.data_editor``.
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ __all__ = [
22
+ "AreaChartColumn",
23
+ "BarChartColumn",
24
+ "CheckboxColumn",
25
+ "Column",
26
+ "DateColumn",
27
+ "DatetimeColumn",
28
+ "ImageColumn",
29
+ "JsonColumn",
30
+ "LineChartColumn",
31
+ "LinkColumn",
32
+ "ListColumn",
33
+ "MultiselectColumn",
34
+ "NumberColumn",
35
+ "ProgressColumn",
36
+ "SelectboxColumn",
37
+ "TextColumn",
38
+ "TimeColumn",
39
+ ]
40
+
41
+
42
+ from streamlit.elements.lib.column_types import (
43
+ AreaChartColumn,
44
+ BarChartColumn,
45
+ CheckboxColumn,
46
+ Column,
47
+ DateColumn,
48
+ DatetimeColumn,
49
+ ImageColumn,
50
+ JsonColumn,
51
+ LineChartColumn,
52
+ LinkColumn,
53
+ ListColumn,
54
+ MultiselectColumn,
55
+ NumberColumn,
56
+ ProgressColumn,
57
+ SelectboxColumn,
58
+ TextColumn,
59
+ TimeColumn,
60
+ )
@@ -0,0 +1,13 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2026)
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.
@@ -0,0 +1,128 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2026)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ import ast
18
+ import contextlib
19
+ import re
20
+ import textwrap
21
+ import traceback
22
+ from typing import TYPE_CHECKING, Any, Literal, cast
23
+
24
+ from streamlit.runtime.metrics_util import gather_metrics
25
+
26
+ if TYPE_CHECKING:
27
+ from collections.abc import Generator, Iterable
28
+
29
+ _SPACES_RE = re.compile(r"\s*")
30
+ _EMPTY_LINE_RE = re.compile(r"\s*\n")
31
+
32
+
33
+ @gather_metrics("echo")
34
+ @contextlib.contextmanager
35
+ def echo(
36
+ code_location: Literal["above", "below"] = "above",
37
+ ) -> Generator[None, None, None]:
38
+ """Use in a `with` block to draw some code on the app, then execute it.
39
+
40
+ Parameters
41
+ ----------
42
+ code_location : "above" or "below"
43
+ Whether to show the echoed code before or after the results of the
44
+ executed code block.
45
+
46
+ Example
47
+ -------
48
+ >>> import streamlit as st
49
+ >>>
50
+ >>> with st.echo():
51
+ >>> st.write('This code will be printed')
52
+
53
+ """
54
+ from streamlit import code, empty, source_util, warning
55
+
56
+ if code_location == "below":
57
+ show_code = code
58
+ show_warning = warning
59
+ else:
60
+ placeholder = empty()
61
+ show_code = placeholder.code
62
+ show_warning = placeholder.warning
63
+
64
+ try:
65
+ # Get stack frame *before* running the echoed code. The frame's
66
+ # line number will point to the `st.echo` statement we're running.
67
+ frame = traceback.extract_stack()[-3]
68
+ filename, start_line = frame.filename, frame.lineno or 0
69
+
70
+ # Read the file containing the source code of the echoed statement.
71
+ with source_util.open_python_file(filename) as source_file:
72
+ source_lines = source_file.readlines()
73
+
74
+ # Use ast to parse the Python file and find the code block to display
75
+ root_node = ast.parse("".join(source_lines))
76
+ line_to_node_map: dict[int, Any] = {}
77
+
78
+ def collect_body_statements(node: ast.AST) -> None:
79
+ if not hasattr(node, "body"):
80
+ return
81
+ for child in ast.iter_child_nodes(node):
82
+ # If child doesn't have "lineno", it is not something we could display
83
+ if hasattr(child, "lineno"):
84
+ line_to_node_map[cast("int", child.lineno)] = child
85
+ collect_body_statements(child)
86
+
87
+ collect_body_statements(root_node)
88
+
89
+ # In AST module the lineno (line numbers) are 1-indexed,
90
+ # so we decrease it by 1 to lookup in source lines list
91
+ echo_block_start_line = line_to_node_map[start_line].body[0].lineno - 1
92
+ echo_block_end_line = line_to_node_map[start_line].end_lineno
93
+ lines_to_display = source_lines[echo_block_start_line:echo_block_end_line]
94
+
95
+ code_string = textwrap.dedent("".join(lines_to_display))
96
+
97
+ # Run the echoed code...
98
+ yield
99
+
100
+ # And draw the code string to the app!
101
+ show_code(code_string, "python")
102
+
103
+ except FileNotFoundError as err:
104
+ show_warning(f"Unable to display code. {err}")
105
+
106
+
107
+ def _get_initial_indent(lines: Iterable[str]) -> int:
108
+ """Return the indent of the first non-empty line in the list.
109
+ If all lines are empty, return 0.
110
+ """
111
+ for line in lines:
112
+ indent = _get_indent(line)
113
+ if indent is not None:
114
+ return indent
115
+
116
+ return 0
117
+
118
+
119
+ def _get_indent(line: str) -> int | None:
120
+ """Get the number of whitespaces at the beginning of the given line.
121
+ If the line is empty, or if it contains just whitespace and a newline,
122
+ return None.
123
+ """
124
+ if _EMPTY_LINE_RE.match(line) is not None:
125
+ return None
126
+
127
+ match = _SPACES_RE.match(line)
128
+ return match.end() if match is not None else 0
@@ -0,0 +1,318 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2026)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ import os
18
+ import time
19
+ from collections.abc import Iterable, Mapping
20
+ from itertools import dropwhile
21
+ from pathlib import Path
22
+ from typing import TYPE_CHECKING, Literal, NoReturn
23
+
24
+ import streamlit as st
25
+ from streamlit.errors import NoSessionContext, StreamlitAPIException
26
+ from streamlit.file_util import get_main_script_directory, normalize_path_join
27
+ from streamlit.navigation.page import StreamlitPage
28
+ from streamlit.runtime.metrics_util import gather_metrics
29
+ from streamlit.runtime.scriptrunner import (
30
+ RerunData,
31
+ ScriptRunContext,
32
+ get_script_run_ctx,
33
+ )
34
+
35
+ if TYPE_CHECKING:
36
+ from streamlit.runtime.state.query_params import QueryParams, QueryParamsInput
37
+
38
+
39
+ @gather_metrics("stop")
40
+ def stop() -> NoReturn: # type: ignore[misc]
41
+ """Stops execution immediately.
42
+
43
+ Streamlit will not run any statements after `st.stop()`.
44
+ We recommend rendering a message to explain why the script has stopped.
45
+
46
+ Example
47
+ -------
48
+ >>> import streamlit as st
49
+ >>>
50
+ >>> name = st.text_input("Name")
51
+ >>> if not name:
52
+ >>> st.warning('Please input a name.')
53
+ >>> st.stop()
54
+ >>> st.success("Thank you for inputting a name.")
55
+
56
+ """
57
+ ctx = get_script_run_ctx()
58
+
59
+ if ctx and ctx.script_requests:
60
+ ctx.script_requests.request_stop()
61
+ # Force a yield point so the runner can stop
62
+ st.empty()
63
+
64
+
65
+ def _new_fragment_id_queue(
66
+ ctx: ScriptRunContext,
67
+ scope: Literal["app", "fragment"],
68
+ ) -> list[str]:
69
+ if scope == "app":
70
+ return []
71
+
72
+ # > scope == "fragment"
73
+ curr_queue = ctx.fragment_ids_this_run
74
+
75
+ # If st.rerun(scope="fragment") is called during a full script run, we raise an
76
+ # exception. This occurs, of course, if st.rerun(scope="fragment") is called
77
+ # outside of a fragment, but it somewhat surprisingly occurs if it gets called
78
+ # from within a fragment during a run of the full script. While this behavior may
79
+ # be surprising, it seems somewhat reasonable given that the correct behavior of
80
+ # calling st.rerun(scope="fragment") in this situation is unclear to me:
81
+ # * Rerunning just the fragment immediately may cause weirdness down the line
82
+ # as any part of the script that occurs after the fragment will not be
83
+ # executed.
84
+ # * Waiting until the full script run completes before rerunning the fragment
85
+ # seems odd (even if we normally do this before running a fragment not
86
+ # triggered by st.rerun()) because it defers the execution of st.rerun().
87
+ # * Rerunning the full app feels incorrect as we're seemingly ignoring the
88
+ # `scope` argument.
89
+ # With these issues and given that it seems pretty unnatural to have a
90
+ # fragment-scoped rerun happen during a full script run to begin with, it seems
91
+ # reasonable to just disallow this completely for now.
92
+ if not curr_queue:
93
+ raise StreamlitAPIException(
94
+ 'scope="fragment" can only be specified from `@st.fragment`-decorated '
95
+ "functions during fragment reruns."
96
+ )
97
+
98
+ new_queue = list(dropwhile(lambda x: x != ctx.current_fragment_id, curr_queue))
99
+ if not new_queue:
100
+ raise RuntimeError(
101
+ "Could not find current_fragment_id in fragment_id_queue. This should never happen."
102
+ )
103
+
104
+ return new_queue
105
+
106
+
107
+ def _set_query_params_for_switch(
108
+ query_params_state: QueryParams,
109
+ new_query_params: QueryParamsInput | None,
110
+ ) -> None:
111
+ """Set query params for a switch page."""
112
+
113
+ if new_query_params is None:
114
+ query_params_state.clear()
115
+ return
116
+
117
+ if isinstance(new_query_params, Mapping) or (
118
+ isinstance(new_query_params, Iterable)
119
+ and not isinstance(
120
+ new_query_params, # type: ignore[unreachable]
121
+ (str, bytes),
122
+ )
123
+ ):
124
+ query_params_state.from_dict(new_query_params)
125
+ return
126
+
127
+ raise StreamlitAPIException(
128
+ f"`query_params` must be a mapping or an iterable of (key, value) pairs not a `{type(new_query_params)}`."
129
+ )
130
+
131
+
132
+ @gather_metrics("rerun")
133
+ def rerun( # type: ignore[misc]
134
+ *, # The scope argument can only be passed via keyword.
135
+ scope: Literal["app", "fragment"] = "app",
136
+ ) -> NoReturn: # ty: ignore[invalid-return-type]
137
+ """Rerun the script immediately.
138
+
139
+ When ``st.rerun()`` is called, Streamlit halts the current script run and
140
+ executes no further statements. Streamlit immediately queues the script to
141
+ rerun.
142
+
143
+ When using ``st.rerun`` in a fragment, you can scope the rerun to the
144
+ fragment. However, if a fragment is running as part of a full-app rerun,
145
+ a fragment-scoped rerun is not allowed.
146
+
147
+ Parameters
148
+ ----------
149
+ scope : "app" or "fragment"
150
+ Specifies what part of the app should rerun. If ``scope`` is ``"app"``
151
+ (default), the full app reruns. If ``scope`` is ``"fragment"``,
152
+ Streamlit only reruns the fragment from which this command is called.
153
+
154
+ Setting ``scope="fragment"`` is only valid inside a fragment during a
155
+ fragment rerun. If ``st.rerun(scope="fragment")`` is called during a
156
+ full-app rerun or outside of a fragment, Streamlit will raise a
157
+ ``StreamlitAPIException``.
158
+
159
+ """
160
+
161
+ if scope not in {"app", "fragment"}:
162
+ raise StreamlitAPIException(
163
+ f"'{scope}'is not a valid rerun scope. Valid scopes are 'app' and 'fragment'."
164
+ )
165
+
166
+ ctx = get_script_run_ctx()
167
+
168
+ if ctx and ctx.script_requests:
169
+ query_string = ctx.query_string
170
+ page_script_hash = ctx.page_script_hash
171
+ cached_message_hashes = ctx.cached_message_hashes
172
+
173
+ ctx.script_requests.request_rerun(
174
+ RerunData(
175
+ query_string=query_string,
176
+ page_script_hash=page_script_hash,
177
+ fragment_id_queue=_new_fragment_id_queue(ctx, scope),
178
+ is_fragment_scoped_rerun=scope == "fragment",
179
+ cached_message_hashes=cached_message_hashes,
180
+ context_info=ctx.context_info,
181
+ )
182
+ )
183
+ # Force a yield point so the runner can do the rerun
184
+ st.empty()
185
+
186
+
187
+ @gather_metrics("switch_page")
188
+ def switch_page( # type: ignore[misc]
189
+ page: str | Path | StreamlitPage,
190
+ *,
191
+ query_params: QueryParamsInput | None = None,
192
+ ) -> NoReturn: # ty: ignore[invalid-return-type]
193
+ """Programmatically switch the current page in a multipage app.
194
+
195
+ When ``st.switch_page`` is called, the current page execution stops and
196
+ the specified page runs as if the user clicked on it in the sidebar
197
+ navigation. The specified page must be recognized by Streamlit's multipage
198
+ architecture (your main Python file or a Python file in a ``pages/``
199
+ folder). Arbitrary Python scripts cannot be passed to ``st.switch_page``.
200
+
201
+ Parameters
202
+ ----------
203
+ page : str, Path, or st.Page
204
+ The file path (relative to the main script) or an st.Page indicating
205
+ the page to switch to.
206
+
207
+ query_params : dict, list of tuples, or None
208
+ Query parameters to apply when navigating to the target page.
209
+ This can be a dictionary or an iterable of key-value tuples. Values can
210
+ be strings or iterables of strings (for repeated keys). When this is
211
+ ``None`` (default), all non-embed query parameters are cleared during
212
+ navigation.
213
+
214
+ Examples
215
+ --------
216
+ **Example 1: Basic usage**
217
+
218
+ The following example shows how to switch to a different page in a
219
+ multipage app that uses the ``pages/`` directory:
220
+
221
+ .. code-block:: text
222
+
223
+ your-repository/
224
+ ├── pages/
225
+ │ ├── page_1.py
226
+ │ └── page_2.py
227
+ └── your_app.py
228
+
229
+ >>> import streamlit as st
230
+ >>>
231
+ >>> if st.button("Home"):
232
+ >>> st.switch_page("your_app.py")
233
+ >>> if st.button("Page 1"):
234
+ >>> st.switch_page("pages/page_1.py")
235
+ >>> if st.button("Page 2"):
236
+ >>> st.switch_page("pages/page_2.py")
237
+
238
+ .. output::
239
+ https://doc-switch-page.streamlit.app/
240
+ height: 350px
241
+
242
+ **Example 2: Passing query parameters**
243
+
244
+ The following example shows how to pass query parameters when switching to a
245
+ different page. This example uses ``st.navigation`` to create a multipage app.
246
+
247
+ .. code-block:: text
248
+
249
+ your-repository/
250
+ ├── page_2.py
251
+ └── your_app.py
252
+
253
+ >>> import streamlit as st
254
+ >>>
255
+ >>> def page_1():
256
+ >>> st.title("Page 1")
257
+ >>> if st.button("Switch to Page 2"):
258
+ >>> st.switch_page("page_2.py", query_params={"utm_source": "page_1"})
259
+ >>>
260
+ >>> pg = st.navigation([page_1, "page_2.py"])
261
+ >>> pg.run()
262
+
263
+ .. output::
264
+ https://doc-switch-page-query-params.streamlit.app/
265
+ height: 350px
266
+
267
+ """
268
+
269
+ ctx = get_script_run_ctx()
270
+
271
+ if not ctx or not ctx.script_requests:
272
+ # This should never be the case
273
+ raise NoSessionContext()
274
+
275
+ page_script_hash = ""
276
+ if isinstance(page, StreamlitPage):
277
+ page_script_hash = page._script_hash
278
+ else:
279
+ # Convert Path to string if necessary
280
+ if isinstance(page, Path):
281
+ page = str(page)
282
+
283
+ main_script_directory = get_main_script_directory(ctx.main_script_path)
284
+ requested_page = os.path.realpath(
285
+ normalize_path_join(main_script_directory, page)
286
+ )
287
+ all_app_pages = ctx.pages_manager.get_pages().values()
288
+
289
+ matched_pages = [p for p in all_app_pages if p["script_path"] == requested_page]
290
+
291
+ if len(matched_pages) == 0:
292
+ raise StreamlitAPIException(
293
+ f"Could not find page: `{page}`. Must be the file path relative to the main script, "
294
+ f"from the directory: `{os.path.basename(main_script_directory)}`. Only the main app file "
295
+ "and files in the `pages/` directory are supported."
296
+ )
297
+
298
+ page_script_hash = matched_pages[0]["page_script_hash"]
299
+
300
+ # Reset query params (with exception of embed) and optionally apply overrides.
301
+ with ctx.session_state.query_params() as qp:
302
+ _set_query_params_for_switch(qp, query_params)
303
+ # Additional safeguard to ensure the query params
304
+ # are sent out to the frontend before the new rerun might clear
305
+ # outstanding messages. This uses the same time that is used as waiting
306
+ # in our event loop.
307
+ time.sleep(0.01)
308
+
309
+ ctx.script_requests.request_rerun(
310
+ RerunData(
311
+ query_string=ctx.query_string,
312
+ page_script_hash=page_script_hash,
313
+ cached_message_hashes=ctx.cached_message_hashes,
314
+ context_info=ctx.context_info,
315
+ )
316
+ )
317
+ # Force a yield point so the runner can do the rerun
318
+ st.empty()