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,19 @@
|
|
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
|
+
"""The modules in this package are separated from
|
16
|
+
the scriptrunner-package, because they are more or less
|
17
|
+
standalone and other modules import them quite frequently.
|
18
|
+
This separation helps us to remove dependency cycles.
|
19
|
+
"""
|
@@ -0,0 +1,48 @@
|
|
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.scriptrunner_utils.script_requests import RerunData
|
16
|
+
from streamlit.util import repr_
|
17
|
+
|
18
|
+
|
19
|
+
# We inherit from BaseException to avoid being caught by user code.
|
20
|
+
# For example, having it inherit from Exception might make st.rerun not
|
21
|
+
# work in a try/except block.
|
22
|
+
class ScriptControlException(BaseException): # NOSONAR
|
23
|
+
"""Base exception for ScriptRunner."""
|
24
|
+
|
25
|
+
pass
|
26
|
+
|
27
|
+
|
28
|
+
class StopException(ScriptControlException):
|
29
|
+
"""Silently stop the execution of the user's script."""
|
30
|
+
|
31
|
+
pass
|
32
|
+
|
33
|
+
|
34
|
+
class RerunException(ScriptControlException):
|
35
|
+
"""Silently stop and rerun the user's script."""
|
36
|
+
|
37
|
+
def __init__(self, rerun_data: RerunData):
|
38
|
+
"""Construct a RerunException
|
39
|
+
|
40
|
+
Parameters
|
41
|
+
----------
|
42
|
+
rerun_data : RerunData
|
43
|
+
The RerunData that should be used to rerun the script
|
44
|
+
"""
|
45
|
+
self.rerun_data = rerun_data
|
46
|
+
|
47
|
+
def __repr__(self) -> str:
|
48
|
+
return repr_(self)
|
@@ -0,0 +1,307 @@
|
|
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 dataclasses import dataclass, field, replace
|
19
|
+
from enum import Enum
|
20
|
+
from typing import TYPE_CHECKING, cast
|
21
|
+
|
22
|
+
from streamlit import util
|
23
|
+
from streamlit.proto.Common_pb2 import ChatInputValue as ChatInputValueProto
|
24
|
+
from streamlit.proto.Common_pb2 import StringTriggerValue as StringTriggerValueProto
|
25
|
+
from streamlit.proto.WidgetStates_pb2 import WidgetState, WidgetStates
|
26
|
+
|
27
|
+
if TYPE_CHECKING:
|
28
|
+
from streamlit.proto.ClientState_pb2 import ContextInfo
|
29
|
+
|
30
|
+
|
31
|
+
class ScriptRequestType(Enum):
|
32
|
+
# The ScriptRunner should continue running its script.
|
33
|
+
CONTINUE = "CONTINUE"
|
34
|
+
|
35
|
+
# If the script is running, it should be stopped as soon
|
36
|
+
# as the ScriptRunner reaches an interrupt point.
|
37
|
+
# This is a terminal state.
|
38
|
+
STOP = "STOP"
|
39
|
+
|
40
|
+
# A script rerun has been requested. The ScriptRunner should
|
41
|
+
# handle this request as soon as it reaches an interrupt point.
|
42
|
+
RERUN = "RERUN"
|
43
|
+
|
44
|
+
|
45
|
+
@dataclass(frozen=True)
|
46
|
+
class RerunData:
|
47
|
+
"""Data attached to RERUN requests. Immutable."""
|
48
|
+
|
49
|
+
query_string: str = ""
|
50
|
+
widget_states: WidgetStates | None = None
|
51
|
+
page_script_hash: str = ""
|
52
|
+
page_name: str = ""
|
53
|
+
|
54
|
+
# A single fragment_id to append to fragment_id_queue.
|
55
|
+
fragment_id: str | None = None
|
56
|
+
# The queue of fragment_ids waiting to be run.
|
57
|
+
fragment_id_queue: list[str] = field(default_factory=list)
|
58
|
+
is_fragment_scoped_rerun: bool = False
|
59
|
+
# set to true when a script is rerun by the fragment auto-rerun mechanism
|
60
|
+
is_auto_rerun: bool = False
|
61
|
+
# context_info is used to store information from the user browser (e.g. timezone)
|
62
|
+
context_info: ContextInfo | None = None
|
63
|
+
|
64
|
+
def __repr__(self) -> str:
|
65
|
+
return util.repr_(self)
|
66
|
+
|
67
|
+
|
68
|
+
@dataclass(frozen=True)
|
69
|
+
class ScriptRequest:
|
70
|
+
"""A STOP or RERUN request and associated data."""
|
71
|
+
|
72
|
+
type: ScriptRequestType
|
73
|
+
_rerun_data: RerunData | None = None
|
74
|
+
|
75
|
+
@property
|
76
|
+
def rerun_data(self) -> RerunData:
|
77
|
+
if self.type is not ScriptRequestType.RERUN:
|
78
|
+
raise RuntimeError("RerunData is only set for RERUN requests.")
|
79
|
+
return cast(RerunData, self._rerun_data)
|
80
|
+
|
81
|
+
def __repr__(self) -> str:
|
82
|
+
return util.repr_(self)
|
83
|
+
|
84
|
+
|
85
|
+
def _fragment_run_should_not_preempt_script(
|
86
|
+
fragment_id_queue: list[str],
|
87
|
+
is_fragment_scoped_rerun: bool,
|
88
|
+
) -> bool:
|
89
|
+
"""Returns whether the currently running script should be preempted due to a
|
90
|
+
fragment rerun.
|
91
|
+
|
92
|
+
Reruns corresponding to fragment runs that weren't caused by calls to
|
93
|
+
`st.rerun(scope="fragment")` should *not* cancel the current script run
|
94
|
+
as doing so will affect elements outside of the fragment.
|
95
|
+
"""
|
96
|
+
return bool(fragment_id_queue) and not is_fragment_scoped_rerun
|
97
|
+
|
98
|
+
|
99
|
+
def _coalesce_widget_states(
|
100
|
+
old_states: WidgetStates | None, new_states: WidgetStates | None
|
101
|
+
) -> WidgetStates | None:
|
102
|
+
"""Coalesce an older WidgetStates into a newer one, and return a new
|
103
|
+
WidgetStates containing the result.
|
104
|
+
|
105
|
+
For most widget values, we just take the latest version.
|
106
|
+
|
107
|
+
However, any trigger_values (which are set by buttons) that are True in
|
108
|
+
`old_states` will be set to True in the coalesced result, so that button
|
109
|
+
presses don't go missing.
|
110
|
+
"""
|
111
|
+
if not old_states and not new_states:
|
112
|
+
return None
|
113
|
+
elif not old_states:
|
114
|
+
return new_states
|
115
|
+
elif not new_states:
|
116
|
+
return old_states
|
117
|
+
|
118
|
+
states_by_id: dict[str, WidgetState] = {
|
119
|
+
wstate.id: wstate for wstate in new_states.widgets
|
120
|
+
}
|
121
|
+
|
122
|
+
trigger_value_types = [
|
123
|
+
("trigger_value", False),
|
124
|
+
("string_trigger_value", StringTriggerValueProto(data=None)),
|
125
|
+
("chat_input_value", ChatInputValueProto(data=None)),
|
126
|
+
]
|
127
|
+
for old_state in old_states.widgets:
|
128
|
+
for trigger_value_type, unset_value in trigger_value_types:
|
129
|
+
if (
|
130
|
+
old_state.WhichOneof("value") == trigger_value_type
|
131
|
+
and getattr(old_state, trigger_value_type) != unset_value
|
132
|
+
):
|
133
|
+
new_trigger_val = states_by_id.get(old_state.id)
|
134
|
+
# It should nearly always be the case that new_trigger_val is None
|
135
|
+
# here as trigger values are deleted from the client's WidgetStateManager
|
136
|
+
# as soon as a rerun_script BackMsg is sent to the server. Since it's
|
137
|
+
# impossible to test that the client sends us state in the expected
|
138
|
+
# format in a unit test, we test for this behavior in
|
139
|
+
# e2e_playwright/test_fragment_queue_test.py
|
140
|
+
if not new_trigger_val or (
|
141
|
+
# Ensure the corresponding new_state is also a trigger;
|
142
|
+
# otherwise, a widget that was previously a button/chat_input but no
|
143
|
+
# longer is could get a bad value.
|
144
|
+
new_trigger_val.WhichOneof("value") == trigger_value_type
|
145
|
+
# We only want to take the value of old_state if new_trigger_val is
|
146
|
+
# unset as the old value may be stale if a newer one was entered.
|
147
|
+
and getattr(new_trigger_val, trigger_value_type) == unset_value
|
148
|
+
):
|
149
|
+
states_by_id[old_state.id] = old_state
|
150
|
+
|
151
|
+
coalesced = WidgetStates()
|
152
|
+
coalesced.widgets.extend(states_by_id.values())
|
153
|
+
|
154
|
+
return coalesced
|
155
|
+
|
156
|
+
|
157
|
+
class ScriptRequests:
|
158
|
+
"""An interface for communicating with a ScriptRunner. Thread-safe.
|
159
|
+
|
160
|
+
AppSession makes requests of a ScriptRunner through this class, and
|
161
|
+
ScriptRunner handles those requests.
|
162
|
+
"""
|
163
|
+
|
164
|
+
def __init__(self):
|
165
|
+
self._lock = threading.Lock()
|
166
|
+
self._state = ScriptRequestType.CONTINUE
|
167
|
+
self._rerun_data = RerunData()
|
168
|
+
|
169
|
+
def request_stop(self) -> None:
|
170
|
+
"""Request that the ScriptRunner stop running. A stopped ScriptRunner
|
171
|
+
can't be used anymore. STOP requests succeed unconditionally.
|
172
|
+
"""
|
173
|
+
with self._lock:
|
174
|
+
self._state = ScriptRequestType.STOP
|
175
|
+
|
176
|
+
def request_rerun(self, new_data: RerunData) -> bool:
|
177
|
+
"""Request that the ScriptRunner rerun its script.
|
178
|
+
|
179
|
+
If the ScriptRunner has been stopped, this request can't be honored:
|
180
|
+
return False.
|
181
|
+
|
182
|
+
Otherwise, record the request and return True. The ScriptRunner will
|
183
|
+
handle the rerun request as soon as it reaches an interrupt point.
|
184
|
+
"""
|
185
|
+
|
186
|
+
with self._lock:
|
187
|
+
if self._state == ScriptRequestType.STOP:
|
188
|
+
# We can't rerun after being stopped.
|
189
|
+
return False
|
190
|
+
|
191
|
+
if self._state == ScriptRequestType.CONTINUE:
|
192
|
+
# The script is currently running, and we haven't received a request to
|
193
|
+
# rerun it as of yet. We can handle a rerun request unconditionally so
|
194
|
+
# just change self._state and set self._rerun_data.
|
195
|
+
self._state = ScriptRequestType.RERUN
|
196
|
+
|
197
|
+
# Convert from a single fragment_id into fragment_id_queue.
|
198
|
+
if new_data.fragment_id:
|
199
|
+
new_data = replace(
|
200
|
+
new_data,
|
201
|
+
fragment_id=None,
|
202
|
+
fragment_id_queue=[new_data.fragment_id],
|
203
|
+
)
|
204
|
+
|
205
|
+
self._rerun_data = new_data
|
206
|
+
return True
|
207
|
+
|
208
|
+
if self._state == ScriptRequestType.RERUN:
|
209
|
+
# We already have an existing Rerun request, so we can coalesce the new
|
210
|
+
# rerun request into the existing one.
|
211
|
+
|
212
|
+
coalesced_states = _coalesce_widget_states(
|
213
|
+
self._rerun_data.widget_states, new_data.widget_states
|
214
|
+
)
|
215
|
+
|
216
|
+
if new_data.fragment_id:
|
217
|
+
# This RERUN request corresponds to a new fragment run. We append
|
218
|
+
# the new fragment ID to the end of the current fragment_id_queue if
|
219
|
+
# it isn't already contained in it.
|
220
|
+
fragment_id_queue = [*self._rerun_data.fragment_id_queue]
|
221
|
+
|
222
|
+
if new_data.fragment_id not in fragment_id_queue:
|
223
|
+
fragment_id_queue.append(new_data.fragment_id)
|
224
|
+
elif new_data.fragment_id_queue:
|
225
|
+
# new_data contains a new fragment_id_queue, so we just use it.
|
226
|
+
fragment_id_queue = new_data.fragment_id_queue
|
227
|
+
else:
|
228
|
+
# Otherwise, this is a request to rerun the full script, so we want
|
229
|
+
# to clear out any fragments we have queued to run since they'll all
|
230
|
+
# be run with the full script anyway.
|
231
|
+
fragment_id_queue = []
|
232
|
+
|
233
|
+
self._rerun_data = RerunData(
|
234
|
+
query_string=new_data.query_string,
|
235
|
+
widget_states=coalesced_states,
|
236
|
+
page_script_hash=new_data.page_script_hash,
|
237
|
+
page_name=new_data.page_name,
|
238
|
+
fragment_id_queue=fragment_id_queue,
|
239
|
+
is_fragment_scoped_rerun=new_data.is_fragment_scoped_rerun,
|
240
|
+
is_auto_rerun=new_data.is_auto_rerun,
|
241
|
+
context_info=new_data.context_info,
|
242
|
+
)
|
243
|
+
|
244
|
+
return True
|
245
|
+
|
246
|
+
# We'll never get here
|
247
|
+
raise RuntimeError(f"Unrecognized ScriptRunnerState: {self._state}")
|
248
|
+
|
249
|
+
def on_scriptrunner_yield(self) -> ScriptRequest | None:
|
250
|
+
"""Called by the ScriptRunner when it's at a yield point.
|
251
|
+
|
252
|
+
If we have no request or a RERUN request corresponding to one or more fragments
|
253
|
+
(that is not a fragment-scoped rerun), return None.
|
254
|
+
|
255
|
+
If we have a (full script or fragment-scoped) RERUN request, return the request
|
256
|
+
and set our internal state to CONTINUE.
|
257
|
+
|
258
|
+
If we have a STOP request, return the request and remain stopped.
|
259
|
+
"""
|
260
|
+
if self._state == ScriptRequestType.CONTINUE or (
|
261
|
+
self._state == ScriptRequestType.RERUN
|
262
|
+
and _fragment_run_should_not_preempt_script(
|
263
|
+
self._rerun_data.fragment_id_queue,
|
264
|
+
self._rerun_data.is_fragment_scoped_rerun,
|
265
|
+
)
|
266
|
+
):
|
267
|
+
# We avoid taking the lock in the common cases described above. If a STOP or
|
268
|
+
# preempting RERUN request is received after we've taken this code path, it
|
269
|
+
# will be handled at the next `on_scriptrunner_yield`, or when
|
270
|
+
# `on_scriptrunner_ready` is called.
|
271
|
+
return None
|
272
|
+
|
273
|
+
with self._lock:
|
274
|
+
if self._state == ScriptRequestType.RERUN:
|
275
|
+
# We already made this check in the fast-path above but need to do so
|
276
|
+
# again in case our state changed while we were waiting on the lock.
|
277
|
+
if _fragment_run_should_not_preempt_script(
|
278
|
+
self._rerun_data.fragment_id_queue,
|
279
|
+
self._rerun_data.is_fragment_scoped_rerun,
|
280
|
+
):
|
281
|
+
return None
|
282
|
+
|
283
|
+
self._state = ScriptRequestType.CONTINUE
|
284
|
+
return ScriptRequest(ScriptRequestType.RERUN, self._rerun_data)
|
285
|
+
|
286
|
+
assert self._state == ScriptRequestType.STOP
|
287
|
+
return ScriptRequest(ScriptRequestType.STOP)
|
288
|
+
|
289
|
+
def on_scriptrunner_ready(self) -> ScriptRequest:
|
290
|
+
"""Called by the ScriptRunner when it's about to run its script for
|
291
|
+
the first time, and also after its script has successfully completed.
|
292
|
+
|
293
|
+
If we have a RERUN request, return the request and set
|
294
|
+
our internal state to CONTINUE.
|
295
|
+
|
296
|
+
If we have a STOP request or no request, set our internal state
|
297
|
+
to STOP.
|
298
|
+
"""
|
299
|
+
with self._lock:
|
300
|
+
if self._state == ScriptRequestType.RERUN:
|
301
|
+
self._state = ScriptRequestType.CONTINUE
|
302
|
+
return ScriptRequest(ScriptRequestType.RERUN, self._rerun_data)
|
303
|
+
|
304
|
+
# If we don't have a rerun request, unconditionally change our
|
305
|
+
# state to STOP.
|
306
|
+
self._state = ScriptRequestType.STOP
|
307
|
+
return ScriptRequest(ScriptRequestType.STOP)
|
@@ -0,0 +1,287 @@
|
|
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 collections
|
18
|
+
import contextlib
|
19
|
+
import contextvars
|
20
|
+
import threading
|
21
|
+
from collections import Counter
|
22
|
+
from dataclasses import dataclass, field
|
23
|
+
from typing import (
|
24
|
+
TYPE_CHECKING,
|
25
|
+
Callable,
|
26
|
+
Final,
|
27
|
+
Union,
|
28
|
+
)
|
29
|
+
from urllib import parse
|
30
|
+
|
31
|
+
from typing_extensions import TypeAlias
|
32
|
+
|
33
|
+
from streamlit.errors import (
|
34
|
+
NoSessionContext,
|
35
|
+
StreamlitAPIException,
|
36
|
+
StreamlitSetPageConfigMustBeFirstCommandError,
|
37
|
+
)
|
38
|
+
from streamlit.logger import get_logger
|
39
|
+
|
40
|
+
if TYPE_CHECKING:
|
41
|
+
from pathlib import Path
|
42
|
+
|
43
|
+
from streamlit.cursor import RunningCursor
|
44
|
+
from streamlit.proto.ClientState_pb2 import ContextInfo
|
45
|
+
from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
|
46
|
+
from streamlit.proto.PageProfile_pb2 import Command
|
47
|
+
from streamlit.runtime.fragment import FragmentStorage
|
48
|
+
from streamlit.runtime.pages_manager import PagesManager
|
49
|
+
from streamlit.runtime.scriptrunner_utils.script_requests import ScriptRequests
|
50
|
+
from streamlit.runtime.state import SafeSessionState
|
51
|
+
from streamlit.runtime.uploaded_file_manager import UploadedFileManager
|
52
|
+
_LOGGER: Final = get_logger(__name__)
|
53
|
+
|
54
|
+
UserInfo: TypeAlias = dict[str, Union[str, bool, None]]
|
55
|
+
|
56
|
+
|
57
|
+
# If true, it indicates that we are in a cached function that disallows the usage of
|
58
|
+
# widgets. Using contextvars to be thread-safe.
|
59
|
+
in_cached_function: contextvars.ContextVar[bool] = contextvars.ContextVar(
|
60
|
+
"in_cached_function", default=False
|
61
|
+
)
|
62
|
+
|
63
|
+
|
64
|
+
@dataclass
|
65
|
+
class ScriptRunContext:
|
66
|
+
"""A context object that contains data for a "script run" - that is,
|
67
|
+
data that's scoped to a single ScriptRunner execution (and therefore also
|
68
|
+
scoped to a single connected "session").
|
69
|
+
|
70
|
+
ScriptRunContext is used internally by virtually every `st.foo()` function.
|
71
|
+
It is accessed only from the script thread that's created by ScriptRunner,
|
72
|
+
or from app-created helper threads that have been "attached" to the
|
73
|
+
ScriptRunContext via `add_script_run_ctx`.
|
74
|
+
|
75
|
+
Streamlit code typically retrieves the active ScriptRunContext via the
|
76
|
+
`get_script_run_ctx` function.
|
77
|
+
"""
|
78
|
+
|
79
|
+
session_id: str
|
80
|
+
_enqueue: Callable[[ForwardMsg], None]
|
81
|
+
query_string: str
|
82
|
+
session_state: SafeSessionState
|
83
|
+
uploaded_file_mgr: UploadedFileManager
|
84
|
+
main_script_path: str
|
85
|
+
user_info: UserInfo
|
86
|
+
fragment_storage: FragmentStorage
|
87
|
+
pages_manager: PagesManager
|
88
|
+
|
89
|
+
context_info: ContextInfo | None = None
|
90
|
+
gather_usage_stats: bool = False
|
91
|
+
command_tracking_deactivated: bool = False
|
92
|
+
tracked_commands: list[Command] = field(default_factory=list)
|
93
|
+
tracked_commands_counter: Counter[str] = field(default_factory=collections.Counter)
|
94
|
+
_set_page_config_allowed: bool = True
|
95
|
+
_has_script_started: bool = False
|
96
|
+
widget_ids_this_run: set[str] = field(default_factory=set)
|
97
|
+
widget_user_keys_this_run: set[str] = field(default_factory=set)
|
98
|
+
form_ids_this_run: set[str] = field(default_factory=set)
|
99
|
+
cursors: dict[int, RunningCursor] = field(default_factory=dict)
|
100
|
+
script_requests: ScriptRequests | None = None
|
101
|
+
current_fragment_id: str | None = None
|
102
|
+
fragment_ids_this_run: list[str] | None = None
|
103
|
+
new_fragment_ids: set[str] = field(default_factory=set)
|
104
|
+
_active_script_hash: str = ""
|
105
|
+
# we allow only one dialog to be open at the same time
|
106
|
+
has_dialog_opened: bool = False
|
107
|
+
|
108
|
+
# TODO(willhuang1997): Remove this variable when experimental query params are removed
|
109
|
+
_experimental_query_params_used = False
|
110
|
+
_production_query_params_used = False
|
111
|
+
|
112
|
+
@property
|
113
|
+
def page_script_hash(self):
|
114
|
+
return self.pages_manager.current_page_script_hash
|
115
|
+
|
116
|
+
@property
|
117
|
+
def active_script_hash(self):
|
118
|
+
return self._active_script_hash
|
119
|
+
|
120
|
+
@property
|
121
|
+
def main_script_parent(self) -> Path:
|
122
|
+
return self.pages_manager.main_script_parent
|
123
|
+
|
124
|
+
@contextlib.contextmanager
|
125
|
+
def run_with_active_hash(self, page_hash: str):
|
126
|
+
original_page_hash = self._active_script_hash
|
127
|
+
self._active_script_hash = page_hash
|
128
|
+
try:
|
129
|
+
yield
|
130
|
+
finally:
|
131
|
+
# in the event of any exception, ensure we set the active hash back
|
132
|
+
self._active_script_hash = original_page_hash
|
133
|
+
|
134
|
+
def set_mpa_v2_page(self, page_script_hash: str):
|
135
|
+
self._active_script_hash = self.pages_manager.main_script_hash
|
136
|
+
self.pages_manager.set_current_page_script_hash(page_script_hash)
|
137
|
+
|
138
|
+
def reset(
|
139
|
+
self,
|
140
|
+
query_string: str = "",
|
141
|
+
page_script_hash: str = "",
|
142
|
+
fragment_ids_this_run: list[str] | None = None,
|
143
|
+
context_info: ContextInfo | None = None,
|
144
|
+
) -> None:
|
145
|
+
self.cursors = {}
|
146
|
+
self.widget_ids_this_run = set()
|
147
|
+
self.widget_user_keys_this_run = set()
|
148
|
+
self.form_ids_this_run = set()
|
149
|
+
self.query_string = query_string
|
150
|
+
self.context_info = context_info
|
151
|
+
self.pages_manager.set_current_page_script_hash(page_script_hash)
|
152
|
+
self._active_script_hash = self.pages_manager.main_script_hash
|
153
|
+
# Permit set_page_config when the ScriptRunContext is reused on a rerun
|
154
|
+
self._set_page_config_allowed = True
|
155
|
+
self._has_script_started = False
|
156
|
+
self.command_tracking_deactivated: bool = False
|
157
|
+
self.tracked_commands = []
|
158
|
+
self.tracked_commands_counter = collections.Counter()
|
159
|
+
self.current_fragment_id = None
|
160
|
+
self.current_fragment_delta_path: list[int] = []
|
161
|
+
self.fragment_ids_this_run = fragment_ids_this_run
|
162
|
+
self.new_fragment_ids = set()
|
163
|
+
self.has_dialog_opened = False
|
164
|
+
in_cached_function.set(False)
|
165
|
+
|
166
|
+
parsed_query_params = parse.parse_qs(query_string, keep_blank_values=True)
|
167
|
+
with self.session_state.query_params() as qp:
|
168
|
+
qp.clear_with_no_forward_msg()
|
169
|
+
for key, val in parsed_query_params.items():
|
170
|
+
if len(val) == 0:
|
171
|
+
qp.set_with_no_forward_msg(key, val="")
|
172
|
+
elif len(val) == 1:
|
173
|
+
qp.set_with_no_forward_msg(key, val=val[-1])
|
174
|
+
else:
|
175
|
+
qp.set_with_no_forward_msg(key, val)
|
176
|
+
|
177
|
+
def on_script_start(self) -> None:
|
178
|
+
self._has_script_started = True
|
179
|
+
|
180
|
+
def enqueue(self, msg: ForwardMsg) -> None:
|
181
|
+
"""Enqueue a ForwardMsg for this context's session."""
|
182
|
+
if msg.HasField("page_config_changed") and not self._set_page_config_allowed:
|
183
|
+
raise StreamlitSetPageConfigMustBeFirstCommandError()
|
184
|
+
|
185
|
+
# We want to disallow set_page config if one of the following occurs:
|
186
|
+
# - set_page_config was called on this message
|
187
|
+
# - The script has already started and a different st call occurs (a delta)
|
188
|
+
if msg.HasField("page_config_changed") or (
|
189
|
+
msg.HasField("delta") and self._has_script_started
|
190
|
+
):
|
191
|
+
self._set_page_config_allowed = False
|
192
|
+
|
193
|
+
msg.metadata.active_script_hash = self.active_script_hash
|
194
|
+
|
195
|
+
# Pass the message up to our associated ScriptRunner.
|
196
|
+
self._enqueue(msg)
|
197
|
+
|
198
|
+
def ensure_single_query_api_used(self):
|
199
|
+
if self._experimental_query_params_used and self._production_query_params_used:
|
200
|
+
raise StreamlitAPIException(
|
201
|
+
"Using `st.query_params` together with either `st.experimental_get_query_params` "
|
202
|
+
"or `st.experimental_set_query_params` is not supported. Please convert your app "
|
203
|
+
"to only use `st.query_params`"
|
204
|
+
)
|
205
|
+
|
206
|
+
def mark_experimental_query_params_used(self):
|
207
|
+
self._experimental_query_params_used = True
|
208
|
+
self.ensure_single_query_api_used()
|
209
|
+
|
210
|
+
def mark_production_query_params_used(self):
|
211
|
+
self._production_query_params_used = True
|
212
|
+
self.ensure_single_query_api_used()
|
213
|
+
|
214
|
+
|
215
|
+
SCRIPT_RUN_CONTEXT_ATTR_NAME: Final = "streamlit_script_run_ctx"
|
216
|
+
|
217
|
+
|
218
|
+
def add_script_run_ctx(
|
219
|
+
thread: threading.Thread | None = None, ctx: ScriptRunContext | None = None
|
220
|
+
):
|
221
|
+
"""Adds the current ScriptRunContext to a newly-created thread.
|
222
|
+
|
223
|
+
This should be called from this thread's parent thread,
|
224
|
+
before the new thread starts.
|
225
|
+
|
226
|
+
Parameters
|
227
|
+
----------
|
228
|
+
thread : threading.Thread
|
229
|
+
The thread to attach the current ScriptRunContext to.
|
230
|
+
ctx : ScriptRunContext or None
|
231
|
+
The ScriptRunContext to add, or None to use the current thread's
|
232
|
+
ScriptRunContext.
|
233
|
+
|
234
|
+
Returns
|
235
|
+
-------
|
236
|
+
threading.Thread
|
237
|
+
The same thread that was passed in, for chaining.
|
238
|
+
|
239
|
+
"""
|
240
|
+
if thread is None:
|
241
|
+
thread = threading.current_thread()
|
242
|
+
if ctx is None:
|
243
|
+
ctx = get_script_run_ctx()
|
244
|
+
if ctx is not None:
|
245
|
+
setattr(thread, SCRIPT_RUN_CONTEXT_ATTR_NAME, ctx)
|
246
|
+
return thread
|
247
|
+
|
248
|
+
|
249
|
+
def get_script_run_ctx(suppress_warning: bool = False) -> ScriptRunContext | None:
|
250
|
+
"""
|
251
|
+
Parameters
|
252
|
+
----------
|
253
|
+
suppress_warning : bool
|
254
|
+
If True, don't log a warning if there's no ScriptRunContext.
|
255
|
+
Returns
|
256
|
+
-------
|
257
|
+
ScriptRunContext | None
|
258
|
+
The current thread's ScriptRunContext, or None if it doesn't have one.
|
259
|
+
|
260
|
+
"""
|
261
|
+
thread = threading.current_thread()
|
262
|
+
ctx: ScriptRunContext | None = getattr(thread, SCRIPT_RUN_CONTEXT_ATTR_NAME, None)
|
263
|
+
if ctx is None and not suppress_warning:
|
264
|
+
# Only warn about a missing ScriptRunContext if suppress_warning is False, and
|
265
|
+
# we were started via `streamlit run`. Otherwise, the user is likely running a
|
266
|
+
# script "bare", and doesn't need to be warned about streamlit
|
267
|
+
# bits that are irrelevant when not connected to a session.
|
268
|
+
_LOGGER.warning(
|
269
|
+
"Thread '%s': missing ScriptRunContext! This warning can be ignored when "
|
270
|
+
"running in bare mode.",
|
271
|
+
thread.name,
|
272
|
+
)
|
273
|
+
|
274
|
+
return ctx
|
275
|
+
|
276
|
+
|
277
|
+
def enqueue_message(msg: ForwardMsg) -> None:
|
278
|
+
"""Enqueues a ForwardMsg proto to send to the app."""
|
279
|
+
ctx = get_script_run_ctx()
|
280
|
+
|
281
|
+
if ctx is None:
|
282
|
+
raise NoSessionContext()
|
283
|
+
|
284
|
+
if ctx.current_fragment_id and msg.WhichOneof("type") == "delta":
|
285
|
+
msg.delta.fragment_id = ctx.current_fragment_id
|
286
|
+
|
287
|
+
ctx.enqueue(msg)
|