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,106 @@
|
|
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
|
+
"""Runtime-related utility functions"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
from typing import TYPE_CHECKING, Any
|
20
|
+
|
21
|
+
from streamlit import config
|
22
|
+
from streamlit.errors import MarkdownFormattedException, StreamlitAPIException
|
23
|
+
from streamlit.runtime.forward_msg_cache import populate_hash_if_needed
|
24
|
+
|
25
|
+
if TYPE_CHECKING:
|
26
|
+
from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
|
27
|
+
|
28
|
+
|
29
|
+
class MessageSizeError(MarkdownFormattedException):
|
30
|
+
"""Exception raised when a websocket message is larger than the configured limit."""
|
31
|
+
|
32
|
+
def __init__(self, failed_msg_str: Any):
|
33
|
+
msg = self._get_message(failed_msg_str)
|
34
|
+
super().__init__(msg)
|
35
|
+
|
36
|
+
def _get_message(self, failed_msg_str: Any) -> str:
|
37
|
+
# This needs to have zero indentation otherwise the markdown will render incorrectly.
|
38
|
+
return (
|
39
|
+
f"""
|
40
|
+
**Data of size {len(failed_msg_str) / 1e6:.1f} MB exceeds the message size limit of {get_max_message_size_bytes() / 1e6} MB.**
|
41
|
+
|
42
|
+
This is often caused by a large chart or dataframe. Please decrease the amount of data sent
|
43
|
+
to the browser, or increase the limit by setting the config option `server.maxMessageSize`.
|
44
|
+
[Click here to learn more about config options](https://docs.streamlit.io/develop/api-reference/configuration/config.toml).
|
45
|
+
|
46
|
+
_Note that increasing the limit may lead to long loading times and large memory consumption
|
47
|
+
of the client's browser and the Streamlit server._
|
48
|
+
"""
|
49
|
+
).strip("\n")
|
50
|
+
|
51
|
+
|
52
|
+
class BadDurationStringError(StreamlitAPIException):
|
53
|
+
"""Raised when a bad duration argument string is passed."""
|
54
|
+
|
55
|
+
def __init__(self, duration: str):
|
56
|
+
MarkdownFormattedException.__init__(
|
57
|
+
self,
|
58
|
+
"TTL string doesn't look right. It should be formatted as"
|
59
|
+
f"`'1d2h34m'` or `2 days`, for example. Got: {duration}",
|
60
|
+
)
|
61
|
+
|
62
|
+
|
63
|
+
def is_cacheable_msg(msg: ForwardMsg) -> bool:
|
64
|
+
"""True if the given message qualifies for caching."""
|
65
|
+
if msg.WhichOneof("type") in {"ref_hash", "initialize"}:
|
66
|
+
# Some message types never get cached
|
67
|
+
return False
|
68
|
+
return msg.ByteSize() >= int(config.get_option("global.minCachedMessageSize"))
|
69
|
+
|
70
|
+
|
71
|
+
def serialize_forward_msg(msg: ForwardMsg) -> bytes:
|
72
|
+
"""Serialize a ForwardMsg to send to a client.
|
73
|
+
|
74
|
+
If the message is too large, it will be converted to an exception message
|
75
|
+
instead.
|
76
|
+
"""
|
77
|
+
populate_hash_if_needed(msg)
|
78
|
+
msg_str = msg.SerializeToString()
|
79
|
+
|
80
|
+
if len(msg_str) > get_max_message_size_bytes():
|
81
|
+
import streamlit.elements.exception as exception
|
82
|
+
|
83
|
+
# Overwrite the offending ForwardMsg.delta with an error to display.
|
84
|
+
# This assumes that the size limit wasn't exceeded due to metadata.
|
85
|
+
exception.marshall(msg.delta.new_element.exception, MessageSizeError(msg_str))
|
86
|
+
msg_str = msg.SerializeToString()
|
87
|
+
|
88
|
+
return msg_str
|
89
|
+
|
90
|
+
|
91
|
+
# This needs to be initialized lazily to avoid calling config.get_option() and
|
92
|
+
# thus initializing config options when this file is first imported.
|
93
|
+
_max_message_size_bytes: int | None = None
|
94
|
+
|
95
|
+
|
96
|
+
def get_max_message_size_bytes() -> int:
|
97
|
+
"""Returns the max websocket message size in bytes.
|
98
|
+
|
99
|
+
This will lazyload the value from the config and store it in the global symbol table.
|
100
|
+
"""
|
101
|
+
global _max_message_size_bytes
|
102
|
+
|
103
|
+
if _max_message_size_bytes is None:
|
104
|
+
_max_message_size_bytes = config.get_option("server.maxMessageSize") * int(1e6)
|
105
|
+
|
106
|
+
return _max_message_size_bytes
|
@@ -0,0 +1,46 @@
|
|
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 os
|
18
|
+
from dataclasses import dataclass, field
|
19
|
+
|
20
|
+
|
21
|
+
@dataclass(frozen=True)
|
22
|
+
class ScriptData:
|
23
|
+
"""Contains parameters related to running a script."""
|
24
|
+
|
25
|
+
main_script_path: str
|
26
|
+
is_hello: bool = False
|
27
|
+
script_folder: str = field(init=False)
|
28
|
+
name: str = field(init=False)
|
29
|
+
|
30
|
+
def __post_init__(self) -> None:
|
31
|
+
"""Set some computed values derived from main_script_path.
|
32
|
+
|
33
|
+
The usage of object.__setattr__ is necessary because trying to set
|
34
|
+
self.script_folder or self.name normally, even within the __init__ method, will
|
35
|
+
explode since we declared this dataclass to be frozen.
|
36
|
+
|
37
|
+
We do this in __post_init__ so that we can use the auto-generated __init__
|
38
|
+
method that most dataclasses use.
|
39
|
+
"""
|
40
|
+
main_script_path = os.path.abspath(self.main_script_path)
|
41
|
+
script_folder = os.path.dirname(main_script_path)
|
42
|
+
object.__setattr__(self, "script_folder", script_folder)
|
43
|
+
|
44
|
+
basename = os.path.basename(main_script_path)
|
45
|
+
name = str(os.path.splitext(basename)[0])
|
46
|
+
object.__setattr__(self, "name", name)
|
@@ -0,0 +1,38 @@
|
|
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 streamlit.runtime.scriptrunner.script_runner import ScriptRunner, ScriptRunnerEvent
|
16
|
+
from streamlit.runtime.scriptrunner_utils.exceptions import (
|
17
|
+
RerunException,
|
18
|
+
StopException,
|
19
|
+
)
|
20
|
+
from streamlit.runtime.scriptrunner_utils.script_requests import RerunData
|
21
|
+
from streamlit.runtime.scriptrunner_utils.script_run_context import (
|
22
|
+
ScriptRunContext,
|
23
|
+
add_script_run_ctx,
|
24
|
+
enqueue_message,
|
25
|
+
get_script_run_ctx,
|
26
|
+
)
|
27
|
+
|
28
|
+
__all__ = [
|
29
|
+
"RerunData",
|
30
|
+
"ScriptRunContext",
|
31
|
+
"add_script_run_ctx",
|
32
|
+
"get_script_run_ctx",
|
33
|
+
"enqueue_message",
|
34
|
+
"RerunException",
|
35
|
+
"ScriptRunner",
|
36
|
+
"ScriptRunnerEvent",
|
37
|
+
"StopException",
|
38
|
+
]
|
@@ -0,0 +1,159 @@
|
|
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 sys
|
18
|
+
from typing import TYPE_CHECKING, Any, Callable
|
19
|
+
|
20
|
+
from streamlit import util
|
21
|
+
from streamlit.delta_generator_singletons import (
|
22
|
+
context_dg_stack,
|
23
|
+
get_default_dg_stack_value,
|
24
|
+
)
|
25
|
+
from streamlit.error_util import handle_uncaught_app_exception
|
26
|
+
from streamlit.errors import FragmentHandledException
|
27
|
+
from streamlit.runtime.scriptrunner_utils.exceptions import (
|
28
|
+
RerunException,
|
29
|
+
StopException,
|
30
|
+
)
|
31
|
+
|
32
|
+
if TYPE_CHECKING:
|
33
|
+
from streamlit.runtime.scriptrunner_utils.script_requests import RerunData
|
34
|
+
from streamlit.runtime.scriptrunner_utils.script_run_context import ScriptRunContext
|
35
|
+
|
36
|
+
|
37
|
+
class modified_sys_path:
|
38
|
+
"""A context for prepending a directory to sys.path for a second.
|
39
|
+
|
40
|
+
Code inspired by IPython:
|
41
|
+
Source: https://github.com/ipython/ipython/blob/master/IPython/utils/syspathcontext.py#L42
|
42
|
+
"""
|
43
|
+
|
44
|
+
def __init__(self, main_script_path: str):
|
45
|
+
self._main_script_path = main_script_path
|
46
|
+
self._added_path = False
|
47
|
+
|
48
|
+
def __repr__(self) -> str:
|
49
|
+
return util.repr_(self)
|
50
|
+
|
51
|
+
def __enter__(self):
|
52
|
+
if self._main_script_path not in sys.path:
|
53
|
+
sys.path.insert(0, self._main_script_path)
|
54
|
+
self._added_path = True
|
55
|
+
|
56
|
+
def __exit__(self, type, value, traceback):
|
57
|
+
if self._added_path:
|
58
|
+
try:
|
59
|
+
sys.path.remove(self._main_script_path)
|
60
|
+
except ValueError:
|
61
|
+
# It's already removed.
|
62
|
+
pass
|
63
|
+
|
64
|
+
# Returning False causes any exceptions to be re-raised.
|
65
|
+
return False
|
66
|
+
|
67
|
+
|
68
|
+
def exec_func_with_error_handling(
|
69
|
+
func: Callable[[], Any], ctx: ScriptRunContext
|
70
|
+
) -> tuple[
|
71
|
+
Any | None,
|
72
|
+
bool,
|
73
|
+
RerunData | None,
|
74
|
+
bool,
|
75
|
+
Exception | None,
|
76
|
+
]:
|
77
|
+
"""Execute the passed function wrapped in a try/except block.
|
78
|
+
|
79
|
+
This function is called by the script runner to execute the user's script or
|
80
|
+
fragment reruns, but also for the execution of fragment code in context of a normal
|
81
|
+
app run. This wrapper ensures that handle_uncaught_exception messages show up in the
|
82
|
+
correct context.
|
83
|
+
|
84
|
+
Parameters
|
85
|
+
----------
|
86
|
+
func : callable
|
87
|
+
The function to execute wrapped in the try/except block.
|
88
|
+
ctx : ScriptRunContext
|
89
|
+
The context in which the script is being run.
|
90
|
+
|
91
|
+
Returns
|
92
|
+
-------
|
93
|
+
tuple
|
94
|
+
A tuple containing:
|
95
|
+
- The result of the passed function.
|
96
|
+
- A boolean indicating whether the script ran without errors (RerunException and
|
97
|
+
StopException don't count as errors).
|
98
|
+
- The RerunData instance belonging to a RerunException if the script was
|
99
|
+
interrupted by a RerunException.
|
100
|
+
- A boolean indicating whether the script was stopped prematurely (False for
|
101
|
+
RerunExceptions, True for all other exceptions).
|
102
|
+
- The uncaught exception if one occurred, None otherwise
|
103
|
+
"""
|
104
|
+
run_without_errors = True
|
105
|
+
|
106
|
+
# This will be set to a RerunData instance if our execution
|
107
|
+
# is interrupted by a RerunException.
|
108
|
+
rerun_exception_data: RerunData | None = None
|
109
|
+
|
110
|
+
# If the script stops early, we don't want to remove unseen widgets,
|
111
|
+
# so we track this to potentially skip session state cleanup later.
|
112
|
+
premature_stop: bool = False
|
113
|
+
|
114
|
+
# The result of the passed function
|
115
|
+
result: Any | None = None
|
116
|
+
|
117
|
+
# The uncaught exception if one occurred, None otherwise
|
118
|
+
uncaught_exception: Exception | None = None
|
119
|
+
|
120
|
+
try:
|
121
|
+
result = func()
|
122
|
+
except RerunException as e:
|
123
|
+
rerun_exception_data = e.rerun_data
|
124
|
+
|
125
|
+
# Since the script is about to rerun, we may need to reset our cursors/dg_stack
|
126
|
+
# so that we write to the right place in the app. For full script runs, this
|
127
|
+
# needs to happen in case the same thread reruns our script (a different thread
|
128
|
+
# would automatically come with fresh cursors/dg_stack values). For fragments,
|
129
|
+
# it doesn't matter either way since the fragment resets these values from its
|
130
|
+
# snapshot before execution.
|
131
|
+
ctx.cursors.clear()
|
132
|
+
context_dg_stack.set(get_default_dg_stack_value())
|
133
|
+
|
134
|
+
# Interruption due to a rerun is usually from `st.rerun()`, which
|
135
|
+
# we want to count as a script completion so triggers reset.
|
136
|
+
# It is also possible for this to happen if fast reruns is off,
|
137
|
+
# but this is very rare.
|
138
|
+
premature_stop = False
|
139
|
+
|
140
|
+
except StopException:
|
141
|
+
# This is thrown when the script executes `st.stop()`.
|
142
|
+
# We don't have to do anything here.
|
143
|
+
premature_stop = True
|
144
|
+
except FragmentHandledException:
|
145
|
+
run_without_errors = False
|
146
|
+
premature_stop = True
|
147
|
+
except Exception as ex:
|
148
|
+
run_without_errors = False
|
149
|
+
premature_stop = True
|
150
|
+
handle_uncaught_app_exception(ex)
|
151
|
+
uncaught_exception = ex
|
152
|
+
|
153
|
+
return (
|
154
|
+
result,
|
155
|
+
run_without_errors,
|
156
|
+
rerun_exception_data,
|
157
|
+
premature_stop,
|
158
|
+
uncaught_exception,
|
159
|
+
)
|
@@ -0,0 +1,273 @@
|
|
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 ast
|
18
|
+
import sys
|
19
|
+
from typing import Any, Final
|
20
|
+
|
21
|
+
from streamlit import config
|
22
|
+
|
23
|
+
# When a Streamlit app is magicified, we insert a `magic_funcs` import near the top of
|
24
|
+
# its module's AST:
|
25
|
+
# import streamlit.runtime.scriptrunner.magic_funcs as __streamlitmagic__
|
26
|
+
MAGIC_MODULE_NAME: Final = "__streamlitmagic__"
|
27
|
+
|
28
|
+
|
29
|
+
def add_magic(code: str, script_path: str) -> Any:
|
30
|
+
"""Modifies the code to support magic Streamlit commands.
|
31
|
+
|
32
|
+
Parameters
|
33
|
+
----------
|
34
|
+
code : str
|
35
|
+
The Python code.
|
36
|
+
script_path : str
|
37
|
+
The path to the script file.
|
38
|
+
|
39
|
+
Returns
|
40
|
+
-------
|
41
|
+
ast.Module
|
42
|
+
The syntax tree for the code.
|
43
|
+
|
44
|
+
"""
|
45
|
+
# Pass script_path so we get pretty exceptions.
|
46
|
+
tree = ast.parse(code, script_path, "exec")
|
47
|
+
|
48
|
+
file_ends_in_semicolon = _does_file_end_in_semicolon(tree, code)
|
49
|
+
|
50
|
+
_modify_ast_subtree(
|
51
|
+
tree, is_root=True, file_ends_in_semicolon=file_ends_in_semicolon
|
52
|
+
)
|
53
|
+
|
54
|
+
return tree
|
55
|
+
|
56
|
+
|
57
|
+
def _modify_ast_subtree(
|
58
|
+
tree: Any,
|
59
|
+
body_attr: str = "body",
|
60
|
+
is_root: bool = False,
|
61
|
+
file_ends_in_semicolon: bool = False,
|
62
|
+
):
|
63
|
+
"""Parses magic commands and modifies the given AST (sub)tree."""
|
64
|
+
|
65
|
+
body = getattr(tree, body_attr)
|
66
|
+
|
67
|
+
for i, node in enumerate(body):
|
68
|
+
node_type = type(node)
|
69
|
+
|
70
|
+
# Recursively parses the content of the statements
|
71
|
+
# `with` as well as function definitions.
|
72
|
+
# Also covers their async counterparts
|
73
|
+
if (
|
74
|
+
node_type is ast.FunctionDef
|
75
|
+
or node_type is ast.With
|
76
|
+
or node_type is ast.AsyncFunctionDef
|
77
|
+
or node_type is ast.AsyncWith
|
78
|
+
):
|
79
|
+
_modify_ast_subtree(node)
|
80
|
+
|
81
|
+
# Recursively parses the content of the statements
|
82
|
+
# `for` and `while`.
|
83
|
+
# Also covers their async counterparts
|
84
|
+
elif (
|
85
|
+
node_type is ast.For or node_type is ast.While or node_type is ast.AsyncFor
|
86
|
+
):
|
87
|
+
_modify_ast_subtree(node)
|
88
|
+
_modify_ast_subtree(node, "orelse")
|
89
|
+
|
90
|
+
# Recursively parses methods in a class.
|
91
|
+
elif node_type is ast.ClassDef:
|
92
|
+
for inner_node in node.body:
|
93
|
+
if type(inner_node) in {ast.FunctionDef, ast.AsyncFunctionDef}:
|
94
|
+
_modify_ast_subtree(inner_node)
|
95
|
+
|
96
|
+
# Recursively parses the contents of try statements,
|
97
|
+
# all their handlers (except and else) and the finally body
|
98
|
+
elif node_type is ast.Try or (
|
99
|
+
sys.version_info >= (3, 11) and node_type is ast.TryStar
|
100
|
+
):
|
101
|
+
_modify_ast_subtree(node)
|
102
|
+
_modify_ast_subtree(node, body_attr="finalbody")
|
103
|
+
_modify_ast_subtree(node, body_attr="orelse")
|
104
|
+
for handler_node in node.handlers:
|
105
|
+
_modify_ast_subtree(handler_node)
|
106
|
+
|
107
|
+
# Recursively parses if blocks, as well as their else/elif blocks
|
108
|
+
# (else/elif are both mapped to orelse)
|
109
|
+
# it intentionally does not parse the test expression.
|
110
|
+
elif node_type is ast.If:
|
111
|
+
_modify_ast_subtree(node)
|
112
|
+
_modify_ast_subtree(node, "orelse")
|
113
|
+
|
114
|
+
elif sys.version_info >= (3, 10) and node_type is ast.Match:
|
115
|
+
for case_node in node.cases:
|
116
|
+
_modify_ast_subtree(case_node)
|
117
|
+
|
118
|
+
# Convert standalone expression nodes to st.write
|
119
|
+
elif node_type is ast.Expr:
|
120
|
+
value = _get_st_write_from_expr(
|
121
|
+
node,
|
122
|
+
i,
|
123
|
+
parent_type=type(tree),
|
124
|
+
is_root=is_root,
|
125
|
+
is_last_expr=(i == len(body) - 1),
|
126
|
+
file_ends_in_semicolon=file_ends_in_semicolon,
|
127
|
+
)
|
128
|
+
if value is not None:
|
129
|
+
node.value = value
|
130
|
+
|
131
|
+
if is_root:
|
132
|
+
# Import Streamlit so we can use it in the new_value above.
|
133
|
+
_insert_import_statement(tree)
|
134
|
+
|
135
|
+
ast.fix_missing_locations(tree)
|
136
|
+
|
137
|
+
|
138
|
+
def _insert_import_statement(tree: Any) -> None:
|
139
|
+
"""Insert Streamlit import statement at the top(ish) of the tree."""
|
140
|
+
|
141
|
+
st_import = _build_st_import_statement()
|
142
|
+
|
143
|
+
# If the 0th node is already an import statement, put the Streamlit
|
144
|
+
# import below that, so we don't break "from __future__ import".
|
145
|
+
if tree.body and type(tree.body[0]) in {ast.ImportFrom, ast.Import}:
|
146
|
+
tree.body.insert(1, st_import)
|
147
|
+
|
148
|
+
# If the 0th node is a docstring and the 1st is an import statement,
|
149
|
+
# put the Streamlit import below those, so we don't break "from
|
150
|
+
# __future__ import".
|
151
|
+
elif (
|
152
|
+
len(tree.body) > 1
|
153
|
+
and (
|
154
|
+
type(tree.body[0]) is ast.Expr
|
155
|
+
and _is_string_constant_node(tree.body[0].value)
|
156
|
+
)
|
157
|
+
and type(tree.body[1]) in {ast.ImportFrom, ast.Import}
|
158
|
+
):
|
159
|
+
tree.body.insert(2, st_import)
|
160
|
+
|
161
|
+
else:
|
162
|
+
tree.body.insert(0, st_import)
|
163
|
+
|
164
|
+
|
165
|
+
def _build_st_import_statement():
|
166
|
+
"""Build AST node for `import magic_funcs as __streamlitmagic__`."""
|
167
|
+
return ast.Import(
|
168
|
+
names=[
|
169
|
+
ast.alias(
|
170
|
+
name="streamlit.runtime.scriptrunner.magic_funcs",
|
171
|
+
asname=MAGIC_MODULE_NAME,
|
172
|
+
)
|
173
|
+
]
|
174
|
+
)
|
175
|
+
|
176
|
+
|
177
|
+
def _build_st_write_call(nodes):
|
178
|
+
"""Build AST node for `__streamlitmagic__.transparent_write(*nodes)`."""
|
179
|
+
return ast.Call(
|
180
|
+
func=ast.Attribute(
|
181
|
+
attr="transparent_write",
|
182
|
+
value=ast.Name(id=MAGIC_MODULE_NAME, ctx=ast.Load()),
|
183
|
+
ctx=ast.Load(),
|
184
|
+
),
|
185
|
+
args=nodes,
|
186
|
+
keywords=[],
|
187
|
+
)
|
188
|
+
|
189
|
+
|
190
|
+
def _get_st_write_from_expr(
|
191
|
+
node, i, parent_type, is_root, is_last_expr, file_ends_in_semicolon
|
192
|
+
):
|
193
|
+
# Don't wrap function calls
|
194
|
+
# (Unless the function call happened at the end of the root node, AND
|
195
|
+
# magic.displayLastExprIfNoSemicolon is True. This allows us to support notebook-like
|
196
|
+
# behavior, where we display the last function in a cell)
|
197
|
+
if type(node.value) is ast.Call and not _is_displayable_last_expr(
|
198
|
+
is_root, is_last_expr, file_ends_in_semicolon
|
199
|
+
):
|
200
|
+
return None
|
201
|
+
|
202
|
+
# Don't wrap DocString nodes
|
203
|
+
# (Unless magic.displayRootDocString, in which case we do wrap the root-level
|
204
|
+
# docstring with st.write. This allows us to support notebook-like behavior
|
205
|
+
# where you can have a cell with a markdown string)
|
206
|
+
if _is_docstring_node(
|
207
|
+
node.value, i, parent_type
|
208
|
+
) and not _should_display_docstring_like_node_anyway(is_root):
|
209
|
+
return None
|
210
|
+
|
211
|
+
# Don't wrap yield nodes
|
212
|
+
if type(node.value) is ast.Yield or type(node.value) is ast.YieldFrom:
|
213
|
+
return None
|
214
|
+
|
215
|
+
# Don't wrap await nodes
|
216
|
+
if type(node.value) is ast.Await:
|
217
|
+
return None
|
218
|
+
|
219
|
+
# If tuple, call st.write(*the_tuple). This allows us to add a comma at the end of a
|
220
|
+
# statement to turn it into an expression that should be st-written. Ex:
|
221
|
+
# "np.random.randn(1000, 2),"
|
222
|
+
args = node.value.elts if type(node.value) is ast.Tuple else [node.value]
|
223
|
+
return _build_st_write_call(args)
|
224
|
+
|
225
|
+
|
226
|
+
def _is_string_constant_node(node) -> bool:
|
227
|
+
return isinstance(node, ast.Constant) and isinstance(node.value, str)
|
228
|
+
|
229
|
+
|
230
|
+
def _is_docstring_node(node, node_index, parent_type) -> bool:
|
231
|
+
return (
|
232
|
+
node_index == 0
|
233
|
+
and _is_string_constant_node(node)
|
234
|
+
and parent_type in {ast.FunctionDef, ast.AsyncFunctionDef, ast.Module}
|
235
|
+
)
|
236
|
+
|
237
|
+
|
238
|
+
def _does_file_end_in_semicolon(tree, code: str) -> bool:
|
239
|
+
file_ends_in_semicolon = False
|
240
|
+
|
241
|
+
# Avoid spending time with this operation if magic.displayLastExprIfNoSemicolon is
|
242
|
+
# not set.
|
243
|
+
if config.get_option("magic.displayLastExprIfNoSemicolon"):
|
244
|
+
if len(tree.body) == 0:
|
245
|
+
return False
|
246
|
+
|
247
|
+
last_line_num = getattr(tree.body[-1], "end_lineno", None)
|
248
|
+
|
249
|
+
if last_line_num is not None:
|
250
|
+
last_line_str: str = code.split("\n")[last_line_num - 1]
|
251
|
+
file_ends_in_semicolon = last_line_str.strip(" ").endswith(";")
|
252
|
+
|
253
|
+
return file_ends_in_semicolon
|
254
|
+
|
255
|
+
|
256
|
+
def _is_displayable_last_expr(
|
257
|
+
is_root: bool, is_last_expr: bool, file_ends_in_semicolon: bool
|
258
|
+
) -> bool:
|
259
|
+
return (
|
260
|
+
# This is a "displayable last expression" if...
|
261
|
+
# ...it's actually the last expression...
|
262
|
+
is_last_expr
|
263
|
+
# ...in the root scope...
|
264
|
+
and is_root
|
265
|
+
# ...it does not end in a semicolon...
|
266
|
+
and not file_ends_in_semicolon
|
267
|
+
# ...and this config option is telling us to show it
|
268
|
+
and config.get_option("magic.displayLastExprIfNoSemicolon")
|
269
|
+
)
|
270
|
+
|
271
|
+
|
272
|
+
def _should_display_docstring_like_node_anyway(is_root: bool) -> bool:
|
273
|
+
return config.get_option("magic.displayRootDocString") and is_root
|
@@ -0,0 +1,32 @@
|
|
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
|
+
from typing import Any
|
18
|
+
|
19
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
20
|
+
|
21
|
+
|
22
|
+
@gather_metrics("magic")
|
23
|
+
def transparent_write(*args: Any) -> Any:
|
24
|
+
"""The function that gets magic-ified into Streamlit apps.
|
25
|
+
This is just st.write, but returns the arguments you passed to it.
|
26
|
+
"""
|
27
|
+
import streamlit as st
|
28
|
+
|
29
|
+
st.write(*args)
|
30
|
+
if len(args) == 1:
|
31
|
+
return args[0]
|
32
|
+
return args
|