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,158 @@
|
|
|
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
|
+
from abc import ABC, abstractmethod
|
|
19
|
+
from typing import TYPE_CHECKING, Any
|
|
20
|
+
|
|
21
|
+
from streamlit import util
|
|
22
|
+
from streamlit.errors import StreamlitAPIException
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from streamlit.runtime.state.common import WidgetCallback
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class MarshallComponentException(StreamlitAPIException):
|
|
29
|
+
"""Class for exceptions generated during custom component marshalling."""
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class BaseCustomComponent(ABC):
|
|
33
|
+
"""Interface for CustomComponents."""
|
|
34
|
+
|
|
35
|
+
def __init__(
|
|
36
|
+
self,
|
|
37
|
+
name: str,
|
|
38
|
+
path: str | None = None,
|
|
39
|
+
url: str | None = None,
|
|
40
|
+
module_name: str | None = None,
|
|
41
|
+
) -> None:
|
|
42
|
+
if path is None and url is None:
|
|
43
|
+
raise StreamlitAPIException("Either 'path' or 'url' must be set.")
|
|
44
|
+
|
|
45
|
+
self._name = name
|
|
46
|
+
self._path = path
|
|
47
|
+
self._url = url
|
|
48
|
+
self._module_name = module_name
|
|
49
|
+
|
|
50
|
+
def __repr__(self) -> str:
|
|
51
|
+
return util.repr_(self)
|
|
52
|
+
|
|
53
|
+
def __call__(
|
|
54
|
+
self,
|
|
55
|
+
*args: Any,
|
|
56
|
+
default: Any = None,
|
|
57
|
+
key: str | None = None,
|
|
58
|
+
on_change: WidgetCallback | None = None,
|
|
59
|
+
tab_index: int | None = None,
|
|
60
|
+
**kwargs: Any,
|
|
61
|
+
) -> Any:
|
|
62
|
+
"""An alias for create_instance."""
|
|
63
|
+
return self.create_instance(
|
|
64
|
+
*args,
|
|
65
|
+
default=default,
|
|
66
|
+
key=key,
|
|
67
|
+
on_change=on_change,
|
|
68
|
+
tab_index=tab_index,
|
|
69
|
+
**kwargs,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
@property
|
|
73
|
+
def abspath(self) -> str | None:
|
|
74
|
+
if self._path is None:
|
|
75
|
+
return None
|
|
76
|
+
return os.path.abspath(self._path)
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def module_name(self) -> str | None:
|
|
80
|
+
return self._module_name
|
|
81
|
+
|
|
82
|
+
@property
|
|
83
|
+
def name(self) -> str:
|
|
84
|
+
return self._name
|
|
85
|
+
|
|
86
|
+
@property
|
|
87
|
+
def path(self) -> str | None:
|
|
88
|
+
return self._path
|
|
89
|
+
|
|
90
|
+
@property
|
|
91
|
+
def url(self) -> str | None:
|
|
92
|
+
return self._url
|
|
93
|
+
|
|
94
|
+
def __str__(self) -> str:
|
|
95
|
+
return f"'{self.name}': {self.path if self.path is not None else self.url}"
|
|
96
|
+
|
|
97
|
+
def __hash__(self) -> int:
|
|
98
|
+
return hash((self.name, self.path, self.url, self.module_name))
|
|
99
|
+
|
|
100
|
+
@abstractmethod
|
|
101
|
+
def __eq__(self, other: object) -> bool:
|
|
102
|
+
"""Equality operator."""
|
|
103
|
+
return NotImplemented
|
|
104
|
+
|
|
105
|
+
@abstractmethod
|
|
106
|
+
def __ne__(self, other: object) -> bool:
|
|
107
|
+
"""Inequality operator."""
|
|
108
|
+
return NotImplemented
|
|
109
|
+
|
|
110
|
+
@abstractmethod
|
|
111
|
+
def create_instance(
|
|
112
|
+
self,
|
|
113
|
+
*args: Any,
|
|
114
|
+
default: Any = None,
|
|
115
|
+
key: str | None = None,
|
|
116
|
+
on_change: WidgetCallback | None = None,
|
|
117
|
+
tab_index: int | None = None,
|
|
118
|
+
**kwargs: Any,
|
|
119
|
+
) -> Any:
|
|
120
|
+
"""Create a new instance of the component.
|
|
121
|
+
|
|
122
|
+
Parameters
|
|
123
|
+
----------
|
|
124
|
+
*args
|
|
125
|
+
Must be empty; all args must be named. (This parameter exists to
|
|
126
|
+
enforce correct use of the function.)
|
|
127
|
+
default: any or None
|
|
128
|
+
The default return value for the component. This is returned when
|
|
129
|
+
the component's frontend hasn't yet specified a value with
|
|
130
|
+
`setComponentValue`.
|
|
131
|
+
key: str or None
|
|
132
|
+
If not None, this is the user key we use to generate the
|
|
133
|
+
component's "widget ID".
|
|
134
|
+
on_change: WidgetCallback or None
|
|
135
|
+
An optional callback invoked when the widget's value changes. No arguments are passed to it.
|
|
136
|
+
tab_index: int or None
|
|
137
|
+
Specifies the tab order of the iframe containing the component.
|
|
138
|
+
Possible values are:
|
|
139
|
+
- ``None`` (default): Browser default behavior.
|
|
140
|
+
- ``-1``: Removes the iframe from the natural tab order, but it can still be focused programmatically.
|
|
141
|
+
- ``0`` or positive integer: Includes the iframe in the natural tab order.
|
|
142
|
+
**kwargs
|
|
143
|
+
Keyword args to pass to the component.
|
|
144
|
+
|
|
145
|
+
Raises
|
|
146
|
+
------
|
|
147
|
+
MarshallComponentException
|
|
148
|
+
Raised when args is not empty or component cannot be marshalled.
|
|
149
|
+
StreamlitAPIException
|
|
150
|
+
Raised when PyArrow is not installed.
|
|
151
|
+
|
|
152
|
+
Returns
|
|
153
|
+
-------
|
|
154
|
+
any or None
|
|
155
|
+
The component's widget value.
|
|
156
|
+
|
|
157
|
+
"""
|
|
158
|
+
raise NotImplementedError
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
"""Contains the files and modules for the exposed API."""
|
|
16
|
+
|
|
17
|
+
import streamlit
|
|
18
|
+
from streamlit.components.v1.component_registry import declare_component
|
|
19
|
+
|
|
20
|
+
# `html` and `iframe` are part of Custom Components, so they appear in this
|
|
21
|
+
# `streamlit.components.v1` namespace.
|
|
22
|
+
html = streamlit._main._html
|
|
23
|
+
iframe = streamlit._main._iframe
|
|
24
|
+
|
|
25
|
+
__all__ = [
|
|
26
|
+
"declare_component",
|
|
27
|
+
"html",
|
|
28
|
+
"iframe",
|
|
29
|
+
]
|
|
@@ -0,0 +1,141 @@
|
|
|
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
|
+
"""Data marshalling utilities for ArrowTable protobufs, which are used by
|
|
16
|
+
CustomComponent for dataframe serialization.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
from typing import TYPE_CHECKING, Any
|
|
22
|
+
|
|
23
|
+
from streamlit import dataframe_util
|
|
24
|
+
from streamlit.elements.lib import pandas_styler_utils
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from pandas import DataFrame, Index
|
|
28
|
+
|
|
29
|
+
from streamlit.proto.Components_pb2 import ArrowTable as ArrowTableProto
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _maybe_tuple_to_list(item: Any) -> Any:
|
|
33
|
+
"""Convert a tuple to a list. Leave as is if it's not a tuple."""
|
|
34
|
+
return list(item) if isinstance(item, tuple) else item
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def marshall(
|
|
38
|
+
proto: ArrowTableProto, data: Any, default_uuid: str | None = None
|
|
39
|
+
) -> None:
|
|
40
|
+
"""Marshall data into an ArrowTable proto.
|
|
41
|
+
|
|
42
|
+
Parameters
|
|
43
|
+
----------
|
|
44
|
+
proto : proto.ArrowTable
|
|
45
|
+
Output. The protobuf for a Streamlit ArrowTable proto.
|
|
46
|
+
|
|
47
|
+
data : pandas.DataFrame, pandas.Styler, numpy.ndarray, Iterable, dict, or None
|
|
48
|
+
Something that is or can be converted to a dataframe.
|
|
49
|
+
|
|
50
|
+
"""
|
|
51
|
+
if dataframe_util.is_pandas_styler(data):
|
|
52
|
+
pandas_styler_utils.marshall_styler(proto, data, default_uuid) # type: ignore
|
|
53
|
+
|
|
54
|
+
df = dataframe_util.convert_anything_to_pandas_df(data)
|
|
55
|
+
_marshall_index(proto, df.index)
|
|
56
|
+
_marshall_columns(proto, df.columns)
|
|
57
|
+
_marshall_data(proto, df)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _marshall_index(proto: ArrowTableProto, index: Index[Any]) -> None:
|
|
61
|
+
"""Marshall pandas.DataFrame index into an ArrowTable proto.
|
|
62
|
+
|
|
63
|
+
Parameters
|
|
64
|
+
----------
|
|
65
|
+
proto : proto.ArrowTable
|
|
66
|
+
Output. The protobuf for a Streamlit ArrowTable proto.
|
|
67
|
+
|
|
68
|
+
index : pd.Index
|
|
69
|
+
Index to use for resulting frame.
|
|
70
|
+
Will default to RangeIndex (0, 1, 2, ..., n) if no index is provided.
|
|
71
|
+
|
|
72
|
+
"""
|
|
73
|
+
import pandas as pd
|
|
74
|
+
|
|
75
|
+
index_values = list(map(_maybe_tuple_to_list, index.values))
|
|
76
|
+
index_df = pd.DataFrame(index_values)
|
|
77
|
+
proto.index = dataframe_util.convert_pandas_df_to_arrow_bytes(index_df)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _marshall_columns(proto: ArrowTableProto, columns: Index[Any]) -> None:
|
|
81
|
+
"""Marshall pandas.DataFrame columns into an ArrowTable proto.
|
|
82
|
+
|
|
83
|
+
Parameters
|
|
84
|
+
----------
|
|
85
|
+
proto : proto.ArrowTable
|
|
86
|
+
Output. The protobuf for a Streamlit ArrowTable proto.
|
|
87
|
+
|
|
88
|
+
columns : Index
|
|
89
|
+
Column labels to use for resulting frame.
|
|
90
|
+
Will default to RangeIndex (0, 1, 2, ..., n) if no column labels are provided.
|
|
91
|
+
|
|
92
|
+
"""
|
|
93
|
+
import pandas as pd
|
|
94
|
+
|
|
95
|
+
column_values = list(map(_maybe_tuple_to_list, columns.values))
|
|
96
|
+
columns_df = pd.DataFrame(column_values)
|
|
97
|
+
proto.columns = dataframe_util.convert_pandas_df_to_arrow_bytes(columns_df)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _marshall_data(proto: ArrowTableProto, df: DataFrame) -> None:
|
|
101
|
+
"""Marshall pandas.DataFrame data into an ArrowTable proto.
|
|
102
|
+
|
|
103
|
+
Parameters
|
|
104
|
+
----------
|
|
105
|
+
proto : proto.ArrowTable
|
|
106
|
+
Output. The protobuf for a Streamlit ArrowTable proto.
|
|
107
|
+
|
|
108
|
+
df : pandas.DataFrame
|
|
109
|
+
A dataframe to marshall.
|
|
110
|
+
|
|
111
|
+
"""
|
|
112
|
+
proto.data = dataframe_util.convert_pandas_df_to_arrow_bytes(df)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def arrow_proto_to_dataframe(proto: ArrowTableProto) -> DataFrame:
|
|
116
|
+
"""Convert ArrowTable proto to pandas.DataFrame.
|
|
117
|
+
|
|
118
|
+
Parameters
|
|
119
|
+
----------
|
|
120
|
+
proto : proto.ArrowTable
|
|
121
|
+
Output. pandas.DataFrame
|
|
122
|
+
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
if dataframe_util.is_pyarrow_version_less_than("14.0.1"):
|
|
126
|
+
raise RuntimeError(
|
|
127
|
+
"The installed pyarrow version is not compatible with this component. "
|
|
128
|
+
"Please upgrade to 14.0.1 or higher: pip install -U pyarrow"
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
import pandas as pd
|
|
132
|
+
|
|
133
|
+
data = dataframe_util.convert_arrow_bytes_to_pandas_df(proto.data)
|
|
134
|
+
index = dataframe_util.convert_arrow_bytes_to_pandas_df(proto.index)
|
|
135
|
+
columns = dataframe_util.convert_arrow_bytes_to_pandas_df(proto.columns)
|
|
136
|
+
|
|
137
|
+
return pd.DataFrame(
|
|
138
|
+
data.to_numpy(),
|
|
139
|
+
index=index.to_numpy().T.tolist(),
|
|
140
|
+
columns=columns.to_numpy().T.tolist(),
|
|
141
|
+
)
|
|
@@ -0,0 +1,147 @@
|
|
|
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 inspect
|
|
18
|
+
import os
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import TYPE_CHECKING
|
|
21
|
+
|
|
22
|
+
from streamlit import config
|
|
23
|
+
from streamlit.components.v1.custom_component import CustomComponent
|
|
24
|
+
from streamlit.runtime import get_instance
|
|
25
|
+
from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
|
|
26
|
+
|
|
27
|
+
if TYPE_CHECKING:
|
|
28
|
+
from types import FrameType
|
|
29
|
+
|
|
30
|
+
from streamlit.components.types.base_component_registry import BaseComponentRegistry
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _get_module_name(caller_frame: FrameType) -> str:
|
|
34
|
+
# Get the caller's module name. `__name__` gives us the module's
|
|
35
|
+
# fully-qualified name, which includes its package.
|
|
36
|
+
module = inspect.getmodule(caller_frame)
|
|
37
|
+
if module is None:
|
|
38
|
+
raise RuntimeError("module is None. This should never happen.")
|
|
39
|
+
module_name = module.__name__
|
|
40
|
+
|
|
41
|
+
# If the caller was the main module that was executed (that is, if the
|
|
42
|
+
# user executed `python my_component.py`), then this name will be
|
|
43
|
+
# "__main__" instead of the actual package name. In this case, we use
|
|
44
|
+
# the main module's filename, sans `.py` extension, as the component name.
|
|
45
|
+
if module_name == "__main__":
|
|
46
|
+
file_path = inspect.getfile(caller_frame)
|
|
47
|
+
filename = os.path.basename(file_path)
|
|
48
|
+
module_name, _ = os.path.splitext(filename)
|
|
49
|
+
|
|
50
|
+
return module_name
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def declare_component(
|
|
54
|
+
name: str,
|
|
55
|
+
path: str | Path | None = None,
|
|
56
|
+
url: str | None = None,
|
|
57
|
+
) -> CustomComponent:
|
|
58
|
+
"""Create a custom component and register it if there is a ``ScriptRunContext``.
|
|
59
|
+
|
|
60
|
+
The component is not registered when there is no ``ScriptRunContext``.
|
|
61
|
+
This can happen when a ``CustomComponent`` is executed as standalone
|
|
62
|
+
command (e.g. for testing).
|
|
63
|
+
|
|
64
|
+
To use this function, import it from the ``streamlit.components.v1``
|
|
65
|
+
module.
|
|
66
|
+
|
|
67
|
+
.. warning::
|
|
68
|
+
Using ``st.components.v1.declare_component`` directly (instead of
|
|
69
|
+
importing its module) is deprecated and will be disallowed in a later
|
|
70
|
+
version.
|
|
71
|
+
|
|
72
|
+
Parameters
|
|
73
|
+
----------
|
|
74
|
+
name : str
|
|
75
|
+
A short, descriptive name for the component, like "slider".
|
|
76
|
+
|
|
77
|
+
path: str, Path, or None
|
|
78
|
+
The path to serve the component's frontend files from. The path should
|
|
79
|
+
be absolute. If ``path`` is ``None`` (default), Streamlit will serve
|
|
80
|
+
the component from the location in ``url``. Either ``path`` or ``url``
|
|
81
|
+
must be specified. If both are specified, then ``url`` will take
|
|
82
|
+
precedence.
|
|
83
|
+
|
|
84
|
+
url: str or None
|
|
85
|
+
The URL that the component is served from. If ``url`` is ``None``
|
|
86
|
+
(default), Streamlit will serve the component from the location in
|
|
87
|
+
``path``. Either ``path`` or ``url`` must be specified. If both are
|
|
88
|
+
specified, then ``url`` will take precedence.
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
Returns
|
|
92
|
+
-------
|
|
93
|
+
CustomComponent
|
|
94
|
+
A ``CustomComponent`` that can be called like a function.
|
|
95
|
+
Calling the component will create a new instance of the component
|
|
96
|
+
in the Streamlit app.
|
|
97
|
+
|
|
98
|
+
"""
|
|
99
|
+
if path is not None and isinstance(path, Path):
|
|
100
|
+
path = str(path)
|
|
101
|
+
|
|
102
|
+
# Get our stack frame.
|
|
103
|
+
current_frame: FrameType | None = inspect.currentframe()
|
|
104
|
+
if current_frame is None:
|
|
105
|
+
raise RuntimeError("current_frame is None. This should never happen.")
|
|
106
|
+
# Get the stack frame of our calling function.
|
|
107
|
+
caller_frame = current_frame.f_back
|
|
108
|
+
if caller_frame is None:
|
|
109
|
+
raise RuntimeError("caller_frame is None. This should never happen.")
|
|
110
|
+
|
|
111
|
+
module_name = _get_module_name(caller_frame)
|
|
112
|
+
|
|
113
|
+
# Build the component name.
|
|
114
|
+
component_name = f"{module_name}.{name}"
|
|
115
|
+
|
|
116
|
+
# NOTE: We intentionally don't mention this behavior in this function's
|
|
117
|
+
# docstring as we're only using it internally for now (the config option
|
|
118
|
+
# is also hidden). This should be properly documented if/when we do decide
|
|
119
|
+
# to expose it more publicly.
|
|
120
|
+
if not url and (
|
|
121
|
+
component_base_path := config.get_option("server.customComponentBaseUrlPath")
|
|
122
|
+
):
|
|
123
|
+
url = f"{component_base_path}/{component_name}/" # ty: ignore[possibly-unresolved-reference]
|
|
124
|
+
|
|
125
|
+
# Create our component object, and register it.
|
|
126
|
+
component = CustomComponent(
|
|
127
|
+
name=component_name, path=path, url=url, module_name=module_name
|
|
128
|
+
)
|
|
129
|
+
# the ctx can be None if a custom component script is run outside of Streamlit, e.g. via 'python ...'
|
|
130
|
+
ctx = get_script_run_ctx()
|
|
131
|
+
if ctx is not None:
|
|
132
|
+
get_instance().component_registry.register_component(component)
|
|
133
|
+
return component
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
# Keep for backwards-compatibility for now as we don't know whether existing custom
|
|
137
|
+
# components use this method. We made significant refactors to the custom component
|
|
138
|
+
# registry code in https://github.com/streamlit/streamlit/pull/8193 and after
|
|
139
|
+
# that is out in the wild, we can follow-up with more refactorings, e.g. remove
|
|
140
|
+
# the following class and method. When we do that, we should conduct some testing with
|
|
141
|
+
# popular custom components.
|
|
142
|
+
class ComponentRegistry:
|
|
143
|
+
@classmethod
|
|
144
|
+
def instance(cls) -> BaseComponentRegistry:
|
|
145
|
+
"""Returns the ComponentRegistry of the runtime instance."""
|
|
146
|
+
|
|
147
|
+
return get_instance().component_registry
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
# The components.py file exists because existing custom components have started
|
|
16
|
+
# to rely on internals of the components package. For example, streamlit-option-menu accesses
|
|
17
|
+
# [register_widget](https://github.com/victoryhb/streamlit-option-menu/blob/master/streamlit_option_menu/streamlit_callback.py#L28),
|
|
18
|
+
# which is only a transitive import through `streamlit.components.v1.custom_component`.
|
|
19
|
+
# Since we do not know what other internals are used out in the wild, let's try to
|
|
20
|
+
# model the old behavior and not to break things.
|
|
21
|
+
|
|
22
|
+
# This should be cleaned up in the future, e.g. as part of components v2.
|
|
23
|
+
|
|
24
|
+
from streamlit.components.v1.component_registry import (
|
|
25
|
+
declare_component,
|
|
26
|
+
)
|
|
27
|
+
from streamlit.components.v1.custom_component import (
|
|
28
|
+
CustomComponent,
|
|
29
|
+
MarshallComponentException,
|
|
30
|
+
)
|
|
31
|
+
from streamlit.runtime.state import register_widget
|
|
32
|
+
|
|
33
|
+
__all__ = [
|
|
34
|
+
"CustomComponent",
|
|
35
|
+
"MarshallComponentException",
|
|
36
|
+
"declare_component",
|
|
37
|
+
"register_widget",
|
|
38
|
+
]
|