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,394 @@
|
|
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 abc import abstractmethod
|
18
|
+
from dataclasses import dataclass
|
19
|
+
from typing import TYPE_CHECKING, Callable, Protocol, cast
|
20
|
+
|
21
|
+
if TYPE_CHECKING:
|
22
|
+
from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
|
23
|
+
from streamlit.runtime.app_session import AppSession
|
24
|
+
from streamlit.runtime.script_data import ScriptData
|
25
|
+
from streamlit.runtime.scriptrunner.script_cache import ScriptCache
|
26
|
+
from streamlit.runtime.uploaded_file_manager import UploadedFileManager
|
27
|
+
|
28
|
+
|
29
|
+
class SessionClientDisconnectedError(Exception):
|
30
|
+
"""Raised by operations on a disconnected SessionClient."""
|
31
|
+
|
32
|
+
|
33
|
+
class SessionClient(Protocol):
|
34
|
+
"""Interface for sending data to a session's client."""
|
35
|
+
|
36
|
+
@abstractmethod
|
37
|
+
def write_forward_msg(self, msg: ForwardMsg) -> None:
|
38
|
+
"""Deliver a ForwardMsg to the client.
|
39
|
+
|
40
|
+
If the SessionClient has been disconnected, it should raise a
|
41
|
+
SessionClientDisconnectedError.
|
42
|
+
"""
|
43
|
+
raise NotImplementedError
|
44
|
+
|
45
|
+
|
46
|
+
@dataclass
|
47
|
+
class ActiveSessionInfo:
|
48
|
+
"""Type containing data related to an active session.
|
49
|
+
|
50
|
+
This type is nearly identical to SessionInfo. The difference is that when using it,
|
51
|
+
we are guaranteed that SessionClient is not None.
|
52
|
+
"""
|
53
|
+
|
54
|
+
client: SessionClient
|
55
|
+
session: AppSession
|
56
|
+
script_run_count: int = 0
|
57
|
+
|
58
|
+
|
59
|
+
@dataclass
|
60
|
+
class SessionInfo:
|
61
|
+
"""Type containing data related to an AppSession.
|
62
|
+
|
63
|
+
For each AppSession, the Runtime tracks that session's
|
64
|
+
script_run_count. This is used to track the age of messages in
|
65
|
+
the ForwardMsgCache.
|
66
|
+
"""
|
67
|
+
|
68
|
+
client: SessionClient | None
|
69
|
+
session: AppSession
|
70
|
+
script_run_count: int = 0
|
71
|
+
|
72
|
+
def is_active(self) -> bool:
|
73
|
+
return self.client is not None
|
74
|
+
|
75
|
+
def to_active(self) -> ActiveSessionInfo:
|
76
|
+
assert self.is_active(), "A SessionInfo with no client cannot be active!"
|
77
|
+
|
78
|
+
# NOTE: The cast here (rather than copying this SessionInfo's fields into a new
|
79
|
+
# ActiveSessionInfo) is important as the Runtime expects to be able to mutate
|
80
|
+
# what's returned from get_active_session_info to increment script_run_count.
|
81
|
+
return cast(ActiveSessionInfo, self)
|
82
|
+
|
83
|
+
|
84
|
+
class SessionStorageError(Exception):
|
85
|
+
"""Exception class for errors raised by SessionStorage.
|
86
|
+
|
87
|
+
The original error that causes a SessionStorageError to be (re)raised will generally
|
88
|
+
be an I/O error specific to the concrete SessionStorage implementation.
|
89
|
+
"""
|
90
|
+
|
91
|
+
|
92
|
+
class SessionStorage(Protocol):
|
93
|
+
@abstractmethod
|
94
|
+
def get(self, session_id: str) -> SessionInfo | None:
|
95
|
+
"""Return the SessionInfo corresponding to session_id, or None if one does not
|
96
|
+
exist.
|
97
|
+
|
98
|
+
Parameters
|
99
|
+
----------
|
100
|
+
session_id
|
101
|
+
The unique ID of the session being fetched.
|
102
|
+
|
103
|
+
Returns
|
104
|
+
-------
|
105
|
+
SessionInfo or None
|
106
|
+
|
107
|
+
Raises
|
108
|
+
------
|
109
|
+
SessionStorageError
|
110
|
+
Raised if an error occurs while attempting to fetch the session. This will
|
111
|
+
generally happen if there is an error with the underlying storage backend
|
112
|
+
(e.g. if we lose our connection to it).
|
113
|
+
"""
|
114
|
+
raise NotImplementedError
|
115
|
+
|
116
|
+
@abstractmethod
|
117
|
+
def save(self, session_info: SessionInfo) -> None:
|
118
|
+
"""Save the given session.
|
119
|
+
|
120
|
+
Parameters
|
121
|
+
----------
|
122
|
+
session_info
|
123
|
+
The SessionInfo being saved.
|
124
|
+
|
125
|
+
Raises
|
126
|
+
------
|
127
|
+
SessionStorageError
|
128
|
+
Raised if an error occurs while saving the given session.
|
129
|
+
"""
|
130
|
+
raise NotImplementedError
|
131
|
+
|
132
|
+
@abstractmethod
|
133
|
+
def delete(self, session_id: str) -> None:
|
134
|
+
"""Mark the session corresponding to session_id for deletion and stop tracking
|
135
|
+
it.
|
136
|
+
|
137
|
+
Note that:
|
138
|
+
- Calling delete on an ID corresponding to a nonexistent session is a no-op.
|
139
|
+
- Calling delete on an ID should cause the given session to no longer be
|
140
|
+
tracked by this SessionStorage, but exactly when and how the session's data
|
141
|
+
is eventually cleaned up is a detail left up to the implementation.
|
142
|
+
|
143
|
+
Parameters
|
144
|
+
----------
|
145
|
+
session_id
|
146
|
+
The unique ID of the session to delete.
|
147
|
+
|
148
|
+
Raises
|
149
|
+
------
|
150
|
+
SessionStorageError
|
151
|
+
Raised if an error occurs while attempting to delete the session.
|
152
|
+
"""
|
153
|
+
raise NotImplementedError
|
154
|
+
|
155
|
+
@abstractmethod
|
156
|
+
def list(self) -> list[SessionInfo]:
|
157
|
+
"""List all sessions tracked by this SessionStorage.
|
158
|
+
|
159
|
+
Returns
|
160
|
+
-------
|
161
|
+
List[SessionInfo]
|
162
|
+
|
163
|
+
Raises
|
164
|
+
------
|
165
|
+
SessionStorageError
|
166
|
+
Raised if an error occurs while attempting to list sessions.
|
167
|
+
"""
|
168
|
+
raise NotImplementedError
|
169
|
+
|
170
|
+
|
171
|
+
class SessionManager(Protocol):
|
172
|
+
"""SessionManagers are responsible for encapsulating all session lifecycle behavior
|
173
|
+
that the Streamlit Runtime may care about.
|
174
|
+
|
175
|
+
A SessionManager must define the following required methods:
|
176
|
+
- __init__
|
177
|
+
- connect_session
|
178
|
+
- close_session
|
179
|
+
- get_session_info
|
180
|
+
- list_sessions
|
181
|
+
|
182
|
+
SessionManager implementations may also choose to define the notions of active and
|
183
|
+
inactive sessions. The precise definitions of active/inactive are left to the
|
184
|
+
concrete implementation. SessionManagers that wish to differentiate between active
|
185
|
+
and inactive sessions should have the required methods listed above operate on *all*
|
186
|
+
sessions. Additionally, they should define the following methods for working with
|
187
|
+
active sessions:
|
188
|
+
- disconnect_session
|
189
|
+
- get_active_session_info
|
190
|
+
- is_active_session
|
191
|
+
- list_active_sessions
|
192
|
+
|
193
|
+
When active session-related methods are left undefined, their default
|
194
|
+
implementations are the naturally corresponding required methods.
|
195
|
+
|
196
|
+
The Runtime, unless there's a good reason to do otherwise, should generally work
|
197
|
+
with the active-session versions of a SessionManager's methods. There isn't currently
|
198
|
+
a need for us to be able to operate on inactive sessions stored in SessionStorage
|
199
|
+
outside of the SessionManager itself. However, it's highly likely that we'll
|
200
|
+
eventually have to do so, which is why the abstractions allow for this now.
|
201
|
+
|
202
|
+
Notes
|
203
|
+
-----
|
204
|
+
Threading: All SessionManager methods are *not* threadsafe -- they must be called
|
205
|
+
from the runtime's eventloop thread.
|
206
|
+
"""
|
207
|
+
|
208
|
+
@abstractmethod
|
209
|
+
def __init__(
|
210
|
+
self,
|
211
|
+
session_storage: SessionStorage,
|
212
|
+
uploaded_file_manager: UploadedFileManager,
|
213
|
+
script_cache: ScriptCache,
|
214
|
+
message_enqueued_callback: Callable[[], None] | None,
|
215
|
+
) -> None:
|
216
|
+
"""Initialize a SessionManager with the given SessionStorage.
|
217
|
+
|
218
|
+
Parameters
|
219
|
+
----------
|
220
|
+
session_storage
|
221
|
+
The SessionStorage instance backing this SessionManager.
|
222
|
+
|
223
|
+
uploaded_file_manager
|
224
|
+
Used to manage files uploaded by users via the Streamlit web client.
|
225
|
+
|
226
|
+
script_cache
|
227
|
+
ScriptCache instance. Caches user script bytecode.
|
228
|
+
|
229
|
+
message_enqueued_callback
|
230
|
+
A callback invoked after a message is enqueued to be sent to a web client.
|
231
|
+
"""
|
232
|
+
raise NotImplementedError
|
233
|
+
|
234
|
+
@abstractmethod
|
235
|
+
def connect_session(
|
236
|
+
self,
|
237
|
+
client: SessionClient,
|
238
|
+
script_data: ScriptData,
|
239
|
+
user_info: dict[str, str | bool | None],
|
240
|
+
existing_session_id: str | None = None,
|
241
|
+
session_id_override: str | None = None,
|
242
|
+
) -> str:
|
243
|
+
"""Create a new session or connect to an existing one.
|
244
|
+
|
245
|
+
Parameters
|
246
|
+
----------
|
247
|
+
client
|
248
|
+
A concrete SessionClient implementation for communicating with
|
249
|
+
the session's client.
|
250
|
+
script_data
|
251
|
+
Contains parameters related to running a script.
|
252
|
+
user_info
|
253
|
+
A dict that contains information about the session's user. For now,
|
254
|
+
it only (optionally) contains the user's email address.
|
255
|
+
|
256
|
+
{
|
257
|
+
"email": "example@example.com"
|
258
|
+
}
|
259
|
+
existing_session_id
|
260
|
+
The ID of an existing session to reconnect to. If one is not provided, a new
|
261
|
+
session is created. Note that whether a SessionManager supports reconnecting
|
262
|
+
to an existing session is left up to the concrete SessionManager
|
263
|
+
implementation. Those that do not support reconnection should simply ignore
|
264
|
+
this argument.
|
265
|
+
session_id_override
|
266
|
+
The ID to assign to a new session being created with this method. Setting
|
267
|
+
this can be useful when the service that a Streamlit Runtime is running in
|
268
|
+
wants to tie the lifecycle of a Streamlit session to some other session-like
|
269
|
+
object that it manages. Only one of existing_session_id and
|
270
|
+
session_id_override should be set.
|
271
|
+
|
272
|
+
Returns
|
273
|
+
-------
|
274
|
+
str
|
275
|
+
The session's unique string ID.
|
276
|
+
"""
|
277
|
+
raise NotImplementedError
|
278
|
+
|
279
|
+
@abstractmethod
|
280
|
+
def close_session(self, session_id: str) -> None:
|
281
|
+
"""Close and completely delete the session with the given id.
|
282
|
+
|
283
|
+
This function may be called multiple times for the same session,
|
284
|
+
which is not an error. (Subsequent calls just no-op.)
|
285
|
+
|
286
|
+
Parameters
|
287
|
+
----------
|
288
|
+
session_id
|
289
|
+
The session's unique ID.
|
290
|
+
"""
|
291
|
+
raise NotImplementedError
|
292
|
+
|
293
|
+
@abstractmethod
|
294
|
+
def get_session_info(self, session_id: str) -> SessionInfo | None:
|
295
|
+
"""Return the SessionInfo for the given id, or None if no such session
|
296
|
+
exists.
|
297
|
+
|
298
|
+
Parameters
|
299
|
+
----------
|
300
|
+
session_id
|
301
|
+
The session's unique ID.
|
302
|
+
|
303
|
+
Returns
|
304
|
+
-------
|
305
|
+
SessionInfo or None
|
306
|
+
"""
|
307
|
+
raise NotImplementedError
|
308
|
+
|
309
|
+
@abstractmethod
|
310
|
+
def list_sessions(self) -> list[SessionInfo]:
|
311
|
+
"""Return the SessionInfo for all sessions managed by this SessionManager.
|
312
|
+
|
313
|
+
Returns
|
314
|
+
-------
|
315
|
+
List[SessionInfo]
|
316
|
+
"""
|
317
|
+
raise NotImplementedError
|
318
|
+
|
319
|
+
def num_sessions(self) -> int:
|
320
|
+
"""Return the number of sessions tracked by this SessionManager.
|
321
|
+
|
322
|
+
Subclasses of SessionManager shouldn't provide their own implementation of this
|
323
|
+
method without a *very* good reason.
|
324
|
+
|
325
|
+
Returns
|
326
|
+
-------
|
327
|
+
int
|
328
|
+
"""
|
329
|
+
return len(self.list_sessions())
|
330
|
+
|
331
|
+
# NOTE: The following methods only need to be overwritten when a concrete
|
332
|
+
# SessionManager implementation has a notion of active vs inactive sessions.
|
333
|
+
# If left unimplemented in a subclass, the default implementations of these methods
|
334
|
+
# call corresponding SessionManager methods in a natural way.
|
335
|
+
|
336
|
+
def disconnect_session(self, session_id: str) -> None:
|
337
|
+
"""Disconnect the given session.
|
338
|
+
|
339
|
+
This method should be idempotent.
|
340
|
+
|
341
|
+
Parameters
|
342
|
+
----------
|
343
|
+
session_id
|
344
|
+
The session's unique ID.
|
345
|
+
"""
|
346
|
+
self.close_session(session_id)
|
347
|
+
|
348
|
+
def get_active_session_info(self, session_id: str) -> ActiveSessionInfo | None:
|
349
|
+
"""Return the ActiveSessionInfo for the given id, or None if either no such
|
350
|
+
session exists or the session is not active.
|
351
|
+
|
352
|
+
Parameters
|
353
|
+
----------
|
354
|
+
session_id
|
355
|
+
The active session's unique ID.
|
356
|
+
|
357
|
+
Returns
|
358
|
+
-------
|
359
|
+
ActiveSessionInfo or None
|
360
|
+
"""
|
361
|
+
session = self.get_session_info(session_id)
|
362
|
+
if session is None or not session.is_active():
|
363
|
+
return None
|
364
|
+
return session.to_active()
|
365
|
+
|
366
|
+
def is_active_session(self, session_id: str) -> bool:
|
367
|
+
"""Return True if the given session exists and is active, False otherwise.
|
368
|
+
|
369
|
+
Returns
|
370
|
+
-------
|
371
|
+
bool
|
372
|
+
"""
|
373
|
+
return self.get_active_session_info(session_id) is not None
|
374
|
+
|
375
|
+
def list_active_sessions(self) -> list[ActiveSessionInfo]:
|
376
|
+
"""Return the session info for all active sessions tracked by this SessionManager.
|
377
|
+
|
378
|
+
Returns
|
379
|
+
-------
|
380
|
+
List[ActiveSessionInfo]
|
381
|
+
"""
|
382
|
+
return [s.to_active() for s in self.list_sessions()]
|
383
|
+
|
384
|
+
def num_active_sessions(self) -> int:
|
385
|
+
"""Return the number of active sessions tracked by this SessionManager.
|
386
|
+
|
387
|
+
Subclasses of SessionManager shouldn't provide their own implementation of this
|
388
|
+
method without a *very* good reason.
|
389
|
+
|
390
|
+
Returns
|
391
|
+
-------
|
392
|
+
int
|
393
|
+
"""
|
394
|
+
return len(self.list_active_sessions())
|
@@ -0,0 +1,41 @@
|
|
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.runtime.state.common import WidgetArgs, WidgetCallback, WidgetKwargs
|
16
|
+
from streamlit.runtime.state.query_params_proxy import QueryParamsProxy
|
17
|
+
from streamlit.runtime.state.safe_session_state import SafeSessionState
|
18
|
+
from streamlit.runtime.state.session_state import (
|
19
|
+
SCRIPT_RUN_WITHOUT_ERRORS_KEY,
|
20
|
+
SessionState,
|
21
|
+
SessionStateStatProvider,
|
22
|
+
)
|
23
|
+
from streamlit.runtime.state.session_state_proxy import (
|
24
|
+
SessionStateProxy,
|
25
|
+
get_session_state,
|
26
|
+
)
|
27
|
+
from streamlit.runtime.state.widgets import register_widget
|
28
|
+
|
29
|
+
__all__ = [
|
30
|
+
"WidgetArgs",
|
31
|
+
"WidgetCallback",
|
32
|
+
"WidgetKwargs",
|
33
|
+
"QueryParamsProxy",
|
34
|
+
"SafeSessionState",
|
35
|
+
"SCRIPT_RUN_WITHOUT_ERRORS_KEY",
|
36
|
+
"SessionState",
|
37
|
+
"SessionStateStatProvider",
|
38
|
+
"SessionStateProxy",
|
39
|
+
"get_session_state",
|
40
|
+
"register_widget",
|
41
|
+
]
|
@@ -0,0 +1,191 @@
|
|
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
|
+
"""Functions and data structures shared by session_state.py and widgets.py"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
from dataclasses import dataclass, field
|
20
|
+
from typing import (
|
21
|
+
Any,
|
22
|
+
Callable,
|
23
|
+
Final,
|
24
|
+
Generic,
|
25
|
+
Literal,
|
26
|
+
TypeVar,
|
27
|
+
cast,
|
28
|
+
get_args,
|
29
|
+
)
|
30
|
+
|
31
|
+
from typing_extensions import TypeAlias, TypeGuard
|
32
|
+
|
33
|
+
from streamlit import util
|
34
|
+
from streamlit.errors import (
|
35
|
+
StreamlitAPIException,
|
36
|
+
)
|
37
|
+
|
38
|
+
GENERATED_ELEMENT_ID_PREFIX: Final = "$$ID"
|
39
|
+
TESTING_KEY = "$$STREAMLIT_INTERNAL_KEY_TESTING"
|
40
|
+
|
41
|
+
|
42
|
+
T = TypeVar("T")
|
43
|
+
T_co = TypeVar("T_co", covariant=True)
|
44
|
+
|
45
|
+
|
46
|
+
WidgetArgs: TypeAlias = tuple[Any, ...]
|
47
|
+
WidgetKwargs: TypeAlias = dict[str, Any]
|
48
|
+
WidgetCallback: TypeAlias = Callable[..., None]
|
49
|
+
|
50
|
+
# A deserializer receives the value from whatever field is set on the
|
51
|
+
# WidgetState proto, and returns a regular python value. A serializer
|
52
|
+
# receives a regular python value, and returns something suitable for
|
53
|
+
# a value field on WidgetState proto. They should be inverses.
|
54
|
+
WidgetDeserializer: TypeAlias = Callable[[Any, str], T]
|
55
|
+
WidgetSerializer: TypeAlias = Callable[[T], Any]
|
56
|
+
|
57
|
+
# The array value field names are part of the larger set of possible value
|
58
|
+
# field names. See the explanation for said set below. The message types
|
59
|
+
# associated with these fields are distinguished by storing data in a `data`
|
60
|
+
# field in their messages, meaning they need special treatment in certain
|
61
|
+
# circumstances. Hence, they need their own, dedicated, sub-type.
|
62
|
+
ArrayValueFieldName: TypeAlias = Literal[
|
63
|
+
"double_array_value",
|
64
|
+
"int_array_value",
|
65
|
+
"string_array_value",
|
66
|
+
]
|
67
|
+
|
68
|
+
# A frozenset containing the allowed values of the ArrayValueFieldName type.
|
69
|
+
# Useful for membership checking.
|
70
|
+
_ARRAY_VALUE_FIELD_NAMES: Final = frozenset(
|
71
|
+
cast(
|
72
|
+
"tuple[ArrayValueFieldName, ...]",
|
73
|
+
# NOTE: get_args is not recursive, so this only works as long as
|
74
|
+
# ArrayValueFieldName remains flat.
|
75
|
+
get_args(ArrayValueFieldName),
|
76
|
+
)
|
77
|
+
)
|
78
|
+
|
79
|
+
# These are the possible field names that can be set in the `value` oneof-field
|
80
|
+
# of the WidgetState message (schema found in .proto/WidgetStates.proto).
|
81
|
+
# We need these as a literal type to ensure correspondence with the protobuf
|
82
|
+
# schema in certain parts of the python code.
|
83
|
+
# TODO(harahu): It would be preferable if this type was automatically derived
|
84
|
+
# from the protobuf schema, rather than manually maintained. Not sure how to
|
85
|
+
# achieve that, though.
|
86
|
+
ValueFieldName: TypeAlias = Literal[
|
87
|
+
ArrayValueFieldName,
|
88
|
+
"arrow_value",
|
89
|
+
"bool_value",
|
90
|
+
"bytes_value",
|
91
|
+
"double_value",
|
92
|
+
"file_uploader_state_value",
|
93
|
+
"int_value",
|
94
|
+
"json_value",
|
95
|
+
"string_value",
|
96
|
+
"trigger_value",
|
97
|
+
"string_trigger_value",
|
98
|
+
"chat_input_value",
|
99
|
+
]
|
100
|
+
|
101
|
+
|
102
|
+
def is_array_value_field_name(obj: object) -> TypeGuard[ArrayValueFieldName]:
|
103
|
+
return obj in _ARRAY_VALUE_FIELD_NAMES
|
104
|
+
|
105
|
+
|
106
|
+
@dataclass(frozen=True)
|
107
|
+
class WidgetMetadata(Generic[T]):
|
108
|
+
"""Metadata associated with a single widget. Immutable."""
|
109
|
+
|
110
|
+
id: str
|
111
|
+
deserializer: WidgetDeserializer[T] = field(repr=False)
|
112
|
+
serializer: WidgetSerializer[T] = field(repr=False)
|
113
|
+
value_type: ValueFieldName
|
114
|
+
|
115
|
+
# An optional user-code callback invoked when the widget's value changes.
|
116
|
+
# Widget callbacks are called at the start of a script run, before the
|
117
|
+
# body of the script is executed.
|
118
|
+
callback: WidgetCallback | None = None
|
119
|
+
callback_args: WidgetArgs | None = None
|
120
|
+
callback_kwargs: WidgetKwargs | None = None
|
121
|
+
|
122
|
+
fragment_id: str | None = None
|
123
|
+
|
124
|
+
def __repr__(self) -> str:
|
125
|
+
return util.repr_(self)
|
126
|
+
|
127
|
+
|
128
|
+
@dataclass(frozen=True)
|
129
|
+
class RegisterWidgetResult(Generic[T_co]):
|
130
|
+
"""Result returned by the `register_widget` family of functions/methods.
|
131
|
+
|
132
|
+
Should be usable by widget code to determine what value to return, and
|
133
|
+
whether to update the UI.
|
134
|
+
|
135
|
+
Parameters
|
136
|
+
----------
|
137
|
+
value : T_co
|
138
|
+
The widget's current value, or, in cases where the true widget value
|
139
|
+
could not be determined, an appropriate fallback value.
|
140
|
+
|
141
|
+
This value should be returned by the widget call.
|
142
|
+
value_changed : bool
|
143
|
+
True if the widget's value is different from the value most recently
|
144
|
+
returned from the frontend.
|
145
|
+
|
146
|
+
Implies an update to the frontend is needed.
|
147
|
+
"""
|
148
|
+
|
149
|
+
value: T_co
|
150
|
+
value_changed: bool
|
151
|
+
|
152
|
+
@classmethod
|
153
|
+
def failure(
|
154
|
+
cls, deserializer: WidgetDeserializer[T_co]
|
155
|
+
) -> RegisterWidgetResult[T_co]:
|
156
|
+
"""The canonical way to construct a RegisterWidgetResult in cases
|
157
|
+
where the true widget value could not be determined.
|
158
|
+
"""
|
159
|
+
return cls(value=deserializer(None, ""), value_changed=False)
|
160
|
+
|
161
|
+
|
162
|
+
def user_key_from_element_id(element_id: str) -> str | None:
|
163
|
+
"""Return the user key portion of a element id, or None if the id does not
|
164
|
+
have a user key.
|
165
|
+
|
166
|
+
TODO This will incorrectly indicate no user key if the user actually provides
|
167
|
+
"None" as a key, but we can't avoid this kind of problem while storing the
|
168
|
+
string representation of the no-user-key sentinel as part of the element id.
|
169
|
+
"""
|
170
|
+
user_key: str | None = element_id.split("-", maxsplit=2)[-1]
|
171
|
+
return None if user_key == "None" else user_key
|
172
|
+
|
173
|
+
|
174
|
+
def is_element_id(key: str) -> bool:
|
175
|
+
"""True if the given session_state key has the structure of a element ID."""
|
176
|
+
return key.startswith(GENERATED_ELEMENT_ID_PREFIX)
|
177
|
+
|
178
|
+
|
179
|
+
def is_keyed_element_id(key: str) -> bool:
|
180
|
+
"""True if the given session_state key has the structure of a element ID
|
181
|
+
with a user_key.
|
182
|
+
"""
|
183
|
+
return is_element_id(key) and not key.endswith("-None")
|
184
|
+
|
185
|
+
|
186
|
+
def require_valid_user_key(key: str) -> None:
|
187
|
+
"""Raise an Exception if the given user_key is invalid."""
|
188
|
+
if is_element_id(key):
|
189
|
+
raise StreamlitAPIException(
|
190
|
+
f"Keys beginning with {GENERATED_ELEMENT_ID_PREFIX} are reserved."
|
191
|
+
)
|