streamlit-data-editor-plus 0.1.0__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 +292 -0
- streamlit/__main__.py +20 -0
- streamlit/auth_util.py +583 -0
- streamlit/cli_util.py +107 -0
- streamlit/column_config.py +60 -0
- streamlit/commands/__init__.py +13 -0
- streamlit/commands/echo.py +128 -0
- streamlit/commands/execution_control.py +318 -0
- streamlit/commands/logo.py +250 -0
- streamlit/commands/navigation.py +430 -0
- streamlit/commands/page_config.py +335 -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 +158 -0
- streamlit/components/v1/__init__.py +29 -0
- streamlit/components/v1/component_arrow.py +141 -0
- streamlit/components/v1/component_registry.py +147 -0
- streamlit/components/v1/components.py +38 -0
- streamlit/components/v1/custom_component.py +239 -0
- streamlit/components/v2/__init__.py +531 -0
- streamlit/components/v2/bidi_component/__init__.py +20 -0
- streamlit/components/v2/bidi_component/constants.py +29 -0
- streamlit/components/v2/bidi_component/main.py +537 -0
- streamlit/components/v2/bidi_component/serialization.py +272 -0
- streamlit/components/v2/bidi_component/state.py +92 -0
- streamlit/components/v2/component_definition_resolver.py +143 -0
- streamlit/components/v2/component_file_watcher.py +403 -0
- streamlit/components/v2/component_manager.py +439 -0
- streamlit/components/v2/component_manifest_handler.py +122 -0
- streamlit/components/v2/component_path_utils.py +233 -0
- streamlit/components/v2/component_registry.py +426 -0
- streamlit/components/v2/get_bidi_component_manager.py +51 -0
- streamlit/components/v2/manifest_scanner.py +620 -0
- streamlit/components/v2/presentation.py +198 -0
- streamlit/components/v2/types.py +317 -0
- streamlit/config.py +2977 -0
- streamlit/config_option.py +319 -0
- streamlit/config_util.py +887 -0
- streamlit/connections/__init__.py +32 -0
- streamlit/connections/base_connection.py +215 -0
- streamlit/connections/snowflake_connection.py +765 -0
- streamlit/connections/snowpark_connection.py +213 -0
- streamlit/connections/sql_connection.py +427 -0
- streamlit/connections/util.py +97 -0
- streamlit/cursor.py +314 -0
- streamlit/dataframe_util.py +1434 -0
- streamlit/delta_generator.py +696 -0
- streamlit/delta_generator_singletons.py +243 -0
- streamlit/deprecation_util.py +253 -0
- streamlit/development.py +21 -0
- streamlit/elements/__init__.py +13 -0
- streamlit/elements/alert.py +341 -0
- streamlit/elements/arrow.py +1065 -0
- streamlit/elements/balloons.py +47 -0
- streamlit/elements/bokeh_chart.py +75 -0
- streamlit/elements/code.py +154 -0
- streamlit/elements/deck_gl_json_chart.py +627 -0
- streamlit/elements/dialog_decorator.py +320 -0
- streamlit/elements/empty.py +130 -0
- streamlit/elements/exception.py +370 -0
- streamlit/elements/form.py +481 -0
- streamlit/elements/graphviz_chart.py +226 -0
- streamlit/elements/heading.py +407 -0
- streamlit/elements/help.py +565 -0
- streamlit/elements/html.py +189 -0
- streamlit/elements/iframe.py +245 -0
- streamlit/elements/image.py +221 -0
- streamlit/elements/json.py +171 -0
- streamlit/elements/layouts.py +1534 -0
- streamlit/elements/lib/__init__.py +13 -0
- streamlit/elements/lib/built_in_chart_utils.py +1316 -0
- streamlit/elements/lib/color_util.py +272 -0
- streamlit/elements/lib/column_config_utils.py +555 -0
- streamlit/elements/lib/column_types.py +2699 -0
- streamlit/elements/lib/dialog.py +212 -0
- streamlit/elements/lib/dicttools.py +152 -0
- streamlit/elements/lib/file_uploader_utils.py +91 -0
- streamlit/elements/lib/form_utils.py +77 -0
- streamlit/elements/lib/image_utils.py +447 -0
- streamlit/elements/lib/js_number.py +105 -0
- streamlit/elements/lib/layout_utils.py +325 -0
- streamlit/elements/lib/mutable_expander_container.py +73 -0
- streamlit/elements/lib/mutable_popover_container.py +73 -0
- streamlit/elements/lib/mutable_status_container.py +194 -0
- streamlit/elements/lib/mutable_tab_container.py +73 -0
- streamlit/elements/lib/options_selector_utils.py +480 -0
- streamlit/elements/lib/pandas_styler_utils.py +302 -0
- streamlit/elements/lib/policies.py +198 -0
- streamlit/elements/lib/shortcut_utils.py +152 -0
- streamlit/elements/lib/streamlit_plotly_theme.py +206 -0
- streamlit/elements/lib/subtitle_utils.py +175 -0
- streamlit/elements/lib/utils.py +274 -0
- streamlit/elements/map.py +526 -0
- streamlit/elements/markdown.py +529 -0
- streamlit/elements/media.py +843 -0
- streamlit/elements/metric.py +529 -0
- streamlit/elements/pdf.py +190 -0
- streamlit/elements/plotly_chart.py +779 -0
- streamlit/elements/progress.py +172 -0
- streamlit/elements/pyplot.py +240 -0
- streamlit/elements/snow.py +47 -0
- streamlit/elements/space.py +121 -0
- streamlit/elements/spinner.py +152 -0
- streamlit/elements/table.py +240 -0
- streamlit/elements/text.py +113 -0
- streamlit/elements/toast.py +175 -0
- streamlit/elements/vega_charts.py +2510 -0
- streamlit/elements/widgets/__init__.py +13 -0
- streamlit/elements/widgets/audio_input.py +334 -0
- streamlit/elements/widgets/button.py +1559 -0
- streamlit/elements/widgets/button_group.py +1061 -0
- streamlit/elements/widgets/camera_input.py +281 -0
- streamlit/elements/widgets/chat.py +1028 -0
- streamlit/elements/widgets/checkbox.py +420 -0
- streamlit/elements/widgets/color_picker.py +329 -0
- streamlit/elements/widgets/data_editor.py +1168 -0
- streamlit/elements/widgets/data_editor_plus.py +902 -0
- streamlit/elements/widgets/feedback.py +322 -0
- streamlit/elements/widgets/file_uploader.py +592 -0
- streamlit/elements/widgets/multiselect.py +654 -0
- streamlit/elements/widgets/number_input.py +719 -0
- streamlit/elements/widgets/radio.py +551 -0
- streamlit/elements/widgets/select_slider.py +568 -0
- streamlit/elements/widgets/selectbox.py +680 -0
- streamlit/elements/widgets/slider.py +1093 -0
- streamlit/elements/widgets/text_widgets.py +779 -0
- streamlit/elements/widgets/time_widgets.py +1712 -0
- streamlit/elements/write.py +585 -0
- streamlit/emojis.py +34 -0
- streamlit/env_util.py +56 -0
- streamlit/error_util.py +112 -0
- streamlit/errors.py +680 -0
- streamlit/external/__init__.py +13 -0
- streamlit/external/langchain/__init__.py +23 -0
- streamlit/external/langchain/streamlit_callback_handler.py +410 -0
- streamlit/file_util.py +266 -0
- streamlit/git_util.py +200 -0
- streamlit/hello/__init__.py +13 -0
- streamlit/hello/__pycache__/__init__.cpython-312.pyc +0 -0
- streamlit/hello/__pycache__/streamlit_app.cpython-312.pyc +0 -0
- streamlit/hello/animation_demo.py +82 -0
- streamlit/hello/dataframe_demo.py +71 -0
- streamlit/hello/hello.py +46 -0
- streamlit/hello/mapping_demo.py +113 -0
- streamlit/hello/plotting_demo.py +62 -0
- streamlit/hello/streamlit_app.py +57 -0
- streamlit/hello/utils.py +30 -0
- streamlit/logger.py +129 -0
- streamlit/material_icon_names.py +25 -0
- streamlit/navigation/__init__.py +13 -0
- streamlit/navigation/page.py +365 -0
- streamlit/net_util.py +125 -0
- streamlit/path_security.py +98 -0
- streamlit/platform.py +31 -0
- streamlit/proto/Alert_pb2.py +28 -0
- streamlit/proto/Alert_pb2.pyi +100 -0
- streamlit/proto/AppPage_pb2.py +25 -0
- streamlit/proto/AppPage_pb2.pyi +75 -0
- streamlit/proto/ArrowData_pb2.py +27 -0
- streamlit/proto/ArrowData_pb2.pyi +103 -0
- streamlit/proto/ArrowNamedDataSet_pb2.py +26 -0
- streamlit/proto/ArrowNamedDataSet_pb2.pyi +65 -0
- streamlit/proto/AudioInput_pb2.py +26 -0
- streamlit/proto/AudioInput_pb2.pyi +72 -0
- streamlit/proto/Audio_pb2.py +26 -0
- streamlit/proto/Audio_pb2.pyi +75 -0
- streamlit/proto/AuthRedirect_pb2.py +25 -0
- streamlit/proto/AuthRedirect_pb2.pyi +48 -0
- streamlit/proto/AutoRerun_pb2.py +25 -0
- streamlit/proto/AutoRerun_pb2.pyi +52 -0
- streamlit/proto/BackMsg_pb2.py +29 -0
- streamlit/proto/BackMsg_pb2.pyi +132 -0
- streamlit/proto/Balloons_pb2.py +25 -0
- streamlit/proto/Balloons_pb2.pyi +48 -0
- streamlit/proto/BidiComponent_pb2.py +32 -0
- streamlit/proto/BidiComponent_pb2.pyi +176 -0
- streamlit/proto/Block_pb2.py +62 -0
- streamlit/proto/Block_pb2.pyi +518 -0
- streamlit/proto/ButtonGroup_pb2.py +32 -0
- streamlit/proto/ButtonGroup_pb2.pyi +157 -0
- streamlit/proto/ButtonLikeIconPosition_pb2.py +25 -0
- streamlit/proto/ButtonLikeIconPosition_pb2.pyi +47 -0
- streamlit/proto/Button_pb2.py +26 -0
- streamlit/proto/Button_pb2.pyi +82 -0
- streamlit/proto/CameraInput_pb2.py +26 -0
- streamlit/proto/CameraInput_pb2.pyi +66 -0
- streamlit/proto/ChatInput_pb2.py +27 -0
- streamlit/proto/ChatInput_pb2.pyi +113 -0
- streamlit/proto/Checkbox_pb2.py +28 -0
- streamlit/proto/Checkbox_pb2.pyi +99 -0
- streamlit/proto/ClientState_pb2.py +28 -0
- streamlit/proto/ClientState_pb2.pyi +137 -0
- streamlit/proto/Code_pb2.py +25 -0
- streamlit/proto/Code_pb2.pyi +59 -0
- streamlit/proto/ColorPicker_pb2.py +26 -0
- streamlit/proto/ColorPicker_pb2.pyi +82 -0
- streamlit/proto/Common_pb2.py +49 -0
- streamlit/proto/Common_pb2.pyi +325 -0
- streamlit/proto/Components_pb2.py +33 -0
- streamlit/proto/Components_pb2.pyi +196 -0
- streamlit/proto/Dataframe_pb2.py +30 -0
- streamlit/proto/Dataframe_pb2.pyi +172 -0
- streamlit/proto/DateInput_pb2.py +26 -0
- streamlit/proto/DateInput_pb2.pyi +91 -0
- streamlit/proto/DateTimeInput_pb2.py +26 -0
- streamlit/proto/DateTimeInput_pb2.pyi +94 -0
- streamlit/proto/DeckGlJsonChart_pb2.py +27 -0
- streamlit/proto/DeckGlJsonChart_pb2.pyi +91 -0
- streamlit/proto/Delta_pb2.py +29 -0
- streamlit/proto/Delta_pb2.pyi +82 -0
- streamlit/proto/DownloadButton_pb2.py +26 -0
- streamlit/proto/DownloadButton_pb2.pyi +92 -0
- streamlit/proto/Element_pb2.py +81 -0
- streamlit/proto/Element_pb2.pyi +348 -0
- streamlit/proto/Empty_pb2.py +25 -0
- streamlit/proto/Empty_pb2.pyi +42 -0
- streamlit/proto/Exception_pb2.py +26 -0
- streamlit/proto/Exception_pb2.pyi +88 -0
- streamlit/proto/Favicon_pb2.py +25 -0
- streamlit/proto/Favicon_pb2.pyi +47 -0
- streamlit/proto/Feedback_pb2.py +27 -0
- streamlit/proto/Feedback_pb2.pyi +93 -0
- streamlit/proto/FileUploader_pb2.py +26 -0
- streamlit/proto/FileUploader_pb2.pyi +90 -0
- streamlit/proto/ForwardMsg_pb2.py +48 -0
- streamlit/proto/ForwardMsg_pb2.pyi +296 -0
- streamlit/proto/GapSize_pb2.py +27 -0
- streamlit/proto/GapSize_pb2.pyi +82 -0
- streamlit/proto/GitInfo_pb2.py +27 -0
- streamlit/proto/GitInfo_pb2.pyi +84 -0
- streamlit/proto/GraphVizChart_pb2.py +25 -0
- streamlit/proto/GraphVizChart_pb2.pyi +56 -0
- streamlit/proto/Heading_pb2.py +25 -0
- streamlit/proto/Heading_pb2.pyi +63 -0
- streamlit/proto/HeightConfig_pb2.py +25 -0
- streamlit/proto/HeightConfig_pb2.pyi +61 -0
- streamlit/proto/Help_pb2.py +27 -0
- streamlit/proto/Help_pb2.pyi +104 -0
- streamlit/proto/Html_pb2.py +25 -0
- streamlit/proto/Html_pb2.pyi +52 -0
- streamlit/proto/IFrame_pb2.py +25 -0
- streamlit/proto/IFrame_pb2.pyi +68 -0
- streamlit/proto/Image_pb2.py +27 -0
- streamlit/proto/Image_pb2.pyi +73 -0
- streamlit/proto/Json_pb2.py +25 -0
- streamlit/proto/Json_pb2.pyi +63 -0
- streamlit/proto/LabelVisibility_pb2.py +27 -0
- streamlit/proto/LabelVisibility_pb2.pyi +69 -0
- streamlit/proto/LinkButton_pb2.py +26 -0
- streamlit/proto/LinkButton_pb2.pyi +76 -0
- streamlit/proto/Logo_pb2.py +27 -0
- streamlit/proto/Logo_pb2.pyi +82 -0
- streamlit/proto/Markdown_pb2.py +27 -0
- streamlit/proto/Markdown_pb2.pyi +83 -0
- streamlit/proto/Metric_pb2.py +32 -0
- streamlit/proto/Metric_pb2.pyi +145 -0
- streamlit/proto/MetricsEvent_pb2.py +28 -0
- streamlit/proto/MetricsEvent_pb2.pyi +224 -0
- streamlit/proto/MultiSelect_pb2.py +26 -0
- streamlit/proto/MultiSelect_pb2.pyi +108 -0
- streamlit/proto/Navigation_pb2.py +28 -0
- streamlit/proto/Navigation_pb2.pyi +89 -0
- streamlit/proto/NewSession_pb2.py +47 -0
- streamlit/proto/NewSession_pb2.pyi +753 -0
- streamlit/proto/NumberInput_pb2.py +28 -0
- streamlit/proto/NumberInput_pb2.pyi +138 -0
- streamlit/proto/PageConfig_pb2.py +33 -0
- streamlit/proto/PageConfig_pb2.pyi +179 -0
- streamlit/proto/PageInfo_pb2.py +25 -0
- streamlit/proto/PageInfo_pb2.pyi +50 -0
- streamlit/proto/PageLink_pb2.py +26 -0
- streamlit/proto/PageLink_pb2.pyi +80 -0
- streamlit/proto/PageNotFound_pb2.py +25 -0
- streamlit/proto/PageNotFound_pb2.pyi +49 -0
- streamlit/proto/PageProfile_pb2.py +29 -0
- streamlit/proto/PageProfile_pb2.pyi +146 -0
- streamlit/proto/ParentMessage_pb2.py +25 -0
- streamlit/proto/ParentMessage_pb2.pyi +53 -0
- streamlit/proto/PlotlyChart_pb2.py +27 -0
- streamlit/proto/PlotlyChart_pb2.pyi +96 -0
- streamlit/proto/Progress_pb2.py +25 -0
- streamlit/proto/Progress_pb2.pyi +50 -0
- streamlit/proto/Radio_pb2.py +26 -0
- streamlit/proto/Radio_pb2.pyi +104 -0
- streamlit/proto/RootContainer_pb2.py +25 -0
- streamlit/proto/RootContainer_pb2.pyi +56 -0
- streamlit/proto/Selectbox_pb2.py +26 -0
- streamlit/proto/Selectbox_pb2.pyi +107 -0
- streamlit/proto/SessionEvent_pb2.py +26 -0
- streamlit/proto/SessionEvent_pb2.pyi +72 -0
- streamlit/proto/SessionStatus_pb2.py +25 -0
- streamlit/proto/SessionStatus_pb2.pyi +64 -0
- streamlit/proto/Skeleton_pb2.py +27 -0
- streamlit/proto/Skeleton_pb2.pyi +75 -0
- streamlit/proto/Slider_pb2.py +30 -0
- streamlit/proto/Slider_pb2.pyi +161 -0
- streamlit/proto/Snow_pb2.py +25 -0
- streamlit/proto/Snow_pb2.pyi +48 -0
- streamlit/proto/Space_pb2.py +25 -0
- streamlit/proto/Space_pb2.pyi +48 -0
- streamlit/proto/Spinner_pb2.py +25 -0
- streamlit/proto/Spinner_pb2.pyi +56 -0
- streamlit/proto/Table_pb2.py +28 -0
- streamlit/proto/Table_pb2.pyi +83 -0
- streamlit/proto/TextAlignmentConfig_pb2.py +27 -0
- streamlit/proto/TextAlignmentConfig_pb2.pyi +69 -0
- streamlit/proto/TextArea_pb2.py +26 -0
- streamlit/proto/TextArea_pb2.pyi +97 -0
- streamlit/proto/TextInput_pb2.py +28 -0
- streamlit/proto/TextInput_pb2.pyi +124 -0
- streamlit/proto/Text_pb2.py +25 -0
- streamlit/proto/Text_pb2.pyi +53 -0
- streamlit/proto/TimeInput_pb2.py +26 -0
- streamlit/proto/TimeInput_pb2.pyi +86 -0
- streamlit/proto/Toast_pb2.py +25 -0
- streamlit/proto/Toast_pb2.pyi +64 -0
- streamlit/proto/Transient_pb2.py +26 -0
- streamlit/proto/Transient_pb2.pyi +53 -0
- streamlit/proto/VegaLiteChart_pb2.py +27 -0
- streamlit/proto/VegaLiteChart_pb2.pyi +92 -0
- streamlit/proto/Video_pb2.py +30 -0
- streamlit/proto/Video_pb2.pyi +129 -0
- streamlit/proto/WidgetStates_pb2.py +31 -0
- streamlit/proto/WidgetStates_pb2.pyi +157 -0
- streamlit/proto/WidthConfig_pb2.py +25 -0
- streamlit/proto/WidthConfig_pb2.pyi +61 -0
- streamlit/proto/__init__.py +15 -0
- streamlit/proto/openmetrics_data_model_pb2.py +58 -0
- streamlit/proto/openmetrics_data_model_pb2.pyi +558 -0
- streamlit/py.typed +0 -0
- streamlit/runtime/__init__.py +50 -0
- streamlit/runtime/app_session.py +1302 -0
- streamlit/runtime/caching/__init__.py +118 -0
- streamlit/runtime/caching/cache_data_api.py +775 -0
- streamlit/runtime/caching/cache_errors.py +143 -0
- streamlit/runtime/caching/cache_resource_api.py +756 -0
- streamlit/runtime/caching/cache_type.py +33 -0
- streamlit/runtime/caching/cache_utils.py +601 -0
- streamlit/runtime/caching/cached_message_replay.py +290 -0
- streamlit/runtime/caching/hashing.py +655 -0
- streamlit/runtime/caching/legacy_cache_api.py +170 -0
- streamlit/runtime/caching/storage/__init__.py +29 -0
- streamlit/runtime/caching/storage/cache_storage_protocol.py +236 -0
- streamlit/runtime/caching/storage/dummy_cache_storage.py +60 -0
- streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +159 -0
- streamlit/runtime/caching/storage/local_disk_cache_storage.py +223 -0
- streamlit/runtime/caching/ttl_cleanup_cache.py +85 -0
- streamlit/runtime/connection_factory.py +498 -0
- streamlit/runtime/context.py +449 -0
- streamlit/runtime/context_util.py +49 -0
- streamlit/runtime/credentials.py +355 -0
- streamlit/runtime/download_data_util.py +53 -0
- streamlit/runtime/forward_msg_cache.py +101 -0
- streamlit/runtime/forward_msg_queue.py +263 -0
- streamlit/runtime/fragment.py +441 -0
- streamlit/runtime/media_file_manager.py +409 -0
- streamlit/runtime/media_file_storage.py +143 -0
- streamlit/runtime/memory_media_file_storage.py +201 -0
- streamlit/runtime/memory_session_storage.py +77 -0
- streamlit/runtime/memory_uploaded_file_manager.py +149 -0
- streamlit/runtime/metrics_util.py +612 -0
- streamlit/runtime/pages_manager.py +160 -0
- streamlit/runtime/runtime.py +775 -0
- streamlit/runtime/runtime_util.py +108 -0
- streamlit/runtime/script_data.py +46 -0
- streamlit/runtime/scriptrunner/__init__.py +38 -0
- streamlit/runtime/scriptrunner/exec_code.py +167 -0
- streamlit/runtime/scriptrunner/magic.py +277 -0
- streamlit/runtime/scriptrunner/magic_funcs.py +32 -0
- streamlit/runtime/scriptrunner/script_cache.py +89 -0
- streamlit/runtime/scriptrunner/script_runner.py +805 -0
- streamlit/runtime/scriptrunner_utils/__init__.py +19 -0
- streamlit/runtime/scriptrunner_utils/exceptions.py +44 -0
- streamlit/runtime/scriptrunner_utils/script_requests.py +311 -0
- streamlit/runtime/scriptrunner_utils/script_run_context.py +277 -0
- streamlit/runtime/secrets.py +533 -0
- streamlit/runtime/session_manager.py +430 -0
- streamlit/runtime/state/__init__.py +47 -0
- streamlit/runtime/state/common.py +256 -0
- streamlit/runtime/state/presentation.py +85 -0
- streamlit/runtime/state/query_params.py +767 -0
- streamlit/runtime/state/query_params_proxy.py +222 -0
- streamlit/runtime/state/safe_session_state.py +146 -0
- streamlit/runtime/state/session_state.py +1299 -0
- streamlit/runtime/state/session_state_proxy.py +153 -0
- streamlit/runtime/state/widgets.py +197 -0
- streamlit/runtime/stats.py +356 -0
- streamlit/runtime/theme_util.py +148 -0
- streamlit/runtime/uploaded_file_manager.py +152 -0
- streamlit/runtime/websocket_session_manager.py +301 -0
- streamlit/source_util.py +97 -0
- streamlit/starlette.py +34 -0
- streamlit/string_util.py +264 -0
- streamlit/temporary_directory.py +67 -0
- streamlit/testing/__init__.py +13 -0
- streamlit/testing/v1/__init__.py +17 -0
- streamlit/testing/v1/app_test.py +1089 -0
- streamlit/testing/v1/element_tree.py +2272 -0
- streamlit/testing/v1/local_script_runner.py +176 -0
- streamlit/testing/v1/util.py +61 -0
- streamlit/time_util.py +73 -0
- streamlit/type_util.py +480 -0
- streamlit/url_util.py +120 -0
- streamlit/user_info.py +698 -0
- streamlit/util.py +108 -0
- streamlit/vendor/__init__.py +0 -0
- streamlit/vendor/pympler/__init__.py +0 -0
- streamlit/vendor/pympler/asizeof.py +2870 -0
- streamlit/version.py +18 -0
- streamlit/watcher/__init__.py +28 -0
- streamlit/watcher/event_based_path_watcher.py +500 -0
- streamlit/watcher/folder_black_list.py +82 -0
- streamlit/watcher/local_sources_watcher.py +297 -0
- streamlit/watcher/path_watcher.py +244 -0
- streamlit/watcher/polling_path_watcher.py +138 -0
- streamlit/watcher/util.py +223 -0
- streamlit/web/__init__.py +13 -0
- streamlit/web/bootstrap.py +463 -0
- streamlit/web/cache_storage_manager_config.py +38 -0
- streamlit/web/cli.py +465 -0
- streamlit/web/server/__init__.py +30 -0
- streamlit/web/server/app_discovery.py +422 -0
- streamlit/web/server/app_static_file_handler.py +102 -0
- streamlit/web/server/authlib_tornado_integration.py +125 -0
- streamlit/web/server/bidi_component_request_handler.py +193 -0
- streamlit/web/server/browser_websocket_handler.py +341 -0
- streamlit/web/server/component_file_utils.py +105 -0
- streamlit/web/server/component_request_handler.py +107 -0
- streamlit/web/server/media_file_handler.py +148 -0
- streamlit/web/server/oauth_authlib_routes.py +314 -0
- streamlit/web/server/oidc_mixin.py +138 -0
- streamlit/web/server/routes.py +257 -0
- streamlit/web/server/server.py +555 -0
- streamlit/web/server/server_util.py +235 -0
- streamlit/web/server/starlette/__init__.py +23 -0
- streamlit/web/server/starlette/starlette_app.py +541 -0
- streamlit/web/server/starlette/starlette_app_utils.py +306 -0
- streamlit/web/server/starlette/starlette_auth_routes.py +584 -0
- streamlit/web/server/starlette/starlette_gzip_middleware.py +121 -0
- streamlit/web/server/starlette/starlette_path_security_middleware.py +97 -0
- streamlit/web/server/starlette/starlette_routes.py +884 -0
- streamlit/web/server/starlette/starlette_server.py +496 -0
- streamlit/web/server/starlette/starlette_server_config.py +55 -0
- streamlit/web/server/starlette/starlette_static_routes.py +181 -0
- streamlit/web/server/starlette/starlette_websocket.py +560 -0
- streamlit/web/server/stats_request_handler.py +116 -0
- streamlit/web/server/upload_file_request_handler.py +158 -0
- streamlit/web/server/websocket_headers.py +56 -0
- streamlit_data_editor_plus-0.1.0.dist-info/METADATA +76 -0
- streamlit_data_editor_plus-0.1.0.dist-info/RECORD +456 -0
- streamlit_data_editor_plus-0.1.0.dist-info/WHEEL +5 -0
- streamlit_data_editor_plus-0.1.0.dist-info/entry_points.txt +2 -0
- streamlit_data_editor_plus-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2026)
|
|
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 os
|
|
18
|
+
import re
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
21
|
+
|
|
22
|
+
from streamlit.delta_generator_singletons import get_dg_singleton_instance
|
|
23
|
+
from streamlit.elements.lib.layout_utils import (
|
|
24
|
+
LayoutConfig,
|
|
25
|
+
Width,
|
|
26
|
+
validate_width,
|
|
27
|
+
)
|
|
28
|
+
from streamlit.errors import StreamlitAPIException
|
|
29
|
+
from streamlit.proto.Html_pb2 import Html as HtmlProto
|
|
30
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
|
31
|
+
from streamlit.string_util import clean_text
|
|
32
|
+
from streamlit.type_util import SupportsReprHtml, SupportsStr, has_callable_attr
|
|
33
|
+
|
|
34
|
+
if TYPE_CHECKING:
|
|
35
|
+
from streamlit.delta_generator import DeltaGenerator
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class HtmlMixin:
|
|
39
|
+
@gather_metrics("html")
|
|
40
|
+
def html(
|
|
41
|
+
self,
|
|
42
|
+
body: str | Path | SupportsStr | SupportsReprHtml,
|
|
43
|
+
*, # keyword-only arguments:
|
|
44
|
+
width: Width = "stretch",
|
|
45
|
+
unsafe_allow_javascript: bool = False,
|
|
46
|
+
) -> DeltaGenerator:
|
|
47
|
+
"""Insert HTML into your app.
|
|
48
|
+
|
|
49
|
+
Adding custom HTML to your app impacts safety, styling, and
|
|
50
|
+
maintainability. We sanitize HTML with `DOMPurify
|
|
51
|
+
<https://github.com/cure53/DOMPurify>`_, but inserting HTML remains a
|
|
52
|
+
developer risk. Passing untrusted code to ``st.html`` or dynamically
|
|
53
|
+
loading external code can increase the risk of vulnerabilities in your
|
|
54
|
+
app.
|
|
55
|
+
|
|
56
|
+
``st.html`` content is **not** iframed. By default, JavaScript is
|
|
57
|
+
ignored. To execute JavaScript contained in your HTML, set
|
|
58
|
+
``unsafe_allow_javascript=True``. Use this with caution and never pass
|
|
59
|
+
untrusted input.
|
|
60
|
+
|
|
61
|
+
Parameters
|
|
62
|
+
----------
|
|
63
|
+
body : any
|
|
64
|
+
The HTML code to insert. This can be one of the following:
|
|
65
|
+
|
|
66
|
+
- A string of HTML code.
|
|
67
|
+
- A path to a local file with HTML code. The path can be a ``str``
|
|
68
|
+
or ``Path`` object. Paths can be absolute or relative to the
|
|
69
|
+
working directory (where you execute ``streamlit run``).
|
|
70
|
+
- Any object. If ``body`` is not a string or path, Streamlit will
|
|
71
|
+
convert the object to a string. ``body._repr_html_()`` takes
|
|
72
|
+
precedence over ``str(body)`` when available.
|
|
73
|
+
|
|
74
|
+
If the resulting HTML content is empty, Streamlit will raise an
|
|
75
|
+
error.
|
|
76
|
+
|
|
77
|
+
If ``body`` is a path to a CSS file, Streamlit will wrap the CSS
|
|
78
|
+
content in ``<style>`` tags automatically. When the resulting HTML
|
|
79
|
+
content only contains style tags, Streamlit will send the content
|
|
80
|
+
to the event container instead of the main container to avoid
|
|
81
|
+
taking up space in the app.
|
|
82
|
+
|
|
83
|
+
width : "stretch", "content", or int
|
|
84
|
+
The width of the HTML element. This can be one of the following:
|
|
85
|
+
|
|
86
|
+
- ``"stretch"`` (default): The width of the element matches the
|
|
87
|
+
width of the parent container.
|
|
88
|
+
- ``"content"``: The width of the element matches the width of its
|
|
89
|
+
content, but doesn't exceed the width of the parent container.
|
|
90
|
+
- An integer specifying the width in pixels: The element has a
|
|
91
|
+
fixed width. If the specified width is greater than the width of
|
|
92
|
+
the parent container, the width of the element matches the width
|
|
93
|
+
of the parent container.
|
|
94
|
+
|
|
95
|
+
unsafe_allow_javascript : bool
|
|
96
|
+
Whether to execute JavaScript contained in your HTML. If this is
|
|
97
|
+
``False`` (default), JavaScript is ignored. If this is ``True``,
|
|
98
|
+
JavaScript is executed. Use this with caution and never pass
|
|
99
|
+
untrusted input.
|
|
100
|
+
|
|
101
|
+
Example
|
|
102
|
+
-------
|
|
103
|
+
>>> import streamlit as st
|
|
104
|
+
>>>
|
|
105
|
+
>>> st.html(
|
|
106
|
+
... "<p><span style='text-decoration: line-through double red;'>Oops</span>!</p>"
|
|
107
|
+
... )
|
|
108
|
+
|
|
109
|
+
.. output::
|
|
110
|
+
https://doc-html.streamlit.app/
|
|
111
|
+
height: 300px
|
|
112
|
+
|
|
113
|
+
"""
|
|
114
|
+
html_proto = HtmlProto()
|
|
115
|
+
|
|
116
|
+
# If body supports _repr_html_, use that.
|
|
117
|
+
if has_callable_attr(body, "_repr_html_"):
|
|
118
|
+
html_content = cast("SupportsReprHtml", body)._repr_html_()
|
|
119
|
+
|
|
120
|
+
# Check if the body is a file path. May include filesystem lookup.
|
|
121
|
+
elif isinstance(body, Path) or _is_file(body):
|
|
122
|
+
file_path = str(body)
|
|
123
|
+
with open(file_path, encoding="utf-8") as f:
|
|
124
|
+
html_content = f.read()
|
|
125
|
+
|
|
126
|
+
# If it's a CSS file, wrap the content in style tags
|
|
127
|
+
if Path(file_path).suffix.lower() == ".css":
|
|
128
|
+
html_content = f"<style>{html_content}</style>"
|
|
129
|
+
|
|
130
|
+
# OK, let's just try converting to string and hope for the best.
|
|
131
|
+
else:
|
|
132
|
+
html_content = clean_text(cast("SupportsStr", body))
|
|
133
|
+
|
|
134
|
+
# Raise an error if the body is empty
|
|
135
|
+
if html_content == "":
|
|
136
|
+
raise StreamlitAPIException("`st.html` body cannot be empty")
|
|
137
|
+
|
|
138
|
+
validate_width(width, allow_content=True)
|
|
139
|
+
layout_config = LayoutConfig(width=width)
|
|
140
|
+
|
|
141
|
+
# Handle the case where there are only style tags - issue #9388
|
|
142
|
+
# Use event container for style tags so they don't take up space in the app content
|
|
143
|
+
if _html_only_style_tags(html_content):
|
|
144
|
+
# If true, there are only style tags - send html to the event container
|
|
145
|
+
html_proto.body = html_content
|
|
146
|
+
return self._event_dg._enqueue("html", html_proto)
|
|
147
|
+
# Otherwise, send the html to the main container as normal
|
|
148
|
+
# Only set the unsafe JS flag for non-style-only HTML content
|
|
149
|
+
html_proto.unsafe_allow_javascript = unsafe_allow_javascript
|
|
150
|
+
html_proto.body = html_content
|
|
151
|
+
return self.dg._enqueue("html", html_proto, layout_config=layout_config)
|
|
152
|
+
|
|
153
|
+
@property
|
|
154
|
+
def dg(self) -> DeltaGenerator:
|
|
155
|
+
"""Get our DeltaGenerator."""
|
|
156
|
+
return cast("DeltaGenerator", self)
|
|
157
|
+
|
|
158
|
+
@property
|
|
159
|
+
def _event_dg(self) -> DeltaGenerator:
|
|
160
|
+
"""Get the event delta generator."""
|
|
161
|
+
return get_dg_singleton_instance().event_dg
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def _html_only_style_tags(html_content: str) -> bool:
|
|
165
|
+
"""Check if the HTML content is only style tags."""
|
|
166
|
+
# Pattern to match HTML comments
|
|
167
|
+
comment_pattern = r"<!--.*?-->"
|
|
168
|
+
# Pattern to match style tags and their contents (case-insensitive)
|
|
169
|
+
style_pattern = r"<style[^>]*>.*?</style>"
|
|
170
|
+
|
|
171
|
+
# Remove style tags and comments
|
|
172
|
+
html_without_comments = re.sub(comment_pattern, "", html_content, flags=re.DOTALL)
|
|
173
|
+
html_without_styles_and_comments = re.sub(
|
|
174
|
+
style_pattern, "", html_without_comments, flags=re.DOTALL | re.IGNORECASE
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
# Return whether html content is empty after removing style tags and comments
|
|
178
|
+
return html_without_styles_and_comments.strip() == ""
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def _is_file(obj: Any) -> bool:
|
|
182
|
+
"""Checks if obj is a file, and doesn't throw if not.
|
|
183
|
+
|
|
184
|
+
The "not throwing" part is important!
|
|
185
|
+
"""
|
|
186
|
+
try:
|
|
187
|
+
return os.path.isfile(obj)
|
|
188
|
+
except TypeError:
|
|
189
|
+
return False
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2026)
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import TYPE_CHECKING, cast
|
|
18
|
+
|
|
19
|
+
from streamlit.elements.lib.layout_utils import LayoutConfig
|
|
20
|
+
from streamlit.errors import StreamlitAPIException
|
|
21
|
+
from streamlit.proto.IFrame_pb2 import IFrame as IFrameProto
|
|
22
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from streamlit.delta_generator import DeltaGenerator
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class IframeMixin:
|
|
29
|
+
@gather_metrics("_iframe")
|
|
30
|
+
def _iframe(
|
|
31
|
+
self,
|
|
32
|
+
src: str,
|
|
33
|
+
width: int | None = None,
|
|
34
|
+
height: int | None = None,
|
|
35
|
+
scrolling: bool = False,
|
|
36
|
+
*,
|
|
37
|
+
tab_index: int | None = None,
|
|
38
|
+
) -> DeltaGenerator:
|
|
39
|
+
"""Load a remote URL in an iframe.
|
|
40
|
+
|
|
41
|
+
To use this function, import it from the ``streamlit.components.v1``
|
|
42
|
+
module.
|
|
43
|
+
|
|
44
|
+
.. warning::
|
|
45
|
+
Using ``st.components.v1.iframe`` directly (instead of importing
|
|
46
|
+
its module) is deprecated and will be disallowed in a later version.
|
|
47
|
+
|
|
48
|
+
Parameters
|
|
49
|
+
----------
|
|
50
|
+
src : str
|
|
51
|
+
The URL of the page to embed.
|
|
52
|
+
|
|
53
|
+
width : int
|
|
54
|
+
The width of the iframe in CSS pixels. By default, this is the
|
|
55
|
+
app's default element width.
|
|
56
|
+
|
|
57
|
+
height : int
|
|
58
|
+
The height of the frame in CSS pixels. By default, this is ``150``.
|
|
59
|
+
|
|
60
|
+
scrolling : bool
|
|
61
|
+
Whether to allow scrolling in the iframe. If this ``False``
|
|
62
|
+
(default), Streamlit crops any content larger than the iframe and
|
|
63
|
+
does not show a scrollbar. If this is ``True``, Streamlit shows a
|
|
64
|
+
scrollbar when the content is larger than the iframe.
|
|
65
|
+
|
|
66
|
+
tab_index : int or None
|
|
67
|
+
Specifies how and if the iframe is sequentially focusable.
|
|
68
|
+
Users typically use the ``Tab`` key for sequential focus
|
|
69
|
+
navigation.
|
|
70
|
+
|
|
71
|
+
This can be one of the following values:
|
|
72
|
+
|
|
73
|
+
- ``None`` (default): Uses the browser's default behavior.
|
|
74
|
+
- ``-1``: Removes the iframe from sequential navigation, but still
|
|
75
|
+
allows it to be focused programmatically.
|
|
76
|
+
- ``0``: Includes the iframe in sequential navigation in the order
|
|
77
|
+
it appears in the document but after all elements with a positive
|
|
78
|
+
``tab_index``.
|
|
79
|
+
- Positive integer: Includes the iframe in sequential navigation.
|
|
80
|
+
Elements are navigated in ascending order of their positive
|
|
81
|
+
``tab_index``.
|
|
82
|
+
|
|
83
|
+
For more information, see the `tabindex
|
|
84
|
+
<https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex>`_
|
|
85
|
+
documentation on MDN.
|
|
86
|
+
|
|
87
|
+
Example
|
|
88
|
+
-------
|
|
89
|
+
|
|
90
|
+
>>> import streamlit.components.v1 as components
|
|
91
|
+
>>>
|
|
92
|
+
>>> components.iframe("https://example.com", height=500)
|
|
93
|
+
|
|
94
|
+
"""
|
|
95
|
+
iframe_proto = IFrameProto()
|
|
96
|
+
marshall(
|
|
97
|
+
iframe_proto,
|
|
98
|
+
src=src,
|
|
99
|
+
scrolling=scrolling,
|
|
100
|
+
tab_index=tab_index,
|
|
101
|
+
)
|
|
102
|
+
layout_config = LayoutConfig(
|
|
103
|
+
width=width if width is not None else "stretch",
|
|
104
|
+
height=height if height is not None else 150,
|
|
105
|
+
)
|
|
106
|
+
return self.dg._enqueue("iframe", iframe_proto, layout_config=layout_config)
|
|
107
|
+
|
|
108
|
+
@gather_metrics("_html")
|
|
109
|
+
def _html(
|
|
110
|
+
self,
|
|
111
|
+
html: str,
|
|
112
|
+
width: int | None = None,
|
|
113
|
+
height: int | None = None,
|
|
114
|
+
scrolling: bool = False,
|
|
115
|
+
*,
|
|
116
|
+
tab_index: int | None = None,
|
|
117
|
+
) -> DeltaGenerator:
|
|
118
|
+
"""Display an HTML string in an iframe.
|
|
119
|
+
|
|
120
|
+
To use this function, import it from the ``streamlit.components.v1``
|
|
121
|
+
module.
|
|
122
|
+
|
|
123
|
+
If you want to insert HTML text into your app without an iframe, try
|
|
124
|
+
``st.html`` instead.
|
|
125
|
+
|
|
126
|
+
.. warning::
|
|
127
|
+
Using ``st.components.v1.html`` directly (instead of importing
|
|
128
|
+
its module) is deprecated and will be disallowed in a later version.
|
|
129
|
+
|
|
130
|
+
Parameters
|
|
131
|
+
----------
|
|
132
|
+
html : str
|
|
133
|
+
The HTML string to embed in the iframe.
|
|
134
|
+
|
|
135
|
+
width : int
|
|
136
|
+
The width of the iframe in CSS pixels. By default, this is the
|
|
137
|
+
app's default element width.
|
|
138
|
+
|
|
139
|
+
height : int
|
|
140
|
+
The height of the frame in CSS pixels. By default, this is ``150``.
|
|
141
|
+
|
|
142
|
+
scrolling : bool
|
|
143
|
+
Whether to allow scrolling in the iframe. If this ``False``
|
|
144
|
+
(default), Streamlit crops any content larger than the iframe and
|
|
145
|
+
does not show a scrollbar. If this is ``True``, Streamlit shows a
|
|
146
|
+
scrollbar when the content is larger than the iframe.
|
|
147
|
+
|
|
148
|
+
tab_index : int or None
|
|
149
|
+
Specifies how and if the iframe is sequentially focusable.
|
|
150
|
+
Users typically use the ``Tab`` key for sequential focus
|
|
151
|
+
navigation.
|
|
152
|
+
|
|
153
|
+
This can be one of the following values:
|
|
154
|
+
|
|
155
|
+
- ``None`` (default): Uses the browser's default behavior.
|
|
156
|
+
- ``-1``: Removes the iframe from sequential navigation, but still
|
|
157
|
+
allows it to be focused programmatically.
|
|
158
|
+
- ``0``: Includes the iframe in sequential navigation in the order
|
|
159
|
+
it appears in the document but after all elements with a positive
|
|
160
|
+
``tab_index``.
|
|
161
|
+
- Positive integer: Includes the iframe in sequential navigation.
|
|
162
|
+
Elements are navigated in ascending order of their positive
|
|
163
|
+
``tab_index``.
|
|
164
|
+
|
|
165
|
+
For more information, see the `tabindex
|
|
166
|
+
<https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex>`_
|
|
167
|
+
documentation on MDN.
|
|
168
|
+
|
|
169
|
+
Example
|
|
170
|
+
-------
|
|
171
|
+
|
|
172
|
+
>>> import streamlit.components.v1 as components
|
|
173
|
+
>>>
|
|
174
|
+
>>> components.html(
|
|
175
|
+
>>> "<p><span style='text-decoration: line-through double red;'>Oops</span>!</p>"
|
|
176
|
+
>>> )
|
|
177
|
+
|
|
178
|
+
"""
|
|
179
|
+
iframe_proto = IFrameProto()
|
|
180
|
+
marshall(
|
|
181
|
+
iframe_proto,
|
|
182
|
+
srcdoc=html,
|
|
183
|
+
scrolling=scrolling,
|
|
184
|
+
tab_index=tab_index,
|
|
185
|
+
)
|
|
186
|
+
layout_config = LayoutConfig(
|
|
187
|
+
width=width if width is not None else "stretch",
|
|
188
|
+
height=height if height is not None else 150,
|
|
189
|
+
)
|
|
190
|
+
return self.dg._enqueue("iframe", iframe_proto, layout_config=layout_config)
|
|
191
|
+
|
|
192
|
+
@property
|
|
193
|
+
def dg(self) -> DeltaGenerator:
|
|
194
|
+
"""Get our DeltaGenerator."""
|
|
195
|
+
return cast("DeltaGenerator", self)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def marshall(
|
|
199
|
+
proto: IFrameProto,
|
|
200
|
+
src: str | None = None,
|
|
201
|
+
srcdoc: str | None = None,
|
|
202
|
+
scrolling: bool = False,
|
|
203
|
+
tab_index: int | None = None,
|
|
204
|
+
) -> None:
|
|
205
|
+
"""Marshalls data into an IFrame proto.
|
|
206
|
+
|
|
207
|
+
These parameters correspond directly to <iframe> attributes, which are
|
|
208
|
+
described in more detail at
|
|
209
|
+
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe.
|
|
210
|
+
|
|
211
|
+
Parameters
|
|
212
|
+
----------
|
|
213
|
+
proto : IFrame protobuf
|
|
214
|
+
The protobuf object to marshall data into.
|
|
215
|
+
src : str
|
|
216
|
+
The URL of the page to embed.
|
|
217
|
+
srcdoc : str
|
|
218
|
+
Inline HTML to embed. Overrides src.
|
|
219
|
+
scrolling : bool
|
|
220
|
+
If true, show a scrollbar when the content is larger than the iframe.
|
|
221
|
+
Otherwise, never show a scrollbar.
|
|
222
|
+
tab_index : int, optional
|
|
223
|
+
Specifies the tab order of the iframe.
|
|
224
|
+
|
|
225
|
+
"""
|
|
226
|
+
if src is not None:
|
|
227
|
+
proto.src = src
|
|
228
|
+
|
|
229
|
+
if srcdoc is not None:
|
|
230
|
+
proto.srcdoc = srcdoc
|
|
231
|
+
|
|
232
|
+
proto.scrolling = scrolling
|
|
233
|
+
|
|
234
|
+
if tab_index is not None:
|
|
235
|
+
# Validate tab_index according to web specifications
|
|
236
|
+
if not (
|
|
237
|
+
isinstance(tab_index, int)
|
|
238
|
+
and not isinstance(tab_index, bool)
|
|
239
|
+
and tab_index >= -1
|
|
240
|
+
):
|
|
241
|
+
raise StreamlitAPIException(
|
|
242
|
+
"tab_index must be None, -1, or a non-negative integer."
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
proto.tab_index = tab_index
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2026)
|
|
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
|
+
# Some casts in this file are only occasionally necessary depending on the
|
|
16
|
+
# user's Python version, and mypy doesn't have a good way of toggling this
|
|
17
|
+
# specific config option at a per-line level.
|
|
18
|
+
# mypy: no-warn-unused-ignores
|
|
19
|
+
|
|
20
|
+
"""Image marshalling."""
|
|
21
|
+
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
from typing import TYPE_CHECKING, Literal, TypeAlias, cast
|
|
25
|
+
|
|
26
|
+
from streamlit.deprecation_util import (
|
|
27
|
+
make_deprecated_name_warning,
|
|
28
|
+
show_deprecation_warning,
|
|
29
|
+
)
|
|
30
|
+
from streamlit.elements.lib.image_utils import (
|
|
31
|
+
Channels,
|
|
32
|
+
ImageFormatOrAuto,
|
|
33
|
+
ImageOrImageList,
|
|
34
|
+
marshall_images,
|
|
35
|
+
)
|
|
36
|
+
from streamlit.elements.lib.layout_utils import LayoutConfig, Width, validate_width
|
|
37
|
+
from streamlit.errors import StreamlitAPIException
|
|
38
|
+
from streamlit.proto.Image_pb2 import ImageList as ImageListProto
|
|
39
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
|
40
|
+
|
|
41
|
+
if TYPE_CHECKING:
|
|
42
|
+
from streamlit.delta_generator import DeltaGenerator
|
|
43
|
+
|
|
44
|
+
UseColumnWith: TypeAlias = Literal["auto", "always", "never"] | bool | None
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class ImageMixin:
|
|
48
|
+
@gather_metrics("image")
|
|
49
|
+
def image(
|
|
50
|
+
self,
|
|
51
|
+
image: ImageOrImageList,
|
|
52
|
+
# TODO: Narrow type of caption, dependent on type of image,
|
|
53
|
+
# by way of overload
|
|
54
|
+
caption: str | list[str] | None = None,
|
|
55
|
+
width: Width = "content",
|
|
56
|
+
use_column_width: UseColumnWith = None,
|
|
57
|
+
clamp: bool = False,
|
|
58
|
+
channels: Channels = "RGB",
|
|
59
|
+
output_format: ImageFormatOrAuto = "auto",
|
|
60
|
+
*,
|
|
61
|
+
use_container_width: bool | None = None,
|
|
62
|
+
) -> DeltaGenerator:
|
|
63
|
+
"""Display an image or list of images.
|
|
64
|
+
|
|
65
|
+
Parameters
|
|
66
|
+
----------
|
|
67
|
+
image : numpy.ndarray, BytesIO, str, Path, or list of these
|
|
68
|
+
The image to display. This can be one of the following:
|
|
69
|
+
|
|
70
|
+
- A URL (string) for a hosted image.
|
|
71
|
+
- A path to a local image file. The path can be a ``str``
|
|
72
|
+
or ``Path`` object. Paths can be absolute or relative to the
|
|
73
|
+
working directory (where you execute ``streamlit run``).
|
|
74
|
+
- An SVG string like ``<svg xmlns=...</svg>``.
|
|
75
|
+
- A byte array defining an image. This includes monochrome images of
|
|
76
|
+
shape (w,h) or (w,h,1), color images of shape (w,h,3), or RGBA
|
|
77
|
+
images of shape (w,h,4), where w and h are the image width and
|
|
78
|
+
height, respectively.
|
|
79
|
+
- A list of any of the above. Streamlit displays the list as a
|
|
80
|
+
row of images that overflow to additional rows as needed.
|
|
81
|
+
caption : str or list of str
|
|
82
|
+
Image caption(s). If this is ``None`` (default), no caption is
|
|
83
|
+
displayed. If ``image`` is a list of multiple images, ``caption``
|
|
84
|
+
must be a list of captions (one caption for each image) or
|
|
85
|
+
``None``.
|
|
86
|
+
|
|
87
|
+
Captions can optionally contain GitHub-flavored Markdown. Syntax
|
|
88
|
+
information can be found at: https://github.github.com/gfm.
|
|
89
|
+
|
|
90
|
+
See the ``body`` parameter of |st.markdown|_ for additional,
|
|
91
|
+
supported Markdown directives.
|
|
92
|
+
|
|
93
|
+
.. |st.markdown| replace:: ``st.markdown``
|
|
94
|
+
.. _st.markdown: https://docs.streamlit.io/develop/api-reference/text/st.markdown
|
|
95
|
+
width : "content", "stretch", or int
|
|
96
|
+
The width of the image element. This can be one of the following:
|
|
97
|
+
|
|
98
|
+
- ``"content"`` (default): The width of the element matches the
|
|
99
|
+
width of its content, but doesn't exceed the width of the parent
|
|
100
|
+
container.
|
|
101
|
+
- ``"stretch"``: The width of the element matches the width of the
|
|
102
|
+
parent container.
|
|
103
|
+
- An integer specifying the width in pixels: The element has a
|
|
104
|
+
fixed width. If the specified width is greater than the width of
|
|
105
|
+
the parent container, the width of the element matches the width
|
|
106
|
+
of the parent container.
|
|
107
|
+
|
|
108
|
+
When using an SVG image without a default width, use ``"stretch"``
|
|
109
|
+
or an integer.
|
|
110
|
+
use_column_width : "auto", "always", "never", or bool
|
|
111
|
+
If "auto", set the image's width to its natural size,
|
|
112
|
+
but do not exceed the width of the column.
|
|
113
|
+
If "always" or True, set the image's width to the column width.
|
|
114
|
+
If "never" or False, set the image's width to its natural size.
|
|
115
|
+
Note: if set, `use_column_width` takes precedence over the `width` parameter.
|
|
116
|
+
|
|
117
|
+
.. deprecated::
|
|
118
|
+
``use_column_width`` is deprecated and will be removed in a future
|
|
119
|
+
release. Please use the ``width`` parameter instead.
|
|
120
|
+
|
|
121
|
+
clamp : bool
|
|
122
|
+
Whether to clamp image pixel values to a valid range (0-255 per
|
|
123
|
+
channel). This is only used for byte array images; the parameter is
|
|
124
|
+
ignored for image URLs and files. If this is ``False`` (default)
|
|
125
|
+
and an image has an out-of-range value, a ``RuntimeError`` will be
|
|
126
|
+
raised.
|
|
127
|
+
channels : "RGB" or "BGR"
|
|
128
|
+
The color format when ``image`` is an ``nd.array``. This is ignored
|
|
129
|
+
for other image types. If this is ``"RGB"`` (default),
|
|
130
|
+
``image[:, :, 0]`` is the red channel, ``image[:, :, 1]`` is the
|
|
131
|
+
green channel, and ``image[:, :, 2]`` is the blue channel. For
|
|
132
|
+
images coming from libraries like OpenCV, you should set this to
|
|
133
|
+
``"BGR"`` instead.
|
|
134
|
+
output_format : "JPEG", "PNG", or "auto"
|
|
135
|
+
The output format to use when transferring the image data. If this
|
|
136
|
+
is ``"auto"`` (default), Streamlit identifies the compression type
|
|
137
|
+
based on the type and format of the image. Photos should use the
|
|
138
|
+
``"JPEG"`` format for lossy compression while diagrams should use
|
|
139
|
+
the ``"PNG"`` format for lossless compression.
|
|
140
|
+
|
|
141
|
+
use_container_width : bool
|
|
142
|
+
Whether to override ``width`` with the width of the parent
|
|
143
|
+
container. If ``use_container_width`` is ``False`` (default),
|
|
144
|
+
Streamlit sets the image's width according to ``width``. If
|
|
145
|
+
``use_container_width`` is ``True``, Streamlit sets the width of
|
|
146
|
+
the image to match the width of the parent container.
|
|
147
|
+
|
|
148
|
+
.. deprecated::
|
|
149
|
+
``use_container_width`` is deprecated and will be removed in a
|
|
150
|
+
future release. For ``use_container_width=True``, use
|
|
151
|
+
``width="stretch"``. For ``use_container_width=False``, use
|
|
152
|
+
``width="content"``.
|
|
153
|
+
|
|
154
|
+
Example
|
|
155
|
+
-------
|
|
156
|
+
>>> import streamlit as st
|
|
157
|
+
>>> st.image("sunrise.jpg", caption="Sunrise by the mountains")
|
|
158
|
+
|
|
159
|
+
.. output::
|
|
160
|
+
https://doc-image.streamlit.app/
|
|
161
|
+
height: 710px
|
|
162
|
+
|
|
163
|
+
"""
|
|
164
|
+
|
|
165
|
+
if use_column_width is not None:
|
|
166
|
+
if use_container_width is not None:
|
|
167
|
+
raise StreamlitAPIException(
|
|
168
|
+
"`use_container_width` and `use_column_width` cannot be set at the same time.",
|
|
169
|
+
"Please utilize `use_container_width` since `use_column_width` is deprecated.",
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
show_deprecation_warning(
|
|
173
|
+
"The `use_column_width` parameter has been deprecated and will be removed "
|
|
174
|
+
"in a future release. Please utilize the `width` parameter instead."
|
|
175
|
+
)
|
|
176
|
+
if use_column_width in {"auto", "never"} or use_column_width is False:
|
|
177
|
+
width = "content"
|
|
178
|
+
elif use_column_width == "always" or use_column_width is True:
|
|
179
|
+
width = "stretch"
|
|
180
|
+
|
|
181
|
+
if use_container_width is not None:
|
|
182
|
+
show_deprecation_warning(
|
|
183
|
+
make_deprecated_name_warning(
|
|
184
|
+
"use_container_width",
|
|
185
|
+
"width",
|
|
186
|
+
"2025-12-31",
|
|
187
|
+
"For `use_container_width=True`, use `width='stretch'`. "
|
|
188
|
+
"For `use_container_width=False`, use `width='content'`.",
|
|
189
|
+
include_st_prefix=False,
|
|
190
|
+
),
|
|
191
|
+
show_in_browser=False,
|
|
192
|
+
)
|
|
193
|
+
if use_container_width is True:
|
|
194
|
+
width = "stretch"
|
|
195
|
+
elif isinstance(width, int):
|
|
196
|
+
# Preserve the existing behavior with respect to use_container_width=False
|
|
197
|
+
# and width=int.
|
|
198
|
+
pass
|
|
199
|
+
else:
|
|
200
|
+
width = "content"
|
|
201
|
+
|
|
202
|
+
validate_width(width, allow_content=True)
|
|
203
|
+
layout_config = LayoutConfig(width=width)
|
|
204
|
+
|
|
205
|
+
image_list_proto = ImageListProto()
|
|
206
|
+
marshall_images(
|
|
207
|
+
self.dg._get_delta_path_str(),
|
|
208
|
+
image,
|
|
209
|
+
caption,
|
|
210
|
+
layout_config,
|
|
211
|
+
image_list_proto,
|
|
212
|
+
clamp,
|
|
213
|
+
channels,
|
|
214
|
+
output_format,
|
|
215
|
+
)
|
|
216
|
+
return self.dg._enqueue("imgs", image_list_proto, layout_config=layout_config)
|
|
217
|
+
|
|
218
|
+
@property
|
|
219
|
+
def dg(self) -> DeltaGenerator:
|
|
220
|
+
"""Get our DeltaGenerator."""
|
|
221
|
+
return cast("DeltaGenerator", self)
|