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,558 @@
|
|
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
|
+
"""Allows us to create and absorb changes (aka Deltas) to elements."""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
import ast
|
20
|
+
import contextlib
|
21
|
+
import inspect
|
22
|
+
import re
|
23
|
+
import types
|
24
|
+
from typing import TYPE_CHECKING, Any, Final, cast
|
25
|
+
|
26
|
+
import streamlit
|
27
|
+
from streamlit.proto.DocString_pb2 import DocString as DocStringProto
|
28
|
+
from streamlit.proto.DocString_pb2 import Member as MemberProto
|
29
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
30
|
+
from streamlit.runtime.scriptrunner.script_runner import (
|
31
|
+
__file__ as SCRIPTRUNNER_FILENAME,
|
32
|
+
)
|
33
|
+
from streamlit.runtime.secrets import Secrets
|
34
|
+
from streamlit.string_util import is_mem_address_str
|
35
|
+
|
36
|
+
if TYPE_CHECKING:
|
37
|
+
from streamlit.delta_generator import DeltaGenerator
|
38
|
+
|
39
|
+
|
40
|
+
CONFUSING_STREAMLIT_SIG_PREFIXES: Final = ("(element, ",)
|
41
|
+
|
42
|
+
|
43
|
+
class HelpMixin:
|
44
|
+
@gather_metrics("help")
|
45
|
+
def help(self, obj: Any = streamlit) -> DeltaGenerator:
|
46
|
+
"""Display help and other information for a given object.
|
47
|
+
|
48
|
+
Depending on the type of object that is passed in, this displays the
|
49
|
+
object's name, type, value, signature, docstring, and member variables,
|
50
|
+
methods — as well as the values/docstring of members and methods.
|
51
|
+
|
52
|
+
Parameters
|
53
|
+
----------
|
54
|
+
obj : any
|
55
|
+
The object whose information should be displayed. If left
|
56
|
+
unspecified, this call will display help for Streamlit itself.
|
57
|
+
|
58
|
+
Example
|
59
|
+
-------
|
60
|
+
|
61
|
+
Don't remember how to initialize a dataframe? Try this:
|
62
|
+
|
63
|
+
>>> import streamlit as st
|
64
|
+
>>> import pandas
|
65
|
+
>>>
|
66
|
+
>>> st.help(pandas.DataFrame)
|
67
|
+
|
68
|
+
.. output::
|
69
|
+
https://doc-string.streamlit.app/
|
70
|
+
height: 700px
|
71
|
+
|
72
|
+
Want to quickly check what data type is output by a certain function?
|
73
|
+
Try:
|
74
|
+
|
75
|
+
>>> import streamlit as st
|
76
|
+
>>>
|
77
|
+
>>> x = my_poorly_documented_function()
|
78
|
+
>>> st.help(x)
|
79
|
+
|
80
|
+
Want to quickly inspect an object? No sweat:
|
81
|
+
|
82
|
+
>>> class Dog:
|
83
|
+
>>> '''A typical dog.'''
|
84
|
+
>>>
|
85
|
+
>>> def __init__(self, breed, color):
|
86
|
+
>>> self.breed = breed
|
87
|
+
>>> self.color = color
|
88
|
+
>>>
|
89
|
+
>>> def bark(self):
|
90
|
+
>>> return 'Woof!'
|
91
|
+
>>>
|
92
|
+
>>>
|
93
|
+
>>> fido = Dog("poodle", "white")
|
94
|
+
>>>
|
95
|
+
>>> st.help(fido)
|
96
|
+
|
97
|
+
.. output::
|
98
|
+
https://doc-string1.streamlit.app/
|
99
|
+
height: 300px
|
100
|
+
|
101
|
+
And if you're using Magic, you can get help for functions, classes,
|
102
|
+
and modules without even typing ``st.help``:
|
103
|
+
|
104
|
+
>>> import streamlit as st
|
105
|
+
>>> import pandas
|
106
|
+
>>>
|
107
|
+
>>> # Get help for Pandas read_csv:
|
108
|
+
>>> pandas.read_csv
|
109
|
+
>>>
|
110
|
+
>>> # Get help for Streamlit itself:
|
111
|
+
>>> st
|
112
|
+
|
113
|
+
.. output::
|
114
|
+
https://doc-string2.streamlit.app/
|
115
|
+
height: 700px
|
116
|
+
"""
|
117
|
+
doc_string_proto = DocStringProto()
|
118
|
+
_marshall(doc_string_proto, obj)
|
119
|
+
return self.dg._enqueue("doc_string", doc_string_proto)
|
120
|
+
|
121
|
+
@property
|
122
|
+
def dg(self) -> DeltaGenerator:
|
123
|
+
"""Get our DeltaGenerator."""
|
124
|
+
return cast("DeltaGenerator", self)
|
125
|
+
|
126
|
+
|
127
|
+
def _marshall(doc_string_proto: DocStringProto, obj: Any) -> None:
|
128
|
+
"""Construct a DocString object.
|
129
|
+
|
130
|
+
See DeltaGenerator.help for docs.
|
131
|
+
"""
|
132
|
+
var_name = _get_variable_name()
|
133
|
+
if var_name is not None:
|
134
|
+
doc_string_proto.name = var_name
|
135
|
+
|
136
|
+
obj_type = _get_type_as_str(obj)
|
137
|
+
doc_string_proto.type = obj_type
|
138
|
+
|
139
|
+
obj_docs = _get_docstring(obj)
|
140
|
+
if obj_docs is not None:
|
141
|
+
doc_string_proto.doc_string = obj_docs
|
142
|
+
|
143
|
+
obj_value = _get_value(obj, var_name)
|
144
|
+
if obj_value is not None:
|
145
|
+
doc_string_proto.value = obj_value
|
146
|
+
|
147
|
+
doc_string_proto.members.extend(_get_members(obj))
|
148
|
+
|
149
|
+
|
150
|
+
def _get_name(obj):
|
151
|
+
# Try to get the fully-qualified name of the object.
|
152
|
+
# For example:
|
153
|
+
# st.help(bar.Baz(123))
|
154
|
+
#
|
155
|
+
# The name is bar.Baz
|
156
|
+
name = getattr(obj, "__qualname__", None)
|
157
|
+
if name:
|
158
|
+
return name
|
159
|
+
|
160
|
+
# Try to get the name of the object.
|
161
|
+
# For example:
|
162
|
+
# st.help(bar.Baz(123))
|
163
|
+
#
|
164
|
+
# The name is Baz
|
165
|
+
return getattr(obj, "__name__", None)
|
166
|
+
|
167
|
+
|
168
|
+
def _get_module(obj):
|
169
|
+
return getattr(obj, "__module__", None)
|
170
|
+
|
171
|
+
|
172
|
+
def _get_signature(obj):
|
173
|
+
if not inspect.isclass(obj) and not callable(obj):
|
174
|
+
return None
|
175
|
+
|
176
|
+
sig = ""
|
177
|
+
|
178
|
+
# TODO: Can we replace below with this?
|
179
|
+
# with contextlib.suppress(ValueError):
|
180
|
+
# sig = str(inspect.signature(obj))
|
181
|
+
|
182
|
+
try:
|
183
|
+
sig = str(inspect.signature(obj))
|
184
|
+
except ValueError:
|
185
|
+
sig = "(...)"
|
186
|
+
except TypeError:
|
187
|
+
return None
|
188
|
+
|
189
|
+
is_delta_gen = False
|
190
|
+
with contextlib.suppress(AttributeError):
|
191
|
+
is_delta_gen = obj.__module__ == "streamlit.delta_generator"
|
192
|
+
# Functions such as numpy.minimum don't have a __module__ attribute,
|
193
|
+
# since we're only using it to check if its a DeltaGenerator, its ok
|
194
|
+
# to continue
|
195
|
+
|
196
|
+
if is_delta_gen:
|
197
|
+
for prefix in CONFUSING_STREAMLIT_SIG_PREFIXES:
|
198
|
+
if sig.startswith(prefix):
|
199
|
+
sig = sig.replace(prefix, "(")
|
200
|
+
break
|
201
|
+
|
202
|
+
return sig
|
203
|
+
|
204
|
+
|
205
|
+
def _get_docstring(obj):
|
206
|
+
doc_string = inspect.getdoc(obj)
|
207
|
+
|
208
|
+
# Sometimes an object has no docstring, but the object's type does.
|
209
|
+
# If that's the case here, use the type's docstring.
|
210
|
+
# For objects where type is "type" we do not print the docs (e.g. int).
|
211
|
+
# We also do not print the docs for functions and methods if the docstring is empty.
|
212
|
+
if doc_string is None:
|
213
|
+
obj_type = type(obj)
|
214
|
+
|
215
|
+
if (
|
216
|
+
obj_type is not type
|
217
|
+
and obj_type is not types.ModuleType
|
218
|
+
and not inspect.isfunction(obj)
|
219
|
+
and not inspect.ismethod(obj)
|
220
|
+
):
|
221
|
+
doc_string = inspect.getdoc(obj_type)
|
222
|
+
|
223
|
+
if doc_string:
|
224
|
+
return doc_string.strip()
|
225
|
+
|
226
|
+
return None
|
227
|
+
|
228
|
+
|
229
|
+
def _get_variable_name():
|
230
|
+
"""Try to get the name of the variable in the current line, as set by the user.
|
231
|
+
|
232
|
+
For example:
|
233
|
+
foo = bar.Baz(123)
|
234
|
+
st.help(foo)
|
235
|
+
|
236
|
+
The name is "foo"
|
237
|
+
"""
|
238
|
+
code = _get_current_line_of_code_as_str()
|
239
|
+
|
240
|
+
if code is None:
|
241
|
+
return None
|
242
|
+
|
243
|
+
return _get_variable_name_from_code_str(code)
|
244
|
+
|
245
|
+
|
246
|
+
def _get_variable_name_from_code_str(code):
|
247
|
+
tree = ast.parse(code)
|
248
|
+
|
249
|
+
# Example:
|
250
|
+
#
|
251
|
+
# tree = Module(
|
252
|
+
# body=[
|
253
|
+
# Expr(
|
254
|
+
# value=Call(
|
255
|
+
# args=[
|
256
|
+
# Name(id='the variable name')
|
257
|
+
# ],
|
258
|
+
# keywords=[
|
259
|
+
# ???
|
260
|
+
# ],
|
261
|
+
# )
|
262
|
+
# )
|
263
|
+
# ]
|
264
|
+
# )
|
265
|
+
|
266
|
+
# Check if this is an magic call (i.e. it's not st.help or st.write).
|
267
|
+
# If that's the case, just clean it up and return it.
|
268
|
+
if not _is_stcommand(tree, command_name="help") and not _is_stcommand(
|
269
|
+
tree, command_name="write"
|
270
|
+
):
|
271
|
+
# A common pattern is to add "," at the end of a magic command to make it print.
|
272
|
+
# This removes that final ",", so it looks nicer.
|
273
|
+
code = code.removesuffix(",")
|
274
|
+
|
275
|
+
return code
|
276
|
+
|
277
|
+
arg_node = _get_stcommand_arg(tree)
|
278
|
+
|
279
|
+
# If st.help() is called without an argument, return no variable name.
|
280
|
+
if not arg_node:
|
281
|
+
return None
|
282
|
+
|
283
|
+
# If walrus, get name.
|
284
|
+
# E.g. st.help(foo := 123) should give you "foo".
|
285
|
+
elif type(arg_node) is ast.NamedExpr:
|
286
|
+
# This next "if" will always be true, but need to add this for the type-checking test to
|
287
|
+
# pass.
|
288
|
+
if type(arg_node.target) is ast.Name:
|
289
|
+
return arg_node.target.id
|
290
|
+
|
291
|
+
# If constant, there's no variable name.
|
292
|
+
# E.g. st.help("foo") or st.help(123) should give you None.
|
293
|
+
elif type(arg_node) is ast.Constant:
|
294
|
+
return None
|
295
|
+
|
296
|
+
# Otherwise, return whatever is inside st.help(<-- here -->)
|
297
|
+
|
298
|
+
# But, if multiline, only return the first line.
|
299
|
+
code_lines = code.split("\n")
|
300
|
+
is_multiline = len(code_lines) > 1
|
301
|
+
|
302
|
+
start_offset = arg_node.col_offset
|
303
|
+
|
304
|
+
if is_multiline:
|
305
|
+
first_lineno = arg_node.lineno - 1 # Lines are 1-indexed!
|
306
|
+
first_line = code_lines[first_lineno]
|
307
|
+
end_offset = None
|
308
|
+
|
309
|
+
else:
|
310
|
+
first_line = code_lines[0]
|
311
|
+
end_offset = getattr(arg_node, "end_col_offset", -1)
|
312
|
+
|
313
|
+
return first_line[start_offset:end_offset]
|
314
|
+
|
315
|
+
|
316
|
+
_NEWLINES = re.compile(r"[\n\r]+")
|
317
|
+
|
318
|
+
|
319
|
+
def _get_current_line_of_code_as_str():
|
320
|
+
scriptrunner_frame = _get_scriptrunner_frame()
|
321
|
+
|
322
|
+
if scriptrunner_frame is None:
|
323
|
+
# If there's no ScriptRunner frame, something weird is going on. This
|
324
|
+
# can happen when the script is executed with `python myscript.py`.
|
325
|
+
# Either way, let's bail out nicely just in case there's some valid
|
326
|
+
# edge case where this is OK.
|
327
|
+
return None
|
328
|
+
|
329
|
+
code_context = scriptrunner_frame.code_context
|
330
|
+
|
331
|
+
if not code_context:
|
332
|
+
# Sometimes a frame has no code_context. This can happen inside certain exec() calls, for
|
333
|
+
# example. If this happens, we can't determine the variable name. Just return.
|
334
|
+
# For the background on why exec() doesn't produce code_context, see
|
335
|
+
# https://stackoverflow.com/a/12072941
|
336
|
+
return None
|
337
|
+
|
338
|
+
code_as_string = "".join(code_context)
|
339
|
+
return re.sub(_NEWLINES, "", code_as_string.strip())
|
340
|
+
|
341
|
+
|
342
|
+
def _get_scriptrunner_frame():
|
343
|
+
prev_frame = None
|
344
|
+
scriptrunner_frame = None
|
345
|
+
|
346
|
+
# Look back in call stack to get the variable name passed into st.help().
|
347
|
+
# The frame *before* the ScriptRunner frame is the correct one.
|
348
|
+
# IMPORTANT: This will change if we refactor the code. But hopefully our tests will catch the
|
349
|
+
# issue and we'll fix it before it lands upstream!
|
350
|
+
for frame in inspect.stack():
|
351
|
+
# Check if this is running inside a funny "exec()" block that won't provide the info we
|
352
|
+
# need. If so, just quit.
|
353
|
+
if frame.code_context is None:
|
354
|
+
return None
|
355
|
+
|
356
|
+
if frame.filename == SCRIPTRUNNER_FILENAME:
|
357
|
+
scriptrunner_frame = prev_frame
|
358
|
+
break
|
359
|
+
|
360
|
+
prev_frame = frame
|
361
|
+
|
362
|
+
return scriptrunner_frame
|
363
|
+
|
364
|
+
|
365
|
+
def _is_stcommand(tree, command_name):
|
366
|
+
"""Checks whether the AST in tree is a call for command_name."""
|
367
|
+
root_node = tree.body[0].value
|
368
|
+
|
369
|
+
if not isinstance(root_node, ast.Call):
|
370
|
+
return False
|
371
|
+
|
372
|
+
return (
|
373
|
+
# st call called without module. E.g. "help()"
|
374
|
+
getattr(root_node.func, "id", None) == command_name
|
375
|
+
or
|
376
|
+
# st call called with module. E.g. "foo.help()" (where usually "foo" is "st")
|
377
|
+
getattr(root_node.func, "attr", None) == command_name
|
378
|
+
)
|
379
|
+
|
380
|
+
|
381
|
+
def _get_stcommand_arg(tree):
|
382
|
+
"""Gets the argument node for the st command in tree (AST)."""
|
383
|
+
|
384
|
+
root_node = tree.body[0].value
|
385
|
+
|
386
|
+
if root_node.args:
|
387
|
+
return root_node.args[0]
|
388
|
+
|
389
|
+
return None
|
390
|
+
|
391
|
+
|
392
|
+
def _get_type_as_str(obj):
|
393
|
+
if inspect.isclass(obj):
|
394
|
+
return "class"
|
395
|
+
|
396
|
+
return str(type(obj).__name__)
|
397
|
+
|
398
|
+
|
399
|
+
def _get_first_line(text):
|
400
|
+
if not text:
|
401
|
+
return ""
|
402
|
+
|
403
|
+
left, _, _ = text.partition("\n")
|
404
|
+
return left
|
405
|
+
|
406
|
+
|
407
|
+
def _get_weight(value):
|
408
|
+
if inspect.ismodule(value):
|
409
|
+
return 3
|
410
|
+
if inspect.isclass(value):
|
411
|
+
return 2
|
412
|
+
if callable(value):
|
413
|
+
return 1
|
414
|
+
return 0
|
415
|
+
|
416
|
+
|
417
|
+
def _get_value(obj, var_name):
|
418
|
+
obj_value = _get_human_readable_value(obj)
|
419
|
+
|
420
|
+
if obj_value is not None:
|
421
|
+
return obj_value
|
422
|
+
|
423
|
+
# If there's no human-readable value, it's some complex object.
|
424
|
+
# So let's provide other info about it.
|
425
|
+
name = _get_name(obj)
|
426
|
+
|
427
|
+
if name:
|
428
|
+
name_obj = obj
|
429
|
+
else:
|
430
|
+
# If the object itself doesn't have a name, then it's probably an instance
|
431
|
+
# of some class Foo. So let's show info about Foo in the value slot.
|
432
|
+
name_obj = type(obj)
|
433
|
+
name = _get_name(name_obj)
|
434
|
+
|
435
|
+
module = _get_module(name_obj)
|
436
|
+
sig = _get_signature(name_obj) or ""
|
437
|
+
|
438
|
+
if name:
|
439
|
+
if module:
|
440
|
+
obj_value = f"{module}.{name}{sig}"
|
441
|
+
else:
|
442
|
+
obj_value = f"{name}{sig}"
|
443
|
+
|
444
|
+
if obj_value == var_name:
|
445
|
+
# No need to repeat the same info.
|
446
|
+
# For example: st.help(re) shouldn't show "re module re", just "re module".
|
447
|
+
obj_value = None
|
448
|
+
|
449
|
+
return obj_value
|
450
|
+
|
451
|
+
|
452
|
+
def _get_human_readable_value(value):
|
453
|
+
if isinstance(value, Secrets):
|
454
|
+
# Don't want to read secrets.toml because that will show a warning if there's no
|
455
|
+
# secrets.toml file.
|
456
|
+
return None
|
457
|
+
|
458
|
+
if inspect.isclass(value) or inspect.ismodule(value) or callable(value):
|
459
|
+
return None
|
460
|
+
|
461
|
+
value_str = repr(value)
|
462
|
+
|
463
|
+
if isinstance(value, str):
|
464
|
+
# Special-case strings as human-readable because they're allowed to look like
|
465
|
+
# "<foo blarg at 0x15ee6f9a0>".
|
466
|
+
return _shorten(value_str)
|
467
|
+
|
468
|
+
if is_mem_address_str(value_str):
|
469
|
+
# If value_str looks like "<foo blarg at 0x15ee6f9a0>" it's not human readable.
|
470
|
+
return None
|
471
|
+
|
472
|
+
return _shorten(value_str)
|
473
|
+
|
474
|
+
|
475
|
+
def _shorten(s, length=300):
|
476
|
+
s = s.strip()
|
477
|
+
return s[:length] + "..." if len(s) > length else s
|
478
|
+
|
479
|
+
|
480
|
+
def _is_computed_property(obj, attr_name):
|
481
|
+
obj_class = getattr(obj, "__class__", None)
|
482
|
+
|
483
|
+
if not obj_class:
|
484
|
+
return False
|
485
|
+
|
486
|
+
# Go through superclasses in order of inheritance (mro) to see if any of them have an
|
487
|
+
# attribute called attr_name. If so, check if it's a @property.
|
488
|
+
for parent_class in inspect.getmro(obj_class):
|
489
|
+
class_attr = getattr(parent_class, attr_name, None)
|
490
|
+
|
491
|
+
if class_attr is None:
|
492
|
+
continue
|
493
|
+
|
494
|
+
# If is property, return it.
|
495
|
+
if isinstance(class_attr, property) or inspect.isgetsetdescriptor(class_attr):
|
496
|
+
return True
|
497
|
+
|
498
|
+
return False
|
499
|
+
|
500
|
+
|
501
|
+
def _get_members(obj):
|
502
|
+
members_for_sorting = []
|
503
|
+
|
504
|
+
for attr_name in dir(obj):
|
505
|
+
if attr_name.startswith("_"):
|
506
|
+
continue
|
507
|
+
|
508
|
+
try:
|
509
|
+
is_computed_value = _is_computed_property(obj, attr_name)
|
510
|
+
if is_computed_value:
|
511
|
+
parent_attr = getattr(obj.__class__, attr_name)
|
512
|
+
|
513
|
+
member_type = "property"
|
514
|
+
|
515
|
+
weight = 0
|
516
|
+
member_docs = _get_docstring(parent_attr)
|
517
|
+
member_value = None
|
518
|
+
else:
|
519
|
+
attr_value = getattr(obj, attr_name)
|
520
|
+
weight = _get_weight(attr_value)
|
521
|
+
|
522
|
+
human_readable_value = _get_human_readable_value(attr_value)
|
523
|
+
|
524
|
+
member_type = _get_type_as_str(attr_value)
|
525
|
+
|
526
|
+
if human_readable_value is None:
|
527
|
+
member_docs = _get_docstring(attr_value)
|
528
|
+
member_value = None
|
529
|
+
else:
|
530
|
+
member_docs = None
|
531
|
+
member_value = human_readable_value
|
532
|
+
except AttributeError:
|
533
|
+
# If there's an AttributeError, we can just skip it.
|
534
|
+
# This can happen when members are exposed with `dir()`
|
535
|
+
# but are conditionally unavailable.
|
536
|
+
continue
|
537
|
+
|
538
|
+
if member_type == "module":
|
539
|
+
# Don't pollute the output with all imported modules.
|
540
|
+
continue
|
541
|
+
|
542
|
+
member = MemberProto()
|
543
|
+
member.name = attr_name
|
544
|
+
member.type = member_type
|
545
|
+
|
546
|
+
if member_docs is not None:
|
547
|
+
member.doc_string = _get_first_line(member_docs)
|
548
|
+
|
549
|
+
if member_value is not None:
|
550
|
+
member.value = member_value
|
551
|
+
|
552
|
+
members_for_sorting.append((weight, member))
|
553
|
+
|
554
|
+
if members_for_sorting:
|
555
|
+
sorted_members = sorted(members_for_sorting, key=lambda x: (x[0], x[1].name))
|
556
|
+
return [m for _, m in sorted_members]
|
557
|
+
|
558
|
+
return []
|
@@ -0,0 +1,130 @@
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from typing import TYPE_CHECKING, cast
|
18
|
+
|
19
|
+
from streamlit.proto.Empty_pb2 import Empty as EmptyProto
|
20
|
+
from streamlit.proto.Skeleton_pb2 import Skeleton as SkeletonProto
|
21
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
22
|
+
|
23
|
+
if TYPE_CHECKING:
|
24
|
+
from streamlit.delta_generator import DeltaGenerator
|
25
|
+
|
26
|
+
|
27
|
+
class EmptyMixin:
|
28
|
+
@gather_metrics("empty")
|
29
|
+
def empty(self) -> DeltaGenerator:
|
30
|
+
"""Insert a single-element container.
|
31
|
+
|
32
|
+
Inserts a container into your app that can be used to hold a single element.
|
33
|
+
This allows you to, for example, remove elements at any point, or replace
|
34
|
+
several elements at once (using a child multi-element container).
|
35
|
+
|
36
|
+
To insert/replace/clear an element on the returned container, you can
|
37
|
+
use ``with`` notation or just call methods directly on the returned object.
|
38
|
+
See examples below.
|
39
|
+
|
40
|
+
Examples
|
41
|
+
--------
|
42
|
+
Inside a ``with st.empty():`` block, each displayed element will
|
43
|
+
replace the previous one.
|
44
|
+
|
45
|
+
>>> import streamlit as st
|
46
|
+
>>> import time
|
47
|
+
>>>
|
48
|
+
>>> with st.empty():
|
49
|
+
... for seconds in range(10):
|
50
|
+
... st.write(f"⏳ {seconds} seconds have passed")
|
51
|
+
... time.sleep(1)
|
52
|
+
... st.write(":material/check: 10 seconds over!")
|
53
|
+
... st.button("Rerun")
|
54
|
+
|
55
|
+
.. output::
|
56
|
+
https://doc-empty.streamlit.app/
|
57
|
+
height: 220px
|
58
|
+
|
59
|
+
You can use an ``st.empty`` to replace multiple elements in
|
60
|
+
succession. Use ``st.container`` inside ``st.empty`` to display (and
|
61
|
+
later replace) a group of elements.
|
62
|
+
|
63
|
+
>>> import streamlit as st
|
64
|
+
>>> import time
|
65
|
+
>>>
|
66
|
+
>>> st.button("Start over")
|
67
|
+
>>>
|
68
|
+
>>> placeholder = st.empty()
|
69
|
+
>>> placeholder.markdown("Hello")
|
70
|
+
>>> time.sleep(1)
|
71
|
+
>>>
|
72
|
+
>>> placeholder.progress(0, "Wait for it...")
|
73
|
+
>>> time.sleep(1)
|
74
|
+
>>> placeholder.progress(50, "Wait for it...")
|
75
|
+
>>> time.sleep(1)
|
76
|
+
>>> placeholder.progress(100, "Wait for it...")
|
77
|
+
>>> time.sleep(1)
|
78
|
+
>>>
|
79
|
+
>>> with placeholder.container():
|
80
|
+
... st.line_chart({"data": [1, 5, 2, 6]})
|
81
|
+
... time.sleep(1)
|
82
|
+
... st.markdown("3...")
|
83
|
+
... time.sleep(1)
|
84
|
+
... st.markdown("2...")
|
85
|
+
... time.sleep(1)
|
86
|
+
... st.markdown("1...")
|
87
|
+
... time.sleep(1)
|
88
|
+
>>>
|
89
|
+
>>> placeholder.markdown("Poof!")
|
90
|
+
>>> time.sleep(1)
|
91
|
+
>>>
|
92
|
+
>>> placeholder.empty()
|
93
|
+
|
94
|
+
.. output::
|
95
|
+
https://doc-empty-placeholder.streamlit.app/
|
96
|
+
height: 600px
|
97
|
+
|
98
|
+
"""
|
99
|
+
empty_proto = EmptyProto()
|
100
|
+
return self.dg._enqueue("empty", empty_proto)
|
101
|
+
|
102
|
+
@gather_metrics("_skeleton")
|
103
|
+
def _skeleton(self, *, height: int | None = None) -> DeltaGenerator:
|
104
|
+
"""Insert a single-element container which displays a "skeleton" placeholder.
|
105
|
+
|
106
|
+
Inserts a container into your app that can be used to hold a single element.
|
107
|
+
This allows you to, for example, remove elements at any point, or replace
|
108
|
+
several elements at once (using a child multi-element container).
|
109
|
+
|
110
|
+
To insert/replace/clear an element on the returned container, you can
|
111
|
+
use ``with`` notation or just call methods directly on the returned object.
|
112
|
+
See some of the examples below.
|
113
|
+
|
114
|
+
This is an internal method and should not be used directly.
|
115
|
+
|
116
|
+
Parameters
|
117
|
+
----------
|
118
|
+
height: int or None
|
119
|
+
Desired height of the skeleton expressed in pixels. If None, a
|
120
|
+
default height is used.
|
121
|
+
"""
|
122
|
+
skeleton_proto = SkeletonProto()
|
123
|
+
if height:
|
124
|
+
skeleton_proto.height = height
|
125
|
+
return self.dg._enqueue("skeleton", skeleton_proto)
|
126
|
+
|
127
|
+
@property
|
128
|
+
def dg(self) -> DeltaGenerator:
|
129
|
+
"""Get our DeltaGenerator."""
|
130
|
+
return cast("DeltaGenerator", self)
|