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,138 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ import uuid
18
+ from collections import defaultdict
19
+ from typing import TYPE_CHECKING
20
+
21
+ from streamlit import util
22
+ from streamlit.runtime.stats import CacheStat, group_stats
23
+ from streamlit.runtime.uploaded_file_manager import (
24
+ UploadedFileManager,
25
+ UploadedFileRec,
26
+ UploadFileUrlInfo,
27
+ )
28
+
29
+ if TYPE_CHECKING:
30
+ from collections.abc import Sequence
31
+
32
+
33
+ class MemoryUploadedFileManager(UploadedFileManager):
34
+ """Holds files uploaded by users of the running Streamlit app.
35
+ This class can be used safely from multiple threads simultaneously.
36
+ """
37
+
38
+ def __init__(self, upload_endpoint: str):
39
+ self.file_storage: dict[str, dict[str, UploadedFileRec]] = defaultdict(dict)
40
+ self.endpoint = upload_endpoint
41
+
42
+ def get_files(
43
+ self, session_id: str, file_ids: Sequence[str]
44
+ ) -> list[UploadedFileRec]:
45
+ """Return a list of UploadedFileRec for a given sequence of file_ids.
46
+
47
+ Parameters
48
+ ----------
49
+ session_id
50
+ The ID of the session that owns the files.
51
+ file_ids
52
+ The sequence of ids associated with files to retrieve.
53
+
54
+ Returns
55
+ -------
56
+ List[UploadedFileRec]
57
+ A list of URL UploadedFileRec instances, each instance contains information
58
+ about uploaded file.
59
+ """
60
+ session_storage = self.file_storage[session_id]
61
+ file_recs = []
62
+
63
+ for file_id in file_ids:
64
+ file_rec = session_storage.get(file_id, None)
65
+ if file_rec is not None:
66
+ file_recs.append(file_rec)
67
+
68
+ return file_recs
69
+
70
+ def remove_session_files(self, session_id: str) -> None:
71
+ """Remove all files associated with a given session."""
72
+ self.file_storage.pop(session_id, None)
73
+
74
+ def __repr__(self) -> str:
75
+ return util.repr_(self)
76
+
77
+ def add_file(
78
+ self,
79
+ session_id: str,
80
+ file: UploadedFileRec,
81
+ ) -> None:
82
+ """
83
+ Safe to call from any thread.
84
+
85
+ Parameters
86
+ ----------
87
+ session_id
88
+ The ID of the session that owns the file.
89
+ file
90
+ The file to add.
91
+ """
92
+
93
+ self.file_storage[session_id][file.file_id] = file
94
+
95
+ def remove_file(self, session_id, file_id):
96
+ """Remove file with given file_id associated with a given session."""
97
+ session_storage = self.file_storage[session_id]
98
+ session_storage.pop(file_id, None)
99
+
100
+ def get_upload_urls(
101
+ self, session_id: str, file_names: Sequence[str]
102
+ ) -> list[UploadFileUrlInfo]:
103
+ """Return a list of UploadFileUrlInfo for a given sequence of file_names."""
104
+ result = []
105
+ for _ in file_names:
106
+ file_id = str(uuid.uuid4())
107
+ result.append(
108
+ UploadFileUrlInfo(
109
+ file_id=file_id,
110
+ upload_url=f"{self.endpoint}/{session_id}/{file_id}",
111
+ delete_url=f"{self.endpoint}/{session_id}/{file_id}",
112
+ )
113
+ )
114
+ return result
115
+
116
+ def get_stats(self) -> list[CacheStat]:
117
+ """Return the manager's CacheStats.
118
+
119
+ Safe to call from any thread.
120
+ """
121
+ # Flatten all files into a single list
122
+ all_files: list[UploadedFileRec] = []
123
+ # Make copy of self.file_storage for thread safety, to be sure
124
+ # that main storage won't be changed form other thread
125
+ file_storage_copy = self.file_storage.copy()
126
+
127
+ for session_storage in file_storage_copy.values():
128
+ all_files.extend(session_storage.values())
129
+
130
+ stats: list[CacheStat] = [
131
+ CacheStat(
132
+ category_name="UploadedFileManager",
133
+ cache_name="",
134
+ byte_length=len(file.data),
135
+ )
136
+ for file in all_files
137
+ ]
138
+ return group_stats(stats)
@@ -0,0 +1,486 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ import contextlib
18
+ import inspect
19
+ import os
20
+ import sys
21
+ import threading
22
+ import time
23
+ import uuid
24
+ from collections.abc import Sized
25
+ from functools import wraps
26
+ from typing import Any, Callable, Final, TypeVar, cast, overload
27
+
28
+ from streamlit import config, util
29
+ from streamlit.logger import get_logger
30
+ from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
31
+ from streamlit.proto.PageProfile_pb2 import Argument, Command
32
+ from streamlit.runtime.scriptrunner_utils.exceptions import RerunException
33
+ from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
34
+
35
+ _LOGGER: Final = get_logger(__name__)
36
+
37
+ # Limit the number of commands to keep the page profile message small
38
+ _MAX_TRACKED_COMMANDS: Final = 200
39
+ # Only track a maximum of 25 uses per unique command since some apps use
40
+ # commands excessively (e.g. calling add_rows thousands of times in one rerun)
41
+ # making the page profile useless.
42
+ _MAX_TRACKED_PER_COMMAND: Final = 25
43
+
44
+ # A mapping to convert from the actual name to preferred/shorter representations
45
+ _OBJECT_NAME_MAPPING: Final = {
46
+ "streamlit.delta_generator.DeltaGenerator": "DG",
47
+ "pandas.core.frame.DataFrame": "DataFrame",
48
+ "plotly.graph_objs._figure.Figure": "PlotlyFigure",
49
+ "bokeh.plotting.figure.Figure": "BokehFigure",
50
+ "matplotlib.figure.Figure": "MatplotlibFigure",
51
+ "pandas.io.formats.style.Styler": "PandasStyler",
52
+ "pandas.core.indexes.base.Index": "PandasIndex",
53
+ "pandas.core.series.Series": "PandasSeries",
54
+ "streamlit.connections.snowpark_connection.SnowparkConnection": "SnowparkConnection",
55
+ "streamlit.connections.sql_connection.SQLConnection": "SQLConnection",
56
+ }
57
+
58
+ # A list of dependencies to check for attribution
59
+ _ATTRIBUTIONS_TO_CHECK: Final = [
60
+ # DB Clients:
61
+ "pymysql",
62
+ "MySQLdb",
63
+ "mysql",
64
+ "pymongo",
65
+ "ibis",
66
+ "boto3",
67
+ "psycopg2",
68
+ "psycopg3",
69
+ "sqlalchemy",
70
+ "elasticsearch",
71
+ "pyodbc",
72
+ "pymssql",
73
+ "cassandra",
74
+ "azure",
75
+ "redis",
76
+ "sqlite3",
77
+ "neo4j",
78
+ "duckdb",
79
+ "opensearchpy",
80
+ "supabase",
81
+ # Dataframe Libraries:
82
+ "polars",
83
+ "dask",
84
+ "vaex",
85
+ "modin",
86
+ "pyspark",
87
+ "cudf",
88
+ "xarray",
89
+ "ray",
90
+ "geopandas",
91
+ "mars",
92
+ "tables",
93
+ "zarr",
94
+ "datasets",
95
+ # ML & LLM Tools:
96
+ "mistralai",
97
+ "openai",
98
+ "langchain",
99
+ "llama_index",
100
+ "llama_cpp",
101
+ "anthropic",
102
+ "pyllamacpp",
103
+ "cohere",
104
+ "transformers",
105
+ "nomic",
106
+ "diffusers",
107
+ "semantic_kernel",
108
+ "replicate",
109
+ "huggingface_hub",
110
+ "wandb",
111
+ "torch",
112
+ "tensorflow",
113
+ "trubrics",
114
+ "comet_ml",
115
+ "clarifai",
116
+ "reka",
117
+ "hegel",
118
+ "fastchat",
119
+ "assemblyai",
120
+ "openllm",
121
+ "embedchain",
122
+ "haystack",
123
+ "vllm",
124
+ "alpa",
125
+ "jinaai",
126
+ "guidance",
127
+ "litellm",
128
+ "comet_llm",
129
+ "instructor",
130
+ "xgboost",
131
+ "lightgbm",
132
+ "catboost",
133
+ "sklearn",
134
+ # Workflow Tools:
135
+ "prefect",
136
+ "luigi",
137
+ "airflow",
138
+ "dagster",
139
+ # Vector Stores:
140
+ "pgvector",
141
+ "faiss",
142
+ "annoy",
143
+ "pinecone",
144
+ "chromadb",
145
+ "weaviate",
146
+ "qdrant_client",
147
+ "pymilvus",
148
+ "lancedb",
149
+ # Others:
150
+ "snowflake",
151
+ "streamlit_extras",
152
+ "streamlit_pydantic",
153
+ "pydantic",
154
+ "plost",
155
+ "authlib",
156
+ ]
157
+
158
+ _ETC_MACHINE_ID_PATH = "/etc/machine-id"
159
+ _DBUS_MACHINE_ID_PATH = "/var/lib/dbus/machine-id"
160
+
161
+
162
+ def _get_machine_id_v3() -> str:
163
+ """Get the machine ID
164
+
165
+ This is a unique identifier for a user for tracking metrics,
166
+ that is broken in different ways in some Linux distros and Docker images.
167
+ - at times just a hash of '', which means many machines map to the same ID
168
+ - at times a hash of the same string, when running in a Docker container
169
+ """
170
+
171
+ machine_id = str(uuid.getnode())
172
+ if os.path.isfile(_ETC_MACHINE_ID_PATH):
173
+ with open(_ETC_MACHINE_ID_PATH) as f:
174
+ machine_id = f.read()
175
+
176
+ elif os.path.isfile(_DBUS_MACHINE_ID_PATH):
177
+ with open(_DBUS_MACHINE_ID_PATH) as f:
178
+ machine_id = f.read()
179
+
180
+ return machine_id
181
+
182
+
183
+ class Installation:
184
+ _instance_lock = threading.Lock()
185
+ _instance: Installation | None = None
186
+
187
+ @classmethod
188
+ def instance(cls) -> Installation:
189
+ """Returns the singleton Installation"""
190
+ # We use a double-checked locking optimization to avoid the overhead
191
+ # of acquiring the lock in the common case:
192
+ # https://en.wikipedia.org/wiki/Double-checked_locking
193
+ if cls._instance is None:
194
+ with cls._instance_lock:
195
+ if cls._instance is None:
196
+ cls._instance = Installation()
197
+ return cls._instance
198
+
199
+ def __init__(self):
200
+ self.installation_id_v3 = str(
201
+ uuid.uuid5(uuid.NAMESPACE_DNS, _get_machine_id_v3())
202
+ )
203
+
204
+ def __repr__(self) -> str:
205
+ return util.repr_(self)
206
+
207
+ @property
208
+ def installation_id(self):
209
+ return self.installation_id_v3
210
+
211
+
212
+ def _get_type_name(obj: object) -> str:
213
+ """Get a simplified name for the type of the given object."""
214
+ with contextlib.suppress(Exception):
215
+ obj_type = obj if inspect.isclass(obj) else type(obj)
216
+ type_name = "unknown"
217
+ if hasattr(obj_type, "__qualname__"):
218
+ type_name = obj_type.__qualname__
219
+ elif hasattr(obj_type, "__name__"):
220
+ type_name = obj_type.__name__
221
+
222
+ if obj_type.__module__ != "builtins":
223
+ # Add the full module path
224
+ type_name = f"{obj_type.__module__}.{type_name}"
225
+
226
+ if type_name in _OBJECT_NAME_MAPPING:
227
+ type_name = _OBJECT_NAME_MAPPING[type_name]
228
+ return type_name
229
+ return "failed"
230
+
231
+
232
+ def _get_top_level_module(func: Callable[..., Any]) -> str:
233
+ """Get the top level module for the given function."""
234
+ module = inspect.getmodule(func)
235
+ if module is None or not module.__name__:
236
+ return "unknown"
237
+ return module.__name__.split(".")[0]
238
+
239
+
240
+ def _get_arg_metadata(arg: object) -> str | None:
241
+ """Get metadata information related to the value of the given object."""
242
+ with contextlib.suppress(Exception):
243
+ if isinstance(arg, (bool)):
244
+ return f"val:{arg}"
245
+
246
+ if isinstance(arg, Sized):
247
+ return f"len:{len(arg)}"
248
+
249
+ return None
250
+
251
+
252
+ def _get_command_telemetry(
253
+ _command_func: Callable[..., Any], _command_name: str, *args, **kwargs
254
+ ) -> Command:
255
+ """Get telemetry information for the given callable and its arguments."""
256
+ arg_keywords = inspect.getfullargspec(_command_func).args
257
+ self_arg: Any | None = None
258
+ arguments: list[Argument] = []
259
+ is_method = inspect.ismethod(_command_func)
260
+ name = _command_name
261
+
262
+ for i, arg in enumerate(args):
263
+ pos = i
264
+ if is_method:
265
+ # If func is a method, ignore the first argument (self)
266
+ i = i + 1
267
+
268
+ keyword = arg_keywords[i] if len(arg_keywords) > i else f"{i}"
269
+ if keyword == "self":
270
+ self_arg = arg
271
+ continue
272
+ argument = Argument(k=keyword, t=_get_type_name(arg), p=pos)
273
+
274
+ arg_metadata = _get_arg_metadata(arg)
275
+ if arg_metadata:
276
+ argument.m = arg_metadata
277
+ arguments.append(argument)
278
+ for kwarg, kwarg_value in kwargs.items():
279
+ argument = Argument(k=kwarg, t=_get_type_name(kwarg_value))
280
+
281
+ arg_metadata = _get_arg_metadata(kwarg_value)
282
+ if arg_metadata:
283
+ argument.m = arg_metadata
284
+ arguments.append(argument)
285
+
286
+ top_level_module = _get_top_level_module(_command_func)
287
+ if top_level_module != "streamlit":
288
+ # If the gather_metrics decorator is used outside of streamlit library
289
+ # we enforce a prefix to be added to the tracked command:
290
+ name = f"external:{top_level_module}:{name}"
291
+
292
+ if (
293
+ name == "create_instance"
294
+ and self_arg
295
+ and hasattr(self_arg, "name")
296
+ and self_arg.name
297
+ ):
298
+ name = f"component:{self_arg.name}"
299
+
300
+ return Command(name=name, args=arguments)
301
+
302
+
303
+ def to_microseconds(seconds: float) -> int:
304
+ """Convert seconds into microseconds."""
305
+ return int(seconds * 1_000_000)
306
+
307
+
308
+ F = TypeVar("F", bound=Callable[..., Any])
309
+
310
+
311
+ @overload
312
+ def gather_metrics(
313
+ name: str,
314
+ func: F,
315
+ ) -> F: ...
316
+
317
+
318
+ @overload
319
+ def gather_metrics(
320
+ name: str,
321
+ func: None = None,
322
+ ) -> Callable[[F], F]: ...
323
+
324
+
325
+ def gather_metrics(name: str, func: F | None = None) -> Callable[[F], F] | F:
326
+ """Function decorator to add telemetry tracking to commands.
327
+
328
+ Parameters
329
+ ----------
330
+ func : callable
331
+ The function to track for telemetry.
332
+
333
+ name : str or None
334
+ Overwrite the function name with a custom name that is used for telemetry tracking.
335
+
336
+ Example
337
+ -------
338
+ >>> @st.gather_metrics
339
+ ... def my_command(url):
340
+ ... return url
341
+
342
+ >>> @st.gather_metrics(name="custom_name")
343
+ ... def my_command(url):
344
+ ... return url
345
+ """
346
+
347
+ if not name:
348
+ _LOGGER.warning("gather_metrics: name is empty")
349
+ name = "undefined"
350
+
351
+ if func is None:
352
+ # Support passing the params via function decorator
353
+ def wrapper(f: F) -> F:
354
+ return gather_metrics(
355
+ name=name,
356
+ func=f,
357
+ )
358
+
359
+ return wrapper
360
+ else:
361
+ # To make mypy type narrow F | None -> F
362
+ non_optional_func = func
363
+
364
+ @wraps(non_optional_func)
365
+ def wrapped_func(*args, **kwargs):
366
+ from timeit import default_timer as timer
367
+
368
+ exec_start = timer()
369
+ ctx = get_script_run_ctx(suppress_warning=True)
370
+
371
+ tracking_activated = (
372
+ ctx is not None
373
+ and ctx.gather_usage_stats
374
+ and not ctx.command_tracking_deactivated
375
+ and len(ctx.tracked_commands)
376
+ < _MAX_TRACKED_COMMANDS # Prevent too much memory usage
377
+ )
378
+
379
+ command_telemetry: Command | None = None
380
+ # This flag is needed to make sure that only the command (the outermost command)
381
+ # that deactivated tracking (via ctx.command_tracking_deactivated) is able to reset it
382
+ # again. This is important to prevent nested commands from reactivating tracking.
383
+ # At this point, we don't know yet if the command will deactivated tracking.
384
+ has_set_command_tracking_deactivated = False
385
+
386
+ if ctx and tracking_activated:
387
+ try:
388
+ command_telemetry = _get_command_telemetry(
389
+ non_optional_func, name, *args, **kwargs
390
+ )
391
+
392
+ if (
393
+ command_telemetry.name not in ctx.tracked_commands_counter
394
+ or ctx.tracked_commands_counter[command_telemetry.name]
395
+ < _MAX_TRACKED_PER_COMMAND
396
+ ):
397
+ ctx.tracked_commands.append(command_telemetry)
398
+ ctx.tracked_commands_counter.update([command_telemetry.name])
399
+ # Deactivate tracking to prevent calls inside already tracked commands
400
+ ctx.command_tracking_deactivated = True
401
+ # The ctx.command_tracking_deactivated flag was set to True,
402
+ # we also need to set has_set_command_tracking_deactivated to True
403
+ # to make sure that this command is able to reset it again.
404
+ has_set_command_tracking_deactivated = True
405
+ except Exception as ex:
406
+ # Always capture all exceptions since we want to make sure that
407
+ # the telemetry never causes any issues.
408
+ _LOGGER.debug("Failed to collect command telemetry", exc_info=ex)
409
+ try:
410
+ result = non_optional_func(*args, **kwargs)
411
+ except RerunException as ex:
412
+ # Duplicated from below, because static analysis tools get confused
413
+ # by deferring the rethrow.
414
+ if tracking_activated and command_telemetry:
415
+ command_telemetry.time = to_microseconds(timer() - exec_start)
416
+ raise ex
417
+ finally:
418
+ # Activate tracking again if command executes without any exceptions
419
+ # we only want to do that if this command has set the
420
+ # flag to deactivate tracking.
421
+ if ctx and has_set_command_tracking_deactivated:
422
+ ctx.command_tracking_deactivated = False
423
+
424
+ if tracking_activated and command_telemetry:
425
+ # Set the execution time to the measured value
426
+ command_telemetry.time = to_microseconds(timer() - exec_start)
427
+
428
+ return result
429
+
430
+ with contextlib.suppress(AttributeError):
431
+ # Make this a well-behaved decorator by preserving important function
432
+ # attributes.
433
+ wrapped_func.__dict__.update(non_optional_func.__dict__)
434
+ wrapped_func.__signature__ = inspect.signature(non_optional_func) # type: ignore
435
+ return cast(F, wrapped_func)
436
+
437
+
438
+ def create_page_profile_message(
439
+ commands: list[Command],
440
+ exec_time: int,
441
+ prep_time: int,
442
+ uncaught_exception: str | None = None,
443
+ ) -> ForwardMsg:
444
+ """Create and return the full PageProfile ForwardMsg."""
445
+ msg = ForwardMsg()
446
+ page_profile = msg.page_profile
447
+
448
+ page_profile.commands.extend(commands)
449
+ page_profile.exec_time = exec_time
450
+ page_profile.prep_time = prep_time
451
+
452
+ page_profile.headless = config.get_option("server.headless")
453
+
454
+ # Collect all config options that have been manually set
455
+ config_options: set[str] = set()
456
+ if config._config_options:
457
+ for option_name in config._config_options.keys():
458
+ if not config.is_manually_set(option_name):
459
+ # We only care about manually defined options
460
+ continue
461
+
462
+ config_option = config._config_options[option_name]
463
+ if config_option.is_default:
464
+ option_name = f"{option_name}:default"
465
+ config_options.add(option_name)
466
+
467
+ page_profile.config.extend(config_options)
468
+
469
+ # Check the predefined set of modules for attribution
470
+ attributions: set[str] = {
471
+ attribution
472
+ for attribution in _ATTRIBUTIONS_TO_CHECK
473
+ if attribution in sys.modules
474
+ }
475
+
476
+ page_profile.os = str(sys.platform)
477
+ page_profile.timezone = str(time.tzname)
478
+ page_profile.attributions.extend(attributions)
479
+
480
+ if uncaught_exception:
481
+ page_profile.uncaught_exception = uncaught_exception
482
+
483
+ if ctx := get_script_run_ctx():
484
+ page_profile.is_fragment_run = bool(ctx.fragment_ids_this_run)
485
+
486
+ return msg