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,562 @@
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
+ # NOTE: We won't always be able to import from snowflake.{connector, snowpark}.* so need
16
+ # the `type: ignore` comment below, but that comment will explode if `warn-unused-ignores`
17
+ # is turned on when the package is available. Unfortunately, mypy doesn't provide a good
18
+ # way to configure this at a per-line level :(
19
+ # mypy: no-warn-unused-ignores
20
+
21
+ from __future__ import annotations
22
+
23
+ from typing import TYPE_CHECKING, Final, cast
24
+
25
+ from streamlit import logger
26
+ from streamlit.connections import BaseConnection
27
+ from streamlit.connections.util import running_in_sis
28
+ from streamlit.errors import StreamlitAPIException
29
+ from streamlit.runtime.caching import cache_data
30
+
31
+ _LOGGER: Final = logger.get_logger(__name__)
32
+
33
+ if TYPE_CHECKING:
34
+ from datetime import timedelta
35
+
36
+ from pandas import DataFrame
37
+ from snowflake.connector.cursor import SnowflakeCursor # type:ignore[import]
38
+ from snowflake.snowpark.session import Session # type:ignore[import]
39
+
40
+ from snowflake.connector import ( # type:ignore[import] # isort: skip
41
+ SnowflakeConnection as InternalSnowflakeConnection,
42
+ )
43
+
44
+
45
+ class SnowflakeConnection(BaseConnection["InternalSnowflakeConnection"]):
46
+ """A connection to Snowflake using the Snowflake Connector for Python.
47
+
48
+ Initialize this connection object using ``st.connection("snowflake")`` or
49
+ ``st.connection("<name>", type="snowflake")``. Connection parameters for a
50
+ SnowflakeConnection can be specified using ``secrets.toml`` and/or
51
+ ``**kwargs``. Connection parameters are passed to
52
+ |snowflake.connector.connect()|.
53
+
54
+ When an app is running in Streamlit in Snowflake,
55
+ ``st.connection("snowflake")`` connects automatically using the app owner's
56
+ role without further configuration. ``**kwargs`` will be ignored in this
57
+ case. Use ``secrets.toml`` and ``**kwargs`` to configure your connection
58
+ for local development.
59
+
60
+ SnowflakeConnection includes several convenience methods. For example, you
61
+ can directly execute a SQL query with ``.query()`` or access the underlying
62
+ Snowflake Connector object with ``.raw_connection``.
63
+
64
+ .. |snowflake.connector.connect()| replace:: ``snowflake.connector.connect()``
65
+ .. _snowflake.connector.connect(): https://docs.snowflake.com/en/developer-guide/python-connector/python-connector-api#label-snowflake-connector-methods-connect
66
+
67
+ .. Tip::
68
+ `snowflake-snowpark-python <https://pypi.org/project/snowflake-snowpark-python/>`_
69
+ must be installed in your environment to use this connection. You can
70
+ install Snowflake extras along with Streamlit:
71
+
72
+ >>> pip install streamlit[snowflake]
73
+
74
+ .. Important::
75
+ Account identifiers must be of the form ``<orgname>-<account_name>``
76
+ where ``<orgname>`` is the name of your Snowflake organization and
77
+ ``<account_name>`` is the unique name of your account within your
78
+ organization. This is dash-separated, not dot-separated like when used
79
+ in SQL queries. For more information, see `Account identifiers
80
+ <https://docs.snowflake.com/en/user-guide/admin-account-identifier>`_.
81
+
82
+ Examples
83
+ --------
84
+
85
+ **Example 1: Configuration with Streamlit secrets**
86
+
87
+ You can configure your Snowflake connection using Streamlit's
88
+ `Secrets management <https://docs.streamlit.io/develop/concepts/connections/secrets-management>`_.
89
+ For example, if you have MFA enabled on your account, you can connect using
90
+ `key-pair authentication <https://docs.snowflake.com/en/user-guide/key-pair-auth>`_.
91
+
92
+ ``.streamlit/secrets.toml``:
93
+
94
+ >>> [connections.snowflake]
95
+ >>> account = "xxx-xxx"
96
+ >>> user = "xxx"
97
+ >>> private_key_file = "/xxx/xxx/xxx.p8"
98
+ >>> role = "xxx"
99
+ >>> warehouse = "xxx"
100
+ >>> database = "xxx"
101
+ >>> schema = "xxx"
102
+
103
+ Your app code:
104
+
105
+ >>> import streamlit as st
106
+ >>> conn = st.connection("snowflake")
107
+ >>> df = conn.query("SELECT * FROM my_table")
108
+
109
+ **Example 2: Configuration with keyword arguments and external authentication**
110
+
111
+ You can configure your Snowflake connection with keyword arguments. The
112
+ keyword arguments are merged with (and take precedence over) the values in
113
+ ``secrets.toml``. However, if you name your connection ``"snowflake"`` and
114
+ don't have a ``[connections.snowflake]`` dictionary in your
115
+ ``secrets.toml`` file, Streamlit will ignore any keyword arguments and use
116
+ the default Snowflake connection as described in Example 5 and Example 6.
117
+ To configure your connection using only keyword arguments, declare a name
118
+ for the connection other than ``"snowflake"``.
119
+
120
+ For example, if your Snowflake account supports SSO, you can set up a quick
121
+ local connection for development using `browser-based SSO
122
+ <https://docs.snowflake.com/en/user-guide/admin-security-fed-auth-use#how-browser-based-sso-works>`_.
123
+ Because there is nothing configured in ``secrets.toml``, the name is an
124
+ empty string and the type is set to ``"snowflake"``. This prevents
125
+ Streamlit from ignoring the keyword arguments and using a default
126
+ Snowflake connection.
127
+
128
+ >>> import streamlit as st
129
+ >>> conn = st.connection(
130
+ ... "",
131
+ ... type="snowflake",
132
+ ... account="xxx-xxx",
133
+ ... user="xxx",
134
+ ... authenticator="externalbrowser",
135
+ ... )
136
+ >>> df = conn.query("SELECT * FROM my_table")
137
+
138
+ **Example 3: Named connection with Snowflake's connection configuration file**
139
+
140
+ Snowflake's Python Connector supports a `connection configuration file
141
+ <https://docs.snowflake.com/en/developer-guide/python-connector/python-connector-connect#connecting-using-the-connections-toml-file>`_,
142
+ which is well integrated with Streamlit's ``SnowflakeConnection``. If you
143
+ already have one or more connections configured, all you need to do is pass
144
+ the name of the connection to use.
145
+
146
+ ``~/.snowflake/connections.toml``:
147
+
148
+ >>> [my_connection]
149
+ >>> account = "xxx-xxx"
150
+ >>> user = "xxx"
151
+ >>> password = "xxx"
152
+ >>> warehouse = "xxx"
153
+ >>> database = "xxx"
154
+ >>> schema = "xxx"
155
+
156
+ Your app code:
157
+
158
+ >>> import streamlit as st
159
+ >>> conn = st.connection("my_connection", type="snowflake")
160
+ >>> df = conn.query("SELECT * FROM my_table")
161
+
162
+ **Example 4: Named connection with Streamlit secrets and Snowflake's connection configuration file**
163
+
164
+ If you have a Snowflake configuration file with a connection named
165
+ ``my_connection`` as in Example 3, you can pass the connection name through
166
+ ``secrets.toml``.
167
+
168
+ ``.streamlit/secrets.toml``:
169
+
170
+ >>> [connections.snowflake]
171
+ >>> connection_name = "my_connection"
172
+
173
+ Your app code:
174
+
175
+ >>> import streamlit as st
176
+ >>> conn = st.connection("snowflake")
177
+ >>> df = conn.query("SELECT * FROM my_table")
178
+
179
+ **Example 5: Default connection with an environment variable**
180
+
181
+ If you don't have a ``[connections.snowflake]`` dictionary in your
182
+ ``secrets.toml`` file and use ``st.connection("snowflake")``, Streamlit
183
+ will use the default connection for the `Snowflake Python Connector
184
+ <https://docs.snowflake.cn/en/developer-guide/python-connector/python-connector-connect#setting-a-default-connection>`_.
185
+
186
+ If you have a Snowflake configuration file with a connection named
187
+ ``my_connection`` as in Example 3, you can set an environment variable to
188
+ declare it as the default Snowflake connection.
189
+
190
+ >>> SNOWFLAKE_DEFAULT_CONNECTION_NAME = "my_connection"
191
+
192
+ Your app code:
193
+
194
+ >>> import streamlit as st
195
+ >>> conn = st.connection("snowflake")
196
+ >>> df = conn.query("SELECT * FROM my_table")
197
+
198
+ **Example 6: Default connection in Snowflake's connection configuration file**
199
+
200
+ If you have a Snowflake configuration file that defines your ``default``
201
+ connection, Streamlit will automatically use it if no other connection is
202
+ declared.
203
+
204
+ ``~/.snowflake/connections.toml``:
205
+
206
+ >>> [default]
207
+ >>> account = "xxx-xxx"
208
+ >>> user = "xxx"
209
+ >>> password = "xxx"
210
+ >>> warehouse = "xxx"
211
+ >>> database = "xxx"
212
+ >>> schema = "xxx"
213
+
214
+ Your app code:
215
+
216
+ >>> import streamlit as st
217
+ >>> conn = st.connection("snowflake")
218
+ >>> df = conn.query("SELECT * FROM my_table")
219
+
220
+ """
221
+
222
+ def _connect(self, **kwargs) -> InternalSnowflakeConnection:
223
+ import snowflake.connector # type:ignore[import]
224
+ from snowflake.connector import Error as SnowflakeError # type:ignore[import]
225
+
226
+ # If we're running in SiS, just call get_active_session() and retrieve the
227
+ # lower-level connection from it.
228
+ if running_in_sis():
229
+ from snowflake.snowpark.context import ( # type:ignore[import] # isort: skip
230
+ get_active_session,
231
+ )
232
+
233
+ session = get_active_session()
234
+
235
+ if hasattr(session, "connection"):
236
+ return session.connection
237
+ # session.connection is only a valid attr in more recent versions of
238
+ # snowflake-connector-python, so we fall back to grabbing
239
+ # session._conn._conn if `.connection` is unavailable.
240
+ return session._conn._conn
241
+
242
+ # We require qmark-style parameters everywhere for consistency across different
243
+ # environments where SnowflakeConnections may be used.
244
+ snowflake.connector.paramstyle = "qmark"
245
+
246
+ # Otherwise, attempt to create a new connection from whatever credentials we
247
+ # have available.
248
+ try:
249
+ st_secrets = self._secrets.to_dict()
250
+ if len(st_secrets):
251
+ _LOGGER.info(
252
+ "Connect to Snowflake using the Streamlit secret defined under "
253
+ "[connections.snowflake]."
254
+ )
255
+ conn_kwargs = {**st_secrets, **kwargs}
256
+ return snowflake.connector.connect(**conn_kwargs)
257
+
258
+ # Use the default configuration as defined in https://docs.snowflake.cn/en/developer-guide/python-connector/python-connector-connect#setting-a-default-connection
259
+ if self._connection_name == "snowflake":
260
+ _LOGGER.info(
261
+ "Connect to Snowflake using the default configuration as defined "
262
+ "in https://docs.snowflake.cn/en/developer-guide/python-connector/python-connector-connect#setting-a-default-connection"
263
+ )
264
+ return snowflake.connector.connect()
265
+
266
+ return snowflake.connector.connect(**kwargs)
267
+ except SnowflakeError as e:
268
+ if not len(st_secrets) and not len(kwargs):
269
+ raise StreamlitAPIException(
270
+ "Missing Snowflake connection configuration. "
271
+ "Did you forget to set this in `secrets.toml`, a Snowflake configuration file, "
272
+ "or as kwargs to `st.connection`? "
273
+ "See the [SnowflakeConnection configuration documentation](https://docs.streamlit.io/st.connections.snowflakeconnection-configuration) "
274
+ "for more details and examples."
275
+ )
276
+ raise e
277
+
278
+ def query(
279
+ self,
280
+ sql: str,
281
+ *, # keyword-only arguments:
282
+ ttl: float | int | timedelta | None = None,
283
+ show_spinner: bool | str = "Running `snowflake.query(...)`.",
284
+ params=None,
285
+ **kwargs,
286
+ ) -> DataFrame:
287
+ """Run a read-only SQL query.
288
+
289
+ This method implements query result caching and simple error
290
+ handling/retries. The caching behavior is identical to that of using
291
+ ``@st.cache_data``.
292
+
293
+ .. note::
294
+ Queries that are run without a specified ``ttl`` are cached
295
+ indefinitely.
296
+
297
+ Parameters
298
+ ----------
299
+ sql : str
300
+ The read-only SQL query to execute.
301
+ ttl : float, int, timedelta or None
302
+ The maximum number of seconds to keep results in the cache. If this
303
+ is ``None`` (default), cached results do not expire with time.
304
+ show_spinner : boolean or string
305
+ Whether to enable the spinner. When a cached query is executed, no
306
+ spinner is displayed because the result is immediately available.
307
+ When a new query is executed, the default is to show a spinner with
308
+ the message "Running ``snowflake.query(...)``."
309
+
310
+ If this is ``False``, no spinner displays while executing the
311
+ query. If this is a string, the string will be used as the message
312
+ for the spinner.
313
+ params : list, tuple, dict or None
314
+ List of parameters to pass to the Snowflake Connector for Python
315
+ ``Cursor.execute()`` method. This connector supports binding data
316
+ to a SQL statement using qmark bindings. For more information and
317
+ examples, see the `Snowflake Connector for Python documentation
318
+ <https://docs.snowflake.com/en/developer-guide/python-connector/python-connector-example#using-qmark-or-numeric-binding>`_.
319
+ This defaults to ``None``.
320
+
321
+ Returns
322
+ -------
323
+ pandas.DataFrame
324
+ The result of running the query, formatted as a pandas DataFrame.
325
+
326
+ Example
327
+ -------
328
+
329
+ >>> import streamlit as st
330
+ >>>
331
+ >>> conn = st.connection("snowflake")
332
+ >>> df = conn.query("SELECT * FROM my_table")
333
+ >>> st.dataframe(df)
334
+
335
+ """
336
+ from tenacity import retry, retry_if_exception, stop_after_attempt, wait_fixed
337
+
338
+ # the ANSI-compliant SQL code for "connection was not established" (see docs: https://docs.snowflake.com/en/developer-guide/python-connector/python-connector-api#id6)
339
+ SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED = "08001"
340
+
341
+ @retry(
342
+ after=lambda _: self.reset(),
343
+ stop=stop_after_attempt(3),
344
+ reraise=True,
345
+ # We don't have to implement retries ourself for most error types as the
346
+ # `snowflake-connector-python` library already implements retries for
347
+ # retryable HTTP errors.
348
+ retry=retry_if_exception(
349
+ lambda e: hasattr(e, "sqlstate")
350
+ and e.sqlstate == SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED
351
+ ),
352
+ wait=wait_fixed(1),
353
+ )
354
+ def _query(sql: str) -> DataFrame:
355
+ cur = self._instance.cursor()
356
+ cur.execute(sql, params=params, **kwargs)
357
+ return cur.fetch_pandas_all()
358
+
359
+ # We modify our helper function's `__qualname__` here to work around default
360
+ # `@st.cache_data` behavior. Otherwise, `.query()` being called with different
361
+ # `ttl` values will reset the cache with each call, and the query caches won't
362
+ # be scoped by connection.
363
+ ttl_str = str( # Avoid adding extra `.` characters to `__qualname__`
364
+ ttl
365
+ ).replace(".", "_")
366
+ _query.__qualname__ = f"{_query.__qualname__}_{self._connection_name}_{ttl_str}"
367
+ _query = cache_data(
368
+ show_spinner=show_spinner,
369
+ ttl=ttl,
370
+ )(_query)
371
+
372
+ return _query(sql)
373
+
374
+ def write_pandas(
375
+ self,
376
+ df: DataFrame,
377
+ table_name: str,
378
+ database: str | None = None,
379
+ schema: str | None = None,
380
+ chunk_size: int | None = None,
381
+ **kwargs,
382
+ ) -> tuple[bool, int, int]:
383
+ """Write a ``pandas.DataFrame`` to a table in a Snowflake database.
384
+
385
+ This convenience method is a thin wrapper around
386
+ ``snowflake.connector.pandas_tools.write_pandas()`` using the
387
+ underlying connection. The ``conn`` parameter is passed automatically.
388
+ For more information and additional keyword arguments, see the
389
+ `Snowflake Connector for Python documentation
390
+ <https://docs.snowflake.com/en/developer-guide/python-connector/python-connector-api#write_pandas>`_.
391
+
392
+ Parameters
393
+ ----------
394
+ df: pandas.DataFrame
395
+ The ``pandas.DataFrame`` object containing the data to be copied
396
+ into the table.
397
+ table_name: str
398
+ Name of the table where the data should be copied to.
399
+ database: str
400
+ Name of the database containing the table. By default, the function
401
+ writes to the database that is currently in use in the session.
402
+
403
+ .. Note::
404
+ If you specify this parameter, you must also specify the schema
405
+ parameter.
406
+
407
+ schema: str
408
+ Name of the schema containing the table. By default, the function
409
+ writes to the table in the schema that is currently in use in the
410
+ session.
411
+ chunk_size: int
412
+ Number of elements to insert at a time. By default, the function
413
+ inserts all elements in one chunk.
414
+ **kwargs: Any
415
+ Additional keyword arguments for
416
+ ``snowflake.connector.pandas_tools.write_pandas()``.
417
+
418
+ Returns
419
+ -------
420
+ tuple[bool, int, int]
421
+ A tuple containing three values:
422
+
423
+ 1. A boolean value that is ``True`` if the write was successful.
424
+ 2. An integer giving the number of chunks of data that were copied.
425
+ 3. An integer giving the number of rows that were inserted.
426
+
427
+ Example
428
+ -------
429
+ The following example uses the database and schema currently in use in
430
+ the session and copies the data into a table named "my_table."
431
+
432
+ >>> import streamlit as st
433
+ >>> import pandas as pd
434
+ >>>
435
+ >>> df = pd.DataFrame(
436
+ ... {"Name": ["Mary", "John", "Robert"], "Pet": ["dog", "cat", "bird"]}
437
+ ... )
438
+ >>> conn = st.connection("snowflake")
439
+ >>> conn.write_pandas(df, "my_table")
440
+
441
+ """
442
+ from snowflake.connector.pandas_tools import write_pandas # type:ignore[import]
443
+
444
+ success, nchunks, nrows, _ = write_pandas(
445
+ conn=self._instance,
446
+ df=df,
447
+ table_name=table_name,
448
+ database=database,
449
+ schema=schema,
450
+ chunk_size=chunk_size,
451
+ **kwargs,
452
+ )
453
+
454
+ return (success, nchunks, nrows)
455
+
456
+ def cursor(self) -> SnowflakeCursor:
457
+ """Create a new cursor object from this connection.
458
+
459
+ Snowflake Connector cursors implement the Python Database API v2.0
460
+ specification (PEP-249). For more information, see the
461
+ `Snowflake Connector for Python documentation
462
+ <https://docs.snowflake.com/en/developer-guide/python-connector/python-connector-api#object-cursor>`_.
463
+
464
+ Returns
465
+ -------
466
+ snowflake.connector.cursor.SnowflakeCursor
467
+ A cursor object for the connection.
468
+
469
+ Example
470
+ -------
471
+ The following example uses a cursor to insert multiple rows into a
472
+ table. The ``qmark`` parameter style is specified as an optional
473
+ keyword argument. Alternatively, the parameter style can be declared in
474
+ your connection configuration file. For more information, see the
475
+ `Snowflake Connector for Python documentation
476
+ <https://docs.snowflake.com/en/developer-guide/python-connector/python-connector-example#using-qmark-or-numeric-binding>`_.
477
+
478
+ >>> import streamlit as st
479
+ >>>
480
+ >>> conn = st.connection("snowflake", "paramstyle"="qmark")
481
+ >>> rows_to_insert = [("Mary", "dog"), ("John", "cat"), ("Robert", "bird")]
482
+ >>> conn.cursor().executemany(
483
+ ... "INSERT INTO mytable (name, pet) VALUES (?, ?)", rows_to_insert
484
+ ... )
485
+
486
+ """
487
+ return self._instance.cursor()
488
+
489
+ @property
490
+ def raw_connection(self) -> InternalSnowflakeConnection:
491
+ """Access the underlying connection object from the Snowflake\
492
+ Connector for Python.
493
+
494
+ For information on how to use the Snowflake Connector for Python, see
495
+ the `Snowflake Connector for Python documentation
496
+ <https://docs.snowflake.com/en/developer-guide/python-connector/python-connector-example>`_.
497
+
498
+ Returns
499
+ -------
500
+ snowflake.connector.connection.SnowflakeConnection
501
+ The connection object.
502
+
503
+ Example
504
+ -------
505
+ The following example uses a cursor to submit an asynchronous query,
506
+ saves the query ID, then periodically checks the query status through
507
+ the connection before retrieving the results.
508
+
509
+ >>> import streamlit as st
510
+ >>> import time
511
+ >>>
512
+ >>> conn = st.connection("snowflake")
513
+ >>> cur = conn.cursor()
514
+ >>> cur.execute_async("SELECT * FROM my_table")
515
+ >>> query_id = cur.sfqid
516
+ >>> while True:
517
+ ... status = conn.raw_connection.get_query_status(query_id)
518
+ ... if conn.raw_connection.is_still_running(status):
519
+ ... time.sleep(1)
520
+ ... else:
521
+ ... break
522
+ >>> cur.get_results_from_sfqid(query_id)
523
+ >>> df = cur.fetchall()
524
+
525
+ """
526
+ return self._instance
527
+
528
+ def session(self) -> Session:
529
+ """Create a new Snowpark session from this connection.
530
+
531
+ For information on how to use Snowpark sessions, see the
532
+ `Snowpark developer guide
533
+ <https://docs.snowflake.com/en/developer-guide/snowpark/python/working-with-dataframes>`_
534
+ and `Snowpark API Reference
535
+ <https://docs.snowflake.com/en/developer-guide/snowpark/reference/python/latest/snowpark/session>`_.
536
+
537
+ Returns
538
+ -------
539
+ snowflake.snowpark.Session
540
+ A new Snowpark session for this connection.
541
+
542
+ Example
543
+ -------
544
+ The following example creates a new Snowpark session and uses it to run
545
+ a query.
546
+
547
+ >>> import streamlit as st
548
+ >>>
549
+ >>> conn = st.connection("snowflake")
550
+ >>> session = conn.session()
551
+ >>> df = session.sql("SELECT * FROM my_table").collect()
552
+
553
+ """
554
+ from snowflake.snowpark.context import get_active_session # type:ignore[import]
555
+ from snowflake.snowpark.session import Session # type:ignore[import]
556
+
557
+ if running_in_sis():
558
+ return get_active_session()
559
+
560
+ return cast(
561
+ Session, Session.builder.configs({"connection": self._instance}).create()
562
+ )