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,56 @@
|
|
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
|
+
"""Column types that can be configured via the ``column_config`` parameter of ``st.dataframe`` and ``st.data_editor``."""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
__all__ = [
|
20
|
+
"AreaChartColumn",
|
21
|
+
"Column",
|
22
|
+
"TextColumn",
|
23
|
+
"NumberColumn",
|
24
|
+
"BarChartColumn",
|
25
|
+
"CheckboxColumn",
|
26
|
+
"DatetimeColumn",
|
27
|
+
"ImageColumn",
|
28
|
+
"SelectboxColumn",
|
29
|
+
"ProgressColumn",
|
30
|
+
"LinkColumn",
|
31
|
+
"LineChartColumn",
|
32
|
+
"ListColumn",
|
33
|
+
"DateColumn",
|
34
|
+
"TimeColumn",
|
35
|
+
"JsonColumn",
|
36
|
+
]
|
37
|
+
|
38
|
+
|
39
|
+
from streamlit.elements.lib.column_types import (
|
40
|
+
AreaChartColumn,
|
41
|
+
BarChartColumn,
|
42
|
+
CheckboxColumn,
|
43
|
+
Column,
|
44
|
+
DateColumn,
|
45
|
+
DatetimeColumn,
|
46
|
+
ImageColumn,
|
47
|
+
JsonColumn,
|
48
|
+
LineChartColumn,
|
49
|
+
LinkColumn,
|
50
|
+
ListColumn,
|
51
|
+
NumberColumn,
|
52
|
+
ProgressColumn,
|
53
|
+
SelectboxColumn,
|
54
|
+
TextColumn,
|
55
|
+
TimeColumn,
|
56
|
+
)
|
@@ -0,0 +1,13 @@
|
|
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.
|
@@ -0,0 +1,126 @@
|
|
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 ast
|
18
|
+
import contextlib
|
19
|
+
import re
|
20
|
+
import textwrap
|
21
|
+
import traceback
|
22
|
+
from typing import TYPE_CHECKING, Any
|
23
|
+
|
24
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
25
|
+
|
26
|
+
if TYPE_CHECKING:
|
27
|
+
from collections.abc import Iterable
|
28
|
+
|
29
|
+
_SPACES_RE = re.compile("\\s*")
|
30
|
+
_EMPTY_LINE_RE = re.compile("\\s*\n")
|
31
|
+
|
32
|
+
|
33
|
+
@gather_metrics("echo")
|
34
|
+
@contextlib.contextmanager
|
35
|
+
def echo(code_location="above"):
|
36
|
+
"""Use in a `with` block to draw some code on the app, then execute it.
|
37
|
+
|
38
|
+
Parameters
|
39
|
+
----------
|
40
|
+
code_location : "above" or "below"
|
41
|
+
Whether to show the echoed code before or after the results of the
|
42
|
+
executed code block.
|
43
|
+
|
44
|
+
Example
|
45
|
+
-------
|
46
|
+
>>> import streamlit as st
|
47
|
+
>>>
|
48
|
+
>>> with st.echo():
|
49
|
+
>>> st.write('This code will be printed')
|
50
|
+
|
51
|
+
"""
|
52
|
+
from streamlit import code, empty, source_util, warning
|
53
|
+
|
54
|
+
if code_location == "below":
|
55
|
+
show_code = code
|
56
|
+
show_warning = warning
|
57
|
+
else:
|
58
|
+
placeholder = empty()
|
59
|
+
show_code = placeholder.code
|
60
|
+
show_warning = placeholder.warning
|
61
|
+
|
62
|
+
try:
|
63
|
+
# Get stack frame *before* running the echoed code. The frame's
|
64
|
+
# line number will point to the `st.echo` statement we're running.
|
65
|
+
frame = traceback.extract_stack()[-3]
|
66
|
+
filename, start_line = frame.filename, frame.lineno or 0
|
67
|
+
|
68
|
+
# Read the file containing the source code of the echoed statement.
|
69
|
+
with source_util.open_python_file(filename) as source_file:
|
70
|
+
source_lines = source_file.readlines()
|
71
|
+
|
72
|
+
# Use ast to parse the Python file and find the code block to display
|
73
|
+
root_node = ast.parse("".join(source_lines))
|
74
|
+
line_to_node_map: dict[int, Any] = {}
|
75
|
+
|
76
|
+
def collect_body_statements(node: ast.AST) -> None:
|
77
|
+
if not hasattr(node, "body"):
|
78
|
+
return
|
79
|
+
for child in ast.iter_child_nodes(node):
|
80
|
+
# If child doesn't have "lineno", it is not something we could display
|
81
|
+
if hasattr(child, "lineno"):
|
82
|
+
line_to_node_map[child.lineno] = child
|
83
|
+
collect_body_statements(child)
|
84
|
+
|
85
|
+
collect_body_statements(root_node)
|
86
|
+
|
87
|
+
# In AST module the lineno (line numbers) are 1-indexed,
|
88
|
+
# so we decrease it by 1 to lookup in source lines list
|
89
|
+
echo_block_start_line = line_to_node_map[start_line].body[0].lineno - 1
|
90
|
+
echo_block_end_line = line_to_node_map[start_line].end_lineno
|
91
|
+
lines_to_display = source_lines[echo_block_start_line:echo_block_end_line]
|
92
|
+
|
93
|
+
code_string = textwrap.dedent("".join(lines_to_display))
|
94
|
+
|
95
|
+
# Run the echoed code...
|
96
|
+
yield
|
97
|
+
|
98
|
+
# And draw the code string to the app!
|
99
|
+
show_code(code_string, "python")
|
100
|
+
|
101
|
+
except FileNotFoundError as err:
|
102
|
+
show_warning("Unable to display code. %s" % err)
|
103
|
+
|
104
|
+
|
105
|
+
def _get_initial_indent(lines: Iterable[str]) -> int:
|
106
|
+
"""Return the indent of the first non-empty line in the list.
|
107
|
+
If all lines are empty, return 0.
|
108
|
+
"""
|
109
|
+
for line in lines:
|
110
|
+
indent = _get_indent(line)
|
111
|
+
if indent is not None:
|
112
|
+
return indent
|
113
|
+
|
114
|
+
return 0
|
115
|
+
|
116
|
+
|
117
|
+
def _get_indent(line: str) -> int | None:
|
118
|
+
"""Get the number of whitespaces at the beginning of the given line.
|
119
|
+
If the line is empty, or if it contains just whitespace and a newline,
|
120
|
+
return None.
|
121
|
+
"""
|
122
|
+
if _EMPTY_LINE_RE.match(line) is not None:
|
123
|
+
return None
|
124
|
+
|
125
|
+
match = _SPACES_RE.match(line)
|
126
|
+
return match.end() if match is not None else 0
|
@@ -0,0 +1,238 @@
|
|
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 os
|
18
|
+
from itertools import dropwhile
|
19
|
+
from pathlib import Path
|
20
|
+
from typing import Literal, NoReturn
|
21
|
+
|
22
|
+
import streamlit as st
|
23
|
+
from streamlit.errors import NoSessionContext, StreamlitAPIException
|
24
|
+
from streamlit.file_util import get_main_script_directory, normalize_path_join
|
25
|
+
from streamlit.navigation.page import StreamlitPage
|
26
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
27
|
+
from streamlit.runtime.scriptrunner import (
|
28
|
+
RerunData,
|
29
|
+
ScriptRunContext,
|
30
|
+
get_script_run_ctx,
|
31
|
+
)
|
32
|
+
|
33
|
+
|
34
|
+
@gather_metrics("stop")
|
35
|
+
def stop() -> NoReturn: # type: ignore[misc]
|
36
|
+
"""Stops execution immediately.
|
37
|
+
|
38
|
+
Streamlit will not run any statements after `st.stop()`.
|
39
|
+
We recommend rendering a message to explain why the script has stopped.
|
40
|
+
|
41
|
+
Example
|
42
|
+
-------
|
43
|
+
>>> import streamlit as st
|
44
|
+
>>>
|
45
|
+
>>> name = st.text_input("Name")
|
46
|
+
>>> if not name:
|
47
|
+
>>> st.warning('Please input a name.')
|
48
|
+
>>> st.stop()
|
49
|
+
>>> st.success("Thank you for inputting a name.")
|
50
|
+
|
51
|
+
"""
|
52
|
+
ctx = get_script_run_ctx()
|
53
|
+
|
54
|
+
if ctx and ctx.script_requests:
|
55
|
+
ctx.script_requests.request_stop()
|
56
|
+
# Force a yield point so the runner can stop
|
57
|
+
st.empty()
|
58
|
+
|
59
|
+
|
60
|
+
def _new_fragment_id_queue(
|
61
|
+
ctx: ScriptRunContext,
|
62
|
+
scope: Literal["app", "fragment"],
|
63
|
+
) -> list[str]:
|
64
|
+
if scope == "app":
|
65
|
+
return []
|
66
|
+
|
67
|
+
else: # scope == "fragment"
|
68
|
+
curr_queue = ctx.fragment_ids_this_run
|
69
|
+
|
70
|
+
# If st.rerun(scope="fragment") is called during a full script run, we raise an
|
71
|
+
# exception. This occurs, of course, if st.rerun(scope="fragment") is called
|
72
|
+
# outside of a fragment, but it somewhat surprisingly occurs if it gets called
|
73
|
+
# from within a fragment during a run of the full script. While this behvior may
|
74
|
+
# be surprising, it seems somewhat reasonable given that the correct behavior of
|
75
|
+
# calling st.rerun(scope="fragment") in this situation is unclear to me:
|
76
|
+
# * Rerunning just the fragment immediately may cause weirdness down the line
|
77
|
+
# as any part of the script that occurs after the fragment will not be
|
78
|
+
# executed.
|
79
|
+
# * Waiting until the full script run completes before rerunning the fragment
|
80
|
+
# seems odd (even if we normally do this before running a fragment not
|
81
|
+
# triggered by st.rerun()) because it defers the execution of st.rerun().
|
82
|
+
# * Rerunning the full app feels incorrect as we're seemingly ignoring the
|
83
|
+
# `scope` argument.
|
84
|
+
# With these issues and given that it seems pretty unnatural to have a
|
85
|
+
# fragment-scoped rerun happen during a full script run to begin with, it seems
|
86
|
+
# reasonable to just disallow this completely for now.
|
87
|
+
if not curr_queue:
|
88
|
+
raise StreamlitAPIException(
|
89
|
+
'scope="fragment" can only be specified from `@st.fragment`-decorated '
|
90
|
+
"functions during fragment reruns."
|
91
|
+
)
|
92
|
+
|
93
|
+
assert (
|
94
|
+
new_queue := list(
|
95
|
+
dropwhile(lambda x: x != ctx.current_fragment_id, curr_queue)
|
96
|
+
)
|
97
|
+
), (
|
98
|
+
"Could not find current_fragment_id in fragment_id_queue. This should never happen."
|
99
|
+
)
|
100
|
+
|
101
|
+
return new_queue
|
102
|
+
|
103
|
+
|
104
|
+
@gather_metrics("rerun")
|
105
|
+
def rerun( # type: ignore[misc]
|
106
|
+
*, # The scope argument can only be passed via keyword.
|
107
|
+
scope: Literal["app", "fragment"] = "app",
|
108
|
+
) -> NoReturn:
|
109
|
+
"""Rerun the script immediately.
|
110
|
+
|
111
|
+
When ``st.rerun()`` is called, Streamlit halts the current script run and
|
112
|
+
executes no further statements. Streamlit immediately queues the script to
|
113
|
+
rerun.
|
114
|
+
|
115
|
+
When using ``st.rerun`` in a fragment, you can scope the rerun to the
|
116
|
+
fragment. However, if a fragment is running as part of a full-app rerun,
|
117
|
+
a fragment-scoped rerun is not allowed.
|
118
|
+
|
119
|
+
Parameters
|
120
|
+
----------
|
121
|
+
scope : "app" or "fragment"
|
122
|
+
Specifies what part of the app should rerun. If ``scope`` is ``"app"``
|
123
|
+
(default), the full app reruns. If ``scope`` is ``"fragment"``,
|
124
|
+
Streamlit only reruns the fragment from which this command is called.
|
125
|
+
|
126
|
+
Setting ``scope="fragment"`` is only valid inside a fragment during a
|
127
|
+
fragment rerun. If ``st.rerun(scope="fragment")`` is called during a
|
128
|
+
full-app rerun or outside of a fragment, Streamlit will raise a
|
129
|
+
``StreamlitAPIException``.
|
130
|
+
|
131
|
+
"""
|
132
|
+
|
133
|
+
if scope not in ["app", "fragment"]:
|
134
|
+
raise StreamlitAPIException(
|
135
|
+
f"'{scope}'is not a valid rerun scope. Valid scopes are 'app' and 'fragment'."
|
136
|
+
)
|
137
|
+
|
138
|
+
ctx = get_script_run_ctx()
|
139
|
+
|
140
|
+
if ctx and ctx.script_requests:
|
141
|
+
query_string = ctx.query_string
|
142
|
+
page_script_hash = ctx.page_script_hash
|
143
|
+
|
144
|
+
ctx.script_requests.request_rerun(
|
145
|
+
RerunData(
|
146
|
+
query_string=query_string,
|
147
|
+
page_script_hash=page_script_hash,
|
148
|
+
fragment_id_queue=_new_fragment_id_queue(ctx, scope),
|
149
|
+
is_fragment_scoped_rerun=scope == "fragment",
|
150
|
+
)
|
151
|
+
)
|
152
|
+
# Force a yield point so the runner can do the rerun
|
153
|
+
st.empty()
|
154
|
+
|
155
|
+
|
156
|
+
@gather_metrics("switch_page")
|
157
|
+
def switch_page(page: str | Path | StreamlitPage) -> NoReturn: # type: ignore[misc]
|
158
|
+
"""Programmatically switch the current page in a multipage app.
|
159
|
+
|
160
|
+
When ``st.switch_page`` is called, the current page execution stops and
|
161
|
+
the specified page runs as if the user clicked on it in the sidebar
|
162
|
+
navigation. The specified page must be recognized by Streamlit's multipage
|
163
|
+
architecture (your main Python file or a Python file in a ``pages/``
|
164
|
+
folder). Arbitrary Python scripts cannot be passed to ``st.switch_page``.
|
165
|
+
|
166
|
+
Parameters
|
167
|
+
----------
|
168
|
+
page: str, Path, or st.Page
|
169
|
+
The file path (relative to the main script) or an st.Page indicating
|
170
|
+
the page to switch to.
|
171
|
+
|
172
|
+
|
173
|
+
Example
|
174
|
+
-------
|
175
|
+
Consider the following example given this file structure:
|
176
|
+
|
177
|
+
>>> your-repository/
|
178
|
+
>>> ├── pages/
|
179
|
+
>>> │ ├── page_1.py
|
180
|
+
>>> │ └── page_2.py
|
181
|
+
>>> └── your_app.py
|
182
|
+
|
183
|
+
>>> import streamlit as st
|
184
|
+
>>>
|
185
|
+
>>> if st.button("Home"):
|
186
|
+
>>> st.switch_page("your_app.py")
|
187
|
+
>>> if st.button("Page 1"):
|
188
|
+
>>> st.switch_page("pages/page_1.py")
|
189
|
+
>>> if st.button("Page 2"):
|
190
|
+
>>> st.switch_page("pages/page_2.py")
|
191
|
+
|
192
|
+
.. output ::
|
193
|
+
https://doc-switch-page.streamlit.app/
|
194
|
+
height: 350px
|
195
|
+
|
196
|
+
"""
|
197
|
+
|
198
|
+
ctx = get_script_run_ctx()
|
199
|
+
|
200
|
+
if not ctx or not ctx.script_requests:
|
201
|
+
# This should never be the case
|
202
|
+
raise NoSessionContext()
|
203
|
+
|
204
|
+
page_script_hash = ""
|
205
|
+
if isinstance(page, StreamlitPage):
|
206
|
+
page_script_hash = page._script_hash
|
207
|
+
else:
|
208
|
+
# Convert Path to string if necessary
|
209
|
+
if isinstance(page, Path):
|
210
|
+
page = str(page)
|
211
|
+
|
212
|
+
main_script_directory = get_main_script_directory(ctx.main_script_path)
|
213
|
+
requested_page = os.path.realpath(
|
214
|
+
normalize_path_join(main_script_directory, page)
|
215
|
+
)
|
216
|
+
all_app_pages = ctx.pages_manager.get_pages().values()
|
217
|
+
|
218
|
+
matched_pages = [p for p in all_app_pages if p["script_path"] == requested_page]
|
219
|
+
|
220
|
+
if len(matched_pages) == 0:
|
221
|
+
raise StreamlitAPIException(
|
222
|
+
f"Could not find page: `{page}`. Must be the file path relative to the main script, from the directory: `{os.path.basename(main_script_directory)}`. Only the main app file and files in the `pages/` directory are supported."
|
223
|
+
)
|
224
|
+
|
225
|
+
page_script_hash = matched_pages[0]["page_script_hash"]
|
226
|
+
|
227
|
+
# We want to reset query params (with exception of embed) when switching pages
|
228
|
+
with ctx.session_state.query_params() as qp:
|
229
|
+
qp.clear()
|
230
|
+
|
231
|
+
ctx.script_requests.request_rerun(
|
232
|
+
RerunData(
|
233
|
+
query_string=ctx.query_string,
|
234
|
+
page_script_hash=page_script_hash,
|
235
|
+
)
|
236
|
+
)
|
237
|
+
# Force a yield point so the runner can do the rerun
|
238
|
+
st.empty()
|
@@ -0,0 +1,169 @@
|
|
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 urllib.parse as parse
|
18
|
+
from typing import Any
|
19
|
+
|
20
|
+
from streamlit.errors import StreamlitAPIException
|
21
|
+
from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
|
22
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
23
|
+
from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
|
24
|
+
from streamlit.runtime.state.query_params import (
|
25
|
+
EMBED_OPTIONS_QUERY_PARAM,
|
26
|
+
EMBED_QUERY_PARAM,
|
27
|
+
EMBED_QUERY_PARAMS_KEYS,
|
28
|
+
)
|
29
|
+
|
30
|
+
|
31
|
+
@gather_metrics("experimental_get_query_params")
|
32
|
+
def get_query_params() -> dict[str, list[str]]:
|
33
|
+
"""Return the query parameters that is currently showing in the browser's URL bar.
|
34
|
+
|
35
|
+
Returns
|
36
|
+
-------
|
37
|
+
dict
|
38
|
+
The current query parameters as a dict. "Query parameters" are the part of the URL that comes
|
39
|
+
after the first "?".
|
40
|
+
|
41
|
+
Example
|
42
|
+
-------
|
43
|
+
Let's say the user's web browser is at
|
44
|
+
`http://localhost:8501/?show_map=True&selected=asia&selected=america`.
|
45
|
+
Then, you can get the query parameters using the following:
|
46
|
+
|
47
|
+
>>> import streamlit as st
|
48
|
+
>>>
|
49
|
+
>>> st.experimental_get_query_params()
|
50
|
+
{"show_map": ["True"], "selected": ["asia", "america"]}
|
51
|
+
|
52
|
+
Note that the values in the returned dict are *always* lists. This is
|
53
|
+
because we internally use Python's urllib.parse.parse_qs(), which behaves
|
54
|
+
this way. And this behavior makes sense when you consider that every item
|
55
|
+
in a query string is potentially a 1-element array.
|
56
|
+
|
57
|
+
"""
|
58
|
+
ctx = get_script_run_ctx()
|
59
|
+
if ctx is None:
|
60
|
+
return {}
|
61
|
+
ctx.mark_experimental_query_params_used()
|
62
|
+
# Return new query params dict, but without embed, embed_options query params
|
63
|
+
return _exclude_keys_in_dict(
|
64
|
+
parse.parse_qs(ctx.query_string, keep_blank_values=True),
|
65
|
+
keys_to_exclude=EMBED_QUERY_PARAMS_KEYS,
|
66
|
+
)
|
67
|
+
|
68
|
+
|
69
|
+
@gather_metrics("experimental_set_query_params")
|
70
|
+
def set_query_params(**query_params: Any) -> None:
|
71
|
+
"""Set the query parameters that are shown in the browser's URL bar.
|
72
|
+
|
73
|
+
.. warning::
|
74
|
+
Query param `embed` cannot be set using this method.
|
75
|
+
|
76
|
+
Parameters
|
77
|
+
----------
|
78
|
+
**query_params : dict
|
79
|
+
The query parameters to set, as key-value pairs.
|
80
|
+
|
81
|
+
Example
|
82
|
+
-------
|
83
|
+
|
84
|
+
To point the user's web browser to something like
|
85
|
+
"http://localhost:8501/?show_map=True&selected=asia&selected=america",
|
86
|
+
you would do the following:
|
87
|
+
|
88
|
+
>>> import streamlit as st
|
89
|
+
>>>
|
90
|
+
>>> st.experimental_set_query_params(
|
91
|
+
... show_map=True,
|
92
|
+
... selected=["asia", "america"],
|
93
|
+
... )
|
94
|
+
|
95
|
+
"""
|
96
|
+
ctx = get_script_run_ctx()
|
97
|
+
if ctx is None:
|
98
|
+
return
|
99
|
+
ctx.mark_experimental_query_params_used()
|
100
|
+
|
101
|
+
msg = ForwardMsg()
|
102
|
+
msg.page_info_changed.query_string = _ensure_no_embed_params(
|
103
|
+
query_params, ctx.query_string
|
104
|
+
)
|
105
|
+
ctx.query_string = msg.page_info_changed.query_string
|
106
|
+
ctx.enqueue(msg)
|
107
|
+
|
108
|
+
|
109
|
+
def _exclude_keys_in_dict(
|
110
|
+
d: dict[str, Any], keys_to_exclude: list[str]
|
111
|
+
) -> dict[str, Any]:
|
112
|
+
"""Returns new object but without keys defined in keys_to_exclude"""
|
113
|
+
return {
|
114
|
+
key: value for key, value in d.items() if key.lower() not in keys_to_exclude
|
115
|
+
}
|
116
|
+
|
117
|
+
|
118
|
+
def _extract_key_query_params(
|
119
|
+
query_params: dict[str, list[str]], param_key: str
|
120
|
+
) -> set[str]:
|
121
|
+
"""Extracts key (case-insensitive) query params from Dict, and returns them as Set of str."""
|
122
|
+
return {
|
123
|
+
item.lower()
|
124
|
+
for sublist in [
|
125
|
+
[value.lower() for value in query_params[key]]
|
126
|
+
for key in query_params.keys()
|
127
|
+
if key.lower() == param_key and query_params.get(key)
|
128
|
+
]
|
129
|
+
for item in sublist
|
130
|
+
}
|
131
|
+
|
132
|
+
|
133
|
+
def _ensure_no_embed_params(
|
134
|
+
query_params: dict[str, list[str] | str], query_string: str
|
135
|
+
) -> str:
|
136
|
+
"""Ensures there are no embed params set (raises StreamlitAPIException) if there is a try,
|
137
|
+
also makes sure old param values in query_string are preserved. Returns query_string : str.
|
138
|
+
"""
|
139
|
+
# Get query params dict without embed, embed_options params
|
140
|
+
query_params_without_embed = _exclude_keys_in_dict(
|
141
|
+
query_params, keys_to_exclude=EMBED_QUERY_PARAMS_KEYS
|
142
|
+
)
|
143
|
+
if query_params != query_params_without_embed:
|
144
|
+
raise StreamlitAPIException(
|
145
|
+
"Query param embed and embed_options (case-insensitive) cannot be set using set_query_params method."
|
146
|
+
)
|
147
|
+
|
148
|
+
all_current_params = parse.parse_qs(query_string, keep_blank_values=True)
|
149
|
+
current_embed_params = parse.urlencode(
|
150
|
+
{
|
151
|
+
EMBED_QUERY_PARAM: list(
|
152
|
+
_extract_key_query_params(
|
153
|
+
all_current_params, param_key=EMBED_QUERY_PARAM
|
154
|
+
)
|
155
|
+
),
|
156
|
+
EMBED_OPTIONS_QUERY_PARAM: list(
|
157
|
+
_extract_key_query_params(
|
158
|
+
all_current_params, param_key=EMBED_OPTIONS_QUERY_PARAM
|
159
|
+
)
|
160
|
+
),
|
161
|
+
},
|
162
|
+
doseq=True,
|
163
|
+
)
|
164
|
+
query_string = parse.urlencode(query_params, doseq=True)
|
165
|
+
|
166
|
+
if query_string:
|
167
|
+
separator = "&" if current_embed_params else ""
|
168
|
+
return separator.join([query_string, current_embed_params])
|
169
|
+
return current_embed_params
|