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,637 @@
|
|
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
|
+
"""Hashing for st.cache_data and st.cache_resource."""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
import collections
|
20
|
+
import collections.abc
|
21
|
+
import dataclasses
|
22
|
+
import datetime
|
23
|
+
import functools
|
24
|
+
import hashlib
|
25
|
+
import inspect
|
26
|
+
import io
|
27
|
+
import os
|
28
|
+
import pickle
|
29
|
+
import sys
|
30
|
+
import tempfile
|
31
|
+
import threading
|
32
|
+
import uuid
|
33
|
+
import weakref
|
34
|
+
from enum import Enum
|
35
|
+
from re import Pattern
|
36
|
+
from types import MappingProxyType
|
37
|
+
from typing import Any, Callable, Final, Union, cast
|
38
|
+
|
39
|
+
from typing_extensions import TypeAlias
|
40
|
+
|
41
|
+
from streamlit import logger, type_util, util
|
42
|
+
from streamlit.errors import StreamlitAPIException
|
43
|
+
from streamlit.runtime.caching.cache_errors import UnhashableTypeError
|
44
|
+
from streamlit.runtime.caching.cache_type import CacheType
|
45
|
+
from streamlit.runtime.uploaded_file_manager import UploadedFile
|
46
|
+
|
47
|
+
_LOGGER: Final = logger.get_logger(__name__)
|
48
|
+
|
49
|
+
# If a dataframe has more than this many rows, we consider it large and hash a sample.
|
50
|
+
_PANDAS_ROWS_LARGE: Final = 50_000
|
51
|
+
_PANDAS_SAMPLE_SIZE: Final = 10_000
|
52
|
+
|
53
|
+
# Similar to dataframes, we also sample large numpy arrays.
|
54
|
+
_NP_SIZE_LARGE: Final = 500_000
|
55
|
+
_NP_SAMPLE_SIZE: Final = 100_000
|
56
|
+
|
57
|
+
HashFuncsDict: TypeAlias = dict[Union[str, type[Any]], Callable[[Any], Any]]
|
58
|
+
|
59
|
+
# Arbitrary item to denote where we found a cycle in a hashed object.
|
60
|
+
# This allows us to hash self-referencing lists, dictionaries, etc.
|
61
|
+
_CYCLE_PLACEHOLDER: Final = (
|
62
|
+
b"streamlit-57R34ML17-hesamagicalponyflyingthroughthesky-CYCLE"
|
63
|
+
)
|
64
|
+
|
65
|
+
|
66
|
+
class UserHashError(StreamlitAPIException):
|
67
|
+
def __init__(
|
68
|
+
self,
|
69
|
+
orig_exc,
|
70
|
+
object_to_hash,
|
71
|
+
hash_func,
|
72
|
+
cache_type: CacheType | None = None,
|
73
|
+
):
|
74
|
+
self.alternate_name = type(orig_exc).__name__
|
75
|
+
self.hash_func = hash_func
|
76
|
+
self.cache_type = cache_type
|
77
|
+
|
78
|
+
msg = self._get_message_from_func(orig_exc, object_to_hash)
|
79
|
+
|
80
|
+
super().__init__(msg)
|
81
|
+
self.with_traceback(orig_exc.__traceback__)
|
82
|
+
|
83
|
+
def _get_message_from_func(self, orig_exc, cached_func):
|
84
|
+
args = self._get_error_message_args(orig_exc, cached_func)
|
85
|
+
|
86
|
+
return (
|
87
|
+
"""
|
88
|
+
%(orig_exception_desc)s
|
89
|
+
|
90
|
+
This error is likely due to a bug in %(hash_func_name)s, which is a
|
91
|
+
user-defined hash function that was passed into the `%(cache_primitive)s` decorator of
|
92
|
+
%(object_desc)s.
|
93
|
+
|
94
|
+
%(hash_func_name)s failed when hashing an object of type
|
95
|
+
`%(failed_obj_type_str)s`. If you don't know where that object is coming from,
|
96
|
+
try looking at the hash chain below for an object that you do recognize, then
|
97
|
+
pass that to `hash_funcs` instead:
|
98
|
+
|
99
|
+
```
|
100
|
+
%(hash_stack)s
|
101
|
+
```
|
102
|
+
|
103
|
+
If you think this is actually a Streamlit bug, please
|
104
|
+
[file a bug report here](https://github.com/streamlit/streamlit/issues/new/choose).
|
105
|
+
"""
|
106
|
+
% args
|
107
|
+
).strip("\n")
|
108
|
+
|
109
|
+
def _get_error_message_args(
|
110
|
+
self,
|
111
|
+
orig_exc: BaseException,
|
112
|
+
failed_obj: Any,
|
113
|
+
) -> dict[str, Any]:
|
114
|
+
hash_source = hash_stacks.current.hash_source
|
115
|
+
|
116
|
+
failed_obj_type_str = type_util.get_fqn_type(failed_obj)
|
117
|
+
|
118
|
+
if hash_source is None:
|
119
|
+
object_desc = "something"
|
120
|
+
else:
|
121
|
+
if hasattr(hash_source, "__name__"):
|
122
|
+
object_desc = f"`{hash_source.__name__}()`"
|
123
|
+
else:
|
124
|
+
object_desc = "a function"
|
125
|
+
|
126
|
+
decorator_name = ""
|
127
|
+
if self.cache_type is CacheType.RESOURCE:
|
128
|
+
decorator_name = "@st.cache_resource"
|
129
|
+
elif self.cache_type is CacheType.DATA:
|
130
|
+
decorator_name = "@st.cache_data"
|
131
|
+
|
132
|
+
if hasattr(self.hash_func, "__name__"):
|
133
|
+
hash_func_name = f"`{self.hash_func.__name__}()`"
|
134
|
+
else:
|
135
|
+
hash_func_name = "a function"
|
136
|
+
|
137
|
+
return {
|
138
|
+
"orig_exception_desc": str(orig_exc),
|
139
|
+
"failed_obj_type_str": failed_obj_type_str,
|
140
|
+
"hash_stack": hash_stacks.current.pretty_print(),
|
141
|
+
"object_desc": object_desc,
|
142
|
+
"cache_primitive": decorator_name,
|
143
|
+
"hash_func_name": hash_func_name,
|
144
|
+
}
|
145
|
+
|
146
|
+
|
147
|
+
def update_hash(
|
148
|
+
val: Any,
|
149
|
+
hasher,
|
150
|
+
cache_type: CacheType,
|
151
|
+
hash_source: Callable[..., Any] | None = None,
|
152
|
+
hash_funcs: HashFuncsDict | None = None,
|
153
|
+
) -> None:
|
154
|
+
"""Updates a hashlib hasher with the hash of val.
|
155
|
+
|
156
|
+
This is the main entrypoint to hashing.py.
|
157
|
+
"""
|
158
|
+
|
159
|
+
hash_stacks.current.hash_source = hash_source
|
160
|
+
|
161
|
+
ch = _CacheFuncHasher(cache_type, hash_funcs)
|
162
|
+
ch.update(hasher, val)
|
163
|
+
|
164
|
+
|
165
|
+
class _HashStack:
|
166
|
+
"""Stack of what has been hashed, for debug and circular reference detection.
|
167
|
+
|
168
|
+
This internally keeps 1 stack per thread.
|
169
|
+
|
170
|
+
Internally, this stores the ID of pushed objects rather than the objects
|
171
|
+
themselves because otherwise the "in" operator inside __contains__ would
|
172
|
+
fail for objects that don't return a boolean for "==" operator. For
|
173
|
+
example, arr == 10 where arr is a NumPy array returns another NumPy array.
|
174
|
+
This causes the "in" to crash since it expects a boolean.
|
175
|
+
"""
|
176
|
+
|
177
|
+
def __init__(self):
|
178
|
+
self._stack: collections.OrderedDict[int, list[Any]] = collections.OrderedDict()
|
179
|
+
# A function that we decorate with streamlit cache
|
180
|
+
# primitive (st.cache_data or st.cache_resource).
|
181
|
+
self.hash_source: Callable[..., Any] | None = None
|
182
|
+
|
183
|
+
def __repr__(self) -> str:
|
184
|
+
return util.repr_(self)
|
185
|
+
|
186
|
+
def push(self, val: Any):
|
187
|
+
self._stack[id(val)] = val
|
188
|
+
|
189
|
+
def pop(self):
|
190
|
+
self._stack.popitem()
|
191
|
+
|
192
|
+
def __contains__(self, val: Any):
|
193
|
+
return id(val) in self._stack
|
194
|
+
|
195
|
+
def pretty_print(self) -> str:
|
196
|
+
def to_str(v: Any) -> str:
|
197
|
+
try:
|
198
|
+
return f"Object of type {type_util.get_fqn_type(v)}: {str(v)}"
|
199
|
+
except Exception:
|
200
|
+
return "<Unable to convert item to string>"
|
201
|
+
|
202
|
+
return "\n".join(to_str(x) for x in reversed(self._stack.values()))
|
203
|
+
|
204
|
+
|
205
|
+
class _HashStacks:
|
206
|
+
"""Stacks of what has been hashed, with at most 1 stack per thread."""
|
207
|
+
|
208
|
+
def __init__(self):
|
209
|
+
self._stacks: weakref.WeakKeyDictionary[threading.Thread, _HashStack] = (
|
210
|
+
weakref.WeakKeyDictionary()
|
211
|
+
)
|
212
|
+
|
213
|
+
def __repr__(self) -> str:
|
214
|
+
return util.repr_(self)
|
215
|
+
|
216
|
+
@property
|
217
|
+
def current(self) -> _HashStack:
|
218
|
+
current_thread = threading.current_thread()
|
219
|
+
|
220
|
+
stack = self._stacks.get(current_thread, None)
|
221
|
+
|
222
|
+
if stack is None:
|
223
|
+
stack = _HashStack()
|
224
|
+
self._stacks[current_thread] = stack
|
225
|
+
|
226
|
+
return stack
|
227
|
+
|
228
|
+
|
229
|
+
hash_stacks = _HashStacks()
|
230
|
+
|
231
|
+
|
232
|
+
def _int_to_bytes(i: int) -> bytes:
|
233
|
+
num_bytes = (i.bit_length() + 8) // 8
|
234
|
+
return i.to_bytes(num_bytes, "little", signed=True)
|
235
|
+
|
236
|
+
|
237
|
+
def _float_to_bytes(f: float) -> bytes:
|
238
|
+
# Lazy-load for performance reasons.
|
239
|
+
import struct
|
240
|
+
|
241
|
+
# Floats are 64bit in Python, so we need to use the "d" format.
|
242
|
+
return struct.pack("<d", f)
|
243
|
+
|
244
|
+
|
245
|
+
def _key(obj: Any | None) -> Any:
|
246
|
+
"""Return key for memoization."""
|
247
|
+
|
248
|
+
if obj is None:
|
249
|
+
return None
|
250
|
+
|
251
|
+
def is_simple(obj):
|
252
|
+
return (
|
253
|
+
isinstance(obj, bytes)
|
254
|
+
or isinstance(obj, bytearray)
|
255
|
+
or isinstance(obj, str)
|
256
|
+
or isinstance(obj, float)
|
257
|
+
or isinstance(obj, int)
|
258
|
+
or isinstance(obj, bool)
|
259
|
+
or isinstance(obj, uuid.UUID)
|
260
|
+
or obj is None
|
261
|
+
)
|
262
|
+
|
263
|
+
if is_simple(obj):
|
264
|
+
return obj
|
265
|
+
|
266
|
+
if isinstance(obj, tuple):
|
267
|
+
if all(map(is_simple, obj)):
|
268
|
+
return obj
|
269
|
+
|
270
|
+
if isinstance(obj, list):
|
271
|
+
if all(map(is_simple, obj)):
|
272
|
+
return ("__l", tuple(obj))
|
273
|
+
|
274
|
+
if inspect.isbuiltin(obj) or inspect.isroutine(obj) or inspect.iscode(obj):
|
275
|
+
return id(obj)
|
276
|
+
|
277
|
+
return NoResult
|
278
|
+
|
279
|
+
|
280
|
+
class _CacheFuncHasher:
|
281
|
+
"""A hasher that can hash objects with cycles."""
|
282
|
+
|
283
|
+
def __init__(self, cache_type: CacheType, hash_funcs: HashFuncsDict | None = None):
|
284
|
+
# Can't use types as the keys in the internal _hash_funcs because
|
285
|
+
# we always remove user-written modules from memory when rerunning a
|
286
|
+
# script in order to reload it and grab the latest code changes.
|
287
|
+
# (See LocalSourcesWatcher.py:on_file_changed) This causes
|
288
|
+
# the type object to refer to different underlying class instances each run,
|
289
|
+
# so type-based comparisons fail. To solve this, we use the types converted
|
290
|
+
# to fully-qualified strings as keys in our internal dict.
|
291
|
+
self._hash_funcs: HashFuncsDict
|
292
|
+
if hash_funcs:
|
293
|
+
self._hash_funcs = {
|
294
|
+
k if isinstance(k, str) else type_util.get_fqn(k): v
|
295
|
+
for k, v in hash_funcs.items()
|
296
|
+
}
|
297
|
+
else:
|
298
|
+
self._hash_funcs = {}
|
299
|
+
self._hashes: dict[Any, bytes] = {}
|
300
|
+
|
301
|
+
# The number of the bytes in the hash.
|
302
|
+
self.size = 0
|
303
|
+
|
304
|
+
self.cache_type = cache_type
|
305
|
+
|
306
|
+
def __repr__(self) -> str:
|
307
|
+
return util.repr_(self)
|
308
|
+
|
309
|
+
def to_bytes(self, obj: Any) -> bytes:
|
310
|
+
"""Add memoization to _to_bytes and protect against cycles in data structures."""
|
311
|
+
tname = type(obj).__qualname__.encode()
|
312
|
+
key = (tname, _key(obj))
|
313
|
+
|
314
|
+
# Memoize if possible.
|
315
|
+
if key[1] is not NoResult:
|
316
|
+
if key in self._hashes:
|
317
|
+
return self._hashes[key]
|
318
|
+
|
319
|
+
# Break recursive cycles.
|
320
|
+
if obj in hash_stacks.current:
|
321
|
+
return _CYCLE_PLACEHOLDER
|
322
|
+
|
323
|
+
hash_stacks.current.push(obj)
|
324
|
+
|
325
|
+
try:
|
326
|
+
# Hash the input
|
327
|
+
b = b"%s:%s" % (tname, self._to_bytes(obj))
|
328
|
+
|
329
|
+
# Hmmm... It's possible that the size calculation is wrong. When we
|
330
|
+
# call to_bytes inside _to_bytes things get double-counted.
|
331
|
+
self.size += sys.getsizeof(b)
|
332
|
+
|
333
|
+
if key[1] is not NoResult:
|
334
|
+
self._hashes[key] = b
|
335
|
+
|
336
|
+
finally:
|
337
|
+
# In case an UnhashableTypeError (or other) error is thrown, clean up the
|
338
|
+
# stack so we don't get false positives in future hashing calls
|
339
|
+
hash_stacks.current.pop()
|
340
|
+
|
341
|
+
return b
|
342
|
+
|
343
|
+
def update(self, hasher, obj: Any) -> None:
|
344
|
+
"""Update the provided hasher with the hash of an object."""
|
345
|
+
b = self.to_bytes(obj)
|
346
|
+
hasher.update(b)
|
347
|
+
|
348
|
+
def _to_bytes(self, obj: Any) -> bytes:
|
349
|
+
"""Hash objects to bytes, including code with dependencies.
|
350
|
+
|
351
|
+
Python's built in `hash` does not produce consistent results across
|
352
|
+
runs.
|
353
|
+
"""
|
354
|
+
|
355
|
+
h = hashlib.new("md5", usedforsecurity=False)
|
356
|
+
|
357
|
+
if type_util.is_type(obj, "unittest.mock.Mock") or type_util.is_type(
|
358
|
+
obj, "unittest.mock.MagicMock"
|
359
|
+
):
|
360
|
+
# Mock objects can appear to be infinitely
|
361
|
+
# deep, so we don't try to hash them at all.
|
362
|
+
return self.to_bytes(id(obj))
|
363
|
+
|
364
|
+
elif isinstance(obj, bytes) or isinstance(obj, bytearray):
|
365
|
+
return obj
|
366
|
+
|
367
|
+
elif type_util.get_fqn_type(obj) in self._hash_funcs:
|
368
|
+
# Escape hatch for unsupported objects
|
369
|
+
hash_func = self._hash_funcs[type_util.get_fqn_type(obj)]
|
370
|
+
try:
|
371
|
+
output = hash_func(obj)
|
372
|
+
except Exception as ex:
|
373
|
+
raise UserHashError(
|
374
|
+
ex, obj, hash_func=hash_func, cache_type=self.cache_type
|
375
|
+
) from ex
|
376
|
+
return self.to_bytes(output)
|
377
|
+
|
378
|
+
elif isinstance(obj, str):
|
379
|
+
return obj.encode()
|
380
|
+
|
381
|
+
elif isinstance(obj, float):
|
382
|
+
return _float_to_bytes(obj)
|
383
|
+
|
384
|
+
elif isinstance(obj, int):
|
385
|
+
return _int_to_bytes(obj)
|
386
|
+
|
387
|
+
elif isinstance(obj, uuid.UUID):
|
388
|
+
return obj.bytes
|
389
|
+
|
390
|
+
elif isinstance(obj, datetime.datetime):
|
391
|
+
return obj.isoformat().encode()
|
392
|
+
|
393
|
+
elif isinstance(obj, (list, tuple)):
|
394
|
+
for item in obj:
|
395
|
+
self.update(h, item)
|
396
|
+
return h.digest()
|
397
|
+
|
398
|
+
elif isinstance(obj, dict):
|
399
|
+
for item in obj.items():
|
400
|
+
self.update(h, item)
|
401
|
+
return h.digest()
|
402
|
+
|
403
|
+
elif obj is None:
|
404
|
+
return b"0"
|
405
|
+
|
406
|
+
elif obj is True:
|
407
|
+
return b"1"
|
408
|
+
|
409
|
+
elif obj is False:
|
410
|
+
return b"0"
|
411
|
+
|
412
|
+
elif not isinstance(obj, type) and dataclasses.is_dataclass(obj):
|
413
|
+
return self.to_bytes(dataclasses.asdict(obj))
|
414
|
+
elif isinstance(obj, Enum):
|
415
|
+
return str(obj).encode()
|
416
|
+
|
417
|
+
elif type_util.is_type(obj, "pandas.core.series.Series"):
|
418
|
+
import pandas as pd
|
419
|
+
|
420
|
+
obj = cast(pd.Series, obj)
|
421
|
+
self.update(h, obj.size)
|
422
|
+
self.update(h, obj.dtype.name)
|
423
|
+
|
424
|
+
if len(obj) >= _PANDAS_ROWS_LARGE:
|
425
|
+
obj = obj.sample(n=_PANDAS_SAMPLE_SIZE, random_state=0)
|
426
|
+
|
427
|
+
try:
|
428
|
+
self.update(h, pd.util.hash_pandas_object(obj).to_numpy().tobytes())
|
429
|
+
return h.digest()
|
430
|
+
except TypeError:
|
431
|
+
_LOGGER.warning(
|
432
|
+
"Pandas Series hash failed. Falling back to pickling the object.",
|
433
|
+
exc_info=True,
|
434
|
+
)
|
435
|
+
|
436
|
+
# Use pickle if pandas cannot hash the object for example if
|
437
|
+
# it contains unhashable objects.
|
438
|
+
return b"%s" % pickle.dumps(obj, pickle.HIGHEST_PROTOCOL)
|
439
|
+
|
440
|
+
elif type_util.is_type(obj, "pandas.core.frame.DataFrame"):
|
441
|
+
import pandas as pd
|
442
|
+
|
443
|
+
obj = cast(pd.DataFrame, obj)
|
444
|
+
self.update(h, obj.shape)
|
445
|
+
|
446
|
+
if len(obj) >= _PANDAS_ROWS_LARGE:
|
447
|
+
obj = obj.sample(n=_PANDAS_SAMPLE_SIZE, random_state=0)
|
448
|
+
try:
|
449
|
+
column_hash_bytes = self.to_bytes(
|
450
|
+
pd.util.hash_pandas_object(obj.dtypes)
|
451
|
+
)
|
452
|
+
self.update(h, column_hash_bytes)
|
453
|
+
values_hash_bytes = self.to_bytes(pd.util.hash_pandas_object(obj))
|
454
|
+
self.update(h, values_hash_bytes)
|
455
|
+
return h.digest()
|
456
|
+
except TypeError:
|
457
|
+
_LOGGER.warning(
|
458
|
+
"Pandas DataFrame hash failed. Falling back to pickling the object.",
|
459
|
+
exc_info=True,
|
460
|
+
)
|
461
|
+
|
462
|
+
# Use pickle if pandas cannot hash the object for example if
|
463
|
+
# it contains unhashable objects.
|
464
|
+
return b"%s" % pickle.dumps(obj, pickle.HIGHEST_PROTOCOL)
|
465
|
+
|
466
|
+
elif type_util.is_type(obj, "polars.series.series.Series"):
|
467
|
+
import polars as pl # type: ignore[import-not-found]
|
468
|
+
|
469
|
+
obj = cast(pl.Series, obj)
|
470
|
+
self.update(h, str(obj.dtype).encode())
|
471
|
+
self.update(h, obj.shape)
|
472
|
+
|
473
|
+
if len(obj) >= _PANDAS_ROWS_LARGE:
|
474
|
+
obj = obj.sample(n=_PANDAS_SAMPLE_SIZE, seed=0)
|
475
|
+
|
476
|
+
try:
|
477
|
+
self.update(h, obj.hash(seed=0).to_arrow().to_string().encode())
|
478
|
+
return h.digest()
|
479
|
+
except TypeError:
|
480
|
+
_LOGGER.warning(
|
481
|
+
"Polars Series hash failed. Falling back to pickling the object.",
|
482
|
+
exc_info=True,
|
483
|
+
)
|
484
|
+
|
485
|
+
# Use pickle if polars cannot hash the object for example if
|
486
|
+
# it contains unhashable objects.
|
487
|
+
return b"%s" % pickle.dumps(obj, pickle.HIGHEST_PROTOCOL)
|
488
|
+
elif type_util.is_type(obj, "polars.dataframe.frame.DataFrame"):
|
489
|
+
import polars as pl
|
490
|
+
|
491
|
+
obj = cast(pl.DataFrame, obj)
|
492
|
+
self.update(h, obj.shape)
|
493
|
+
|
494
|
+
if len(obj) >= _PANDAS_ROWS_LARGE:
|
495
|
+
obj = obj.sample(n=_PANDAS_SAMPLE_SIZE, seed=0)
|
496
|
+
try:
|
497
|
+
for c, t in obj.schema.items():
|
498
|
+
self.update(h, c.encode())
|
499
|
+
self.update(h, str(t).encode())
|
500
|
+
|
501
|
+
values_hash_bytes = (
|
502
|
+
obj.hash_rows(seed=0).hash(seed=0).to_arrow().to_string().encode()
|
503
|
+
)
|
504
|
+
|
505
|
+
self.update(h, values_hash_bytes)
|
506
|
+
return h.digest()
|
507
|
+
except TypeError:
|
508
|
+
_LOGGER.warning(
|
509
|
+
"Polars DataFrame hash failed. Falling back to pickling the object.",
|
510
|
+
exc_info=True,
|
511
|
+
)
|
512
|
+
|
513
|
+
# Use pickle if polars cannot hash the object for example if
|
514
|
+
# it contains unhashable objects.
|
515
|
+
return b"%s" % pickle.dumps(obj, pickle.HIGHEST_PROTOCOL)
|
516
|
+
elif type_util.is_type(obj, "numpy.ndarray"):
|
517
|
+
import numpy as np
|
518
|
+
|
519
|
+
# write cast type as string to make it work with our Python 3.8 tests
|
520
|
+
# - can be removed once we sunset support for Python 3.8
|
521
|
+
obj = cast("np.ndarray[Any, Any]", obj)
|
522
|
+
self.update(h, obj.shape)
|
523
|
+
self.update(h, str(obj.dtype))
|
524
|
+
|
525
|
+
if obj.size >= _NP_SIZE_LARGE:
|
526
|
+
import numpy as np
|
527
|
+
|
528
|
+
state = np.random.RandomState(0)
|
529
|
+
obj = state.choice(obj.flat, size=_NP_SAMPLE_SIZE)
|
530
|
+
|
531
|
+
self.update(h, obj.tobytes())
|
532
|
+
return h.digest()
|
533
|
+
elif type_util.is_type(obj, "PIL.Image.Image"):
|
534
|
+
import numpy as np
|
535
|
+
from PIL.Image import Image
|
536
|
+
|
537
|
+
obj = cast(Image, obj)
|
538
|
+
|
539
|
+
# we don't just hash the results of obj.tobytes() because we want to use
|
540
|
+
# the sampling logic for numpy data
|
541
|
+
np_array = np.frombuffer(obj.tobytes(), dtype="uint8")
|
542
|
+
return self.to_bytes(np_array)
|
543
|
+
|
544
|
+
elif inspect.isbuiltin(obj):
|
545
|
+
return bytes(obj.__name__.encode())
|
546
|
+
|
547
|
+
elif isinstance(obj, MappingProxyType) or isinstance(
|
548
|
+
obj, collections.abc.ItemsView
|
549
|
+
):
|
550
|
+
return self.to_bytes(dict(obj))
|
551
|
+
|
552
|
+
elif type_util.is_type(obj, "builtins.getset_descriptor"):
|
553
|
+
return bytes(obj.__qualname__.encode())
|
554
|
+
|
555
|
+
elif isinstance(obj, UploadedFile):
|
556
|
+
# UploadedFile is a BytesIO (thus IOBase) but has a name.
|
557
|
+
# It does not have a timestamp so this must come before
|
558
|
+
# temporary files
|
559
|
+
self.update(h, obj.name)
|
560
|
+
self.update(h, obj.tell())
|
561
|
+
self.update(h, obj.getvalue())
|
562
|
+
return h.digest()
|
563
|
+
|
564
|
+
elif hasattr(obj, "name") and (
|
565
|
+
isinstance(obj, io.IOBase)
|
566
|
+
# Handle temporary files used during testing
|
567
|
+
or isinstance(obj, tempfile._TemporaryFileWrapper)
|
568
|
+
):
|
569
|
+
# Hash files as name + last modification date + offset.
|
570
|
+
# NB: we're using hasattr("name") to differentiate between
|
571
|
+
# on-disk and in-memory StringIO/BytesIO file representations.
|
572
|
+
# That means that this condition must come *before* the next
|
573
|
+
# condition, which just checks for StringIO/BytesIO.
|
574
|
+
obj_name = getattr(obj, "name", "wonthappen") # Just to appease MyPy.
|
575
|
+
self.update(h, obj_name)
|
576
|
+
self.update(h, os.path.getmtime(obj_name))
|
577
|
+
self.update(h, obj.tell())
|
578
|
+
return h.digest()
|
579
|
+
|
580
|
+
elif isinstance(obj, Pattern):
|
581
|
+
return self.to_bytes([obj.pattern, obj.flags])
|
582
|
+
|
583
|
+
elif isinstance(obj, io.StringIO) or isinstance(obj, io.BytesIO):
|
584
|
+
# Hash in-memory StringIO/BytesIO by their full contents
|
585
|
+
# and seek position.
|
586
|
+
self.update(h, obj.tell())
|
587
|
+
self.update(h, obj.getvalue())
|
588
|
+
return h.digest()
|
589
|
+
|
590
|
+
elif type_util.is_type(obj, "numpy.ufunc"):
|
591
|
+
# For numpy.remainder, this returns remainder.
|
592
|
+
return bytes(obj.__name__.encode())
|
593
|
+
|
594
|
+
elif inspect.ismodule(obj):
|
595
|
+
# TODO: Figure out how to best show this kind of warning to the
|
596
|
+
# user. In the meantime, show nothing. This scenario is too common,
|
597
|
+
# so the current warning is quite annoying...
|
598
|
+
# st.warning(('Streamlit does not support hashing modules. '
|
599
|
+
# 'We did not hash `%s`.') % obj.__name__)
|
600
|
+
# TODO: Hash more than just the name for internal modules.
|
601
|
+
return self.to_bytes(obj.__name__)
|
602
|
+
|
603
|
+
elif inspect.isclass(obj):
|
604
|
+
# TODO: Figure out how to best show this kind of warning to the
|
605
|
+
# user. In the meantime, show nothing. This scenario is too common,
|
606
|
+
# (e.g. in every "except" statement) so the current warning is
|
607
|
+
# quite annoying...
|
608
|
+
# st.warning(('Streamlit does not support hashing classes. '
|
609
|
+
# 'We did not hash `%s`.') % obj.__name__)
|
610
|
+
# TODO: Hash more than just the name of classes.
|
611
|
+
return self.to_bytes(obj.__name__)
|
612
|
+
|
613
|
+
elif isinstance(obj, functools.partial):
|
614
|
+
# The return value of functools.partial is not a plain function:
|
615
|
+
# it's a callable object that remembers the original function plus
|
616
|
+
# the values you pickled into it. So here we need to special-case it.
|
617
|
+
self.update(h, obj.args)
|
618
|
+
self.update(h, obj.func)
|
619
|
+
self.update(h, obj.keywords)
|
620
|
+
return h.digest()
|
621
|
+
|
622
|
+
else:
|
623
|
+
# As a last resort, hash the output of the object's __reduce__ method
|
624
|
+
try:
|
625
|
+
reduce_data = obj.__reduce__()
|
626
|
+
except Exception as ex:
|
627
|
+
raise UnhashableTypeError() from ex
|
628
|
+
|
629
|
+
for item in reduce_data:
|
630
|
+
self.update(h, item)
|
631
|
+
return h.digest()
|
632
|
+
|
633
|
+
|
634
|
+
class NoResult:
|
635
|
+
"""Placeholder class for return values when None is meaningful."""
|
636
|
+
|
637
|
+
pass
|