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,477 @@
|
|
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 contextlib
|
18
|
+
import inspect
|
19
|
+
from abc import abstractmethod
|
20
|
+
from copy import deepcopy
|
21
|
+
from functools import wraps
|
22
|
+
from typing import TYPE_CHECKING, Any, Callable, Protocol, TypeVar, overload
|
23
|
+
|
24
|
+
from streamlit.deprecation_util import (
|
25
|
+
make_deprecated_name_warning,
|
26
|
+
show_deprecation_warning,
|
27
|
+
)
|
28
|
+
from streamlit.error_util import handle_uncaught_app_exception
|
29
|
+
from streamlit.errors import FragmentHandledException, FragmentStorageKeyError
|
30
|
+
from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
|
31
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
32
|
+
from streamlit.runtime.scriptrunner_utils.exceptions import (
|
33
|
+
RerunException,
|
34
|
+
StopException,
|
35
|
+
)
|
36
|
+
from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
|
37
|
+
from streamlit.time_util import time_to_seconds
|
38
|
+
from streamlit.util import calc_md5
|
39
|
+
|
40
|
+
if TYPE_CHECKING:
|
41
|
+
from datetime import timedelta
|
42
|
+
|
43
|
+
|
44
|
+
F = TypeVar("F", bound=Callable[..., Any])
|
45
|
+
Fragment = Callable[[], Any]
|
46
|
+
|
47
|
+
|
48
|
+
class FragmentStorage(Protocol):
|
49
|
+
"""A key-value store for Fragments. Used to implement the @st.fragment decorator.
|
50
|
+
|
51
|
+
We intentionally define this as its own protocol despite how generic it appears to
|
52
|
+
be at first glance. The reason why is that, in any case where fragments aren't just
|
53
|
+
stored as Python closures in memory, storing and retrieving Fragments will generally
|
54
|
+
involve serializing and deserializing function bytecode, which is a tricky aspect
|
55
|
+
to implementing FragmentStorages that won't generally appear with our other *Storage
|
56
|
+
protocols.
|
57
|
+
"""
|
58
|
+
|
59
|
+
# Weirdly, we have to define this above the `set` method, or mypy gets it confused
|
60
|
+
# with the `set` type of `new_fragments_ids`.
|
61
|
+
@abstractmethod
|
62
|
+
def clear(self, new_fragment_ids: set[str] | None = None) -> None:
|
63
|
+
"""Remove all fragments saved in this FragmentStorage unless listed in
|
64
|
+
new_fragment_ids."""
|
65
|
+
raise NotImplementedError
|
66
|
+
|
67
|
+
@abstractmethod
|
68
|
+
def get(self, key: str) -> Fragment:
|
69
|
+
"""Returns the stored fragment for the given key."""
|
70
|
+
raise NotImplementedError
|
71
|
+
|
72
|
+
@abstractmethod
|
73
|
+
def set(self, key: str, value: Fragment) -> None:
|
74
|
+
"""Saves a fragment under the given key."""
|
75
|
+
raise NotImplementedError
|
76
|
+
|
77
|
+
@abstractmethod
|
78
|
+
def delete(self, key: str) -> None:
|
79
|
+
"""Delete the fragment corresponding to the given key."""
|
80
|
+
raise NotImplementedError
|
81
|
+
|
82
|
+
@abstractmethod
|
83
|
+
def contains(self, key: str) -> bool:
|
84
|
+
"""Return whether the given key is present in this FragmentStorage."""
|
85
|
+
raise NotImplementedError
|
86
|
+
|
87
|
+
|
88
|
+
# NOTE: Ideally, we'd like to add a MemoryFragmentStorageStatProvider implementation to
|
89
|
+
# keep track of memory usage due to fragments, but doing something like this ends up
|
90
|
+
# being difficult in practice as the memory usage of a closure is hard to measure (the
|
91
|
+
# vendored implementation of pympler.asizeof that we use elsewhere is unable to measure
|
92
|
+
# the size of a function).
|
93
|
+
class MemoryFragmentStorage(FragmentStorage):
|
94
|
+
"""A simple, memory-backed implementation of FragmentStorage.
|
95
|
+
|
96
|
+
MemoryFragmentStorage is just a wrapper around a plain Python dict that complies with
|
97
|
+
the FragmentStorage protocol.
|
98
|
+
"""
|
99
|
+
|
100
|
+
def __init__(self) -> None:
|
101
|
+
self._fragments: dict[str, Fragment] = {}
|
102
|
+
|
103
|
+
# Weirdly, we have to define this above the `set` method, or mypy gets it confused
|
104
|
+
# with the `set` type of `new_fragments_ids`.
|
105
|
+
def clear(self, new_fragment_ids: set[str] | None = None) -> None:
|
106
|
+
if new_fragment_ids is None:
|
107
|
+
new_fragment_ids = set()
|
108
|
+
|
109
|
+
fragment_ids = list(self._fragments.keys())
|
110
|
+
|
111
|
+
for fid in fragment_ids:
|
112
|
+
if fid not in new_fragment_ids:
|
113
|
+
del self._fragments[fid]
|
114
|
+
|
115
|
+
def get(self, key: str) -> Fragment:
|
116
|
+
try:
|
117
|
+
return self._fragments[key]
|
118
|
+
except KeyError as e:
|
119
|
+
raise FragmentStorageKeyError(str(e))
|
120
|
+
|
121
|
+
def set(self, key: str, value: Fragment) -> None:
|
122
|
+
self._fragments[key] = value
|
123
|
+
|
124
|
+
def delete(self, key: str) -> None:
|
125
|
+
try:
|
126
|
+
del self._fragments[key]
|
127
|
+
except KeyError as e:
|
128
|
+
raise FragmentStorageKeyError(str(e))
|
129
|
+
|
130
|
+
def contains(self, key: str) -> bool:
|
131
|
+
return key in self._fragments
|
132
|
+
|
133
|
+
|
134
|
+
def _fragment(
|
135
|
+
func: F | None = None,
|
136
|
+
*,
|
137
|
+
run_every: int | float | timedelta | str | None = None,
|
138
|
+
additional_hash_info: str = "",
|
139
|
+
should_show_deprecation_warning: bool = False,
|
140
|
+
) -> Callable[[F], F] | F:
|
141
|
+
"""Contains the actual fragment logic.
|
142
|
+
|
143
|
+
This function should be used by our internal functions that use fragments
|
144
|
+
under-the-hood, so that fragment metrics are not tracked for those elements
|
145
|
+
(note that the @gather_metrics annotation is only on the publicly exposed function)
|
146
|
+
"""
|
147
|
+
|
148
|
+
if func is None:
|
149
|
+
# Support passing the params via function decorator
|
150
|
+
def wrapper(f: F) -> F:
|
151
|
+
return fragment(
|
152
|
+
func=f,
|
153
|
+
run_every=run_every,
|
154
|
+
)
|
155
|
+
|
156
|
+
return wrapper
|
157
|
+
else:
|
158
|
+
non_optional_func = func
|
159
|
+
|
160
|
+
@wraps(non_optional_func)
|
161
|
+
def wrap(*args, **kwargs):
|
162
|
+
from streamlit.delta_generator_singletons import context_dg_stack
|
163
|
+
|
164
|
+
ctx = get_script_run_ctx()
|
165
|
+
if ctx is None:
|
166
|
+
return None
|
167
|
+
|
168
|
+
cursors_snapshot = deepcopy(ctx.cursors)
|
169
|
+
dg_stack_snapshot = deepcopy(context_dg_stack.get())
|
170
|
+
fragment_id = calc_md5(
|
171
|
+
f"{non_optional_func.__module__}.{non_optional_func.__qualname__}{dg_stack_snapshot[-1]._get_delta_path_str()}{additional_hash_info}"
|
172
|
+
)
|
173
|
+
|
174
|
+
# We intentionally want to capture the active script hash here to ensure
|
175
|
+
# that the fragment is associated with the correct script running.
|
176
|
+
initialized_active_script_hash = ctx.active_script_hash
|
177
|
+
|
178
|
+
def wrapped_fragment():
|
179
|
+
import streamlit as st
|
180
|
+
|
181
|
+
if should_show_deprecation_warning:
|
182
|
+
show_deprecation_warning(
|
183
|
+
make_deprecated_name_warning(
|
184
|
+
"experimental_fragment",
|
185
|
+
"fragment",
|
186
|
+
"2025-01-01",
|
187
|
+
)
|
188
|
+
)
|
189
|
+
|
190
|
+
# NOTE: We need to call get_script_run_ctx here again and can't just use the
|
191
|
+
# value of ctx from above captured by the closure because subsequent
|
192
|
+
# fragment runs will generally run in a new script run, thus we'll have a
|
193
|
+
# new ctx.
|
194
|
+
ctx = get_script_run_ctx(suppress_warning=True)
|
195
|
+
assert ctx is not None
|
196
|
+
|
197
|
+
if ctx.fragment_ids_this_run:
|
198
|
+
# This script run is a run of one or more fragments. We restore the
|
199
|
+
# state of ctx.cursors and dg_stack to the snapshots we took when this
|
200
|
+
# fragment was declared.
|
201
|
+
ctx.cursors = deepcopy(cursors_snapshot)
|
202
|
+
context_dg_stack.set(deepcopy(dg_stack_snapshot))
|
203
|
+
|
204
|
+
# Always add the fragment id to new_fragment_ids. For full app runs
|
205
|
+
# we need to add them anyways and for fragment runs we add them
|
206
|
+
# in case the to-be-executed fragment id was cleared from the storage
|
207
|
+
# by the full app run.
|
208
|
+
ctx.new_fragment_ids.add(fragment_id)
|
209
|
+
# Set ctx.current_fragment_id so that elements corresponding to this
|
210
|
+
# fragment get tagged with the appropriate ID. ctx.current_fragment_id gets
|
211
|
+
# reset after the fragment function finishes running to either return to the
|
212
|
+
# script (outside of any fragments) or to the outer fragment this one is
|
213
|
+
# nested in.
|
214
|
+
prev_fragment_id = ctx.current_fragment_id
|
215
|
+
ctx.current_fragment_id = fragment_id
|
216
|
+
|
217
|
+
try:
|
218
|
+
# Make sure we set the active script hash to the same value
|
219
|
+
# for the fragment run as when defined upon initialization
|
220
|
+
# This ensures that elements (especially widgets) are tied
|
221
|
+
# to a consistent active script hash
|
222
|
+
active_hash_context = (
|
223
|
+
ctx.run_with_active_hash(initialized_active_script_hash)
|
224
|
+
if initialized_active_script_hash != ctx.active_script_hash
|
225
|
+
else contextlib.nullcontext()
|
226
|
+
)
|
227
|
+
result = None
|
228
|
+
with active_hash_context:
|
229
|
+
with st.container():
|
230
|
+
try:
|
231
|
+
# use dg_stack instead of active_dg to have correct copy
|
232
|
+
# during execution (otherwise we can run into concurrency
|
233
|
+
# issues with multiple fragments). Use dg_stack because we
|
234
|
+
# just entered a container and [:-1] of the delta path
|
235
|
+
# because thats the prefix of the fragment,
|
236
|
+
# e.g. [0, 3, 0] -> [0, 3].
|
237
|
+
# All fragment elements start with [0, 3].
|
238
|
+
active_dg = context_dg_stack.get()[-1]
|
239
|
+
ctx.current_fragment_delta_path = (
|
240
|
+
active_dg._cursor.delta_path
|
241
|
+
if active_dg._cursor
|
242
|
+
else []
|
243
|
+
)[:-1]
|
244
|
+
result = non_optional_func(*args, **kwargs)
|
245
|
+
except (
|
246
|
+
RerunException,
|
247
|
+
StopException,
|
248
|
+
) as e:
|
249
|
+
# The wrapped_fragment function is executed
|
250
|
+
# inside of a exec_func_with_error_handling call, so
|
251
|
+
# there is a correct handler for these exceptions.
|
252
|
+
raise e
|
253
|
+
except Exception as e:
|
254
|
+
# render error here so that the delta path is correct
|
255
|
+
# for full app runs, the error will be displayed by the
|
256
|
+
# main code handler
|
257
|
+
# if not is_full_app_run:
|
258
|
+
handle_uncaught_app_exception(e)
|
259
|
+
# raise here again in case we are in full app execution
|
260
|
+
# and some flags have to be set
|
261
|
+
raise FragmentHandledException(e)
|
262
|
+
return result
|
263
|
+
finally:
|
264
|
+
ctx.current_fragment_id = prev_fragment_id
|
265
|
+
ctx.current_fragment_delta_path = []
|
266
|
+
|
267
|
+
ctx.fragment_storage.set(fragment_id, wrapped_fragment)
|
268
|
+
|
269
|
+
if run_every:
|
270
|
+
msg = ForwardMsg()
|
271
|
+
msg.auto_rerun.interval = time_to_seconds(run_every)
|
272
|
+
msg.auto_rerun.fragment_id = fragment_id
|
273
|
+
ctx.enqueue(msg)
|
274
|
+
|
275
|
+
# Immediate execute the wrapped fragment since we are in a full app run
|
276
|
+
return wrapped_fragment()
|
277
|
+
|
278
|
+
with contextlib.suppress(AttributeError):
|
279
|
+
# Make this a well-behaved decorator by preserving important function
|
280
|
+
# attributes.
|
281
|
+
wrap.__dict__.update(non_optional_func.__dict__)
|
282
|
+
wrap.__signature__ = inspect.signature(non_optional_func) # type: ignore
|
283
|
+
|
284
|
+
return wrap
|
285
|
+
|
286
|
+
|
287
|
+
@overload
|
288
|
+
def fragment(
|
289
|
+
func: F,
|
290
|
+
*,
|
291
|
+
run_every: int | float | timedelta | str | None = None,
|
292
|
+
) -> F: ...
|
293
|
+
|
294
|
+
|
295
|
+
# Support being able to pass parameters to this decorator (that is, being able to write
|
296
|
+
# `@fragment(run_every=5.0)`).
|
297
|
+
@overload
|
298
|
+
def fragment(
|
299
|
+
func: None = None,
|
300
|
+
*,
|
301
|
+
run_every: int | float | timedelta | str | None = None,
|
302
|
+
) -> Callable[[F], F]: ...
|
303
|
+
|
304
|
+
|
305
|
+
@gather_metrics("fragment")
|
306
|
+
def fragment(
|
307
|
+
func: F | None = None,
|
308
|
+
*,
|
309
|
+
run_every: int | float | timedelta | str | None = None,
|
310
|
+
) -> Callable[[F], F] | F:
|
311
|
+
"""Decorator to turn a function into a fragment which can rerun independently\
|
312
|
+
of the full app.
|
313
|
+
|
314
|
+
When a user interacts with an input widget created inside a fragment,
|
315
|
+
Streamlit only reruns the fragment instead of the full app. If
|
316
|
+
``run_every`` is set, Streamlit will also rerun the fragment at the
|
317
|
+
specified interval while the session is active, even if the user is not
|
318
|
+
interacting with your app.
|
319
|
+
|
320
|
+
To trigger an app rerun from inside a fragment, call ``st.rerun()``
|
321
|
+
directly. To trigger a fragment rerun from within itself, call
|
322
|
+
``st.rerun(scope="fragment")``. Any values from the fragment that need to
|
323
|
+
be accessed from the wider app should generally be stored in Session State.
|
324
|
+
|
325
|
+
When Streamlit element commands are called directly in a fragment, the
|
326
|
+
elements are cleared and redrawn on each fragment rerun, just like all
|
327
|
+
elements are redrawn on each app rerun. The rest of the app is persisted
|
328
|
+
during a fragment rerun. When a fragment renders elements into externally
|
329
|
+
created containers, the elements will not be cleared with each fragment
|
330
|
+
rerun. Instead, elements will accumulate in those containers with each
|
331
|
+
fragment rerun, until the next app rerun.
|
332
|
+
|
333
|
+
Calling ``st.sidebar`` in a fragment is not supported. To write elements to
|
334
|
+
the sidebar with a fragment, call your fragment function inside a
|
335
|
+
``with st.sidebar`` context manager.
|
336
|
+
|
337
|
+
Fragment code can interact with Session State, imported modules, and
|
338
|
+
other Streamlit elements created outside the fragment. Note that these
|
339
|
+
interactions are additive across multiple fragment reruns. You are
|
340
|
+
responsible for handling any side effects of that behavior.
|
341
|
+
|
342
|
+
.. warning::
|
343
|
+
|
344
|
+
- Fragments can only contain widgets in their main body. Fragments
|
345
|
+
can't render widgets to externally created containers.
|
346
|
+
|
347
|
+
Parameters
|
348
|
+
----------
|
349
|
+
func: callable
|
350
|
+
The function to turn into a fragment.
|
351
|
+
|
352
|
+
run_every: int, float, timedelta, str, or None
|
353
|
+
The time interval between automatic fragment reruns. This can be one of
|
354
|
+
the following:
|
355
|
+
|
356
|
+
- ``None`` (default).
|
357
|
+
- An ``int`` or ``float`` specifying the interval in seconds.
|
358
|
+
- A string specifying the time in a format supported by `Pandas'
|
359
|
+
Timedelta constructor <https://pandas.pydata.org/docs/reference/api/pandas.Timedelta.html>`_,
|
360
|
+
e.g. ``"1d"``, ``"1.5 days"``, or ``"1h23s"``.
|
361
|
+
- A ``timedelta`` object from `Python's built-in datetime library
|
362
|
+
<https://docs.python.org/3/library/datetime.html#timedelta-objects>`_,
|
363
|
+
e.g. ``timedelta(days=1)``.
|
364
|
+
|
365
|
+
If ``run_every`` is ``None``, the fragment will only rerun from
|
366
|
+
user-triggered events.
|
367
|
+
|
368
|
+
Examples
|
369
|
+
--------
|
370
|
+
The following example demonstrates basic usage of
|
371
|
+
``@st.fragment``. As an analogy, "inflating balloons" is a slow process that happens
|
372
|
+
outside of the fragment. "Releasing balloons" is a quick process that happens inside
|
373
|
+
of the fragment.
|
374
|
+
|
375
|
+
>>> import streamlit as st
|
376
|
+
>>> import time
|
377
|
+
>>>
|
378
|
+
>>> @st.fragment
|
379
|
+
>>> def release_the_balloons():
|
380
|
+
>>> st.button("Release the balloons", help="Fragment rerun")
|
381
|
+
>>> st.balloons()
|
382
|
+
>>>
|
383
|
+
>>> with st.spinner("Inflating balloons..."):
|
384
|
+
>>> time.sleep(5)
|
385
|
+
>>> release_the_balloons()
|
386
|
+
>>> st.button("Inflate more balloons", help="Full rerun")
|
387
|
+
|
388
|
+
.. output::
|
389
|
+
https://doc-fragment-balloons.streamlit.app/
|
390
|
+
height: 220px
|
391
|
+
|
392
|
+
This next example demonstrates how elements both inside and outside of a
|
393
|
+
fragement update with each app or fragment rerun. In this app, clicking
|
394
|
+
"Rerun full app" will increment both counters and update all values
|
395
|
+
displayed in the app. In contrast, clicking "Rerun fragment" will only
|
396
|
+
increment the counter within the fragment. In this case, the ``st.write``
|
397
|
+
command inside the fragment will update the app's frontend, but the two
|
398
|
+
``st.write`` commands outside the fragment will not update the frontend.
|
399
|
+
|
400
|
+
>>> import streamlit as st
|
401
|
+
>>>
|
402
|
+
>>> if "app_runs" not in st.session_state:
|
403
|
+
>>> st.session_state.app_runs = 0
|
404
|
+
>>> st.session_state.fragment_runs = 0
|
405
|
+
>>>
|
406
|
+
>>> @st.fragment
|
407
|
+
>>> def my_fragment():
|
408
|
+
>>> st.session_state.fragment_runs += 1
|
409
|
+
>>> st.button("Rerun fragment")
|
410
|
+
>>> st.write(f"Fragment says it ran {st.session_state.fragment_runs} times.")
|
411
|
+
>>>
|
412
|
+
>>> st.session_state.app_runs += 1
|
413
|
+
>>> my_fragment()
|
414
|
+
>>> st.button("Rerun full app")
|
415
|
+
>>> st.write(f"Full app says it ran {st.session_state.app_runs} times.")
|
416
|
+
>>> st.write(f"Full app sees that fragment ran {st.session_state.fragment_runs} times.")
|
417
|
+
|
418
|
+
.. output::
|
419
|
+
https://doc-fragment.streamlit.app/
|
420
|
+
height: 400px
|
421
|
+
|
422
|
+
You can also trigger an app rerun from inside a fragment by calling
|
423
|
+
``st.rerun``.
|
424
|
+
|
425
|
+
>>> import streamlit as st
|
426
|
+
>>>
|
427
|
+
>>> if "clicks" not in st.session_state:
|
428
|
+
>>> st.session_state.clicks = 0
|
429
|
+
>>>
|
430
|
+
>>> @st.fragment
|
431
|
+
>>> def count_to_five():
|
432
|
+
>>> if st.button("Plus one!"):
|
433
|
+
>>> st.session_state.clicks += 1
|
434
|
+
>>> if st.session_state.clicks % 5 == 0:
|
435
|
+
>>> st.rerun()
|
436
|
+
>>> return
|
437
|
+
>>>
|
438
|
+
>>> count_to_five()
|
439
|
+
>>> st.header(f"Multiples of five clicks: {st.session_state.clicks // 5}")
|
440
|
+
>>>
|
441
|
+
>>> if st.button("Check click count"):
|
442
|
+
>>> st.toast(f"## Total clicks: {st.session_state.clicks}")
|
443
|
+
|
444
|
+
.. output::
|
445
|
+
https://doc-fragment-rerun.streamlit.app/
|
446
|
+
height: 400px
|
447
|
+
|
448
|
+
"""
|
449
|
+
return _fragment(func, run_every=run_every)
|
450
|
+
|
451
|
+
|
452
|
+
@overload
|
453
|
+
def experimental_fragment(
|
454
|
+
func: F,
|
455
|
+
*,
|
456
|
+
run_every: int | float | timedelta | str | None = None,
|
457
|
+
) -> F: ...
|
458
|
+
|
459
|
+
|
460
|
+
# Support being able to pass parameters to this decorator (that is, being able to write
|
461
|
+
# `@fragment(run_every=5.0)`).
|
462
|
+
@overload
|
463
|
+
def experimental_fragment(
|
464
|
+
func: None = None,
|
465
|
+
*,
|
466
|
+
run_every: int | float | timedelta | str | None = None,
|
467
|
+
) -> Callable[[F], F]: ...
|
468
|
+
|
469
|
+
|
470
|
+
@gather_metrics("experimental_fragment")
|
471
|
+
def experimental_fragment(
|
472
|
+
func: F | None = None,
|
473
|
+
*,
|
474
|
+
run_every: int | float | timedelta | str | None = None,
|
475
|
+
) -> Callable[[F], F] | F:
|
476
|
+
"""Deprecated alias for @st.fragment. See the docstring for the decorator's new name."""
|
477
|
+
return _fragment(func, run_every=run_every, should_show_deprecation_warning=True)
|