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,534 @@
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 os
18
+ import threading
19
+ from collections.abc import ItemsView, Iterator, KeysView, Mapping, ValuesView
20
+ from copy import deepcopy
21
+ from typing import (
22
+ Any,
23
+ Callable,
24
+ Final,
25
+ NoReturn,
26
+ )
27
+
28
+ from blinker import Signal
29
+
30
+ import streamlit as st
31
+ import streamlit.watcher.path_watcher
32
+ from streamlit import runtime
33
+ from streamlit.logger import get_logger
34
+
35
+ _LOGGER: Final = get_logger(__name__)
36
+
37
+
38
+ class SecretErrorMessages:
39
+ """SecretErrorMessages stores all error messages we use for secrets to allow customization for different environments.
40
+ For example Streamlit Cloud can customize the message to be different than the open source.
41
+
42
+ For internal use, may change in future releases without notice.
43
+ """
44
+
45
+ def __init__(self):
46
+ self.missing_attr_message = lambda attr_name: (
47
+ f'st.secrets has no attribute "{attr_name}". '
48
+ f"Did you forget to add it to secrets.toml, mount it to secret directory, or the app settings on Streamlit Cloud? "
49
+ f"More info: https://docs.streamlit.io/deploy/streamlit-community-cloud/deploy-your-app/secrets-management"
50
+ )
51
+ self.missing_key_message = lambda key: (
52
+ f'st.secrets has no key "{key}". '
53
+ f"Did you forget to add it to secrets.toml, mount it to secret directory, or the app settings on Streamlit Cloud? "
54
+ f"More info: https://docs.streamlit.io/deploy/streamlit-community-cloud/deploy-your-app/secrets-management"
55
+ )
56
+ self.no_secrets_found = lambda file_paths: (
57
+ f"No secrets found. Valid paths for a secrets.toml file or secret directories are: {', '.join(file_paths)}"
58
+ )
59
+ self.error_parsing_file_at_path = (
60
+ lambda path, ex: f"Error parsing secrets file at {path}: {ex}"
61
+ )
62
+ self.subfolder_path_is_not_a_folder = lambda sub_folder_path: (
63
+ f"{sub_folder_path} is not a folder. "
64
+ "To use directory based secrets, mount every secret in a subfolder under the secret directory"
65
+ )
66
+ self.invalid_secret_path = lambda path: (
67
+ f"Invalid secrets path: {path}: path is not a .toml file or a directory"
68
+ )
69
+
70
+ def set_missing_attr_message(self, message: Callable[[str], str]) -> None:
71
+ """Set the missing attribute error message."""
72
+ self.missing_attr_message = message
73
+
74
+ def set_missing_key_message(self, message: Callable[[str], str]) -> None:
75
+ """Set the missing key error message."""
76
+ self.missing_key_message = message
77
+
78
+ def set_no_secrets_found_message(self, message: Callable[[list[str]], str]) -> None:
79
+ """Set the no secrets found error message."""
80
+ self.no_secrets_found = message
81
+
82
+ def set_error_parsing_file_at_path_message(
83
+ self, message: Callable[[str, Exception], str]
84
+ ) -> None:
85
+ """Set the error parsing file at path error message."""
86
+ self.error_parsing_file_at_path = message
87
+
88
+ def set_subfolder_path_is_not_a_folder_message(
89
+ self, message: Callable[[str], str]
90
+ ) -> None:
91
+ """Set the subfolder path is not a folder error message."""
92
+ self.subfolder_path_is_not_a_folder = message
93
+
94
+ def set_invalid_secret_path_message(self, message: Callable[[str], str]) -> None:
95
+ """Set the invalid secret path error message."""
96
+ self.invalid_secret_path = message
97
+
98
+ def get_missing_attr_message(self, attr_name: str) -> str:
99
+ """Get the missing attribute error message."""
100
+ return self.missing_attr_message(attr_name)
101
+
102
+ def get_missing_key_message(self, key: str) -> str:
103
+ """Get the missing key error message."""
104
+ return self.missing_key_message(key)
105
+
106
+ def get_no_secrets_found_message(self, file_paths: list[str]) -> str:
107
+ """Get the no secrets found error message."""
108
+ return self.no_secrets_found(file_paths)
109
+
110
+ def get_error_parsing_file_at_path_message(self, path: str, ex: Exception) -> str:
111
+ """Get the error parsing file at path error message."""
112
+ return self.error_parsing_file_at_path(path, ex)
113
+
114
+ def get_subfolder_path_is_not_a_folder_message(self, sub_folder_path: str) -> str:
115
+ """Get the subfolder path is not a folder error message."""
116
+ return self.subfolder_path_is_not_a_folder(sub_folder_path)
117
+
118
+ def get_invalid_secret_path_message(self, path: str) -> str:
119
+ """Get the invalid secret path error message."""
120
+ return self.invalid_secret_path(path)
121
+
122
+
123
+ secret_error_messages_singleton: Final = SecretErrorMessages()
124
+
125
+
126
+ def _convert_to_dict(obj: Mapping[str, Any] | AttrDict) -> dict[str, Any]:
127
+ """Convert Mapping or AttrDict objects to dictionaries."""
128
+ if isinstance(obj, AttrDict):
129
+ return obj.to_dict()
130
+ return {k: v.to_dict() if isinstance(v, AttrDict) else v for k, v in obj.items()}
131
+
132
+
133
+ def _missing_attr_error_message(attr_name: str) -> str:
134
+ return secret_error_messages_singleton.get_missing_attr_message(attr_name)
135
+
136
+
137
+ def _missing_key_error_message(key: str) -> str:
138
+ return secret_error_messages_singleton.get_missing_key_message(key)
139
+
140
+
141
+ class AttrDict(Mapping[str, Any]):
142
+ """We use AttrDict to wrap up dictionary values from secrets
143
+ to provide dot access to nested secrets
144
+ """
145
+
146
+ def __init__(self, value):
147
+ self.__dict__["__nested_secrets__"] = dict(value)
148
+
149
+ @staticmethod
150
+ def _maybe_wrap_in_attr_dict(value) -> Any:
151
+ if not isinstance(value, Mapping):
152
+ return value
153
+ else:
154
+ return AttrDict(value)
155
+
156
+ def __len__(self) -> int:
157
+ return len(self.__nested_secrets__)
158
+
159
+ def __iter__(self) -> Iterator[str]:
160
+ return iter(self.__nested_secrets__)
161
+
162
+ def __getitem__(self, key: str) -> Any:
163
+ try:
164
+ value = self.__nested_secrets__[key]
165
+ return self._maybe_wrap_in_attr_dict(value)
166
+ except KeyError:
167
+ raise KeyError(_missing_key_error_message(key))
168
+
169
+ def __getattr__(self, attr_name: str) -> Any:
170
+ try:
171
+ value = self.__nested_secrets__[attr_name]
172
+ return self._maybe_wrap_in_attr_dict(value)
173
+ except KeyError:
174
+ raise AttributeError(_missing_attr_error_message(attr_name))
175
+
176
+ def __repr__(self):
177
+ return repr(self.__nested_secrets__)
178
+
179
+ def __setitem__(self, key, value) -> NoReturn:
180
+ raise TypeError("Secrets does not support item assignment.")
181
+
182
+ def __setattr__(self, key, value) -> NoReturn:
183
+ raise TypeError("Secrets does not support attribute assignment.")
184
+
185
+ def to_dict(self) -> dict[str, Any]:
186
+ return deepcopy(self.__nested_secrets__)
187
+
188
+
189
+ class Secrets(Mapping[str, Any]):
190
+ """A dict-like class that stores secrets.
191
+ Parses secrets.toml on-demand. Cannot be externally mutated.
192
+
193
+ Safe to use from multiple threads.
194
+ """
195
+
196
+ def __init__(self):
197
+ # Our secrets dict.
198
+ self._secrets: Mapping[str, Any] | None = None
199
+ self._lock = threading.RLock()
200
+ self._file_watchers_installed = False
201
+ self._suppress_print_error_on_exception = False
202
+
203
+ self.file_change_listener = Signal(
204
+ doc="Emitted when a `secrets.toml` file has been changed."
205
+ )
206
+
207
+ def load_if_toml_exists(self) -> bool:
208
+ """Load secrets.toml files from disk if they exists. If none exist,
209
+ no exception will be raised. (If a file exists but is malformed,
210
+ an exception *will* be raised.)
211
+
212
+ Returns True if a secrets.toml file was successfully parsed, False otherwise.
213
+
214
+ Thread-safe.
215
+ """
216
+ prev_suppress_print_error_on_exception = self._suppress_print_error_on_exception
217
+ try:
218
+ # temporarily suppress printing errors on exceptions, we don't want to print errors
219
+ # in this method since it only loads secrets if they exist
220
+
221
+ self._suppress_print_error_on_exception = True
222
+ self._parse()
223
+
224
+ return True
225
+ except FileNotFoundError:
226
+ # No secrets.toml files exist. That's fine.
227
+ return False
228
+ finally:
229
+ self._suppress_print_error_on_exception = (
230
+ prev_suppress_print_error_on_exception
231
+ )
232
+
233
+ def set_suppress_print_error_on_exception(
234
+ self, suppress_print_error_on_exception: bool
235
+ ) -> None:
236
+ """Set whether exceptions should be printed when accessing secrets.
237
+ For internal use, may change in future releases without notice."""
238
+ self._suppress_print_error_on_exception = suppress_print_error_on_exception
239
+
240
+ def _print_exception_if_not_suppressed(self, error_msg: str) -> None:
241
+ """Print the given error message if exceptions are not suppressed."""
242
+ if not self._suppress_print_error_on_exception:
243
+ st.error(str(error_msg))
244
+
245
+ def _reset(self) -> None:
246
+ """Clear the secrets dictionary and remove any secrets that were
247
+ added to os.environ.
248
+
249
+ Thread-safe.
250
+ """
251
+ with self._lock:
252
+ if self._secrets is None:
253
+ return
254
+
255
+ for k, v in self._secrets.items():
256
+ self._maybe_delete_environment_variable(k, v)
257
+ self._secrets = None
258
+
259
+ def _parse_toml_file(self, path: str) -> tuple[Mapping[str, Any], bool]:
260
+ """Parse a TOML file and return the secrets as a dictionary."""
261
+ secrets = {}
262
+ found_secrets_file = False
263
+
264
+ try:
265
+ with open(path, encoding="utf-8") as f:
266
+ secrets_file_str = f.read()
267
+
268
+ found_secrets_file = True
269
+ except FileNotFoundError:
270
+ # the default config for secrets contains two paths. It's likely one of will not have secrets file.
271
+ return {}, False
272
+
273
+ try:
274
+ import toml
275
+
276
+ secrets.update(toml.loads(secrets_file_str))
277
+ except (TypeError, toml.TomlDecodeError) as ex:
278
+ error_msg = (
279
+ secret_error_messages_singleton.get_error_parsing_file_at_path_message(
280
+ path, ex
281
+ )
282
+ )
283
+ self._print_exception_if_not_suppressed(error_msg)
284
+ raise
285
+
286
+ return secrets, found_secrets_file
287
+
288
+ def _parse_directory(self, path: str) -> tuple[Mapping[str, Any], bool]:
289
+ """Parse a directory for secrets. Directory style can be used to support Kubernetes secrets that are mounted to folders.
290
+
291
+ Example structure:
292
+ - top_level_secret_folder
293
+ - user_pass_secret (folder)
294
+ - username (file), content: myuser
295
+ - password (file), content: mypassword
296
+ - my_plain_secret (folder)
297
+ - regular_secret (file), content: mysecret
298
+
299
+ See: https://kubernetes.io/docs/tasks/inject-data-application/distribute-credentials-secure/#create-a-pod-that-has-access-to-the-secret-data-through-a-volume
300
+ And: https://docs.snowflake.com/en/developer-guide/snowpark-container-services/additional-considerations-services-jobs#passing-secrets-in-local-container-files
301
+ """
302
+ secrets: dict[str, Any] = {}
303
+ found_secrets_file = False
304
+
305
+ for dirname in os.listdir(path):
306
+ sub_folder_path = os.path.join(path, dirname)
307
+ if not os.path.isdir(sub_folder_path):
308
+ error_msg = secret_error_messages_singleton.get_subfolder_path_is_not_a_folder_message(
309
+ sub_folder_path
310
+ )
311
+ self._print_exception_if_not_suppressed(error_msg)
312
+ raise ValueError(error_msg)
313
+ sub_secrets = {}
314
+
315
+ for filename in os.listdir(sub_folder_path):
316
+ file_path = os.path.join(sub_folder_path, filename)
317
+
318
+ # ignore folders
319
+ if os.path.isdir(file_path):
320
+ continue
321
+
322
+ with open(file_path) as f:
323
+ sub_secrets[filename] = f.read().strip()
324
+ found_secrets_file = True
325
+
326
+ if len(sub_secrets) == 1:
327
+ # if there's just one file, collapse it so it's directly under `dirname`
328
+ secrets[dirname] = sub_secrets[list(sub_secrets.keys())[0]]
329
+ else:
330
+ secrets[dirname] = sub_secrets
331
+
332
+ return secrets, found_secrets_file
333
+
334
+ def _parse_file_path(self, path: str) -> tuple[Mapping[str, Any], bool]:
335
+ if path.endswith(".toml"):
336
+ return self._parse_toml_file(path)
337
+
338
+ if os.path.isdir(path):
339
+ return self._parse_directory(path)
340
+
341
+ error_msg = secret_error_messages_singleton.get_invalid_secret_path_message(
342
+ path
343
+ )
344
+ self._print_exception_if_not_suppressed(error_msg)
345
+ raise ValueError(error_msg)
346
+
347
+ def _parse(self) -> Mapping[str, Any]:
348
+ """Parse our secrets.toml files if they're not already parsed.
349
+ This function is safe to call from multiple threads.
350
+
351
+ Parameters
352
+ ----------
353
+ print_exceptions : bool
354
+ If True, then exceptions will be printed with `st.error` before
355
+ being re-raised.
356
+
357
+ Raises
358
+ ------
359
+ FileNotFoundError
360
+ Raised if secrets.toml doesn't exist.
361
+
362
+ """
363
+ # Avoid taking a lock for the common case where secrets are already
364
+ # loaded.
365
+ secrets = self._secrets
366
+ if secrets is not None:
367
+ return secrets
368
+
369
+ with self._lock:
370
+ if self._secrets is not None:
371
+ return self._secrets
372
+
373
+ secrets = {}
374
+
375
+ file_paths = st.config.get_option("secrets.files")
376
+ found_secrets_file = False
377
+ for path in file_paths:
378
+ path_secrets, found_secrets_file_in_path = self._parse_file_path(path)
379
+ found_secrets_file = found_secrets_file or found_secrets_file_in_path
380
+ secrets.update(path_secrets)
381
+
382
+ if not found_secrets_file:
383
+ error_msg = (
384
+ secret_error_messages_singleton.get_no_secrets_found_message(
385
+ file_paths
386
+ )
387
+ )
388
+ self._print_exception_if_not_suppressed(error_msg)
389
+ raise FileNotFoundError(error_msg)
390
+
391
+ for k, v in secrets.items():
392
+ self._maybe_set_environment_variable(k, v)
393
+
394
+ self._secrets = secrets
395
+ self._maybe_install_file_watchers()
396
+
397
+ return self._secrets
398
+
399
+ def to_dict(self) -> dict[str, Any]:
400
+ """Converts the secrets store into a nested dictionary, where nested AttrDict objects are also converted into dictionaries."""
401
+ secrets = self._parse()
402
+ return _convert_to_dict(secrets)
403
+
404
+ @staticmethod
405
+ def _maybe_set_environment_variable(k: Any, v: Any) -> None:
406
+ """Add the given key/value pair to os.environ if the value
407
+ is a string, int, or float.
408
+ """
409
+ value_type = type(v)
410
+ if value_type in (str, int, float):
411
+ os.environ[k] = str(v)
412
+
413
+ @staticmethod
414
+ def _maybe_delete_environment_variable(k: Any, v: Any) -> None:
415
+ """Remove the given key/value pair from os.environ if the value
416
+ is a string, int, or float.
417
+ """
418
+ value_type = type(v)
419
+ if value_type in (str, int, float) and os.environ.get(k) == v:
420
+ del os.environ[k]
421
+
422
+ def _maybe_install_file_watchers(self) -> None:
423
+ with self._lock:
424
+ if self._file_watchers_installed:
425
+ return
426
+
427
+ file_paths = st.config.get_option("secrets.files")
428
+ for path in file_paths:
429
+ try:
430
+ if path.endswith(".toml"):
431
+ streamlit.watcher.path_watcher.watch_file(
432
+ path,
433
+ self._on_secrets_changed,
434
+ watcher_type="poll",
435
+ )
436
+ else:
437
+ streamlit.watcher.path_watcher.watch_dir(
438
+ path,
439
+ self._on_secrets_changed,
440
+ watcher_type="poll",
441
+ )
442
+ except FileNotFoundError:
443
+ # A user may only have one secrets.toml file defined, so we'd expect
444
+ # FileNotFoundErrors to be raised when attempting to install a
445
+ # watcher on the nonexistent ones.
446
+ pass
447
+
448
+ # We set file_watchers_installed to True even if the installation attempt
449
+ # failed to avoid repeatedly trying to install it.
450
+ self._file_watchers_installed = True
451
+
452
+ def _on_secrets_changed(self, changed_file_path) -> None:
453
+ with self._lock:
454
+ _LOGGER.debug("Secret path %s changed, reloading", changed_file_path)
455
+ self._reset()
456
+ self._parse()
457
+
458
+ # Emit a signal to notify receivers that the `secrets.toml` file
459
+ # has been changed.
460
+ self.file_change_listener.send()
461
+
462
+ def __getattr__(self, key: str) -> Any:
463
+ """Return the value with the given key. If no such key
464
+ exists, raise an AttributeError.
465
+
466
+ Thread-safe.
467
+ """
468
+ try:
469
+ value = self._parse()[key]
470
+ if not isinstance(value, Mapping):
471
+ return value
472
+ else:
473
+ return AttrDict(value)
474
+ # We add FileNotFoundError since __getattr__ is expected to only raise
475
+ # AttributeError. Without handling FileNotFoundError, unittests.mocks
476
+ # fails during mock creation on Python3.9
477
+ except (KeyError, FileNotFoundError):
478
+ raise AttributeError(_missing_attr_error_message(key))
479
+
480
+ def __getitem__(self, key: str) -> Any:
481
+ """Return the value with the given key. If no such key
482
+ exists, raise a KeyError.
483
+
484
+ Thread-safe.
485
+ """
486
+ try:
487
+ value = self._parse()[key]
488
+ if not isinstance(value, Mapping):
489
+ return value
490
+ else:
491
+ return AttrDict(value)
492
+ except KeyError:
493
+ raise KeyError(_missing_key_error_message(key))
494
+
495
+ def __repr__(self) -> str:
496
+ # If the runtime is NOT initialized, it is a method call outside
497
+ # the streamlit app, so we avoid reading the secrets file as it may not exist.
498
+ # If the runtime is initialized, display the contents of the file and
499
+ # the file must already exist.
500
+ """A string representation of the contents of the dict. Thread-safe."""
501
+ if not runtime.exists():
502
+ return f"{self.__class__.__name__}"
503
+ return repr(self._parse())
504
+
505
+ def __len__(self) -> int:
506
+ """The number of entries in the dict. Thread-safe."""
507
+ return len(self._parse())
508
+
509
+ def has_key(self, k: str) -> bool:
510
+ """True if the given key is in the dict. Thread-safe."""
511
+ return k in self._parse()
512
+
513
+ def keys(self) -> KeysView[str]:
514
+ """A view of the keys in the dict. Thread-safe."""
515
+ return self._parse().keys()
516
+
517
+ def values(self) -> ValuesView[Any]:
518
+ """A view of the values in the dict. Thread-safe."""
519
+ return self._parse().values()
520
+
521
+ def items(self) -> ItemsView[str, Any]:
522
+ """A view of the key-value items in the dict. Thread-safe."""
523
+ return self._parse().items()
524
+
525
+ def __contains__(self, key: Any) -> bool:
526
+ """True if the given key is in the dict. Thread-safe."""
527
+ return key in self._parse()
528
+
529
+ def __iter__(self) -> Iterator[str]:
530
+ """An iterator over the keys in the dict. Thread-safe."""
531
+ return iter(self._parse())
532
+
533
+
534
+ secrets_singleton: Final = Secrets()