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,183 @@
|
|
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 time
|
18
|
+
from typing import TYPE_CHECKING, Literal, cast
|
19
|
+
|
20
|
+
from typing_extensions import Self, TypeAlias
|
21
|
+
|
22
|
+
from streamlit.delta_generator import DeltaGenerator
|
23
|
+
from streamlit.errors import StreamlitAPIException
|
24
|
+
from streamlit.proto.Block_pb2 import Block as BlockProto
|
25
|
+
from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
|
26
|
+
from streamlit.runtime.scriptrunner_utils.script_run_context import enqueue_message
|
27
|
+
|
28
|
+
if TYPE_CHECKING:
|
29
|
+
from types import TracebackType
|
30
|
+
|
31
|
+
from streamlit.cursor import Cursor
|
32
|
+
|
33
|
+
States: TypeAlias = Literal["running", "complete", "error"]
|
34
|
+
|
35
|
+
|
36
|
+
class StatusContainer(DeltaGenerator):
|
37
|
+
@staticmethod
|
38
|
+
def _create(
|
39
|
+
parent: DeltaGenerator,
|
40
|
+
label: str,
|
41
|
+
expanded: bool = False,
|
42
|
+
state: States = "running",
|
43
|
+
) -> StatusContainer:
|
44
|
+
expandable_proto = BlockProto.Expandable()
|
45
|
+
expandable_proto.expanded = expanded
|
46
|
+
expandable_proto.label = label or ""
|
47
|
+
|
48
|
+
if state == "running":
|
49
|
+
expandable_proto.icon = "spinner"
|
50
|
+
elif state == "complete":
|
51
|
+
expandable_proto.icon = ":material/check:"
|
52
|
+
elif state == "error":
|
53
|
+
expandable_proto.icon = ":material/error:"
|
54
|
+
else:
|
55
|
+
raise StreamlitAPIException(
|
56
|
+
f"Unknown state ({state}). Must be one of 'running', 'complete', or 'error'."
|
57
|
+
)
|
58
|
+
|
59
|
+
block_proto = BlockProto()
|
60
|
+
block_proto.allow_empty = True
|
61
|
+
block_proto.expandable.CopyFrom(expandable_proto)
|
62
|
+
|
63
|
+
delta_path: list[int] = (
|
64
|
+
parent._active_dg._cursor.delta_path if parent._active_dg._cursor else []
|
65
|
+
)
|
66
|
+
|
67
|
+
status_container = cast(
|
68
|
+
StatusContainer,
|
69
|
+
parent._block(block_proto=block_proto, dg_type=StatusContainer),
|
70
|
+
)
|
71
|
+
|
72
|
+
# Apply initial configuration
|
73
|
+
status_container._delta_path = delta_path
|
74
|
+
status_container._current_proto = block_proto
|
75
|
+
status_container._current_state = state
|
76
|
+
|
77
|
+
# We need to sleep here for a very short time to prevent issues when
|
78
|
+
# the status is updated too quickly. If an .update() directly follows the
|
79
|
+
# the initialization, sometimes only the latest update is applied.
|
80
|
+
# Adding a short timeout here allows the frontend to render the update before.
|
81
|
+
time.sleep(0.05)
|
82
|
+
|
83
|
+
return status_container
|
84
|
+
|
85
|
+
def __init__(
|
86
|
+
self,
|
87
|
+
root_container: int | None,
|
88
|
+
cursor: Cursor | None,
|
89
|
+
parent: DeltaGenerator | None,
|
90
|
+
block_type: str | None,
|
91
|
+
):
|
92
|
+
super().__init__(root_container, cursor, parent, block_type)
|
93
|
+
|
94
|
+
# Initialized in `_create()`:
|
95
|
+
self._current_proto: BlockProto | None = None
|
96
|
+
self._current_state: States | None = None
|
97
|
+
self._delta_path: list[int] | None = None
|
98
|
+
|
99
|
+
def update(
|
100
|
+
self,
|
101
|
+
*,
|
102
|
+
label: str | None = None,
|
103
|
+
expanded: bool | None = None,
|
104
|
+
state: States | None = None,
|
105
|
+
) -> None:
|
106
|
+
"""Update the status container.
|
107
|
+
|
108
|
+
Only specified arguments are updated. Container contents and unspecified
|
109
|
+
arguments remain unchanged.
|
110
|
+
|
111
|
+
Parameters
|
112
|
+
----------
|
113
|
+
label : str or None
|
114
|
+
A new label of the status container. If None, the label is not
|
115
|
+
changed.
|
116
|
+
|
117
|
+
expanded : bool or None
|
118
|
+
The new expanded state of the status container. If None,
|
119
|
+
the expanded state is not changed.
|
120
|
+
|
121
|
+
state : "running", "complete", "error", or None
|
122
|
+
The new state of the status container. This mainly changes the
|
123
|
+
icon. If None, the state is not changed.
|
124
|
+
"""
|
125
|
+
assert self._current_proto is not None, "Status not correctly initialized!"
|
126
|
+
assert self._delta_path is not None, "Status not correctly initialized!"
|
127
|
+
|
128
|
+
msg = ForwardMsg()
|
129
|
+
msg.metadata.delta_path[:] = self._delta_path
|
130
|
+
msg.delta.add_block.CopyFrom(self._current_proto)
|
131
|
+
|
132
|
+
if expanded is not None:
|
133
|
+
msg.delta.add_block.expandable.expanded = expanded
|
134
|
+
else:
|
135
|
+
msg.delta.add_block.expandable.ClearField("expanded")
|
136
|
+
|
137
|
+
if label is not None:
|
138
|
+
msg.delta.add_block.expandable.label = label
|
139
|
+
|
140
|
+
if state is not None:
|
141
|
+
if state == "running":
|
142
|
+
msg.delta.add_block.expandable.icon = "spinner"
|
143
|
+
elif state == "complete":
|
144
|
+
msg.delta.add_block.expandable.icon = ":material/check:"
|
145
|
+
elif state == "error":
|
146
|
+
msg.delta.add_block.expandable.icon = ":material/error:"
|
147
|
+
else:
|
148
|
+
raise StreamlitAPIException(
|
149
|
+
f"Unknown state ({state}). Must be one of 'running', 'complete', or 'error'."
|
150
|
+
)
|
151
|
+
self._current_state = state
|
152
|
+
|
153
|
+
self._current_proto = msg.delta.add_block
|
154
|
+
enqueue_message(msg)
|
155
|
+
|
156
|
+
def __enter__(self) -> Self: # type: ignore[override]
|
157
|
+
# This is a little dubious: we're returning a different type than
|
158
|
+
# our superclass' `__enter__` function. Maybe DeltaGenerator.__enter__
|
159
|
+
# should always return `self`?
|
160
|
+
super().__enter__()
|
161
|
+
return self
|
162
|
+
|
163
|
+
def __exit__(
|
164
|
+
self,
|
165
|
+
exc_type: type[BaseException] | None,
|
166
|
+
exc_val: BaseException | None,
|
167
|
+
exc_tb: TracebackType | None,
|
168
|
+
) -> Literal[False]:
|
169
|
+
# Only update if the current state is running
|
170
|
+
if self._current_state == "running":
|
171
|
+
# We need to sleep here for a very short time to prevent issues when
|
172
|
+
# the status is updated too quickly. If an .update() is directly followed
|
173
|
+
# by the exit of the context manager, sometimes only the last update
|
174
|
+
# (to complete) is applied. Adding a short timeout here allows the frontend
|
175
|
+
# to render the update before.
|
176
|
+
time.sleep(0.05)
|
177
|
+
if exc_type is not None:
|
178
|
+
# If an exception was raised in the context,
|
179
|
+
# we want to update the status to error.
|
180
|
+
self.update(state="error")
|
181
|
+
else:
|
182
|
+
self.update(state="complete")
|
183
|
+
return super().__exit__(exc_type, exc_val, exc_tb)
|
@@ -0,0 +1,250 @@
|
|
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 enum import Enum, EnumMeta
|
18
|
+
from typing import TYPE_CHECKING, Any, Final, TypeVar, overload
|
19
|
+
|
20
|
+
from streamlit import config, logger
|
21
|
+
from streamlit.dataframe_util import OptionSequence, convert_anything_to_list
|
22
|
+
from streamlit.errors import StreamlitAPIException
|
23
|
+
from streamlit.runtime.state.common import RegisterWidgetResult
|
24
|
+
from streamlit.type_util import (
|
25
|
+
T,
|
26
|
+
check_python_comparable,
|
27
|
+
)
|
28
|
+
|
29
|
+
if TYPE_CHECKING:
|
30
|
+
from collections.abc import Iterable, Sequence
|
31
|
+
|
32
|
+
_LOGGER: Final = logger.get_logger(__name__)
|
33
|
+
|
34
|
+
_FLOAT_EQUALITY_EPSILON: Final[float] = 0.000000000005
|
35
|
+
_Value = TypeVar("_Value")
|
36
|
+
|
37
|
+
|
38
|
+
def index_(iterable: Iterable[_Value], x: _Value) -> int:
|
39
|
+
"""Return zero-based index of the first item whose value is equal to x.
|
40
|
+
Raises a ValueError if there is no such item.
|
41
|
+
|
42
|
+
We need a custom implementation instead of the built-in list .index() to
|
43
|
+
be compatible with NumPy array and Pandas Series.
|
44
|
+
|
45
|
+
Parameters
|
46
|
+
----------
|
47
|
+
iterable : list, tuple, numpy.ndarray, pandas.Series
|
48
|
+
x : Any
|
49
|
+
|
50
|
+
Returns
|
51
|
+
-------
|
52
|
+
int
|
53
|
+
"""
|
54
|
+
for i, value in enumerate(iterable):
|
55
|
+
if x == value:
|
56
|
+
return i
|
57
|
+
elif isinstance(value, float) and isinstance(x, float):
|
58
|
+
if abs(x - value) < _FLOAT_EQUALITY_EPSILON:
|
59
|
+
return i
|
60
|
+
raise ValueError(f"{str(x)} is not in iterable")
|
61
|
+
|
62
|
+
|
63
|
+
def check_and_convert_to_indices(
|
64
|
+
opt: Sequence[Any], default_values: Sequence[Any] | Any | None
|
65
|
+
) -> list[int] | None:
|
66
|
+
"""Perform validation checks and return indices based on the default values."""
|
67
|
+
if default_values is None:
|
68
|
+
return None
|
69
|
+
|
70
|
+
default_values = convert_anything_to_list(default_values)
|
71
|
+
|
72
|
+
for value in default_values:
|
73
|
+
if value not in opt:
|
74
|
+
raise StreamlitAPIException(
|
75
|
+
f"The default value '{value}' is not part of the options. "
|
76
|
+
"Please make sure that every default values also exists in the options."
|
77
|
+
)
|
78
|
+
|
79
|
+
return [opt.index(value) for value in default_values]
|
80
|
+
|
81
|
+
|
82
|
+
def convert_to_sequence_and_check_comparable(options: OptionSequence[T]) -> Sequence[T]:
|
83
|
+
indexable_options = convert_anything_to_list(options)
|
84
|
+
check_python_comparable(indexable_options)
|
85
|
+
return indexable_options
|
86
|
+
|
87
|
+
|
88
|
+
def get_default_indices(
|
89
|
+
indexable_options: Sequence[T], default: Sequence[Any] | Any | None = None
|
90
|
+
) -> list[int]:
|
91
|
+
default_indices = check_and_convert_to_indices(indexable_options, default)
|
92
|
+
default_indices = default_indices if default_indices is not None else []
|
93
|
+
return default_indices
|
94
|
+
|
95
|
+
|
96
|
+
E1 = TypeVar("E1", bound=Enum)
|
97
|
+
E2 = TypeVar("E2", bound=Enum)
|
98
|
+
|
99
|
+
_ALLOWED_ENUM_COERCION_CONFIG_SETTINGS = ("off", "nameOnly", "nameAndValue")
|
100
|
+
|
101
|
+
|
102
|
+
def _coerce_enum(from_enum_value: E1, to_enum_class: type[E2]) -> E1 | E2:
|
103
|
+
"""Attempt to coerce an Enum value to another EnumMeta.
|
104
|
+
|
105
|
+
An Enum value of EnumMeta E1 is considered coercable to EnumType E2
|
106
|
+
if the EnumMeta __qualname__ match and the names of their members
|
107
|
+
match as well. (This is configurable in streamlist configs)
|
108
|
+
"""
|
109
|
+
if not isinstance(from_enum_value, Enum):
|
110
|
+
raise ValueError(
|
111
|
+
f"Expected an Enum in the first argument. Got {type(from_enum_value)}"
|
112
|
+
)
|
113
|
+
if not isinstance(to_enum_class, EnumMeta):
|
114
|
+
raise ValueError(
|
115
|
+
f"Expected an EnumMeta/Type in the second argument. Got {type(to_enum_class)}"
|
116
|
+
)
|
117
|
+
if isinstance(from_enum_value, to_enum_class):
|
118
|
+
return from_enum_value # Enum is already a member, no coersion necessary
|
119
|
+
|
120
|
+
coercion_type = config.get_option("runner.enumCoercion")
|
121
|
+
if coercion_type not in _ALLOWED_ENUM_COERCION_CONFIG_SETTINGS:
|
122
|
+
raise StreamlitAPIException(
|
123
|
+
"Invalid value for config option runner.enumCoercion. "
|
124
|
+
f"Expected one of {_ALLOWED_ENUM_COERCION_CONFIG_SETTINGS}, "
|
125
|
+
f"but got '{coercion_type}'."
|
126
|
+
)
|
127
|
+
if coercion_type == "off":
|
128
|
+
return from_enum_value # do not attempt to coerce
|
129
|
+
|
130
|
+
# We now know this is an Enum AND the user has configured coercion enabled.
|
131
|
+
# Check if we do NOT meet the required conditions and log a failure message
|
132
|
+
# if that is the case.
|
133
|
+
from_enum_class = from_enum_value.__class__
|
134
|
+
if (
|
135
|
+
from_enum_class.__qualname__ != to_enum_class.__qualname__
|
136
|
+
or (
|
137
|
+
coercion_type == "nameOnly"
|
138
|
+
and set(to_enum_class._member_names_) != set(from_enum_class._member_names_)
|
139
|
+
)
|
140
|
+
or (
|
141
|
+
coercion_type == "nameAndValue"
|
142
|
+
and set(to_enum_class._value2member_map_)
|
143
|
+
!= set(from_enum_class._value2member_map_)
|
144
|
+
)
|
145
|
+
):
|
146
|
+
_LOGGER.debug("Failed to coerce %s to class %s", from_enum_value, to_enum_class)
|
147
|
+
return from_enum_value # do not attempt to coerce
|
148
|
+
|
149
|
+
# At this point we think the Enum is coercable, and we know
|
150
|
+
# E1 and E2 have the same member names. We convert from E1 to E2 using _name_
|
151
|
+
# (since user Enum subclasses can override the .name property in 3.11)
|
152
|
+
_LOGGER.debug("Coerced %s to class %s", from_enum_value, to_enum_class)
|
153
|
+
return to_enum_class[from_enum_value._name_]
|
154
|
+
|
155
|
+
|
156
|
+
def _extract_common_class_from_iter(iterable: Iterable[Any]) -> Any:
|
157
|
+
"""Return the common class of all elements in a iterable if they share one.
|
158
|
+
Otherwise, return None."""
|
159
|
+
try:
|
160
|
+
inner_iter = iter(iterable)
|
161
|
+
first_class = type(next(inner_iter))
|
162
|
+
except StopIteration:
|
163
|
+
return None
|
164
|
+
if all(type(item) is first_class for item in inner_iter):
|
165
|
+
return first_class
|
166
|
+
return None
|
167
|
+
|
168
|
+
|
169
|
+
@overload
|
170
|
+
def maybe_coerce_enum(
|
171
|
+
register_widget_result: RegisterWidgetResult[Enum],
|
172
|
+
options: type[Enum],
|
173
|
+
opt_sequence: Sequence[Any],
|
174
|
+
) -> RegisterWidgetResult[Enum]: ...
|
175
|
+
|
176
|
+
|
177
|
+
@overload
|
178
|
+
def maybe_coerce_enum(
|
179
|
+
register_widget_result: RegisterWidgetResult[T],
|
180
|
+
options: OptionSequence[T],
|
181
|
+
opt_sequence: Sequence[T],
|
182
|
+
) -> RegisterWidgetResult[T]: ...
|
183
|
+
|
184
|
+
|
185
|
+
def maybe_coerce_enum(register_widget_result, options, opt_sequence):
|
186
|
+
"""Maybe Coerce a RegisterWidgetResult with an Enum member value to
|
187
|
+
RegisterWidgetResult[option] if option is an EnumType, otherwise just return
|
188
|
+
the original RegisterWidgetResult."""
|
189
|
+
|
190
|
+
# If the value is not a Enum, return early
|
191
|
+
if not isinstance(register_widget_result.value, Enum):
|
192
|
+
return register_widget_result
|
193
|
+
|
194
|
+
coerce_class: EnumMeta | None
|
195
|
+
if isinstance(options, EnumMeta):
|
196
|
+
coerce_class = options
|
197
|
+
else:
|
198
|
+
coerce_class = _extract_common_class_from_iter(opt_sequence)
|
199
|
+
if coerce_class is None:
|
200
|
+
return register_widget_result
|
201
|
+
|
202
|
+
return RegisterWidgetResult(
|
203
|
+
_coerce_enum(register_widget_result.value, coerce_class),
|
204
|
+
register_widget_result.value_changed,
|
205
|
+
)
|
206
|
+
|
207
|
+
|
208
|
+
# slightly ugly typing because TypeVars with Generic Bounds are not supported
|
209
|
+
# (https://github.com/python/typing/issues/548)
|
210
|
+
@overload
|
211
|
+
def maybe_coerce_enum_sequence(
|
212
|
+
register_widget_result: RegisterWidgetResult[list[T]],
|
213
|
+
options: OptionSequence[T],
|
214
|
+
opt_sequence: Sequence[T],
|
215
|
+
) -> RegisterWidgetResult[list[T]]: ...
|
216
|
+
|
217
|
+
|
218
|
+
@overload
|
219
|
+
def maybe_coerce_enum_sequence(
|
220
|
+
register_widget_result: RegisterWidgetResult[tuple[T, T]],
|
221
|
+
options: OptionSequence[T],
|
222
|
+
opt_sequence: Sequence[T],
|
223
|
+
) -> RegisterWidgetResult[tuple[T, T]]: ...
|
224
|
+
|
225
|
+
|
226
|
+
def maybe_coerce_enum_sequence(register_widget_result, options, opt_sequence):
|
227
|
+
"""Maybe Coerce a RegisterWidgetResult with a sequence of Enum members as value
|
228
|
+
to RegisterWidgetResult[Sequence[option]] if option is an EnumType, otherwise just return
|
229
|
+
the original RegisterWidgetResult."""
|
230
|
+
|
231
|
+
# If not all widget values are Enums, return early
|
232
|
+
if not all(isinstance(val, Enum) for val in register_widget_result.value):
|
233
|
+
return register_widget_result
|
234
|
+
|
235
|
+
# Extract the class to coerce
|
236
|
+
coerce_class: EnumMeta | None
|
237
|
+
if isinstance(options, EnumMeta):
|
238
|
+
coerce_class = options
|
239
|
+
else:
|
240
|
+
coerce_class = _extract_common_class_from_iter(opt_sequence)
|
241
|
+
if coerce_class is None:
|
242
|
+
return register_widget_result
|
243
|
+
|
244
|
+
# Return a new RegisterWidgetResult with the coerced enum values sequence
|
245
|
+
return RegisterWidgetResult(
|
246
|
+
type(register_widget_result.value)(
|
247
|
+
_coerce_enum(val, coerce_class) for val in register_widget_result.value
|
248
|
+
),
|
249
|
+
register_widget_result.value_changed,
|
250
|
+
)
|
@@ -0,0 +1,274 @@
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from collections.abc import Mapping
|
18
|
+
from typing import TYPE_CHECKING, Any, TypeVar
|
19
|
+
|
20
|
+
from streamlit import dataframe_util
|
21
|
+
from streamlit.errors import StreamlitAPIException
|
22
|
+
|
23
|
+
if TYPE_CHECKING:
|
24
|
+
from pandas import DataFrame
|
25
|
+
from pandas.io.formats.style import Styler
|
26
|
+
|
27
|
+
from streamlit.proto.Arrow_pb2 import Arrow as ArrowProto
|
28
|
+
|
29
|
+
|
30
|
+
def marshall_styler(proto: ArrowProto, styler: Styler, default_uuid: str) -> None:
|
31
|
+
"""Marshall pandas.Styler into an Arrow proto.
|
32
|
+
|
33
|
+
Parameters
|
34
|
+
----------
|
35
|
+
proto : proto.Arrow
|
36
|
+
Output. The protobuf for Streamlit Arrow proto.
|
37
|
+
|
38
|
+
styler : pandas.Styler
|
39
|
+
Helps style a DataFrame or Series according to the data with HTML and CSS.
|
40
|
+
|
41
|
+
default_uuid : str
|
42
|
+
If pandas.Styler uuid is not provided, this value will be used.
|
43
|
+
|
44
|
+
"""
|
45
|
+
import pandas as pd
|
46
|
+
|
47
|
+
styler_data_df: pd.DataFrame = styler.data
|
48
|
+
if styler_data_df.size > int(pd.options.styler.render.max_elements):
|
49
|
+
raise StreamlitAPIException(
|
50
|
+
f"The dataframe has `{styler_data_df.size}` cells, but the maximum number "
|
51
|
+
"of cells allowed to be rendered by Pandas Styler is configured to "
|
52
|
+
f"`{pd.options.styler.render.max_elements}`. To allow more cells to be "
|
53
|
+
'styled, you can change the `"styler.render.max_elements"` config. For example: '
|
54
|
+
f'`pd.set_option("styler.render.max_elements", {styler_data_df.size})`'
|
55
|
+
)
|
56
|
+
|
57
|
+
# pandas.Styler uuid should be set before _compute is called.
|
58
|
+
_marshall_uuid(proto, styler, default_uuid)
|
59
|
+
|
60
|
+
# We're using protected members of pandas.Styler to get styles,
|
61
|
+
# which is not ideal and could break if the interface changes.
|
62
|
+
styler._compute()
|
63
|
+
|
64
|
+
pandas_styles = styler._translate(False, False)
|
65
|
+
|
66
|
+
_marshall_caption(proto, styler)
|
67
|
+
_marshall_styles(proto, styler, pandas_styles)
|
68
|
+
_marshall_display_values(proto, styler_data_df, pandas_styles)
|
69
|
+
|
70
|
+
|
71
|
+
def _marshall_uuid(proto: ArrowProto, styler: Styler, default_uuid: str) -> None:
|
72
|
+
"""Marshall pandas.Styler uuid into an Arrow proto.
|
73
|
+
|
74
|
+
Parameters
|
75
|
+
----------
|
76
|
+
proto : proto.Arrow
|
77
|
+
Output. The protobuf for Streamlit Arrow proto.
|
78
|
+
|
79
|
+
styler : pandas.Styler
|
80
|
+
Helps style a DataFrame or Series according to the data with HTML and CSS.
|
81
|
+
|
82
|
+
default_uuid : str
|
83
|
+
If pandas.Styler uuid is not provided, this value will be used.
|
84
|
+
|
85
|
+
"""
|
86
|
+
if styler.uuid is None:
|
87
|
+
styler.set_uuid(default_uuid)
|
88
|
+
|
89
|
+
proto.styler.uuid = str(styler.uuid)
|
90
|
+
|
91
|
+
|
92
|
+
def _marshall_caption(proto: ArrowProto, styler: Styler) -> None:
|
93
|
+
"""Marshall pandas.Styler caption into an Arrow proto.
|
94
|
+
|
95
|
+
Parameters
|
96
|
+
----------
|
97
|
+
proto : proto.Arrow
|
98
|
+
Output. The protobuf for Streamlit Arrow proto.
|
99
|
+
|
100
|
+
styler : pandas.Styler
|
101
|
+
Helps style a DataFrame or Series according to the data with HTML and CSS.
|
102
|
+
|
103
|
+
"""
|
104
|
+
if styler.caption is not None:
|
105
|
+
proto.styler.caption = styler.caption
|
106
|
+
|
107
|
+
|
108
|
+
def _marshall_styles(
|
109
|
+
proto: ArrowProto, styler: Styler, styles: Mapping[str, Any]
|
110
|
+
) -> None:
|
111
|
+
"""Marshall pandas.Styler styles into an Arrow proto.
|
112
|
+
|
113
|
+
Parameters
|
114
|
+
----------
|
115
|
+
proto : proto.Arrow
|
116
|
+
Output. The protobuf for Streamlit Arrow proto.
|
117
|
+
|
118
|
+
styler : pandas.Styler
|
119
|
+
Helps style a DataFrame or Series according to the data with HTML and CSS.
|
120
|
+
|
121
|
+
styles : dict
|
122
|
+
pandas.Styler translated styles.
|
123
|
+
|
124
|
+
"""
|
125
|
+
css_rules = []
|
126
|
+
|
127
|
+
if "table_styles" in styles:
|
128
|
+
table_styles = styles["table_styles"]
|
129
|
+
table_styles = _trim_pandas_styles(table_styles)
|
130
|
+
for style in table_styles:
|
131
|
+
# styles in "table_styles" have a space
|
132
|
+
# between the uuid and selector.
|
133
|
+
rule = _pandas_style_to_css(
|
134
|
+
"table_styles", style, styler.uuid, separator=" "
|
135
|
+
)
|
136
|
+
css_rules.append(rule)
|
137
|
+
|
138
|
+
if "cellstyle" in styles:
|
139
|
+
cellstyle = styles["cellstyle"]
|
140
|
+
cellstyle = _trim_pandas_styles(cellstyle)
|
141
|
+
for style in cellstyle:
|
142
|
+
rule = _pandas_style_to_css("cell_style", style, styler.uuid, separator="_")
|
143
|
+
css_rules.append(rule)
|
144
|
+
|
145
|
+
if len(css_rules) > 0:
|
146
|
+
proto.styler.styles = "\n".join(css_rules)
|
147
|
+
|
148
|
+
|
149
|
+
M = TypeVar("M", bound=Mapping[str, Any])
|
150
|
+
|
151
|
+
|
152
|
+
def _trim_pandas_styles(styles: list[M]) -> list[M]:
|
153
|
+
"""Filter out empty styles.
|
154
|
+
|
155
|
+
Every cell will have a class, but the list of props
|
156
|
+
may just be [['', '']].
|
157
|
+
|
158
|
+
Parameters
|
159
|
+
----------
|
160
|
+
styles : list
|
161
|
+
pandas.Styler translated styles.
|
162
|
+
|
163
|
+
"""
|
164
|
+
return [x for x in styles if any(any(y) for y in x["props"])]
|
165
|
+
|
166
|
+
|
167
|
+
def _pandas_style_to_css(
|
168
|
+
style_type: str,
|
169
|
+
style: Mapping[str, Any],
|
170
|
+
uuid: str,
|
171
|
+
separator: str = "_",
|
172
|
+
) -> str:
|
173
|
+
"""Convert pandas.Styler translated style to CSS.
|
174
|
+
|
175
|
+
Parameters
|
176
|
+
----------
|
177
|
+
style_type : str
|
178
|
+
Either "table_styles" or "cell_style".
|
179
|
+
|
180
|
+
style : dict
|
181
|
+
pandas.Styler translated style.
|
182
|
+
|
183
|
+
uuid : str
|
184
|
+
pandas.Styler uuid.
|
185
|
+
|
186
|
+
separator : str
|
187
|
+
A string separator used between table and cell selectors.
|
188
|
+
|
189
|
+
"""
|
190
|
+
declarations = []
|
191
|
+
for css_property, css_value in style["props"]:
|
192
|
+
declaration = str(css_property).strip() + ": " + str(css_value).strip()
|
193
|
+
declarations.append(declaration)
|
194
|
+
|
195
|
+
table_selector = f"#T_{uuid}"
|
196
|
+
|
197
|
+
# In pandas >= 1.1.0
|
198
|
+
# translated_style["cellstyle"] has the following shape:
|
199
|
+
# [
|
200
|
+
# {
|
201
|
+
# "props": [("color", " black"), ("background-color", "orange"), ("", "")],
|
202
|
+
# "selectors": ["row0_col0"]
|
203
|
+
# }
|
204
|
+
# ...
|
205
|
+
# ]
|
206
|
+
if style_type == "table_styles":
|
207
|
+
cell_selectors = [style["selector"]]
|
208
|
+
else:
|
209
|
+
cell_selectors = style["selectors"]
|
210
|
+
|
211
|
+
selectors = []
|
212
|
+
for cell_selector in cell_selectors:
|
213
|
+
selectors.append(table_selector + separator + cell_selector)
|
214
|
+
selector = ", ".join(selectors)
|
215
|
+
|
216
|
+
declaration_block = "; ".join(declarations)
|
217
|
+
rule_set = selector + " { " + declaration_block + " }"
|
218
|
+
|
219
|
+
return rule_set
|
220
|
+
|
221
|
+
|
222
|
+
def _marshall_display_values(
|
223
|
+
proto: ArrowProto, df: DataFrame, styles: Mapping[str, Any]
|
224
|
+
) -> None:
|
225
|
+
"""Marshall pandas.Styler display values into an Arrow proto.
|
226
|
+
|
227
|
+
Parameters
|
228
|
+
----------
|
229
|
+
proto : proto.Arrow
|
230
|
+
Output. The protobuf for Streamlit Arrow proto.
|
231
|
+
|
232
|
+
df : pandas.DataFrame
|
233
|
+
A dataframe with original values.
|
234
|
+
|
235
|
+
styles : dict
|
236
|
+
pandas.Styler translated styles.
|
237
|
+
|
238
|
+
"""
|
239
|
+
new_df = _use_display_values(df, styles)
|
240
|
+
proto.styler.display_values = dataframe_util.convert_pandas_df_to_arrow_bytes(
|
241
|
+
new_df
|
242
|
+
)
|
243
|
+
|
244
|
+
|
245
|
+
def _use_display_values(df: DataFrame, styles: Mapping[str, Any]) -> DataFrame:
|
246
|
+
"""Create a new pandas.DataFrame where display values are used instead of original ones.
|
247
|
+
|
248
|
+
Parameters
|
249
|
+
----------
|
250
|
+
df : pandas.DataFrame
|
251
|
+
A dataframe with original values.
|
252
|
+
|
253
|
+
styles : dict
|
254
|
+
pandas.Styler translated styles.
|
255
|
+
|
256
|
+
"""
|
257
|
+
import re
|
258
|
+
|
259
|
+
# If values in a column are not of the same type, Arrow
|
260
|
+
# serialization would fail. Thus, we need to cast all values
|
261
|
+
# of the dataframe to strings before assigning them display values.
|
262
|
+
new_df = df.astype(str)
|
263
|
+
|
264
|
+
cell_selector_regex = re.compile(r"row(\d+)_col(\d+)")
|
265
|
+
if "body" in styles:
|
266
|
+
rows = styles["body"]
|
267
|
+
for row in rows:
|
268
|
+
for cell in row:
|
269
|
+
if "id" in cell:
|
270
|
+
if match := cell_selector_regex.match(cell["id"]):
|
271
|
+
r, c = map(int, match.groups())
|
272
|
+
new_df.iloc[r, c] = str(cell["display_value"])
|
273
|
+
|
274
|
+
return new_df
|