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