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,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
|
+
"""A library of caching utilities."""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
from typing import TYPE_CHECKING, Any, Callable, TypeVar
|
20
|
+
|
21
|
+
from streamlit import deprecation_util
|
22
|
+
from streamlit.runtime.caching import CACHE_DOCS_URL
|
23
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
24
|
+
|
25
|
+
if TYPE_CHECKING:
|
26
|
+
from streamlit.runtime.caching.hashing import HashFuncsDict
|
27
|
+
|
28
|
+
# Type-annotate the decorator function.
|
29
|
+
# (See https://mypy.readthedocs.io/en/stable/generics.html#decorator-factories)
|
30
|
+
F = TypeVar("F", bound=Callable[..., Any])
|
31
|
+
|
32
|
+
|
33
|
+
@gather_metrics("cache")
|
34
|
+
def cache(
|
35
|
+
func: F | None = None,
|
36
|
+
persist: bool = False,
|
37
|
+
allow_output_mutation: bool = False,
|
38
|
+
show_spinner: bool = True,
|
39
|
+
suppress_st_warning: bool = False,
|
40
|
+
hash_funcs: HashFuncsDict | None = None,
|
41
|
+
max_entries: int | None = None,
|
42
|
+
ttl: float | None = None,
|
43
|
+
):
|
44
|
+
"""Legacy caching decorator (deprecated).
|
45
|
+
|
46
|
+
Legacy caching with ``st.cache`` has been removed from Streamlit. This is
|
47
|
+
now an alias for ``st.cache_data`` and ``st.cache_resource``.
|
48
|
+
|
49
|
+
Parameters
|
50
|
+
----------
|
51
|
+
func : callable
|
52
|
+
The function to cache. Streamlit hashes the function's source code.
|
53
|
+
|
54
|
+
persist : bool
|
55
|
+
Whether to persist the cache on disk.
|
56
|
+
|
57
|
+
allow_output_mutation : bool
|
58
|
+
Whether to use ``st.cache_data`` or ``st.cache_resource``. If this is
|
59
|
+
``False`` (default), the arguments are passed to ``st.cache_data``. If
|
60
|
+
this is ``True``, the arguments are passed to ``st.cache_resource``.
|
61
|
+
|
62
|
+
show_spinner : bool
|
63
|
+
Enable the spinner. Default is ``True`` to show a spinner when there is
|
64
|
+
a "cache miss" and the cached data is being created.
|
65
|
+
|
66
|
+
suppress_st_warning : bool
|
67
|
+
This is not used.
|
68
|
+
|
69
|
+
hash_funcs : dict or None
|
70
|
+
Mapping of types or fully qualified names to hash functions. This is used to
|
71
|
+
override the behavior of the hasher inside Streamlit's caching mechanism: when
|
72
|
+
the hasher encounters an object, it will first check to see if its type matches
|
73
|
+
a key in this dict and, if so, will use the provided function to generate a hash
|
74
|
+
for it. See below for an example of how this can be used.
|
75
|
+
|
76
|
+
max_entries : int or None
|
77
|
+
The maximum number of entries to keep in the cache, or ``None``
|
78
|
+
for an unbounded cache. (When a new entry is added to a full cache,
|
79
|
+
the oldest cached entry will be removed.) The default is ``None``.
|
80
|
+
|
81
|
+
ttl : float or None
|
82
|
+
The maximum number of seconds to keep an entry in the cache, or
|
83
|
+
None if cache entries should not expire. The default is None.
|
84
|
+
|
85
|
+
Example
|
86
|
+
-------
|
87
|
+
>>> import streamlit as st
|
88
|
+
>>>
|
89
|
+
>>> @st.cache
|
90
|
+
... def fetch_and_clean_data(url):
|
91
|
+
... # Fetch data from URL here, and then clean it up.
|
92
|
+
... return data
|
93
|
+
>>>
|
94
|
+
>>> d1 = fetch_and_clean_data(DATA_URL_1)
|
95
|
+
>>> # Actually executes the function, since this is the first time it was
|
96
|
+
>>> # encountered.
|
97
|
+
>>>
|
98
|
+
>>> d2 = fetch_and_clean_data(DATA_URL_1)
|
99
|
+
>>> # Does not execute the function. Instead, returns its previously computed
|
100
|
+
>>> # value. This means that now the data in d1 is the same as in d2.
|
101
|
+
>>>
|
102
|
+
>>> d3 = fetch_and_clean_data(DATA_URL_2)
|
103
|
+
>>> # This is a different URL, so the function executes.
|
104
|
+
|
105
|
+
To set the ``persist`` parameter, use this command as follows:
|
106
|
+
|
107
|
+
>>> @st.cache(persist=True)
|
108
|
+
... def fetch_and_clean_data(url):
|
109
|
+
... # Fetch data from URL here, and then clean it up.
|
110
|
+
... return data
|
111
|
+
|
112
|
+
To disable hashing return values, set the ``allow_output_mutation`` parameter to
|
113
|
+
``True``:
|
114
|
+
|
115
|
+
>>> @st.cache(allow_output_mutation=True)
|
116
|
+
... def fetch_and_clean_data(url):
|
117
|
+
... # Fetch data from URL here, and then clean it up.
|
118
|
+
... return data
|
119
|
+
|
120
|
+
|
121
|
+
To override the default hashing behavior, pass a custom hash function.
|
122
|
+
You can do that by mapping a type (e.g. ``MongoClient``) to a hash function (``id``)
|
123
|
+
like this:
|
124
|
+
|
125
|
+
>>> @st.cache(hash_funcs={MongoClient: id})
|
126
|
+
... def connect_to_database(url):
|
127
|
+
... return MongoClient(url)
|
128
|
+
|
129
|
+
Alternatively, you can map the type's fully-qualified name
|
130
|
+
(e.g. ``"pymongo.mongo_client.MongoClient"``) to the hash function instead:
|
131
|
+
|
132
|
+
>>> @st.cache(hash_funcs={"pymongo.mongo_client.MongoClient": id})
|
133
|
+
... def connect_to_database(url):
|
134
|
+
... return MongoClient(url)
|
135
|
+
|
136
|
+
"""
|
137
|
+
import streamlit as st
|
138
|
+
|
139
|
+
deprecation_util.show_deprecation_warning(
|
140
|
+
f"""
|
141
|
+
`st.cache` is deprecated and will be removed soon. Please use one of Streamlit's new
|
142
|
+
caching commands, `st.cache_data` or `st.cache_resource`. More information
|
143
|
+
[in our docs]({CACHE_DOCS_URL}).
|
144
|
+
|
145
|
+
**Note**: The behavior of `st.cache` was updated in Streamlit 1.36 to the new caching
|
146
|
+
logic used by `st.cache_data` and `st.cache_resource`. This might lead to some problems
|
147
|
+
or unexpected behavior in certain edge cases.
|
148
|
+
"""
|
149
|
+
)
|
150
|
+
|
151
|
+
# suppress_st_warning is unused since its not supported by the new caching commands
|
152
|
+
|
153
|
+
if allow_output_mutation:
|
154
|
+
return st.cache_resource( # type: ignore
|
155
|
+
func,
|
156
|
+
show_spinner=show_spinner,
|
157
|
+
hash_funcs=hash_funcs,
|
158
|
+
max_entries=max_entries,
|
159
|
+
ttl=ttl,
|
160
|
+
)
|
161
|
+
|
162
|
+
return st.cache_data( # type: ignore
|
163
|
+
func,
|
164
|
+
persist=persist,
|
165
|
+
show_spinner=show_spinner,
|
166
|
+
hash_funcs=hash_funcs,
|
167
|
+
max_entries=max_entries,
|
168
|
+
ttl=ttl,
|
169
|
+
)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from streamlit.runtime.caching.storage.cache_storage_protocol import (
|
16
|
+
CacheStorage,
|
17
|
+
CacheStorageContext,
|
18
|
+
CacheStorageError,
|
19
|
+
CacheStorageKeyNotFoundError,
|
20
|
+
CacheStorageManager,
|
21
|
+
)
|
22
|
+
|
23
|
+
__all__ = [
|
24
|
+
"CacheStorage",
|
25
|
+
"CacheStorageContext",
|
26
|
+
"CacheStorageError",
|
27
|
+
"CacheStorageKeyNotFoundError",
|
28
|
+
"CacheStorageManager",
|
29
|
+
]
|
@@ -0,0 +1,239 @@
|
|
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
|
+
"""Declares the CacheStorageContext dataclass, which contains parameter information for
|
16
|
+
each function decorated by `@st.cache_data` (for example: ttl, max_entries etc.)
|
17
|
+
|
18
|
+
Declares the CacheStorageManager protocol, which implementations are used
|
19
|
+
to create CacheStorage instances and to optionally clear all cache storages,
|
20
|
+
that were created by this manager, and to check if the context is valid for the storage.
|
21
|
+
|
22
|
+
Declares the CacheStorage protocol, which implementations are used to store cached
|
23
|
+
values for a single `@st.cache_data` decorated function serialized as bytes.
|
24
|
+
|
25
|
+
How these classes work together
|
26
|
+
-------------------------------
|
27
|
+
- CacheStorageContext : this is a dataclass that contains the parameters from
|
28
|
+
`@st.cache_data` that are passed to the CacheStorageManager.create() method.
|
29
|
+
|
30
|
+
- CacheStorageManager : each instance of this is able to create CacheStorage
|
31
|
+
instances, and optionally to clear data of all cache storages.
|
32
|
+
|
33
|
+
- CacheStorage : each instance of this is able to get, set, delete, and clear
|
34
|
+
entries for a single `@st.cache_data` decorated function.
|
35
|
+
|
36
|
+
┌───────────────────────────────┐
|
37
|
+
│ │
|
38
|
+
│ CacheStorageManager │
|
39
|
+
│ │
|
40
|
+
│ - clear_all(optional) │
|
41
|
+
│ - check_context │
|
42
|
+
│ │
|
43
|
+
└──┬────────────────────────────┘
|
44
|
+
│
|
45
|
+
│ ┌──────────────────────┐
|
46
|
+
│ │ CacheStorage │
|
47
|
+
│ create(context)│ │
|
48
|
+
└────────────────► - get │
|
49
|
+
│ - set │
|
50
|
+
│ - delete │
|
51
|
+
│ - close (optional)│
|
52
|
+
│ - clear │
|
53
|
+
└──────────────────────┘
|
54
|
+
"""
|
55
|
+
|
56
|
+
from __future__ import annotations
|
57
|
+
|
58
|
+
from abc import abstractmethod
|
59
|
+
from dataclasses import dataclass
|
60
|
+
from typing import Literal, Protocol
|
61
|
+
|
62
|
+
|
63
|
+
class CacheStorageError(Exception):
|
64
|
+
"""Base exception raised by the cache storage"""
|
65
|
+
|
66
|
+
|
67
|
+
class CacheStorageKeyNotFoundError(CacheStorageError):
|
68
|
+
"""Raised when the key is not found in the cache storage"""
|
69
|
+
|
70
|
+
|
71
|
+
class InvalidCacheStorageContext(CacheStorageError):
|
72
|
+
"""Raised if the cache storage manager is not able to work with
|
73
|
+
provided CacheStorageContext.
|
74
|
+
"""
|
75
|
+
|
76
|
+
|
77
|
+
@dataclass(frozen=True)
|
78
|
+
class CacheStorageContext:
|
79
|
+
"""Context passed to the cache storage during initialization
|
80
|
+
This is the normalized parameters that are passed to CacheStorageManager.create()
|
81
|
+
method.
|
82
|
+
|
83
|
+
Parameters
|
84
|
+
----------
|
85
|
+
function_key: str
|
86
|
+
A hash computed based on function name and source code decorated
|
87
|
+
by `@st.cache_data`
|
88
|
+
|
89
|
+
function_display_name: str
|
90
|
+
The display name of the function that is decorated by `@st.cache_data`
|
91
|
+
|
92
|
+
ttl_seconds : float or None
|
93
|
+
The time-to-live for the keys in storage, in seconds. If None, the entry
|
94
|
+
will never expire.
|
95
|
+
|
96
|
+
max_entries : int or None
|
97
|
+
The maximum number of entries to store in the cache storage.
|
98
|
+
If None, the cache storage will not limit the number of entries.
|
99
|
+
|
100
|
+
persist : Literal["disk"] or None
|
101
|
+
The persistence mode for the cache storage.
|
102
|
+
Legacy parameter, that used in Streamlit current cache storage implementation.
|
103
|
+
Could be ignored by cache storage implementation, if storage does not support
|
104
|
+
persistence or it persistent by default.
|
105
|
+
"""
|
106
|
+
|
107
|
+
function_key: str
|
108
|
+
function_display_name: str
|
109
|
+
ttl_seconds: float | None = None
|
110
|
+
max_entries: int | None = None
|
111
|
+
persist: Literal["disk"] | None = None
|
112
|
+
|
113
|
+
|
114
|
+
class CacheStorage(Protocol):
|
115
|
+
"""Cache storage protocol, that should be implemented by the concrete cache storages.
|
116
|
+
Used to store cached values for a single `@st.cache_data` decorated function
|
117
|
+
serialized as bytes.
|
118
|
+
|
119
|
+
CacheStorage instances should be created by `CacheStorageManager.create()` method.
|
120
|
+
|
121
|
+
Notes
|
122
|
+
-----
|
123
|
+
Threading: The methods of this protocol could be called from multiple threads.
|
124
|
+
This is a responsibility of the concrete implementation to ensure thread safety
|
125
|
+
guarantees.
|
126
|
+
"""
|
127
|
+
|
128
|
+
@abstractmethod
|
129
|
+
def get(self, key: str) -> bytes:
|
130
|
+
"""Returns the stored value for the key.
|
131
|
+
|
132
|
+
Raises
|
133
|
+
------
|
134
|
+
CacheStorageKeyNotFoundError
|
135
|
+
Raised if the key is not in the storage.
|
136
|
+
"""
|
137
|
+
raise NotImplementedError
|
138
|
+
|
139
|
+
@abstractmethod
|
140
|
+
def set(self, key: str, value: bytes) -> None:
|
141
|
+
"""Sets the value for a given key"""
|
142
|
+
raise NotImplementedError
|
143
|
+
|
144
|
+
@abstractmethod
|
145
|
+
def delete(self, key: str) -> None:
|
146
|
+
"""Delete a given key"""
|
147
|
+
raise NotImplementedError
|
148
|
+
|
149
|
+
@abstractmethod
|
150
|
+
def clear(self) -> None:
|
151
|
+
"""Remove all keys for the storage"""
|
152
|
+
raise NotImplementedError
|
153
|
+
|
154
|
+
def close(self) -> None:
|
155
|
+
"""Closes the cache storage, it is optional to implement, and should be used
|
156
|
+
to close open resources, before we delete the storage instance.
|
157
|
+
e.g. close the database connection etc.
|
158
|
+
"""
|
159
|
+
pass
|
160
|
+
|
161
|
+
|
162
|
+
class CacheStorageManager(Protocol):
|
163
|
+
"""Cache storage manager protocol, that should be implemented by the concrete
|
164
|
+
cache storage managers.
|
165
|
+
|
166
|
+
It is responsible for:
|
167
|
+
- Creating cache storage instances for the specific
|
168
|
+
decorated functions,
|
169
|
+
- Validating the context for the cache storages.
|
170
|
+
- Optionally clearing all cache storages in optimal way.
|
171
|
+
|
172
|
+
It should be created during Runtime initialization.
|
173
|
+
"""
|
174
|
+
|
175
|
+
@abstractmethod
|
176
|
+
def create(self, context: CacheStorageContext) -> CacheStorage:
|
177
|
+
"""Creates a new cache storage instance
|
178
|
+
Please note that the ttl, max_entries and other context fields are specific
|
179
|
+
for whole storage, not for individual key.
|
180
|
+
|
181
|
+
Notes
|
182
|
+
-----
|
183
|
+
Threading: Should be safe to call from any thread.
|
184
|
+
"""
|
185
|
+
raise NotImplementedError
|
186
|
+
|
187
|
+
def clear_all(self) -> None:
|
188
|
+
"""Remove everything what possible from the cache storages in optimal way.
|
189
|
+
meaningful default behaviour is to raise NotImplementedError, so this is not
|
190
|
+
abstractmethod.
|
191
|
+
|
192
|
+
The method is optional to implement: cache data API will fall back to remove
|
193
|
+
all available storages one by one via storage.clear() method
|
194
|
+
if clear_all raises NotImplementedError.
|
195
|
+
|
196
|
+
Raises
|
197
|
+
------
|
198
|
+
NotImplementedError
|
199
|
+
Raised if the storage manager does not provide an ability to clear
|
200
|
+
all storages at once in optimal way.
|
201
|
+
|
202
|
+
Notes
|
203
|
+
-----
|
204
|
+
Threading: This method could be called from multiple threads.
|
205
|
+
This is a responsibility of the concrete implementation to ensure
|
206
|
+
thread safety guarantees.
|
207
|
+
"""
|
208
|
+
raise NotImplementedError
|
209
|
+
|
210
|
+
def check_context(self, context: CacheStorageContext) -> None:
|
211
|
+
"""Checks if the context is valid for the storage manager.
|
212
|
+
This method should not return anything, but log message or raise an exception
|
213
|
+
if the context is invalid.
|
214
|
+
|
215
|
+
In case of raising an exception, we not handle it and let the exception to be
|
216
|
+
propagated.
|
217
|
+
|
218
|
+
check_context is called only once at the moment of creating `@st.cache_data`
|
219
|
+
decorator for specific function, so it is not called for every cache hit.
|
220
|
+
|
221
|
+
Parameters
|
222
|
+
----------
|
223
|
+
context: CacheStorageContext
|
224
|
+
The context to check for the storage manager, dummy function_key in context
|
225
|
+
will be used, since it is not computed at the point of calling this method.
|
226
|
+
|
227
|
+
Raises
|
228
|
+
------
|
229
|
+
InvalidCacheStorageContext
|
230
|
+
Raised if the cache storage manager is not able to work with provided
|
231
|
+
CacheStorageContext. When possible we should log message instead, since
|
232
|
+
this exception will be propagated to the user.
|
233
|
+
|
234
|
+
Notes
|
235
|
+
-----
|
236
|
+
Threading: Should be safe to call from any thread.
|
237
|
+
"""
|
238
|
+
|
239
|
+
pass
|
@@ -0,0 +1,60 @@
|
|
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
|
+
from __future__ import annotations
|
15
|
+
|
16
|
+
from streamlit.runtime.caching.storage.cache_storage_protocol import (
|
17
|
+
CacheStorage,
|
18
|
+
CacheStorageContext,
|
19
|
+
CacheStorageKeyNotFoundError,
|
20
|
+
CacheStorageManager,
|
21
|
+
)
|
22
|
+
from streamlit.runtime.caching.storage.in_memory_cache_storage_wrapper import (
|
23
|
+
InMemoryCacheStorageWrapper,
|
24
|
+
)
|
25
|
+
|
26
|
+
|
27
|
+
class MemoryCacheStorageManager(CacheStorageManager):
|
28
|
+
def create(self, context: CacheStorageContext) -> CacheStorage:
|
29
|
+
"""Creates a new cache storage instance wrapped with in-memory cache layer"""
|
30
|
+
persist_storage = DummyCacheStorage()
|
31
|
+
return InMemoryCacheStorageWrapper(
|
32
|
+
persist_storage=persist_storage, context=context
|
33
|
+
)
|
34
|
+
|
35
|
+
def clear_all(self) -> None:
|
36
|
+
raise NotImplementedError
|
37
|
+
|
38
|
+
def check_context(self, context: CacheStorageContext) -> None:
|
39
|
+
pass
|
40
|
+
|
41
|
+
|
42
|
+
class DummyCacheStorage(CacheStorage):
|
43
|
+
def get(self, key: str) -> bytes:
|
44
|
+
"""
|
45
|
+
Dummy gets the value for a given key,
|
46
|
+
always raises an CacheStorageKeyNotFoundError
|
47
|
+
"""
|
48
|
+
raise CacheStorageKeyNotFoundError("Key not found in dummy cache")
|
49
|
+
|
50
|
+
def set(self, key: str, value: bytes) -> None:
|
51
|
+
pass
|
52
|
+
|
53
|
+
def delete(self, key: str) -> None:
|
54
|
+
pass
|
55
|
+
|
56
|
+
def clear(self) -> None:
|
57
|
+
pass
|
58
|
+
|
59
|
+
def close(self) -> None:
|
60
|
+
pass
|
@@ -0,0 +1,145 @@
|
|
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
|
+
from __future__ import annotations
|
15
|
+
|
16
|
+
import math
|
17
|
+
import threading
|
18
|
+
|
19
|
+
from cachetools import TTLCache
|
20
|
+
|
21
|
+
from streamlit.logger import get_logger
|
22
|
+
from streamlit.runtime.caching import cache_utils
|
23
|
+
from streamlit.runtime.caching.storage.cache_storage_protocol import (
|
24
|
+
CacheStorage,
|
25
|
+
CacheStorageContext,
|
26
|
+
CacheStorageKeyNotFoundError,
|
27
|
+
)
|
28
|
+
from streamlit.runtime.stats import CacheStat
|
29
|
+
|
30
|
+
_LOGGER = get_logger(__name__)
|
31
|
+
|
32
|
+
|
33
|
+
class InMemoryCacheStorageWrapper(CacheStorage):
|
34
|
+
"""
|
35
|
+
In-memory cache storage wrapper.
|
36
|
+
|
37
|
+
This class wraps a cache storage and adds an in-memory cache front layer,
|
38
|
+
which is used to reduce the number of calls to the storage.
|
39
|
+
|
40
|
+
The in-memory cache is a TTL cache, which means that the entries are
|
41
|
+
automatically removed if a given time to live (TTL) has passed.
|
42
|
+
|
43
|
+
The in-memory cache is also an LRU cache, which means that the entries
|
44
|
+
are automatically removed if the cache size exceeds a given maxsize.
|
45
|
+
|
46
|
+
If the storage implements its strategy for maxsize, it is recommended
|
47
|
+
(but not necessary) that the storage implement the same LRU strategy,
|
48
|
+
otherwise a situation may arise when different items are deleted from
|
49
|
+
the memory cache and from the storage.
|
50
|
+
|
51
|
+
Notes
|
52
|
+
-----
|
53
|
+
Threading: in-memory caching layer is thread safe: we hold self._mem_cache_lock for
|
54
|
+
working with this self._mem_cache object.
|
55
|
+
However, we do not hold this lock when calling into the underlying storage,
|
56
|
+
so it is the responsibility of the that storage to ensure that it is safe to use
|
57
|
+
it from multiple threads.
|
58
|
+
"""
|
59
|
+
|
60
|
+
def __init__(self, persist_storage: CacheStorage, context: CacheStorageContext):
|
61
|
+
self.function_key = context.function_key
|
62
|
+
self.function_display_name = context.function_display_name
|
63
|
+
self._ttl_seconds = context.ttl_seconds
|
64
|
+
self._max_entries = context.max_entries
|
65
|
+
self._mem_cache: TTLCache[str, bytes] = TTLCache(
|
66
|
+
maxsize=self.max_entries,
|
67
|
+
ttl=self.ttl_seconds,
|
68
|
+
timer=cache_utils.TTLCACHE_TIMER,
|
69
|
+
)
|
70
|
+
self._mem_cache_lock = threading.Lock()
|
71
|
+
self._persist_storage = persist_storage
|
72
|
+
|
73
|
+
@property
|
74
|
+
def ttl_seconds(self) -> float:
|
75
|
+
return self._ttl_seconds if self._ttl_seconds is not None else math.inf
|
76
|
+
|
77
|
+
@property
|
78
|
+
def max_entries(self) -> float:
|
79
|
+
return float(self._max_entries) if self._max_entries is not None else math.inf
|
80
|
+
|
81
|
+
def get(self, key: str) -> bytes:
|
82
|
+
"""
|
83
|
+
Returns the stored value for the key or raise CacheStorageKeyNotFoundError if
|
84
|
+
the key is not found
|
85
|
+
"""
|
86
|
+
try:
|
87
|
+
entry_bytes = self._read_from_mem_cache(key)
|
88
|
+
except CacheStorageKeyNotFoundError:
|
89
|
+
entry_bytes = self._persist_storage.get(key)
|
90
|
+
self._write_to_mem_cache(key, entry_bytes)
|
91
|
+
return entry_bytes
|
92
|
+
|
93
|
+
def set(self, key: str, value: bytes) -> None:
|
94
|
+
"""Sets the value for a given key"""
|
95
|
+
self._write_to_mem_cache(key, value)
|
96
|
+
self._persist_storage.set(key, value)
|
97
|
+
|
98
|
+
def delete(self, key: str) -> None:
|
99
|
+
"""Delete a given key"""
|
100
|
+
self._remove_from_mem_cache(key)
|
101
|
+
self._persist_storage.delete(key)
|
102
|
+
|
103
|
+
def clear(self) -> None:
|
104
|
+
"""Delete all keys for the in memory cache, and also the persistent storage"""
|
105
|
+
with self._mem_cache_lock:
|
106
|
+
self._mem_cache.clear()
|
107
|
+
self._persist_storage.clear()
|
108
|
+
|
109
|
+
def get_stats(self) -> list[CacheStat]:
|
110
|
+
"""Returns a list of stats in bytes for the cache memory storage per item"""
|
111
|
+
stats = []
|
112
|
+
|
113
|
+
with self._mem_cache_lock:
|
114
|
+
for item in self._mem_cache.values():
|
115
|
+
stats.append(
|
116
|
+
CacheStat(
|
117
|
+
category_name="st_cache_data",
|
118
|
+
cache_name=self.function_display_name,
|
119
|
+
byte_length=len(item),
|
120
|
+
)
|
121
|
+
)
|
122
|
+
return stats
|
123
|
+
|
124
|
+
def close(self) -> None:
|
125
|
+
"""Closes the cache storage"""
|
126
|
+
self._persist_storage.close()
|
127
|
+
|
128
|
+
def _read_from_mem_cache(self, key: str) -> bytes:
|
129
|
+
with self._mem_cache_lock:
|
130
|
+
if key in self._mem_cache:
|
131
|
+
entry = bytes(self._mem_cache[key])
|
132
|
+
_LOGGER.debug("Memory cache HIT: %s", key)
|
133
|
+
return entry
|
134
|
+
|
135
|
+
else:
|
136
|
+
_LOGGER.debug("Memory cache MISS: %s", key)
|
137
|
+
raise CacheStorageKeyNotFoundError("Key not found in mem cache")
|
138
|
+
|
139
|
+
def _write_to_mem_cache(self, key: str, entry_bytes: bytes) -> None:
|
140
|
+
with self._mem_cache_lock:
|
141
|
+
self._mem_cache[key] = entry_bytes
|
142
|
+
|
143
|
+
def _remove_from_mem_cache(self, key: str) -> None:
|
144
|
+
with self._mem_cache_lock:
|
145
|
+
self._mem_cache.pop(key, None)
|