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,138 @@
|
|
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 uuid
|
18
|
+
from collections import defaultdict
|
19
|
+
from typing import TYPE_CHECKING
|
20
|
+
|
21
|
+
from streamlit import util
|
22
|
+
from streamlit.runtime.stats import CacheStat, group_stats
|
23
|
+
from streamlit.runtime.uploaded_file_manager import (
|
24
|
+
UploadedFileManager,
|
25
|
+
UploadedFileRec,
|
26
|
+
UploadFileUrlInfo,
|
27
|
+
)
|
28
|
+
|
29
|
+
if TYPE_CHECKING:
|
30
|
+
from collections.abc import Sequence
|
31
|
+
|
32
|
+
|
33
|
+
class MemoryUploadedFileManager(UploadedFileManager):
|
34
|
+
"""Holds files uploaded by users of the running Streamlit app.
|
35
|
+
This class can be used safely from multiple threads simultaneously.
|
36
|
+
"""
|
37
|
+
|
38
|
+
def __init__(self, upload_endpoint: str):
|
39
|
+
self.file_storage: dict[str, dict[str, UploadedFileRec]] = defaultdict(dict)
|
40
|
+
self.endpoint = upload_endpoint
|
41
|
+
|
42
|
+
def get_files(
|
43
|
+
self, session_id: str, file_ids: Sequence[str]
|
44
|
+
) -> list[UploadedFileRec]:
|
45
|
+
"""Return a list of UploadedFileRec for a given sequence of file_ids.
|
46
|
+
|
47
|
+
Parameters
|
48
|
+
----------
|
49
|
+
session_id
|
50
|
+
The ID of the session that owns the files.
|
51
|
+
file_ids
|
52
|
+
The sequence of ids associated with files to retrieve.
|
53
|
+
|
54
|
+
Returns
|
55
|
+
-------
|
56
|
+
List[UploadedFileRec]
|
57
|
+
A list of URL UploadedFileRec instances, each instance contains information
|
58
|
+
about uploaded file.
|
59
|
+
"""
|
60
|
+
session_storage = self.file_storage[session_id]
|
61
|
+
file_recs = []
|
62
|
+
|
63
|
+
for file_id in file_ids:
|
64
|
+
file_rec = session_storage.get(file_id, None)
|
65
|
+
if file_rec is not None:
|
66
|
+
file_recs.append(file_rec)
|
67
|
+
|
68
|
+
return file_recs
|
69
|
+
|
70
|
+
def remove_session_files(self, session_id: str) -> None:
|
71
|
+
"""Remove all files associated with a given session."""
|
72
|
+
self.file_storage.pop(session_id, None)
|
73
|
+
|
74
|
+
def __repr__(self) -> str:
|
75
|
+
return util.repr_(self)
|
76
|
+
|
77
|
+
def add_file(
|
78
|
+
self,
|
79
|
+
session_id: str,
|
80
|
+
file: UploadedFileRec,
|
81
|
+
) -> None:
|
82
|
+
"""
|
83
|
+
Safe to call from any thread.
|
84
|
+
|
85
|
+
Parameters
|
86
|
+
----------
|
87
|
+
session_id
|
88
|
+
The ID of the session that owns the file.
|
89
|
+
file
|
90
|
+
The file to add.
|
91
|
+
"""
|
92
|
+
|
93
|
+
self.file_storage[session_id][file.file_id] = file
|
94
|
+
|
95
|
+
def remove_file(self, session_id, file_id):
|
96
|
+
"""Remove file with given file_id associated with a given session."""
|
97
|
+
session_storage = self.file_storage[session_id]
|
98
|
+
session_storage.pop(file_id, None)
|
99
|
+
|
100
|
+
def get_upload_urls(
|
101
|
+
self, session_id: str, file_names: Sequence[str]
|
102
|
+
) -> list[UploadFileUrlInfo]:
|
103
|
+
"""Return a list of UploadFileUrlInfo for a given sequence of file_names."""
|
104
|
+
result = []
|
105
|
+
for _ in file_names:
|
106
|
+
file_id = str(uuid.uuid4())
|
107
|
+
result.append(
|
108
|
+
UploadFileUrlInfo(
|
109
|
+
file_id=file_id,
|
110
|
+
upload_url=f"{self.endpoint}/{session_id}/{file_id}",
|
111
|
+
delete_url=f"{self.endpoint}/{session_id}/{file_id}",
|
112
|
+
)
|
113
|
+
)
|
114
|
+
return result
|
115
|
+
|
116
|
+
def get_stats(self) -> list[CacheStat]:
|
117
|
+
"""Return the manager's CacheStats.
|
118
|
+
|
119
|
+
Safe to call from any thread.
|
120
|
+
"""
|
121
|
+
# Flatten all files into a single list
|
122
|
+
all_files: list[UploadedFileRec] = []
|
123
|
+
# Make copy of self.file_storage for thread safety, to be sure
|
124
|
+
# that main storage won't be changed form other thread
|
125
|
+
file_storage_copy = self.file_storage.copy()
|
126
|
+
|
127
|
+
for session_storage in file_storage_copy.values():
|
128
|
+
all_files.extend(session_storage.values())
|
129
|
+
|
130
|
+
stats: list[CacheStat] = [
|
131
|
+
CacheStat(
|
132
|
+
category_name="UploadedFileManager",
|
133
|
+
cache_name="",
|
134
|
+
byte_length=len(file.data),
|
135
|
+
)
|
136
|
+
for file in all_files
|
137
|
+
]
|
138
|
+
return group_stats(stats)
|
@@ -0,0 +1,486 @@
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import contextlib
|
18
|
+
import inspect
|
19
|
+
import os
|
20
|
+
import sys
|
21
|
+
import threading
|
22
|
+
import time
|
23
|
+
import uuid
|
24
|
+
from collections.abc import Sized
|
25
|
+
from functools import wraps
|
26
|
+
from typing import Any, Callable, Final, TypeVar, cast, overload
|
27
|
+
|
28
|
+
from streamlit import config, util
|
29
|
+
from streamlit.logger import get_logger
|
30
|
+
from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
|
31
|
+
from streamlit.proto.PageProfile_pb2 import Argument, Command
|
32
|
+
from streamlit.runtime.scriptrunner_utils.exceptions import RerunException
|
33
|
+
from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
|
34
|
+
|
35
|
+
_LOGGER: Final = get_logger(__name__)
|
36
|
+
|
37
|
+
# Limit the number of commands to keep the page profile message small
|
38
|
+
_MAX_TRACKED_COMMANDS: Final = 200
|
39
|
+
# Only track a maximum of 25 uses per unique command since some apps use
|
40
|
+
# commands excessively (e.g. calling add_rows thousands of times in one rerun)
|
41
|
+
# making the page profile useless.
|
42
|
+
_MAX_TRACKED_PER_COMMAND: Final = 25
|
43
|
+
|
44
|
+
# A mapping to convert from the actual name to preferred/shorter representations
|
45
|
+
_OBJECT_NAME_MAPPING: Final = {
|
46
|
+
"streamlit.delta_generator.DeltaGenerator": "DG",
|
47
|
+
"pandas.core.frame.DataFrame": "DataFrame",
|
48
|
+
"plotly.graph_objs._figure.Figure": "PlotlyFigure",
|
49
|
+
"bokeh.plotting.figure.Figure": "BokehFigure",
|
50
|
+
"matplotlib.figure.Figure": "MatplotlibFigure",
|
51
|
+
"pandas.io.formats.style.Styler": "PandasStyler",
|
52
|
+
"pandas.core.indexes.base.Index": "PandasIndex",
|
53
|
+
"pandas.core.series.Series": "PandasSeries",
|
54
|
+
"streamlit.connections.snowpark_connection.SnowparkConnection": "SnowparkConnection",
|
55
|
+
"streamlit.connections.sql_connection.SQLConnection": "SQLConnection",
|
56
|
+
}
|
57
|
+
|
58
|
+
# A list of dependencies to check for attribution
|
59
|
+
_ATTRIBUTIONS_TO_CHECK: Final = [
|
60
|
+
# DB Clients:
|
61
|
+
"pymysql",
|
62
|
+
"MySQLdb",
|
63
|
+
"mysql",
|
64
|
+
"pymongo",
|
65
|
+
"ibis",
|
66
|
+
"boto3",
|
67
|
+
"psycopg2",
|
68
|
+
"psycopg3",
|
69
|
+
"sqlalchemy",
|
70
|
+
"elasticsearch",
|
71
|
+
"pyodbc",
|
72
|
+
"pymssql",
|
73
|
+
"cassandra",
|
74
|
+
"azure",
|
75
|
+
"redis",
|
76
|
+
"sqlite3",
|
77
|
+
"neo4j",
|
78
|
+
"duckdb",
|
79
|
+
"opensearchpy",
|
80
|
+
"supabase",
|
81
|
+
# Dataframe Libraries:
|
82
|
+
"polars",
|
83
|
+
"dask",
|
84
|
+
"vaex",
|
85
|
+
"modin",
|
86
|
+
"pyspark",
|
87
|
+
"cudf",
|
88
|
+
"xarray",
|
89
|
+
"ray",
|
90
|
+
"geopandas",
|
91
|
+
"mars",
|
92
|
+
"tables",
|
93
|
+
"zarr",
|
94
|
+
"datasets",
|
95
|
+
# ML & LLM Tools:
|
96
|
+
"mistralai",
|
97
|
+
"openai",
|
98
|
+
"langchain",
|
99
|
+
"llama_index",
|
100
|
+
"llama_cpp",
|
101
|
+
"anthropic",
|
102
|
+
"pyllamacpp",
|
103
|
+
"cohere",
|
104
|
+
"transformers",
|
105
|
+
"nomic",
|
106
|
+
"diffusers",
|
107
|
+
"semantic_kernel",
|
108
|
+
"replicate",
|
109
|
+
"huggingface_hub",
|
110
|
+
"wandb",
|
111
|
+
"torch",
|
112
|
+
"tensorflow",
|
113
|
+
"trubrics",
|
114
|
+
"comet_ml",
|
115
|
+
"clarifai",
|
116
|
+
"reka",
|
117
|
+
"hegel",
|
118
|
+
"fastchat",
|
119
|
+
"assemblyai",
|
120
|
+
"openllm",
|
121
|
+
"embedchain",
|
122
|
+
"haystack",
|
123
|
+
"vllm",
|
124
|
+
"alpa",
|
125
|
+
"jinaai",
|
126
|
+
"guidance",
|
127
|
+
"litellm",
|
128
|
+
"comet_llm",
|
129
|
+
"instructor",
|
130
|
+
"xgboost",
|
131
|
+
"lightgbm",
|
132
|
+
"catboost",
|
133
|
+
"sklearn",
|
134
|
+
# Workflow Tools:
|
135
|
+
"prefect",
|
136
|
+
"luigi",
|
137
|
+
"airflow",
|
138
|
+
"dagster",
|
139
|
+
# Vector Stores:
|
140
|
+
"pgvector",
|
141
|
+
"faiss",
|
142
|
+
"annoy",
|
143
|
+
"pinecone",
|
144
|
+
"chromadb",
|
145
|
+
"weaviate",
|
146
|
+
"qdrant_client",
|
147
|
+
"pymilvus",
|
148
|
+
"lancedb",
|
149
|
+
# Others:
|
150
|
+
"snowflake",
|
151
|
+
"streamlit_extras",
|
152
|
+
"streamlit_pydantic",
|
153
|
+
"pydantic",
|
154
|
+
"plost",
|
155
|
+
"authlib",
|
156
|
+
]
|
157
|
+
|
158
|
+
_ETC_MACHINE_ID_PATH = "/etc/machine-id"
|
159
|
+
_DBUS_MACHINE_ID_PATH = "/var/lib/dbus/machine-id"
|
160
|
+
|
161
|
+
|
162
|
+
def _get_machine_id_v3() -> str:
|
163
|
+
"""Get the machine ID
|
164
|
+
|
165
|
+
This is a unique identifier for a user for tracking metrics,
|
166
|
+
that is broken in different ways in some Linux distros and Docker images.
|
167
|
+
- at times just a hash of '', which means many machines map to the same ID
|
168
|
+
- at times a hash of the same string, when running in a Docker container
|
169
|
+
"""
|
170
|
+
|
171
|
+
machine_id = str(uuid.getnode())
|
172
|
+
if os.path.isfile(_ETC_MACHINE_ID_PATH):
|
173
|
+
with open(_ETC_MACHINE_ID_PATH) as f:
|
174
|
+
machine_id = f.read()
|
175
|
+
|
176
|
+
elif os.path.isfile(_DBUS_MACHINE_ID_PATH):
|
177
|
+
with open(_DBUS_MACHINE_ID_PATH) as f:
|
178
|
+
machine_id = f.read()
|
179
|
+
|
180
|
+
return machine_id
|
181
|
+
|
182
|
+
|
183
|
+
class Installation:
|
184
|
+
_instance_lock = threading.Lock()
|
185
|
+
_instance: Installation | None = None
|
186
|
+
|
187
|
+
@classmethod
|
188
|
+
def instance(cls) -> Installation:
|
189
|
+
"""Returns the singleton Installation"""
|
190
|
+
# We use a double-checked locking optimization to avoid the overhead
|
191
|
+
# of acquiring the lock in the common case:
|
192
|
+
# https://en.wikipedia.org/wiki/Double-checked_locking
|
193
|
+
if cls._instance is None:
|
194
|
+
with cls._instance_lock:
|
195
|
+
if cls._instance is None:
|
196
|
+
cls._instance = Installation()
|
197
|
+
return cls._instance
|
198
|
+
|
199
|
+
def __init__(self):
|
200
|
+
self.installation_id_v3 = str(
|
201
|
+
uuid.uuid5(uuid.NAMESPACE_DNS, _get_machine_id_v3())
|
202
|
+
)
|
203
|
+
|
204
|
+
def __repr__(self) -> str:
|
205
|
+
return util.repr_(self)
|
206
|
+
|
207
|
+
@property
|
208
|
+
def installation_id(self):
|
209
|
+
return self.installation_id_v3
|
210
|
+
|
211
|
+
|
212
|
+
def _get_type_name(obj: object) -> str:
|
213
|
+
"""Get a simplified name for the type of the given object."""
|
214
|
+
with contextlib.suppress(Exception):
|
215
|
+
obj_type = obj if inspect.isclass(obj) else type(obj)
|
216
|
+
type_name = "unknown"
|
217
|
+
if hasattr(obj_type, "__qualname__"):
|
218
|
+
type_name = obj_type.__qualname__
|
219
|
+
elif hasattr(obj_type, "__name__"):
|
220
|
+
type_name = obj_type.__name__
|
221
|
+
|
222
|
+
if obj_type.__module__ != "builtins":
|
223
|
+
# Add the full module path
|
224
|
+
type_name = f"{obj_type.__module__}.{type_name}"
|
225
|
+
|
226
|
+
if type_name in _OBJECT_NAME_MAPPING:
|
227
|
+
type_name = _OBJECT_NAME_MAPPING[type_name]
|
228
|
+
return type_name
|
229
|
+
return "failed"
|
230
|
+
|
231
|
+
|
232
|
+
def _get_top_level_module(func: Callable[..., Any]) -> str:
|
233
|
+
"""Get the top level module for the given function."""
|
234
|
+
module = inspect.getmodule(func)
|
235
|
+
if module is None or not module.__name__:
|
236
|
+
return "unknown"
|
237
|
+
return module.__name__.split(".")[0]
|
238
|
+
|
239
|
+
|
240
|
+
def _get_arg_metadata(arg: object) -> str | None:
|
241
|
+
"""Get metadata information related to the value of the given object."""
|
242
|
+
with contextlib.suppress(Exception):
|
243
|
+
if isinstance(arg, (bool)):
|
244
|
+
return f"val:{arg}"
|
245
|
+
|
246
|
+
if isinstance(arg, Sized):
|
247
|
+
return f"len:{len(arg)}"
|
248
|
+
|
249
|
+
return None
|
250
|
+
|
251
|
+
|
252
|
+
def _get_command_telemetry(
|
253
|
+
_command_func: Callable[..., Any], _command_name: str, *args, **kwargs
|
254
|
+
) -> Command:
|
255
|
+
"""Get telemetry information for the given callable and its arguments."""
|
256
|
+
arg_keywords = inspect.getfullargspec(_command_func).args
|
257
|
+
self_arg: Any | None = None
|
258
|
+
arguments: list[Argument] = []
|
259
|
+
is_method = inspect.ismethod(_command_func)
|
260
|
+
name = _command_name
|
261
|
+
|
262
|
+
for i, arg in enumerate(args):
|
263
|
+
pos = i
|
264
|
+
if is_method:
|
265
|
+
# If func is a method, ignore the first argument (self)
|
266
|
+
i = i + 1
|
267
|
+
|
268
|
+
keyword = arg_keywords[i] if len(arg_keywords) > i else f"{i}"
|
269
|
+
if keyword == "self":
|
270
|
+
self_arg = arg
|
271
|
+
continue
|
272
|
+
argument = Argument(k=keyword, t=_get_type_name(arg), p=pos)
|
273
|
+
|
274
|
+
arg_metadata = _get_arg_metadata(arg)
|
275
|
+
if arg_metadata:
|
276
|
+
argument.m = arg_metadata
|
277
|
+
arguments.append(argument)
|
278
|
+
for kwarg, kwarg_value in kwargs.items():
|
279
|
+
argument = Argument(k=kwarg, t=_get_type_name(kwarg_value))
|
280
|
+
|
281
|
+
arg_metadata = _get_arg_metadata(kwarg_value)
|
282
|
+
if arg_metadata:
|
283
|
+
argument.m = arg_metadata
|
284
|
+
arguments.append(argument)
|
285
|
+
|
286
|
+
top_level_module = _get_top_level_module(_command_func)
|
287
|
+
if top_level_module != "streamlit":
|
288
|
+
# If the gather_metrics decorator is used outside of streamlit library
|
289
|
+
# we enforce a prefix to be added to the tracked command:
|
290
|
+
name = f"external:{top_level_module}:{name}"
|
291
|
+
|
292
|
+
if (
|
293
|
+
name == "create_instance"
|
294
|
+
and self_arg
|
295
|
+
and hasattr(self_arg, "name")
|
296
|
+
and self_arg.name
|
297
|
+
):
|
298
|
+
name = f"component:{self_arg.name}"
|
299
|
+
|
300
|
+
return Command(name=name, args=arguments)
|
301
|
+
|
302
|
+
|
303
|
+
def to_microseconds(seconds: float) -> int:
|
304
|
+
"""Convert seconds into microseconds."""
|
305
|
+
return int(seconds * 1_000_000)
|
306
|
+
|
307
|
+
|
308
|
+
F = TypeVar("F", bound=Callable[..., Any])
|
309
|
+
|
310
|
+
|
311
|
+
@overload
|
312
|
+
def gather_metrics(
|
313
|
+
name: str,
|
314
|
+
func: F,
|
315
|
+
) -> F: ...
|
316
|
+
|
317
|
+
|
318
|
+
@overload
|
319
|
+
def gather_metrics(
|
320
|
+
name: str,
|
321
|
+
func: None = None,
|
322
|
+
) -> Callable[[F], F]: ...
|
323
|
+
|
324
|
+
|
325
|
+
def gather_metrics(name: str, func: F | None = None) -> Callable[[F], F] | F:
|
326
|
+
"""Function decorator to add telemetry tracking to commands.
|
327
|
+
|
328
|
+
Parameters
|
329
|
+
----------
|
330
|
+
func : callable
|
331
|
+
The function to track for telemetry.
|
332
|
+
|
333
|
+
name : str or None
|
334
|
+
Overwrite the function name with a custom name that is used for telemetry tracking.
|
335
|
+
|
336
|
+
Example
|
337
|
+
-------
|
338
|
+
>>> @st.gather_metrics
|
339
|
+
... def my_command(url):
|
340
|
+
... return url
|
341
|
+
|
342
|
+
>>> @st.gather_metrics(name="custom_name")
|
343
|
+
... def my_command(url):
|
344
|
+
... return url
|
345
|
+
"""
|
346
|
+
|
347
|
+
if not name:
|
348
|
+
_LOGGER.warning("gather_metrics: name is empty")
|
349
|
+
name = "undefined"
|
350
|
+
|
351
|
+
if func is None:
|
352
|
+
# Support passing the params via function decorator
|
353
|
+
def wrapper(f: F) -> F:
|
354
|
+
return gather_metrics(
|
355
|
+
name=name,
|
356
|
+
func=f,
|
357
|
+
)
|
358
|
+
|
359
|
+
return wrapper
|
360
|
+
else:
|
361
|
+
# To make mypy type narrow F | None -> F
|
362
|
+
non_optional_func = func
|
363
|
+
|
364
|
+
@wraps(non_optional_func)
|
365
|
+
def wrapped_func(*args, **kwargs):
|
366
|
+
from timeit import default_timer as timer
|
367
|
+
|
368
|
+
exec_start = timer()
|
369
|
+
ctx = get_script_run_ctx(suppress_warning=True)
|
370
|
+
|
371
|
+
tracking_activated = (
|
372
|
+
ctx is not None
|
373
|
+
and ctx.gather_usage_stats
|
374
|
+
and not ctx.command_tracking_deactivated
|
375
|
+
and len(ctx.tracked_commands)
|
376
|
+
< _MAX_TRACKED_COMMANDS # Prevent too much memory usage
|
377
|
+
)
|
378
|
+
|
379
|
+
command_telemetry: Command | None = None
|
380
|
+
# This flag is needed to make sure that only the command (the outermost command)
|
381
|
+
# that deactivated tracking (via ctx.command_tracking_deactivated) is able to reset it
|
382
|
+
# again. This is important to prevent nested commands from reactivating tracking.
|
383
|
+
# At this point, we don't know yet if the command will deactivated tracking.
|
384
|
+
has_set_command_tracking_deactivated = False
|
385
|
+
|
386
|
+
if ctx and tracking_activated:
|
387
|
+
try:
|
388
|
+
command_telemetry = _get_command_telemetry(
|
389
|
+
non_optional_func, name, *args, **kwargs
|
390
|
+
)
|
391
|
+
|
392
|
+
if (
|
393
|
+
command_telemetry.name not in ctx.tracked_commands_counter
|
394
|
+
or ctx.tracked_commands_counter[command_telemetry.name]
|
395
|
+
< _MAX_TRACKED_PER_COMMAND
|
396
|
+
):
|
397
|
+
ctx.tracked_commands.append(command_telemetry)
|
398
|
+
ctx.tracked_commands_counter.update([command_telemetry.name])
|
399
|
+
# Deactivate tracking to prevent calls inside already tracked commands
|
400
|
+
ctx.command_tracking_deactivated = True
|
401
|
+
# The ctx.command_tracking_deactivated flag was set to True,
|
402
|
+
# we also need to set has_set_command_tracking_deactivated to True
|
403
|
+
# to make sure that this command is able to reset it again.
|
404
|
+
has_set_command_tracking_deactivated = True
|
405
|
+
except Exception as ex:
|
406
|
+
# Always capture all exceptions since we want to make sure that
|
407
|
+
# the telemetry never causes any issues.
|
408
|
+
_LOGGER.debug("Failed to collect command telemetry", exc_info=ex)
|
409
|
+
try:
|
410
|
+
result = non_optional_func(*args, **kwargs)
|
411
|
+
except RerunException as ex:
|
412
|
+
# Duplicated from below, because static analysis tools get confused
|
413
|
+
# by deferring the rethrow.
|
414
|
+
if tracking_activated and command_telemetry:
|
415
|
+
command_telemetry.time = to_microseconds(timer() - exec_start)
|
416
|
+
raise ex
|
417
|
+
finally:
|
418
|
+
# Activate tracking again if command executes without any exceptions
|
419
|
+
# we only want to do that if this command has set the
|
420
|
+
# flag to deactivate tracking.
|
421
|
+
if ctx and has_set_command_tracking_deactivated:
|
422
|
+
ctx.command_tracking_deactivated = False
|
423
|
+
|
424
|
+
if tracking_activated and command_telemetry:
|
425
|
+
# Set the execution time to the measured value
|
426
|
+
command_telemetry.time = to_microseconds(timer() - exec_start)
|
427
|
+
|
428
|
+
return result
|
429
|
+
|
430
|
+
with contextlib.suppress(AttributeError):
|
431
|
+
# Make this a well-behaved decorator by preserving important function
|
432
|
+
# attributes.
|
433
|
+
wrapped_func.__dict__.update(non_optional_func.__dict__)
|
434
|
+
wrapped_func.__signature__ = inspect.signature(non_optional_func) # type: ignore
|
435
|
+
return cast(F, wrapped_func)
|
436
|
+
|
437
|
+
|
438
|
+
def create_page_profile_message(
|
439
|
+
commands: list[Command],
|
440
|
+
exec_time: int,
|
441
|
+
prep_time: int,
|
442
|
+
uncaught_exception: str | None = None,
|
443
|
+
) -> ForwardMsg:
|
444
|
+
"""Create and return the full PageProfile ForwardMsg."""
|
445
|
+
msg = ForwardMsg()
|
446
|
+
page_profile = msg.page_profile
|
447
|
+
|
448
|
+
page_profile.commands.extend(commands)
|
449
|
+
page_profile.exec_time = exec_time
|
450
|
+
page_profile.prep_time = prep_time
|
451
|
+
|
452
|
+
page_profile.headless = config.get_option("server.headless")
|
453
|
+
|
454
|
+
# Collect all config options that have been manually set
|
455
|
+
config_options: set[str] = set()
|
456
|
+
if config._config_options:
|
457
|
+
for option_name in config._config_options.keys():
|
458
|
+
if not config.is_manually_set(option_name):
|
459
|
+
# We only care about manually defined options
|
460
|
+
continue
|
461
|
+
|
462
|
+
config_option = config._config_options[option_name]
|
463
|
+
if config_option.is_default:
|
464
|
+
option_name = f"{option_name}:default"
|
465
|
+
config_options.add(option_name)
|
466
|
+
|
467
|
+
page_profile.config.extend(config_options)
|
468
|
+
|
469
|
+
# Check the predefined set of modules for attribution
|
470
|
+
attributions: set[str] = {
|
471
|
+
attribution
|
472
|
+
for attribution in _ATTRIBUTIONS_TO_CHECK
|
473
|
+
if attribution in sys.modules
|
474
|
+
}
|
475
|
+
|
476
|
+
page_profile.os = str(sys.platform)
|
477
|
+
page_profile.timezone = str(time.tzname)
|
478
|
+
page_profile.attributions.extend(attributions)
|
479
|
+
|
480
|
+
if uncaught_exception:
|
481
|
+
page_profile.uncaught_exception = uncaught_exception
|
482
|
+
|
483
|
+
if ctx := get_script_run_ctx():
|
484
|
+
page_profile.is_fragment_run = bool(ctx.fragment_ids_this_run)
|
485
|
+
|
486
|
+
return msg
|