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.
- streamlit/__init__.py +306 -0
- streamlit/__main__.py +20 -0
- streamlit/auth_util.py +218 -0
- streamlit/cli_util.py +105 -0
- streamlit/column_config.py +56 -0
- streamlit/commands/__init__.py +13 -0
- streamlit/commands/echo.py +126 -0
- streamlit/commands/execution_control.py +238 -0
- streamlit/commands/experimental_query_params.py +169 -0
- streamlit/commands/logo.py +189 -0
- streamlit/commands/navigation.py +385 -0
- streamlit/commands/page_config.py +311 -0
- streamlit/components/__init__.py +13 -0
- streamlit/components/lib/__init__.py +13 -0
- streamlit/components/lib/local_component_registry.py +84 -0
- streamlit/components/types/__init__.py +13 -0
- streamlit/components/types/base_component_registry.py +99 -0
- streamlit/components/types/base_custom_component.py +150 -0
- streamlit/components/v1/__init__.py +31 -0
- streamlit/components/v1/component_arrow.py +141 -0
- streamlit/components/v1/component_registry.py +130 -0
- streamlit/components/v1/components.py +38 -0
- streamlit/components/v1/custom_component.py +243 -0
- streamlit/config.py +1513 -0
- streamlit/config_option.py +311 -0
- streamlit/config_util.py +177 -0
- streamlit/connections/__init__.py +28 -0
- streamlit/connections/base_connection.py +174 -0
- streamlit/connections/snowflake_connection.py +562 -0
- streamlit/connections/snowpark_connection.py +213 -0
- streamlit/connections/sql_connection.py +425 -0
- streamlit/connections/util.py +97 -0
- streamlit/cursor.py +210 -0
- streamlit/dataframe_util.py +1416 -0
- streamlit/delta_generator.py +602 -0
- streamlit/delta_generator_singletons.py +204 -0
- streamlit/deprecation_util.py +209 -0
- streamlit/development.py +21 -0
- streamlit/elements/__init__.py +13 -0
- streamlit/elements/alert.py +234 -0
- streamlit/elements/arrow.py +962 -0
- streamlit/elements/balloons.py +47 -0
- streamlit/elements/bokeh_chart.py +133 -0
- streamlit/elements/code.py +114 -0
- streamlit/elements/deck_gl_json_chart.py +546 -0
- streamlit/elements/dialog_decorator.py +267 -0
- streamlit/elements/doc_string.py +558 -0
- streamlit/elements/empty.py +130 -0
- streamlit/elements/exception.py +331 -0
- streamlit/elements/form.py +354 -0
- streamlit/elements/graphviz_chart.py +150 -0
- streamlit/elements/heading.py +302 -0
- streamlit/elements/html.py +105 -0
- streamlit/elements/iframe.py +191 -0
- streamlit/elements/image.py +196 -0
- streamlit/elements/json.py +139 -0
- streamlit/elements/layouts.py +879 -0
- streamlit/elements/lib/__init__.py +13 -0
- streamlit/elements/lib/built_in_chart_utils.py +1157 -0
- streamlit/elements/lib/color_util.py +263 -0
- streamlit/elements/lib/column_config_utils.py +542 -0
- streamlit/elements/lib/column_types.py +2188 -0
- streamlit/elements/lib/dialog.py +147 -0
- streamlit/elements/lib/dicttools.py +154 -0
- streamlit/elements/lib/event_utils.py +37 -0
- streamlit/elements/lib/file_uploader_utils.py +66 -0
- streamlit/elements/lib/form_utils.py +77 -0
- streamlit/elements/lib/image_utils.py +441 -0
- streamlit/elements/lib/js_number.py +105 -0
- streamlit/elements/lib/mutable_status_container.py +183 -0
- streamlit/elements/lib/options_selector_utils.py +250 -0
- streamlit/elements/lib/pandas_styler_utils.py +274 -0
- streamlit/elements/lib/policies.py +194 -0
- streamlit/elements/lib/streamlit_plotly_theme.py +207 -0
- streamlit/elements/lib/subtitle_utils.py +176 -0
- streamlit/elements/lib/utils.py +250 -0
- streamlit/elements/map.py +508 -0
- streamlit/elements/markdown.py +277 -0
- streamlit/elements/media.py +793 -0
- streamlit/elements/metric.py +301 -0
- streamlit/elements/plotly_chart.py +546 -0
- streamlit/elements/progress.py +156 -0
- streamlit/elements/pyplot.py +194 -0
- streamlit/elements/snow.py +47 -0
- streamlit/elements/spinner.py +113 -0
- streamlit/elements/text.py +76 -0
- streamlit/elements/toast.py +98 -0
- streamlit/elements/vega_charts.py +1984 -0
- streamlit/elements/widgets/__init__.py +13 -0
- streamlit/elements/widgets/audio_input.py +310 -0
- streamlit/elements/widgets/button.py +1123 -0
- streamlit/elements/widgets/button_group.py +1008 -0
- streamlit/elements/widgets/camera_input.py +263 -0
- streamlit/elements/widgets/chat.py +647 -0
- streamlit/elements/widgets/checkbox.py +352 -0
- streamlit/elements/widgets/color_picker.py +265 -0
- streamlit/elements/widgets/data_editor.py +983 -0
- streamlit/elements/widgets/file_uploader.py +486 -0
- streamlit/elements/widgets/multiselect.py +338 -0
- streamlit/elements/widgets/number_input.py +545 -0
- streamlit/elements/widgets/radio.py +407 -0
- streamlit/elements/widgets/select_slider.py +437 -0
- streamlit/elements/widgets/selectbox.py +366 -0
- streamlit/elements/widgets/slider.py +880 -0
- streamlit/elements/widgets/text_widgets.py +628 -0
- streamlit/elements/widgets/time_widgets.py +970 -0
- streamlit/elements/write.py +574 -0
- streamlit/emojis.py +34 -0
- streamlit/env_util.py +61 -0
- streamlit/error_util.py +105 -0
- streamlit/errors.py +452 -0
- streamlit/external/__init__.py +13 -0
- streamlit/external/langchain/__init__.py +23 -0
- streamlit/external/langchain/streamlit_callback_handler.py +406 -0
- streamlit/file_util.py +247 -0
- streamlit/git_util.py +173 -0
- streamlit/hello/__init__.py +13 -0
- streamlit/hello/animation_demo.py +82 -0
- streamlit/hello/dataframe_demo.py +71 -0
- streamlit/hello/hello.py +37 -0
- streamlit/hello/mapping_demo.py +114 -0
- streamlit/hello/plotting_demo.py +55 -0
- streamlit/hello/streamlit_app.py +55 -0
- streamlit/hello/utils.py +28 -0
- streamlit/logger.py +130 -0
- streamlit/material_icon_names.py +25 -0
- streamlit/navigation/__init__.py +13 -0
- streamlit/navigation/page.py +302 -0
- streamlit/net_util.py +125 -0
- streamlit/platform.py +33 -0
- streamlit/proto/Alert_pb2.py +29 -0
- streamlit/proto/Alert_pb2.pyi +90 -0
- streamlit/proto/AppPage_pb2.py +27 -0
- streamlit/proto/AppPage_pb2.pyi +64 -0
- streamlit/proto/ArrowNamedDataSet_pb2.py +28 -0
- streamlit/proto/ArrowNamedDataSet_pb2.pyi +57 -0
- streamlit/proto/ArrowVegaLiteChart_pb2.py +29 -0
- streamlit/proto/ArrowVegaLiteChart_pb2.pyi +84 -0
- streamlit/proto/Arrow_pb2.py +33 -0
- streamlit/proto/Arrow_pb2.pyi +188 -0
- streamlit/proto/AudioInput_pb2.py +28 -0
- streamlit/proto/AudioInput_pb2.pyi +58 -0
- streamlit/proto/Audio_pb2.py +27 -0
- streamlit/proto/Audio_pb2.pyi +58 -0
- streamlit/proto/AuthRedirect_pb2.py +27 -0
- streamlit/proto/AuthRedirect_pb2.pyi +41 -0
- streamlit/proto/AutoRerun_pb2.py +27 -0
- streamlit/proto/AutoRerun_pb2.pyi +45 -0
- streamlit/proto/BackMsg_pb2.py +29 -0
- streamlit/proto/BackMsg_pb2.pyi +105 -0
- streamlit/proto/Balloons_pb2.py +27 -0
- streamlit/proto/Balloons_pb2.pyi +43 -0
- streamlit/proto/Block_pb2.py +53 -0
- streamlit/proto/Block_pb2.pyi +322 -0
- streamlit/proto/BokehChart_pb2.py +27 -0
- streamlit/proto/BokehChart_pb2.pyi +49 -0
- streamlit/proto/ButtonGroup_pb2.py +36 -0
- streamlit/proto/ButtonGroup_pb2.pyi +169 -0
- streamlit/proto/Button_pb2.py +27 -0
- streamlit/proto/Button_pb2.pyi +71 -0
- streamlit/proto/CameraInput_pb2.py +28 -0
- streamlit/proto/CameraInput_pb2.pyi +58 -0
- streamlit/proto/ChatInput_pb2.py +31 -0
- streamlit/proto/ChatInput_pb2.pyi +111 -0
- streamlit/proto/Checkbox_pb2.py +30 -0
- streamlit/proto/Checkbox_pb2.pyi +90 -0
- streamlit/proto/ClientState_pb2.py +30 -0
- streamlit/proto/ClientState_pb2.pyi +90 -0
- streamlit/proto/Code_pb2.py +27 -0
- streamlit/proto/Code_pb2.pyi +55 -0
- streamlit/proto/ColorPicker_pb2.py +28 -0
- streamlit/proto/ColorPicker_pb2.pyi +67 -0
- streamlit/proto/Common_pb2.py +51 -0
- streamlit/proto/Common_pb2.pyi +293 -0
- streamlit/proto/Components_pb2.py +35 -0
- streamlit/proto/Components_pb2.pyi +172 -0
- streamlit/proto/DataFrame_pb2.py +56 -0
- streamlit/proto/DataFrame_pb2.pyi +397 -0
- streamlit/proto/DateInput_pb2.py +28 -0
- streamlit/proto/DateInput_pb2.pyi +83 -0
- streamlit/proto/DeckGlJsonChart_pb2.py +29 -0
- streamlit/proto/DeckGlJsonChart_pb2.pyi +102 -0
- streamlit/proto/Delta_pb2.py +31 -0
- streamlit/proto/Delta_pb2.pyi +74 -0
- streamlit/proto/DocString_pb2.py +29 -0
- streamlit/proto/DocString_pb2.pyi +93 -0
- streamlit/proto/DownloadButton_pb2.py +27 -0
- streamlit/proto/DownloadButton_pb2.pyi +70 -0
- streamlit/proto/Element_pb2.py +78 -0
- streamlit/proto/Element_pb2.pyi +312 -0
- streamlit/proto/Empty_pb2.py +27 -0
- streamlit/proto/Empty_pb2.pyi +36 -0
- streamlit/proto/Exception_pb2.py +27 -0
- streamlit/proto/Exception_pb2.pyi +72 -0
- streamlit/proto/Favicon_pb2.py +27 -0
- streamlit/proto/Favicon_pb2.pyi +40 -0
- streamlit/proto/FileUploader_pb2.py +28 -0
- streamlit/proto/FileUploader_pb2.pyi +78 -0
- streamlit/proto/ForwardMsg_pb2.py +53 -0
- streamlit/proto/ForwardMsg_pb2.pyi +293 -0
- streamlit/proto/GitInfo_pb2.py +29 -0
- streamlit/proto/GitInfo_pb2.pyi +83 -0
- streamlit/proto/GraphVizChart_pb2.py +27 -0
- streamlit/proto/GraphVizChart_pb2.pyi +53 -0
- streamlit/proto/Heading_pb2.py +27 -0
- streamlit/proto/Heading_pb2.pyi +56 -0
- streamlit/proto/Html_pb2.py +27 -0
- streamlit/proto/Html_pb2.pyi +42 -0
- streamlit/proto/IFrame_pb2.py +27 -0
- streamlit/proto/IFrame_pb2.pyi +59 -0
- streamlit/proto/Image_pb2.py +29 -0
- streamlit/proto/Image_pb2.pyi +84 -0
- streamlit/proto/Json_pb2.py +27 -0
- streamlit/proto/Json_pb2.pyi +53 -0
- streamlit/proto/LabelVisibilityMessage_pb2.py +29 -0
- streamlit/proto/LabelVisibilityMessage_pb2.pyi +68 -0
- streamlit/proto/LinkButton_pb2.py +27 -0
- streamlit/proto/LinkButton_pb2.pyi +58 -0
- streamlit/proto/Logo_pb2.py +27 -0
- streamlit/proto/Logo_pb2.pyi +51 -0
- streamlit/proto/Markdown_pb2.py +29 -0
- streamlit/proto/Markdown_pb2.pyi +86 -0
- streamlit/proto/Metric_pb2.py +32 -0
- streamlit/proto/Metric_pb2.pyi +101 -0
- streamlit/proto/MetricsEvent_pb2.py +30 -0
- streamlit/proto/MetricsEvent_pb2.pyi +200 -0
- streamlit/proto/MultiSelect_pb2.py +28 -0
- streamlit/proto/MultiSelect_pb2.pyi +81 -0
- streamlit/proto/NamedDataSet_pb2.py +28 -0
- streamlit/proto/NamedDataSet_pb2.pyi +59 -0
- streamlit/proto/Navigation_pb2.py +30 -0
- streamlit/proto/Navigation_pb2.pyi +84 -0
- streamlit/proto/NewSession_pb2.py +51 -0
- streamlit/proto/NewSession_pb2.pyi +481 -0
- streamlit/proto/NumberInput_pb2.py +30 -0
- streamlit/proto/NumberInput_pb2.pyi +121 -0
- streamlit/proto/PageConfig_pb2.py +33 -0
- streamlit/proto/PageConfig_pb2.pyi +126 -0
- streamlit/proto/PageInfo_pb2.py +27 -0
- streamlit/proto/PageInfo_pb2.pyi +43 -0
- streamlit/proto/PageLink_pb2.py +27 -0
- streamlit/proto/PageLink_pb2.pyi +63 -0
- streamlit/proto/PageNotFound_pb2.py +27 -0
- streamlit/proto/PageNotFound_pb2.pyi +42 -0
- streamlit/proto/PageProfile_pb2.py +31 -0
- streamlit/proto/PageProfile_pb2.pyi +127 -0
- streamlit/proto/PagesChanged_pb2.py +28 -0
- streamlit/proto/PagesChanged_pb2.pyi +48 -0
- streamlit/proto/ParentMessage_pb2.py +27 -0
- streamlit/proto/ParentMessage_pb2.pyi +46 -0
- streamlit/proto/PlotlyChart_pb2.py +31 -0
- streamlit/proto/PlotlyChart_pb2.pyi +131 -0
- streamlit/proto/Progress_pb2.py +27 -0
- streamlit/proto/Progress_pb2.pyi +43 -0
- streamlit/proto/Radio_pb2.py +28 -0
- streamlit/proto/Radio_pb2.pyi +84 -0
- streamlit/proto/RootContainer_pb2.py +27 -0
- streamlit/proto/RootContainer_pb2.pyi +56 -0
- streamlit/proto/Selectbox_pb2.py +28 -0
- streamlit/proto/Selectbox_pb2.pyi +80 -0
- streamlit/proto/SessionEvent_pb2.py +28 -0
- streamlit/proto/SessionEvent_pb2.pyi +62 -0
- streamlit/proto/SessionStatus_pb2.py +27 -0
- streamlit/proto/SessionStatus_pb2.pyi +57 -0
- streamlit/proto/Skeleton_pb2.py +29 -0
- streamlit/proto/Skeleton_pb2.pyi +71 -0
- streamlit/proto/Slider_pb2.py +32 -0
- streamlit/proto/Slider_pb2.pyi +142 -0
- streamlit/proto/Snow_pb2.py +27 -0
- streamlit/proto/Snow_pb2.pyi +43 -0
- streamlit/proto/Spinner_pb2.py +27 -0
- streamlit/proto/Spinner_pb2.pyi +49 -0
- streamlit/proto/TextArea_pb2.py +28 -0
- streamlit/proto/TextArea_pb2.pyi +80 -0
- streamlit/proto/TextInput_pb2.py +30 -0
- streamlit/proto/TextInput_pb2.pyi +107 -0
- streamlit/proto/Text_pb2.py +27 -0
- streamlit/proto/Text_pb2.pyi +46 -0
- streamlit/proto/TimeInput_pb2.py +28 -0
- streamlit/proto/TimeInput_pb2.pyi +74 -0
- streamlit/proto/Toast_pb2.py +27 -0
- streamlit/proto/Toast_pb2.pyi +45 -0
- streamlit/proto/VegaLiteChart_pb2.py +29 -0
- streamlit/proto/VegaLiteChart_pb2.pyi +71 -0
- streamlit/proto/Video_pb2.py +31 -0
- streamlit/proto/Video_pb2.pyi +117 -0
- streamlit/proto/WidgetStates_pb2.py +31 -0
- streamlit/proto/WidgetStates_pb2.pyi +126 -0
- streamlit/proto/__init__.py +15 -0
- streamlit/proto/openmetrics_data_model_pb2.py +60 -0
- streamlit/proto/openmetrics_data_model_pb2.pyi +522 -0
- streamlit/py.typed +0 -0
- streamlit/runtime/__init__.py +50 -0
- streamlit/runtime/app_session.py +982 -0
- streamlit/runtime/caching/__init__.py +98 -0
- streamlit/runtime/caching/cache_data_api.py +665 -0
- streamlit/runtime/caching/cache_errors.py +142 -0
- streamlit/runtime/caching/cache_resource_api.py +527 -0
- streamlit/runtime/caching/cache_type.py +33 -0
- streamlit/runtime/caching/cache_utils.py +523 -0
- streamlit/runtime/caching/cached_message_replay.py +290 -0
- streamlit/runtime/caching/hashing.py +637 -0
- streamlit/runtime/caching/legacy_cache_api.py +169 -0
- streamlit/runtime/caching/storage/__init__.py +29 -0
- streamlit/runtime/caching/storage/cache_storage_protocol.py +239 -0
- streamlit/runtime/caching/storage/dummy_cache_storage.py +60 -0
- streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +145 -0
- streamlit/runtime/caching/storage/local_disk_cache_storage.py +223 -0
- streamlit/runtime/connection_factory.py +436 -0
- streamlit/runtime/context.py +280 -0
- streamlit/runtime/credentials.py +364 -0
- streamlit/runtime/forward_msg_cache.py +296 -0
- streamlit/runtime/forward_msg_queue.py +240 -0
- streamlit/runtime/fragment.py +477 -0
- streamlit/runtime/media_file_manager.py +234 -0
- streamlit/runtime/media_file_storage.py +143 -0
- streamlit/runtime/memory_media_file_storage.py +181 -0
- streamlit/runtime/memory_session_storage.py +77 -0
- streamlit/runtime/memory_uploaded_file_manager.py +138 -0
- streamlit/runtime/metrics_util.py +486 -0
- streamlit/runtime/pages_manager.py +165 -0
- streamlit/runtime/runtime.py +792 -0
- streamlit/runtime/runtime_util.py +106 -0
- streamlit/runtime/script_data.py +46 -0
- streamlit/runtime/scriptrunner/__init__.py +38 -0
- streamlit/runtime/scriptrunner/exec_code.py +159 -0
- streamlit/runtime/scriptrunner/magic.py +273 -0
- streamlit/runtime/scriptrunner/magic_funcs.py +32 -0
- streamlit/runtime/scriptrunner/script_cache.py +89 -0
- streamlit/runtime/scriptrunner/script_runner.py +756 -0
- streamlit/runtime/scriptrunner_utils/__init__.py +19 -0
- streamlit/runtime/scriptrunner_utils/exceptions.py +48 -0
- streamlit/runtime/scriptrunner_utils/script_requests.py +307 -0
- streamlit/runtime/scriptrunner_utils/script_run_context.py +287 -0
- streamlit/runtime/secrets.py +534 -0
- streamlit/runtime/session_manager.py +394 -0
- streamlit/runtime/state/__init__.py +41 -0
- streamlit/runtime/state/common.py +191 -0
- streamlit/runtime/state/query_params.py +205 -0
- streamlit/runtime/state/query_params_proxy.py +218 -0
- streamlit/runtime/state/safe_session_state.py +138 -0
- streamlit/runtime/state/session_state.py +772 -0
- streamlit/runtime/state/session_state_proxy.py +153 -0
- streamlit/runtime/state/widgets.py +135 -0
- streamlit/runtime/stats.py +109 -0
- streamlit/runtime/uploaded_file_manager.py +148 -0
- streamlit/runtime/websocket_session_manager.py +167 -0
- streamlit/source_util.py +98 -0
- streamlit/static/favicon.png +0 -0
- streamlit/static/index.html +61 -0
- streamlit/static/static/css/index.Bmkmz40k.css +1 -0
- streamlit/static/static/css/index.DpJG_94W.css +1 -0
- streamlit/static/static/css/index.DzuxGC_t.css +1 -0
- streamlit/static/static/js/FileDownload.esm.Bp9m5jrx.js +1 -0
- streamlit/static/static/js/FileHelper.D_3pbilj.js +5 -0
- streamlit/static/static/js/FormClearHelper.Ct2rwLXo.js +1 -0
- streamlit/static/static/js/Hooks.BKdzj5MJ.js +1 -0
- streamlit/static/static/js/InputInstructions.DB3QGNJP.js +1 -0
- streamlit/static/static/js/ProgressBar.D40A5xc2.js +2 -0
- streamlit/static/static/js/RenderInPortalIfExists.DLUCooTN.js +1 -0
- streamlit/static/static/js/Toolbar.BiGGIQun.js +1 -0
- streamlit/static/static/js/UploadFileInfo.C-jY39rj.js +1 -0
- streamlit/static/static/js/base-input.CQBQT24M.js +4 -0
- streamlit/static/static/js/checkbox.Buj8gd_M.js +9 -0
- streamlit/static/static/js/createDownloadLinkElement.DZMwyjvU.js +1 -0
- streamlit/static/static/js/createSuper.CesK3I23.js +1 -0
- streamlit/static/static/js/data-grid-overlay-editor.B69OOFM4.js +1 -0
- streamlit/static/static/js/downloader.BZQhlBNT.js +1 -0
- streamlit/static/static/js/es6.D9Zhqujy.js +2 -0
- streamlit/static/static/js/iframeResizer.contentWindow.CAzcBpCC.js +1 -0
- streamlit/static/static/js/index.08vcOOvb.js +1 -0
- streamlit/static/static/js/index.0uqKfJUS.js +1 -0
- streamlit/static/static/js/index.B02M5u69.js +203 -0
- streamlit/static/static/js/index.B7mcZKMx.js +1 -0
- streamlit/static/static/js/index.BAQDHFA_.js +1 -0
- streamlit/static/static/js/index.BI60cMVr.js +2 -0
- streamlit/static/static/js/index.BLug2inK.js +1 -0
- streamlit/static/static/js/index.BM6TMY8g.js +2 -0
- streamlit/static/static/js/index.BZ9p1t7G.js +1 -0
- streamlit/static/static/js/index.BZqa87a1.js +2 -0
- streamlit/static/static/js/index.BcsRUzZZ.js +1 -0
- streamlit/static/static/js/index.BgVMiY_P.js +197 -0
- streamlit/static/static/js/index.BtuGy7By.js +6 -0
- streamlit/static/static/js/index.BuDuBmrs.js +1 -0
- streamlit/static/static/js/index.BvXU2oKV.js +1 -0
- streamlit/static/static/js/index.BxcwPacT.js +73 -0
- streamlit/static/static/js/index.CWX8KB81.js +1 -0
- streamlit/static/static/js/index.CXzZTo_q.js +1 -0
- streamlit/static/static/js/index.CcRWp_KL.js +1 -0
- streamlit/static/static/js/index.Cd-_xe55.js +3 -0
- streamlit/static/static/js/index.CdG2PXln.js +4537 -0
- streamlit/static/static/js/index.CjXvXmcP.js +1 -0
- streamlit/static/static/js/index.D1HZENZx.js +776 -0
- streamlit/static/static/js/index.D21Efo64.js +1617 -0
- streamlit/static/static/js/index.D9WgGVBx.js +7 -0
- streamlit/static/static/js/index.DEcsHtvb.js +12 -0
- streamlit/static/static/js/index.DFeMfr_K.js +1 -0
- streamlit/static/static/js/index.DHFBoItz.js +1 -0
- streamlit/static/static/js/index.D_PrBKnJ.js +3 -0
- streamlit/static/static/js/index.DmuRkekN.js +3855 -0
- streamlit/static/static/js/index.Do6eY8sf.js +1 -0
- streamlit/static/static/js/index.Dz3lP2P-.js +1 -0
- streamlit/static/static/js/index.Dz_UqF-s.js +1 -0
- streamlit/static/static/js/index.GkSUsPhJ.js +1 -0
- streamlit/static/static/js/index.H1U1IC_d.js +3 -0
- streamlit/static/static/js/index.g6p_4DPr.js +1 -0
- streamlit/static/static/js/index.g9x_GKss.js +1 -0
- streamlit/static/static/js/index.zo9jm08y.js +1 -0
- streamlit/static/static/js/input.DnaFglHq.js +2 -0
- streamlit/static/static/js/inputUtils.CQWz5UKz.js +1 -0
- streamlit/static/static/js/memory.Crb9x4-F.js +1 -0
- streamlit/static/static/js/mergeWith.ouAz0sK3.js +1 -0
- streamlit/static/static/js/number-overlay-editor._UaN-O48.js +9 -0
- streamlit/static/static/js/possibleConstructorReturn.CtGjGFHz.js +1 -0
- streamlit/static/static/js/sandbox.CBybYOhV.js +1 -0
- streamlit/static/static/js/sprintf.D7DtBTRn.js +1 -0
- streamlit/static/static/js/textarea.Cb_uJt5U.js +2 -0
- streamlit/static/static/js/threshold.DjX0wlsa.js +1 -0
- streamlit/static/static/js/timepicker.DKT7pfoF.js +4 -0
- streamlit/static/static/js/timer.CAwTRJ_g.js +1 -0
- streamlit/static/static/js/toConsumableArray.05Ikp13-.js +3 -0
- streamlit/static/static/js/uniqueId.D2FMWUEI.js +1 -0
- streamlit/static/static/js/useBasicWidgetState.urnZLANY.js +1 -0
- streamlit/static/static/js/useOnInputChange.BOKIIdJ1.js +1 -0
- streamlit/static/static/js/value.CgPGBV_l.js +1 -0
- streamlit/static/static/js/withFullScreenWrapper.C_N8J0Xx.js +1 -0
- streamlit/static/static/media/KaTeX_AMS-Regular.BQhdFMY1.woff2 +0 -0
- streamlit/static/static/media/KaTeX_AMS-Regular.DMm9YOAa.woff +0 -0
- streamlit/static/static/media/KaTeX_AMS-Regular.DRggAlZN.ttf +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Bold.ATXxdsX0.ttf +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Bold.BEiXGLvX.woff +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Bold.Dq_IR9rO.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Regular.CTRA-rTL.woff +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Regular.Di6jR-x-.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Regular.wX97UBjC.ttf +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Bold.BdnERNNW.ttf +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Bold.BsDP51OF.woff +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Bold.CL6g_b3V.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Regular.CB_wures.ttf +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Regular.CTYiF6lA.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Regular.Dxdc4cR9.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Bold.Cx986IdX.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-Bold.Jm3AIy58.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Bold.waoOVXN0.ttf +0 -0
- streamlit/static/static/media/KaTeX_Main-BoldItalic.DxDJ3AOS.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-BoldItalic.DzxPMmG6.ttf +0 -0
- streamlit/static/static/media/KaTeX_Main-BoldItalic.SpSLRI95.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Italic.3WenGoN9.ttf +0 -0
- streamlit/static/static/media/KaTeX_Main-Italic.BMLOBm91.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Italic.NWA7e6Wa.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-Regular.B22Nviop.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-Regular.Dr94JaBh.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Regular.ypZvNtVU.ttf +0 -0
- streamlit/static/static/media/KaTeX_Math-BoldItalic.B3XSjfu4.ttf +0 -0
- streamlit/static/static/media/KaTeX_Math-BoldItalic.CZnvNsCZ.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Math-BoldItalic.iY-2wyZ7.woff +0 -0
- streamlit/static/static/media/KaTeX_Math-Italic.DA0__PXp.woff +0 -0
- streamlit/static/static/media/KaTeX_Math-Italic.flOr_0UB.ttf +0 -0
- streamlit/static/static/media/KaTeX_Math-Italic.t53AETM-.woff2 +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Bold.CFMepnvq.ttf +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Bold.D1sUS0GD.woff2 +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Bold.DbIhKOiC.woff +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Italic.C3H0VqGB.woff2 +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Italic.DN2j7dab.woff +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Italic.YYjJ1zSn.ttf +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Regular.BNo7hRIc.ttf +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Regular.CS6fqUqJ.woff +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Regular.DDBCnlJ7.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Script-Regular.C5JkGWo-.ttf +0 -0
- streamlit/static/static/media/KaTeX_Script-Regular.D3wIWfF6.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Script-Regular.D5yQViql.woff +0 -0
- streamlit/static/static/media/KaTeX_Size1-Regular.C195tn64.woff +0 -0
- streamlit/static/static/media/KaTeX_Size1-Regular.Dbsnue_I.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size1-Regular.mCD8mA8B.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Size2-Regular.B7gKUWhC.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size2-Regular.Dy4dx90m.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Size2-Regular.oD1tc_U0.woff +0 -0
- streamlit/static/static/media/KaTeX_Size3-Regular.CTq5MqoE.woff +0 -0
- streamlit/static/static/media/KaTeX_Size3-Regular.DgpXs0kz.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size4-Regular.BF-4gkZK.woff +0 -0
- streamlit/static/static/media/KaTeX_Size4-Regular.DWFBv043.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size4-Regular.Dl5lxZxV.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Typewriter-Regular.C0xS9mPB.woff +0 -0
- streamlit/static/static/media/KaTeX_Typewriter-Regular.CO6r4hn1.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Typewriter-Regular.D3Ib7_Hf.ttf +0 -0
- streamlit/static/static/media/MaterialSymbols-Rounded.DcZbplWk.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Bold.CFEfr7-q.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-BoldItalic.C-LkFXxa.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Italic.CxFOx7N-.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Regular.CBOlD63d.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-SemiBold.CFHwW3Wd.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-SemiBoldItalic.Cg2yRu82.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Bold.-6c9oR8J.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-BoldItalic.DmM_grLY.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Italic.I1ipWe7Q.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Regular.DZLUzqI4.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-SemiBold.sKQIyTMz.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-SemiBoldItalic.C0wP0icr.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Bold.8TUnKj4x.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-BoldItalic.CBVO7Ve7.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Italic.DkFgL2HZ.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Regular.CNJNET2S.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-SemiBold.CHyh9GC5.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-SemiBoldItalic.CBtz8sWN.woff2 +0 -0
- streamlit/static/static/media/balloon-0.Czj7AKwE.png +0 -0
- streamlit/static/static/media/balloon-1.CNvFFrND.png +0 -0
- streamlit/static/static/media/balloon-2.DTvC6B1t.png +0 -0
- streamlit/static/static/media/balloon-3.CgSk4tbL.png +0 -0
- streamlit/static/static/media/balloon-4.mbtFrzxf.png +0 -0
- streamlit/static/static/media/balloon-5.CSwkUfRA.png +0 -0
- streamlit/static/static/media/fireworks.B4d-_KUe.gif +0 -0
- streamlit/static/static/media/flake-0.DgWaVvm5.png +0 -0
- streamlit/static/static/media/flake-1.B2r5AHMK.png +0 -0
- streamlit/static/static/media/flake-2.BnWSExPC.png +0 -0
- streamlit/static/static/media/snowflake.JU2jBHL8.svg +11 -0
- streamlit/string_util.py +203 -0
- streamlit/temporary_directory.py +56 -0
- streamlit/testing/__init__.py +13 -0
- streamlit/testing/v1/__init__.py +17 -0
- streamlit/testing/v1/app_test.py +1050 -0
- streamlit/testing/v1/element_tree.py +2083 -0
- streamlit/testing/v1/local_script_runner.py +180 -0
- streamlit/testing/v1/util.py +53 -0
- streamlit/time_util.py +75 -0
- streamlit/type_util.py +460 -0
- streamlit/url_util.py +122 -0
- streamlit/user_info.py +519 -0
- streamlit/util.py +72 -0
- streamlit/vendor/__init__.py +0 -0
- streamlit/vendor/pympler/__init__.py +0 -0
- streamlit/vendor/pympler/asizeof.py +2869 -0
- streamlit/version.py +18 -0
- streamlit/watcher/__init__.py +28 -0
- streamlit/watcher/event_based_path_watcher.py +406 -0
- streamlit/watcher/folder_black_list.py +82 -0
- streamlit/watcher/local_sources_watcher.py +233 -0
- streamlit/watcher/path_watcher.py +185 -0
- streamlit/watcher/polling_path_watcher.py +124 -0
- streamlit/watcher/util.py +207 -0
- streamlit/web/__init__.py +13 -0
- streamlit/web/bootstrap.py +353 -0
- streamlit/web/cache_storage_manager_config.py +38 -0
- streamlit/web/cli.py +369 -0
- streamlit/web/server/__init__.py +26 -0
- streamlit/web/server/app_static_file_handler.py +93 -0
- streamlit/web/server/authlib_tornado_integration.py +60 -0
- streamlit/web/server/browser_websocket_handler.py +246 -0
- streamlit/web/server/component_request_handler.py +116 -0
- streamlit/web/server/media_file_handler.py +141 -0
- streamlit/web/server/oauth_authlib_routes.py +176 -0
- streamlit/web/server/oidc_mixin.py +108 -0
- streamlit/web/server/routes.py +295 -0
- streamlit/web/server/server.py +479 -0
- streamlit/web/server/server_util.py +161 -0
- streamlit/web/server/stats_request_handler.py +95 -0
- streamlit/web/server/upload_file_request_handler.py +137 -0
- streamlit/web/server/websocket_headers.py +56 -0
- streamlit_nightly-1.43.2.dev20250307.data/scripts/streamlit.cmd +16 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/METADATA +207 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/RECORD +563 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/WHEEL +5 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/entry_points.txt +2 -0
- 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
|
+
)
|