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,183 @@
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 time
18
+ from typing import TYPE_CHECKING, Literal, cast
19
+
20
+ from typing_extensions import Self, TypeAlias
21
+
22
+ from streamlit.delta_generator import DeltaGenerator
23
+ from streamlit.errors import StreamlitAPIException
24
+ from streamlit.proto.Block_pb2 import Block as BlockProto
25
+ from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
26
+ from streamlit.runtime.scriptrunner_utils.script_run_context import enqueue_message
27
+
28
+ if TYPE_CHECKING:
29
+ from types import TracebackType
30
+
31
+ from streamlit.cursor import Cursor
32
+
33
+ States: TypeAlias = Literal["running", "complete", "error"]
34
+
35
+
36
+ class StatusContainer(DeltaGenerator):
37
+ @staticmethod
38
+ def _create(
39
+ parent: DeltaGenerator,
40
+ label: str,
41
+ expanded: bool = False,
42
+ state: States = "running",
43
+ ) -> StatusContainer:
44
+ expandable_proto = BlockProto.Expandable()
45
+ expandable_proto.expanded = expanded
46
+ expandable_proto.label = label or ""
47
+
48
+ if state == "running":
49
+ expandable_proto.icon = "spinner"
50
+ elif state == "complete":
51
+ expandable_proto.icon = ":material/check:"
52
+ elif state == "error":
53
+ expandable_proto.icon = ":material/error:"
54
+ else:
55
+ raise StreamlitAPIException(
56
+ f"Unknown state ({state}). Must be one of 'running', 'complete', or 'error'."
57
+ )
58
+
59
+ block_proto = BlockProto()
60
+ block_proto.allow_empty = True
61
+ block_proto.expandable.CopyFrom(expandable_proto)
62
+
63
+ delta_path: list[int] = (
64
+ parent._active_dg._cursor.delta_path if parent._active_dg._cursor else []
65
+ )
66
+
67
+ status_container = cast(
68
+ StatusContainer,
69
+ parent._block(block_proto=block_proto, dg_type=StatusContainer),
70
+ )
71
+
72
+ # Apply initial configuration
73
+ status_container._delta_path = delta_path
74
+ status_container._current_proto = block_proto
75
+ status_container._current_state = state
76
+
77
+ # We need to sleep here for a very short time to prevent issues when
78
+ # the status is updated too quickly. If an .update() directly follows the
79
+ # the initialization, sometimes only the latest update is applied.
80
+ # Adding a short timeout here allows the frontend to render the update before.
81
+ time.sleep(0.05)
82
+
83
+ return status_container
84
+
85
+ def __init__(
86
+ self,
87
+ root_container: int | None,
88
+ cursor: Cursor | None,
89
+ parent: DeltaGenerator | None,
90
+ block_type: str | None,
91
+ ):
92
+ super().__init__(root_container, cursor, parent, block_type)
93
+
94
+ # Initialized in `_create()`:
95
+ self._current_proto: BlockProto | None = None
96
+ self._current_state: States | None = None
97
+ self._delta_path: list[int] | None = None
98
+
99
+ def update(
100
+ self,
101
+ *,
102
+ label: str | None = None,
103
+ expanded: bool | None = None,
104
+ state: States | None = None,
105
+ ) -> None:
106
+ """Update the status container.
107
+
108
+ Only specified arguments are updated. Container contents and unspecified
109
+ arguments remain unchanged.
110
+
111
+ Parameters
112
+ ----------
113
+ label : str or None
114
+ A new label of the status container. If None, the label is not
115
+ changed.
116
+
117
+ expanded : bool or None
118
+ The new expanded state of the status container. If None,
119
+ the expanded state is not changed.
120
+
121
+ state : "running", "complete", "error", or None
122
+ The new state of the status container. This mainly changes the
123
+ icon. If None, the state is not changed.
124
+ """
125
+ assert self._current_proto is not None, "Status not correctly initialized!"
126
+ assert self._delta_path is not None, "Status not correctly initialized!"
127
+
128
+ msg = ForwardMsg()
129
+ msg.metadata.delta_path[:] = self._delta_path
130
+ msg.delta.add_block.CopyFrom(self._current_proto)
131
+
132
+ if expanded is not None:
133
+ msg.delta.add_block.expandable.expanded = expanded
134
+ else:
135
+ msg.delta.add_block.expandable.ClearField("expanded")
136
+
137
+ if label is not None:
138
+ msg.delta.add_block.expandable.label = label
139
+
140
+ if state is not None:
141
+ if state == "running":
142
+ msg.delta.add_block.expandable.icon = "spinner"
143
+ elif state == "complete":
144
+ msg.delta.add_block.expandable.icon = ":material/check:"
145
+ elif state == "error":
146
+ msg.delta.add_block.expandable.icon = ":material/error:"
147
+ else:
148
+ raise StreamlitAPIException(
149
+ f"Unknown state ({state}). Must be one of 'running', 'complete', or 'error'."
150
+ )
151
+ self._current_state = state
152
+
153
+ self._current_proto = msg.delta.add_block
154
+ enqueue_message(msg)
155
+
156
+ def __enter__(self) -> Self: # type: ignore[override]
157
+ # This is a little dubious: we're returning a different type than
158
+ # our superclass' `__enter__` function. Maybe DeltaGenerator.__enter__
159
+ # should always return `self`?
160
+ super().__enter__()
161
+ return self
162
+
163
+ def __exit__(
164
+ self,
165
+ exc_type: type[BaseException] | None,
166
+ exc_val: BaseException | None,
167
+ exc_tb: TracebackType | None,
168
+ ) -> Literal[False]:
169
+ # Only update if the current state is running
170
+ if self._current_state == "running":
171
+ # We need to sleep here for a very short time to prevent issues when
172
+ # the status is updated too quickly. If an .update() is directly followed
173
+ # by the exit of the context manager, sometimes only the last update
174
+ # (to complete) is applied. Adding a short timeout here allows the frontend
175
+ # to render the update before.
176
+ time.sleep(0.05)
177
+ if exc_type is not None:
178
+ # If an exception was raised in the context,
179
+ # we want to update the status to error.
180
+ self.update(state="error")
181
+ else:
182
+ self.update(state="complete")
183
+ return super().__exit__(exc_type, exc_val, exc_tb)
@@ -0,0 +1,250 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ from enum import Enum, EnumMeta
18
+ from typing import TYPE_CHECKING, Any, Final, TypeVar, overload
19
+
20
+ from streamlit import config, logger
21
+ from streamlit.dataframe_util import OptionSequence, convert_anything_to_list
22
+ from streamlit.errors import StreamlitAPIException
23
+ from streamlit.runtime.state.common import RegisterWidgetResult
24
+ from streamlit.type_util import (
25
+ T,
26
+ check_python_comparable,
27
+ )
28
+
29
+ if TYPE_CHECKING:
30
+ from collections.abc import Iterable, Sequence
31
+
32
+ _LOGGER: Final = logger.get_logger(__name__)
33
+
34
+ _FLOAT_EQUALITY_EPSILON: Final[float] = 0.000000000005
35
+ _Value = TypeVar("_Value")
36
+
37
+
38
+ def index_(iterable: Iterable[_Value], x: _Value) -> int:
39
+ """Return zero-based index of the first item whose value is equal to x.
40
+ Raises a ValueError if there is no such item.
41
+
42
+ We need a custom implementation instead of the built-in list .index() to
43
+ be compatible with NumPy array and Pandas Series.
44
+
45
+ Parameters
46
+ ----------
47
+ iterable : list, tuple, numpy.ndarray, pandas.Series
48
+ x : Any
49
+
50
+ Returns
51
+ -------
52
+ int
53
+ """
54
+ for i, value in enumerate(iterable):
55
+ if x == value:
56
+ return i
57
+ elif isinstance(value, float) and isinstance(x, float):
58
+ if abs(x - value) < _FLOAT_EQUALITY_EPSILON:
59
+ return i
60
+ raise ValueError(f"{str(x)} is not in iterable")
61
+
62
+
63
+ def check_and_convert_to_indices(
64
+ opt: Sequence[Any], default_values: Sequence[Any] | Any | None
65
+ ) -> list[int] | None:
66
+ """Perform validation checks and return indices based on the default values."""
67
+ if default_values is None:
68
+ return None
69
+
70
+ default_values = convert_anything_to_list(default_values)
71
+
72
+ for value in default_values:
73
+ if value not in opt:
74
+ raise StreamlitAPIException(
75
+ f"The default value '{value}' is not part of the options. "
76
+ "Please make sure that every default values also exists in the options."
77
+ )
78
+
79
+ return [opt.index(value) for value in default_values]
80
+
81
+
82
+ def convert_to_sequence_and_check_comparable(options: OptionSequence[T]) -> Sequence[T]:
83
+ indexable_options = convert_anything_to_list(options)
84
+ check_python_comparable(indexable_options)
85
+ return indexable_options
86
+
87
+
88
+ def get_default_indices(
89
+ indexable_options: Sequence[T], default: Sequence[Any] | Any | None = None
90
+ ) -> list[int]:
91
+ default_indices = check_and_convert_to_indices(indexable_options, default)
92
+ default_indices = default_indices if default_indices is not None else []
93
+ return default_indices
94
+
95
+
96
+ E1 = TypeVar("E1", bound=Enum)
97
+ E2 = TypeVar("E2", bound=Enum)
98
+
99
+ _ALLOWED_ENUM_COERCION_CONFIG_SETTINGS = ("off", "nameOnly", "nameAndValue")
100
+
101
+
102
+ def _coerce_enum(from_enum_value: E1, to_enum_class: type[E2]) -> E1 | E2:
103
+ """Attempt to coerce an Enum value to another EnumMeta.
104
+
105
+ An Enum value of EnumMeta E1 is considered coercable to EnumType E2
106
+ if the EnumMeta __qualname__ match and the names of their members
107
+ match as well. (This is configurable in streamlist configs)
108
+ """
109
+ if not isinstance(from_enum_value, Enum):
110
+ raise ValueError(
111
+ f"Expected an Enum in the first argument. Got {type(from_enum_value)}"
112
+ )
113
+ if not isinstance(to_enum_class, EnumMeta):
114
+ raise ValueError(
115
+ f"Expected an EnumMeta/Type in the second argument. Got {type(to_enum_class)}"
116
+ )
117
+ if isinstance(from_enum_value, to_enum_class):
118
+ return from_enum_value # Enum is already a member, no coersion necessary
119
+
120
+ coercion_type = config.get_option("runner.enumCoercion")
121
+ if coercion_type not in _ALLOWED_ENUM_COERCION_CONFIG_SETTINGS:
122
+ raise StreamlitAPIException(
123
+ "Invalid value for config option runner.enumCoercion. "
124
+ f"Expected one of {_ALLOWED_ENUM_COERCION_CONFIG_SETTINGS}, "
125
+ f"but got '{coercion_type}'."
126
+ )
127
+ if coercion_type == "off":
128
+ return from_enum_value # do not attempt to coerce
129
+
130
+ # We now know this is an Enum AND the user has configured coercion enabled.
131
+ # Check if we do NOT meet the required conditions and log a failure message
132
+ # if that is the case.
133
+ from_enum_class = from_enum_value.__class__
134
+ if (
135
+ from_enum_class.__qualname__ != to_enum_class.__qualname__
136
+ or (
137
+ coercion_type == "nameOnly"
138
+ and set(to_enum_class._member_names_) != set(from_enum_class._member_names_)
139
+ )
140
+ or (
141
+ coercion_type == "nameAndValue"
142
+ and set(to_enum_class._value2member_map_)
143
+ != set(from_enum_class._value2member_map_)
144
+ )
145
+ ):
146
+ _LOGGER.debug("Failed to coerce %s to class %s", from_enum_value, to_enum_class)
147
+ return from_enum_value # do not attempt to coerce
148
+
149
+ # At this point we think the Enum is coercable, and we know
150
+ # E1 and E2 have the same member names. We convert from E1 to E2 using _name_
151
+ # (since user Enum subclasses can override the .name property in 3.11)
152
+ _LOGGER.debug("Coerced %s to class %s", from_enum_value, to_enum_class)
153
+ return to_enum_class[from_enum_value._name_]
154
+
155
+
156
+ def _extract_common_class_from_iter(iterable: Iterable[Any]) -> Any:
157
+ """Return the common class of all elements in a iterable if they share one.
158
+ Otherwise, return None."""
159
+ try:
160
+ inner_iter = iter(iterable)
161
+ first_class = type(next(inner_iter))
162
+ except StopIteration:
163
+ return None
164
+ if all(type(item) is first_class for item in inner_iter):
165
+ return first_class
166
+ return None
167
+
168
+
169
+ @overload
170
+ def maybe_coerce_enum(
171
+ register_widget_result: RegisterWidgetResult[Enum],
172
+ options: type[Enum],
173
+ opt_sequence: Sequence[Any],
174
+ ) -> RegisterWidgetResult[Enum]: ...
175
+
176
+
177
+ @overload
178
+ def maybe_coerce_enum(
179
+ register_widget_result: RegisterWidgetResult[T],
180
+ options: OptionSequence[T],
181
+ opt_sequence: Sequence[T],
182
+ ) -> RegisterWidgetResult[T]: ...
183
+
184
+
185
+ def maybe_coerce_enum(register_widget_result, options, opt_sequence):
186
+ """Maybe Coerce a RegisterWidgetResult with an Enum member value to
187
+ RegisterWidgetResult[option] if option is an EnumType, otherwise just return
188
+ the original RegisterWidgetResult."""
189
+
190
+ # If the value is not a Enum, return early
191
+ if not isinstance(register_widget_result.value, Enum):
192
+ return register_widget_result
193
+
194
+ coerce_class: EnumMeta | None
195
+ if isinstance(options, EnumMeta):
196
+ coerce_class = options
197
+ else:
198
+ coerce_class = _extract_common_class_from_iter(opt_sequence)
199
+ if coerce_class is None:
200
+ return register_widget_result
201
+
202
+ return RegisterWidgetResult(
203
+ _coerce_enum(register_widget_result.value, coerce_class),
204
+ register_widget_result.value_changed,
205
+ )
206
+
207
+
208
+ # slightly ugly typing because TypeVars with Generic Bounds are not supported
209
+ # (https://github.com/python/typing/issues/548)
210
+ @overload
211
+ def maybe_coerce_enum_sequence(
212
+ register_widget_result: RegisterWidgetResult[list[T]],
213
+ options: OptionSequence[T],
214
+ opt_sequence: Sequence[T],
215
+ ) -> RegisterWidgetResult[list[T]]: ...
216
+
217
+
218
+ @overload
219
+ def maybe_coerce_enum_sequence(
220
+ register_widget_result: RegisterWidgetResult[tuple[T, T]],
221
+ options: OptionSequence[T],
222
+ opt_sequence: Sequence[T],
223
+ ) -> RegisterWidgetResult[tuple[T, T]]: ...
224
+
225
+
226
+ def maybe_coerce_enum_sequence(register_widget_result, options, opt_sequence):
227
+ """Maybe Coerce a RegisterWidgetResult with a sequence of Enum members as value
228
+ to RegisterWidgetResult[Sequence[option]] if option is an EnumType, otherwise just return
229
+ the original RegisterWidgetResult."""
230
+
231
+ # If not all widget values are Enums, return early
232
+ if not all(isinstance(val, Enum) for val in register_widget_result.value):
233
+ return register_widget_result
234
+
235
+ # Extract the class to coerce
236
+ coerce_class: EnumMeta | None
237
+ if isinstance(options, EnumMeta):
238
+ coerce_class = options
239
+ else:
240
+ coerce_class = _extract_common_class_from_iter(opt_sequence)
241
+ if coerce_class is None:
242
+ return register_widget_result
243
+
244
+ # Return a new RegisterWidgetResult with the coerced enum values sequence
245
+ return RegisterWidgetResult(
246
+ type(register_widget_result.value)(
247
+ _coerce_enum(val, coerce_class) for val in register_widget_result.value
248
+ ),
249
+ register_widget_result.value_changed,
250
+ )
@@ -0,0 +1,274 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ from collections.abc import Mapping
18
+ from typing import TYPE_CHECKING, Any, TypeVar
19
+
20
+ from streamlit import dataframe_util
21
+ from streamlit.errors import StreamlitAPIException
22
+
23
+ if TYPE_CHECKING:
24
+ from pandas import DataFrame
25
+ from pandas.io.formats.style import Styler
26
+
27
+ from streamlit.proto.Arrow_pb2 import Arrow as ArrowProto
28
+
29
+
30
+ def marshall_styler(proto: ArrowProto, styler: Styler, default_uuid: str) -> None:
31
+ """Marshall pandas.Styler into an Arrow proto.
32
+
33
+ Parameters
34
+ ----------
35
+ proto : proto.Arrow
36
+ Output. The protobuf for Streamlit Arrow proto.
37
+
38
+ styler : pandas.Styler
39
+ Helps style a DataFrame or Series according to the data with HTML and CSS.
40
+
41
+ default_uuid : str
42
+ If pandas.Styler uuid is not provided, this value will be used.
43
+
44
+ """
45
+ import pandas as pd
46
+
47
+ styler_data_df: pd.DataFrame = styler.data
48
+ if styler_data_df.size > int(pd.options.styler.render.max_elements):
49
+ raise StreamlitAPIException(
50
+ f"The dataframe has `{styler_data_df.size}` cells, but the maximum number "
51
+ "of cells allowed to be rendered by Pandas Styler is configured to "
52
+ f"`{pd.options.styler.render.max_elements}`. To allow more cells to be "
53
+ 'styled, you can change the `"styler.render.max_elements"` config. For example: '
54
+ f'`pd.set_option("styler.render.max_elements", {styler_data_df.size})`'
55
+ )
56
+
57
+ # pandas.Styler uuid should be set before _compute is called.
58
+ _marshall_uuid(proto, styler, default_uuid)
59
+
60
+ # We're using protected members of pandas.Styler to get styles,
61
+ # which is not ideal and could break if the interface changes.
62
+ styler._compute()
63
+
64
+ pandas_styles = styler._translate(False, False)
65
+
66
+ _marshall_caption(proto, styler)
67
+ _marshall_styles(proto, styler, pandas_styles)
68
+ _marshall_display_values(proto, styler_data_df, pandas_styles)
69
+
70
+
71
+ def _marshall_uuid(proto: ArrowProto, styler: Styler, default_uuid: str) -> None:
72
+ """Marshall pandas.Styler uuid into an Arrow proto.
73
+
74
+ Parameters
75
+ ----------
76
+ proto : proto.Arrow
77
+ Output. The protobuf for Streamlit Arrow proto.
78
+
79
+ styler : pandas.Styler
80
+ Helps style a DataFrame or Series according to the data with HTML and CSS.
81
+
82
+ default_uuid : str
83
+ If pandas.Styler uuid is not provided, this value will be used.
84
+
85
+ """
86
+ if styler.uuid is None:
87
+ styler.set_uuid(default_uuid)
88
+
89
+ proto.styler.uuid = str(styler.uuid)
90
+
91
+
92
+ def _marshall_caption(proto: ArrowProto, styler: Styler) -> None:
93
+ """Marshall pandas.Styler caption into an Arrow proto.
94
+
95
+ Parameters
96
+ ----------
97
+ proto : proto.Arrow
98
+ Output. The protobuf for Streamlit Arrow proto.
99
+
100
+ styler : pandas.Styler
101
+ Helps style a DataFrame or Series according to the data with HTML and CSS.
102
+
103
+ """
104
+ if styler.caption is not None:
105
+ proto.styler.caption = styler.caption
106
+
107
+
108
+ def _marshall_styles(
109
+ proto: ArrowProto, styler: Styler, styles: Mapping[str, Any]
110
+ ) -> None:
111
+ """Marshall pandas.Styler styles into an Arrow proto.
112
+
113
+ Parameters
114
+ ----------
115
+ proto : proto.Arrow
116
+ Output. The protobuf for Streamlit Arrow proto.
117
+
118
+ styler : pandas.Styler
119
+ Helps style a DataFrame or Series according to the data with HTML and CSS.
120
+
121
+ styles : dict
122
+ pandas.Styler translated styles.
123
+
124
+ """
125
+ css_rules = []
126
+
127
+ if "table_styles" in styles:
128
+ table_styles = styles["table_styles"]
129
+ table_styles = _trim_pandas_styles(table_styles)
130
+ for style in table_styles:
131
+ # styles in "table_styles" have a space
132
+ # between the uuid and selector.
133
+ rule = _pandas_style_to_css(
134
+ "table_styles", style, styler.uuid, separator=" "
135
+ )
136
+ css_rules.append(rule)
137
+
138
+ if "cellstyle" in styles:
139
+ cellstyle = styles["cellstyle"]
140
+ cellstyle = _trim_pandas_styles(cellstyle)
141
+ for style in cellstyle:
142
+ rule = _pandas_style_to_css("cell_style", style, styler.uuid, separator="_")
143
+ css_rules.append(rule)
144
+
145
+ if len(css_rules) > 0:
146
+ proto.styler.styles = "\n".join(css_rules)
147
+
148
+
149
+ M = TypeVar("M", bound=Mapping[str, Any])
150
+
151
+
152
+ def _trim_pandas_styles(styles: list[M]) -> list[M]:
153
+ """Filter out empty styles.
154
+
155
+ Every cell will have a class, but the list of props
156
+ may just be [['', '']].
157
+
158
+ Parameters
159
+ ----------
160
+ styles : list
161
+ pandas.Styler translated styles.
162
+
163
+ """
164
+ return [x for x in styles if any(any(y) for y in x["props"])]
165
+
166
+
167
+ def _pandas_style_to_css(
168
+ style_type: str,
169
+ style: Mapping[str, Any],
170
+ uuid: str,
171
+ separator: str = "_",
172
+ ) -> str:
173
+ """Convert pandas.Styler translated style to CSS.
174
+
175
+ Parameters
176
+ ----------
177
+ style_type : str
178
+ Either "table_styles" or "cell_style".
179
+
180
+ style : dict
181
+ pandas.Styler translated style.
182
+
183
+ uuid : str
184
+ pandas.Styler uuid.
185
+
186
+ separator : str
187
+ A string separator used between table and cell selectors.
188
+
189
+ """
190
+ declarations = []
191
+ for css_property, css_value in style["props"]:
192
+ declaration = str(css_property).strip() + ": " + str(css_value).strip()
193
+ declarations.append(declaration)
194
+
195
+ table_selector = f"#T_{uuid}"
196
+
197
+ # In pandas >= 1.1.0
198
+ # translated_style["cellstyle"] has the following shape:
199
+ # [
200
+ # {
201
+ # "props": [("color", " black"), ("background-color", "orange"), ("", "")],
202
+ # "selectors": ["row0_col0"]
203
+ # }
204
+ # ...
205
+ # ]
206
+ if style_type == "table_styles":
207
+ cell_selectors = [style["selector"]]
208
+ else:
209
+ cell_selectors = style["selectors"]
210
+
211
+ selectors = []
212
+ for cell_selector in cell_selectors:
213
+ selectors.append(table_selector + separator + cell_selector)
214
+ selector = ", ".join(selectors)
215
+
216
+ declaration_block = "; ".join(declarations)
217
+ rule_set = selector + " { " + declaration_block + " }"
218
+
219
+ return rule_set
220
+
221
+
222
+ def _marshall_display_values(
223
+ proto: ArrowProto, df: DataFrame, styles: Mapping[str, Any]
224
+ ) -> None:
225
+ """Marshall pandas.Styler display values into an Arrow proto.
226
+
227
+ Parameters
228
+ ----------
229
+ proto : proto.Arrow
230
+ Output. The protobuf for Streamlit Arrow proto.
231
+
232
+ df : pandas.DataFrame
233
+ A dataframe with original values.
234
+
235
+ styles : dict
236
+ pandas.Styler translated styles.
237
+
238
+ """
239
+ new_df = _use_display_values(df, styles)
240
+ proto.styler.display_values = dataframe_util.convert_pandas_df_to_arrow_bytes(
241
+ new_df
242
+ )
243
+
244
+
245
+ def _use_display_values(df: DataFrame, styles: Mapping[str, Any]) -> DataFrame:
246
+ """Create a new pandas.DataFrame where display values are used instead of original ones.
247
+
248
+ Parameters
249
+ ----------
250
+ df : pandas.DataFrame
251
+ A dataframe with original values.
252
+
253
+ styles : dict
254
+ pandas.Styler translated styles.
255
+
256
+ """
257
+ import re
258
+
259
+ # If values in a column are not of the same type, Arrow
260
+ # serialization would fail. Thus, we need to cast all values
261
+ # of the dataframe to strings before assigning them display values.
262
+ new_df = df.astype(str)
263
+
264
+ cell_selector_regex = re.compile(r"row(\d+)_col(\d+)")
265
+ if "body" in styles:
266
+ rows = styles["body"]
267
+ for row in rows:
268
+ for cell in row:
269
+ if "id" in cell:
270
+ if match := cell_selector_regex.match(cell["id"]):
271
+ r, c = map(int, match.groups())
272
+ new_df.iloc[r, c] = str(cell["display_value"])
273
+
274
+ return new_df