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
streamlit/type_util.py
ADDED
@@ -0,0 +1,460 @@
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
"""A bunch of useful utilities for dealing with types."""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
import dataclasses
|
20
|
+
import re
|
21
|
+
import types
|
22
|
+
from collections import UserList, deque
|
23
|
+
from collections.abc import (
|
24
|
+
AsyncGenerator,
|
25
|
+
Generator,
|
26
|
+
ItemsView,
|
27
|
+
Iterable,
|
28
|
+
KeysView,
|
29
|
+
Mapping,
|
30
|
+
Sequence,
|
31
|
+
ValuesView,
|
32
|
+
)
|
33
|
+
from enum import EnumMeta
|
34
|
+
from typing import (
|
35
|
+
TYPE_CHECKING,
|
36
|
+
Any,
|
37
|
+
Final,
|
38
|
+
Literal,
|
39
|
+
NamedTuple,
|
40
|
+
Protocol,
|
41
|
+
TypeVar,
|
42
|
+
Union,
|
43
|
+
overload,
|
44
|
+
)
|
45
|
+
|
46
|
+
from typing_extensions import TypeAlias, TypeGuard
|
47
|
+
|
48
|
+
from streamlit.errors import StreamlitAPIException
|
49
|
+
|
50
|
+
if TYPE_CHECKING:
|
51
|
+
import graphviz
|
52
|
+
import sympy
|
53
|
+
from plotly.graph_objs import Figure
|
54
|
+
from pydeck import Deck
|
55
|
+
|
56
|
+
from streamlit.delta_generator import DeltaGenerator
|
57
|
+
|
58
|
+
T = TypeVar("T")
|
59
|
+
|
60
|
+
# we define our own type here because mypy doesn't seem to support the shape type and
|
61
|
+
# reports unreachable code. When mypy supports it, we can remove this custom type.
|
62
|
+
NumpyShape: TypeAlias = tuple[int, ...]
|
63
|
+
|
64
|
+
|
65
|
+
class SupportsStr(Protocol):
|
66
|
+
def __str__(self) -> str: ...
|
67
|
+
|
68
|
+
|
69
|
+
class SupportsReprHtml(Protocol):
|
70
|
+
def _repr_html_(self) -> str: ...
|
71
|
+
|
72
|
+
|
73
|
+
class CustomDict(Protocol):
|
74
|
+
"""Protocol for Streamlit native custom dictionaries (e.g. session state, secrets, query params).
|
75
|
+
that can be converted to a dict.
|
76
|
+
|
77
|
+
All these implementations should provide a to_dict method.
|
78
|
+
"""
|
79
|
+
|
80
|
+
def to_dict(self) -> dict[str, Any]: ...
|
81
|
+
|
82
|
+
|
83
|
+
@overload
|
84
|
+
def is_type(
|
85
|
+
obj: object, fqn_type_pattern: Literal["pydeck.bindings.deck.Deck"]
|
86
|
+
) -> TypeGuard[Deck]: ...
|
87
|
+
|
88
|
+
|
89
|
+
@overload
|
90
|
+
def is_type(
|
91
|
+
obj: object, fqn_type_pattern: Literal["plotly.graph_objs._figure.Figure"]
|
92
|
+
) -> TypeGuard[Figure]: ...
|
93
|
+
|
94
|
+
|
95
|
+
@overload
|
96
|
+
def is_type(obj: object, fqn_type_pattern: str | re.Pattern[str]) -> bool: ...
|
97
|
+
|
98
|
+
|
99
|
+
def is_type(obj: object, fqn_type_pattern: str | re.Pattern[str]) -> bool:
|
100
|
+
"""Check type without importing expensive modules.
|
101
|
+
|
102
|
+
Parameters
|
103
|
+
----------
|
104
|
+
obj : object
|
105
|
+
The object to type-check.
|
106
|
+
fqn_type_pattern : str or regex
|
107
|
+
The fully-qualified type string or a regular expression.
|
108
|
+
Regexes should start with `^` and end with `$`.
|
109
|
+
|
110
|
+
Example
|
111
|
+
-------
|
112
|
+
|
113
|
+
To check whether something is a Matplotlib Figure without importing
|
114
|
+
matplotlib, use:
|
115
|
+
|
116
|
+
>>> is_type(foo, "matplotlib.figure.Figure")
|
117
|
+
|
118
|
+
"""
|
119
|
+
fqn_type = get_fqn_type(obj)
|
120
|
+
if isinstance(fqn_type_pattern, str):
|
121
|
+
return fqn_type_pattern == fqn_type
|
122
|
+
else:
|
123
|
+
return fqn_type_pattern.match(fqn_type) is not None
|
124
|
+
|
125
|
+
|
126
|
+
def _is_type_instance(obj: object, type_to_check: str) -> bool:
|
127
|
+
"""Check if instance of type without importing expensive modules."""
|
128
|
+
return type_to_check in [get_fqn(t) for t in type(obj).__mro__]
|
129
|
+
|
130
|
+
|
131
|
+
def get_fqn(the_type: type) -> str:
|
132
|
+
"""Get module.type_name for a given type."""
|
133
|
+
return f"{the_type.__module__}.{the_type.__qualname__}"
|
134
|
+
|
135
|
+
|
136
|
+
def get_fqn_type(obj: object) -> str:
|
137
|
+
"""Get module.type_name for a given object."""
|
138
|
+
return get_fqn(type(obj))
|
139
|
+
|
140
|
+
|
141
|
+
_BYTES_LIKE_TYPES: Final[tuple[type, ...]] = (
|
142
|
+
bytes,
|
143
|
+
bytearray,
|
144
|
+
)
|
145
|
+
|
146
|
+
BytesLike: TypeAlias = Union[bytes, bytearray]
|
147
|
+
|
148
|
+
|
149
|
+
def is_bytes_like(obj: object) -> TypeGuard[BytesLike]:
|
150
|
+
"""True if the type is considered bytes-like for the purposes of
|
151
|
+
protobuf data marshalling.
|
152
|
+
"""
|
153
|
+
return isinstance(obj, _BYTES_LIKE_TYPES)
|
154
|
+
|
155
|
+
|
156
|
+
def to_bytes(obj: BytesLike) -> bytes:
|
157
|
+
"""Converts the given object to bytes.
|
158
|
+
|
159
|
+
Only types for which `is_bytes_like` is true can be converted; anything
|
160
|
+
else will result in an exception.
|
161
|
+
"""
|
162
|
+
if isinstance(obj, bytearray):
|
163
|
+
return bytes(obj)
|
164
|
+
elif isinstance(obj, bytes):
|
165
|
+
return obj
|
166
|
+
|
167
|
+
raise RuntimeError(f"{obj} is not convertible to bytes")
|
168
|
+
|
169
|
+
|
170
|
+
_SYMPY_RE: Final = re.compile(r"^sympy.*$")
|
171
|
+
|
172
|
+
|
173
|
+
def is_sympy_expression(obj: object) -> TypeGuard[sympy.Expr]:
|
174
|
+
"""True if input is a SymPy expression."""
|
175
|
+
if not is_type(obj, _SYMPY_RE):
|
176
|
+
return False
|
177
|
+
|
178
|
+
try:
|
179
|
+
import sympy
|
180
|
+
|
181
|
+
return isinstance(obj, sympy.Expr)
|
182
|
+
except ImportError:
|
183
|
+
return False
|
184
|
+
|
185
|
+
|
186
|
+
_ALTAIR_RE: Final = re.compile(r"^altair\.vegalite\.v\d+\.api\.\w*Chart$")
|
187
|
+
|
188
|
+
|
189
|
+
def is_altair_chart(obj: object) -> bool:
|
190
|
+
"""True if input looks like an Altair chart."""
|
191
|
+
return is_type(obj, _ALTAIR_RE)
|
192
|
+
|
193
|
+
|
194
|
+
_PILLOW_RE: Final = re.compile(r"^PIL\..*")
|
195
|
+
|
196
|
+
|
197
|
+
def is_pillow_image(obj: object) -> bool:
|
198
|
+
"""True if input looks like a pillow image."""
|
199
|
+
return is_type(obj, _PILLOW_RE)
|
200
|
+
|
201
|
+
|
202
|
+
def is_keras_model(obj: object) -> bool:
|
203
|
+
"""True if input looks like a Keras model."""
|
204
|
+
return (
|
205
|
+
is_type(obj, "keras.engine.sequential.Sequential")
|
206
|
+
or is_type(obj, "keras.engine.training.Model")
|
207
|
+
or is_type(obj, "tensorflow.python.keras.engine.sequential.Sequential")
|
208
|
+
or is_type(obj, "tensorflow.python.keras.engine.training.Model")
|
209
|
+
)
|
210
|
+
|
211
|
+
|
212
|
+
# We use a regex here to allow potential changes in the module path in the future.
|
213
|
+
_OPENAI_CHUNK_RE: Final = re.compile(r"^openai\..+\.ChatCompletionChunk$")
|
214
|
+
|
215
|
+
|
216
|
+
def is_openai_chunk(obj: object) -> bool:
|
217
|
+
"""True if input looks like an OpenAI chat completion chunk."""
|
218
|
+
return is_type(obj, _OPENAI_CHUNK_RE)
|
219
|
+
|
220
|
+
|
221
|
+
def is_plotly_chart(obj: object) -> TypeGuard[Figure | list[Any] | dict[str, Any]]:
|
222
|
+
"""True if input looks like a Plotly chart."""
|
223
|
+
return (
|
224
|
+
is_type(obj, "plotly.graph_objs._figure.Figure")
|
225
|
+
or _is_list_of_plotly_objs(obj)
|
226
|
+
or _is_probably_plotly_dict(obj)
|
227
|
+
)
|
228
|
+
|
229
|
+
|
230
|
+
def is_graphviz_chart(
|
231
|
+
obj: object,
|
232
|
+
) -> TypeGuard[graphviz.Graph | graphviz.Digraph]:
|
233
|
+
"""True if input looks like a GraphViz chart."""
|
234
|
+
return (
|
235
|
+
# GraphViz < 0.18
|
236
|
+
is_type(obj, "graphviz.dot.Graph")
|
237
|
+
or is_type(obj, "graphviz.dot.Digraph")
|
238
|
+
# GraphViz >= 0.18
|
239
|
+
or is_type(obj, "graphviz.graphs.Graph")
|
240
|
+
or is_type(obj, "graphviz.graphs.Digraph")
|
241
|
+
or is_type(obj, "graphviz.sources.Source")
|
242
|
+
)
|
243
|
+
|
244
|
+
|
245
|
+
def _is_plotly_obj(obj: object) -> bool:
|
246
|
+
"""True if input if from a type that lives in plotly.plotly_objs."""
|
247
|
+
the_type = type(obj)
|
248
|
+
return the_type.__module__.startswith("plotly.graph_objs")
|
249
|
+
|
250
|
+
|
251
|
+
def _is_list_of_plotly_objs(obj: object) -> TypeGuard[list[Any]]:
|
252
|
+
if not isinstance(obj, list):
|
253
|
+
return False
|
254
|
+
if len(obj) == 0:
|
255
|
+
return False
|
256
|
+
return all(_is_plotly_obj(item) for item in obj)
|
257
|
+
|
258
|
+
|
259
|
+
def _is_probably_plotly_dict(obj: object) -> TypeGuard[dict[str, Any]]:
|
260
|
+
if not isinstance(obj, dict):
|
261
|
+
return False
|
262
|
+
|
263
|
+
if len(obj.keys()) == 0:
|
264
|
+
return False
|
265
|
+
|
266
|
+
if any(k not in ["config", "data", "frames", "layout"] for k in obj.keys()):
|
267
|
+
return False
|
268
|
+
|
269
|
+
if any(_is_plotly_obj(v) for v in obj.values()):
|
270
|
+
return True
|
271
|
+
|
272
|
+
if any(_is_list_of_plotly_objs(v) for v in obj.values()):
|
273
|
+
return True
|
274
|
+
|
275
|
+
return False
|
276
|
+
|
277
|
+
|
278
|
+
def is_delta_generator(obj: object) -> TypeGuard[DeltaGenerator]:
|
279
|
+
"""True if input looks like a DeltaGenerator."""
|
280
|
+
|
281
|
+
# We are using a string here to avoid circular import warnings
|
282
|
+
# when importing DeltaGenerator.
|
283
|
+
return is_type(obj, "streamlit.delta_generator.DeltaGenerator")
|
284
|
+
|
285
|
+
|
286
|
+
def is_function(x: object) -> TypeGuard[types.FunctionType]:
|
287
|
+
"""Return True if x is a function."""
|
288
|
+
return isinstance(x, types.FunctionType)
|
289
|
+
|
290
|
+
|
291
|
+
def has_callable_attr(obj: object, name: str) -> bool:
|
292
|
+
"""True if obj has the specified attribute that is callable."""
|
293
|
+
return (
|
294
|
+
hasattr(obj, name)
|
295
|
+
and callable(getattr(obj, name))
|
296
|
+
# DeltaGenerator will return a callable wrapper for any method name,
|
297
|
+
# even if it doesn't exist.
|
298
|
+
and not is_delta_generator(obj)
|
299
|
+
)
|
300
|
+
|
301
|
+
|
302
|
+
def is_namedtuple(x: object) -> TypeGuard[NamedTuple]:
|
303
|
+
"""True if obj is an instance of a namedtuple."""
|
304
|
+
return isinstance(x, tuple) and has_callable_attr(x, "_asdict")
|
305
|
+
|
306
|
+
|
307
|
+
def is_dataclass_instance(obj: object) -> bool:
|
308
|
+
"""True if obj is an instance of a dataclass."""
|
309
|
+
# The not isinstance(obj, type) check is needed to make sure that this
|
310
|
+
# is an instance of a dataclass and not the class itself.
|
311
|
+
# dataclasses.is_dataclass returns True for either instance or class.
|
312
|
+
return dataclasses.is_dataclass(obj) and not isinstance(obj, type)
|
313
|
+
|
314
|
+
|
315
|
+
def is_pydeck(obj: object) -> TypeGuard[Deck]:
|
316
|
+
"""True if input looks like a pydeck chart."""
|
317
|
+
return is_type(obj, "pydeck.bindings.deck.Deck")
|
318
|
+
|
319
|
+
|
320
|
+
def is_pydantic_model(obj) -> bool:
|
321
|
+
"""True if input looks like a Pydantic model instance."""
|
322
|
+
|
323
|
+
if isinstance(obj, type):
|
324
|
+
# The obj is a class, but we
|
325
|
+
# only want to check for instances
|
326
|
+
# of Pydantic models, so we return False.
|
327
|
+
return False
|
328
|
+
|
329
|
+
return _is_type_instance(obj, "pydantic.main.BaseModel")
|
330
|
+
|
331
|
+
|
332
|
+
def _is_from_streamlit(obj: object) -> bool:
|
333
|
+
"""True if the object is from the the streamlit package."""
|
334
|
+
return obj.__class__.__module__.startswith("streamlit")
|
335
|
+
|
336
|
+
|
337
|
+
def is_custom_dict(obj: object) -> TypeGuard[CustomDict]:
|
338
|
+
"""True if input looks like one of the Streamlit custom dictionaries."""
|
339
|
+
|
340
|
+
return (
|
341
|
+
isinstance(obj, Mapping)
|
342
|
+
and _is_from_streamlit(obj)
|
343
|
+
and has_callable_attr(obj, "to_dict")
|
344
|
+
)
|
345
|
+
|
346
|
+
|
347
|
+
def is_iterable(obj: object) -> TypeGuard[Iterable[Any]]:
|
348
|
+
try:
|
349
|
+
# The ignore statement here is intentional, as this is a
|
350
|
+
# perfectly fine way of checking for iterables.
|
351
|
+
iter(obj) # type: ignore[call-overload]
|
352
|
+
except TypeError:
|
353
|
+
return False
|
354
|
+
return True
|
355
|
+
|
356
|
+
|
357
|
+
def is_list_like(obj: object) -> TypeGuard[Sequence[Any]]:
|
358
|
+
"""True if input looks like a list."""
|
359
|
+
import array
|
360
|
+
|
361
|
+
if isinstance(obj, str):
|
362
|
+
return False
|
363
|
+
|
364
|
+
if isinstance(obj, (list, set, tuple)):
|
365
|
+
# Optimization to check the most common types first
|
366
|
+
return True
|
367
|
+
|
368
|
+
return isinstance(
|
369
|
+
obj,
|
370
|
+
(
|
371
|
+
array.ArrayType,
|
372
|
+
deque,
|
373
|
+
EnumMeta,
|
374
|
+
enumerate,
|
375
|
+
frozenset,
|
376
|
+
ItemsView,
|
377
|
+
KeysView,
|
378
|
+
map,
|
379
|
+
range,
|
380
|
+
UserList,
|
381
|
+
ValuesView,
|
382
|
+
),
|
383
|
+
)
|
384
|
+
|
385
|
+
|
386
|
+
def check_python_comparable(seq: Sequence[Any]) -> None:
|
387
|
+
"""Check if the sequence elements support "python comparison".
|
388
|
+
That means that the equality operator (==) returns a boolean value.
|
389
|
+
Which is not True for e.g. numpy arrays and pandas series."""
|
390
|
+
try:
|
391
|
+
bool(seq[0] == seq[0])
|
392
|
+
except LookupError:
|
393
|
+
# In case of empty sequences, the check not raise an exception.
|
394
|
+
pass
|
395
|
+
except ValueError:
|
396
|
+
raise StreamlitAPIException(
|
397
|
+
"Invalid option type provided. Options must be comparable, returning a "
|
398
|
+
f"boolean when used with *==*. \n\nGot **{type(seq[0]).__name__}**, "
|
399
|
+
"which cannot be compared. Refactor your code to use elements of "
|
400
|
+
"comparable types as options, e.g. use indices instead."
|
401
|
+
)
|
402
|
+
|
403
|
+
|
404
|
+
def is_altair_version_less_than(v: str) -> bool:
|
405
|
+
"""Return True if the current Altair version is less than the input version.
|
406
|
+
|
407
|
+
Parameters
|
408
|
+
----------
|
409
|
+
v : str
|
410
|
+
Version string, e.g. "0.25.0"
|
411
|
+
|
412
|
+
Returns
|
413
|
+
-------
|
414
|
+
bool
|
415
|
+
|
416
|
+
|
417
|
+
Raises
|
418
|
+
------
|
419
|
+
InvalidVersion
|
420
|
+
If the version strings are not valid.
|
421
|
+
|
422
|
+
"""
|
423
|
+
import altair as alt
|
424
|
+
|
425
|
+
return is_version_less_than(alt.__version__, v)
|
426
|
+
|
427
|
+
|
428
|
+
def is_version_less_than(v1: str, v2: str) -> bool:
|
429
|
+
"""Return True if the v1 version string is less than the v2 version string
|
430
|
+
based on semantic versioning.
|
431
|
+
|
432
|
+
Raises
|
433
|
+
------
|
434
|
+
InvalidVersion
|
435
|
+
If the version strings are not valid.
|
436
|
+
"""
|
437
|
+
from packaging import version
|
438
|
+
|
439
|
+
return version.parse(v1) < version.parse(v2)
|
440
|
+
|
441
|
+
|
442
|
+
def async_generator_to_sync(
|
443
|
+
async_gen: AsyncGenerator[Any, Any],
|
444
|
+
) -> Generator[Any, Any, Any]:
|
445
|
+
"""Convert an async generator to a synchronous generator."""
|
446
|
+
import asyncio
|
447
|
+
|
448
|
+
# Create a new event loop.
|
449
|
+
# It is expected that there is no existing event loop in the user thread.
|
450
|
+
loop = asyncio.new_event_loop()
|
451
|
+
|
452
|
+
try:
|
453
|
+
# Iterate over the async generator until it raises StopAsyncIteration
|
454
|
+
while True:
|
455
|
+
yield loop.run_until_complete(async_gen.__anext__())
|
456
|
+
except StopAsyncIteration:
|
457
|
+
# The async generator has finished
|
458
|
+
pass
|
459
|
+
finally:
|
460
|
+
loop.close()
|
streamlit/url_util.py
ADDED
@@ -0,0 +1,122 @@
|
|
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 re
|
18
|
+
from typing import Final, Literal
|
19
|
+
from urllib.parse import urlparse
|
20
|
+
|
21
|
+
from typing_extensions import TypeAlias
|
22
|
+
|
23
|
+
UrlSchema: TypeAlias = Literal["http", "https", "mailto", "data"]
|
24
|
+
|
25
|
+
|
26
|
+
# Regular expression for process_gitblob_url
|
27
|
+
_GITBLOB_RE: Final = re.compile(
|
28
|
+
r"(?P<base>https:\/\/?(gist\.)?github.com\/)"
|
29
|
+
r"(?P<account>([\w\.]+\/){1,2})"
|
30
|
+
r"(?P<blob_or_raw>(blob|raw))?"
|
31
|
+
r"(?P<suffix>(.+)?)"
|
32
|
+
)
|
33
|
+
|
34
|
+
|
35
|
+
def process_gitblob_url(url: str) -> str:
|
36
|
+
"""Check url to see if it describes a GitHub Gist "blob" URL.
|
37
|
+
|
38
|
+
If so, returns a new URL to get the "raw" script.
|
39
|
+
If not, returns URL unchanged.
|
40
|
+
"""
|
41
|
+
# Matches github.com and gist.github.com. Will not match githubusercontent.com.
|
42
|
+
# See this regex with explainer and sample text here: https://regexr.com/4odk3
|
43
|
+
match = _GITBLOB_RE.match(url)
|
44
|
+
if match:
|
45
|
+
mdict = match.groupdict()
|
46
|
+
# If it has "blob" in the url, replace this with "raw" and we're done.
|
47
|
+
if mdict["blob_or_raw"] == "blob":
|
48
|
+
return "{base}{account}raw{suffix}".format(**mdict)
|
49
|
+
|
50
|
+
# If it is a "raw" url already, return untouched.
|
51
|
+
if mdict["blob_or_raw"] == "raw":
|
52
|
+
return url
|
53
|
+
|
54
|
+
# It's a gist. Just tack "raw" on the end.
|
55
|
+
return url + "/raw"
|
56
|
+
|
57
|
+
return url
|
58
|
+
|
59
|
+
|
60
|
+
def get_hostname(url: str) -> str | None:
|
61
|
+
"""Return the hostname of a URL (with or without protocol)."""
|
62
|
+
# Just so urllib can parse the URL, make sure there's a protocol.
|
63
|
+
# (The actual protocol doesn't matter to us)
|
64
|
+
if "://" not in url:
|
65
|
+
url = f"http://{url}"
|
66
|
+
|
67
|
+
parsed = urlparse(url)
|
68
|
+
return parsed.hostname
|
69
|
+
|
70
|
+
|
71
|
+
def is_url(
|
72
|
+
url: str,
|
73
|
+
allowed_schemas: tuple[UrlSchema, ...] = ("http", "https"),
|
74
|
+
) -> bool:
|
75
|
+
"""Check if a string looks like an URL.
|
76
|
+
|
77
|
+
This doesn't check if the URL is actually valid or reachable.
|
78
|
+
|
79
|
+
Parameters
|
80
|
+
----------
|
81
|
+
url : str
|
82
|
+
The URL to check.
|
83
|
+
|
84
|
+
allowed_schemas : Tuple[str]
|
85
|
+
The allowed URL schemas. Default is ("http", "https").
|
86
|
+
"""
|
87
|
+
try:
|
88
|
+
result = urlparse(str(url))
|
89
|
+
if result.scheme not in allowed_schemas:
|
90
|
+
return False
|
91
|
+
|
92
|
+
if result.scheme in ["http", "https"]:
|
93
|
+
return bool(result.netloc)
|
94
|
+
elif result.scheme in ["mailto", "data"]:
|
95
|
+
return bool(result.path)
|
96
|
+
|
97
|
+
except ValueError:
|
98
|
+
return False
|
99
|
+
return False
|
100
|
+
|
101
|
+
|
102
|
+
def make_url_path(base_url: str, path: str) -> str:
|
103
|
+
"""Make a URL from a base URL and a path.
|
104
|
+
|
105
|
+
Parameters
|
106
|
+
----------
|
107
|
+
base_url : str
|
108
|
+
The base URL.
|
109
|
+
path : str
|
110
|
+
The path to append to the base URL.
|
111
|
+
|
112
|
+
Returns
|
113
|
+
-------
|
114
|
+
str
|
115
|
+
The resulting URL.
|
116
|
+
"""
|
117
|
+
base_url = base_url.strip("/")
|
118
|
+
if base_url:
|
119
|
+
base_url = "/" + base_url
|
120
|
+
|
121
|
+
path = path.lstrip("/")
|
122
|
+
return f"{base_url}/{path}"
|