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,169 @@
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
+ """A library of caching utilities."""
16
+
17
+ from __future__ import annotations
18
+
19
+ from typing import TYPE_CHECKING, Any, Callable, TypeVar
20
+
21
+ from streamlit import deprecation_util
22
+ from streamlit.runtime.caching import CACHE_DOCS_URL
23
+ from streamlit.runtime.metrics_util import gather_metrics
24
+
25
+ if TYPE_CHECKING:
26
+ from streamlit.runtime.caching.hashing import HashFuncsDict
27
+
28
+ # Type-annotate the decorator function.
29
+ # (See https://mypy.readthedocs.io/en/stable/generics.html#decorator-factories)
30
+ F = TypeVar("F", bound=Callable[..., Any])
31
+
32
+
33
+ @gather_metrics("cache")
34
+ def cache(
35
+ func: F | None = None,
36
+ persist: bool = False,
37
+ allow_output_mutation: bool = False,
38
+ show_spinner: bool = True,
39
+ suppress_st_warning: bool = False,
40
+ hash_funcs: HashFuncsDict | None = None,
41
+ max_entries: int | None = None,
42
+ ttl: float | None = None,
43
+ ):
44
+ """Legacy caching decorator (deprecated).
45
+
46
+ Legacy caching with ``st.cache`` has been removed from Streamlit. This is
47
+ now an alias for ``st.cache_data`` and ``st.cache_resource``.
48
+
49
+ Parameters
50
+ ----------
51
+ func : callable
52
+ The function to cache. Streamlit hashes the function's source code.
53
+
54
+ persist : bool
55
+ Whether to persist the cache on disk.
56
+
57
+ allow_output_mutation : bool
58
+ Whether to use ``st.cache_data`` or ``st.cache_resource``. If this is
59
+ ``False`` (default), the arguments are passed to ``st.cache_data``. If
60
+ this is ``True``, the arguments are passed to ``st.cache_resource``.
61
+
62
+ show_spinner : bool
63
+ Enable the spinner. Default is ``True`` to show a spinner when there is
64
+ a "cache miss" and the cached data is being created.
65
+
66
+ suppress_st_warning : bool
67
+ This is not used.
68
+
69
+ hash_funcs : dict or None
70
+ Mapping of types or fully qualified names to hash functions. This is used to
71
+ override the behavior of the hasher inside Streamlit's caching mechanism: when
72
+ the hasher encounters an object, it will first check to see if its type matches
73
+ a key in this dict and, if so, will use the provided function to generate a hash
74
+ for it. See below for an example of how this can be used.
75
+
76
+ max_entries : int or None
77
+ The maximum number of entries to keep in the cache, or ``None``
78
+ for an unbounded cache. (When a new entry is added to a full cache,
79
+ the oldest cached entry will be removed.) The default is ``None``.
80
+
81
+ ttl : float or None
82
+ The maximum number of seconds to keep an entry in the cache, or
83
+ None if cache entries should not expire. The default is None.
84
+
85
+ Example
86
+ -------
87
+ >>> import streamlit as st
88
+ >>>
89
+ >>> @st.cache
90
+ ... def fetch_and_clean_data(url):
91
+ ... # Fetch data from URL here, and then clean it up.
92
+ ... return data
93
+ >>>
94
+ >>> d1 = fetch_and_clean_data(DATA_URL_1)
95
+ >>> # Actually executes the function, since this is the first time it was
96
+ >>> # encountered.
97
+ >>>
98
+ >>> d2 = fetch_and_clean_data(DATA_URL_1)
99
+ >>> # Does not execute the function. Instead, returns its previously computed
100
+ >>> # value. This means that now the data in d1 is the same as in d2.
101
+ >>>
102
+ >>> d3 = fetch_and_clean_data(DATA_URL_2)
103
+ >>> # This is a different URL, so the function executes.
104
+
105
+ To set the ``persist`` parameter, use this command as follows:
106
+
107
+ >>> @st.cache(persist=True)
108
+ ... def fetch_and_clean_data(url):
109
+ ... # Fetch data from URL here, and then clean it up.
110
+ ... return data
111
+
112
+ To disable hashing return values, set the ``allow_output_mutation`` parameter to
113
+ ``True``:
114
+
115
+ >>> @st.cache(allow_output_mutation=True)
116
+ ... def fetch_and_clean_data(url):
117
+ ... # Fetch data from URL here, and then clean it up.
118
+ ... return data
119
+
120
+
121
+ To override the default hashing behavior, pass a custom hash function.
122
+ You can do that by mapping a type (e.g. ``MongoClient``) to a hash function (``id``)
123
+ like this:
124
+
125
+ >>> @st.cache(hash_funcs={MongoClient: id})
126
+ ... def connect_to_database(url):
127
+ ... return MongoClient(url)
128
+
129
+ Alternatively, you can map the type's fully-qualified name
130
+ (e.g. ``"pymongo.mongo_client.MongoClient"``) to the hash function instead:
131
+
132
+ >>> @st.cache(hash_funcs={"pymongo.mongo_client.MongoClient": id})
133
+ ... def connect_to_database(url):
134
+ ... return MongoClient(url)
135
+
136
+ """
137
+ import streamlit as st
138
+
139
+ deprecation_util.show_deprecation_warning(
140
+ f"""
141
+ `st.cache` is deprecated and will be removed soon. Please use one of Streamlit's new
142
+ caching commands, `st.cache_data` or `st.cache_resource`. More information
143
+ [in our docs]({CACHE_DOCS_URL}).
144
+
145
+ **Note**: The behavior of `st.cache` was updated in Streamlit 1.36 to the new caching
146
+ logic used by `st.cache_data` and `st.cache_resource`. This might lead to some problems
147
+ or unexpected behavior in certain edge cases.
148
+ """
149
+ )
150
+
151
+ # suppress_st_warning is unused since its not supported by the new caching commands
152
+
153
+ if allow_output_mutation:
154
+ return st.cache_resource( # type: ignore
155
+ func,
156
+ show_spinner=show_spinner,
157
+ hash_funcs=hash_funcs,
158
+ max_entries=max_entries,
159
+ ttl=ttl,
160
+ )
161
+
162
+ return st.cache_data( # type: ignore
163
+ func,
164
+ persist=persist,
165
+ show_spinner=show_spinner,
166
+ hash_funcs=hash_funcs,
167
+ max_entries=max_entries,
168
+ ttl=ttl,
169
+ )
@@ -0,0 +1,29 @@
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 streamlit.runtime.caching.storage.cache_storage_protocol import (
16
+ CacheStorage,
17
+ CacheStorageContext,
18
+ CacheStorageError,
19
+ CacheStorageKeyNotFoundError,
20
+ CacheStorageManager,
21
+ )
22
+
23
+ __all__ = [
24
+ "CacheStorage",
25
+ "CacheStorageContext",
26
+ "CacheStorageError",
27
+ "CacheStorageKeyNotFoundError",
28
+ "CacheStorageManager",
29
+ ]
@@ -0,0 +1,239 @@
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
+ """Declares the CacheStorageContext dataclass, which contains parameter information for
16
+ each function decorated by `@st.cache_data` (for example: ttl, max_entries etc.)
17
+
18
+ Declares the CacheStorageManager protocol, which implementations are used
19
+ to create CacheStorage instances and to optionally clear all cache storages,
20
+ that were created by this manager, and to check if the context is valid for the storage.
21
+
22
+ Declares the CacheStorage protocol, which implementations are used to store cached
23
+ values for a single `@st.cache_data` decorated function serialized as bytes.
24
+
25
+ How these classes work together
26
+ -------------------------------
27
+ - CacheStorageContext : this is a dataclass that contains the parameters from
28
+ `@st.cache_data` that are passed to the CacheStorageManager.create() method.
29
+
30
+ - CacheStorageManager : each instance of this is able to create CacheStorage
31
+ instances, and optionally to clear data of all cache storages.
32
+
33
+ - CacheStorage : each instance of this is able to get, set, delete, and clear
34
+ entries for a single `@st.cache_data` decorated function.
35
+
36
+ ┌───────────────────────────────┐
37
+ │ │
38
+ │ CacheStorageManager │
39
+ │ │
40
+ │ - clear_all(optional) │
41
+ │ - check_context │
42
+ │ │
43
+ └──┬────────────────────────────┘
44
+
45
+ │ ┌──────────────────────┐
46
+ │ │ CacheStorage │
47
+ │ create(context)│ │
48
+ └────────────────► - get │
49
+ │ - set │
50
+ │ - delete │
51
+ │ - close (optional)│
52
+ │ - clear │
53
+ └──────────────────────┘
54
+ """
55
+
56
+ from __future__ import annotations
57
+
58
+ from abc import abstractmethod
59
+ from dataclasses import dataclass
60
+ from typing import Literal, Protocol
61
+
62
+
63
+ class CacheStorageError(Exception):
64
+ """Base exception raised by the cache storage"""
65
+
66
+
67
+ class CacheStorageKeyNotFoundError(CacheStorageError):
68
+ """Raised when the key is not found in the cache storage"""
69
+
70
+
71
+ class InvalidCacheStorageContext(CacheStorageError):
72
+ """Raised if the cache storage manager is not able to work with
73
+ provided CacheStorageContext.
74
+ """
75
+
76
+
77
+ @dataclass(frozen=True)
78
+ class CacheStorageContext:
79
+ """Context passed to the cache storage during initialization
80
+ This is the normalized parameters that are passed to CacheStorageManager.create()
81
+ method.
82
+
83
+ Parameters
84
+ ----------
85
+ function_key: str
86
+ A hash computed based on function name and source code decorated
87
+ by `@st.cache_data`
88
+
89
+ function_display_name: str
90
+ The display name of the function that is decorated by `@st.cache_data`
91
+
92
+ ttl_seconds : float or None
93
+ The time-to-live for the keys in storage, in seconds. If None, the entry
94
+ will never expire.
95
+
96
+ max_entries : int or None
97
+ The maximum number of entries to store in the cache storage.
98
+ If None, the cache storage will not limit the number of entries.
99
+
100
+ persist : Literal["disk"] or None
101
+ The persistence mode for the cache storage.
102
+ Legacy parameter, that used in Streamlit current cache storage implementation.
103
+ Could be ignored by cache storage implementation, if storage does not support
104
+ persistence or it persistent by default.
105
+ """
106
+
107
+ function_key: str
108
+ function_display_name: str
109
+ ttl_seconds: float | None = None
110
+ max_entries: int | None = None
111
+ persist: Literal["disk"] | None = None
112
+
113
+
114
+ class CacheStorage(Protocol):
115
+ """Cache storage protocol, that should be implemented by the concrete cache storages.
116
+ Used to store cached values for a single `@st.cache_data` decorated function
117
+ serialized as bytes.
118
+
119
+ CacheStorage instances should be created by `CacheStorageManager.create()` method.
120
+
121
+ Notes
122
+ -----
123
+ Threading: The methods of this protocol could be called from multiple threads.
124
+ This is a responsibility of the concrete implementation to ensure thread safety
125
+ guarantees.
126
+ """
127
+
128
+ @abstractmethod
129
+ def get(self, key: str) -> bytes:
130
+ """Returns the stored value for the key.
131
+
132
+ Raises
133
+ ------
134
+ CacheStorageKeyNotFoundError
135
+ Raised if the key is not in the storage.
136
+ """
137
+ raise NotImplementedError
138
+
139
+ @abstractmethod
140
+ def set(self, key: str, value: bytes) -> None:
141
+ """Sets the value for a given key"""
142
+ raise NotImplementedError
143
+
144
+ @abstractmethod
145
+ def delete(self, key: str) -> None:
146
+ """Delete a given key"""
147
+ raise NotImplementedError
148
+
149
+ @abstractmethod
150
+ def clear(self) -> None:
151
+ """Remove all keys for the storage"""
152
+ raise NotImplementedError
153
+
154
+ def close(self) -> None:
155
+ """Closes the cache storage, it is optional to implement, and should be used
156
+ to close open resources, before we delete the storage instance.
157
+ e.g. close the database connection etc.
158
+ """
159
+ pass
160
+
161
+
162
+ class CacheStorageManager(Protocol):
163
+ """Cache storage manager protocol, that should be implemented by the concrete
164
+ cache storage managers.
165
+
166
+ It is responsible for:
167
+ - Creating cache storage instances for the specific
168
+ decorated functions,
169
+ - Validating the context for the cache storages.
170
+ - Optionally clearing all cache storages in optimal way.
171
+
172
+ It should be created during Runtime initialization.
173
+ """
174
+
175
+ @abstractmethod
176
+ def create(self, context: CacheStorageContext) -> CacheStorage:
177
+ """Creates a new cache storage instance
178
+ Please note that the ttl, max_entries and other context fields are specific
179
+ for whole storage, not for individual key.
180
+
181
+ Notes
182
+ -----
183
+ Threading: Should be safe to call from any thread.
184
+ """
185
+ raise NotImplementedError
186
+
187
+ def clear_all(self) -> None:
188
+ """Remove everything what possible from the cache storages in optimal way.
189
+ meaningful default behaviour is to raise NotImplementedError, so this is not
190
+ abstractmethod.
191
+
192
+ The method is optional to implement: cache data API will fall back to remove
193
+ all available storages one by one via storage.clear() method
194
+ if clear_all raises NotImplementedError.
195
+
196
+ Raises
197
+ ------
198
+ NotImplementedError
199
+ Raised if the storage manager does not provide an ability to clear
200
+ all storages at once in optimal way.
201
+
202
+ Notes
203
+ -----
204
+ Threading: This method could be called from multiple threads.
205
+ This is a responsibility of the concrete implementation to ensure
206
+ thread safety guarantees.
207
+ """
208
+ raise NotImplementedError
209
+
210
+ def check_context(self, context: CacheStorageContext) -> None:
211
+ """Checks if the context is valid for the storage manager.
212
+ This method should not return anything, but log message or raise an exception
213
+ if the context is invalid.
214
+
215
+ In case of raising an exception, we not handle it and let the exception to be
216
+ propagated.
217
+
218
+ check_context is called only once at the moment of creating `@st.cache_data`
219
+ decorator for specific function, so it is not called for every cache hit.
220
+
221
+ Parameters
222
+ ----------
223
+ context: CacheStorageContext
224
+ The context to check for the storage manager, dummy function_key in context
225
+ will be used, since it is not computed at the point of calling this method.
226
+
227
+ Raises
228
+ ------
229
+ InvalidCacheStorageContext
230
+ Raised if the cache storage manager is not able to work with provided
231
+ CacheStorageContext. When possible we should log message instead, since
232
+ this exception will be propagated to the user.
233
+
234
+ Notes
235
+ -----
236
+ Threading: Should be safe to call from any thread.
237
+ """
238
+
239
+ pass
@@ -0,0 +1,60 @@
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
+ from __future__ import annotations
15
+
16
+ from streamlit.runtime.caching.storage.cache_storage_protocol import (
17
+ CacheStorage,
18
+ CacheStorageContext,
19
+ CacheStorageKeyNotFoundError,
20
+ CacheStorageManager,
21
+ )
22
+ from streamlit.runtime.caching.storage.in_memory_cache_storage_wrapper import (
23
+ InMemoryCacheStorageWrapper,
24
+ )
25
+
26
+
27
+ class MemoryCacheStorageManager(CacheStorageManager):
28
+ def create(self, context: CacheStorageContext) -> CacheStorage:
29
+ """Creates a new cache storage instance wrapped with in-memory cache layer"""
30
+ persist_storage = DummyCacheStorage()
31
+ return InMemoryCacheStorageWrapper(
32
+ persist_storage=persist_storage, context=context
33
+ )
34
+
35
+ def clear_all(self) -> None:
36
+ raise NotImplementedError
37
+
38
+ def check_context(self, context: CacheStorageContext) -> None:
39
+ pass
40
+
41
+
42
+ class DummyCacheStorage(CacheStorage):
43
+ def get(self, key: str) -> bytes:
44
+ """
45
+ Dummy gets the value for a given key,
46
+ always raises an CacheStorageKeyNotFoundError
47
+ """
48
+ raise CacheStorageKeyNotFoundError("Key not found in dummy cache")
49
+
50
+ def set(self, key: str, value: bytes) -> None:
51
+ pass
52
+
53
+ def delete(self, key: str) -> None:
54
+ pass
55
+
56
+ def clear(self) -> None:
57
+ pass
58
+
59
+ def close(self) -> None:
60
+ pass
@@ -0,0 +1,145 @@
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
+ from __future__ import annotations
15
+
16
+ import math
17
+ import threading
18
+
19
+ from cachetools import TTLCache
20
+
21
+ from streamlit.logger import get_logger
22
+ from streamlit.runtime.caching import cache_utils
23
+ from streamlit.runtime.caching.storage.cache_storage_protocol import (
24
+ CacheStorage,
25
+ CacheStorageContext,
26
+ CacheStorageKeyNotFoundError,
27
+ )
28
+ from streamlit.runtime.stats import CacheStat
29
+
30
+ _LOGGER = get_logger(__name__)
31
+
32
+
33
+ class InMemoryCacheStorageWrapper(CacheStorage):
34
+ """
35
+ In-memory cache storage wrapper.
36
+
37
+ This class wraps a cache storage and adds an in-memory cache front layer,
38
+ which is used to reduce the number of calls to the storage.
39
+
40
+ The in-memory cache is a TTL cache, which means that the entries are
41
+ automatically removed if a given time to live (TTL) has passed.
42
+
43
+ The in-memory cache is also an LRU cache, which means that the entries
44
+ are automatically removed if the cache size exceeds a given maxsize.
45
+
46
+ If the storage implements its strategy for maxsize, it is recommended
47
+ (but not necessary) that the storage implement the same LRU strategy,
48
+ otherwise a situation may arise when different items are deleted from
49
+ the memory cache and from the storage.
50
+
51
+ Notes
52
+ -----
53
+ Threading: in-memory caching layer is thread safe: we hold self._mem_cache_lock for
54
+ working with this self._mem_cache object.
55
+ However, we do not hold this lock when calling into the underlying storage,
56
+ so it is the responsibility of the that storage to ensure that it is safe to use
57
+ it from multiple threads.
58
+ """
59
+
60
+ def __init__(self, persist_storage: CacheStorage, context: CacheStorageContext):
61
+ self.function_key = context.function_key
62
+ self.function_display_name = context.function_display_name
63
+ self._ttl_seconds = context.ttl_seconds
64
+ self._max_entries = context.max_entries
65
+ self._mem_cache: TTLCache[str, bytes] = TTLCache(
66
+ maxsize=self.max_entries,
67
+ ttl=self.ttl_seconds,
68
+ timer=cache_utils.TTLCACHE_TIMER,
69
+ )
70
+ self._mem_cache_lock = threading.Lock()
71
+ self._persist_storage = persist_storage
72
+
73
+ @property
74
+ def ttl_seconds(self) -> float:
75
+ return self._ttl_seconds if self._ttl_seconds is not None else math.inf
76
+
77
+ @property
78
+ def max_entries(self) -> float:
79
+ return float(self._max_entries) if self._max_entries is not None else math.inf
80
+
81
+ def get(self, key: str) -> bytes:
82
+ """
83
+ Returns the stored value for the key or raise CacheStorageKeyNotFoundError if
84
+ the key is not found
85
+ """
86
+ try:
87
+ entry_bytes = self._read_from_mem_cache(key)
88
+ except CacheStorageKeyNotFoundError:
89
+ entry_bytes = self._persist_storage.get(key)
90
+ self._write_to_mem_cache(key, entry_bytes)
91
+ return entry_bytes
92
+
93
+ def set(self, key: str, value: bytes) -> None:
94
+ """Sets the value for a given key"""
95
+ self._write_to_mem_cache(key, value)
96
+ self._persist_storage.set(key, value)
97
+
98
+ def delete(self, key: str) -> None:
99
+ """Delete a given key"""
100
+ self._remove_from_mem_cache(key)
101
+ self._persist_storage.delete(key)
102
+
103
+ def clear(self) -> None:
104
+ """Delete all keys for the in memory cache, and also the persistent storage"""
105
+ with self._mem_cache_lock:
106
+ self._mem_cache.clear()
107
+ self._persist_storage.clear()
108
+
109
+ def get_stats(self) -> list[CacheStat]:
110
+ """Returns a list of stats in bytes for the cache memory storage per item"""
111
+ stats = []
112
+
113
+ with self._mem_cache_lock:
114
+ for item in self._mem_cache.values():
115
+ stats.append(
116
+ CacheStat(
117
+ category_name="st_cache_data",
118
+ cache_name=self.function_display_name,
119
+ byte_length=len(item),
120
+ )
121
+ )
122
+ return stats
123
+
124
+ def close(self) -> None:
125
+ """Closes the cache storage"""
126
+ self._persist_storage.close()
127
+
128
+ def _read_from_mem_cache(self, key: str) -> bytes:
129
+ with self._mem_cache_lock:
130
+ if key in self._mem_cache:
131
+ entry = bytes(self._mem_cache[key])
132
+ _LOGGER.debug("Memory cache HIT: %s", key)
133
+ return entry
134
+
135
+ else:
136
+ _LOGGER.debug("Memory cache MISS: %s", key)
137
+ raise CacheStorageKeyNotFoundError("Key not found in mem cache")
138
+
139
+ def _write_to_mem_cache(self, key: str, entry_bytes: bytes) -> None:
140
+ with self._mem_cache_lock:
141
+ self._mem_cache[key] = entry_bytes
142
+
143
+ def _remove_from_mem_cache(self, key: str) -> None:
144
+ with self._mem_cache_lock:
145
+ self._mem_cache.pop(key, None)