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,153 @@
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from collections.abc import Iterator, MutableMapping
|
18
|
+
from typing import Any, Final
|
19
|
+
|
20
|
+
from streamlit import logger as _logger
|
21
|
+
from streamlit import runtime
|
22
|
+
from streamlit.elements.lib.utils import Key
|
23
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
24
|
+
from streamlit.runtime.state.common import require_valid_user_key
|
25
|
+
from streamlit.runtime.state.safe_session_state import SafeSessionState
|
26
|
+
from streamlit.runtime.state.session_state import SessionState
|
27
|
+
|
28
|
+
_LOGGER: Final = _logger.get_logger(__name__)
|
29
|
+
|
30
|
+
|
31
|
+
_state_use_warning_already_displayed: bool = False
|
32
|
+
# The mock session state is used as a fallback if the script is run without `streamlit run`
|
33
|
+
_mock_session_state: SafeSessionState | None = None
|
34
|
+
|
35
|
+
|
36
|
+
def get_session_state() -> SafeSessionState:
|
37
|
+
"""Get the SessionState object for the current session.
|
38
|
+
|
39
|
+
Note that in streamlit scripts, this function should not be called
|
40
|
+
directly. Instead, SessionState objects should be accessed via
|
41
|
+
st.session_state.
|
42
|
+
"""
|
43
|
+
global _state_use_warning_already_displayed
|
44
|
+
from streamlit.runtime.scriptrunner_utils.script_run_context import (
|
45
|
+
get_script_run_ctx,
|
46
|
+
)
|
47
|
+
|
48
|
+
ctx = get_script_run_ctx()
|
49
|
+
|
50
|
+
# If there is no script run context because the script is run bare, we
|
51
|
+
# use a global mock session state version to allow bare script execution (via python script.py)
|
52
|
+
if ctx is None:
|
53
|
+
if not _state_use_warning_already_displayed:
|
54
|
+
_state_use_warning_already_displayed = True
|
55
|
+
if not runtime.exists():
|
56
|
+
_LOGGER.warning(
|
57
|
+
"Session state does not function when running a script without `streamlit run`"
|
58
|
+
)
|
59
|
+
|
60
|
+
global _mock_session_state
|
61
|
+
|
62
|
+
if _mock_session_state is None:
|
63
|
+
# Lazy initialize the mock session state
|
64
|
+
_mock_session_state = SafeSessionState(SessionState(), lambda: None)
|
65
|
+
return _mock_session_state
|
66
|
+
return ctx.session_state
|
67
|
+
|
68
|
+
|
69
|
+
class SessionStateProxy(MutableMapping[Key, Any]):
|
70
|
+
"""A stateless singleton that proxies `st.session_state` interactions
|
71
|
+
to the current script thread's SessionState instance.
|
72
|
+
|
73
|
+
The proxy API differs slightly from SessionState: it does not allow
|
74
|
+
callers to get, set, or iterate over "keyless" widgets (that is, widgets
|
75
|
+
that were created without a user_key, and have autogenerated keys).
|
76
|
+
"""
|
77
|
+
|
78
|
+
def __iter__(self) -> Iterator[Any]:
|
79
|
+
"""Iterator over user state and keyed widget values."""
|
80
|
+
# TODO: this is unsafe if fastReruns is true! Let's deprecate/remove.
|
81
|
+
return iter(get_session_state().filtered_state)
|
82
|
+
|
83
|
+
def __len__(self) -> int:
|
84
|
+
"""Number of user state and keyed widget values in session_state."""
|
85
|
+
return len(get_session_state().filtered_state)
|
86
|
+
|
87
|
+
def __str__(self) -> str:
|
88
|
+
"""String representation of user state and keyed widget values."""
|
89
|
+
return str(get_session_state().filtered_state)
|
90
|
+
|
91
|
+
def __getitem__(self, key: Key) -> Any:
|
92
|
+
"""Return the state or widget value with the given key.
|
93
|
+
|
94
|
+
Raises
|
95
|
+
------
|
96
|
+
StreamlitAPIException
|
97
|
+
If the key is not a valid SessionState user key.
|
98
|
+
"""
|
99
|
+
key = str(key)
|
100
|
+
require_valid_user_key(key)
|
101
|
+
return get_session_state()[key]
|
102
|
+
|
103
|
+
@gather_metrics("session_state.set_item")
|
104
|
+
def __setitem__(self, key: Key, value: Any) -> None:
|
105
|
+
"""Set the value of the given key.
|
106
|
+
|
107
|
+
Raises
|
108
|
+
------
|
109
|
+
StreamlitAPIException
|
110
|
+
If the key is not a valid SessionState user key.
|
111
|
+
"""
|
112
|
+
key = str(key)
|
113
|
+
require_valid_user_key(key)
|
114
|
+
get_session_state()[key] = value
|
115
|
+
|
116
|
+
def __delitem__(self, key: Key) -> None:
|
117
|
+
"""Delete the value with the given key.
|
118
|
+
|
119
|
+
Raises
|
120
|
+
------
|
121
|
+
StreamlitAPIException
|
122
|
+
If the key is not a valid SessionState user key.
|
123
|
+
"""
|
124
|
+
key = str(key)
|
125
|
+
require_valid_user_key(key)
|
126
|
+
del get_session_state()[key]
|
127
|
+
|
128
|
+
def __getattr__(self, key: str) -> Any:
|
129
|
+
try:
|
130
|
+
return self[key]
|
131
|
+
except KeyError:
|
132
|
+
raise AttributeError(_missing_attr_error_message(key))
|
133
|
+
|
134
|
+
@gather_metrics("session_state.set_attr")
|
135
|
+
def __setattr__(self, key: str, value: Any) -> None:
|
136
|
+
self[key] = value
|
137
|
+
|
138
|
+
def __delattr__(self, key: str) -> None:
|
139
|
+
try:
|
140
|
+
del self[key]
|
141
|
+
except KeyError:
|
142
|
+
raise AttributeError(_missing_attr_error_message(key))
|
143
|
+
|
144
|
+
def to_dict(self) -> dict[str, Any]:
|
145
|
+
"""Return a dict containing all session_state and keyed widget values."""
|
146
|
+
return get_session_state().filtered_state
|
147
|
+
|
148
|
+
|
149
|
+
def _missing_attr_error_message(attr_name: str) -> str:
|
150
|
+
return (
|
151
|
+
f'st.session_state has no attribute "{attr_name}". Did you forget to initialize it? '
|
152
|
+
f"More info: https://docs.streamlit.io/develop/concepts/architecture/session-state#initialization"
|
153
|
+
)
|
@@ -0,0 +1,135 @@
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from typing import TYPE_CHECKING
|
18
|
+
|
19
|
+
from streamlit.runtime.state.common import (
|
20
|
+
RegisterWidgetResult,
|
21
|
+
T,
|
22
|
+
ValueFieldName,
|
23
|
+
WidgetArgs,
|
24
|
+
WidgetCallback,
|
25
|
+
WidgetDeserializer,
|
26
|
+
WidgetKwargs,
|
27
|
+
WidgetMetadata,
|
28
|
+
WidgetSerializer,
|
29
|
+
user_key_from_element_id,
|
30
|
+
)
|
31
|
+
|
32
|
+
if TYPE_CHECKING:
|
33
|
+
from streamlit.runtime.scriptrunner import ScriptRunContext
|
34
|
+
|
35
|
+
|
36
|
+
def register_widget(
|
37
|
+
element_id: str,
|
38
|
+
*,
|
39
|
+
deserializer: WidgetDeserializer[T],
|
40
|
+
serializer: WidgetSerializer[T],
|
41
|
+
ctx: ScriptRunContext | None,
|
42
|
+
on_change_handler: WidgetCallback | None = None,
|
43
|
+
args: WidgetArgs | None = None,
|
44
|
+
kwargs: WidgetKwargs | None = None,
|
45
|
+
value_type: ValueFieldName,
|
46
|
+
) -> RegisterWidgetResult[T]:
|
47
|
+
"""Register a widget with Streamlit, and return its current value.
|
48
|
+
NOTE: This function should be called after the proto has been filled.
|
49
|
+
|
50
|
+
Parameters
|
51
|
+
----------
|
52
|
+
element_id : str
|
53
|
+
The id of the element. Must be unique.
|
54
|
+
deserializer : WidgetDeserializer[T]
|
55
|
+
Called to convert a widget's protobuf value to the value returned by
|
56
|
+
its st.<widget_name> function.
|
57
|
+
serializer : WidgetSerializer[T]
|
58
|
+
Called to convert a widget's value to its protobuf representation.
|
59
|
+
ctx : ScriptRunContext or None
|
60
|
+
Used to ensure uniqueness of widget IDs, and to look up widget values.
|
61
|
+
on_change_handler : WidgetCallback or None
|
62
|
+
An optional callback invoked when the widget's value changes.
|
63
|
+
args : WidgetArgs or None
|
64
|
+
args to pass to on_change_handler when invoked
|
65
|
+
kwargs : WidgetKwargs or None
|
66
|
+
kwargs to pass to on_change_handler when invoked
|
67
|
+
value_type: ValueType
|
68
|
+
The value_type the widget is going to use.
|
69
|
+
We use this information to start with a best-effort guess for the value_type
|
70
|
+
of each widget. Once we actually receive a proto for a widget from the
|
71
|
+
frontend, the guess is updated to be the correct type. Unfortunately, we're
|
72
|
+
not able to always rely on the proto as the type may be needed earlier.
|
73
|
+
Thankfully, in these cases (when value_type == "trigger_value"), the static
|
74
|
+
table here being slightly inaccurate should never pose a problem.
|
75
|
+
|
76
|
+
|
77
|
+
Returns
|
78
|
+
-------
|
79
|
+
register_widget_result : RegisterWidgetResult[T]
|
80
|
+
Provides information on which value to return to the widget caller,
|
81
|
+
and whether the UI needs updating.
|
82
|
+
|
83
|
+
- Unhappy path:
|
84
|
+
- Our ScriptRunContext doesn't exist (meaning that we're running
|
85
|
+
as a "bare script" outside streamlit).
|
86
|
+
- We are disconnected from the SessionState instance.
|
87
|
+
In both cases we'll return a fallback RegisterWidgetResult[T].
|
88
|
+
- Happy path:
|
89
|
+
- The widget has already been registered on a previous run but the
|
90
|
+
user hasn't interacted with it on the client. The widget will have
|
91
|
+
the default value it was first created with. We then return a
|
92
|
+
RegisterWidgetResult[T], containing this value.
|
93
|
+
- The widget has already been registered and the user *has*
|
94
|
+
interacted with it. The widget will have that most recent
|
95
|
+
user-specified value. We then return a RegisterWidgetResult[T],
|
96
|
+
containing this value.
|
97
|
+
|
98
|
+
For both paths a widget return value is provided, allowing the widgets
|
99
|
+
to be used in a non-streamlit setting.
|
100
|
+
"""
|
101
|
+
# Create the widget's updated metadata, and register it with session_state.
|
102
|
+
metadata = WidgetMetadata(
|
103
|
+
element_id,
|
104
|
+
deserializer,
|
105
|
+
serializer,
|
106
|
+
value_type=value_type,
|
107
|
+
callback=on_change_handler,
|
108
|
+
callback_args=args,
|
109
|
+
callback_kwargs=kwargs,
|
110
|
+
fragment_id=ctx.current_fragment_id if ctx else None,
|
111
|
+
)
|
112
|
+
return register_widget_from_metadata(metadata, ctx)
|
113
|
+
|
114
|
+
|
115
|
+
def register_widget_from_metadata(
|
116
|
+
metadata: WidgetMetadata[T],
|
117
|
+
ctx: ScriptRunContext | None,
|
118
|
+
) -> RegisterWidgetResult[T]:
|
119
|
+
"""Register a widget and return its value, using an already constructed
|
120
|
+
`WidgetMetadata`.
|
121
|
+
|
122
|
+
This is split out from `register_widget` to allow caching code to replay
|
123
|
+
widgets by saving and reusing the completed metadata.
|
124
|
+
|
125
|
+
See `register_widget` for details on what this returns.
|
126
|
+
"""
|
127
|
+
if ctx is None:
|
128
|
+
# Early-out if we don't have a script run context (which probably means
|
129
|
+
# we're running as a "bare" Python script, and not via `streamlit run`).
|
130
|
+
return RegisterWidgetResult.failure(deserializer=metadata.deserializer)
|
131
|
+
|
132
|
+
widget_id = metadata.id
|
133
|
+
user_key = user_key_from_element_id(widget_id)
|
134
|
+
|
135
|
+
return ctx.session_state.register_widget(metadata, user_key)
|
@@ -0,0 +1,109 @@
|
|
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 itertools
|
18
|
+
from abc import abstractmethod
|
19
|
+
from typing import TYPE_CHECKING, NamedTuple, Protocol, runtime_checkable
|
20
|
+
|
21
|
+
if TYPE_CHECKING:
|
22
|
+
from streamlit.proto.openmetrics_data_model_pb2 import Metric as MetricProto
|
23
|
+
|
24
|
+
|
25
|
+
class CacheStat(NamedTuple):
|
26
|
+
"""Describes a single cache entry.
|
27
|
+
|
28
|
+
Properties
|
29
|
+
----------
|
30
|
+
category_name : str
|
31
|
+
A human-readable name for the cache "category" that the entry belongs
|
32
|
+
to - e.g. "st.memo", "session_state", etc.
|
33
|
+
cache_name : str
|
34
|
+
A human-readable name for cache instance that the entry belongs to.
|
35
|
+
For "st.memo" and other function decorator caches, this might be the
|
36
|
+
name of the cached function. If the cache category doesn't have
|
37
|
+
multiple separate cache instances, this can just be the empty string.
|
38
|
+
byte_length : int
|
39
|
+
The entry's memory footprint in bytes.
|
40
|
+
"""
|
41
|
+
|
42
|
+
category_name: str
|
43
|
+
cache_name: str
|
44
|
+
byte_length: int
|
45
|
+
|
46
|
+
def to_metric_str(self) -> str:
|
47
|
+
return f'cache_memory_bytes{{cache_type="{self.category_name}",cache="{self.cache_name}"}} {self.byte_length}'
|
48
|
+
|
49
|
+
def marshall_metric_proto(self, metric: MetricProto) -> None:
|
50
|
+
"""Fill an OpenMetrics `Metric` protobuf object."""
|
51
|
+
label = metric.labels.add()
|
52
|
+
label.name = "cache_type"
|
53
|
+
label.value = self.category_name
|
54
|
+
|
55
|
+
label = metric.labels.add()
|
56
|
+
label.name = "cache"
|
57
|
+
label.value = self.cache_name
|
58
|
+
|
59
|
+
metric_point = metric.metric_points.add()
|
60
|
+
metric_point.gauge_value.int_value = self.byte_length
|
61
|
+
|
62
|
+
|
63
|
+
def group_stats(stats: list[CacheStat]) -> list[CacheStat]:
|
64
|
+
"""Group a list of CacheStats by category_name and cache_name and sum byte_length"""
|
65
|
+
|
66
|
+
def key_function(individual_stat):
|
67
|
+
return individual_stat.category_name, individual_stat.cache_name
|
68
|
+
|
69
|
+
result: list[CacheStat] = []
|
70
|
+
|
71
|
+
sorted_stats = sorted(stats, key=key_function)
|
72
|
+
grouped_stats = itertools.groupby(sorted_stats, key=key_function)
|
73
|
+
|
74
|
+
for (category_name, cache_name), single_group_stats in grouped_stats:
|
75
|
+
result.append(
|
76
|
+
CacheStat(
|
77
|
+
category_name=category_name,
|
78
|
+
cache_name=cache_name,
|
79
|
+
byte_length=sum(item.byte_length for item in single_group_stats),
|
80
|
+
)
|
81
|
+
)
|
82
|
+
return result
|
83
|
+
|
84
|
+
|
85
|
+
@runtime_checkable
|
86
|
+
class CacheStatsProvider(Protocol):
|
87
|
+
@abstractmethod
|
88
|
+
def get_stats(self) -> list[CacheStat]:
|
89
|
+
raise NotImplementedError
|
90
|
+
|
91
|
+
|
92
|
+
class StatsManager:
|
93
|
+
def __init__(self):
|
94
|
+
self._cache_stats_providers: list[CacheStatsProvider] = []
|
95
|
+
|
96
|
+
def register_provider(self, provider: CacheStatsProvider) -> None:
|
97
|
+
"""Register a CacheStatsProvider with the manager.
|
98
|
+
This function is not thread-safe. Call it immediately after
|
99
|
+
creation.
|
100
|
+
"""
|
101
|
+
self._cache_stats_providers.append(provider)
|
102
|
+
|
103
|
+
def get_stats(self) -> list[CacheStat]:
|
104
|
+
"""Return a list containing all stats from each registered provider."""
|
105
|
+
all_stats: list[CacheStat] = []
|
106
|
+
for provider in self._cache_stats_providers:
|
107
|
+
all_stats.extend(provider.get_stats())
|
108
|
+
|
109
|
+
return all_stats
|
@@ -0,0 +1,148 @@
|
|
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 io
|
18
|
+
from abc import abstractmethod
|
19
|
+
from typing import TYPE_CHECKING, NamedTuple, Protocol
|
20
|
+
|
21
|
+
from streamlit import util
|
22
|
+
from streamlit.runtime.stats import CacheStatsProvider
|
23
|
+
|
24
|
+
if TYPE_CHECKING:
|
25
|
+
from collections.abc import Sequence
|
26
|
+
|
27
|
+
from streamlit.proto.Common_pb2 import FileURLs as FileURLsProto
|
28
|
+
|
29
|
+
|
30
|
+
class UploadedFileRec(NamedTuple):
|
31
|
+
"""Metadata and raw bytes for an uploaded file. Immutable."""
|
32
|
+
|
33
|
+
file_id: str
|
34
|
+
name: str
|
35
|
+
type: str
|
36
|
+
data: bytes
|
37
|
+
|
38
|
+
|
39
|
+
class UploadFileUrlInfo(NamedTuple):
|
40
|
+
"""Information we provide for single file in get_upload_urls"""
|
41
|
+
|
42
|
+
file_id: str
|
43
|
+
upload_url: str
|
44
|
+
delete_url: str
|
45
|
+
|
46
|
+
|
47
|
+
class DeletedFile(NamedTuple):
|
48
|
+
"""Represents a deleted file in deserialized values for st.file_uploader and
|
49
|
+
st.camera_input
|
50
|
+
|
51
|
+
Return this from st.file_uploader and st.camera_input deserialize (so they can
|
52
|
+
be used in session_state), when widget value contains file record that is missing
|
53
|
+
from the storage.
|
54
|
+
DeleteFile instances filtered out before return final value to the user in script,
|
55
|
+
or before sending to frontend."""
|
56
|
+
|
57
|
+
file_id: str
|
58
|
+
|
59
|
+
|
60
|
+
class UploadedFile(io.BytesIO):
|
61
|
+
"""A mutable uploaded file.
|
62
|
+
|
63
|
+
This class extends BytesIO, which has copy-on-write semantics when
|
64
|
+
initialized with `bytes`.
|
65
|
+
"""
|
66
|
+
|
67
|
+
def __init__(self, record: UploadedFileRec, file_urls: FileURLsProto):
|
68
|
+
# BytesIO's copy-on-write semantics doesn't seem to be mentioned in
|
69
|
+
# the Python docs - possibly because it's a CPython-only optimization
|
70
|
+
# and not guaranteed to be in other Python runtimes. But it's detailed
|
71
|
+
# here: https://hg.python.org/cpython/rev/79a5fbe2c78f
|
72
|
+
super().__init__(record.data)
|
73
|
+
self.file_id = record.file_id
|
74
|
+
self.name = record.name
|
75
|
+
self.type = record.type
|
76
|
+
self.size = len(record.data)
|
77
|
+
self._file_urls = file_urls
|
78
|
+
|
79
|
+
def __eq__(self, other: object) -> bool:
|
80
|
+
if not isinstance(other, UploadedFile):
|
81
|
+
return NotImplemented
|
82
|
+
return self.file_id == other.file_id
|
83
|
+
|
84
|
+
def __repr__(self) -> str:
|
85
|
+
return util.repr_(self)
|
86
|
+
|
87
|
+
|
88
|
+
class UploadedFileManager(CacheStatsProvider, Protocol):
|
89
|
+
"""UploadedFileManager protocol, that should be implemented by the concrete
|
90
|
+
uploaded file managers.
|
91
|
+
|
92
|
+
It is responsible for:
|
93
|
+
- retrieving files by session_id and file_id for st.file_uploader and
|
94
|
+
st.camera_input
|
95
|
+
- cleaning up uploaded files associated with session on session end
|
96
|
+
|
97
|
+
It should be created during Runtime initialization.
|
98
|
+
|
99
|
+
Optionally UploadedFileManager could be responsible for issuing URLs which will be
|
100
|
+
used by frontend to upload files to.
|
101
|
+
"""
|
102
|
+
|
103
|
+
@abstractmethod
|
104
|
+
def get_files(
|
105
|
+
self, session_id: str, file_ids: Sequence[str]
|
106
|
+
) -> list[UploadedFileRec]:
|
107
|
+
"""Return a list of UploadedFileRec for a given sequence of file_ids.
|
108
|
+
|
109
|
+
Parameters
|
110
|
+
----------
|
111
|
+
session_id
|
112
|
+
The ID of the session that owns the files.
|
113
|
+
file_ids
|
114
|
+
The sequence of ids associated with files to retrieve.
|
115
|
+
|
116
|
+
Returns
|
117
|
+
-------
|
118
|
+
List[UploadedFileRec]
|
119
|
+
A list of URL UploadedFileRec instances, each instance contains information
|
120
|
+
about uploaded file.
|
121
|
+
"""
|
122
|
+
raise NotImplementedError
|
123
|
+
|
124
|
+
@abstractmethod
|
125
|
+
def remove_session_files(self, session_id: str) -> None:
|
126
|
+
"""Remove all files associated with a given session."""
|
127
|
+
raise NotImplementedError
|
128
|
+
|
129
|
+
def get_upload_urls(
|
130
|
+
self, session_id: str, file_names: Sequence[str]
|
131
|
+
) -> list[UploadFileUrlInfo]:
|
132
|
+
"""Return a list of UploadFileUrlInfo for a given sequence of file_names.
|
133
|
+
Optional to implement, issuing of URLs could be done by other service.
|
134
|
+
|
135
|
+
Parameters
|
136
|
+
----------
|
137
|
+
session_id
|
138
|
+
The ID of the session that request URLs.
|
139
|
+
file_names
|
140
|
+
The sequence of file names for which URLs are requested
|
141
|
+
|
142
|
+
Returns
|
143
|
+
-------
|
144
|
+
List[UploadFileUrlInfo]
|
145
|
+
A list of UploadFileUrlInfo instances, each instance contains information
|
146
|
+
about uploaded file URLs.
|
147
|
+
"""
|
148
|
+
raise NotImplementedError
|