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,637 @@
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
+ """Hashing for st.cache_data and st.cache_resource."""
16
+
17
+ from __future__ import annotations
18
+
19
+ import collections
20
+ import collections.abc
21
+ import dataclasses
22
+ import datetime
23
+ import functools
24
+ import hashlib
25
+ import inspect
26
+ import io
27
+ import os
28
+ import pickle
29
+ import sys
30
+ import tempfile
31
+ import threading
32
+ import uuid
33
+ import weakref
34
+ from enum import Enum
35
+ from re import Pattern
36
+ from types import MappingProxyType
37
+ from typing import Any, Callable, Final, Union, cast
38
+
39
+ from typing_extensions import TypeAlias
40
+
41
+ from streamlit import logger, type_util, util
42
+ from streamlit.errors import StreamlitAPIException
43
+ from streamlit.runtime.caching.cache_errors import UnhashableTypeError
44
+ from streamlit.runtime.caching.cache_type import CacheType
45
+ from streamlit.runtime.uploaded_file_manager import UploadedFile
46
+
47
+ _LOGGER: Final = logger.get_logger(__name__)
48
+
49
+ # If a dataframe has more than this many rows, we consider it large and hash a sample.
50
+ _PANDAS_ROWS_LARGE: Final = 50_000
51
+ _PANDAS_SAMPLE_SIZE: Final = 10_000
52
+
53
+ # Similar to dataframes, we also sample large numpy arrays.
54
+ _NP_SIZE_LARGE: Final = 500_000
55
+ _NP_SAMPLE_SIZE: Final = 100_000
56
+
57
+ HashFuncsDict: TypeAlias = dict[Union[str, type[Any]], Callable[[Any], Any]]
58
+
59
+ # Arbitrary item to denote where we found a cycle in a hashed object.
60
+ # This allows us to hash self-referencing lists, dictionaries, etc.
61
+ _CYCLE_PLACEHOLDER: Final = (
62
+ b"streamlit-57R34ML17-hesamagicalponyflyingthroughthesky-CYCLE"
63
+ )
64
+
65
+
66
+ class UserHashError(StreamlitAPIException):
67
+ def __init__(
68
+ self,
69
+ orig_exc,
70
+ object_to_hash,
71
+ hash_func,
72
+ cache_type: CacheType | None = None,
73
+ ):
74
+ self.alternate_name = type(orig_exc).__name__
75
+ self.hash_func = hash_func
76
+ self.cache_type = cache_type
77
+
78
+ msg = self._get_message_from_func(orig_exc, object_to_hash)
79
+
80
+ super().__init__(msg)
81
+ self.with_traceback(orig_exc.__traceback__)
82
+
83
+ def _get_message_from_func(self, orig_exc, cached_func):
84
+ args = self._get_error_message_args(orig_exc, cached_func)
85
+
86
+ return (
87
+ """
88
+ %(orig_exception_desc)s
89
+
90
+ This error is likely due to a bug in %(hash_func_name)s, which is a
91
+ user-defined hash function that was passed into the `%(cache_primitive)s` decorator of
92
+ %(object_desc)s.
93
+
94
+ %(hash_func_name)s failed when hashing an object of type
95
+ `%(failed_obj_type_str)s`. If you don't know where that object is coming from,
96
+ try looking at the hash chain below for an object that you do recognize, then
97
+ pass that to `hash_funcs` instead:
98
+
99
+ ```
100
+ %(hash_stack)s
101
+ ```
102
+
103
+ If you think this is actually a Streamlit bug, please
104
+ [file a bug report here](https://github.com/streamlit/streamlit/issues/new/choose).
105
+ """
106
+ % args
107
+ ).strip("\n")
108
+
109
+ def _get_error_message_args(
110
+ self,
111
+ orig_exc: BaseException,
112
+ failed_obj: Any,
113
+ ) -> dict[str, Any]:
114
+ hash_source = hash_stacks.current.hash_source
115
+
116
+ failed_obj_type_str = type_util.get_fqn_type(failed_obj)
117
+
118
+ if hash_source is None:
119
+ object_desc = "something"
120
+ else:
121
+ if hasattr(hash_source, "__name__"):
122
+ object_desc = f"`{hash_source.__name__}()`"
123
+ else:
124
+ object_desc = "a function"
125
+
126
+ decorator_name = ""
127
+ if self.cache_type is CacheType.RESOURCE:
128
+ decorator_name = "@st.cache_resource"
129
+ elif self.cache_type is CacheType.DATA:
130
+ decorator_name = "@st.cache_data"
131
+
132
+ if hasattr(self.hash_func, "__name__"):
133
+ hash_func_name = f"`{self.hash_func.__name__}()`"
134
+ else:
135
+ hash_func_name = "a function"
136
+
137
+ return {
138
+ "orig_exception_desc": str(orig_exc),
139
+ "failed_obj_type_str": failed_obj_type_str,
140
+ "hash_stack": hash_stacks.current.pretty_print(),
141
+ "object_desc": object_desc,
142
+ "cache_primitive": decorator_name,
143
+ "hash_func_name": hash_func_name,
144
+ }
145
+
146
+
147
+ def update_hash(
148
+ val: Any,
149
+ hasher,
150
+ cache_type: CacheType,
151
+ hash_source: Callable[..., Any] | None = None,
152
+ hash_funcs: HashFuncsDict | None = None,
153
+ ) -> None:
154
+ """Updates a hashlib hasher with the hash of val.
155
+
156
+ This is the main entrypoint to hashing.py.
157
+ """
158
+
159
+ hash_stacks.current.hash_source = hash_source
160
+
161
+ ch = _CacheFuncHasher(cache_type, hash_funcs)
162
+ ch.update(hasher, val)
163
+
164
+
165
+ class _HashStack:
166
+ """Stack of what has been hashed, for debug and circular reference detection.
167
+
168
+ This internally keeps 1 stack per thread.
169
+
170
+ Internally, this stores the ID of pushed objects rather than the objects
171
+ themselves because otherwise the "in" operator inside __contains__ would
172
+ fail for objects that don't return a boolean for "==" operator. For
173
+ example, arr == 10 where arr is a NumPy array returns another NumPy array.
174
+ This causes the "in" to crash since it expects a boolean.
175
+ """
176
+
177
+ def __init__(self):
178
+ self._stack: collections.OrderedDict[int, list[Any]] = collections.OrderedDict()
179
+ # A function that we decorate with streamlit cache
180
+ # primitive (st.cache_data or st.cache_resource).
181
+ self.hash_source: Callable[..., Any] | None = None
182
+
183
+ def __repr__(self) -> str:
184
+ return util.repr_(self)
185
+
186
+ def push(self, val: Any):
187
+ self._stack[id(val)] = val
188
+
189
+ def pop(self):
190
+ self._stack.popitem()
191
+
192
+ def __contains__(self, val: Any):
193
+ return id(val) in self._stack
194
+
195
+ def pretty_print(self) -> str:
196
+ def to_str(v: Any) -> str:
197
+ try:
198
+ return f"Object of type {type_util.get_fqn_type(v)}: {str(v)}"
199
+ except Exception:
200
+ return "<Unable to convert item to string>"
201
+
202
+ return "\n".join(to_str(x) for x in reversed(self._stack.values()))
203
+
204
+
205
+ class _HashStacks:
206
+ """Stacks of what has been hashed, with at most 1 stack per thread."""
207
+
208
+ def __init__(self):
209
+ self._stacks: weakref.WeakKeyDictionary[threading.Thread, _HashStack] = (
210
+ weakref.WeakKeyDictionary()
211
+ )
212
+
213
+ def __repr__(self) -> str:
214
+ return util.repr_(self)
215
+
216
+ @property
217
+ def current(self) -> _HashStack:
218
+ current_thread = threading.current_thread()
219
+
220
+ stack = self._stacks.get(current_thread, None)
221
+
222
+ if stack is None:
223
+ stack = _HashStack()
224
+ self._stacks[current_thread] = stack
225
+
226
+ return stack
227
+
228
+
229
+ hash_stacks = _HashStacks()
230
+
231
+
232
+ def _int_to_bytes(i: int) -> bytes:
233
+ num_bytes = (i.bit_length() + 8) // 8
234
+ return i.to_bytes(num_bytes, "little", signed=True)
235
+
236
+
237
+ def _float_to_bytes(f: float) -> bytes:
238
+ # Lazy-load for performance reasons.
239
+ import struct
240
+
241
+ # Floats are 64bit in Python, so we need to use the "d" format.
242
+ return struct.pack("<d", f)
243
+
244
+
245
+ def _key(obj: Any | None) -> Any:
246
+ """Return key for memoization."""
247
+
248
+ if obj is None:
249
+ return None
250
+
251
+ def is_simple(obj):
252
+ return (
253
+ isinstance(obj, bytes)
254
+ or isinstance(obj, bytearray)
255
+ or isinstance(obj, str)
256
+ or isinstance(obj, float)
257
+ or isinstance(obj, int)
258
+ or isinstance(obj, bool)
259
+ or isinstance(obj, uuid.UUID)
260
+ or obj is None
261
+ )
262
+
263
+ if is_simple(obj):
264
+ return obj
265
+
266
+ if isinstance(obj, tuple):
267
+ if all(map(is_simple, obj)):
268
+ return obj
269
+
270
+ if isinstance(obj, list):
271
+ if all(map(is_simple, obj)):
272
+ return ("__l", tuple(obj))
273
+
274
+ if inspect.isbuiltin(obj) or inspect.isroutine(obj) or inspect.iscode(obj):
275
+ return id(obj)
276
+
277
+ return NoResult
278
+
279
+
280
+ class _CacheFuncHasher:
281
+ """A hasher that can hash objects with cycles."""
282
+
283
+ def __init__(self, cache_type: CacheType, hash_funcs: HashFuncsDict | None = None):
284
+ # Can't use types as the keys in the internal _hash_funcs because
285
+ # we always remove user-written modules from memory when rerunning a
286
+ # script in order to reload it and grab the latest code changes.
287
+ # (See LocalSourcesWatcher.py:on_file_changed) This causes
288
+ # the type object to refer to different underlying class instances each run,
289
+ # so type-based comparisons fail. To solve this, we use the types converted
290
+ # to fully-qualified strings as keys in our internal dict.
291
+ self._hash_funcs: HashFuncsDict
292
+ if hash_funcs:
293
+ self._hash_funcs = {
294
+ k if isinstance(k, str) else type_util.get_fqn(k): v
295
+ for k, v in hash_funcs.items()
296
+ }
297
+ else:
298
+ self._hash_funcs = {}
299
+ self._hashes: dict[Any, bytes] = {}
300
+
301
+ # The number of the bytes in the hash.
302
+ self.size = 0
303
+
304
+ self.cache_type = cache_type
305
+
306
+ def __repr__(self) -> str:
307
+ return util.repr_(self)
308
+
309
+ def to_bytes(self, obj: Any) -> bytes:
310
+ """Add memoization to _to_bytes and protect against cycles in data structures."""
311
+ tname = type(obj).__qualname__.encode()
312
+ key = (tname, _key(obj))
313
+
314
+ # Memoize if possible.
315
+ if key[1] is not NoResult:
316
+ if key in self._hashes:
317
+ return self._hashes[key]
318
+
319
+ # Break recursive cycles.
320
+ if obj in hash_stacks.current:
321
+ return _CYCLE_PLACEHOLDER
322
+
323
+ hash_stacks.current.push(obj)
324
+
325
+ try:
326
+ # Hash the input
327
+ b = b"%s:%s" % (tname, self._to_bytes(obj))
328
+
329
+ # Hmmm... It's possible that the size calculation is wrong. When we
330
+ # call to_bytes inside _to_bytes things get double-counted.
331
+ self.size += sys.getsizeof(b)
332
+
333
+ if key[1] is not NoResult:
334
+ self._hashes[key] = b
335
+
336
+ finally:
337
+ # In case an UnhashableTypeError (or other) error is thrown, clean up the
338
+ # stack so we don't get false positives in future hashing calls
339
+ hash_stacks.current.pop()
340
+
341
+ return b
342
+
343
+ def update(self, hasher, obj: Any) -> None:
344
+ """Update the provided hasher with the hash of an object."""
345
+ b = self.to_bytes(obj)
346
+ hasher.update(b)
347
+
348
+ def _to_bytes(self, obj: Any) -> bytes:
349
+ """Hash objects to bytes, including code with dependencies.
350
+
351
+ Python's built in `hash` does not produce consistent results across
352
+ runs.
353
+ """
354
+
355
+ h = hashlib.new("md5", usedforsecurity=False)
356
+
357
+ if type_util.is_type(obj, "unittest.mock.Mock") or type_util.is_type(
358
+ obj, "unittest.mock.MagicMock"
359
+ ):
360
+ # Mock objects can appear to be infinitely
361
+ # deep, so we don't try to hash them at all.
362
+ return self.to_bytes(id(obj))
363
+
364
+ elif isinstance(obj, bytes) or isinstance(obj, bytearray):
365
+ return obj
366
+
367
+ elif type_util.get_fqn_type(obj) in self._hash_funcs:
368
+ # Escape hatch for unsupported objects
369
+ hash_func = self._hash_funcs[type_util.get_fqn_type(obj)]
370
+ try:
371
+ output = hash_func(obj)
372
+ except Exception as ex:
373
+ raise UserHashError(
374
+ ex, obj, hash_func=hash_func, cache_type=self.cache_type
375
+ ) from ex
376
+ return self.to_bytes(output)
377
+
378
+ elif isinstance(obj, str):
379
+ return obj.encode()
380
+
381
+ elif isinstance(obj, float):
382
+ return _float_to_bytes(obj)
383
+
384
+ elif isinstance(obj, int):
385
+ return _int_to_bytes(obj)
386
+
387
+ elif isinstance(obj, uuid.UUID):
388
+ return obj.bytes
389
+
390
+ elif isinstance(obj, datetime.datetime):
391
+ return obj.isoformat().encode()
392
+
393
+ elif isinstance(obj, (list, tuple)):
394
+ for item in obj:
395
+ self.update(h, item)
396
+ return h.digest()
397
+
398
+ elif isinstance(obj, dict):
399
+ for item in obj.items():
400
+ self.update(h, item)
401
+ return h.digest()
402
+
403
+ elif obj is None:
404
+ return b"0"
405
+
406
+ elif obj is True:
407
+ return b"1"
408
+
409
+ elif obj is False:
410
+ return b"0"
411
+
412
+ elif not isinstance(obj, type) and dataclasses.is_dataclass(obj):
413
+ return self.to_bytes(dataclasses.asdict(obj))
414
+ elif isinstance(obj, Enum):
415
+ return str(obj).encode()
416
+
417
+ elif type_util.is_type(obj, "pandas.core.series.Series"):
418
+ import pandas as pd
419
+
420
+ obj = cast(pd.Series, obj)
421
+ self.update(h, obj.size)
422
+ self.update(h, obj.dtype.name)
423
+
424
+ if len(obj) >= _PANDAS_ROWS_LARGE:
425
+ obj = obj.sample(n=_PANDAS_SAMPLE_SIZE, random_state=0)
426
+
427
+ try:
428
+ self.update(h, pd.util.hash_pandas_object(obj).to_numpy().tobytes())
429
+ return h.digest()
430
+ except TypeError:
431
+ _LOGGER.warning(
432
+ "Pandas Series hash failed. Falling back to pickling the object.",
433
+ exc_info=True,
434
+ )
435
+
436
+ # Use pickle if pandas cannot hash the object for example if
437
+ # it contains unhashable objects.
438
+ return b"%s" % pickle.dumps(obj, pickle.HIGHEST_PROTOCOL)
439
+
440
+ elif type_util.is_type(obj, "pandas.core.frame.DataFrame"):
441
+ import pandas as pd
442
+
443
+ obj = cast(pd.DataFrame, obj)
444
+ self.update(h, obj.shape)
445
+
446
+ if len(obj) >= _PANDAS_ROWS_LARGE:
447
+ obj = obj.sample(n=_PANDAS_SAMPLE_SIZE, random_state=0)
448
+ try:
449
+ column_hash_bytes = self.to_bytes(
450
+ pd.util.hash_pandas_object(obj.dtypes)
451
+ )
452
+ self.update(h, column_hash_bytes)
453
+ values_hash_bytes = self.to_bytes(pd.util.hash_pandas_object(obj))
454
+ self.update(h, values_hash_bytes)
455
+ return h.digest()
456
+ except TypeError:
457
+ _LOGGER.warning(
458
+ "Pandas DataFrame hash failed. Falling back to pickling the object.",
459
+ exc_info=True,
460
+ )
461
+
462
+ # Use pickle if pandas cannot hash the object for example if
463
+ # it contains unhashable objects.
464
+ return b"%s" % pickle.dumps(obj, pickle.HIGHEST_PROTOCOL)
465
+
466
+ elif type_util.is_type(obj, "polars.series.series.Series"):
467
+ import polars as pl # type: ignore[import-not-found]
468
+
469
+ obj = cast(pl.Series, obj)
470
+ self.update(h, str(obj.dtype).encode())
471
+ self.update(h, obj.shape)
472
+
473
+ if len(obj) >= _PANDAS_ROWS_LARGE:
474
+ obj = obj.sample(n=_PANDAS_SAMPLE_SIZE, seed=0)
475
+
476
+ try:
477
+ self.update(h, obj.hash(seed=0).to_arrow().to_string().encode())
478
+ return h.digest()
479
+ except TypeError:
480
+ _LOGGER.warning(
481
+ "Polars Series hash failed. Falling back to pickling the object.",
482
+ exc_info=True,
483
+ )
484
+
485
+ # Use pickle if polars cannot hash the object for example if
486
+ # it contains unhashable objects.
487
+ return b"%s" % pickle.dumps(obj, pickle.HIGHEST_PROTOCOL)
488
+ elif type_util.is_type(obj, "polars.dataframe.frame.DataFrame"):
489
+ import polars as pl
490
+
491
+ obj = cast(pl.DataFrame, obj)
492
+ self.update(h, obj.shape)
493
+
494
+ if len(obj) >= _PANDAS_ROWS_LARGE:
495
+ obj = obj.sample(n=_PANDAS_SAMPLE_SIZE, seed=0)
496
+ try:
497
+ for c, t in obj.schema.items():
498
+ self.update(h, c.encode())
499
+ self.update(h, str(t).encode())
500
+
501
+ values_hash_bytes = (
502
+ obj.hash_rows(seed=0).hash(seed=0).to_arrow().to_string().encode()
503
+ )
504
+
505
+ self.update(h, values_hash_bytes)
506
+ return h.digest()
507
+ except TypeError:
508
+ _LOGGER.warning(
509
+ "Polars DataFrame hash failed. Falling back to pickling the object.",
510
+ exc_info=True,
511
+ )
512
+
513
+ # Use pickle if polars cannot hash the object for example if
514
+ # it contains unhashable objects.
515
+ return b"%s" % pickle.dumps(obj, pickle.HIGHEST_PROTOCOL)
516
+ elif type_util.is_type(obj, "numpy.ndarray"):
517
+ import numpy as np
518
+
519
+ # write cast type as string to make it work with our Python 3.8 tests
520
+ # - can be removed once we sunset support for Python 3.8
521
+ obj = cast("np.ndarray[Any, Any]", obj)
522
+ self.update(h, obj.shape)
523
+ self.update(h, str(obj.dtype))
524
+
525
+ if obj.size >= _NP_SIZE_LARGE:
526
+ import numpy as np
527
+
528
+ state = np.random.RandomState(0)
529
+ obj = state.choice(obj.flat, size=_NP_SAMPLE_SIZE)
530
+
531
+ self.update(h, obj.tobytes())
532
+ return h.digest()
533
+ elif type_util.is_type(obj, "PIL.Image.Image"):
534
+ import numpy as np
535
+ from PIL.Image import Image
536
+
537
+ obj = cast(Image, obj)
538
+
539
+ # we don't just hash the results of obj.tobytes() because we want to use
540
+ # the sampling logic for numpy data
541
+ np_array = np.frombuffer(obj.tobytes(), dtype="uint8")
542
+ return self.to_bytes(np_array)
543
+
544
+ elif inspect.isbuiltin(obj):
545
+ return bytes(obj.__name__.encode())
546
+
547
+ elif isinstance(obj, MappingProxyType) or isinstance(
548
+ obj, collections.abc.ItemsView
549
+ ):
550
+ return self.to_bytes(dict(obj))
551
+
552
+ elif type_util.is_type(obj, "builtins.getset_descriptor"):
553
+ return bytes(obj.__qualname__.encode())
554
+
555
+ elif isinstance(obj, UploadedFile):
556
+ # UploadedFile is a BytesIO (thus IOBase) but has a name.
557
+ # It does not have a timestamp so this must come before
558
+ # temporary files
559
+ self.update(h, obj.name)
560
+ self.update(h, obj.tell())
561
+ self.update(h, obj.getvalue())
562
+ return h.digest()
563
+
564
+ elif hasattr(obj, "name") and (
565
+ isinstance(obj, io.IOBase)
566
+ # Handle temporary files used during testing
567
+ or isinstance(obj, tempfile._TemporaryFileWrapper)
568
+ ):
569
+ # Hash files as name + last modification date + offset.
570
+ # NB: we're using hasattr("name") to differentiate between
571
+ # on-disk and in-memory StringIO/BytesIO file representations.
572
+ # That means that this condition must come *before* the next
573
+ # condition, which just checks for StringIO/BytesIO.
574
+ obj_name = getattr(obj, "name", "wonthappen") # Just to appease MyPy.
575
+ self.update(h, obj_name)
576
+ self.update(h, os.path.getmtime(obj_name))
577
+ self.update(h, obj.tell())
578
+ return h.digest()
579
+
580
+ elif isinstance(obj, Pattern):
581
+ return self.to_bytes([obj.pattern, obj.flags])
582
+
583
+ elif isinstance(obj, io.StringIO) or isinstance(obj, io.BytesIO):
584
+ # Hash in-memory StringIO/BytesIO by their full contents
585
+ # and seek position.
586
+ self.update(h, obj.tell())
587
+ self.update(h, obj.getvalue())
588
+ return h.digest()
589
+
590
+ elif type_util.is_type(obj, "numpy.ufunc"):
591
+ # For numpy.remainder, this returns remainder.
592
+ return bytes(obj.__name__.encode())
593
+
594
+ elif inspect.ismodule(obj):
595
+ # TODO: Figure out how to best show this kind of warning to the
596
+ # user. In the meantime, show nothing. This scenario is too common,
597
+ # so the current warning is quite annoying...
598
+ # st.warning(('Streamlit does not support hashing modules. '
599
+ # 'We did not hash `%s`.') % obj.__name__)
600
+ # TODO: Hash more than just the name for internal modules.
601
+ return self.to_bytes(obj.__name__)
602
+
603
+ elif inspect.isclass(obj):
604
+ # TODO: Figure out how to best show this kind of warning to the
605
+ # user. In the meantime, show nothing. This scenario is too common,
606
+ # (e.g. in every "except" statement) so the current warning is
607
+ # quite annoying...
608
+ # st.warning(('Streamlit does not support hashing classes. '
609
+ # 'We did not hash `%s`.') % obj.__name__)
610
+ # TODO: Hash more than just the name of classes.
611
+ return self.to_bytes(obj.__name__)
612
+
613
+ elif isinstance(obj, functools.partial):
614
+ # The return value of functools.partial is not a plain function:
615
+ # it's a callable object that remembers the original function plus
616
+ # the values you pickled into it. So here we need to special-case it.
617
+ self.update(h, obj.args)
618
+ self.update(h, obj.func)
619
+ self.update(h, obj.keywords)
620
+ return h.digest()
621
+
622
+ else:
623
+ # As a last resort, hash the output of the object's __reduce__ method
624
+ try:
625
+ reduce_data = obj.__reduce__()
626
+ except Exception as ex:
627
+ raise UnhashableTypeError() from ex
628
+
629
+ for item in reduce_data:
630
+ self.update(h, item)
631
+ return h.digest()
632
+
633
+
634
+ class NoResult:
635
+ """Placeholder class for return values when None is meaningful."""
636
+
637
+ pass