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
streamlit/user_info.py ADDED
@@ -0,0 +1,519 @@
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
+ from collections.abc import Iterator, Mapping
18
+ from typing import (
19
+ TYPE_CHECKING,
20
+ Final,
21
+ NoReturn,
22
+ Union,
23
+ )
24
+
25
+ from streamlit import config, logger, runtime
26
+ from streamlit.auth_util import (
27
+ encode_provider_token,
28
+ get_secrets_auth_section,
29
+ is_authlib_installed,
30
+ validate_auth_credentials,
31
+ )
32
+ from streamlit.errors import StreamlitAPIException, StreamlitAuthError
33
+ from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
34
+ from streamlit.runtime.metrics_util import gather_metrics
35
+ from streamlit.runtime.scriptrunner_utils.script_run_context import (
36
+ get_script_run_ctx as _get_script_run_ctx,
37
+ )
38
+ from streamlit.url_util import make_url_path
39
+
40
+ if TYPE_CHECKING:
41
+ from streamlit.runtime.scriptrunner_utils.script_run_context import UserInfo
42
+
43
+
44
+ _LOGGER: Final = logger.get_logger(__name__)
45
+
46
+ AUTH_LOGIN_ENDPOINT: Final = "/auth/login"
47
+ AUTH_LOGOUT_ENDPOINT: Final = "/auth/logout"
48
+
49
+
50
+ @gather_metrics("login")
51
+ def login(provider: str | None = None) -> None:
52
+ """Initiate the login flow for the given provider.
53
+
54
+ This command redirects the user to an OpenID Connect (OIDC) provider. After
55
+ the user authenticates their identity, they are redirected back to the
56
+ home page of your app. Streamlit stores a cookie with the user's identity
57
+ information in the user's browser . You can access the identity information
58
+ through |st.experimental_user|_. Call ``st.logout()`` to remove the cookie
59
+ and start a new session.
60
+
61
+ You can use any OIDC provider, including Google, Microsoft, Okta, and more.
62
+ You must configure the provider through secrets management. Although OIDC
63
+ is an extension of OAuth 2.0, you can't use generic OAuth providers.
64
+ Streamlit parses the user's identity token and surfaces its attributes in
65
+ ``st.experimental_user``. If the provider returns an access token, that
66
+ token is ignored. Therefore, this command will not allow your app to act on
67
+ behalf of a user in a secure system.
68
+
69
+ For all providers, there are two shared settings, ``redirect_uri`` and
70
+ ``cookie_secret``, which you must specify in an ``[auth]`` dictionary
71
+ in ``secrets.toml``. Other settings must be defined as described in the
72
+ ``provider`` parameter.
73
+
74
+ - ``redirect_uri`` is your app's absolute URL with the pathname
75
+ ``oauth2callback``. For local development using the default port, this is
76
+ ``http://localhost:8501/oauth2callback``.
77
+ - ``cookie_secret`` should be a strong, randomly generated secret.
78
+
79
+ In addition to the shared settings, the following settings are required:
80
+
81
+ - ``client_id``
82
+ - ``client_secret``
83
+ - ``server_metadata_url``
84
+
85
+ For a complete list of OIDC parameters, see `OpenID Connect Core
86
+ <https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest>`_ and
87
+ your provider's documentation. By default, Streamlit sets
88
+ ``scope="openid profile email"`` and ``prompt="select_account"``. You can
89
+ change these and other OIDC parameters by passing a dictionary of settings
90
+ to ``client_kwargs``. ``state`` and ``nonce``, which are used for
91
+ security, are handled automatically and don't need to be specified. For
92
+ more information, see Example 4.
93
+
94
+ .. Important::
95
+ - You must install ``Authlib>=1.3.2`` to use this command.
96
+ - Your authentication configuration is dependent on your host location.
97
+ When you deploy your app, remember to update your ``redirect_uri``
98
+ within your app and your provider.
99
+ - All URLs declared in the settings must be absolute (i.e., begin with
100
+ ``http://`` or ``https://``).
101
+ - Streamlit automatically enables CORS and XSRF protection when you
102
+ configure authentication in ``secrets.toml``. This takes precedence
103
+ over configuration options in ``config.toml``.
104
+ - If a user is logged into your app and opens a new tab in the same
105
+ browser, they will automatically be logged in to the new session with
106
+ the same account.
107
+ - If a user closes your app without logging out, the identity cookie
108
+ will expire after 30 days.
109
+ - For security reasons, authentication is not supported for embedded
110
+ apps.
111
+
112
+ .. |st.experimental_user| replace:: ``st.experimental_user``
113
+ .. _st.experimental_user: https://docs.streamlit.io/develop/api-reference/utilities/st.experimental_user
114
+
115
+ Parameters
116
+ ----------
117
+ provider: str or None
118
+ The name of your provider configuration to use for login.
119
+
120
+ If ``provider`` is ``None`` (default), Streamlit will use all settings
121
+ in the ``[auth]`` dictionary within your app's ``secrets.toml`` file.
122
+ Otherwise, use an ``[auth.{provider}]`` dictionary for the named
123
+ provider, as shown in the examples that follow. When you pass a string
124
+ to ``provider``, Streamlit will use ``redirect_uri`` and
125
+ ``cookie_secret``, while ignoring any other values in the ``[auth]``
126
+ dictionary.
127
+
128
+ Due to internal implementation details, Streamlit does not support
129
+ using an underscore within ``provider`` at this time.
130
+
131
+ Examples
132
+ --------
133
+
134
+ **Example 1: Use an unnamed default identity provider**
135
+
136
+ If you do not specify a name for your provider, specify all settings within
137
+ the ``[auth]`` dictionary of your ``secrets.toml`` file. The following
138
+ example configures Google as the default provider. For information about
139
+ using OIDC with Google, see `Google Identity
140
+ <https://developers.google.com/identity/openid-connect/openid-connect>`_.
141
+
142
+ ``.streamlit/secrets.toml``:
143
+
144
+ >>> [auth]
145
+ >>> redirect_uri = "http://localhost:8501/oauth2callback"
146
+ >>> cookie_secret = "xxx"
147
+ >>> client_id = "xxx"
148
+ >>> client_secret = "xxx"
149
+ >>> server_metadata_url = "https://accounts.google.com/.well-known/openid-configuration" # fmt: skip
150
+
151
+ Your app code:
152
+
153
+ >>> import streamlit as st
154
+ >>>
155
+ >>> if not st.experimental_user.is_logged_in:
156
+ >>> if st.button("Log in"):
157
+ >>> st.login()
158
+ >>> else:
159
+ >>> if st.button("Log out"):
160
+ >>> st.logout()
161
+ >>> st.write(f"Hello, {st.experimental_user.name}!")
162
+
163
+ **Example 2: Use a named identity provider**
164
+
165
+ If you specify a name for your provider, save the shared settings in the
166
+ ``[auth]`` dictionary of your ``secrets.toml`` file, and save the other
167
+ settings in an ``[auth.{provider}]`` dictionary, where ``{provider}`` is
168
+ the name of your provider. The following example configures Microsoft as
169
+ the provider. The example uses ``provider="microsoft"``, but you can use
170
+ any name. This name is internal to Streamlit and is used to match the login
171
+ command to its configuration. For information about using OIDC with
172
+ Microsoft, see `Microsoft Entra ID
173
+ <https://learn.microsoft.com/en-us/power-pages/security/authentication/openid-settings>`_.
174
+ To configure your ``{tenant}`` value in ``server_metadata_url``, see
175
+ `Microsoft identity platform
176
+ <https://learn.microsoft.com/en-us/entra/identity-platform/v2-protocols-oidc#find-your-apps-openid-configuration-document-uri>`_.
177
+
178
+ ``.streamlit/secrets.toml``:
179
+
180
+ >>> [auth]
181
+ >>> redirect_uri = "http://localhost:8501/oauth2callback"
182
+ >>> cookie_secret = "xxx"
183
+ >>>
184
+ >>> [auth.microsoft]
185
+ >>> client_id = "xxx"
186
+ >>> client_secret = "xxx"
187
+ >>> server_metadata_url = "https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration"
188
+
189
+ Your app code:
190
+
191
+ >>> import streamlit as st
192
+ >>>
193
+ >>> if not st.experimental_user.is_logged_in:
194
+ >>> st.login("microsoft")
195
+ >>> else:
196
+ >>> st.write(f"Hello, {st.experimental_user.name}!")
197
+
198
+ **Example 3: Use multiple, named providers**
199
+
200
+ If you want to give your users a choice of authentication methods,
201
+ configure multiple providers and give them each a unique name. The
202
+ following example lets users choose between Okta and Microsoft to log in.
203
+ Always check with your identity provider to understand the structure of
204
+ their identity tokens because the returned fields may differ. Remember to
205
+ set ``{tenant}`` and ``{subdomain}`` in ``server_metadata_url`` for
206
+ Microsoft and Okta, respectively.
207
+
208
+ >>> [auth]
209
+ >>> redirect_uri = "http://localhost:8501/oauth2callback"
210
+ >>> cookie_secret = "xxx"
211
+ >>>
212
+ >>> [auth.microsoft]
213
+ >>> client_id = "xxx"
214
+ >>> client_secret = "xxx"
215
+ >>> server_metadata_url = "https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration"
216
+ >>>
217
+ >>> [auth.okta]
218
+ >>> client_id = "xxx"
219
+ >>> client_secret = "xxx"
220
+ >>> server_metadata_url = "https://{subdomain}.okta.com/.well-known/openid-configuration" # fmt: skip
221
+
222
+ Your app code:
223
+
224
+ >>> import streamlit as st
225
+ >>>
226
+ >>> if not st.experimental_user.is_logged_in:
227
+ >>> st.header("Log in:")
228
+ >>> if st.button("Microsoft"):
229
+ >>> st.login("microsoft")
230
+ >>> if st.button("Okta"):
231
+ >>> st.login("okta")
232
+ >>> else:
233
+ >>> if st.button("Log out"):
234
+ >>> st.logout()
235
+ >>> st.write(f"Hello, {st.experimental_user.name}!")
236
+
237
+ **Example 4: Change the default connection settings**
238
+
239
+ ``prompt="select_account"`` may be treated differently by some
240
+ providers when a user is already logged into their account. If a user is
241
+ logged into their Google or Microsoft account from a previous session, the
242
+ provider will prompt them to select the account they want to use, even if
243
+ it's the only one. However, if the user is logged into their Okta or Auth0
244
+ account from a previous session, the account will automatically be
245
+ selected. ``st.logout()`` does not clear a user's related cookies. To force
246
+ users to log in every time, use ``prompt="login"`` as described in Auth0's
247
+ `Customize Signup and Login Prompts
248
+ <https://auth0.com/docs/customize/login-pages/universal-login/customize-signup-and-login-prompts>`_.
249
+
250
+ ``.streamlit/secrets.toml``:
251
+
252
+ >>> [auth]
253
+ >>> redirect_uri = "http://localhost:8501/oauth2callback"
254
+ >>> cookie_secret = "xxx"
255
+ >>>
256
+ >>> [auth.auth0]
257
+ >>> client_id = "xxx"
258
+ >>> client_secret = "xxx"
259
+ >>> server_metadata_url = "https://{account}.{region}.auth0.com/.well-known/openid-configuration" # fmt: skip
260
+ >>> client_kwargs = { "prompt" = "login" }
261
+
262
+ Your app code:
263
+
264
+ >>> import streamlit as st
265
+ >>> if st.button("Log in"):
266
+ >>> st.login("auth0")
267
+ >>> if st.experimental_user.is_logged_in:
268
+ >>> if st.button("Log out"):
269
+ >>> st.logout()
270
+ >>> st.write(f"Hello, {st.experimental_user.name}!)
271
+
272
+ """
273
+ if provider is None:
274
+ provider = "default"
275
+
276
+ context = _get_script_run_ctx()
277
+ if context is not None:
278
+ if not is_authlib_installed():
279
+ raise StreamlitAuthError(
280
+ """To use authentication features, you need to install """
281
+ """Authlib>=1.3.2, e.g. via `pip install Authlib`."""
282
+ )
283
+ validate_auth_credentials(provider)
284
+ fwd_msg = ForwardMsg()
285
+ fwd_msg.auth_redirect.url = generate_login_redirect_url(provider)
286
+ context.enqueue(fwd_msg)
287
+
288
+
289
+ @gather_metrics("logout")
290
+ def logout() -> None:
291
+ """Logout the current user.
292
+
293
+ This command removes the user's information from ``st.experimental_user``,
294
+ deletes their identity cookie, and redirects them back to your app's home
295
+ page. This creates a new session.
296
+
297
+ If the user has multiple sessions open in the same browser,
298
+ ``st.experimental_user`` will not be cleared in any other session.
299
+ ``st.experimental_user`` only reads from the identity cookie at the start
300
+ of a session. After a session is running, you must call ``st.login()`` or
301
+ ``st.logout()`` within that session to update ``st.experimental_user``.
302
+
303
+ .. Note::
304
+ This does not log the user out of their underlying account from the
305
+ identity provider.
306
+
307
+ Example
308
+ -------
309
+ ``.streamlit/secrets.toml``:
310
+
311
+ >>> [auth]
312
+ >>> redirect_uri = "http://localhost:8501/oauth2callback"
313
+ >>> cookie_secret = "xxx"
314
+ >>> client_id = "xxx"
315
+ >>> client_secret = "xxx"
316
+ >>> server_metadata_url = "https://accounts.google.com/.well-known/openid-configuration" # fmt: skip
317
+
318
+ Your app code:
319
+
320
+ >>> import streamlit as st
321
+ >>>
322
+ >>> if not st.experimental_user.is_logged_in:
323
+ >>> if st.button("Log in"):
324
+ >>> st.login()
325
+ >>> else:
326
+ >>> if st.button("Log out"):
327
+ >>> st.logout()
328
+ >>> st.write(f"Hello, {st.experimental_user.name}!")
329
+ """
330
+ context = _get_script_run_ctx()
331
+ if context is not None:
332
+ context.user_info.clear()
333
+ session_id = context.session_id
334
+
335
+ if runtime.exists():
336
+ instance = runtime.get_instance()
337
+ instance.clear_user_info_for_session(session_id)
338
+
339
+ base_path = config.get_option("server.baseUrlPath")
340
+
341
+ fwd_msg = ForwardMsg()
342
+ fwd_msg.auth_redirect.url = make_url_path(base_path, AUTH_LOGOUT_ENDPOINT)
343
+ context.enqueue(fwd_msg)
344
+
345
+
346
+ def generate_login_redirect_url(provider: str) -> str:
347
+ """Generate the login redirect URL for the given provider."""
348
+ provider_token = encode_provider_token(provider)
349
+ base_path = config.get_option("server.baseUrlPath")
350
+ login_path = make_url_path(base_path, AUTH_LOGIN_ENDPOINT)
351
+ return f"{login_path}?provider={provider_token}"
352
+
353
+
354
+ def _get_user_info() -> UserInfo:
355
+ ctx = _get_script_run_ctx()
356
+ if ctx is None:
357
+ _LOGGER.warning(
358
+ "No script run context available. st.experimental_user will return an empty dictionary."
359
+ )
360
+ return {}
361
+
362
+ context_user_info = ctx.user_info.copy()
363
+
364
+ auth_section_exists = get_secrets_auth_section()
365
+ if "is_logged_in" not in context_user_info and auth_section_exists:
366
+ context_user_info["is_logged_in"] = False
367
+
368
+ return context_user_info
369
+
370
+
371
+ class UserInfoProxy(Mapping[str, Union[str, bool, None]]):
372
+ """
373
+ A read-only, dict-like object for accessing information about the current\
374
+ user.
375
+
376
+ ``st.experimental_user`` is dependent on the host platform running your
377
+ Streamlit app. If the host platform has not configured the function, it
378
+ will behave as in a locally running app.
379
+
380
+ When authentication is configured in ``secrets.toml``, Streamlit will parse
381
+ the OpenID Connect (OIDC) identity token and copy the attributes to
382
+ ``st.experimental_user``. Check your provider's documentation for their
383
+ available attributes (known as claims).
384
+
385
+ When authentication is not configured, ``st.experimental_user`` has no
386
+ attributes.
387
+
388
+ You can access values via key or attribute notation. For example, use
389
+ ``st.experimental_user["email"]`` or ``st.experimental_user.email`` to
390
+ access the ``email`` attribute.
391
+
392
+ .. Important::
393
+ Identity tokens include an issuance and expiration time. Streamlit does
394
+ not implicitly check these. If you want to automatically expire a
395
+ user's authentication, check these values manually and programmatically
396
+ log out your user (``st.logout()``) when needed.
397
+
398
+ Attributes
399
+ ----------
400
+ is_logged_in: bool
401
+ Whether a user is logged in. For a locally running app, this attribute
402
+ is only available when authentication (``st.login()``) is configured in
403
+ ``secrets.toml``. Otherwise, it does not exist.
404
+
405
+ Examples
406
+ --------
407
+ **Example 1: Google's identity token**
408
+
409
+ If you configure a basic Google OIDC connection as shown in Example 1 of
410
+ ``st.login()``, the following data is available in
411
+ ``st.experimental_user``. Streamlit adds the ``is_logged_in`` attribute.
412
+ Additional attributes may be available depending on the configuration of
413
+ the user's Google account. For more information about Google's identity
414
+ tokens, see `Obtain user information from the ID token
415
+ <https://developers.google.com/identity/openid-connect/openid-connect#obtainuserinfo>`_
416
+ in Google's docs.
417
+
418
+ Your app code:
419
+
420
+ >>> import streamlit as st
421
+ >>>
422
+ >>> if st.experimental_user.is_logged_in:
423
+ >>> st.write(st.experimental_user)
424
+
425
+ Displayed data when a user is logged in:
426
+
427
+ >>> {
428
+ >>> "is_logged_in":true
429
+ >>> "iss":"https://accounts.google.com"
430
+ >>> "azp":"{client_id}.apps.googleusercontent.com"
431
+ >>> "aud":"{client_id}.apps.googleusercontent.com"
432
+ >>> "sub":"{unique_user_id}"
433
+ >>> "email":"{user}@gmail.com"
434
+ >>> "email_verified":true
435
+ >>> "at_hash":"{access_token_hash}"
436
+ >>> "nonce":"{nonce_string}"
437
+ >>> "name":"{full_name}"
438
+ >>> "picture":"https://lh3.googleusercontent.com/a/{content_path}"
439
+ >>> "given_name":"{given_name}"
440
+ >>> "family_name":"{family_name}"
441
+ >>> "iat":{issued_time}
442
+ >>> "exp":{expiration_time}
443
+ >>> }
444
+
445
+ **Example 2: Microsoft's identity token**
446
+
447
+ If you configure a basic Microsoft OIDC connection as shown in Example 2 of
448
+ ``st.login()``, the following data is available in
449
+ ``st.experimental_user``. For more information about Microsoft's identity
450
+ tokens, see `ID token claims reference
451
+ <https://learn.microsoft.com/en-us/entra/identity-platform/id-token-claims-reference>`_
452
+ in Microsoft's docs.
453
+
454
+ Your app code:
455
+
456
+ >>> import streamlit as st
457
+ >>>
458
+ >>> if st.experimental_user.is_logged_in:
459
+ >>> st.write(st.experimental_user)
460
+
461
+ Displayed data when a user is logged in:
462
+
463
+ >>> {
464
+ >>> "is_logged_in":true
465
+ >>> "ver":"2.0"
466
+ >>> "iss":"https://login.microsoftonline.com/{tenant_id}/v2.0"
467
+ >>> "sub":"{application_user_id}"
468
+ >>> "aud":"{application_id}"
469
+ >>> "exp":{expiration_time}
470
+ >>> "iat":{issued_time}
471
+ >>> "nbf":{start_time}
472
+ >>> "name":"{full_name}"
473
+ >>> "preferred_username":"{username}"
474
+ >>> "oid":"{user_GUID}"
475
+ >>> "email":"{email}"
476
+ >>> "tid":"{tenant_id}"
477
+ >>> "nonce":"{nonce_string}"
478
+ >>> "aio":"{opaque_string}"
479
+ >>> }
480
+ """
481
+
482
+ def __getitem__(self, key: str) -> str | bool | None:
483
+ try:
484
+ return _get_user_info()[key]
485
+ except KeyError:
486
+ raise KeyError(f'st.experimental_user has no key "{key}".')
487
+
488
+ def __getattr__(self, key: str) -> str | bool | None:
489
+ try:
490
+ return _get_user_info()[key]
491
+ except KeyError:
492
+ raise AttributeError(f'st.experimental_user has no attribute "{key}".')
493
+
494
+ def __setattr__(self, name: str, value: str | None) -> NoReturn:
495
+ raise StreamlitAPIException("st.experimental_user cannot be modified")
496
+
497
+ def __setitem__(self, name: str, value: str | None) -> NoReturn:
498
+ raise StreamlitAPIException("st.experimental_user cannot be modified")
499
+
500
+ def __iter__(self) -> Iterator[str]:
501
+ return iter(_get_user_info())
502
+
503
+ def __len__(self) -> int:
504
+ return len(_get_user_info())
505
+
506
+ def to_dict(self) -> UserInfo:
507
+ """
508
+ Get user info as a dictionary.
509
+
510
+ This method primarily exists for internal use and is not needed for
511
+ most cases. ``st.experimental_user`` returns an object that inherits from
512
+ ``dict`` by default.
513
+
514
+ Returns
515
+ -------
516
+ Dict[str,str]
517
+ A dictionary of the current user's information.
518
+ """
519
+ return _get_user_info()
streamlit/util.py ADDED
@@ -0,0 +1,72 @@
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
+ """A bunch of useful utilities."""
16
+
17
+ from __future__ import annotations
18
+
19
+ import dataclasses
20
+ import functools
21
+ import hashlib
22
+ from typing import Any, Callable
23
+
24
+
25
+ def memoize(func: Callable[..., Any]) -> Callable[..., Any]:
26
+ """Decorator to memoize the result of a no-args func."""
27
+ result: list[Any] = []
28
+
29
+ @functools.wraps(func)
30
+ def wrapped_func():
31
+ if not result:
32
+ result.append(func())
33
+ return result[0]
34
+
35
+ return wrapped_func
36
+
37
+
38
+ def repr_(self: Any) -> str:
39
+ """A clean repr for a class, excluding both values that are likely defaults,
40
+ and those explicitly default for dataclasses.
41
+ """
42
+ classname = self.__class__.__name__
43
+ # Most of the falsey value, but excluding 0 and 0.0, since those often have
44
+ # semantic meaning within streamlit.
45
+ defaults: list[Any] = [None, "", False, [], set(), {}]
46
+ if dataclasses.is_dataclass(self):
47
+ fields_vals = (
48
+ (f.name, getattr(self, f.name))
49
+ for f in dataclasses.fields(self)
50
+ if f.repr
51
+ and getattr(self, f.name) != f.default
52
+ and getattr(self, f.name) not in defaults
53
+ )
54
+ else:
55
+ fields_vals = ((f, v) for (f, v) in self.__dict__.items() if v not in defaults)
56
+
57
+ field_reprs = ", ".join(f"{field}={value!r}" for field, value in fields_vals)
58
+ return f"{classname}({field_reprs})"
59
+
60
+
61
+ def calc_md5(s: bytes | str) -> str:
62
+ """Return the md5 hash of the given string.
63
+
64
+ This should not be used for security-related purposes.
65
+ """
66
+ # Due to security issue in md5 and sha1, usedforsecurity
67
+ h = hashlib.new("md5", usedforsecurity=False)
68
+
69
+ b = s.encode("utf-8") if isinstance(s, str) else s
70
+
71
+ h.update(b)
72
+ return h.hexdigest()
File without changes
File without changes