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,962 @@
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 json
18
+ from dataclasses import dataclass
19
+ from typing import (
20
+ TYPE_CHECKING,
21
+ Any,
22
+ Final,
23
+ Literal,
24
+ TypedDict,
25
+ cast,
26
+ overload,
27
+ )
28
+
29
+ from typing_extensions import TypeAlias
30
+
31
+ from streamlit import dataframe_util
32
+ from streamlit.elements.lib.column_config_utils import (
33
+ INDEX_IDENTIFIER,
34
+ ColumnConfigMappingInput,
35
+ apply_data_specific_configs,
36
+ marshall_column_config,
37
+ process_config_mapping,
38
+ update_column_config,
39
+ )
40
+ from streamlit.elements.lib.event_utils import AttributeDictionary
41
+ from streamlit.elements.lib.form_utils import current_form_id
42
+ from streamlit.elements.lib.pandas_styler_utils import marshall_styler
43
+ from streamlit.elements.lib.policies import check_widget_policies
44
+ from streamlit.elements.lib.utils import Key, compute_and_register_element_id, to_key
45
+ from streamlit.errors import StreamlitAPIException
46
+ from streamlit.proto.Arrow_pb2 import Arrow as ArrowProto
47
+ from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
48
+ from streamlit.runtime.metrics_util import gather_metrics
49
+ from streamlit.runtime.scriptrunner_utils.script_run_context import (
50
+ enqueue_message,
51
+ get_script_run_ctx,
52
+ )
53
+ from streamlit.runtime.state import WidgetCallback, register_widget
54
+
55
+ if TYPE_CHECKING:
56
+ from collections.abc import Hashable, Iterable
57
+
58
+ from numpy import typing as npt
59
+ from pandas import DataFrame
60
+
61
+ from streamlit.dataframe_util import Data
62
+ from streamlit.delta_generator import DeltaGenerator
63
+ from streamlit.elements.lib.built_in_chart_utils import AddRowsMetadata
64
+
65
+
66
+ SelectionMode: TypeAlias = Literal[
67
+ "single-row", "multi-row", "single-column", "multi-column"
68
+ ]
69
+ _SELECTION_MODES: Final[set[SelectionMode]] = {
70
+ "single-row",
71
+ "multi-row",
72
+ "single-column",
73
+ "multi-column",
74
+ }
75
+
76
+
77
+ class DataframeSelectionState(TypedDict, total=False):
78
+ """
79
+ The schema for the dataframe selection state.
80
+
81
+ The selection state is stored in a dictionary-like object that supports both
82
+ key and attribute notation. Selection states cannot be programmatically
83
+ changed or set through Session State.
84
+
85
+ .. warning::
86
+ If a user sorts a dataframe, row selections will be reset. If your
87
+ users need to sort and filter the dataframe to make selections, direct
88
+ them to use the search function in the dataframe toolbar instead.
89
+
90
+ Attributes
91
+ ----------
92
+ rows : list[int]
93
+ The selected rows, identified by their integer position. The integer
94
+ positions match the original dataframe, even if the user sorts the
95
+ dataframe in their browser. For a ``pandas.DataFrame``, you can
96
+ retrieve data from its interger position using methods like ``.iloc[]``
97
+ or ``.iat[]``.
98
+ columns : list[str]
99
+ The selected columns, identified by their names.
100
+
101
+ Example
102
+ -------
103
+ The following example has multi-row and multi-column selections enabled.
104
+ Try selecting some rows. To select multiple columns, hold ``Ctrl`` while
105
+ selecting columns. Hold ``Shift`` to select a range of columns.
106
+
107
+ >>> import streamlit as st
108
+ >>> import pandas as pd
109
+ >>> import numpy as np
110
+ >>>
111
+ >>> if "df" not in st.session_state:
112
+ >>> st.session_state.df = pd.DataFrame(
113
+ ... np.random.randn(12, 5), columns=["a", "b", "c", "d", "e"]
114
+ ... )
115
+ >>>
116
+ >>> event = st.dataframe(
117
+ ... st.session_state.df,
118
+ ... key="data",
119
+ ... on_select="rerun",
120
+ ... selection_mode=["multi-row", "multi-column"],
121
+ ... )
122
+ >>>
123
+ >>> event.selection
124
+
125
+ .. output::
126
+ https://doc-dataframe-events-selection-state.streamlit.app
127
+ height: 600px
128
+
129
+ """
130
+
131
+ rows: list[int]
132
+ columns: list[str]
133
+
134
+
135
+ class DataframeState(TypedDict, total=False):
136
+ """
137
+ The schema for the dataframe event state.
138
+
139
+ The event state is stored in a dictionary-like object that supports both
140
+ key and attribute notation. Event states cannot be programmatically
141
+ changed or set through Session State.
142
+
143
+ Only selection events are supported at this time.
144
+
145
+ Attributes
146
+ ----------
147
+ selection : dict
148
+ The state of the ``on_select`` event. This attribute returns a
149
+ dictionary-like object that supports both key and attribute notation.
150
+ The attributes are described by the ``DataframeSelectionState``
151
+ dictionary schema.
152
+
153
+
154
+ """
155
+
156
+ selection: DataframeSelectionState
157
+
158
+
159
+ @dataclass
160
+ class DataframeSelectionSerde:
161
+ """DataframeSelectionSerde is used to serialize and deserialize the dataframe selection state."""
162
+
163
+ def deserialize(self, ui_value: str | None, widget_id: str = "") -> DataframeState:
164
+ empty_selection_state: DataframeState = {
165
+ "selection": {
166
+ "rows": [],
167
+ "columns": [],
168
+ },
169
+ }
170
+ selection_state: DataframeState = (
171
+ empty_selection_state if ui_value is None else json.loads(ui_value)
172
+ )
173
+
174
+ if "selection" not in selection_state:
175
+ selection_state = empty_selection_state
176
+
177
+ return cast(DataframeState, AttributeDictionary(selection_state))
178
+
179
+ def serialize(self, editing_state: DataframeState) -> str:
180
+ return json.dumps(editing_state, default=str)
181
+
182
+
183
+ def parse_selection_mode(
184
+ selection_mode: SelectionMode | Iterable[SelectionMode],
185
+ ) -> set[ArrowProto.SelectionMode.ValueType]:
186
+ """Parse and check the user provided selection modes."""
187
+ if isinstance(selection_mode, str):
188
+ # Only a single selection mode was passed
189
+ selection_mode_set = {selection_mode}
190
+ else:
191
+ # Multiple selection modes were passed
192
+ selection_mode_set = set(selection_mode)
193
+
194
+ if not selection_mode_set.issubset(_SELECTION_MODES):
195
+ raise StreamlitAPIException(
196
+ f"Invalid selection mode: {selection_mode}. "
197
+ f"Valid options are: {_SELECTION_MODES}"
198
+ )
199
+
200
+ if selection_mode_set.issuperset({"single-row", "multi-row"}):
201
+ raise StreamlitAPIException(
202
+ "Only one of `single-row` or `multi-row` can be selected as selection mode."
203
+ )
204
+
205
+ if selection_mode_set.issuperset({"single-column", "multi-column"}):
206
+ raise StreamlitAPIException(
207
+ "Only one of `single-column` or `multi-column` can be selected as selection mode."
208
+ )
209
+
210
+ parsed_selection_modes = []
211
+ for selection_mode in selection_mode_set:
212
+ if selection_mode == "single-row":
213
+ parsed_selection_modes.append(ArrowProto.SelectionMode.SINGLE_ROW)
214
+ elif selection_mode == "multi-row":
215
+ parsed_selection_modes.append(ArrowProto.SelectionMode.MULTI_ROW)
216
+ elif selection_mode == "single-column":
217
+ parsed_selection_modes.append(ArrowProto.SelectionMode.SINGLE_COLUMN)
218
+ elif selection_mode == "multi-column":
219
+ parsed_selection_modes.append(ArrowProto.SelectionMode.MULTI_COLUMN)
220
+ return set(parsed_selection_modes)
221
+
222
+
223
+ class ArrowMixin:
224
+ @overload
225
+ def dataframe(
226
+ self,
227
+ data: Data = None,
228
+ width: int | None = None,
229
+ height: int | None = None,
230
+ *,
231
+ use_container_width: bool | None = None,
232
+ hide_index: bool | None = None,
233
+ column_order: Iterable[str] | None = None,
234
+ column_config: ColumnConfigMappingInput | None = None,
235
+ key: Key | None = None,
236
+ on_select: Literal["ignore"] = "ignore",
237
+ selection_mode: SelectionMode | Iterable[SelectionMode] = "multi-row",
238
+ row_height: int | None = None,
239
+ ) -> DeltaGenerator: ...
240
+
241
+ @overload
242
+ def dataframe(
243
+ self,
244
+ data: Data = None,
245
+ width: int | None = None,
246
+ height: int | None = None,
247
+ *,
248
+ use_container_width: bool | None = None,
249
+ hide_index: bool | None = None,
250
+ column_order: Iterable[str] | None = None,
251
+ column_config: ColumnConfigMappingInput | None = None,
252
+ key: Key | None = None,
253
+ on_select: Literal["rerun"] | WidgetCallback,
254
+ selection_mode: SelectionMode | Iterable[SelectionMode] = "multi-row",
255
+ row_height: int | None = None,
256
+ ) -> DataframeState: ...
257
+
258
+ @gather_metrics("dataframe")
259
+ def dataframe(
260
+ self,
261
+ data: Data = None,
262
+ width: int | None = None,
263
+ height: int | None = None,
264
+ *,
265
+ use_container_width: bool | None = None,
266
+ hide_index: bool | None = None,
267
+ column_order: Iterable[str] | None = None,
268
+ column_config: ColumnConfigMappingInput | None = None,
269
+ key: Key | None = None,
270
+ on_select: Literal["ignore", "rerun"] | WidgetCallback = "ignore",
271
+ selection_mode: SelectionMode | Iterable[SelectionMode] = "multi-row",
272
+ row_height: int | None = None,
273
+ ) -> DeltaGenerator | DataframeState:
274
+ """Display a dataframe as an interactive table.
275
+
276
+ This command works with a wide variety of collection-like and
277
+ dataframe-like object types.
278
+
279
+ Parameters
280
+ ----------
281
+ data : dataframe-like, collection-like, or None
282
+ The data to display.
283
+
284
+ Dataframe-like objects include dataframe and series objects from
285
+ popular libraries like Dask, Modin, Numpy, pandas, Polars, PyArrow,
286
+ Snowpark, Xarray, and more. You can use database cursors and
287
+ clients that comply with the
288
+ `Python Database API Specification v2.0 (PEP 249)
289
+ <https://peps.python.org/pep-0249/>`_. Additionally, you can use
290
+ anything that supports the `Python dataframe interchange protocol
291
+ <https://data-apis.org/dataframe-protocol/latest/>`_.
292
+
293
+ For example, you can use the following:
294
+
295
+ - ``pandas.DataFrame``, ``pandas.Series``, ``pandas.Index``,
296
+ ``pandas.Styler``, and ``pandas.Array``
297
+ - ``polars.DataFrame``, ``polars.LazyFrame``, and ``polars.Series``
298
+ - ``snowflake.snowpark.dataframe.DataFrame``,
299
+ ``snowflake.snowpark.table.Table``
300
+
301
+ If a data type is not recognized, Streamlit will convert the object
302
+ to a ``pandas.DataFrame`` or ``pyarrow.Table`` using a
303
+ ``.to_pandas()`` or ``.to_arrow()`` method, respectively, if
304
+ available.
305
+
306
+ If ``data`` is a ``pandas.Styler``, it will be used to style its
307
+ underlying ``pandas.DataFrame``. Streamlit supports custom cell
308
+ values and colors. It does not support some of the more exotic
309
+ styling options, like bar charts, hovering, and captions. For
310
+ these styling options, use column configuration instead. Text and
311
+ number formatting from ``column_config`` always takes precedence
312
+ over text and number formatting from ``pandas.Styler``.
313
+
314
+ Collection-like objects include all Python-native ``Collection``
315
+ types, such as ``dict``, ``list``, and ``set``.
316
+
317
+ If ``data`` is ``None``, Streamlit renders an empty table.
318
+
319
+ width : int or None
320
+ Desired width of the dataframe expressed in pixels. If ``width`` is
321
+ ``None`` (default), Streamlit sets the dataframe width to fit its
322
+ contents up to the width of the parent container. If ``width`` is
323
+ greater than the width of the parent container, Streamlit sets the
324
+ dataframe width to match the width of the parent container.
325
+
326
+ height : int or None
327
+ Desired height of the dataframe expressed in pixels. If ``height``
328
+ is ``None`` (default), Streamlit sets the height to show at most
329
+ ten rows. Vertical scrolling within the dataframe element is
330
+ enabled when the height does not accomodate all rows.
331
+
332
+ use_container_width : bool
333
+ Whether to override ``width`` with the width of the parent
334
+ container. If this is ``True`` (default), Streamlit sets the width
335
+ of the dataframe to match the width of the parent container. If
336
+ this is ``False``, Streamlit sets the dataframe's width according
337
+ to ``width``.
338
+
339
+ hide_index : bool or None
340
+ Whether to hide the index column(s). If ``hide_index`` is ``None``
341
+ (default), the visibility of index columns is automatically
342
+ determined based on the data.
343
+
344
+ column_order : Iterable of str or None
345
+ The ordered list of columns to display. If ``column_order`` is
346
+ ``None`` (default), Streamlit displays all columns in the order
347
+ inherited from the underlying data structure. If ``column_order``
348
+ is a list, the indicated columns will display in the order they
349
+ appear within the list. Columns may be omitted or repeated within
350
+ the list.
351
+
352
+ For example, ``column_order=("col2", "col1")`` will display
353
+ ``"col2"`` first, followed by ``"col1"``, and will hide all other
354
+ non-index columns.
355
+
356
+ column_config : dict or None
357
+ Configuration to customize how columns display. If ``column_config``
358
+ is ``None`` (default), columns are styled based on the underlying
359
+ data type of each column.
360
+
361
+ Column configuration can modify column names, visibility, type,
362
+ width, or format, among other things. ``column_config`` must be a
363
+ dictionary where each key is a column name and the associated value
364
+ is one of the following:
365
+
366
+ - ``None``: Streamlit hides the column.
367
+
368
+ - A string: Streamlit changes the display label of the column to
369
+ the given string.
370
+
371
+ - A column type within ``st.column_config``: Streamlit applies the
372
+ defined configuration to the column. For example, use
373
+ ``st.column_config.NumberColumn("Dollar values”, format=”$ %d")``
374
+ to change the displayed name of the column to "Dollar values"
375
+ and add a "$" prefix in each cell. For more info on the
376
+ available column types and config options, see
377
+ `Column configuration <https://docs.streamlit.io/develop/api-reference/data/st.column_config>`_.
378
+
379
+ To configure the index column(s), use ``_index`` as the column name.
380
+
381
+ key : str
382
+ An optional string to use for giving this element a stable
383
+ identity. If ``key`` is ``None`` (default), this element's identity
384
+ will be determined based on the values of the other parameters.
385
+
386
+ Additionally, if selections are activated and ``key`` is provided,
387
+ Streamlit will register the key in Session State to store the
388
+ selection state. The selection state is read-only.
389
+
390
+ on_select : "ignore" or "rerun" or callable
391
+ How the dataframe should respond to user selection events. This
392
+ controls whether or not the dataframe behaves like an input widget.
393
+ ``on_select`` can be one of the following:
394
+
395
+ - ``"ignore"`` (default): Streamlit will not react to any selection
396
+ events in the dataframe. The dataframe will not behave like an
397
+ input widget.
398
+
399
+ - ``"rerun"``: Streamlit will rerun the app when the user selects
400
+ rows or columns in the dataframe. In this case, ``st.dataframe``
401
+ will return the selection data as a dictionary.
402
+
403
+ - A ``callable``: Streamlit will rerun the app and execute the
404
+ ``callable`` as a callback function before the rest of the app.
405
+ In this case, ``st.dataframe`` will return the selection data
406
+ as a dictionary.
407
+
408
+ selection_mode : "single-row", "multi-row", "single-column", \
409
+ "multi-column", or Iterable of these
410
+ The types of selections Streamlit should allow when selections are
411
+ enabled with ``on_select``. This can be one of the following:
412
+
413
+ - "multi-row" (default): Multiple rows can be selected at a time.
414
+ - "single-row": Only one row can be selected at a time.
415
+ - "multi-column": Multiple columns can be selected at a time.
416
+ - "single-column": Only one column can be selected at a time.
417
+ - An ``Iterable`` of the above options: The table will allow
418
+ selection based on the modes specified.
419
+
420
+ When column selections are enabled, column sorting is disabled.
421
+
422
+ row_height : int or None
423
+ The height of each row in the dataframe in pixels. If ``row_height``
424
+ is ``None`` (default), Streamlit will use a default row height,
425
+ which fits one line of text.
426
+
427
+ Returns
428
+ -------
429
+ element or dict
430
+ If ``on_select`` is ``"ignore"`` (default), this command returns an
431
+ internal placeholder for the dataframe element that can be used
432
+ with the ``.add_rows()`` method. Otherwise, this command returns a
433
+ dictionary-like object that supports both key and attribute
434
+ notation. The attributes are described by the ``DataframeState``
435
+ dictionary schema.
436
+
437
+ Examples
438
+ --------
439
+
440
+ **Example 1: Display a dataframe**
441
+
442
+ >>> import streamlit as st
443
+ >>> import pandas as pd
444
+ >>> import numpy as np
445
+ >>>
446
+ >>> df = pd.DataFrame(np.random.randn(50, 20), columns=("col %d" % i for i in range(20)))
447
+ >>>
448
+ >>> st.dataframe(df) # Same as st.write(df)
449
+
450
+ .. output::
451
+ https://doc-dataframe.streamlit.app/
452
+ height: 500px
453
+
454
+ **Example 2: Use Pandas Styler**
455
+
456
+ You can also pass a Pandas Styler object to change the style of
457
+ the rendered DataFrame:
458
+
459
+ >>> import streamlit as st
460
+ >>> import pandas as pd
461
+ >>> import numpy as np
462
+ >>>
463
+ >>> df = pd.DataFrame(np.random.randn(10, 20), columns=("col %d" % i for i in range(20)))
464
+ >>>
465
+ >>> st.dataframe(df.style.highlight_max(axis=0))
466
+
467
+ .. output::
468
+ https://doc-dataframe1.streamlit.app/
469
+ height: 500px
470
+
471
+ **Example 3: Use column configuration**
472
+
473
+ You can customize a dataframe via ``column_config``, ``hide_index``, or ``column_order``.
474
+
475
+ >>> import random
476
+ >>> import pandas as pd
477
+ >>> import streamlit as st
478
+ >>>
479
+ >>> df = pd.DataFrame(
480
+ >>> {
481
+ >>> "name": ["Roadmap", "Extras", "Issues"],
482
+ >>> "url": ["https://roadmap.streamlit.app", "https://extras.streamlit.app", "https://issues.streamlit.app"],
483
+ >>> "stars": [random.randint(0, 1000) for _ in range(3)],
484
+ >>> "views_history": [[random.randint(0, 5000) for _ in range(30)] for _ in range(3)],
485
+ >>> }
486
+ >>> )
487
+ >>> st.dataframe(
488
+ >>> df,
489
+ >>> column_config={
490
+ >>> "name": "App name",
491
+ >>> "stars": st.column_config.NumberColumn(
492
+ >>> "Github Stars",
493
+ >>> help="Number of stars on GitHub",
494
+ >>> format="%d ⭐",
495
+ >>> ),
496
+ >>> "url": st.column_config.LinkColumn("App URL"),
497
+ >>> "views_history": st.column_config.LineChartColumn(
498
+ >>> "Views (past 30 days)", y_min=0, y_max=5000
499
+ >>> ),
500
+ >>> },
501
+ >>> hide_index=True,
502
+ >>> )
503
+
504
+ .. output::
505
+ https://doc-dataframe-config.streamlit.app/
506
+ height: 350px
507
+
508
+ **Example 4: Customize your index**
509
+
510
+ You can use column configuration to format your index.
511
+
512
+ >>> import streamlit as st
513
+ >>> import pandas as pd
514
+ >>> from datetime import date
515
+ >>>
516
+ >>> df = pd.DataFrame(
517
+ >>> {
518
+ >>> "Date": [date(2024, 1, 1), date(2024, 2, 1), date(2024, 3, 1)],
519
+ >>> "Total": [13429, 23564, 23452],
520
+ >>> }
521
+ >>> )
522
+ >>> df.set_index("Date", inplace=True)
523
+ >>>
524
+ >>> config = {
525
+ >>> "_index": st.column_config.DateColumn("Month", format="MMM YYYY"),
526
+ >>> "Total": st.column_config.NumberColumn("Total ($)"),
527
+ >>> }
528
+ >>>
529
+ >>> st.dataframe(df, column_config=config)
530
+
531
+ .. output::
532
+ https://doc-dataframe-config-index.streamlit.app/
533
+ height: 225px
534
+
535
+ """
536
+ import pyarrow as pa
537
+
538
+ if on_select not in ["ignore", "rerun"] and not callable(on_select):
539
+ raise StreamlitAPIException(
540
+ f"You have passed {on_select} to `on_select`. But only 'ignore', "
541
+ "'rerun', or a callable is supported."
542
+ )
543
+
544
+ key = to_key(key)
545
+ is_selection_activated = on_select != "ignore"
546
+
547
+ if is_selection_activated:
548
+ # Run some checks that are only relevant when selections are activated
549
+ is_callback = callable(on_select)
550
+ check_widget_policies(
551
+ self.dg,
552
+ key,
553
+ on_change=cast(WidgetCallback, on_select) if is_callback else None,
554
+ default_value=None,
555
+ writes_allowed=False,
556
+ enable_check_callback_rules=is_callback,
557
+ )
558
+
559
+ # Convert the user provided column config into the frontend compatible format:
560
+ column_config_mapping = process_config_mapping(column_config)
561
+
562
+ proto = ArrowProto()
563
+
564
+ if use_container_width is None:
565
+ # If use_container_width was not explicitly set by the user, we set
566
+ # it to True if width was not set explicitly, and False otherwise.
567
+ use_container_width = True if width is None else False
568
+
569
+ proto.use_container_width = use_container_width
570
+
571
+ if width:
572
+ proto.width = width
573
+ if height:
574
+ proto.height = height
575
+
576
+ if row_height:
577
+ proto.row_height = row_height
578
+
579
+ if column_order:
580
+ proto.column_order[:] = column_order
581
+
582
+ proto.editing_mode = ArrowProto.EditingMode.READ_ONLY
583
+
584
+ if isinstance(data, pa.Table):
585
+ # For pyarrow tables, we can just serialize the table directly
586
+ proto.data = dataframe_util.convert_arrow_table_to_arrow_bytes(data)
587
+ else:
588
+ # For all other data formats, we need to convert them to a pandas.DataFrame
589
+ # thereby, we also apply some data specific configs
590
+
591
+ # Determine the input data format
592
+ data_format = dataframe_util.determine_data_format(data)
593
+
594
+ if dataframe_util.is_pandas_styler(data):
595
+ # If pandas.Styler uuid is not provided, a hash of the position
596
+ # of the element will be used. This will cause a rerender of the table
597
+ # when the position of the element is changed.
598
+ delta_path = self.dg._get_delta_path_str()
599
+ default_uuid = str(hash(delta_path))
600
+ marshall_styler(proto, data, default_uuid)
601
+
602
+ # Convert the input data into a pandas.DataFrame
603
+ data_df = dataframe_util.convert_anything_to_pandas_df(
604
+ data, ensure_copy=False
605
+ )
606
+ apply_data_specific_configs(column_config_mapping, data_format)
607
+ # Serialize the data to bytes:
608
+ proto.data = dataframe_util.convert_pandas_df_to_arrow_bytes(data_df)
609
+
610
+ if hide_index is not None:
611
+ update_column_config(
612
+ column_config_mapping, INDEX_IDENTIFIER, {"hidden": hide_index}
613
+ )
614
+ marshall_column_config(proto, column_config_mapping)
615
+
616
+ if is_selection_activated:
617
+ # If selection events are activated, we need to register the dataframe
618
+ # element as a widget.
619
+ proto.selection_mode.extend(parse_selection_mode(selection_mode))
620
+ proto.form_id = current_form_id(self.dg)
621
+
622
+ ctx = get_script_run_ctx()
623
+ proto.id = compute_and_register_element_id(
624
+ "dataframe",
625
+ user_key=key,
626
+ form_id=proto.form_id,
627
+ data=proto.data,
628
+ width=width,
629
+ height=height,
630
+ use_container_width=use_container_width,
631
+ column_order=proto.column_order,
632
+ column_config=proto.columns,
633
+ selection_mode=selection_mode,
634
+ is_selection_activated=is_selection_activated,
635
+ row_height=row_height,
636
+ )
637
+
638
+ serde = DataframeSelectionSerde()
639
+ widget_state = register_widget(
640
+ proto.id,
641
+ on_change_handler=on_select if callable(on_select) else None,
642
+ deserializer=serde.deserialize,
643
+ serializer=serde.serialize,
644
+ ctx=ctx,
645
+ value_type="string_value",
646
+ )
647
+ self.dg._enqueue("arrow_data_frame", proto)
648
+ return cast(DataframeState, widget_state.value)
649
+ else:
650
+ return self.dg._enqueue("arrow_data_frame", proto)
651
+
652
+ @gather_metrics("table")
653
+ def table(self, data: Data = None) -> DeltaGenerator:
654
+ """Display a static table.
655
+
656
+ While ``st.dataframe`` is geared towards large datasets and interactive
657
+ data exploration, ``st.table`` is useful for displaying small, styled
658
+ tables without sorting or scrolling. For example, ``st.table`` may be
659
+ the preferred way to display a confusion matrix or leaderboard.
660
+ Additionally, ``st.table`` supports Markdown.
661
+
662
+ Parameters
663
+ ----------
664
+ data : Anything supported by st.dataframe
665
+ The table data.
666
+
667
+ All cells including the index and column headers can optionally
668
+ contain GitHub-flavored Markdown. Syntax information can be found
669
+ at: https://github.github.com/gfm.
670
+
671
+ See the ``body`` parameter of |st.markdown|_ for additional,
672
+ supported Markdown directives.
673
+
674
+ .. |st.markdown| replace:: ``st.markdown``
675
+ .. _st.markdown: https://docs.streamlit.io/develop/api-reference/text/st.markdown
676
+
677
+ Examples
678
+ --------
679
+ **Example 1: Display a simple dataframe as a static table**
680
+
681
+ >>> import streamlit as st
682
+ >>> import pandas as pd
683
+ >>> import numpy as np
684
+ >>>
685
+ >>> df = pd.DataFrame(
686
+ ... np.random.randn(10, 5), columns=("col %d" % i for i in range(5))
687
+ ... )
688
+ >>>
689
+ >>> st.table(df)
690
+
691
+ .. output::
692
+ https://doc-table.streamlit.app/
693
+ height: 480px
694
+
695
+ **Example 2: Display a table of Markdown strings**
696
+
697
+ >>> import streamlit as st
698
+ >>> import pandas as pd
699
+ >>>
700
+ >>> df = pd.DataFrame(
701
+ ... {
702
+ ... "Command": ["**st.table**", "*st.dataframe*"],
703
+ ... "Type": ["`static`", "`interactive`"],
704
+ ... "Docs": [
705
+ ... "[:rainbow[docs]](https://docs.streamlit.io/develop/api-reference/data/st.dataframe)",
706
+ ... "[:book:](https://docs.streamlit.io/develop/api-reference/data/st.table)",
707
+ ... ],
708
+ ... }
709
+ ... )
710
+ >>> st.table(df)
711
+
712
+ .. output::
713
+ https://doc-table-markdown.streamlit.app/
714
+ height: 200px
715
+ """
716
+
717
+ # Check if data is uncollected, and collect it but with 100 rows max, instead of
718
+ # 10k rows, which is done in all other cases.
719
+ # We use 100 rows in st.table, because large tables render slowly,
720
+ # take too much screen space, and can crush the app.
721
+ if dataframe_util.is_unevaluated_data_object(data):
722
+ data = dataframe_util.convert_anything_to_pandas_df(
723
+ data, max_unevaluated_rows=100
724
+ )
725
+
726
+ # If pandas.Styler uuid is not provided, a hash of the position
727
+ # of the element will be used. This will cause a rerender of the table
728
+ # when the position of the element is changed.
729
+ delta_path = self.dg._get_delta_path_str()
730
+ default_uuid = str(hash(delta_path))
731
+
732
+ proto = ArrowProto()
733
+ marshall(proto, data, default_uuid)
734
+ return self.dg._enqueue("arrow_table", proto)
735
+
736
+ @gather_metrics("add_rows")
737
+ def add_rows(self, data: Data = None, **kwargs) -> DeltaGenerator | None:
738
+ """Concatenate a dataframe to the bottom of the current one.
739
+
740
+ Parameters
741
+ ----------
742
+ data : pandas.DataFrame, pandas.Styler, pyarrow.Table, numpy.ndarray, pyspark.sql.DataFrame, snowflake.snowpark.dataframe.DataFrame, Iterable, dict, or None
743
+ Table to concat. Optional.
744
+
745
+ **kwargs : pandas.DataFrame, numpy.ndarray, Iterable, dict, or None
746
+ The named dataset to concat. Optional. You can only pass in 1
747
+ dataset (including the one in the data parameter).
748
+
749
+ Example
750
+ -------
751
+ >>> import streamlit as st
752
+ >>> import pandas as pd
753
+ >>> import numpy as np
754
+ >>>
755
+ >>> df1 = pd.DataFrame(
756
+ ... np.random.randn(50, 20), columns=("col %d" % i for i in range(20))
757
+ ... )
758
+ >>>
759
+ >>> my_table = st.table(df1)
760
+ >>>
761
+ >>> df2 = pd.DataFrame(
762
+ ... np.random.randn(50, 20), columns=("col %d" % i for i in range(20))
763
+ ... )
764
+ >>>
765
+ >>> my_table.add_rows(df2)
766
+ >>> # Now the table shown in the Streamlit app contains the data for
767
+ >>> # df1 followed by the data for df2.
768
+
769
+ You can do the same thing with plots. For example, if you want to add
770
+ more data to a line chart:
771
+
772
+ >>> # Assuming df1 and df2 from the example above still exist...
773
+ >>> my_chart = st.line_chart(df1)
774
+ >>> my_chart.add_rows(df2)
775
+ >>> # Now the chart shown in the Streamlit app contains the data for
776
+ >>> # df1 followed by the data for df2.
777
+
778
+ And for plots whose datasets are named, you can pass the data with a
779
+ keyword argument where the key is the name:
780
+
781
+ >>> my_chart = st.vega_lite_chart(
782
+ ... {
783
+ ... "mark": "line",
784
+ ... "encoding": {"x": "a", "y": "b"},
785
+ ... "datasets": {
786
+ ... "some_fancy_name": df1, # <-- named dataset
787
+ ... },
788
+ ... "data": {"name": "some_fancy_name"},
789
+ ... }
790
+ ... )
791
+ >>> my_chart.add_rows(some_fancy_name=df2) # <-- name used as keyword
792
+
793
+ """
794
+ return _arrow_add_rows(self.dg, data, **kwargs)
795
+
796
+ @property
797
+ def dg(self) -> DeltaGenerator:
798
+ """Get our DeltaGenerator."""
799
+ return cast("DeltaGenerator", self)
800
+
801
+
802
+ def _prep_data_for_add_rows(
803
+ data: Data,
804
+ add_rows_metadata: AddRowsMetadata | None,
805
+ ) -> tuple[Data, AddRowsMetadata | None]:
806
+ if not add_rows_metadata:
807
+ if dataframe_util.is_pandas_styler(data):
808
+ # When calling add_rows on st.table or st.dataframe we want styles to
809
+ # pass through.
810
+ return data, None
811
+ return dataframe_util.convert_anything_to_pandas_df(data), None
812
+
813
+ # If add_rows_metadata is set, it indicates that the add_rows used called
814
+ # on a chart based on our built-in chart commands.
815
+
816
+ # For built-in chart commands we have to reshape the data structure
817
+ # otherwise the input data and the actual data used
818
+ # by vega_lite will be different, and it will throw an error.
819
+ from streamlit.elements.lib.built_in_chart_utils import prep_chart_data_for_add_rows
820
+
821
+ return prep_chart_data_for_add_rows(data, add_rows_metadata)
822
+
823
+
824
+ def _arrow_add_rows(
825
+ dg: DeltaGenerator,
826
+ data: Data = None,
827
+ **kwargs: (
828
+ DataFrame | npt.NDArray[Any] | Iterable[Any] | dict[Hashable, Any] | None
829
+ ),
830
+ ) -> DeltaGenerator | None:
831
+ """Concatenate a dataframe to the bottom of the current one.
832
+
833
+ Parameters
834
+ ----------
835
+ data : pandas.DataFrame, pandas.Styler, numpy.ndarray, Iterable, dict, or None
836
+ Table to concat. Optional.
837
+
838
+ **kwargs : pandas.DataFrame, numpy.ndarray, Iterable, dict, or None
839
+ The named dataset to concat. Optional. You can only pass in 1
840
+ dataset (including the one in the data parameter).
841
+
842
+ Example
843
+ -------
844
+ >>> import streamlit as st
845
+ >>> import pandas as pd
846
+ >>> import numpy as np
847
+ >>>
848
+ >>> df1 = pd.DataFrame(
849
+ ... np.random.randn(50, 20), columns=("col %d" % i for i in range(20))
850
+ ... )
851
+ >>> my_table = st.table(df1)
852
+ >>>
853
+ >>> df2 = pd.DataFrame(
854
+ ... np.random.randn(50, 20), columns=("col %d" % i for i in range(20))
855
+ ... )
856
+ >>> my_table.add_rows(df2)
857
+ >>> # Now the table shown in the Streamlit app contains the data for
858
+ >>> # df1 followed by the data for df2.
859
+
860
+ You can do the same thing with plots. For example, if you want to add
861
+ more data to a line chart:
862
+
863
+ >>> # Assuming df1 and df2 from the example above still exist...
864
+ >>> my_chart = st.line_chart(df1)
865
+ >>> my_chart.add_rows(df2)
866
+ >>> # Now the chart shown in the Streamlit app contains the data for
867
+ >>> # df1 followed by the data for df2.
868
+
869
+ And for plots whose datasets are named, you can pass the data with a
870
+ keyword argument where the key is the name:
871
+
872
+ >>> my_chart = st.vega_lite_chart(
873
+ ... {
874
+ ... "mark": "line",
875
+ ... "encoding": {"x": "a", "y": "b"},
876
+ ... "datasets": {
877
+ ... "some_fancy_name": df1, # <-- named dataset
878
+ ... },
879
+ ... "data": {"name": "some_fancy_name"},
880
+ ... }
881
+ ... )
882
+ >>> my_chart.add_rows(some_fancy_name=df2) # <-- name used as keyword
883
+
884
+ """
885
+ if dg._root_container is None or dg._cursor is None:
886
+ return dg
887
+
888
+ if not dg._cursor.is_locked:
889
+ raise StreamlitAPIException("Only existing elements can `add_rows`.")
890
+
891
+ # Accept syntax st._arrow_add_rows(df).
892
+ if data is not None and len(kwargs) == 0:
893
+ name = ""
894
+ # Accept syntax st._arrow_add_rows(foo=df).
895
+ elif len(kwargs) == 1:
896
+ name, data = kwargs.popitem()
897
+ # Raise error otherwise.
898
+ else:
899
+ raise StreamlitAPIException(
900
+ "Wrong number of arguments to add_rows()."
901
+ "Command requires exactly one dataset"
902
+ )
903
+
904
+ # When doing _arrow_add_rows on an element that does not already have data
905
+ # (for example, st.line_chart() without any args), call the original
906
+ # st.foo() element with new data instead of doing a _arrow_add_rows().
907
+ if (
908
+ "add_rows_metadata" in dg._cursor.props
909
+ and dg._cursor.props["add_rows_metadata"]
910
+ and dg._cursor.props["add_rows_metadata"].last_index is None
911
+ ):
912
+ st_method = getattr(dg, dg._cursor.props["add_rows_metadata"].chart_command)
913
+ st_method(data, **kwargs)
914
+ return None
915
+
916
+ new_data, dg._cursor.props["add_rows_metadata"] = _prep_data_for_add_rows(
917
+ data,
918
+ dg._cursor.props["add_rows_metadata"],
919
+ )
920
+
921
+ msg = ForwardMsg()
922
+ msg.metadata.delta_path[:] = dg._cursor.delta_path
923
+
924
+ default_uuid = str(hash(dg._get_delta_path_str()))
925
+ marshall(msg.delta.arrow_add_rows.data, new_data, default_uuid)
926
+
927
+ if name:
928
+ msg.delta.arrow_add_rows.name = name
929
+ msg.delta.arrow_add_rows.has_name = True
930
+
931
+ enqueue_message(msg)
932
+
933
+ return dg
934
+
935
+
936
+ def marshall(proto: ArrowProto, data: Data, default_uuid: str | None = None) -> None:
937
+ """Marshall pandas.DataFrame into an Arrow proto.
938
+
939
+ Parameters
940
+ ----------
941
+ proto : proto.Arrow
942
+ Output. The protobuf for Streamlit Arrow proto.
943
+
944
+ data : pandas.DataFrame, pandas.Styler, pyarrow.Table, numpy.ndarray, pyspark.sql.DataFrame, snowflake.snowpark.DataFrame, Iterable, dict, or None
945
+ Something that is or can be converted to a dataframe.
946
+
947
+ default_uuid : str | None
948
+ If pandas.Styler UUID is not provided, this value will be used.
949
+ This attribute is optional and only used for pandas.Styler, other elements
950
+ (e.g. charts) can ignore it.
951
+
952
+ """
953
+
954
+ if dataframe_util.is_pandas_styler(data):
955
+ # default_uuid is a string only if the data is a `Styler`,
956
+ # and `None` otherwise.
957
+ assert isinstance(default_uuid, str), (
958
+ "Default UUID must be a string for Styler data."
959
+ )
960
+ marshall_styler(proto, data, default_uuid)
961
+
962
+ proto.data = dataframe_util.convert_anything_to_arrow_bytes(data)