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,205 @@
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from collections.abc import Iterable, Iterator, MutableMapping
|
18
|
+
from dataclasses import dataclass, field
|
19
|
+
from typing import TYPE_CHECKING, Final
|
20
|
+
from urllib import parse
|
21
|
+
|
22
|
+
from streamlit.errors import StreamlitAPIException
|
23
|
+
from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
|
24
|
+
from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
|
25
|
+
|
26
|
+
if TYPE_CHECKING:
|
27
|
+
from _typeshed import SupportsKeysAndGetItem
|
28
|
+
|
29
|
+
|
30
|
+
EMBED_QUERY_PARAM: Final[str] = "embed"
|
31
|
+
EMBED_OPTIONS_QUERY_PARAM: Final[str] = "embed_options"
|
32
|
+
EMBED_QUERY_PARAMS_KEYS: Final[list[str]] = [
|
33
|
+
EMBED_QUERY_PARAM,
|
34
|
+
EMBED_OPTIONS_QUERY_PARAM,
|
35
|
+
]
|
36
|
+
|
37
|
+
|
38
|
+
@dataclass
|
39
|
+
class QueryParams(MutableMapping[str, str]):
|
40
|
+
"""A lightweight wrapper of a dict that sends forwardMsgs when state changes.
|
41
|
+
It stores str keys with str and List[str] values.
|
42
|
+
"""
|
43
|
+
|
44
|
+
_query_params: dict[str, list[str] | str] = field(default_factory=dict)
|
45
|
+
|
46
|
+
def __iter__(self) -> Iterator[str]:
|
47
|
+
self._ensure_single_query_api_used()
|
48
|
+
|
49
|
+
return iter(
|
50
|
+
key
|
51
|
+
for key in self._query_params.keys()
|
52
|
+
if key not in EMBED_QUERY_PARAMS_KEYS
|
53
|
+
)
|
54
|
+
|
55
|
+
def __getitem__(self, key: str) -> str:
|
56
|
+
"""Retrieves a value for a given key in query parameters.
|
57
|
+
Returns the last item in a list or an empty string if empty.
|
58
|
+
If the key is not present, raise KeyError.
|
59
|
+
"""
|
60
|
+
self._ensure_single_query_api_used()
|
61
|
+
try:
|
62
|
+
if key in EMBED_QUERY_PARAMS_KEYS:
|
63
|
+
raise KeyError(missing_key_error_message(key))
|
64
|
+
value = self._query_params[key]
|
65
|
+
if isinstance(value, list):
|
66
|
+
if len(value) == 0:
|
67
|
+
return ""
|
68
|
+
else:
|
69
|
+
# Return the last value to mimic Tornado's behavior
|
70
|
+
# https://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.get_query_argument
|
71
|
+
return value[-1]
|
72
|
+
return value
|
73
|
+
except KeyError:
|
74
|
+
raise KeyError(missing_key_error_message(key))
|
75
|
+
|
76
|
+
def __setitem__(self, key: str, value: str | Iterable[str]) -> None:
|
77
|
+
self._ensure_single_query_api_used()
|
78
|
+
self.__set_item_internal(key, value)
|
79
|
+
self._send_query_param_msg()
|
80
|
+
|
81
|
+
def __set_item_internal(self, key: str, value: str | Iterable[str]) -> None:
|
82
|
+
if isinstance(value, dict):
|
83
|
+
raise StreamlitAPIException(
|
84
|
+
f"You cannot set a query params key `{key}` to a dictionary."
|
85
|
+
)
|
86
|
+
|
87
|
+
if key in EMBED_QUERY_PARAMS_KEYS:
|
88
|
+
raise StreamlitAPIException(
|
89
|
+
"Query param embed and embed_options (case-insensitive) cannot be set programmatically."
|
90
|
+
)
|
91
|
+
# Type checking users should handle the string serialization themselves
|
92
|
+
# We will accept any type for the list and serialize to str just in case
|
93
|
+
if isinstance(value, Iterable) and not isinstance(value, str):
|
94
|
+
self._query_params[key] = [str(item) for item in value]
|
95
|
+
else:
|
96
|
+
self._query_params[key] = str(value)
|
97
|
+
|
98
|
+
def __delitem__(self, key: str) -> None:
|
99
|
+
self._ensure_single_query_api_used()
|
100
|
+
try:
|
101
|
+
if key in EMBED_QUERY_PARAMS_KEYS:
|
102
|
+
raise KeyError(missing_key_error_message(key))
|
103
|
+
del self._query_params[key]
|
104
|
+
self._send_query_param_msg()
|
105
|
+
except KeyError:
|
106
|
+
raise KeyError(missing_key_error_message(key))
|
107
|
+
|
108
|
+
def update(
|
109
|
+
self,
|
110
|
+
other: Iterable[tuple[str, str | Iterable[str]]]
|
111
|
+
| SupportsKeysAndGetItem[str, str | Iterable[str]] = (),
|
112
|
+
/,
|
113
|
+
**kwds: str,
|
114
|
+
):
|
115
|
+
# This overrides the `update` provided by MutableMapping
|
116
|
+
# to ensure only one one ForwardMsg is sent.
|
117
|
+
self._ensure_single_query_api_used()
|
118
|
+
if hasattr(other, "keys") and hasattr(other, "__getitem__"):
|
119
|
+
for key in other.keys():
|
120
|
+
self.__set_item_internal(key, other[key])
|
121
|
+
else:
|
122
|
+
for key, value in other:
|
123
|
+
self.__set_item_internal(key, value)
|
124
|
+
for key, value in kwds.items():
|
125
|
+
self.__set_item_internal(key, value)
|
126
|
+
self._send_query_param_msg()
|
127
|
+
|
128
|
+
def get_all(self, key: str) -> list[str]:
|
129
|
+
self._ensure_single_query_api_used()
|
130
|
+
if key not in self._query_params or key in EMBED_QUERY_PARAMS_KEYS:
|
131
|
+
return []
|
132
|
+
value = self._query_params[key]
|
133
|
+
return value if isinstance(value, list) else [value]
|
134
|
+
|
135
|
+
def __len__(self) -> int:
|
136
|
+
self._ensure_single_query_api_used()
|
137
|
+
return len(
|
138
|
+
{key for key in self._query_params if key not in EMBED_QUERY_PARAMS_KEYS}
|
139
|
+
)
|
140
|
+
|
141
|
+
def __str__(self) -> str:
|
142
|
+
self._ensure_single_query_api_used()
|
143
|
+
return str(self._query_params)
|
144
|
+
|
145
|
+
def _send_query_param_msg(self) -> None:
|
146
|
+
ctx = get_script_run_ctx()
|
147
|
+
if ctx is None:
|
148
|
+
return
|
149
|
+
self._ensure_single_query_api_used()
|
150
|
+
|
151
|
+
msg = ForwardMsg()
|
152
|
+
msg.page_info_changed.query_string = parse.urlencode(
|
153
|
+
self._query_params, doseq=True
|
154
|
+
)
|
155
|
+
ctx.query_string = msg.page_info_changed.query_string
|
156
|
+
ctx.enqueue(msg)
|
157
|
+
|
158
|
+
def clear(self) -> None:
|
159
|
+
self._ensure_single_query_api_used()
|
160
|
+
self.clear_with_no_forward_msg(preserve_embed=True)
|
161
|
+
self._send_query_param_msg()
|
162
|
+
|
163
|
+
def to_dict(self) -> dict[str, str]:
|
164
|
+
self._ensure_single_query_api_used()
|
165
|
+
# return the last query param if multiple values are set
|
166
|
+
return {
|
167
|
+
key: self[key]
|
168
|
+
for key in self._query_params
|
169
|
+
if key not in EMBED_QUERY_PARAMS_KEYS
|
170
|
+
}
|
171
|
+
|
172
|
+
def from_dict(
|
173
|
+
self,
|
174
|
+
_dict: Iterable[tuple[str, str | Iterable[str]]]
|
175
|
+
| SupportsKeysAndGetItem[str, str | Iterable[str]],
|
176
|
+
):
|
177
|
+
self._ensure_single_query_api_used()
|
178
|
+
old_value = self._query_params.copy()
|
179
|
+
self.clear_with_no_forward_msg(preserve_embed=True)
|
180
|
+
try:
|
181
|
+
self.update(_dict)
|
182
|
+
except StreamlitAPIException:
|
183
|
+
# restore the original from before we made any changes.
|
184
|
+
self._query_params = old_value
|
185
|
+
raise
|
186
|
+
|
187
|
+
def set_with_no_forward_msg(self, key: str, val: list[str] | str) -> None:
|
188
|
+
self._query_params[key] = val
|
189
|
+
|
190
|
+
def clear_with_no_forward_msg(self, preserve_embed: bool = False) -> None:
|
191
|
+
self._query_params = {
|
192
|
+
key: value
|
193
|
+
for key, value in self._query_params.items()
|
194
|
+
if key in EMBED_QUERY_PARAMS_KEYS and preserve_embed
|
195
|
+
}
|
196
|
+
|
197
|
+
def _ensure_single_query_api_used(self):
|
198
|
+
ctx = get_script_run_ctx()
|
199
|
+
if ctx is None:
|
200
|
+
return
|
201
|
+
ctx.mark_production_query_params_used()
|
202
|
+
|
203
|
+
|
204
|
+
def missing_key_error_message(key: str) -> str:
|
205
|
+
return f'st.query_params has no key "{key}".'
|
@@ -0,0 +1,218 @@
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from collections.abc import Iterable, Iterator, MutableMapping
|
18
|
+
from typing import TYPE_CHECKING, overload
|
19
|
+
|
20
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
21
|
+
from streamlit.runtime.state.session_state_proxy import get_session_state
|
22
|
+
|
23
|
+
if TYPE_CHECKING:
|
24
|
+
from _typeshed import SupportsKeysAndGetItem
|
25
|
+
|
26
|
+
|
27
|
+
class QueryParamsProxy(MutableMapping[str, str]):
|
28
|
+
"""
|
29
|
+
A stateless singleton that proxies ``st.query_params`` interactions
|
30
|
+
to the current script thread's QueryParams instance.
|
31
|
+
"""
|
32
|
+
|
33
|
+
def __iter__(self) -> Iterator[str]:
|
34
|
+
with get_session_state().query_params() as qp:
|
35
|
+
return iter(qp)
|
36
|
+
|
37
|
+
def __len__(self) -> int:
|
38
|
+
with get_session_state().query_params() as qp:
|
39
|
+
return len(qp)
|
40
|
+
|
41
|
+
def __str__(self) -> str:
|
42
|
+
with get_session_state().query_params() as qp:
|
43
|
+
return str(qp)
|
44
|
+
|
45
|
+
@gather_metrics("query_params.get_item")
|
46
|
+
def __getitem__(self, key: str) -> str:
|
47
|
+
with get_session_state().query_params() as qp:
|
48
|
+
try:
|
49
|
+
return qp[key]
|
50
|
+
except KeyError:
|
51
|
+
raise KeyError(self.missing_key_error_message(key))
|
52
|
+
|
53
|
+
def __delitem__(self, key: str) -> None:
|
54
|
+
with get_session_state().query_params() as qp:
|
55
|
+
del qp[key]
|
56
|
+
|
57
|
+
@gather_metrics("query_params.set_item")
|
58
|
+
def __setitem__(self, key: str, value: str | Iterable[str]) -> None:
|
59
|
+
with get_session_state().query_params() as qp:
|
60
|
+
qp[key] = value
|
61
|
+
|
62
|
+
@gather_metrics("query_params.get_attr")
|
63
|
+
def __getattr__(self, key: str) -> str:
|
64
|
+
with get_session_state().query_params() as qp:
|
65
|
+
try:
|
66
|
+
return qp[key]
|
67
|
+
except KeyError:
|
68
|
+
raise AttributeError(self.missing_attr_error_message(key))
|
69
|
+
|
70
|
+
def __delattr__(self, key: str) -> None:
|
71
|
+
with get_session_state().query_params() as qp:
|
72
|
+
try:
|
73
|
+
del qp[key]
|
74
|
+
except KeyError:
|
75
|
+
raise AttributeError(self.missing_key_error_message(key))
|
76
|
+
|
77
|
+
@overload
|
78
|
+
def update(
|
79
|
+
self, mapping: SupportsKeysAndGetItem[str, str | Iterable[str]], /, **kwds: str
|
80
|
+
) -> None: ...
|
81
|
+
|
82
|
+
@overload
|
83
|
+
def update(
|
84
|
+
self, keys_and_values: Iterable[tuple[str, str | Iterable[str]]], /, **kwds: str
|
85
|
+
) -> None: ...
|
86
|
+
|
87
|
+
@overload
|
88
|
+
def update(self, **kwds: str | Iterable[str]) -> None: ...
|
89
|
+
|
90
|
+
def update(self, other=(), /, **kwds):
|
91
|
+
"""
|
92
|
+
Update one or more values in query_params at once from a dictionary or
|
93
|
+
dictionary-like object.
|
94
|
+
|
95
|
+
See `Mapping.update()` from Python's `collections` library.
|
96
|
+
|
97
|
+
Parameters
|
98
|
+
----------
|
99
|
+
other: SupportsKeysAndGetItem[str, str] | Iterable[tuple[str, str]]
|
100
|
+
A dictionary or mapping of strings to strings.
|
101
|
+
**kwds: str
|
102
|
+
Additional key/value pairs to update passed as keyword arguments.
|
103
|
+
"""
|
104
|
+
with get_session_state().query_params() as qp:
|
105
|
+
qp.update(other, **kwds)
|
106
|
+
|
107
|
+
@gather_metrics("query_params.set_attr")
|
108
|
+
def __setattr__(self, key: str, value: str | Iterable[str]) -> None:
|
109
|
+
with get_session_state().query_params() as qp:
|
110
|
+
qp[key] = value
|
111
|
+
|
112
|
+
@gather_metrics("query_params.get_all")
|
113
|
+
def get_all(self, key: str) -> list[str]:
|
114
|
+
"""
|
115
|
+
Get a list of all query parameter values associated to a given key.
|
116
|
+
|
117
|
+
When a key is repeated as a query parameter within the URL, this method
|
118
|
+
allows all values to be obtained. In contrast, dict-like methods only
|
119
|
+
retrieve the last value when a key is repeated in the URL.
|
120
|
+
|
121
|
+
Parameters
|
122
|
+
----------
|
123
|
+
key: str
|
124
|
+
The label of the query parameter in the URL.
|
125
|
+
|
126
|
+
Returns
|
127
|
+
-------
|
128
|
+
List[str]
|
129
|
+
A list of values associated to the given key. May return zero, one,
|
130
|
+
or multiple values.
|
131
|
+
"""
|
132
|
+
with get_session_state().query_params() as qp:
|
133
|
+
return qp.get_all(key)
|
134
|
+
|
135
|
+
@gather_metrics("query_params.clear")
|
136
|
+
def clear(self) -> None:
|
137
|
+
"""
|
138
|
+
Clear all query parameters from the URL of the app.
|
139
|
+
|
140
|
+
Returns
|
141
|
+
-------
|
142
|
+
None
|
143
|
+
"""
|
144
|
+
with get_session_state().query_params() as qp:
|
145
|
+
qp.clear()
|
146
|
+
|
147
|
+
@gather_metrics("query_params.to_dict")
|
148
|
+
def to_dict(self) -> dict[str, str]:
|
149
|
+
"""
|
150
|
+
Get all query parameters as a dictionary.
|
151
|
+
|
152
|
+
This method primarily exists for internal use and is not needed for
|
153
|
+
most cases. ``st.query_params`` returns an object that inherits from
|
154
|
+
``dict`` by default.
|
155
|
+
|
156
|
+
When a key is repeated as a query parameter within the URL, this method
|
157
|
+
will return only the last value of each unique key.
|
158
|
+
|
159
|
+
Returns
|
160
|
+
-------
|
161
|
+
Dict[str,str]
|
162
|
+
A dictionary of the current query paramters in the app's URL.
|
163
|
+
"""
|
164
|
+
with get_session_state().query_params() as qp:
|
165
|
+
return qp.to_dict()
|
166
|
+
|
167
|
+
@overload
|
168
|
+
def from_dict(
|
169
|
+
self, keys_and_values: Iterable[tuple[str, str | Iterable[str]]]
|
170
|
+
) -> None: ...
|
171
|
+
|
172
|
+
@overload
|
173
|
+
def from_dict(
|
174
|
+
self, mapping: SupportsKeysAndGetItem[str, str | Iterable[str]]
|
175
|
+
) -> None: ...
|
176
|
+
|
177
|
+
@gather_metrics("query_params.from_dict")
|
178
|
+
def from_dict(self, params):
|
179
|
+
"""
|
180
|
+
Set all of the query parameters from a dictionary or dictionary-like object.
|
181
|
+
|
182
|
+
This method primarily exists for advanced users who want to control
|
183
|
+
multiple query parameters in a single update. To set individual query
|
184
|
+
parameters, use key or attribute notation instead.
|
185
|
+
|
186
|
+
This method inherits limitations from ``st.query_params`` and can't be
|
187
|
+
used to set embedding options as described in `Embed your app \
|
188
|
+
<https://docs.streamlit.io/deploy/streamlit-community-cloud/share-your-app/embed-your-app#embed-options>`_.
|
189
|
+
|
190
|
+
To handle repeated keys, the value in a key-value pair should be a list.
|
191
|
+
|
192
|
+
.. note::
|
193
|
+
``.from_dict()`` is not a direct inverse of ``.to_dict()`` if
|
194
|
+
you are working with repeated keys. A true inverse operation is
|
195
|
+
``{key: st.query_params.get_all(key) for key in st.query_params}``.
|
196
|
+
|
197
|
+
Parameters
|
198
|
+
----------
|
199
|
+
params: dict
|
200
|
+
A dictionary used to replace the current query parameters.
|
201
|
+
|
202
|
+
Example
|
203
|
+
-------
|
204
|
+
>>> import streamlit as st
|
205
|
+
>>>
|
206
|
+
>>> st.query_params.from_dict({"foo": "bar", "baz": [1, "two"]})
|
207
|
+
|
208
|
+
"""
|
209
|
+
with get_session_state().query_params() as qp:
|
210
|
+
return qp.from_dict(params)
|
211
|
+
|
212
|
+
@staticmethod
|
213
|
+
def missing_key_error_message(key: str) -> str:
|
214
|
+
return f'st.query_params has no key "{key}".'
|
215
|
+
|
216
|
+
@staticmethod
|
217
|
+
def missing_attr_error_message(key: str) -> str:
|
218
|
+
return f'st.query_params has no attribute "{key}".'
|
@@ -0,0 +1,138 @@
|
|
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 threading
|
18
|
+
from contextlib import contextmanager
|
19
|
+
from typing import TYPE_CHECKING, Any, Callable
|
20
|
+
|
21
|
+
if TYPE_CHECKING:
|
22
|
+
from collections.abc import Iterator
|
23
|
+
|
24
|
+
from streamlit.proto.WidgetStates_pb2 import WidgetState as WidgetStateProto
|
25
|
+
from streamlit.proto.WidgetStates_pb2 import WidgetStates as WidgetStatesProto
|
26
|
+
from streamlit.runtime.state.common import RegisterWidgetResult, T, WidgetMetadata
|
27
|
+
from streamlit.runtime.state.query_params import QueryParams
|
28
|
+
from streamlit.runtime.state.session_state import SessionState
|
29
|
+
|
30
|
+
|
31
|
+
class SafeSessionState:
|
32
|
+
"""Thread-safe wrapper around SessionState.
|
33
|
+
|
34
|
+
When AppSession gets a re-run request, it can interrupt its existing
|
35
|
+
ScriptRunner and spin up a new ScriptRunner to handle the request.
|
36
|
+
When this happens, the existing ScriptRunner will continue executing
|
37
|
+
its script until it reaches a yield point - but during this time, it
|
38
|
+
must not mutate its SessionState.
|
39
|
+
"""
|
40
|
+
|
41
|
+
_state: SessionState
|
42
|
+
_lock: threading.RLock
|
43
|
+
_yield_callback: Callable[[], None]
|
44
|
+
|
45
|
+
def __init__(self, state: SessionState, yield_callback: Callable[[], None]):
|
46
|
+
# Fields must be set using the object's setattr method to avoid
|
47
|
+
# infinite recursion from trying to look up the fields we're setting.
|
48
|
+
object.__setattr__(self, "_state", state)
|
49
|
+
# TODO: we'd prefer this be a threading.Lock instead of RLock -
|
50
|
+
# but `call_callbacks` first needs to be rewritten.
|
51
|
+
object.__setattr__(self, "_lock", threading.RLock())
|
52
|
+
object.__setattr__(self, "_yield_callback", yield_callback)
|
53
|
+
|
54
|
+
def register_widget(
|
55
|
+
self, metadata: WidgetMetadata[T], user_key: str | None
|
56
|
+
) -> RegisterWidgetResult[T]:
|
57
|
+
self._yield_callback()
|
58
|
+
with self._lock:
|
59
|
+
return self._state.register_widget(metadata, user_key)
|
60
|
+
|
61
|
+
def on_script_will_rerun(self, latest_widget_states: WidgetStatesProto) -> None:
|
62
|
+
self._yield_callback()
|
63
|
+
with self._lock:
|
64
|
+
# TODO: rewrite this to copy the callbacks list into a local
|
65
|
+
# variable so that we don't need to hold our lock for the
|
66
|
+
# duration. (This will also allow us to downgrade our RLock
|
67
|
+
# to a Lock.)
|
68
|
+
self._state.on_script_will_rerun(latest_widget_states)
|
69
|
+
|
70
|
+
def on_script_finished(self, widget_ids_this_run: set[str]) -> None:
|
71
|
+
with self._lock:
|
72
|
+
self._state.on_script_finished(widget_ids_this_run)
|
73
|
+
|
74
|
+
def maybe_check_serializable(self) -> None:
|
75
|
+
with self._lock:
|
76
|
+
self._state.maybe_check_serializable()
|
77
|
+
|
78
|
+
def get_widget_states(self) -> list[WidgetStateProto]:
|
79
|
+
"""Return a list of serialized widget values for each widget with a value."""
|
80
|
+
with self._lock:
|
81
|
+
return self._state.get_widget_states()
|
82
|
+
|
83
|
+
def is_new_state_value(self, user_key: str) -> bool:
|
84
|
+
with self._lock:
|
85
|
+
return self._state.is_new_state_value(user_key)
|
86
|
+
|
87
|
+
@property
|
88
|
+
def filtered_state(self) -> dict[str, Any]:
|
89
|
+
"""The combined session and widget state, excluding keyless widgets."""
|
90
|
+
with self._lock:
|
91
|
+
return self._state.filtered_state
|
92
|
+
|
93
|
+
def __getitem__(self, key: str) -> Any:
|
94
|
+
self._yield_callback()
|
95
|
+
with self._lock:
|
96
|
+
return self._state[key]
|
97
|
+
|
98
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
99
|
+
self._yield_callback()
|
100
|
+
with self._lock:
|
101
|
+
self._state[key] = value
|
102
|
+
|
103
|
+
def __delitem__(self, key: str) -> None:
|
104
|
+
self._yield_callback()
|
105
|
+
with self._lock:
|
106
|
+
del self._state[key]
|
107
|
+
|
108
|
+
def __contains__(self, key: str) -> bool:
|
109
|
+
self._yield_callback()
|
110
|
+
with self._lock:
|
111
|
+
return key in self._state
|
112
|
+
|
113
|
+
def __getattr__(self, key: str) -> Any:
|
114
|
+
try:
|
115
|
+
return self[key]
|
116
|
+
except KeyError:
|
117
|
+
raise AttributeError(f"{key} not found in session_state.")
|
118
|
+
|
119
|
+
def __setattr__(self, key: str, value: Any) -> None:
|
120
|
+
self[key] = value
|
121
|
+
|
122
|
+
def __delattr__(self, key: str) -> None:
|
123
|
+
try:
|
124
|
+
del self[key]
|
125
|
+
except KeyError:
|
126
|
+
raise AttributeError(f"{key} not found in session_state.")
|
127
|
+
|
128
|
+
def __repr__(self):
|
129
|
+
"""Presents itself as a simple dict of the underlying SessionState instance"""
|
130
|
+
kv = ((k, self._state[k]) for k in self._state._keys())
|
131
|
+
s = ", ".join(f"{k}: {v!r}" for k, v in kv)
|
132
|
+
return f"{{{s}}}"
|
133
|
+
|
134
|
+
@contextmanager
|
135
|
+
def query_params(self) -> Iterator[QueryParams]:
|
136
|
+
self._yield_callback()
|
137
|
+
with self._lock:
|
138
|
+
yield self._state.query_params
|