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,311 @@
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
+ """Class to store a key-value pair for the config system."""
16
+
17
+ from __future__ import annotations
18
+
19
+ import datetime
20
+ import re
21
+ import textwrap
22
+ from typing import Any, Callable
23
+
24
+ from streamlit.string_util import to_snake_case
25
+ from streamlit.util import repr_
26
+
27
+
28
+ class ConfigOption:
29
+ '''Stores a Streamlit configuration option.
30
+
31
+ A configuration option, like 'browser.serverPort', which indicates which port
32
+ to use when connecting to the proxy. There are two ways to create a
33
+ ConfigOption:
34
+
35
+ Simple ConfigOptions are created as follows:
36
+
37
+ ConfigOption('browser.serverPort',
38
+ description = 'Connect to the proxy at this port.',
39
+ default_val = 8501)
40
+
41
+ More complex config options resolve their values at runtime as follows:
42
+
43
+ @ConfigOption('browser.serverPort')
44
+ def _proxy_port():
45
+ """Connect to the proxy at this port.
46
+
47
+ Defaults to 8501.
48
+ """
49
+ return 8501
50
+
51
+ NOTE: For complex config options, the function is called each time the
52
+ option.value is evaluated!
53
+
54
+ Attributes
55
+ ----------
56
+ key : str
57
+ The fully qualified section.name
58
+ value : any
59
+ The value for this option. If this is a complex config option then
60
+ the callback is called EACH TIME value is evaluated.
61
+ section : str
62
+ The section of this option. Example: 'global'.
63
+ name : str
64
+ See __init__.
65
+ description : str
66
+ See __init__.
67
+ where_defined : str
68
+ Indicates which file set this config option.
69
+ ConfigOption.DEFAULT_DEFINITION means this file.
70
+ is_default: bool
71
+ True if the config value is equal to its default value.
72
+ visibility : {"visible", "hidden"}
73
+ See __init__.
74
+ scriptable : bool
75
+ See __init__.
76
+ deprecated: bool
77
+ See __init__.
78
+ deprecation_text : str or None
79
+ See __init__.
80
+ expiration_date : str or None
81
+ See __init__.
82
+ replaced_by : str or None
83
+ See __init__.
84
+ sensitive : bool
85
+ See __init__.
86
+ env_var: str
87
+ The name of the environment variable that can be used to set the option.
88
+ '''
89
+
90
+ # This is a special value for ConfigOption.where_defined which indicates
91
+ # that the option default was not overridden.
92
+ DEFAULT_DEFINITION = "<default>"
93
+
94
+ # This is a special value for ConfigOption.where_defined which indicates
95
+ # that the options was defined by Streamlit's own code.
96
+ STREAMLIT_DEFINITION = "<streamlit>"
97
+
98
+ def __init__(
99
+ self,
100
+ key: str,
101
+ description: str | None = None,
102
+ default_val: Any | None = None,
103
+ visibility: str = "visible",
104
+ scriptable: bool = False,
105
+ deprecated: bool = False,
106
+ deprecation_text: str | None = None,
107
+ expiration_date: str | None = None,
108
+ replaced_by: str | None = None,
109
+ type_: type = str,
110
+ sensitive: bool = False,
111
+ ):
112
+ """Create a ConfigOption with the given name.
113
+
114
+ Parameters
115
+ ----------
116
+ key : str
117
+ Should be of the form "section.optionName"
118
+ Examples: server.name, deprecation.v1_0_featureName
119
+ description : str
120
+ Like a comment for the config option.
121
+ default_val : any
122
+ The value for this config option.
123
+ visibility : {"visible", "hidden"}
124
+ Whether this option should be shown to users.
125
+ scriptable : bool
126
+ Whether this config option can be set within a user script.
127
+ deprecated: bool
128
+ Whether this config option is deprecated.
129
+ deprecation_text : str or None
130
+ Required if deprecated == True. Set this to a string explaining
131
+ what to use instead.
132
+ expiration_date : str or None
133
+ Required if deprecated == True. set this to the date at which it
134
+ will no longer be accepted. Format: 'YYYY-MM-DD'.
135
+ replaced_by : str or None
136
+ If this is option has been deprecated in favor or another option,
137
+ set this to the path to the new option. Example:
138
+ 'server.runOnSave'. If this is set, the 'deprecated' option
139
+ will automatically be set to True, and deprecation_text will have a
140
+ meaningful default (unless you override it).
141
+ type_ : one of str, int, float or bool
142
+ Useful to cast the config params sent by cmd option parameter.
143
+ sensitive: bool
144
+ Sensitive configuration options cannot be set by CLI parameter.
145
+ """
146
+ # Parse out the section and name.
147
+ self.key = key
148
+ key_format = (
149
+ # Capture a group called "section"
150
+ r"(?P<section>"
151
+ # Matching text comprised of letters and numbers that begins
152
+ # with a lowercase letter with an optional "_" preceding it.
153
+ # Examples: "_section", "section1"
154
+ r"\_?[a-z][a-zA-Z0-9]*"
155
+ r")"
156
+ # Separator between groups
157
+ r"\."
158
+ # Capture a group called "name"
159
+ r"(?P<name>"
160
+ # Match text comprised of letters and numbers beginning with a
161
+ # lowercase letter.
162
+ # Examples: "name", "nameOfConfig", "config1"
163
+ r"[a-z][a-zA-Z0-9]*"
164
+ r")$"
165
+ )
166
+ match = re.match(key_format, self.key)
167
+ assert match, f'Key "{self.key}" has invalid format.'
168
+ self.section, self.name = match.group("section"), match.group("name")
169
+
170
+ self.description = description
171
+
172
+ self.visibility = visibility
173
+ self.scriptable = scriptable
174
+ self.default_val = default_val
175
+ self.deprecated = deprecated
176
+ self.replaced_by = replaced_by
177
+ self.is_default = True
178
+ self._get_val_func: Callable[[], Any] | None = None
179
+ self.where_defined = ConfigOption.DEFAULT_DEFINITION
180
+ self.type = type_
181
+ self.sensitive = sensitive
182
+ # infer multiple values if the default value is a list or tuple
183
+ self.multiple = isinstance(default_val, (list, tuple))
184
+
185
+ if self.replaced_by:
186
+ self.deprecated = True
187
+ if deprecation_text is None:
188
+ deprecation_text = "Replaced by %s." % self.replaced_by
189
+
190
+ if self.deprecated:
191
+ assert expiration_date, "expiration_date is required for deprecated items"
192
+ assert deprecation_text, "deprecation_text is required for deprecated items"
193
+ self.expiration_date = expiration_date
194
+ self.deprecation_text = textwrap.dedent(deprecation_text)
195
+
196
+ self.set_value(default_val)
197
+
198
+ def __repr__(self) -> str:
199
+ return repr_(self)
200
+
201
+ def __call__(self, get_val_func: Callable[[], Any]) -> ConfigOption:
202
+ """Assign a function to compute the value for this option.
203
+
204
+ This method is called when ConfigOption is used as a decorator.
205
+
206
+ Parameters
207
+ ----------
208
+ get_val_func : function
209
+ A function which will be called to get the value of this parameter.
210
+ We will use its docString as the description.
211
+
212
+ Returns
213
+ -------
214
+ ConfigOption
215
+ Returns self, which makes testing easier. See config_test.py.
216
+
217
+ """
218
+ assert get_val_func.__doc__, (
219
+ "Complex config options require doc strings for their description."
220
+ )
221
+ self.description = get_val_func.__doc__
222
+ self._get_val_func = get_val_func
223
+ return self
224
+
225
+ @property
226
+ def value(self) -> Any:
227
+ """Get the value of this config option."""
228
+ if self._get_val_func is None:
229
+ return None
230
+ return self._get_val_func()
231
+
232
+ def set_value(self, value: Any, where_defined: str | None = None) -> None:
233
+ """Set the value of this option.
234
+
235
+ Parameters
236
+ ----------
237
+ value
238
+ The new value for this parameter.
239
+ where_defined : str
240
+ New value to remember where this parameter was set.
241
+
242
+ """
243
+ self._get_val_func = lambda: value
244
+
245
+ if where_defined is None:
246
+ self.where_defined = ConfigOption.DEFAULT_DEFINITION
247
+ else:
248
+ self.where_defined = where_defined
249
+
250
+ self.is_default = value == self.default_val
251
+
252
+ if self.deprecated and self.where_defined != ConfigOption.DEFAULT_DEFINITION:
253
+ if self.is_expired():
254
+ # Import here to avoid circular imports
255
+ from streamlit.logger import get_logger
256
+
257
+ LOGGER = get_logger(__name__)
258
+ LOGGER.error(
259
+ textwrap.dedent(
260
+ f"""
261
+ ════════════════════════════════════════════════
262
+ {self.key} IS NO LONGER SUPPORTED.
263
+
264
+ {self.deprecation_text}
265
+
266
+ Please update {self.where_defined}.
267
+ ════════════════════════════════════════════════
268
+ """
269
+ )
270
+ )
271
+ else:
272
+ # Import here to avoid circular imports
273
+ from streamlit.logger import get_logger
274
+
275
+ LOGGER = get_logger(__name__)
276
+ LOGGER.warning(
277
+ textwrap.dedent(
278
+ f"""s
279
+ ════════════════════════════════════════════════
280
+ {self.key} IS DEPRECATED.
281
+ {self.deprecation_text}
282
+
283
+ This option will be removed on or after {self.expiration_date}.
284
+
285
+ Please update {self.where_defined}.
286
+ ════════════════════════════════════════════════
287
+ """
288
+ )
289
+ )
290
+
291
+ def is_expired(self) -> bool:
292
+ """Returns true if expiration_date is in the past."""
293
+ if not self.deprecated:
294
+ return False
295
+
296
+ expiration_date = _parse_yyyymmdd_str(self.expiration_date)
297
+ now = datetime.datetime.now()
298
+ return now > expiration_date
299
+
300
+ @property
301
+ def env_var(self):
302
+ """
303
+ Get the name of the environment variable that can be used to set the option.
304
+ """
305
+ name = self.key.replace(".", "_")
306
+ return f"STREAMLIT_{to_snake_case(name).upper()}"
307
+
308
+
309
+ def _parse_yyyymmdd_str(date_str: str) -> datetime.datetime:
310
+ year, month, day = (int(token) for token in date_str.split("-", 2))
311
+ return datetime.datetime(year, month, day)
@@ -0,0 +1,177 @@
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 re
18
+
19
+ from streamlit import cli_util
20
+ from streamlit.config_option import ConfigOption
21
+
22
+
23
+ def server_option_changed(
24
+ old_options: dict[str, ConfigOption], new_options: dict[str, ConfigOption]
25
+ ) -> bool:
26
+ """Return True if and only if an option in the server section differs
27
+ between old_options and new_options.
28
+ """
29
+ for opt_name, opt_val in old_options.items():
30
+ if not opt_name.startswith("server"):
31
+ continue
32
+
33
+ old_val = opt_val.value
34
+ new_val = new_options[opt_name].value
35
+ if old_val != new_val:
36
+ return True
37
+
38
+ return False
39
+
40
+
41
+ def show_config(
42
+ section_descriptions: dict[str, str],
43
+ config_options: dict[str, ConfigOption],
44
+ ) -> None:
45
+ """Print the given config sections/options to the terminal."""
46
+
47
+ out = []
48
+ out.append(
49
+ _clean(
50
+ """
51
+ # Below are all the sections and options you can have in
52
+ ~/.streamlit/config.toml.
53
+ """
54
+ )
55
+ )
56
+
57
+ def append_desc(text):
58
+ out.append("# " + cli_util.style_for_cli(text, bold=True))
59
+
60
+ def append_comment(text):
61
+ out.append("# " + cli_util.style_for_cli(text))
62
+
63
+ def append_section(text):
64
+ out.append(cli_util.style_for_cli(text, bold=True, fg="green"))
65
+
66
+ def append_setting(text):
67
+ out.append(cli_util.style_for_cli(text, fg="green"))
68
+
69
+ for section, _ in section_descriptions.items():
70
+ # We inject a fake config section used for unit tests that we exclude here as
71
+ # its options are often missing required properties, which confuses the code
72
+ # below.
73
+ if section == "_test":
74
+ continue
75
+
76
+ section_options = {
77
+ k: v
78
+ for k, v in config_options.items()
79
+ if v.section == section and v.visibility == "visible" and not v.is_expired()
80
+ }
81
+
82
+ # Only show config header if section is non-empty.
83
+ if len(section_options) == 0:
84
+ continue
85
+
86
+ out.append("")
87
+ append_section("[%s]" % section)
88
+ out.append("")
89
+
90
+ for key, option in section_options.items():
91
+ key = option.key.split(".")[1]
92
+ description_paragraphs = _clean_paragraphs(option.description or "")
93
+
94
+ last_paragraph_idx = len(description_paragraphs) - 1
95
+
96
+ for i, paragraph in enumerate(description_paragraphs):
97
+ # Split paragraph into lines
98
+ lines = paragraph.rstrip().split(
99
+ "\n"
100
+ ) # Remove trailing newline characters
101
+
102
+ # If the first line is empty, remove it
103
+ if lines and not lines[0].strip():
104
+ lines = lines[1:]
105
+
106
+ # Choose function based on whether it's the first paragraph or not
107
+ append_func = append_desc if i == 0 else append_comment
108
+
109
+ # Add comment character to each line and add to out
110
+ for line in lines:
111
+ append_func(line.lstrip())
112
+
113
+ # # Add a line break after a paragraph only if it's not the last paragraph
114
+ if i != last_paragraph_idx:
115
+ out.append("")
116
+
117
+ import toml
118
+
119
+ toml_default = toml.dumps({"default": option.default_val})
120
+ toml_default = toml_default[10:].strip()
121
+
122
+ if len(toml_default) > 0:
123
+ # Ensure a line break before appending "Default" comment, if not already there
124
+ if out[-1] != "":
125
+ out.append("")
126
+ append_comment("Default: %s" % toml_default)
127
+ else:
128
+ # Don't say "Default: (unset)" here because this branch applies
129
+ # to complex config settings too.
130
+ pass
131
+
132
+ if option.deprecated:
133
+ append_comment(cli_util.style_for_cli("DEPRECATED.", fg="yellow"))
134
+ for line in _clean_paragraphs(option.deprecation_text):
135
+ append_comment(line)
136
+ append_comment(
137
+ "This option will be removed on or after %s."
138
+ % option.expiration_date
139
+ )
140
+
141
+ option_is_manually_set = (
142
+ option.where_defined != ConfigOption.DEFAULT_DEFINITION
143
+ )
144
+
145
+ if option_is_manually_set:
146
+ append_comment("The value below was set in %s" % option.where_defined)
147
+
148
+ toml_setting = toml.dumps({key: option.value})
149
+
150
+ if len(toml_setting) == 0:
151
+ toml_setting = f"# {key} =\n"
152
+ elif not option_is_manually_set:
153
+ toml_setting = f"# {toml_setting}"
154
+
155
+ append_setting(toml_setting)
156
+
157
+ cli_util.print_to_cli("\n".join(out))
158
+
159
+
160
+ def _clean(txt: str) -> str:
161
+ """Replace sequences of multiple spaces with a single space, excluding newlines.
162
+
163
+ Preserves leading and trailing spaces, and does not modify spaces in between lines.
164
+ """
165
+ return re.sub(" +", " ", txt)
166
+
167
+
168
+ def _clean_paragraphs(txt: str) -> list[str]:
169
+ """Split the text into paragraphs, preserve newlines within the paragraphs."""
170
+ # Strip both leading and trailing newlines.
171
+ txt = txt.strip("\n")
172
+ paragraphs = txt.split("\n\n")
173
+ cleaned_paragraphs = [
174
+ "\n".join(_clean(line) for line in paragraph.split("\n"))
175
+ for paragraph in paragraphs
176
+ ]
177
+ return cleaned_paragraphs
@@ -0,0 +1,28 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from streamlit.connections.base_connection import BaseConnection
16
+ from streamlit.connections.snowflake_connection import SnowflakeConnection
17
+ from streamlit.connections.snowpark_connection import SnowparkConnection
18
+ from streamlit.connections.sql_connection import SQLConnection
19
+
20
+ ExperimentalBaseConnection = BaseConnection
21
+
22
+ __all__ = [
23
+ "BaseConnection",
24
+ "SnowflakeConnection",
25
+ "SnowparkConnection",
26
+ "SQLConnection",
27
+ "ExperimentalBaseConnection",
28
+ ]
@@ -0,0 +1,174 @@
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 json
18
+ from abc import ABC, abstractmethod
19
+ from typing import Any, Generic, TypeVar
20
+
21
+ from streamlit.runtime.secrets import AttrDict, secrets_singleton
22
+ from streamlit.util import calc_md5
23
+
24
+ RawConnectionT = TypeVar("RawConnectionT")
25
+
26
+
27
+ class BaseConnection(ABC, Generic[RawConnectionT]):
28
+ """The abstract base class that all Streamlit Connections must inherit from.
29
+
30
+ This base class provides connection authors with a standardized way to hook into the
31
+ ``st.connection()`` factory function: connection authors are required to provide an
32
+ implementation for the abstract method ``_connect`` in their subclasses.
33
+
34
+ Additionally, it also provides a few methods/properties designed to make
35
+ implementation of connections more convenient. See the docstrings for each of the
36
+ methods of this class for more information
37
+
38
+ .. note::
39
+ While providing an implementation of ``_connect`` is technically all that's
40
+ required to define a valid connection, connections should also provide the user
41
+ with context-specific ways of interacting with the underlying connection object.
42
+ For example, the first-party SQLConnection provides a ``query()`` method for
43
+ reads and a ``session`` property for more complex operations.
44
+ """
45
+
46
+ def __init__(self, connection_name: str, **kwargs) -> None:
47
+ """Create a BaseConnection.
48
+
49
+ This constructor is called by the connection factory machinery when a user
50
+ script calls ``st.connection()``.
51
+
52
+ Subclasses of BaseConnection that want to overwrite this method should take care
53
+ to also call the base class' implementation.
54
+
55
+ Parameters
56
+ ----------
57
+ connection_name : str
58
+ The name of this connection. This corresponds to the
59
+ ``[connections.<connection_name>]`` config section in ``st.secrets``.
60
+ kwargs : dict
61
+ Any other kwargs to pass to this connection class' ``_connect`` method.
62
+
63
+ Returns
64
+ -------
65
+ None
66
+ """
67
+ self._connection_name = connection_name
68
+ self._kwargs = kwargs
69
+
70
+ self._config_section_hash = calc_md5(json.dumps(self._secrets.to_dict()))
71
+ secrets_singleton.file_change_listener.connect(self._on_secrets_changed)
72
+
73
+ self._raw_instance: RawConnectionT | None = self._connect(**kwargs)
74
+
75
+ def __del__(self) -> None:
76
+ secrets_singleton.file_change_listener.disconnect(self._on_secrets_changed)
77
+
78
+ def __getattribute__(self, name: str) -> Any:
79
+ try:
80
+ return object.__getattribute__(self, name)
81
+ except AttributeError as e:
82
+ if hasattr(self._instance, name):
83
+ raise AttributeError(
84
+ f"`{name}` doesn't exist here, but you can call `._instance.{name}` instead"
85
+ )
86
+ raise e
87
+
88
+ # Methods with default implementations that we don't expect subclasses to want or
89
+ # need to overwrite.
90
+ def _on_secrets_changed(self, _) -> None:
91
+ """Reset the raw connection object when this connection's secrets change.
92
+
93
+ We don't expect either user scripts or connection authors to have to use or
94
+ overwrite this method.
95
+ """
96
+ new_hash = calc_md5(json.dumps(self._secrets.to_dict()))
97
+
98
+ # Only reset the connection if the secrets file section specific to this
99
+ # connection has changed.
100
+ if new_hash != self._config_section_hash:
101
+ self._config_section_hash = new_hash
102
+ self.reset()
103
+
104
+ @property
105
+ def _secrets(self) -> AttrDict:
106
+ """Get the secrets for this connection from the corresponding st.secrets section.
107
+
108
+ We expect this property to be used primarily by connection authors when they
109
+ are implementing their class' ``_connect`` method. User scripts should, for the
110
+ most part, have no reason to use this property.
111
+ """
112
+ connections_section = None
113
+ if secrets_singleton.load_if_toml_exists():
114
+ connections_section = secrets_singleton.get("connections")
115
+
116
+ if type(connections_section) is not AttrDict:
117
+ return AttrDict({})
118
+
119
+ return connections_section.get(self._connection_name, AttrDict({}))
120
+
121
+ def reset(self) -> None:
122
+ """Reset this connection so that it gets reinitialized the next time it's used.
123
+
124
+ This method can be useful when a connection has become stale, an auth token has
125
+ expired, or in similar scenarios where a broken connection might be fixed by
126
+ reinitializing it. Note that some connection methods may already use ``reset()``
127
+ in their error handling code.
128
+
129
+ Returns
130
+ -------
131
+ None
132
+
133
+ Example
134
+ -------
135
+ >>> import streamlit as st
136
+ >>>
137
+ >>> conn = st.connection("my_conn")
138
+ >>>
139
+ >>> # Reset the connection before using it if it isn't healthy
140
+ >>> # Note: is_healthy() isn't a real method and is just shown for example here.
141
+ >>> if not conn.is_healthy():
142
+ ... conn.reset()
143
+ >>>
144
+ >>> # Do stuff with conn...
145
+ """
146
+ self._raw_instance = None
147
+
148
+ @property
149
+ def _instance(self) -> RawConnectionT:
150
+ """Get an instance of the underlying connection, creating a new one if needed."""
151
+ if self._raw_instance is None:
152
+ self._raw_instance = self._connect(**self._kwargs)
153
+
154
+ return self._raw_instance
155
+
156
+ # Abstract fields/methods that subclasses of BaseConnection must implement
157
+ @abstractmethod
158
+ def _connect(self, **kwargs) -> RawConnectionT:
159
+ """Create an instance of an underlying connection object.
160
+
161
+ This abstract method is the one method that we require subclasses of
162
+ BaseConnection to provide an implementation for. It is called when first
163
+ creating a connection and when reconnecting after a connection is reset.
164
+
165
+ Parameters
166
+ ----------
167
+ kwargs : dict
168
+
169
+ Returns
170
+ -------
171
+ RawConnectionT
172
+ The underlying connection object.
173
+ """
174
+ raise NotImplementedError