streamlit-nightly 1.43.2.dev20250307__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- streamlit/__init__.py +306 -0
- streamlit/__main__.py +20 -0
- streamlit/auth_util.py +218 -0
- streamlit/cli_util.py +105 -0
- streamlit/column_config.py +56 -0
- streamlit/commands/__init__.py +13 -0
- streamlit/commands/echo.py +126 -0
- streamlit/commands/execution_control.py +238 -0
- streamlit/commands/experimental_query_params.py +169 -0
- streamlit/commands/logo.py +189 -0
- streamlit/commands/navigation.py +385 -0
- streamlit/commands/page_config.py +311 -0
- streamlit/components/__init__.py +13 -0
- streamlit/components/lib/__init__.py +13 -0
- streamlit/components/lib/local_component_registry.py +84 -0
- streamlit/components/types/__init__.py +13 -0
- streamlit/components/types/base_component_registry.py +99 -0
- streamlit/components/types/base_custom_component.py +150 -0
- streamlit/components/v1/__init__.py +31 -0
- streamlit/components/v1/component_arrow.py +141 -0
- streamlit/components/v1/component_registry.py +130 -0
- streamlit/components/v1/components.py +38 -0
- streamlit/components/v1/custom_component.py +243 -0
- streamlit/config.py +1513 -0
- streamlit/config_option.py +311 -0
- streamlit/config_util.py +177 -0
- streamlit/connections/__init__.py +28 -0
- streamlit/connections/base_connection.py +174 -0
- streamlit/connections/snowflake_connection.py +562 -0
- streamlit/connections/snowpark_connection.py +213 -0
- streamlit/connections/sql_connection.py +425 -0
- streamlit/connections/util.py +97 -0
- streamlit/cursor.py +210 -0
- streamlit/dataframe_util.py +1416 -0
- streamlit/delta_generator.py +602 -0
- streamlit/delta_generator_singletons.py +204 -0
- streamlit/deprecation_util.py +209 -0
- streamlit/development.py +21 -0
- streamlit/elements/__init__.py +13 -0
- streamlit/elements/alert.py +234 -0
- streamlit/elements/arrow.py +962 -0
- streamlit/elements/balloons.py +47 -0
- streamlit/elements/bokeh_chart.py +133 -0
- streamlit/elements/code.py +114 -0
- streamlit/elements/deck_gl_json_chart.py +546 -0
- streamlit/elements/dialog_decorator.py +267 -0
- streamlit/elements/doc_string.py +558 -0
- streamlit/elements/empty.py +130 -0
- streamlit/elements/exception.py +331 -0
- streamlit/elements/form.py +354 -0
- streamlit/elements/graphviz_chart.py +150 -0
- streamlit/elements/heading.py +302 -0
- streamlit/elements/html.py +105 -0
- streamlit/elements/iframe.py +191 -0
- streamlit/elements/image.py +196 -0
- streamlit/elements/json.py +139 -0
- streamlit/elements/layouts.py +879 -0
- streamlit/elements/lib/__init__.py +13 -0
- streamlit/elements/lib/built_in_chart_utils.py +1157 -0
- streamlit/elements/lib/color_util.py +263 -0
- streamlit/elements/lib/column_config_utils.py +542 -0
- streamlit/elements/lib/column_types.py +2188 -0
- streamlit/elements/lib/dialog.py +147 -0
- streamlit/elements/lib/dicttools.py +154 -0
- streamlit/elements/lib/event_utils.py +37 -0
- streamlit/elements/lib/file_uploader_utils.py +66 -0
- streamlit/elements/lib/form_utils.py +77 -0
- streamlit/elements/lib/image_utils.py +441 -0
- streamlit/elements/lib/js_number.py +105 -0
- streamlit/elements/lib/mutable_status_container.py +183 -0
- streamlit/elements/lib/options_selector_utils.py +250 -0
- streamlit/elements/lib/pandas_styler_utils.py +274 -0
- streamlit/elements/lib/policies.py +194 -0
- streamlit/elements/lib/streamlit_plotly_theme.py +207 -0
- streamlit/elements/lib/subtitle_utils.py +176 -0
- streamlit/elements/lib/utils.py +250 -0
- streamlit/elements/map.py +508 -0
- streamlit/elements/markdown.py +277 -0
- streamlit/elements/media.py +793 -0
- streamlit/elements/metric.py +301 -0
- streamlit/elements/plotly_chart.py +546 -0
- streamlit/elements/progress.py +156 -0
- streamlit/elements/pyplot.py +194 -0
- streamlit/elements/snow.py +47 -0
- streamlit/elements/spinner.py +113 -0
- streamlit/elements/text.py +76 -0
- streamlit/elements/toast.py +98 -0
- streamlit/elements/vega_charts.py +1984 -0
- streamlit/elements/widgets/__init__.py +13 -0
- streamlit/elements/widgets/audio_input.py +310 -0
- streamlit/elements/widgets/button.py +1123 -0
- streamlit/elements/widgets/button_group.py +1008 -0
- streamlit/elements/widgets/camera_input.py +263 -0
- streamlit/elements/widgets/chat.py +647 -0
- streamlit/elements/widgets/checkbox.py +352 -0
- streamlit/elements/widgets/color_picker.py +265 -0
- streamlit/elements/widgets/data_editor.py +983 -0
- streamlit/elements/widgets/file_uploader.py +486 -0
- streamlit/elements/widgets/multiselect.py +338 -0
- streamlit/elements/widgets/number_input.py +545 -0
- streamlit/elements/widgets/radio.py +407 -0
- streamlit/elements/widgets/select_slider.py +437 -0
- streamlit/elements/widgets/selectbox.py +366 -0
- streamlit/elements/widgets/slider.py +880 -0
- streamlit/elements/widgets/text_widgets.py +628 -0
- streamlit/elements/widgets/time_widgets.py +970 -0
- streamlit/elements/write.py +574 -0
- streamlit/emojis.py +34 -0
- streamlit/env_util.py +61 -0
- streamlit/error_util.py +105 -0
- streamlit/errors.py +452 -0
- streamlit/external/__init__.py +13 -0
- streamlit/external/langchain/__init__.py +23 -0
- streamlit/external/langchain/streamlit_callback_handler.py +406 -0
- streamlit/file_util.py +247 -0
- streamlit/git_util.py +173 -0
- streamlit/hello/__init__.py +13 -0
- streamlit/hello/animation_demo.py +82 -0
- streamlit/hello/dataframe_demo.py +71 -0
- streamlit/hello/hello.py +37 -0
- streamlit/hello/mapping_demo.py +114 -0
- streamlit/hello/plotting_demo.py +55 -0
- streamlit/hello/streamlit_app.py +55 -0
- streamlit/hello/utils.py +28 -0
- streamlit/logger.py +130 -0
- streamlit/material_icon_names.py +25 -0
- streamlit/navigation/__init__.py +13 -0
- streamlit/navigation/page.py +302 -0
- streamlit/net_util.py +125 -0
- streamlit/platform.py +33 -0
- streamlit/proto/Alert_pb2.py +29 -0
- streamlit/proto/Alert_pb2.pyi +90 -0
- streamlit/proto/AppPage_pb2.py +27 -0
- streamlit/proto/AppPage_pb2.pyi +64 -0
- streamlit/proto/ArrowNamedDataSet_pb2.py +28 -0
- streamlit/proto/ArrowNamedDataSet_pb2.pyi +57 -0
- streamlit/proto/ArrowVegaLiteChart_pb2.py +29 -0
- streamlit/proto/ArrowVegaLiteChart_pb2.pyi +84 -0
- streamlit/proto/Arrow_pb2.py +33 -0
- streamlit/proto/Arrow_pb2.pyi +188 -0
- streamlit/proto/AudioInput_pb2.py +28 -0
- streamlit/proto/AudioInput_pb2.pyi +58 -0
- streamlit/proto/Audio_pb2.py +27 -0
- streamlit/proto/Audio_pb2.pyi +58 -0
- streamlit/proto/AuthRedirect_pb2.py +27 -0
- streamlit/proto/AuthRedirect_pb2.pyi +41 -0
- streamlit/proto/AutoRerun_pb2.py +27 -0
- streamlit/proto/AutoRerun_pb2.pyi +45 -0
- streamlit/proto/BackMsg_pb2.py +29 -0
- streamlit/proto/BackMsg_pb2.pyi +105 -0
- streamlit/proto/Balloons_pb2.py +27 -0
- streamlit/proto/Balloons_pb2.pyi +43 -0
- streamlit/proto/Block_pb2.py +53 -0
- streamlit/proto/Block_pb2.pyi +322 -0
- streamlit/proto/BokehChart_pb2.py +27 -0
- streamlit/proto/BokehChart_pb2.pyi +49 -0
- streamlit/proto/ButtonGroup_pb2.py +36 -0
- streamlit/proto/ButtonGroup_pb2.pyi +169 -0
- streamlit/proto/Button_pb2.py +27 -0
- streamlit/proto/Button_pb2.pyi +71 -0
- streamlit/proto/CameraInput_pb2.py +28 -0
- streamlit/proto/CameraInput_pb2.pyi +58 -0
- streamlit/proto/ChatInput_pb2.py +31 -0
- streamlit/proto/ChatInput_pb2.pyi +111 -0
- streamlit/proto/Checkbox_pb2.py +30 -0
- streamlit/proto/Checkbox_pb2.pyi +90 -0
- streamlit/proto/ClientState_pb2.py +30 -0
- streamlit/proto/ClientState_pb2.pyi +90 -0
- streamlit/proto/Code_pb2.py +27 -0
- streamlit/proto/Code_pb2.pyi +55 -0
- streamlit/proto/ColorPicker_pb2.py +28 -0
- streamlit/proto/ColorPicker_pb2.pyi +67 -0
- streamlit/proto/Common_pb2.py +51 -0
- streamlit/proto/Common_pb2.pyi +293 -0
- streamlit/proto/Components_pb2.py +35 -0
- streamlit/proto/Components_pb2.pyi +172 -0
- streamlit/proto/DataFrame_pb2.py +56 -0
- streamlit/proto/DataFrame_pb2.pyi +397 -0
- streamlit/proto/DateInput_pb2.py +28 -0
- streamlit/proto/DateInput_pb2.pyi +83 -0
- streamlit/proto/DeckGlJsonChart_pb2.py +29 -0
- streamlit/proto/DeckGlJsonChart_pb2.pyi +102 -0
- streamlit/proto/Delta_pb2.py +31 -0
- streamlit/proto/Delta_pb2.pyi +74 -0
- streamlit/proto/DocString_pb2.py +29 -0
- streamlit/proto/DocString_pb2.pyi +93 -0
- streamlit/proto/DownloadButton_pb2.py +27 -0
- streamlit/proto/DownloadButton_pb2.pyi +70 -0
- streamlit/proto/Element_pb2.py +78 -0
- streamlit/proto/Element_pb2.pyi +312 -0
- streamlit/proto/Empty_pb2.py +27 -0
- streamlit/proto/Empty_pb2.pyi +36 -0
- streamlit/proto/Exception_pb2.py +27 -0
- streamlit/proto/Exception_pb2.pyi +72 -0
- streamlit/proto/Favicon_pb2.py +27 -0
- streamlit/proto/Favicon_pb2.pyi +40 -0
- streamlit/proto/FileUploader_pb2.py +28 -0
- streamlit/proto/FileUploader_pb2.pyi +78 -0
- streamlit/proto/ForwardMsg_pb2.py +53 -0
- streamlit/proto/ForwardMsg_pb2.pyi +293 -0
- streamlit/proto/GitInfo_pb2.py +29 -0
- streamlit/proto/GitInfo_pb2.pyi +83 -0
- streamlit/proto/GraphVizChart_pb2.py +27 -0
- streamlit/proto/GraphVizChart_pb2.pyi +53 -0
- streamlit/proto/Heading_pb2.py +27 -0
- streamlit/proto/Heading_pb2.pyi +56 -0
- streamlit/proto/Html_pb2.py +27 -0
- streamlit/proto/Html_pb2.pyi +42 -0
- streamlit/proto/IFrame_pb2.py +27 -0
- streamlit/proto/IFrame_pb2.pyi +59 -0
- streamlit/proto/Image_pb2.py +29 -0
- streamlit/proto/Image_pb2.pyi +84 -0
- streamlit/proto/Json_pb2.py +27 -0
- streamlit/proto/Json_pb2.pyi +53 -0
- streamlit/proto/LabelVisibilityMessage_pb2.py +29 -0
- streamlit/proto/LabelVisibilityMessage_pb2.pyi +68 -0
- streamlit/proto/LinkButton_pb2.py +27 -0
- streamlit/proto/LinkButton_pb2.pyi +58 -0
- streamlit/proto/Logo_pb2.py +27 -0
- streamlit/proto/Logo_pb2.pyi +51 -0
- streamlit/proto/Markdown_pb2.py +29 -0
- streamlit/proto/Markdown_pb2.pyi +86 -0
- streamlit/proto/Metric_pb2.py +32 -0
- streamlit/proto/Metric_pb2.pyi +101 -0
- streamlit/proto/MetricsEvent_pb2.py +30 -0
- streamlit/proto/MetricsEvent_pb2.pyi +200 -0
- streamlit/proto/MultiSelect_pb2.py +28 -0
- streamlit/proto/MultiSelect_pb2.pyi +81 -0
- streamlit/proto/NamedDataSet_pb2.py +28 -0
- streamlit/proto/NamedDataSet_pb2.pyi +59 -0
- streamlit/proto/Navigation_pb2.py +30 -0
- streamlit/proto/Navigation_pb2.pyi +84 -0
- streamlit/proto/NewSession_pb2.py +51 -0
- streamlit/proto/NewSession_pb2.pyi +481 -0
- streamlit/proto/NumberInput_pb2.py +30 -0
- streamlit/proto/NumberInput_pb2.pyi +121 -0
- streamlit/proto/PageConfig_pb2.py +33 -0
- streamlit/proto/PageConfig_pb2.pyi +126 -0
- streamlit/proto/PageInfo_pb2.py +27 -0
- streamlit/proto/PageInfo_pb2.pyi +43 -0
- streamlit/proto/PageLink_pb2.py +27 -0
- streamlit/proto/PageLink_pb2.pyi +63 -0
- streamlit/proto/PageNotFound_pb2.py +27 -0
- streamlit/proto/PageNotFound_pb2.pyi +42 -0
- streamlit/proto/PageProfile_pb2.py +31 -0
- streamlit/proto/PageProfile_pb2.pyi +127 -0
- streamlit/proto/PagesChanged_pb2.py +28 -0
- streamlit/proto/PagesChanged_pb2.pyi +48 -0
- streamlit/proto/ParentMessage_pb2.py +27 -0
- streamlit/proto/ParentMessage_pb2.pyi +46 -0
- streamlit/proto/PlotlyChart_pb2.py +31 -0
- streamlit/proto/PlotlyChart_pb2.pyi +131 -0
- streamlit/proto/Progress_pb2.py +27 -0
- streamlit/proto/Progress_pb2.pyi +43 -0
- streamlit/proto/Radio_pb2.py +28 -0
- streamlit/proto/Radio_pb2.pyi +84 -0
- streamlit/proto/RootContainer_pb2.py +27 -0
- streamlit/proto/RootContainer_pb2.pyi +56 -0
- streamlit/proto/Selectbox_pb2.py +28 -0
- streamlit/proto/Selectbox_pb2.pyi +80 -0
- streamlit/proto/SessionEvent_pb2.py +28 -0
- streamlit/proto/SessionEvent_pb2.pyi +62 -0
- streamlit/proto/SessionStatus_pb2.py +27 -0
- streamlit/proto/SessionStatus_pb2.pyi +57 -0
- streamlit/proto/Skeleton_pb2.py +29 -0
- streamlit/proto/Skeleton_pb2.pyi +71 -0
- streamlit/proto/Slider_pb2.py +32 -0
- streamlit/proto/Slider_pb2.pyi +142 -0
- streamlit/proto/Snow_pb2.py +27 -0
- streamlit/proto/Snow_pb2.pyi +43 -0
- streamlit/proto/Spinner_pb2.py +27 -0
- streamlit/proto/Spinner_pb2.pyi +49 -0
- streamlit/proto/TextArea_pb2.py +28 -0
- streamlit/proto/TextArea_pb2.pyi +80 -0
- streamlit/proto/TextInput_pb2.py +30 -0
- streamlit/proto/TextInput_pb2.pyi +107 -0
- streamlit/proto/Text_pb2.py +27 -0
- streamlit/proto/Text_pb2.pyi +46 -0
- streamlit/proto/TimeInput_pb2.py +28 -0
- streamlit/proto/TimeInput_pb2.pyi +74 -0
- streamlit/proto/Toast_pb2.py +27 -0
- streamlit/proto/Toast_pb2.pyi +45 -0
- streamlit/proto/VegaLiteChart_pb2.py +29 -0
- streamlit/proto/VegaLiteChart_pb2.pyi +71 -0
- streamlit/proto/Video_pb2.py +31 -0
- streamlit/proto/Video_pb2.pyi +117 -0
- streamlit/proto/WidgetStates_pb2.py +31 -0
- streamlit/proto/WidgetStates_pb2.pyi +126 -0
- streamlit/proto/__init__.py +15 -0
- streamlit/proto/openmetrics_data_model_pb2.py +60 -0
- streamlit/proto/openmetrics_data_model_pb2.pyi +522 -0
- streamlit/py.typed +0 -0
- streamlit/runtime/__init__.py +50 -0
- streamlit/runtime/app_session.py +982 -0
- streamlit/runtime/caching/__init__.py +98 -0
- streamlit/runtime/caching/cache_data_api.py +665 -0
- streamlit/runtime/caching/cache_errors.py +142 -0
- streamlit/runtime/caching/cache_resource_api.py +527 -0
- streamlit/runtime/caching/cache_type.py +33 -0
- streamlit/runtime/caching/cache_utils.py +523 -0
- streamlit/runtime/caching/cached_message_replay.py +290 -0
- streamlit/runtime/caching/hashing.py +637 -0
- streamlit/runtime/caching/legacy_cache_api.py +169 -0
- streamlit/runtime/caching/storage/__init__.py +29 -0
- streamlit/runtime/caching/storage/cache_storage_protocol.py +239 -0
- streamlit/runtime/caching/storage/dummy_cache_storage.py +60 -0
- streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +145 -0
- streamlit/runtime/caching/storage/local_disk_cache_storage.py +223 -0
- streamlit/runtime/connection_factory.py +436 -0
- streamlit/runtime/context.py +280 -0
- streamlit/runtime/credentials.py +364 -0
- streamlit/runtime/forward_msg_cache.py +296 -0
- streamlit/runtime/forward_msg_queue.py +240 -0
- streamlit/runtime/fragment.py +477 -0
- streamlit/runtime/media_file_manager.py +234 -0
- streamlit/runtime/media_file_storage.py +143 -0
- streamlit/runtime/memory_media_file_storage.py +181 -0
- streamlit/runtime/memory_session_storage.py +77 -0
- streamlit/runtime/memory_uploaded_file_manager.py +138 -0
- streamlit/runtime/metrics_util.py +486 -0
- streamlit/runtime/pages_manager.py +165 -0
- streamlit/runtime/runtime.py +792 -0
- streamlit/runtime/runtime_util.py +106 -0
- streamlit/runtime/script_data.py +46 -0
- streamlit/runtime/scriptrunner/__init__.py +38 -0
- streamlit/runtime/scriptrunner/exec_code.py +159 -0
- streamlit/runtime/scriptrunner/magic.py +273 -0
- streamlit/runtime/scriptrunner/magic_funcs.py +32 -0
- streamlit/runtime/scriptrunner/script_cache.py +89 -0
- streamlit/runtime/scriptrunner/script_runner.py +756 -0
- streamlit/runtime/scriptrunner_utils/__init__.py +19 -0
- streamlit/runtime/scriptrunner_utils/exceptions.py +48 -0
- streamlit/runtime/scriptrunner_utils/script_requests.py +307 -0
- streamlit/runtime/scriptrunner_utils/script_run_context.py +287 -0
- streamlit/runtime/secrets.py +534 -0
- streamlit/runtime/session_manager.py +394 -0
- streamlit/runtime/state/__init__.py +41 -0
- streamlit/runtime/state/common.py +191 -0
- streamlit/runtime/state/query_params.py +205 -0
- streamlit/runtime/state/query_params_proxy.py +218 -0
- streamlit/runtime/state/safe_session_state.py +138 -0
- streamlit/runtime/state/session_state.py +772 -0
- streamlit/runtime/state/session_state_proxy.py +153 -0
- streamlit/runtime/state/widgets.py +135 -0
- streamlit/runtime/stats.py +109 -0
- streamlit/runtime/uploaded_file_manager.py +148 -0
- streamlit/runtime/websocket_session_manager.py +167 -0
- streamlit/source_util.py +98 -0
- streamlit/static/favicon.png +0 -0
- streamlit/static/index.html +61 -0
- streamlit/static/static/css/index.Bmkmz40k.css +1 -0
- streamlit/static/static/css/index.DpJG_94W.css +1 -0
- streamlit/static/static/css/index.DzuxGC_t.css +1 -0
- streamlit/static/static/js/FileDownload.esm.Bp9m5jrx.js +1 -0
- streamlit/static/static/js/FileHelper.D_3pbilj.js +5 -0
- streamlit/static/static/js/FormClearHelper.Ct2rwLXo.js +1 -0
- streamlit/static/static/js/Hooks.BKdzj5MJ.js +1 -0
- streamlit/static/static/js/InputInstructions.DB3QGNJP.js +1 -0
- streamlit/static/static/js/ProgressBar.D40A5xc2.js +2 -0
- streamlit/static/static/js/RenderInPortalIfExists.DLUCooTN.js +1 -0
- streamlit/static/static/js/Toolbar.BiGGIQun.js +1 -0
- streamlit/static/static/js/UploadFileInfo.C-jY39rj.js +1 -0
- streamlit/static/static/js/base-input.CQBQT24M.js +4 -0
- streamlit/static/static/js/checkbox.Buj8gd_M.js +9 -0
- streamlit/static/static/js/createDownloadLinkElement.DZMwyjvU.js +1 -0
- streamlit/static/static/js/createSuper.CesK3I23.js +1 -0
- streamlit/static/static/js/data-grid-overlay-editor.B69OOFM4.js +1 -0
- streamlit/static/static/js/downloader.BZQhlBNT.js +1 -0
- streamlit/static/static/js/es6.D9Zhqujy.js +2 -0
- streamlit/static/static/js/iframeResizer.contentWindow.CAzcBpCC.js +1 -0
- streamlit/static/static/js/index.08vcOOvb.js +1 -0
- streamlit/static/static/js/index.0uqKfJUS.js +1 -0
- streamlit/static/static/js/index.B02M5u69.js +203 -0
- streamlit/static/static/js/index.B7mcZKMx.js +1 -0
- streamlit/static/static/js/index.BAQDHFA_.js +1 -0
- streamlit/static/static/js/index.BI60cMVr.js +2 -0
- streamlit/static/static/js/index.BLug2inK.js +1 -0
- streamlit/static/static/js/index.BM6TMY8g.js +2 -0
- streamlit/static/static/js/index.BZ9p1t7G.js +1 -0
- streamlit/static/static/js/index.BZqa87a1.js +2 -0
- streamlit/static/static/js/index.BcsRUzZZ.js +1 -0
- streamlit/static/static/js/index.BgVMiY_P.js +197 -0
- streamlit/static/static/js/index.BtuGy7By.js +6 -0
- streamlit/static/static/js/index.BuDuBmrs.js +1 -0
- streamlit/static/static/js/index.BvXU2oKV.js +1 -0
- streamlit/static/static/js/index.BxcwPacT.js +73 -0
- streamlit/static/static/js/index.CWX8KB81.js +1 -0
- streamlit/static/static/js/index.CXzZTo_q.js +1 -0
- streamlit/static/static/js/index.CcRWp_KL.js +1 -0
- streamlit/static/static/js/index.Cd-_xe55.js +3 -0
- streamlit/static/static/js/index.CdG2PXln.js +4537 -0
- streamlit/static/static/js/index.CjXvXmcP.js +1 -0
- streamlit/static/static/js/index.D1HZENZx.js +776 -0
- streamlit/static/static/js/index.D21Efo64.js +1617 -0
- streamlit/static/static/js/index.D9WgGVBx.js +7 -0
- streamlit/static/static/js/index.DEcsHtvb.js +12 -0
- streamlit/static/static/js/index.DFeMfr_K.js +1 -0
- streamlit/static/static/js/index.DHFBoItz.js +1 -0
- streamlit/static/static/js/index.D_PrBKnJ.js +3 -0
- streamlit/static/static/js/index.DmuRkekN.js +3855 -0
- streamlit/static/static/js/index.Do6eY8sf.js +1 -0
- streamlit/static/static/js/index.Dz3lP2P-.js +1 -0
- streamlit/static/static/js/index.Dz_UqF-s.js +1 -0
- streamlit/static/static/js/index.GkSUsPhJ.js +1 -0
- streamlit/static/static/js/index.H1U1IC_d.js +3 -0
- streamlit/static/static/js/index.g6p_4DPr.js +1 -0
- streamlit/static/static/js/index.g9x_GKss.js +1 -0
- streamlit/static/static/js/index.zo9jm08y.js +1 -0
- streamlit/static/static/js/input.DnaFglHq.js +2 -0
- streamlit/static/static/js/inputUtils.CQWz5UKz.js +1 -0
- streamlit/static/static/js/memory.Crb9x4-F.js +1 -0
- streamlit/static/static/js/mergeWith.ouAz0sK3.js +1 -0
- streamlit/static/static/js/number-overlay-editor._UaN-O48.js +9 -0
- streamlit/static/static/js/possibleConstructorReturn.CtGjGFHz.js +1 -0
- streamlit/static/static/js/sandbox.CBybYOhV.js +1 -0
- streamlit/static/static/js/sprintf.D7DtBTRn.js +1 -0
- streamlit/static/static/js/textarea.Cb_uJt5U.js +2 -0
- streamlit/static/static/js/threshold.DjX0wlsa.js +1 -0
- streamlit/static/static/js/timepicker.DKT7pfoF.js +4 -0
- streamlit/static/static/js/timer.CAwTRJ_g.js +1 -0
- streamlit/static/static/js/toConsumableArray.05Ikp13-.js +3 -0
- streamlit/static/static/js/uniqueId.D2FMWUEI.js +1 -0
- streamlit/static/static/js/useBasicWidgetState.urnZLANY.js +1 -0
- streamlit/static/static/js/useOnInputChange.BOKIIdJ1.js +1 -0
- streamlit/static/static/js/value.CgPGBV_l.js +1 -0
- streamlit/static/static/js/withFullScreenWrapper.C_N8J0Xx.js +1 -0
- streamlit/static/static/media/KaTeX_AMS-Regular.BQhdFMY1.woff2 +0 -0
- streamlit/static/static/media/KaTeX_AMS-Regular.DMm9YOAa.woff +0 -0
- streamlit/static/static/media/KaTeX_AMS-Regular.DRggAlZN.ttf +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Bold.ATXxdsX0.ttf +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Bold.BEiXGLvX.woff +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Bold.Dq_IR9rO.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Regular.CTRA-rTL.woff +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Regular.Di6jR-x-.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Regular.wX97UBjC.ttf +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Bold.BdnERNNW.ttf +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Bold.BsDP51OF.woff +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Bold.CL6g_b3V.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Regular.CB_wures.ttf +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Regular.CTYiF6lA.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Regular.Dxdc4cR9.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Bold.Cx986IdX.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-Bold.Jm3AIy58.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Bold.waoOVXN0.ttf +0 -0
- streamlit/static/static/media/KaTeX_Main-BoldItalic.DxDJ3AOS.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-BoldItalic.DzxPMmG6.ttf +0 -0
- streamlit/static/static/media/KaTeX_Main-BoldItalic.SpSLRI95.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Italic.3WenGoN9.ttf +0 -0
- streamlit/static/static/media/KaTeX_Main-Italic.BMLOBm91.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Italic.NWA7e6Wa.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-Regular.B22Nviop.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-Regular.Dr94JaBh.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Regular.ypZvNtVU.ttf +0 -0
- streamlit/static/static/media/KaTeX_Math-BoldItalic.B3XSjfu4.ttf +0 -0
- streamlit/static/static/media/KaTeX_Math-BoldItalic.CZnvNsCZ.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Math-BoldItalic.iY-2wyZ7.woff +0 -0
- streamlit/static/static/media/KaTeX_Math-Italic.DA0__PXp.woff +0 -0
- streamlit/static/static/media/KaTeX_Math-Italic.flOr_0UB.ttf +0 -0
- streamlit/static/static/media/KaTeX_Math-Italic.t53AETM-.woff2 +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Bold.CFMepnvq.ttf +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Bold.D1sUS0GD.woff2 +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Bold.DbIhKOiC.woff +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Italic.C3H0VqGB.woff2 +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Italic.DN2j7dab.woff +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Italic.YYjJ1zSn.ttf +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Regular.BNo7hRIc.ttf +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Regular.CS6fqUqJ.woff +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Regular.DDBCnlJ7.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Script-Regular.C5JkGWo-.ttf +0 -0
- streamlit/static/static/media/KaTeX_Script-Regular.D3wIWfF6.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Script-Regular.D5yQViql.woff +0 -0
- streamlit/static/static/media/KaTeX_Size1-Regular.C195tn64.woff +0 -0
- streamlit/static/static/media/KaTeX_Size1-Regular.Dbsnue_I.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size1-Regular.mCD8mA8B.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Size2-Regular.B7gKUWhC.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size2-Regular.Dy4dx90m.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Size2-Regular.oD1tc_U0.woff +0 -0
- streamlit/static/static/media/KaTeX_Size3-Regular.CTq5MqoE.woff +0 -0
- streamlit/static/static/media/KaTeX_Size3-Regular.DgpXs0kz.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size4-Regular.BF-4gkZK.woff +0 -0
- streamlit/static/static/media/KaTeX_Size4-Regular.DWFBv043.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size4-Regular.Dl5lxZxV.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Typewriter-Regular.C0xS9mPB.woff +0 -0
- streamlit/static/static/media/KaTeX_Typewriter-Regular.CO6r4hn1.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Typewriter-Regular.D3Ib7_Hf.ttf +0 -0
- streamlit/static/static/media/MaterialSymbols-Rounded.DcZbplWk.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Bold.CFEfr7-q.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-BoldItalic.C-LkFXxa.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Italic.CxFOx7N-.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Regular.CBOlD63d.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-SemiBold.CFHwW3Wd.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-SemiBoldItalic.Cg2yRu82.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Bold.-6c9oR8J.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-BoldItalic.DmM_grLY.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Italic.I1ipWe7Q.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Regular.DZLUzqI4.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-SemiBold.sKQIyTMz.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-SemiBoldItalic.C0wP0icr.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Bold.8TUnKj4x.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-BoldItalic.CBVO7Ve7.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Italic.DkFgL2HZ.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Regular.CNJNET2S.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-SemiBold.CHyh9GC5.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-SemiBoldItalic.CBtz8sWN.woff2 +0 -0
- streamlit/static/static/media/balloon-0.Czj7AKwE.png +0 -0
- streamlit/static/static/media/balloon-1.CNvFFrND.png +0 -0
- streamlit/static/static/media/balloon-2.DTvC6B1t.png +0 -0
- streamlit/static/static/media/balloon-3.CgSk4tbL.png +0 -0
- streamlit/static/static/media/balloon-4.mbtFrzxf.png +0 -0
- streamlit/static/static/media/balloon-5.CSwkUfRA.png +0 -0
- streamlit/static/static/media/fireworks.B4d-_KUe.gif +0 -0
- streamlit/static/static/media/flake-0.DgWaVvm5.png +0 -0
- streamlit/static/static/media/flake-1.B2r5AHMK.png +0 -0
- streamlit/static/static/media/flake-2.BnWSExPC.png +0 -0
- streamlit/static/static/media/snowflake.JU2jBHL8.svg +11 -0
- streamlit/string_util.py +203 -0
- streamlit/temporary_directory.py +56 -0
- streamlit/testing/__init__.py +13 -0
- streamlit/testing/v1/__init__.py +17 -0
- streamlit/testing/v1/app_test.py +1050 -0
- streamlit/testing/v1/element_tree.py +2083 -0
- streamlit/testing/v1/local_script_runner.py +180 -0
- streamlit/testing/v1/util.py +53 -0
- streamlit/time_util.py +75 -0
- streamlit/type_util.py +460 -0
- streamlit/url_util.py +122 -0
- streamlit/user_info.py +519 -0
- streamlit/util.py +72 -0
- streamlit/vendor/__init__.py +0 -0
- streamlit/vendor/pympler/__init__.py +0 -0
- streamlit/vendor/pympler/asizeof.py +2869 -0
- streamlit/version.py +18 -0
- streamlit/watcher/__init__.py +28 -0
- streamlit/watcher/event_based_path_watcher.py +406 -0
- streamlit/watcher/folder_black_list.py +82 -0
- streamlit/watcher/local_sources_watcher.py +233 -0
- streamlit/watcher/path_watcher.py +185 -0
- streamlit/watcher/polling_path_watcher.py +124 -0
- streamlit/watcher/util.py +207 -0
- streamlit/web/__init__.py +13 -0
- streamlit/web/bootstrap.py +353 -0
- streamlit/web/cache_storage_manager_config.py +38 -0
- streamlit/web/cli.py +369 -0
- streamlit/web/server/__init__.py +26 -0
- streamlit/web/server/app_static_file_handler.py +93 -0
- streamlit/web/server/authlib_tornado_integration.py +60 -0
- streamlit/web/server/browser_websocket_handler.py +246 -0
- streamlit/web/server/component_request_handler.py +116 -0
- streamlit/web/server/media_file_handler.py +141 -0
- streamlit/web/server/oauth_authlib_routes.py +176 -0
- streamlit/web/server/oidc_mixin.py +108 -0
- streamlit/web/server/routes.py +295 -0
- streamlit/web/server/server.py +479 -0
- streamlit/web/server/server_util.py +161 -0
- streamlit/web/server/stats_request_handler.py +95 -0
- streamlit/web/server/upload_file_request_handler.py +137 -0
- streamlit/web/server/websocket_headers.py +56 -0
- streamlit_nightly-1.43.2.dev20250307.data/scripts/streamlit.cmd +16 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/METADATA +207 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/RECORD +563 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/WHEEL +5 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/entry_points.txt +2 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/top_level.txt +1 -0
@@ -0,0 +1,542 @@
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import copy
|
18
|
+
import json
|
19
|
+
from collections.abc import Mapping
|
20
|
+
from enum import Enum
|
21
|
+
from typing import TYPE_CHECKING, Final, Literal, Union
|
22
|
+
|
23
|
+
from typing_extensions import TypeAlias
|
24
|
+
|
25
|
+
from streamlit.dataframe_util import DataFormat
|
26
|
+
from streamlit.elements.lib.column_types import ColumnConfig, ColumnType
|
27
|
+
from streamlit.elements.lib.dicttools import remove_none_values
|
28
|
+
from streamlit.errors import StreamlitAPIException
|
29
|
+
|
30
|
+
if TYPE_CHECKING:
|
31
|
+
import pyarrow as pa
|
32
|
+
from pandas import DataFrame, Index, Series
|
33
|
+
|
34
|
+
from streamlit.proto.Arrow_pb2 import Arrow as ArrowProto
|
35
|
+
|
36
|
+
|
37
|
+
# The index identifier can be used to apply configuration options
|
38
|
+
IndexIdentifierType = Literal["_index"]
|
39
|
+
INDEX_IDENTIFIER: IndexIdentifierType = "_index"
|
40
|
+
|
41
|
+
# This is used as prefix for columns that are configured via the numerical position.
|
42
|
+
# The integer value is converted into a string key with this prefix.
|
43
|
+
# This needs to match with the prefix configured in the frontend.
|
44
|
+
_NUMERICAL_POSITION_PREFIX = "_pos:"
|
45
|
+
|
46
|
+
|
47
|
+
# The column data kind is used to describe the type of the data within the column.
|
48
|
+
class ColumnDataKind(str, Enum):
|
49
|
+
INTEGER = "integer"
|
50
|
+
FLOAT = "float"
|
51
|
+
DATE = "date"
|
52
|
+
TIME = "time"
|
53
|
+
DATETIME = "datetime"
|
54
|
+
BOOLEAN = "boolean"
|
55
|
+
STRING = "string"
|
56
|
+
TIMEDELTA = "timedelta"
|
57
|
+
PERIOD = "period"
|
58
|
+
INTERVAL = "interval"
|
59
|
+
BYTES = "bytes"
|
60
|
+
DECIMAL = "decimal"
|
61
|
+
COMPLEX = "complex"
|
62
|
+
LIST = "list"
|
63
|
+
DICT = "dict"
|
64
|
+
EMPTY = "empty"
|
65
|
+
UNKNOWN = "unknown"
|
66
|
+
|
67
|
+
|
68
|
+
# The dataframe schema is a mapping from the name of the column
|
69
|
+
# in the underlying dataframe to the column data kind.
|
70
|
+
# The index column uses `_index` as name.
|
71
|
+
DataframeSchema: TypeAlias = dict[str, ColumnDataKind]
|
72
|
+
|
73
|
+
# This mapping contains all editable column types mapped to the data kinds
|
74
|
+
# that the column type is compatible for editing.
|
75
|
+
_EDITING_COMPATIBILITY_MAPPING: Final[dict[ColumnType, list[ColumnDataKind]]] = {
|
76
|
+
"text": [ColumnDataKind.STRING, ColumnDataKind.EMPTY],
|
77
|
+
"number": [
|
78
|
+
ColumnDataKind.INTEGER,
|
79
|
+
ColumnDataKind.FLOAT,
|
80
|
+
ColumnDataKind.DECIMAL,
|
81
|
+
ColumnDataKind.STRING,
|
82
|
+
ColumnDataKind.TIMEDELTA,
|
83
|
+
ColumnDataKind.EMPTY,
|
84
|
+
],
|
85
|
+
"checkbox": [
|
86
|
+
ColumnDataKind.BOOLEAN,
|
87
|
+
ColumnDataKind.STRING,
|
88
|
+
ColumnDataKind.INTEGER,
|
89
|
+
ColumnDataKind.EMPTY,
|
90
|
+
],
|
91
|
+
"selectbox": [
|
92
|
+
ColumnDataKind.STRING,
|
93
|
+
ColumnDataKind.BOOLEAN,
|
94
|
+
ColumnDataKind.INTEGER,
|
95
|
+
ColumnDataKind.FLOAT,
|
96
|
+
ColumnDataKind.EMPTY,
|
97
|
+
],
|
98
|
+
"date": [ColumnDataKind.DATE, ColumnDataKind.DATETIME, ColumnDataKind.EMPTY],
|
99
|
+
"time": [ColumnDataKind.TIME, ColumnDataKind.DATETIME, ColumnDataKind.EMPTY],
|
100
|
+
"datetime": [
|
101
|
+
ColumnDataKind.DATETIME,
|
102
|
+
ColumnDataKind.DATE,
|
103
|
+
ColumnDataKind.TIME,
|
104
|
+
ColumnDataKind.EMPTY,
|
105
|
+
],
|
106
|
+
"link": [ColumnDataKind.STRING, ColumnDataKind.EMPTY],
|
107
|
+
}
|
108
|
+
|
109
|
+
|
110
|
+
def is_type_compatible(column_type: ColumnType, data_kind: ColumnDataKind) -> bool:
|
111
|
+
"""Check if the column type is compatible with the underlying data kind.
|
112
|
+
|
113
|
+
This check only applies to editable column types (e.g. number or text).
|
114
|
+
Non-editable column types (e.g. bar_chart or image) can be configured for
|
115
|
+
all data kinds (this might change in the future).
|
116
|
+
|
117
|
+
Parameters
|
118
|
+
----------
|
119
|
+
column_type : ColumnType
|
120
|
+
The column type to check.
|
121
|
+
|
122
|
+
data_kind : ColumnDataKind
|
123
|
+
The data kind to check.
|
124
|
+
|
125
|
+
Returns
|
126
|
+
-------
|
127
|
+
bool
|
128
|
+
True if the column type is compatible with the data kind, False otherwise.
|
129
|
+
"""
|
130
|
+
|
131
|
+
if column_type not in _EDITING_COMPATIBILITY_MAPPING:
|
132
|
+
return True
|
133
|
+
|
134
|
+
return data_kind in _EDITING_COMPATIBILITY_MAPPING[column_type]
|
135
|
+
|
136
|
+
|
137
|
+
def _determine_data_kind_via_arrow(field: pa.Field) -> ColumnDataKind:
|
138
|
+
"""Determine the data kind via the arrow type information.
|
139
|
+
|
140
|
+
The column data kind refers to the shared data type of the values
|
141
|
+
in the column (e.g. int, float, str, bool).
|
142
|
+
|
143
|
+
Parameters
|
144
|
+
----------
|
145
|
+
|
146
|
+
field : pa.Field
|
147
|
+
The arrow field from the arrow table schema.
|
148
|
+
|
149
|
+
Returns
|
150
|
+
-------
|
151
|
+
ColumnDataKind
|
152
|
+
The data kind of the field.
|
153
|
+
"""
|
154
|
+
import pyarrow as pa
|
155
|
+
|
156
|
+
field_type = field.type
|
157
|
+
if pa.types.is_integer(field_type):
|
158
|
+
return ColumnDataKind.INTEGER
|
159
|
+
|
160
|
+
if pa.types.is_floating(field_type):
|
161
|
+
return ColumnDataKind.FLOAT
|
162
|
+
|
163
|
+
if pa.types.is_boolean(field_type):
|
164
|
+
return ColumnDataKind.BOOLEAN
|
165
|
+
|
166
|
+
if pa.types.is_string(field_type):
|
167
|
+
return ColumnDataKind.STRING
|
168
|
+
|
169
|
+
if pa.types.is_date(field_type):
|
170
|
+
return ColumnDataKind.DATE
|
171
|
+
|
172
|
+
if pa.types.is_time(field_type):
|
173
|
+
return ColumnDataKind.TIME
|
174
|
+
|
175
|
+
if pa.types.is_timestamp(field_type):
|
176
|
+
return ColumnDataKind.DATETIME
|
177
|
+
|
178
|
+
if pa.types.is_duration(field_type):
|
179
|
+
return ColumnDataKind.TIMEDELTA
|
180
|
+
|
181
|
+
if pa.types.is_list(field_type):
|
182
|
+
return ColumnDataKind.LIST
|
183
|
+
|
184
|
+
if pa.types.is_decimal(field_type):
|
185
|
+
return ColumnDataKind.DECIMAL
|
186
|
+
|
187
|
+
if pa.types.is_null(field_type):
|
188
|
+
return ColumnDataKind.EMPTY
|
189
|
+
|
190
|
+
# Interval does not seem to work correctly:
|
191
|
+
# if pa.types.is_interval(field_type):
|
192
|
+
# return ColumnDataKind.INTERVAL
|
193
|
+
|
194
|
+
if pa.types.is_binary(field_type):
|
195
|
+
return ColumnDataKind.BYTES
|
196
|
+
|
197
|
+
if pa.types.is_struct(field_type):
|
198
|
+
return ColumnDataKind.DICT
|
199
|
+
|
200
|
+
return ColumnDataKind.UNKNOWN
|
201
|
+
|
202
|
+
|
203
|
+
def _determine_data_kind_via_pandas_dtype(
|
204
|
+
column: Series | Index,
|
205
|
+
) -> ColumnDataKind:
|
206
|
+
"""Determine the data kind by using the pandas dtype.
|
207
|
+
|
208
|
+
The column data kind refers to the shared data type of the values
|
209
|
+
in the column (e.g. int, float, str, bool).
|
210
|
+
|
211
|
+
Parameters
|
212
|
+
----------
|
213
|
+
column : pd.Series, pd.Index
|
214
|
+
The column for which the data kind should be determined.
|
215
|
+
|
216
|
+
Returns
|
217
|
+
-------
|
218
|
+
ColumnDataKind
|
219
|
+
The data kind of the column.
|
220
|
+
"""
|
221
|
+
import pandas as pd
|
222
|
+
|
223
|
+
column_dtype = column.dtype
|
224
|
+
if pd.api.types.is_bool_dtype(column_dtype):
|
225
|
+
return ColumnDataKind.BOOLEAN
|
226
|
+
|
227
|
+
if pd.api.types.is_integer_dtype(column_dtype):
|
228
|
+
return ColumnDataKind.INTEGER
|
229
|
+
|
230
|
+
if pd.api.types.is_float_dtype(column_dtype):
|
231
|
+
return ColumnDataKind.FLOAT
|
232
|
+
|
233
|
+
if pd.api.types.is_datetime64_any_dtype(column_dtype):
|
234
|
+
return ColumnDataKind.DATETIME
|
235
|
+
|
236
|
+
if pd.api.types.is_timedelta64_dtype(column_dtype):
|
237
|
+
return ColumnDataKind.TIMEDELTA
|
238
|
+
|
239
|
+
if isinstance(column_dtype, pd.PeriodDtype):
|
240
|
+
return ColumnDataKind.PERIOD
|
241
|
+
|
242
|
+
if isinstance(column_dtype, pd.IntervalDtype):
|
243
|
+
return ColumnDataKind.INTERVAL
|
244
|
+
|
245
|
+
if pd.api.types.is_complex_dtype(column_dtype):
|
246
|
+
return ColumnDataKind.COMPLEX
|
247
|
+
|
248
|
+
if pd.api.types.is_object_dtype(
|
249
|
+
column_dtype
|
250
|
+
) is False and pd.api.types.is_string_dtype(column_dtype):
|
251
|
+
# The is_string_dtype
|
252
|
+
return ColumnDataKind.STRING
|
253
|
+
|
254
|
+
return ColumnDataKind.UNKNOWN
|
255
|
+
|
256
|
+
|
257
|
+
def _determine_data_kind_via_inferred_type(
|
258
|
+
column: Series | Index,
|
259
|
+
) -> ColumnDataKind:
|
260
|
+
"""Determine the data kind by inferring it from the underlying data.
|
261
|
+
|
262
|
+
The column data kind refers to the shared data type of the values
|
263
|
+
in the column (e.g. int, float, str, bool).
|
264
|
+
|
265
|
+
Parameters
|
266
|
+
----------
|
267
|
+
column : pd.Series, pd.Index
|
268
|
+
The column to determine the data kind for.
|
269
|
+
|
270
|
+
Returns
|
271
|
+
-------
|
272
|
+
ColumnDataKind
|
273
|
+
The data kind of the column.
|
274
|
+
"""
|
275
|
+
from pandas.api.types import infer_dtype
|
276
|
+
|
277
|
+
inferred_type = infer_dtype(column)
|
278
|
+
|
279
|
+
if inferred_type == "string":
|
280
|
+
return ColumnDataKind.STRING
|
281
|
+
|
282
|
+
if inferred_type == "bytes":
|
283
|
+
return ColumnDataKind.BYTES
|
284
|
+
|
285
|
+
if inferred_type in ["floating", "mixed-integer-float"]:
|
286
|
+
return ColumnDataKind.FLOAT
|
287
|
+
|
288
|
+
if inferred_type == "integer":
|
289
|
+
return ColumnDataKind.INTEGER
|
290
|
+
|
291
|
+
if inferred_type == "decimal":
|
292
|
+
return ColumnDataKind.DECIMAL
|
293
|
+
|
294
|
+
if inferred_type == "complex":
|
295
|
+
return ColumnDataKind.COMPLEX
|
296
|
+
|
297
|
+
if inferred_type == "boolean":
|
298
|
+
return ColumnDataKind.BOOLEAN
|
299
|
+
|
300
|
+
if inferred_type in ["datetime64", "datetime"]:
|
301
|
+
return ColumnDataKind.DATETIME
|
302
|
+
|
303
|
+
if inferred_type == "date":
|
304
|
+
return ColumnDataKind.DATE
|
305
|
+
|
306
|
+
if inferred_type in ["timedelta64", "timedelta"]:
|
307
|
+
return ColumnDataKind.TIMEDELTA
|
308
|
+
|
309
|
+
if inferred_type == "time":
|
310
|
+
return ColumnDataKind.TIME
|
311
|
+
|
312
|
+
if inferred_type == "period":
|
313
|
+
return ColumnDataKind.PERIOD
|
314
|
+
|
315
|
+
if inferred_type == "interval":
|
316
|
+
return ColumnDataKind.INTERVAL
|
317
|
+
|
318
|
+
if inferred_type == "empty":
|
319
|
+
return ColumnDataKind.EMPTY
|
320
|
+
|
321
|
+
# Unused types: mixed, unknown-array, categorical, mixed-integer
|
322
|
+
|
323
|
+
return ColumnDataKind.UNKNOWN
|
324
|
+
|
325
|
+
|
326
|
+
def _determine_data_kind(
|
327
|
+
column: Series | Index, field: pa.Field | None = None
|
328
|
+
) -> ColumnDataKind:
|
329
|
+
"""Determine the data kind of a column.
|
330
|
+
|
331
|
+
The column data kind refers to the shared data type of the values
|
332
|
+
in the column (e.g. int, float, str, bool).
|
333
|
+
|
334
|
+
Parameters
|
335
|
+
----------
|
336
|
+
column : pd.Series, pd.Index
|
337
|
+
The column to determine the data kind for.
|
338
|
+
field : pa.Field, optional
|
339
|
+
The arrow field from the arrow table schema.
|
340
|
+
|
341
|
+
Returns
|
342
|
+
-------
|
343
|
+
ColumnDataKind
|
344
|
+
The data kind of the column.
|
345
|
+
"""
|
346
|
+
import pandas as pd
|
347
|
+
|
348
|
+
if isinstance(column.dtype, pd.CategoricalDtype):
|
349
|
+
# Categorical columns can have different underlying data kinds
|
350
|
+
# depending on the categories.
|
351
|
+
return _determine_data_kind_via_inferred_type(column.dtype.categories)
|
352
|
+
|
353
|
+
if field is not None:
|
354
|
+
data_kind = _determine_data_kind_via_arrow(field)
|
355
|
+
if data_kind != ColumnDataKind.UNKNOWN:
|
356
|
+
return data_kind
|
357
|
+
|
358
|
+
if column.dtype.name == "object":
|
359
|
+
# If dtype is object, we need to infer the type from the column
|
360
|
+
return _determine_data_kind_via_inferred_type(column)
|
361
|
+
return _determine_data_kind_via_pandas_dtype(column)
|
362
|
+
|
363
|
+
|
364
|
+
def determine_dataframe_schema(
|
365
|
+
data_df: DataFrame, arrow_schema: pa.Schema
|
366
|
+
) -> DataframeSchema:
|
367
|
+
"""Determine the schema of a dataframe.
|
368
|
+
|
369
|
+
Parameters
|
370
|
+
----------
|
371
|
+
data_df : pd.DataFrame
|
372
|
+
The dataframe to determine the schema of.
|
373
|
+
arrow_schema : pa.Schema
|
374
|
+
The Arrow schema of the dataframe.
|
375
|
+
|
376
|
+
Returns
|
377
|
+
-------
|
378
|
+
|
379
|
+
DataframeSchema
|
380
|
+
A mapping that contains the detected data type for the index and columns.
|
381
|
+
The key is the column name in the underlying dataframe or ``_index`` for index columns.
|
382
|
+
"""
|
383
|
+
|
384
|
+
dataframe_schema: DataframeSchema = {}
|
385
|
+
|
386
|
+
# Add type of index:
|
387
|
+
# TODO(lukasmasuch): We need to apply changes here to support multiindex.
|
388
|
+
dataframe_schema[INDEX_IDENTIFIER] = _determine_data_kind(data_df.index)
|
389
|
+
|
390
|
+
# Add types for all columns:
|
391
|
+
for i, column in enumerate(data_df.items()):
|
392
|
+
column_name, column_data = column
|
393
|
+
dataframe_schema[column_name] = _determine_data_kind(
|
394
|
+
column_data, arrow_schema.field(i)
|
395
|
+
)
|
396
|
+
return dataframe_schema
|
397
|
+
|
398
|
+
|
399
|
+
# A mapping of column names/IDs to column configs.
|
400
|
+
ColumnConfigMapping: TypeAlias = dict[Union[IndexIdentifierType, str], ColumnConfig]
|
401
|
+
ColumnConfigMappingInput: TypeAlias = Mapping[
|
402
|
+
Union[IndexIdentifierType, str],
|
403
|
+
Union[ColumnConfig, None, str],
|
404
|
+
]
|
405
|
+
|
406
|
+
|
407
|
+
def process_config_mapping(
|
408
|
+
column_config: ColumnConfigMappingInput | None = None,
|
409
|
+
) -> ColumnConfigMapping:
|
410
|
+
"""Transforms a user-provided column config mapping into a valid column config mapping
|
411
|
+
that can be used by the frontend.
|
412
|
+
|
413
|
+
Parameters
|
414
|
+
----------
|
415
|
+
column_config: dict or None
|
416
|
+
The user-provided column config mapping.
|
417
|
+
|
418
|
+
Returns
|
419
|
+
-------
|
420
|
+
dict
|
421
|
+
The transformed column config mapping.
|
422
|
+
"""
|
423
|
+
if column_config is None:
|
424
|
+
return {}
|
425
|
+
|
426
|
+
transformed_column_config: ColumnConfigMapping = {}
|
427
|
+
for column, config in column_config.items():
|
428
|
+
if config is None:
|
429
|
+
transformed_column_config[column] = ColumnConfig(hidden=True)
|
430
|
+
elif isinstance(config, str):
|
431
|
+
transformed_column_config[column] = ColumnConfig(label=config)
|
432
|
+
elif isinstance(config, dict):
|
433
|
+
# Ensure that the column config objects are cloned
|
434
|
+
# since we will apply in-place changes to it.
|
435
|
+
transformed_column_config[column] = copy.deepcopy(config)
|
436
|
+
else:
|
437
|
+
raise StreamlitAPIException(
|
438
|
+
f"Invalid column config for column `{column}`. "
|
439
|
+
f"Expected `None`, `str` or `dict`, but got `{type(config)}`."
|
440
|
+
)
|
441
|
+
return transformed_column_config
|
442
|
+
|
443
|
+
|
444
|
+
def update_column_config(
|
445
|
+
column_config_mapping: ColumnConfigMapping, column: str, column_config: ColumnConfig
|
446
|
+
) -> None:
|
447
|
+
"""Updates the column config value for a single column within the mapping.
|
448
|
+
|
449
|
+
Parameters
|
450
|
+
----------
|
451
|
+
|
452
|
+
column_config_mapping : ColumnConfigMapping
|
453
|
+
The column config mapping to update.
|
454
|
+
|
455
|
+
column : str
|
456
|
+
The column to update the config value for.
|
457
|
+
|
458
|
+
column_config : ColumnConfig
|
459
|
+
The column config to update.
|
460
|
+
"""
|
461
|
+
|
462
|
+
if column not in column_config_mapping:
|
463
|
+
column_config_mapping[column] = {}
|
464
|
+
|
465
|
+
column_config_mapping[column].update(column_config)
|
466
|
+
|
467
|
+
|
468
|
+
def apply_data_specific_configs(
|
469
|
+
columns_config: ColumnConfigMapping,
|
470
|
+
data_format: DataFormat,
|
471
|
+
) -> None:
|
472
|
+
"""Apply data specific configurations to the provided dataframe.
|
473
|
+
|
474
|
+
This will apply inplace changes to the dataframe and the column configurations
|
475
|
+
depending on the data format.
|
476
|
+
|
477
|
+
Parameters
|
478
|
+
----------
|
479
|
+
columns_config : ColumnConfigMapping
|
480
|
+
A mapping of column names/ids to column configurations.
|
481
|
+
|
482
|
+
data_format : DataFormat
|
483
|
+
The format of the data.
|
484
|
+
"""
|
485
|
+
|
486
|
+
# Pandas adds a range index as default to all datastructures
|
487
|
+
# but for most of the non-pandas data objects it is unnecessary
|
488
|
+
# to show this index to the user. Therefore, we will hide it as default.
|
489
|
+
if data_format in [
|
490
|
+
DataFormat.SET_OF_VALUES,
|
491
|
+
DataFormat.TUPLE_OF_VALUES,
|
492
|
+
DataFormat.LIST_OF_VALUES,
|
493
|
+
DataFormat.NUMPY_LIST,
|
494
|
+
DataFormat.NUMPY_MATRIX,
|
495
|
+
DataFormat.LIST_OF_RECORDS,
|
496
|
+
DataFormat.LIST_OF_ROWS,
|
497
|
+
DataFormat.COLUMN_VALUE_MAPPING,
|
498
|
+
# Dataframe-like objects that don't have an index:
|
499
|
+
DataFormat.PANDAS_ARRAY,
|
500
|
+
DataFormat.PANDAS_INDEX,
|
501
|
+
DataFormat.POLARS_DATAFRAME,
|
502
|
+
DataFormat.POLARS_SERIES,
|
503
|
+
DataFormat.POLARS_LAZYFRAME,
|
504
|
+
DataFormat.PYARROW_ARRAY,
|
505
|
+
DataFormat.RAY_DATASET,
|
506
|
+
]:
|
507
|
+
update_column_config(columns_config, INDEX_IDENTIFIER, {"hidden": True})
|
508
|
+
|
509
|
+
|
510
|
+
def _convert_column_config_to_json(column_config_mapping: ColumnConfigMapping) -> str:
|
511
|
+
try:
|
512
|
+
# Ignore all None values and prefix columns specified by numerical index:
|
513
|
+
return json.dumps(
|
514
|
+
{
|
515
|
+
(
|
516
|
+
f"{_NUMERICAL_POSITION_PREFIX}{str(k)}" if isinstance(k, int) else k
|
517
|
+
): v
|
518
|
+
for (k, v) in remove_none_values(column_config_mapping).items()
|
519
|
+
},
|
520
|
+
allow_nan=False,
|
521
|
+
)
|
522
|
+
except ValueError as ex:
|
523
|
+
raise StreamlitAPIException(
|
524
|
+
f"The provided column config cannot be serialized into JSON: {ex}"
|
525
|
+
) from ex
|
526
|
+
|
527
|
+
|
528
|
+
def marshall_column_config(
|
529
|
+
proto: ArrowProto, column_config_mapping: ColumnConfigMapping
|
530
|
+
) -> None:
|
531
|
+
"""Marshall the column config into the Arrow proto.
|
532
|
+
|
533
|
+
Parameters
|
534
|
+
----------
|
535
|
+
proto : ArrowProto
|
536
|
+
The proto to marshall into.
|
537
|
+
|
538
|
+
column_config_mapping : ColumnConfigMapping
|
539
|
+
The column config to marshall.
|
540
|
+
"""
|
541
|
+
|
542
|
+
proto.columns = _convert_column_config_to_json(column_config_mapping)
|