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,665 @@
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
+ """@st.cache_data: pickle-based caching"""
16
+
17
+ from __future__ import annotations
18
+
19
+ import pickle
20
+ import threading
21
+ import types
22
+ from typing import (
23
+ TYPE_CHECKING,
24
+ Any,
25
+ Callable,
26
+ Final,
27
+ Literal,
28
+ TypeVar,
29
+ Union,
30
+ cast,
31
+ overload,
32
+ )
33
+
34
+ from typing_extensions import TypeAlias
35
+
36
+ import streamlit as st
37
+ from streamlit import runtime
38
+ from streamlit.errors import StreamlitAPIException
39
+ from streamlit.logger import get_logger
40
+ from streamlit.runtime.caching.cache_errors import CacheError, CacheKeyNotFoundError
41
+ from streamlit.runtime.caching.cache_type import CacheType
42
+ from streamlit.runtime.caching.cache_utils import (
43
+ Cache,
44
+ CachedFuncInfo,
45
+ make_cached_func_wrapper,
46
+ )
47
+ from streamlit.runtime.caching.cached_message_replay import (
48
+ CachedMessageReplayContext,
49
+ CachedResult,
50
+ MsgData,
51
+ show_widget_replay_deprecation,
52
+ )
53
+ from streamlit.runtime.caching.storage import (
54
+ CacheStorage,
55
+ CacheStorageContext,
56
+ CacheStorageError,
57
+ CacheStorageKeyNotFoundError,
58
+ CacheStorageManager,
59
+ )
60
+ from streamlit.runtime.caching.storage.cache_storage_protocol import (
61
+ InvalidCacheStorageContext,
62
+ )
63
+ from streamlit.runtime.caching.storage.dummy_cache_storage import (
64
+ MemoryCacheStorageManager,
65
+ )
66
+ from streamlit.runtime.metrics_util import gather_metrics
67
+ from streamlit.runtime.stats import CacheStat, CacheStatsProvider, group_stats
68
+ from streamlit.time_util import time_to_seconds
69
+
70
+ if TYPE_CHECKING:
71
+ from datetime import timedelta
72
+
73
+ from streamlit.runtime.caching.hashing import HashFuncsDict
74
+
75
+ _LOGGER: Final = get_logger(__name__)
76
+
77
+ CACHE_DATA_MESSAGE_REPLAY_CTX = CachedMessageReplayContext(CacheType.DATA)
78
+
79
+ # The cache persistence options we support: "disk" or None
80
+ CachePersistType: TypeAlias = Union[Literal["disk"], None]
81
+
82
+
83
+ class CachedDataFuncInfo(CachedFuncInfo):
84
+ """Implements the CachedFuncInfo interface for @st.cache_data"""
85
+
86
+ def __init__(
87
+ self,
88
+ func: types.FunctionType,
89
+ show_spinner: bool | str,
90
+ persist: CachePersistType,
91
+ max_entries: int | None,
92
+ ttl: float | timedelta | str | None,
93
+ hash_funcs: HashFuncsDict | None = None,
94
+ ):
95
+ super().__init__(
96
+ func,
97
+ show_spinner=show_spinner,
98
+ hash_funcs=hash_funcs,
99
+ )
100
+ self.persist = persist
101
+ self.max_entries = max_entries
102
+ self.ttl = ttl
103
+
104
+ self.validate_params()
105
+
106
+ @property
107
+ def cache_type(self) -> CacheType:
108
+ return CacheType.DATA
109
+
110
+ @property
111
+ def cached_message_replay_ctx(self) -> CachedMessageReplayContext:
112
+ return CACHE_DATA_MESSAGE_REPLAY_CTX
113
+
114
+ @property
115
+ def display_name(self) -> str:
116
+ """A human-readable name for the cached function"""
117
+ return f"{self.func.__module__}.{self.func.__qualname__}"
118
+
119
+ def get_function_cache(self, function_key: str) -> Cache:
120
+ return _data_caches.get_cache(
121
+ key=function_key,
122
+ persist=self.persist,
123
+ max_entries=self.max_entries,
124
+ ttl=self.ttl,
125
+ display_name=self.display_name,
126
+ )
127
+
128
+ def validate_params(self) -> None:
129
+ """
130
+ Validate the params passed to @st.cache_data are compatible with cache storage
131
+
132
+ When called, this method could log warnings if cache params are invalid
133
+ for current storage.
134
+ """
135
+ _data_caches.validate_cache_params(
136
+ function_name=self.func.__name__,
137
+ persist=self.persist,
138
+ max_entries=self.max_entries,
139
+ ttl=self.ttl,
140
+ )
141
+
142
+
143
+ class DataCaches(CacheStatsProvider):
144
+ """Manages all DataCache instances"""
145
+
146
+ def __init__(self):
147
+ self._caches_lock = threading.Lock()
148
+ self._function_caches: dict[str, DataCache] = {}
149
+
150
+ def get_cache(
151
+ self,
152
+ key: str,
153
+ persist: CachePersistType,
154
+ max_entries: int | None,
155
+ ttl: int | float | timedelta | str | None,
156
+ display_name: str,
157
+ ) -> DataCache:
158
+ """Return the mem cache for the given key.
159
+
160
+ If it doesn't exist, create a new one with the given params.
161
+ """
162
+
163
+ ttl_seconds = time_to_seconds(ttl, coerce_none_to_inf=False)
164
+
165
+ # Get the existing cache, if it exists, and validate that its params
166
+ # haven't changed.
167
+ with self._caches_lock:
168
+ cache = self._function_caches.get(key)
169
+ if (
170
+ cache is not None
171
+ and cache.ttl_seconds == ttl_seconds
172
+ and cache.max_entries == max_entries
173
+ and cache.persist == persist
174
+ ):
175
+ return cache
176
+
177
+ # Close the existing cache's storage, if it exists.
178
+ if cache is not None:
179
+ _LOGGER.debug(
180
+ "Closing existing DataCache storage "
181
+ "(key=%s, persist=%s, max_entries=%s, ttl=%s) "
182
+ "before creating new one with different params",
183
+ key,
184
+ persist,
185
+ max_entries,
186
+ ttl,
187
+ )
188
+ cache.storage.close()
189
+
190
+ # Create a new cache object and put it in our dict
191
+ _LOGGER.debug(
192
+ "Creating new DataCache (key=%s, persist=%s, max_entries=%s, ttl=%s)",
193
+ key,
194
+ persist,
195
+ max_entries,
196
+ ttl,
197
+ )
198
+
199
+ cache_context = self.create_cache_storage_context(
200
+ function_key=key,
201
+ function_name=display_name,
202
+ ttl_seconds=ttl_seconds,
203
+ max_entries=max_entries,
204
+ persist=persist,
205
+ )
206
+ cache_storage_manager = self.get_storage_manager()
207
+ storage = cache_storage_manager.create(cache_context)
208
+
209
+ cache = DataCache(
210
+ key=key,
211
+ storage=storage,
212
+ persist=persist,
213
+ max_entries=max_entries,
214
+ ttl_seconds=ttl_seconds,
215
+ display_name=display_name,
216
+ )
217
+ self._function_caches[key] = cache
218
+ return cache
219
+
220
+ def clear_all(self) -> None:
221
+ """Clear all in-memory and on-disk caches."""
222
+ with self._caches_lock:
223
+ try:
224
+ # try to remove in optimal way if such ability provided by
225
+ # storage manager clear_all method;
226
+ # if not implemented, fallback to remove all
227
+ # available storages one by one
228
+ self.get_storage_manager().clear_all()
229
+ except NotImplementedError:
230
+ for data_cache in self._function_caches.values():
231
+ data_cache.clear()
232
+ data_cache.storage.close()
233
+ self._function_caches = {}
234
+
235
+ def get_stats(self) -> list[CacheStat]:
236
+ with self._caches_lock:
237
+ # Shallow-clone our caches. We don't want to hold the global
238
+ # lock during stats-gathering.
239
+ function_caches = self._function_caches.copy()
240
+
241
+ stats: list[CacheStat] = []
242
+ for cache in function_caches.values():
243
+ stats.extend(cache.get_stats())
244
+ return group_stats(stats)
245
+
246
+ def validate_cache_params(
247
+ self,
248
+ function_name: str,
249
+ persist: CachePersistType,
250
+ max_entries: int | None,
251
+ ttl: int | float | timedelta | str | None,
252
+ ) -> None:
253
+ """Validate that the cache params are valid for given storage.
254
+
255
+ Raises
256
+ ------
257
+ InvalidCacheStorageContext
258
+ Raised if the cache storage manager is not able to work with provided
259
+ CacheStorageContext.
260
+ """
261
+
262
+ ttl_seconds = time_to_seconds(ttl, coerce_none_to_inf=False)
263
+
264
+ cache_context = self.create_cache_storage_context(
265
+ function_key="DUMMY_KEY",
266
+ function_name=function_name,
267
+ ttl_seconds=ttl_seconds,
268
+ max_entries=max_entries,
269
+ persist=persist,
270
+ )
271
+ try:
272
+ self.get_storage_manager().check_context(cache_context)
273
+ except InvalidCacheStorageContext as e:
274
+ _LOGGER.error(
275
+ "Cache params for function %s are incompatible with current "
276
+ "cache storage manager.",
277
+ function_name,
278
+ exc_info=e,
279
+ )
280
+ raise
281
+
282
+ def create_cache_storage_context(
283
+ self,
284
+ function_key: str,
285
+ function_name: str,
286
+ persist: CachePersistType,
287
+ ttl_seconds: float | None,
288
+ max_entries: int | None,
289
+ ) -> CacheStorageContext:
290
+ return CacheStorageContext(
291
+ function_key=function_key,
292
+ function_display_name=function_name,
293
+ ttl_seconds=ttl_seconds,
294
+ max_entries=max_entries,
295
+ persist=persist,
296
+ )
297
+
298
+ def get_storage_manager(self) -> CacheStorageManager:
299
+ if runtime.exists():
300
+ return runtime.get_instance().cache_storage_manager
301
+ else:
302
+ # When running in "raw mode", we can't access the CacheStorageManager,
303
+ # so we're falling back to InMemoryCache.
304
+ _LOGGER.warning("No runtime found, using MemoryCacheStorageManager")
305
+ return MemoryCacheStorageManager()
306
+
307
+
308
+ # Singleton DataCaches instance
309
+ _data_caches = DataCaches()
310
+
311
+
312
+ def get_data_cache_stats_provider() -> CacheStatsProvider:
313
+ """Return the StatsProvider for all @st.cache_data functions."""
314
+ return _data_caches
315
+
316
+
317
+ class CacheDataAPI:
318
+ """Implements the public st.cache_data API: the @st.cache_data decorator, and
319
+ st.cache_data.clear().
320
+ """
321
+
322
+ def __init__(self, decorator_metric_name: str):
323
+ """Create a CacheDataAPI instance.
324
+
325
+ Parameters
326
+ ----------
327
+ decorator_metric_name
328
+ The metric name to record for decorator usage.
329
+ """
330
+
331
+ # Parameterize the decorator metric name.
332
+ # (Ignore spurious mypy complaints - https://github.com/python/mypy/issues/2427)
333
+ self._decorator = gather_metrics( # type: ignore
334
+ decorator_metric_name, self._decorator
335
+ )
336
+
337
+ # Type-annotate the decorator function.
338
+ # (See https://mypy.readthedocs.io/en/stable/generics.html#decorator-factories)
339
+ F = TypeVar("F", bound=Callable[..., Any])
340
+
341
+ # Bare decorator usage
342
+ @overload
343
+ def __call__(self, func: F) -> F: ...
344
+
345
+ # Decorator with arguments
346
+ @overload
347
+ def __call__(
348
+ self,
349
+ *,
350
+ ttl: float | timedelta | str | None = None,
351
+ max_entries: int | None = None,
352
+ show_spinner: bool | str = True,
353
+ persist: CachePersistType | bool = None,
354
+ experimental_allow_widgets: bool = False,
355
+ hash_funcs: HashFuncsDict | None = None,
356
+ ) -> Callable[[F], F]: ...
357
+
358
+ def __call__(
359
+ self,
360
+ func: F | None = None,
361
+ *,
362
+ ttl: float | timedelta | str | None = None,
363
+ max_entries: int | None = None,
364
+ show_spinner: bool | str = True,
365
+ persist: CachePersistType | bool = None,
366
+ experimental_allow_widgets: bool = False,
367
+ hash_funcs: HashFuncsDict | None = None,
368
+ ):
369
+ return self._decorator(
370
+ func,
371
+ ttl=ttl,
372
+ max_entries=max_entries,
373
+ persist=persist,
374
+ show_spinner=show_spinner,
375
+ experimental_allow_widgets=experimental_allow_widgets,
376
+ hash_funcs=hash_funcs,
377
+ )
378
+
379
+ def _decorator(
380
+ self,
381
+ func: F | None = None,
382
+ *,
383
+ ttl: float | timedelta | str | None,
384
+ max_entries: int | None,
385
+ show_spinner: bool | str,
386
+ persist: CachePersistType | bool,
387
+ experimental_allow_widgets: bool,
388
+ hash_funcs: HashFuncsDict | None = None,
389
+ ):
390
+ """Decorator to cache functions that return data (e.g. dataframe transforms, database queries, ML inference).
391
+
392
+ Cached objects are stored in "pickled" form, which means that the return
393
+ value of a cached function must be pickleable. Each caller of the cached
394
+ function gets its own copy of the cached data.
395
+
396
+ You can clear a function's cache with ``func.clear()`` or clear the entire
397
+ cache with ``st.cache_data.clear()``.
398
+
399
+ A function's arguments must be hashable to cache it. If you have an
400
+ unhashable argument (like a database connection) or an argument you
401
+ want to exclude from caching, use an underscore prefix in the argument
402
+ name. In this case, Streamlit will return a cached value when all other
403
+ arguments match a previous function call. Alternatively, you can
404
+ declare custom hashing functions with ``hash_funcs``.
405
+
406
+ To cache global resources, use ``st.cache_resource`` instead. Learn more
407
+ about caching at https://docs.streamlit.io/develop/concepts/architecture/caching.
408
+
409
+ Parameters
410
+ ----------
411
+ func : callable
412
+ The function to cache. Streamlit hashes the function's source code.
413
+
414
+ ttl : float, timedelta, str, or None
415
+ The maximum time to keep an entry in the cache. Can be one of:
416
+
417
+ - ``None`` if cache entries should never expire (default).
418
+ - A number specifying the time in seconds.
419
+ - A string specifying the time in a format supported by `Pandas's
420
+ Timedelta constructor <https://pandas.pydata.org/docs/reference/api/pandas.Timedelta.html>`_,
421
+ e.g. ``"1d"``, ``"1.5 days"``, or ``"1h23s"``.
422
+ - A ``timedelta`` object from `Python's built-in datetime library
423
+ <https://docs.python.org/3/library/datetime.html#timedelta-objects>`_,
424
+ e.g. ``timedelta(days=1)``.
425
+
426
+ Note that ``ttl`` will be ignored if ``persist="disk"`` or ``persist=True``.
427
+
428
+ max_entries : int or None
429
+ The maximum number of entries to keep in the cache, or None
430
+ for an unbounded cache. When a new entry is added to a full cache,
431
+ the oldest cached entry will be removed. Defaults to None.
432
+
433
+ show_spinner : bool or str
434
+ Enable the spinner. Default is True to show a spinner when there is
435
+ a "cache miss" and the cached data is being created. If string,
436
+ value of show_spinner param will be used for spinner text.
437
+
438
+ persist : "disk", bool, or None
439
+ Optional location to persist cached data to. Passing "disk" (or True)
440
+ will persist the cached data to the local disk. None (or False) will disable
441
+ persistence. The default is None.
442
+
443
+ experimental_allow_widgets : bool
444
+ Allow widgets to be used in the cached function. Defaults to False.
445
+
446
+ hash_funcs : dict or None
447
+ Mapping of types or fully qualified names to hash functions.
448
+ This is used to override the behavior of the hasher inside Streamlit's
449
+ caching mechanism: when the hasher encounters an object, it will first
450
+ check to see if its type matches a key in this dict and, if so, will use
451
+ the provided function to generate a hash for it. See below for an example
452
+ of how this can be used.
453
+
454
+ .. deprecated::
455
+ The cached widget replay functionality was removed in 1.38. Please
456
+ remove the ``experimental_allow_widgets`` parameter from your
457
+ caching decorators. This parameter will be removed in a future
458
+ version.
459
+
460
+ Example
461
+ -------
462
+ >>> import streamlit as st
463
+ >>>
464
+ >>> @st.cache_data
465
+ ... def fetch_and_clean_data(url):
466
+ ... # Fetch data from URL here, and then clean it up.
467
+ ... return data
468
+ >>>
469
+ >>> d1 = fetch_and_clean_data(DATA_URL_1)
470
+ >>> # Actually executes the function, since this is the first time it was
471
+ >>> # encountered.
472
+ >>>
473
+ >>> d2 = fetch_and_clean_data(DATA_URL_1)
474
+ >>> # Does not execute the function. Instead, returns its previously computed
475
+ >>> # value. This means that now the data in d1 is the same as in d2.
476
+ >>>
477
+ >>> d3 = fetch_and_clean_data(DATA_URL_2)
478
+ >>> # This is a different URL, so the function executes.
479
+
480
+ To set the ``persist`` parameter, use this command as follows:
481
+
482
+ >>> import streamlit as st
483
+ >>>
484
+ >>> @st.cache_data(persist="disk")
485
+ ... def fetch_and_clean_data(url):
486
+ ... # Fetch data from URL here, and then clean it up.
487
+ ... return data
488
+
489
+ By default, all parameters to a cached function must be hashable.
490
+ Any parameter whose name begins with ``_`` will not be hashed. You can use
491
+ this as an "escape hatch" for parameters that are not hashable:
492
+
493
+ >>> import streamlit as st
494
+ >>>
495
+ >>> @st.cache_data
496
+ ... def fetch_and_clean_data(_db_connection, num_rows):
497
+ ... # Fetch data from _db_connection here, and then clean it up.
498
+ ... return data
499
+ >>>
500
+ >>> connection = make_database_connection()
501
+ >>> d1 = fetch_and_clean_data(connection, num_rows=10)
502
+ >>> # Actually executes the function, since this is the first time it was
503
+ >>> # encountered.
504
+ >>>
505
+ >>> another_connection = make_database_connection()
506
+ >>> d2 = fetch_and_clean_data(another_connection, num_rows=10)
507
+ >>> # Does not execute the function. Instead, returns its previously computed
508
+ >>> # value - even though the _database_connection parameter was different
509
+ >>> # in both calls.
510
+
511
+ A cached function's cache can be procedurally cleared:
512
+
513
+ >>> import streamlit as st
514
+ >>>
515
+ >>> @st.cache_data
516
+ ... def fetch_and_clean_data(_db_connection, num_rows):
517
+ ... # Fetch data from _db_connection here, and then clean it up.
518
+ ... return data
519
+ >>>
520
+ >>> fetch_and_clean_data.clear(_db_connection, 50)
521
+ >>> # Clear the cached entry for the arguments provided.
522
+ >>>
523
+ >>> fetch_and_clean_data.clear()
524
+ >>> # Clear all cached entries for this function.
525
+
526
+ To override the default hashing behavior, pass a custom hash function.
527
+ You can do that by mapping a type (e.g. ``datetime.datetime``) to a hash
528
+ function (``lambda dt: dt.isoformat()``) like this:
529
+
530
+ >>> import streamlit as st
531
+ >>> import datetime
532
+ >>>
533
+ >>> @st.cache_data(hash_funcs={datetime.datetime: lambda dt: dt.isoformat()})
534
+ ... def convert_to_utc(dt: datetime.datetime):
535
+ ... return dt.astimezone(datetime.timezone.utc)
536
+
537
+ Alternatively, you can map the type's fully-qualified name
538
+ (e.g. ``"datetime.datetime"``) to the hash function instead:
539
+
540
+ >>> import streamlit as st
541
+ >>> import datetime
542
+ >>>
543
+ >>> @st.cache_data(hash_funcs={"datetime.datetime": lambda dt: dt.isoformat()})
544
+ ... def convert_to_utc(dt: datetime.datetime):
545
+ ... return dt.astimezone(datetime.timezone.utc)
546
+
547
+ """
548
+
549
+ # Parse our persist value into a string
550
+ persist_string: CachePersistType
551
+ if persist is True:
552
+ persist_string = "disk"
553
+ elif persist is False:
554
+ persist_string = None
555
+ else:
556
+ persist_string = persist
557
+
558
+ if persist_string not in (None, "disk"):
559
+ # We'll eventually have more persist options.
560
+ raise StreamlitAPIException(
561
+ f"Unsupported persist option '{persist}'. Valid values are 'disk' or None."
562
+ )
563
+
564
+ if experimental_allow_widgets:
565
+ show_widget_replay_deprecation("cache_data")
566
+
567
+ def wrapper(f):
568
+ return make_cached_func_wrapper(
569
+ CachedDataFuncInfo(
570
+ func=f,
571
+ persist=persist_string,
572
+ show_spinner=show_spinner,
573
+ max_entries=max_entries,
574
+ ttl=ttl,
575
+ hash_funcs=hash_funcs,
576
+ )
577
+ )
578
+
579
+ if func is None:
580
+ return wrapper
581
+
582
+ return make_cached_func_wrapper(
583
+ CachedDataFuncInfo(
584
+ func=cast(types.FunctionType, func),
585
+ persist=persist_string,
586
+ show_spinner=show_spinner,
587
+ max_entries=max_entries,
588
+ ttl=ttl,
589
+ hash_funcs=hash_funcs,
590
+ )
591
+ )
592
+
593
+ @gather_metrics("clear_data_caches")
594
+ def clear(self) -> None:
595
+ """Clear all in-memory and on-disk data caches."""
596
+ _data_caches.clear_all()
597
+
598
+
599
+ class DataCache(Cache):
600
+ """Manages cached values for a single st.cache_data function."""
601
+
602
+ def __init__(
603
+ self,
604
+ key: str,
605
+ storage: CacheStorage,
606
+ persist: CachePersistType,
607
+ max_entries: int | None,
608
+ ttl_seconds: float | None,
609
+ display_name: str,
610
+ ):
611
+ super().__init__()
612
+ self.key = key
613
+ self.display_name = display_name
614
+ self.storage = storage
615
+ self.ttl_seconds = ttl_seconds
616
+ self.max_entries = max_entries
617
+ self.persist = persist
618
+
619
+ def get_stats(self) -> list[CacheStat]:
620
+ if isinstance(self.storage, CacheStatsProvider):
621
+ return self.storage.get_stats()
622
+ return []
623
+
624
+ def read_result(self, key: str) -> CachedResult:
625
+ """Read a value and messages from the cache. Raise `CacheKeyNotFoundError`
626
+ if the value doesn't exist, and `CacheError` if the value exists but can't
627
+ be unpickled.
628
+ """
629
+ try:
630
+ pickled_entry = self.storage.get(key)
631
+ except CacheStorageKeyNotFoundError as e:
632
+ raise CacheKeyNotFoundError(str(e)) from e
633
+ except CacheStorageError as e:
634
+ raise CacheError(str(e)) from e
635
+
636
+ try:
637
+ entry = pickle.loads(pickled_entry)
638
+ if not isinstance(entry, CachedResult):
639
+ # Loaded an old cache file format, remove it and let the caller
640
+ # rerun the function.
641
+ self.storage.delete(key)
642
+ raise CacheKeyNotFoundError()
643
+ return entry
644
+ except pickle.UnpicklingError as exc:
645
+ raise CacheError(f"Failed to unpickle {key}") from exc
646
+
647
+ @gather_metrics("_cache_data_object")
648
+ def write_result(self, key: str, value: Any, messages: list[MsgData]) -> None:
649
+ """Write a value and associated messages to the cache.
650
+ The value must be pickleable.
651
+ """
652
+ try:
653
+ main_id = st._main.id
654
+ sidebar_id = st.sidebar.id
655
+ entry = CachedResult(value, messages, main_id, sidebar_id)
656
+ pickled_entry = pickle.dumps(entry)
657
+ except (pickle.PicklingError, TypeError) as exc:
658
+ raise CacheError(f"Failed to pickle {key}") from exc
659
+ self.storage.set(key, pickled_entry)
660
+
661
+ def _clear(self, key: str | None = None) -> None:
662
+ if not key:
663
+ self.storage.clear()
664
+ else:
665
+ self.storage.delete(key)