streamlit 1.53.0__py3-none-any.whl → 1.54.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- streamlit/__init__.py +1 -31
- streamlit/auth_util.py +91 -2
- streamlit/cli_util.py +3 -2
- streamlit/commands/echo.py +2 -2
- streamlit/commands/execution_control.py +1 -1
- streamlit/commands/logo.py +76 -24
- streamlit/commands/navigation.py +1 -1
- streamlit/components/types/base_custom_component.py +0 -2
- streamlit/components/v1/custom_component.py +0 -2
- streamlit/components/v2/bidi_component/main.py +2 -2
- streamlit/components/v2/component_path_utils.py +17 -29
- streamlit/components/v2/manifest_scanner.py +8 -3
- streamlit/components/v2/presentation.py +1 -1
- streamlit/config.py +57 -13
- streamlit/config_util.py +5 -5
- streamlit/connections/snowflake_connection.py +6 -3
- streamlit/dataframe_util.py +10 -10
- streamlit/deprecation_util.py +19 -1
- streamlit/elements/arrow.py +18 -8
- streamlit/elements/deck_gl_json_chart.py +6 -2
- streamlit/elements/exception.py +4 -2
- streamlit/elements/form.py +1 -1
- streamlit/elements/layouts.py +1 -1
- streamlit/elements/lib/built_in_chart_utils.py +36 -13
- streamlit/elements/lib/color_util.py +21 -2
- streamlit/elements/lib/column_config_utils.py +9 -7
- streamlit/elements/lib/dialog.py +1 -1
- streamlit/elements/lib/image_utils.py +5 -5
- streamlit/elements/lib/layout_utils.py +1 -1
- streamlit/elements/lib/options_selector_utils.py +112 -18
- streamlit/elements/lib/policies.py +1 -1
- streamlit/elements/lib/streamlit_plotly_theme.py +9 -11
- streamlit/elements/lib/utils.py +1 -1
- streamlit/elements/map.py +6 -6
- streamlit/elements/plotly_chart.py +2 -2
- streamlit/elements/toast.py +1 -1
- streamlit/elements/vega_charts.py +30 -7
- streamlit/elements/widgets/button.py +3 -3
- streamlit/elements/widgets/button_group.py +3 -3
- streamlit/elements/widgets/chat.py +1 -1
- streamlit/elements/widgets/data_editor.py +6 -6
- streamlit/elements/widgets/multiselect.py +32 -8
- streamlit/elements/widgets/number_input.py +1 -1
- streamlit/elements/widgets/radio.py +91 -31
- streamlit/elements/widgets/select_slider.py +123 -37
- streamlit/elements/widgets/selectbox.py +38 -16
- streamlit/elements/widgets/slider.py +5 -5
- streamlit/elements/widgets/time_widgets.py +150 -18
- streamlit/elements/write.py +2 -3
- streamlit/env_util.py +1 -1
- streamlit/errors.py +2 -14
- streamlit/external/langchain/streamlit_callback_handler.py +1 -1
- streamlit/hello/dataframe_demo.py +1 -1
- streamlit/hello/plotting_demo.py +19 -12
- streamlit/path_security.py +98 -0
- streamlit/proto/Alert_pb2.py +2 -3
- streamlit/proto/AppPage_pb2.py +2 -3
- streamlit/proto/ArrowData_pb2.py +2 -3
- streamlit/proto/ArrowNamedDataSet_pb2.py +2 -3
- streamlit/proto/ArrowVegaLiteChart_pb2.py +2 -3
- streamlit/proto/Arrow_pb2.py +2 -3
- streamlit/proto/AudioInput_pb2.py +2 -3
- streamlit/proto/Audio_pb2.py +2 -3
- streamlit/proto/AuthRedirect_pb2.py +2 -3
- streamlit/proto/AutoRerun_pb2.py +2 -3
- streamlit/proto/BackMsg_pb2.py +2 -3
- streamlit/proto/Balloons_pb2.py +2 -3
- streamlit/proto/BidiComponent_pb2.py +2 -3
- streamlit/proto/Block_pb2.py +2 -3
- streamlit/proto/BokehChart_pb2.py +2 -3
- streamlit/proto/ButtonGroup_pb2.py +2 -3
- streamlit/proto/ButtonLikeIconPosition_pb2.py +2 -3
- streamlit/proto/Button_pb2.py +2 -3
- streamlit/proto/CameraInput_pb2.py +2 -3
- streamlit/proto/ChatInput_pb2.py +2 -3
- streamlit/proto/Checkbox_pb2.py +2 -3
- streamlit/proto/ClientState_pb2.py +2 -3
- streamlit/proto/Code_pb2.py +2 -3
- streamlit/proto/ColorPicker_pb2.py +2 -3
- streamlit/proto/Common_pb2.py +2 -3
- streamlit/proto/Components_pb2.py +2 -3
- streamlit/proto/DataFrame_pb2.py +2 -3
- streamlit/proto/DateInput_pb2.py +2 -3
- streamlit/proto/DateTimeInput_pb2.py +2 -3
- streamlit/proto/DeckGlJsonChart_pb2.py +2 -3
- streamlit/proto/Delta_pb2.py +2 -3
- streamlit/proto/DocString_pb2.py +2 -3
- streamlit/proto/DownloadButton_pb2.py +2 -3
- streamlit/proto/Element_pb2.py +2 -3
- streamlit/proto/Empty_pb2.py +2 -3
- streamlit/proto/Exception_pb2.py +2 -3
- streamlit/proto/Favicon_pb2.py +2 -3
- streamlit/proto/FileUploader_pb2.py +2 -3
- streamlit/proto/ForwardMsg_pb2.py +2 -3
- streamlit/proto/GapSize_pb2.py +2 -3
- streamlit/proto/GitInfo_pb2.py +2 -3
- streamlit/proto/GraphVizChart_pb2.py +2 -3
- streamlit/proto/Heading_pb2.py +2 -3
- streamlit/proto/HeightConfig_pb2.py +2 -3
- streamlit/proto/Html_pb2.py +2 -3
- streamlit/proto/IFrame_pb2.py +2 -3
- streamlit/proto/Image_pb2.py +2 -3
- streamlit/proto/Json_pb2.py +2 -3
- streamlit/proto/LabelVisibilityMessage_pb2.py +2 -3
- streamlit/proto/LinkButton_pb2.py +2 -3
- streamlit/proto/Logo_pb2.py +6 -5
- streamlit/proto/Logo_pb2.pyi +25 -1
- streamlit/proto/Markdown_pb2.py +2 -3
- streamlit/proto/Metric_pb2.py +2 -3
- streamlit/proto/MetricsEvent_pb2.py +2 -3
- streamlit/proto/MultiSelect_pb2.py +2 -3
- streamlit/proto/NamedDataSet_pb2.py +2 -3
- streamlit/proto/Navigation_pb2.py +2 -3
- streamlit/proto/NewSession_pb2.py +25 -24
- streamlit/proto/NewSession_pb2.pyi +28 -2
- streamlit/proto/NumberInput_pb2.py +2 -3
- streamlit/proto/PageConfig_pb2.py +2 -3
- streamlit/proto/PageInfo_pb2.py +2 -3
- streamlit/proto/PageLink_pb2.py +2 -3
- streamlit/proto/PageNotFound_pb2.py +2 -3
- streamlit/proto/PageProfile_pb2.py +2 -3
- streamlit/proto/PagesChanged_pb2.py +2 -3
- streamlit/proto/ParentMessage_pb2.py +2 -3
- streamlit/proto/PlotlyChart_pb2.py +2 -3
- streamlit/proto/Progress_pb2.py +2 -3
- streamlit/proto/Radio_pb2.py +5 -4
- streamlit/proto/Radio_pb2.pyi +20 -3
- streamlit/proto/RootContainer_pb2.py +2 -3
- streamlit/proto/Selectbox_pb2.py +2 -3
- streamlit/proto/SessionEvent_pb2.py +2 -3
- streamlit/proto/SessionStatus_pb2.py +2 -3
- streamlit/proto/Skeleton_pb2.py +2 -3
- streamlit/proto/Slider_pb2.py +7 -8
- streamlit/proto/Slider_pb2.pyi +9 -1
- streamlit/proto/Snow_pb2.py +2 -3
- streamlit/proto/Space_pb2.py +2 -3
- streamlit/proto/Spinner_pb2.py +2 -3
- streamlit/proto/TextAlignmentConfig_pb2.py +2 -3
- streamlit/proto/TextArea_pb2.py +2 -3
- streamlit/proto/TextInput_pb2.py +2 -3
- streamlit/proto/Text_pb2.py +2 -3
- streamlit/proto/TimeInput_pb2.py +2 -3
- streamlit/proto/Toast_pb2.py +2 -3
- streamlit/proto/Transient_pb2.py +2 -3
- streamlit/proto/VegaLiteChart_pb2.py +2 -3
- streamlit/proto/Video_pb2.py +2 -3
- streamlit/proto/WidgetStates_pb2.py +2 -3
- streamlit/proto/WidthConfig_pb2.py +2 -3
- streamlit/proto/openmetrics_data_model_pb2.py +2 -3
- streamlit/runtime/app_session.py +106 -60
- streamlit/runtime/caching/cache_data_api.py +3 -3
- streamlit/runtime/caching/cache_errors.py +0 -2
- streamlit/runtime/caching/cache_resource_api.py +1 -1
- streamlit/runtime/caching/cache_utils.py +2 -2
- streamlit/runtime/caching/hashing.py +1 -3
- streamlit/runtime/caching/storage/cache_storage_protocol.py +0 -3
- streamlit/runtime/connection_factory.py +1 -1
- streamlit/runtime/credentials.py +2 -2
- streamlit/runtime/metrics_util.py +3 -3
- streamlit/runtime/runtime.py +6 -6
- streamlit/runtime/scriptrunner/script_runner.py +17 -0
- streamlit/runtime/scriptrunner_utils/exceptions.py +0 -4
- streamlit/runtime/scriptrunner_utils/script_run_context.py +13 -31
- streamlit/runtime/secrets.py +3 -4
- streamlit/runtime/state/__init__.py +7 -1
- streamlit/runtime/state/common.py +13 -0
- streamlit/runtime/state/query_params.py +493 -24
- streamlit/runtime/state/session_state.py +179 -4
- streamlit/runtime/state/widgets.py +26 -1
- streamlit/runtime/stats.py +1 -10
- streamlit/static/index.html +1 -1
- streamlit/static/manifest.json +304 -304
- streamlit/static/static/js/{ErrorOutline.esm.Cxoit62D.js → ErrorOutline.esm.BWk6F-Tz.js} +1 -1
- streamlit/static/static/js/{FileDownload.esm.Cym2KVOR.js → FileDownload.esm.AllYUuOW.js} +1 -1
- streamlit/static/static/js/{FileHelper.C47VLeXF.js → FileHelper.BvVTNdmy.js} +1 -1
- streamlit/static/static/js/{FormClearHelper.CUrwwEeX.js → FormClearHelper.C__r5Llk.js} +1 -1
- streamlit/static/static/js/{InputInstructions.DyVOE42q.js → InputInstructions.DOtkdOMV.js} +1 -1
- streamlit/static/static/js/Particles.DCsqQZlE.js +1 -0
- streamlit/static/static/js/{ProgressBar.qKdiDYyx.js → ProgressBar.DLCRvt4m.js} +2 -2
- streamlit/static/static/js/{StreamlitSyntaxHighlighter.DUPp9dS3.js → StreamlitSyntaxHighlighter.CYFWoZHb.js} +1 -1
- streamlit/static/static/js/{TableChart.esm.C_g2CvCE.js → TableChart.esm.D6ydHcIm.js} +1 -1
- streamlit/static/static/js/Toolbar.BHDNzWBx.js +1 -0
- streamlit/static/static/js/{WidgetLabelHelpIconInline.Dy4yV6I2.js → WidgetLabelHelpIconInline.DEXBrVlc.js} +1 -1
- streamlit/static/static/js/{base-input.DQAb60v0.js → base-input.TSQjctlq.js} +4 -4
- streamlit/static/static/js/{checkbox.C0HE0ojW.js → checkbox.BKgfzJZV.js} +1 -1
- streamlit/static/static/js/{createDownloadLinkElement.DBMfH8_e.js → createDownloadLinkElement.CG7nr2a4.js} +1 -1
- streamlit/static/static/js/{data-grid-overlay-editor.CSZWem5Q.js → data-grid-overlay-editor.ChXO__lP.js} +1 -1
- streamlit/static/static/js/{downloader.Bp8c7mYD.js → downloader.DJ3R_zWA.js} +1 -1
- streamlit/static/static/js/embed.u3PPfLkw.js +193 -0
- streamlit/static/static/js/{es6.j7akTCaI.js → es6.C5Mfy8nd.js} +2 -2
- streamlit/static/static/js/{formatNumber.CfuUiEpF.js → formatNumber.CMRgW9EJ.js} +1 -1
- streamlit/static/static/js/{iconPosition.BVSTKfGd.js → iconPosition.B4EEXI3E.js} +1 -1
- streamlit/static/static/js/{iframeResizer.contentWindow.BZ3lugzo.js → iframeResizer.contentWindow.WSvOiTW0.js} +1 -1
- streamlit/static/static/js/index.-FOBV3nz.js +1 -0
- streamlit/static/static/js/{index.D0tXFTaW.js → index.-NF8OSF5.js} +1 -1
- streamlit/static/static/js/{index.Dk0CU4R6.js → index.4cBg8kn5.js} +1 -1
- streamlit/static/static/js/{index.DtZTtufl.js → index.B0pzzCsH.js} +1 -1
- streamlit/static/static/js/{index.DSaE74nc.js → index.BID6ND5j.js} +2 -2
- streamlit/static/static/js/index.BMp5bGjh.js +1 -0
- streamlit/static/static/js/{index.CAMxgVFm.js → index.BQcmlvas.js} +1 -1
- streamlit/static/static/js/{index.C0F0G-wg.js → index.BRcmclgI.js} +1 -1
- streamlit/static/static/js/index.BaUZR4IG.js +1 -0
- streamlit/static/static/js/{index.Cow0Hs9V.js → index.BbMJj4PN.js} +1 -1
- streamlit/static/static/js/{index.iboGgrkh.js → index.BdCTJtq3.js} +2 -2
- streamlit/static/static/js/index.BdETLMuI.js +1 -0
- streamlit/static/static/js/index.BnKMWhs1.js +1 -0
- streamlit/static/static/js/index.Br1kXwQW.js +2 -0
- streamlit/static/static/js/{index.B2fTHpId.js → index.Bt2olRE4.js} +1 -1
- streamlit/static/static/js/{index.DBIRzFM7.js → index.Bxwsv5T8.js} +1 -1
- streamlit/static/static/js/index.C4KskYz6.js +1 -0
- streamlit/static/static/js/{index.BgCYNmov.js → index.C6bmbXk0.js} +1 -1
- streamlit/static/static/js/{index.7S_sCSRx.js → index.CEfKfbta.js} +1 -1
- streamlit/static/static/js/index.CIuaA8q0.js +2 -0
- streamlit/static/static/js/{index.CWAvu1Qu.js → index.CV1sObFX.js} +1 -1
- streamlit/static/static/js/{index.C9QftD-S.js → index.CbR6dgaV.js} +1 -1
- streamlit/static/static/js/index.Cq6szKqJ.js +1 -0
- streamlit/static/static/js/index.CyouXqCz.js +1 -0
- streamlit/static/static/js/{index.BMFt07G_.js → index.D1NUgMFI.js} +1 -1
- streamlit/static/static/js/{index.Tq2okoAU.js → index.D7SWG4Om.js} +1 -1
- streamlit/static/static/js/{index.DgJeIFb5.js → index.DAYPEwLI.js} +1 -1
- streamlit/static/static/js/index.DKS75Vfg.js +11 -0
- streamlit/static/static/js/{index.FfR9SXQv.js → index.DOXrMIxB.js} +1 -1
- streamlit/static/static/js/{index.BiVJWMS-.js → index.DOzYX8yS.js} +3 -3
- streamlit/static/static/js/{index.nEa8y_He.js → index.DRFMYcC4.js} +4 -4
- streamlit/static/static/js/{index.dgs1TGpP.js → index.Divl5FCY.js} +1 -1
- streamlit/static/static/js/{index.95DldRtG.js → index.DjAJ_CUa.js} +1 -1
- streamlit/static/static/js/{index.Z0mB4zBp.js → index.Dncue2pm.js} +33 -33
- streamlit/static/static/js/{index.DFT9nVK6.js → index.Drusyo5m.js} +48 -48
- streamlit/static/static/js/{index.1PD6f3vh.js → index.DuUyDGnP.js} +1 -1
- streamlit/static/static/js/{index.DpU0Bc2F.js → index.DvgT2rB2.js} +223 -223
- streamlit/static/static/js/{index.Bukztsaz.js → index.DzutABu5.js} +2 -2
- streamlit/static/static/js/index.Dzw2iPzi.js +3 -0
- streamlit/static/static/js/{index.DYkkO_of.js → index.FsTmxLbT.js} +1 -1
- streamlit/static/static/js/{index.CTQ8QcOV.js → index.OIwPqGYN.js} +1 -1
- streamlit/static/static/js/{index.NtSfVVJe.js → index.RXLN7YFT.js} +2 -2
- streamlit/static/static/js/{index.BU3d_gp1.js → index.YYb2u0jk.js} +2 -2
- streamlit/static/static/js/{index.BXfSsjdq.js → index.h8ejt-W3.js} +1 -1
- streamlit/static/static/js/{index.gPUFpUqs.js → index.lFMCi9am.js} +1 -1
- streamlit/static/static/js/{index.BDA5l7b9.js → index.pOgf4cEj.js} +1 -1
- streamlit/static/static/js/index.s_E0s7LB.js +188 -0
- streamlit/static/static/js/{index.DysJZEAt.js → index.xLCbzoqj.js} +1 -1
- streamlit/static/static/js/{input.Pz8Lwzsi.js → input.BLG7kWaj.js} +2 -2
- streamlit/static/static/js/{main.BeiYkHRo.js → main.D_CmqChN.js} +1 -1
- streamlit/static/static/js/{memory.Dyx_JBbb.js → memory.T8u9KqIQ.js} +1 -1
- streamlit/static/static/js/{number-overlay-editor.NLIdF6b9.js → number-overlay-editor.BKBSXkAM.js} +2 -2
- streamlit/static/static/js/{pandasStylerUtils.DsNlDEqS.js → pandasStylerUtils.B4tLYMwS.js} +1 -1
- streamlit/static/static/js/{sandbox.bER7qtR1.js → sandbox.jRlkcPem.js} +1 -1
- streamlit/static/static/js/{styled-components.DcoFBb7G.js → styled-components.D2QhNwzd.js} +1 -1
- streamlit/static/static/js/{throttle.DOaQWO4U.js → throttle.Cyw_V0Dq.js} +1 -1
- streamlit/static/static/js/{timepicker.RjHB2IT4.js → timepicker.PzyuDDWl.js} +1 -1
- streamlit/static/static/js/{toConsumableArray.DFAIugL0.js → toConsumableArray.gE9fMkLj.js} +1 -1
- streamlit/static/static/js/uniqueId.B1GeHnT1.js +1 -0
- streamlit/static/static/js/{useBasicWidgetState.CTtyymrp.js → useBasicWidgetState.DFklfao0.js} +1 -1
- streamlit/static/static/js/{useIntlLocale.DG5haQGX.js → useIntlLocale.C3tUGWTU.js} +8 -8
- streamlit/static/static/js/{useTextInputAutoExpand.Cnfcep1Z.js → useTextInputAutoExpand.D9nU_y-e.js} +1 -1
- streamlit/static/static/js/useUpdateUiValue.ClTdrkJN.js +1 -0
- streamlit/static/static/js/{useWaveformController.DozaayUB.js → useWaveformController.lzTbjMW2.js} +1 -1
- streamlit/static/static/js/{withCalculatedWidth.SNNFFxhJ.js → withCalculatedWidth.Dxs9I5Oe.js} +1 -1
- streamlit/static/static/js/{withFullScreenWrapper.Dl2f8_gt.js → withFullScreenWrapper.DfpAcJxf.js} +1 -1
- streamlit/string_util.py +2 -2
- streamlit/testing/v1/app_test.py +1 -1
- streamlit/testing/v1/element_tree.py +33 -20
- streamlit/type_util.py +2 -2
- streamlit/url_util.py +2 -2
- streamlit/user_info.py +2 -41
- streamlit/util.py +1 -1
- streamlit/watcher/event_based_path_watcher.py +37 -7
- streamlit/watcher/path_watcher.py +61 -2
- streamlit/watcher/util.py +26 -10
- streamlit/web/bootstrap.py +16 -4
- streamlit/web/cli.py +1 -4
- streamlit/web/server/app_discovery.py +2 -1
- streamlit/web/server/app_static_file_handler.py +9 -0
- streamlit/web/server/bidi_component_request_handler.py +4 -4
- streamlit/web/server/component_file_utils.py +14 -6
- streamlit/web/server/component_request_handler.py +2 -2
- streamlit/web/server/oauth_authlib_routes.py +14 -42
- streamlit/web/server/server.py +1 -1
- streamlit/web/server/server_util.py +23 -1
- streamlit/web/server/starlette/starlette_app.py +7 -1
- streamlit/web/server/starlette/starlette_auth_routes.py +94 -16
- streamlit/web/server/starlette/starlette_path_security_middleware.py +97 -0
- streamlit/web/server/starlette/starlette_routes.py +16 -9
- streamlit/web/server/starlette/starlette_server.py +2 -2
- streamlit/web/server/starlette/starlette_static_routes.py +14 -4
- streamlit/web/server/stats_request_handler.py +1 -3
- {streamlit-1.53.0.dist-info → streamlit-1.54.0.dist-info}/METADATA +10 -25
- {streamlit-1.53.0.dist-info → streamlit-1.54.0.dist-info}/RECORD +291 -291
- {streamlit-1.53.0.dist-info → streamlit-1.54.0.dist-info}/WHEEL +1 -1
- streamlit/commands/experimental_query_params.py +0 -169
- streamlit/static/static/js/Particles.D5ZUTvE6.js +0 -1
- streamlit/static/static/js/Toolbar.BbO8bxwz.js +0 -1
- streamlit/static/static/js/embed.DQBlGL9Q.js +0 -195
- streamlit/static/static/js/index.5CsPRetw.js +0 -1
- streamlit/static/static/js/index.BGgra9Bb.js +0 -188
- streamlit/static/static/js/index.BGzJYcHz.js +0 -1
- streamlit/static/static/js/index.BNpEDrb2.js +0 -1
- streamlit/static/static/js/index.Bk5wGJXh.js +0 -1
- streamlit/static/static/js/index.By8GIgDH.js +0 -1
- streamlit/static/static/js/index.C8VoW8Ph.js +0 -1
- streamlit/static/static/js/index.CZzy-Gct.js +0 -1
- streamlit/static/static/js/index.CeFdbzfR.js +0 -11
- streamlit/static/static/js/index.CkmNfvPD.js +0 -1
- streamlit/static/static/js/index.CsmTnJl4.js +0 -3
- streamlit/static/static/js/index.DZGCJu4I.js +0 -2
- streamlit/static/static/js/index.svncz-Ad.js +0 -2
- streamlit/static/static/js/uniqueId.DEvFPH9n.js +0 -1
- streamlit/static/static/js/useUpdateUiValue.BWnXwmrp.js +0 -1
- streamlit-1.53.0.data/scripts/streamlit.cmd +0 -16
- {streamlit-1.53.0.dist-info → streamlit-1.54.0.dist-info}/entry_points.txt +0 -0
- {streamlit-1.53.0.dist-info → streamlit-1.54.0.dist-info}/top_level.txt +0 -0
|
@@ -127,7 +127,7 @@ def _convert_datelike_to_date(
|
|
|
127
127
|
if isinstance(value, date):
|
|
128
128
|
return value
|
|
129
129
|
|
|
130
|
-
if value
|
|
130
|
+
if value == "today":
|
|
131
131
|
return datetime.now().date()
|
|
132
132
|
|
|
133
133
|
if isinstance(value, str):
|
|
@@ -472,6 +472,109 @@ class TimeInputSerde:
|
|
|
472
472
|
return time.strftime(v, "%H:%M")
|
|
473
473
|
|
|
474
474
|
|
|
475
|
+
def _validate_date_value(
|
|
476
|
+
current_value: DateWidgetReturn,
|
|
477
|
+
parsed_values: _DateInputValues,
|
|
478
|
+
has_explicit_bounds: bool,
|
|
479
|
+
) -> tuple[DateWidgetReturn, bool]:
|
|
480
|
+
"""Validate current value against min/max bounds and reset if needed.
|
|
481
|
+
|
|
482
|
+
Only validates when has_explicit_bounds is True (user provided min_value or max_value).
|
|
483
|
+
This avoids incorrectly resetting values against computed default bounds.
|
|
484
|
+
|
|
485
|
+
Parameters
|
|
486
|
+
----------
|
|
487
|
+
current_value : DateWidgetReturn
|
|
488
|
+
The current value of the date input widget. Can be a single date, a tuple of
|
|
489
|
+
dates (for range mode), or None.
|
|
490
|
+
parsed_values : _DateInputValues
|
|
491
|
+
Parsed configuration containing min, max, default value, and whether the widget
|
|
492
|
+
is in range mode.
|
|
493
|
+
has_explicit_bounds : bool
|
|
494
|
+
Whether the user explicitly provided min_value or max_value. If False, validation
|
|
495
|
+
is skipped to avoid resetting against computed default bounds.
|
|
496
|
+
|
|
497
|
+
Returns
|
|
498
|
+
-------
|
|
499
|
+
tuple[DateWidgetReturn, bool]
|
|
500
|
+
A tuple of (validated_value, was_reset) where validated_value is either the
|
|
501
|
+
original value (if valid) or the default value (if reset was needed), and
|
|
502
|
+
was_reset indicates whether a reset occurred.
|
|
503
|
+
"""
|
|
504
|
+
value_needs_reset = False
|
|
505
|
+
|
|
506
|
+
if current_value is None or not has_explicit_bounds:
|
|
507
|
+
return current_value, value_needs_reset
|
|
508
|
+
|
|
509
|
+
# For range inputs, current_value is a tuple; for single inputs, it's a date
|
|
510
|
+
if (
|
|
511
|
+
parsed_values.is_range
|
|
512
|
+
and isinstance(current_value, tuple)
|
|
513
|
+
and len(current_value) > 0
|
|
514
|
+
):
|
|
515
|
+
# For range mode, check if any date in the tuple is outside bounds.
|
|
516
|
+
# Cast to tuple[date, ...] to satisfy the type checker after the length check.
|
|
517
|
+
non_empty_value = cast("tuple[date, ...]", current_value)
|
|
518
|
+
start_date = non_empty_value[0]
|
|
519
|
+
end_date = non_empty_value[-1] if len(non_empty_value) > 1 else start_date
|
|
520
|
+
if start_date < parsed_values.min or end_date > parsed_values.max:
|
|
521
|
+
value_needs_reset = True
|
|
522
|
+
elif not parsed_values.is_range and isinstance(current_value, date):
|
|
523
|
+
# For single date mode
|
|
524
|
+
if current_value < parsed_values.min or current_value > parsed_values.max:
|
|
525
|
+
value_needs_reset = True
|
|
526
|
+
else:
|
|
527
|
+
# Type mismatch: widget mode doesn't match current value type (e.g., range mode
|
|
528
|
+
# with a single date value or single mode with a tuple). Reset to match the mode.
|
|
529
|
+
value_needs_reset = True
|
|
530
|
+
|
|
531
|
+
if not value_needs_reset:
|
|
532
|
+
return current_value, value_needs_reset
|
|
533
|
+
|
|
534
|
+
# Reset to the default value from parsed_values
|
|
535
|
+
if parsed_values.value is None or len(parsed_values.value) == 0:
|
|
536
|
+
return (() if parsed_values.is_range else None), True
|
|
537
|
+
if not parsed_values.is_range:
|
|
538
|
+
return parsed_values.value[0], True
|
|
539
|
+
return cast("DateWidgetReturn", tuple(parsed_values.value)), True
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
def _validate_datetime_value(
|
|
543
|
+
current_value: datetime | None,
|
|
544
|
+
parsed_values: _DateTimeInputValues,
|
|
545
|
+
has_explicit_bounds: bool,
|
|
546
|
+
) -> tuple[datetime | None, bool]:
|
|
547
|
+
"""Validate current datetime value against min/max bounds and determine if reset is needed.
|
|
548
|
+
|
|
549
|
+
Only validates when has_explicit_bounds is True (user provided min_value or max_value).
|
|
550
|
+
This avoids incorrectly determining if reset is needed against computed default bounds.
|
|
551
|
+
|
|
552
|
+
Parameters
|
|
553
|
+
----------
|
|
554
|
+
current_value : datetime | None
|
|
555
|
+
The current value of the datetime input widget.
|
|
556
|
+
parsed_values : _DateTimeInputValues
|
|
557
|
+
Parsed configuration containing min, max, and default value.
|
|
558
|
+
has_explicit_bounds : bool
|
|
559
|
+
Whether the user explicitly provided min_value or max_value. If False, validation
|
|
560
|
+
is skipped to avoid resetting against computed default bounds.
|
|
561
|
+
|
|
562
|
+
Returns
|
|
563
|
+
-------
|
|
564
|
+
tuple[datetime | None, bool]
|
|
565
|
+
A tuple of (validated_value, was_reset) where validated_value is either the
|
|
566
|
+
original value (if valid) or the default value (if reset was needed), and
|
|
567
|
+
was_reset indicates whether a reset occurred.
|
|
568
|
+
"""
|
|
569
|
+
if current_value is None or not has_explicit_bounds:
|
|
570
|
+
return current_value, False
|
|
571
|
+
|
|
572
|
+
if current_value < parsed_values.min or current_value > parsed_values.max:
|
|
573
|
+
return parsed_values.value, True
|
|
574
|
+
|
|
575
|
+
return current_value, False
|
|
576
|
+
|
|
577
|
+
|
|
475
578
|
@dataclass
|
|
476
579
|
class DateInputSerde:
|
|
477
580
|
value: _DateInputValues
|
|
@@ -1065,9 +1168,10 @@ class TimeWidgetsMixin:
|
|
|
1065
1168
|
element_id = compute_and_register_element_id(
|
|
1066
1169
|
"date_time_input",
|
|
1067
1170
|
user_key=key,
|
|
1068
|
-
#
|
|
1069
|
-
#
|
|
1070
|
-
|
|
1171
|
+
# Format is whitelisted because of a bug in the BaseWeb date input component.
|
|
1172
|
+
# Step is whitelisted because it invalidates the current selection.
|
|
1173
|
+
# We might be able to unlock this as a follow-up.
|
|
1174
|
+
key_as_main_identity={"format", "step"},
|
|
1071
1175
|
dg=self.dg,
|
|
1072
1176
|
label=label,
|
|
1073
1177
|
value=value_for_id,
|
|
@@ -1078,7 +1182,9 @@ class TimeWidgetsMixin:
|
|
|
1078
1182
|
step=step,
|
|
1079
1183
|
width=width,
|
|
1080
1184
|
)
|
|
1081
|
-
del
|
|
1185
|
+
# Track if user explicitly set bounds (before del)
|
|
1186
|
+
has_explicit_bounds = min_value is not None or max_value is not None
|
|
1187
|
+
del value, min_value, max_value
|
|
1082
1188
|
|
|
1083
1189
|
if not bool(ALLOWED_DATE_FORMATS.match(format)):
|
|
1084
1190
|
raise StreamlitAPIException(
|
|
@@ -1141,8 +1247,20 @@ class TimeWidgetsMixin:
|
|
|
1141
1247
|
value_type="string_array_value",
|
|
1142
1248
|
)
|
|
1143
1249
|
|
|
1144
|
-
|
|
1145
|
-
|
|
1250
|
+
# Validate the current value against the new min/max bounds.
|
|
1251
|
+
# Only validate when user explicitly provided min_value or max_value.
|
|
1252
|
+
current_value, value_needs_reset = _validate_datetime_value(
|
|
1253
|
+
widget_state.value, datetime_values, has_explicit_bounds
|
|
1254
|
+
)
|
|
1255
|
+
|
|
1256
|
+
if value_needs_reset and key is not None:
|
|
1257
|
+
# Update session_state so subsequent accesses in this run
|
|
1258
|
+
# return the corrected value. Use reset_state_value to avoid
|
|
1259
|
+
# the "cannot be modified after widget instantiated" error.
|
|
1260
|
+
get_session_state().reset_state_value(key, current_value)
|
|
1261
|
+
|
|
1262
|
+
if value_needs_reset or widget_state.value_changed:
|
|
1263
|
+
date_time_input_proto.value[:] = serde.serialize(current_value)
|
|
1146
1264
|
date_time_input_proto.set_value = True
|
|
1147
1265
|
|
|
1148
1266
|
validate_width(width)
|
|
@@ -1151,7 +1269,7 @@ class TimeWidgetsMixin:
|
|
|
1151
1269
|
self.dg._enqueue(
|
|
1152
1270
|
"date_time_input", date_time_input_proto, layout_config=layout_config
|
|
1153
1271
|
)
|
|
1154
|
-
return
|
|
1272
|
+
return current_value
|
|
1155
1273
|
|
|
1156
1274
|
@overload
|
|
1157
1275
|
def date_input(
|
|
@@ -1467,7 +1585,7 @@ class TimeWidgetsMixin:
|
|
|
1467
1585
|
parsed_min_date = parse_date_deterministic_for_id(min_value)
|
|
1468
1586
|
parsed_max_date = parse_date_deterministic_for_id(max_value)
|
|
1469
1587
|
|
|
1470
|
-
parsed: str |
|
|
1588
|
+
parsed: str | list[str | None] | None
|
|
1471
1589
|
if value == "today":
|
|
1472
1590
|
parsed = None
|
|
1473
1591
|
elif isinstance(value, Sequence):
|
|
@@ -1480,12 +1598,10 @@ class TimeWidgetsMixin:
|
|
|
1480
1598
|
element_id = compute_and_register_element_id(
|
|
1481
1599
|
"date_input",
|
|
1482
1600
|
user_key=key,
|
|
1483
|
-
# Ensure stable ID when key is provided
|
|
1484
|
-
#
|
|
1485
|
-
#
|
|
1486
|
-
|
|
1487
|
-
# So, we whitelist it for now until we migrate this away from baseweb.
|
|
1488
|
-
key_as_main_identity={"min_value", "max_value", "format"},
|
|
1601
|
+
# Ensure stable ID when key is provided. Only format is whitelisted because
|
|
1602
|
+
# there is a bug in baseweb where changing the format dynamically leads to
|
|
1603
|
+
# a wrongly formatted date. min_value and max_value support dynamic changes.
|
|
1604
|
+
key_as_main_identity={"format"},
|
|
1489
1605
|
dg=self.dg,
|
|
1490
1606
|
label=label,
|
|
1491
1607
|
value=parsed,
|
|
@@ -1508,6 +1624,9 @@ class TimeWidgetsMixin:
|
|
|
1508
1624
|
max_value=max_value,
|
|
1509
1625
|
)
|
|
1510
1626
|
|
|
1627
|
+
# Track if user explicitly set bounds (before del)
|
|
1628
|
+
has_explicit_bounds = min_value is not None or max_value is not None
|
|
1629
|
+
|
|
1511
1630
|
if value == "today":
|
|
1512
1631
|
# We need to know if this is a single or range date_input, but don't have
|
|
1513
1632
|
# a default value, so we check if session_state can tell us.
|
|
@@ -1564,15 +1683,28 @@ class TimeWidgetsMixin:
|
|
|
1564
1683
|
value_type="string_array_value",
|
|
1565
1684
|
)
|
|
1566
1685
|
|
|
1567
|
-
|
|
1568
|
-
|
|
1686
|
+
# Validate the current value against the new min/max bounds.
|
|
1687
|
+
# Only validate when user explicitly provided min_value or max_value.
|
|
1688
|
+
current_value, value_needs_reset = _validate_date_value(
|
|
1689
|
+
widget_state.value, parsed_values, has_explicit_bounds
|
|
1690
|
+
)
|
|
1691
|
+
|
|
1692
|
+
# Reset if needed.
|
|
1693
|
+
if value_needs_reset and key is not None:
|
|
1694
|
+
# Update session_state so subsequent accesses in this run
|
|
1695
|
+
# return the corrected value. Use reset_state_value to avoid
|
|
1696
|
+
# the "cannot be modified after widget instantiated" error.
|
|
1697
|
+
get_session_state().reset_state_value(key, current_value)
|
|
1698
|
+
|
|
1699
|
+
if value_needs_reset or widget_state.value_changed:
|
|
1700
|
+
date_input_proto.value[:] = serde.serialize(current_value)
|
|
1569
1701
|
date_input_proto.set_value = True
|
|
1570
1702
|
|
|
1571
1703
|
validate_width(width)
|
|
1572
1704
|
layout_config = LayoutConfig(width=width)
|
|
1573
1705
|
|
|
1574
1706
|
self.dg._enqueue("date_input", date_input_proto, layout_config=layout_config)
|
|
1575
|
-
return
|
|
1707
|
+
return current_value
|
|
1576
1708
|
|
|
1577
1709
|
@property
|
|
1578
1710
|
def dg(self) -> DeltaGenerator:
|
streamlit/elements/write.py
CHANGED
|
@@ -56,7 +56,7 @@ HELP_TYPES: Final[tuple[type[Any], ...]] = (
|
|
|
56
56
|
)
|
|
57
57
|
|
|
58
58
|
|
|
59
|
-
class StreamingOutput(list[Any]):
|
|
59
|
+
class StreamingOutput(list[Any]): # noqa: FURB189
|
|
60
60
|
pass
|
|
61
61
|
|
|
62
62
|
|
|
@@ -178,8 +178,7 @@ class WriteMixin:
|
|
|
178
178
|
|
|
179
179
|
def flush_stream_response() -> None:
|
|
180
180
|
"""Write the full response to the app."""
|
|
181
|
-
nonlocal streamed_response
|
|
182
|
-
nonlocal stream_container
|
|
181
|
+
nonlocal streamed_response, stream_container
|
|
183
182
|
|
|
184
183
|
if streamed_response and stream_container:
|
|
185
184
|
# Replace the stream_container element the full response
|
streamlit/env_util.py
CHANGED
|
@@ -46,7 +46,7 @@ def is_repl() -> bool:
|
|
|
46
46
|
|
|
47
47
|
# <stdin> is what the basic Python REPL calls the root frame's
|
|
48
48
|
# filename, and <string> is what iPython sometimes calls it.
|
|
49
|
-
return filename in
|
|
49
|
+
return filename in {"<stdin>", "<string>"}
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
def is_executable_in_path(name: str) -> bool:
|
streamlit/errors.py
CHANGED
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
# ruff: noqa: RUF027 - We allow template strings in localizable exception messages instead of f-strings.
|
|
16
|
+
|
|
15
17
|
from __future__ import annotations
|
|
16
18
|
|
|
17
19
|
import os
|
|
@@ -32,14 +34,10 @@ class Error(Exception):
|
|
|
32
34
|
code.
|
|
33
35
|
"""
|
|
34
36
|
|
|
35
|
-
pass
|
|
36
|
-
|
|
37
37
|
|
|
38
38
|
class CustomComponentError(Error):
|
|
39
39
|
"""Exceptions thrown in the custom components code path."""
|
|
40
40
|
|
|
41
|
-
pass
|
|
42
|
-
|
|
43
41
|
|
|
44
42
|
class StreamlitComponentRegistryError(Error):
|
|
45
43
|
"""Exceptions raised while discovering or registering Streamlit components.
|
|
@@ -49,8 +47,6 @@ class StreamlitComponentRegistryError(Error):
|
|
|
49
47
|
registry.
|
|
50
48
|
"""
|
|
51
49
|
|
|
52
|
-
pass
|
|
53
|
-
|
|
54
50
|
|
|
55
51
|
class DeprecationError(Error):
|
|
56
52
|
pass
|
|
@@ -61,16 +57,12 @@ class FragmentStorageKeyError(Error, KeyError):
|
|
|
61
57
|
operation.
|
|
62
58
|
"""
|
|
63
59
|
|
|
64
|
-
pass
|
|
65
|
-
|
|
66
60
|
|
|
67
61
|
class FragmentHandledException(Exception): # noqa: N818
|
|
68
62
|
"""An exception that is raised by the fragment
|
|
69
63
|
when it has handled the exception itself.
|
|
70
64
|
"""
|
|
71
65
|
|
|
72
|
-
pass
|
|
73
|
-
|
|
74
66
|
|
|
75
67
|
class NoStaticFiles(Error): # noqa: N818
|
|
76
68
|
pass
|
|
@@ -87,14 +79,10 @@ class MarkdownFormattedException(Error): # noqa: N818
|
|
|
87
79
|
nicely formatted on the frontend.
|
|
88
80
|
"""
|
|
89
81
|
|
|
90
|
-
pass
|
|
91
|
-
|
|
92
82
|
|
|
93
83
|
class StreamlitMaxRetriesError(Error):
|
|
94
84
|
"""An exception raised when a file or folder cannot be accessed after multiple retries."""
|
|
95
85
|
|
|
96
|
-
pass
|
|
97
|
-
|
|
98
86
|
|
|
99
87
|
class StreamlitAPIException(MarkdownFormattedException):
|
|
100
88
|
"""Base class for Streamlit API exceptions.
|
|
@@ -129,7 +129,7 @@ class LLMThoughtLabeler:
|
|
|
129
129
|
input_str_len = min(MAX_TOOL_INPUT_STR_LENGTH, len(input_str))
|
|
130
130
|
input_str = input_str[:input_str_len]
|
|
131
131
|
if len(tool.input_str) > input_str_len:
|
|
132
|
-
input_str
|
|
132
|
+
input_str += "..."
|
|
133
133
|
input_str = input_str.replace("\n", " ")
|
|
134
134
|
return f"**{name}:** {input_str}"
|
|
135
135
|
|
|
@@ -54,7 +54,7 @@ def data_frame_demo() -> None:
|
|
|
54
54
|
color="Region:N",
|
|
55
55
|
)
|
|
56
56
|
)
|
|
57
|
-
st.altair_chart(chart,
|
|
57
|
+
st.altair_chart(chart, width="stretch")
|
|
58
58
|
except URLError as e:
|
|
59
59
|
st.error(f"This demo requires internet access. Connection error: {e.reason}")
|
|
60
60
|
|
streamlit/hello/plotting_demo.py
CHANGED
|
@@ -23,16 +23,24 @@ from streamlit.hello.utils import show_code
|
|
|
23
23
|
def plotting_demo() -> None:
|
|
24
24
|
progress_bar = st.sidebar.progress(0)
|
|
25
25
|
status_text = st.sidebar.empty()
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
chart = st.empty()
|
|
27
|
+
|
|
28
|
+
# Initialize with one data point
|
|
29
|
+
data = np.random.randn(1, 1) # noqa: NPY002
|
|
30
|
+
chart.line_chart(data)
|
|
31
|
+
|
|
32
|
+
for i in range(1, 51):
|
|
33
|
+
# Generate new rows based on the last value (random walk)
|
|
34
|
+
new_rows = data[-1, :] + np.random.randn(5, 1).cumsum(axis=0) # noqa: NPY002
|
|
35
|
+
# Append new rows to existing data
|
|
36
|
+
data = np.concatenate([data, new_rows])
|
|
37
|
+
# Update the chart with full data
|
|
38
|
+
chart.line_chart(data)
|
|
39
|
+
# Scale progress to show 0-100% with 50 iterations
|
|
40
|
+
progress = i * 2
|
|
41
|
+
status_text.text(f"{progress}% complete")
|
|
42
|
+
progress_bar.progress(progress)
|
|
43
|
+
time.sleep(0.01)
|
|
36
44
|
|
|
37
45
|
progress_bar.empty()
|
|
38
46
|
|
|
@@ -47,8 +55,7 @@ st.title("Plotting demo")
|
|
|
47
55
|
st.write(
|
|
48
56
|
"""
|
|
49
57
|
This demo illustrates a combination of plotting and animation with
|
|
50
|
-
Streamlit. We're generating a bunch of random numbers in a loop
|
|
51
|
-
5 seconds. Enjoy!
|
|
58
|
+
Streamlit. We're generating a bunch of random numbers in a loop. Enjoy!
|
|
52
59
|
"""
|
|
53
60
|
)
|
|
54
61
|
plotting_demo()
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2026)
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
"""Shared path security utilities for preventing path traversal and SSRF attacks.
|
|
16
|
+
|
|
17
|
+
This module provides a centralized implementation for path validation that is
|
|
18
|
+
used by multiple parts of the codebase. Having a single implementation ensures
|
|
19
|
+
consistent security checks and avoids divergent behavior between components.
|
|
20
|
+
|
|
21
|
+
Security Context
|
|
22
|
+
----------------
|
|
23
|
+
These checks are designed to run BEFORE any filesystem operations (like
|
|
24
|
+
``os.path.realpath()``) to prevent Windows from triggering SMB connections
|
|
25
|
+
to attacker-controlled servers when resolving UNC paths. This prevents
|
|
26
|
+
SSRF attacks and NTLM hash disclosure.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
from __future__ import annotations
|
|
30
|
+
|
|
31
|
+
import os
|
|
32
|
+
import string
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def is_unsafe_path_pattern(path: str) -> bool:
|
|
36
|
+
r"""Return True if path contains UNC, absolute, drive, or traversal patterns.
|
|
37
|
+
|
|
38
|
+
This function checks for dangerous path patterns that could lead to:
|
|
39
|
+
- SSRF attacks via Windows UNC path resolution
|
|
40
|
+
- NTLM hash disclosure via SMB connections
|
|
41
|
+
- Path traversal outside intended directories
|
|
42
|
+
- Path truncation via null bytes
|
|
43
|
+
|
|
44
|
+
IMPORTANT: This check must run BEFORE any ``os.path.realpath()`` calls
|
|
45
|
+
to prevent Windows from triggering SMB connections to attacker-controlled
|
|
46
|
+
servers.
|
|
47
|
+
|
|
48
|
+
Parameters
|
|
49
|
+
----------
|
|
50
|
+
path : str
|
|
51
|
+
The path string to validate.
|
|
52
|
+
|
|
53
|
+
Returns
|
|
54
|
+
-------
|
|
55
|
+
bool
|
|
56
|
+
True if the path contains unsafe patterns, False if it appears safe
|
|
57
|
+
for further processing.
|
|
58
|
+
|
|
59
|
+
Examples
|
|
60
|
+
--------
|
|
61
|
+
>>> is_unsafe_path_pattern("subdir/file.js")
|
|
62
|
+
False
|
|
63
|
+
>>> is_unsafe_path_pattern("\\\\server\\share")
|
|
64
|
+
True
|
|
65
|
+
>>> is_unsafe_path_pattern("../../../etc/passwd")
|
|
66
|
+
True
|
|
67
|
+
>>> is_unsafe_path_pattern("C:\\Windows\\system32")
|
|
68
|
+
True
|
|
69
|
+
"""
|
|
70
|
+
# Null bytes can be used for path truncation attacks
|
|
71
|
+
if "\x00" in path:
|
|
72
|
+
return True
|
|
73
|
+
|
|
74
|
+
# UNC paths (Windows network shares, including \\?\ and \\.\ prefixes)
|
|
75
|
+
if path.startswith(("\\\\", "//")):
|
|
76
|
+
return True
|
|
77
|
+
|
|
78
|
+
# Windows drive paths (e.g. C:\, D:foo) - on Windows, os.path.realpath() on a
|
|
79
|
+
# drive path can trigger SMB connections if the drive is mapped to a network share.
|
|
80
|
+
# This enables SSRF attacks and NTLM hash disclosure. We reject all drive-qualified
|
|
81
|
+
# paths including drive-relative paths like "C:foo" which resolve against the current
|
|
82
|
+
# directory of that drive. Checked on all platforms for defense-in-depth and
|
|
83
|
+
# testability (CI runs on Linux).
|
|
84
|
+
if len(path) >= 2 and path[0] in string.ascii_letters and path[1] == ":":
|
|
85
|
+
return True
|
|
86
|
+
|
|
87
|
+
# Rooted backslash or forward slash (absolute paths)
|
|
88
|
+
if path.startswith(("\\", "/")):
|
|
89
|
+
return True
|
|
90
|
+
|
|
91
|
+
# Also check os.path.isabs for platform-specific absolute path detection
|
|
92
|
+
if os.path.isabs(path):
|
|
93
|
+
return True
|
|
94
|
+
|
|
95
|
+
# Path traversal - check segments after normalizing separators
|
|
96
|
+
normalized = path.replace("\\", "/")
|
|
97
|
+
segments = [seg for seg in normalized.split("/") if seg]
|
|
98
|
+
return ".." in segments
|
streamlit/proto/Alert_pb2.py
CHANGED
|
@@ -15,14 +15,13 @@ _sym_db = _symbol_database.Default()
|
|
|
15
15
|
from streamlit.proto import WidthConfig_pb2 as streamlit_dot_proto_dot_WidthConfig__pb2
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bstreamlit/proto/Alert.proto\x1a!streamlit/proto/WidthConfig.proto\"\xb5\x01\n\x05\x41lert\x12\x0c\n\x04\x62ody\x18\x01 \x01(\t\x12\x1d\n\x06\x66ormat\x18\x02 \x01(\x0e\x32\r.Alert.Format\x12\x0c\n\x04icon\x18\x03 \x01(\t\x12,\n\x0cwidth_config\x18\x04 \x01(\x0b\x32\x16.streamlit.WidthConfig\"C\n\x06\x46ormat\x12\n\n\x06UNUSED\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x0b\n\x07WARNING\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\x0b\n\x07SUCCESS\x10\x04\
|
|
18
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bstreamlit/proto/Alert.proto\x1a!streamlit/proto/WidthConfig.proto\"\xb5\x01\n\x05\x41lert\x12\x0c\n\x04\x62ody\x18\x01 \x01(\t\x12\x1d\n\x06\x66ormat\x18\x02 \x01(\x0e\x32\r.Alert.Format\x12\x0c\n\x04icon\x18\x03 \x01(\t\x12,\n\x0cwidth_config\x18\x04 \x01(\x0b\x32\x16.streamlit.WidthConfig\"C\n\x06\x46ormat\x12\n\n\x06UNUSED\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x0b\n\x07WARNING\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\x0b\n\x07SUCCESS\x10\x04\x62\x06proto3')
|
|
19
19
|
|
|
20
20
|
_globals = globals()
|
|
21
21
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
22
22
|
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'streamlit.proto.Alert_pb2', _globals)
|
|
23
23
|
if not _descriptor._USE_C_DESCRIPTORS:
|
|
24
|
-
|
|
25
|
-
_globals['DESCRIPTOR']._serialized_options = b'\n\034com.snowflake.apps.streamlitB\nAlertProto'
|
|
24
|
+
DESCRIPTOR._loaded_options = None
|
|
26
25
|
_globals['_ALERT']._serialized_start=67
|
|
27
26
|
_globals['_ALERT']._serialized_end=248
|
|
28
27
|
_globals['_ALERT_FORMAT']._serialized_start=181
|
streamlit/proto/AppPage_pb2.py
CHANGED
|
@@ -14,14 +14,13 @@ _sym_db = _symbol_database.Default()
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dstreamlit/proto/AppPage.proto\"\x86\x01\n\x07\x41ppPage\x12\x18\n\x10page_script_hash\x18\x01 \x01(\t\x12\x11\n\tpage_name\x18\x02 \x01(\t\x12\x0c\n\x04icon\x18\x03 \x01(\t\x12\x12\n\nis_default\x18\x04 \x01(\x08\x12\x16\n\x0esection_header\x18\x05 \x01(\t\x12\x14\n\x0curl_pathname\x18\x06 \x01(\
|
|
17
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dstreamlit/proto/AppPage.proto\"\x86\x01\n\x07\x41ppPage\x12\x18\n\x10page_script_hash\x18\x01 \x01(\t\x12\x11\n\tpage_name\x18\x02 \x01(\t\x12\x0c\n\x04icon\x18\x03 \x01(\t\x12\x12\n\nis_default\x18\x04 \x01(\x08\x12\x16\n\x0esection_header\x18\x05 \x01(\t\x12\x14\n\x0curl_pathname\x18\x06 \x01(\tb\x06proto3')
|
|
18
18
|
|
|
19
19
|
_globals = globals()
|
|
20
20
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
21
21
|
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'streamlit.proto.AppPage_pb2', _globals)
|
|
22
22
|
if not _descriptor._USE_C_DESCRIPTORS:
|
|
23
|
-
|
|
24
|
-
_globals['DESCRIPTOR']._serialized_options = b'\n\034com.snowflake.apps.streamlitB\014AppPageProto'
|
|
23
|
+
DESCRIPTOR._loaded_options = None
|
|
25
24
|
_globals['_APPPAGE']._serialized_start=34
|
|
26
25
|
_globals['_APPPAGE']._serialized_end=168
|
|
27
26
|
# @@protoc_insertion_point(module_scope)
|
streamlit/proto/ArrowData_pb2.py
CHANGED
|
@@ -14,14 +14,13 @@ _sym_db = _symbol_database.Default()
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fstreamlit/proto/ArrowData.proto\"\x19\n\tArrowData\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\
|
|
17
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fstreamlit/proto/ArrowData.proto\"\x19\n\tArrowData\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x62\x06proto3')
|
|
18
18
|
|
|
19
19
|
_globals = globals()
|
|
20
20
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
21
21
|
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'streamlit.proto.ArrowData_pb2', _globals)
|
|
22
22
|
if not _descriptor._USE_C_DESCRIPTORS:
|
|
23
|
-
|
|
24
|
-
_globals['DESCRIPTOR']._serialized_options = b'\n\034com.snowflake.apps.streamlitB\016ArrowDataProto'
|
|
23
|
+
DESCRIPTOR._loaded_options = None
|
|
25
24
|
_globals['_ARROWDATA']._serialized_start=35
|
|
26
25
|
_globals['_ARROWDATA']._serialized_end=60
|
|
27
26
|
# @@protoc_insertion_point(module_scope)
|
|
@@ -15,14 +15,13 @@ _sym_db = _symbol_database.Default()
|
|
|
15
15
|
from streamlit.proto import Arrow_pb2 as streamlit_dot_proto_dot_Arrow__pb2
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'streamlit/proto/ArrowNamedDataSet.proto\x1a\x1bstreamlit/proto/Arrow.proto\"I\n\x11\x41rrowNamedDataSet\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x10\n\x08has_name\x18\x03 \x01(\x08\x12\x14\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x06.
|
|
18
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'streamlit/proto/ArrowNamedDataSet.proto\x1a\x1bstreamlit/proto/Arrow.proto\"I\n\x11\x41rrowNamedDataSet\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x10\n\x08has_name\x18\x03 \x01(\x08\x12\x14\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x06.Arrowb\x06proto3')
|
|
19
19
|
|
|
20
20
|
_globals = globals()
|
|
21
21
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
22
22
|
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'streamlit.proto.ArrowNamedDataSet_pb2', _globals)
|
|
23
23
|
if not _descriptor._USE_C_DESCRIPTORS:
|
|
24
|
-
|
|
25
|
-
_globals['DESCRIPTOR']._serialized_options = b'\n\034com.snowflake.apps.streamlitB\026ArrowNamedDataSetProto'
|
|
24
|
+
DESCRIPTOR._loaded_options = None
|
|
26
25
|
_globals['_ARROWNAMEDDATASET']._serialized_start=72
|
|
27
26
|
_globals['_ARROWNAMEDDATASET']._serialized_end=145
|
|
28
27
|
# @@protoc_insertion_point(module_scope)
|
|
@@ -16,14 +16,13 @@ from streamlit.proto import Arrow_pb2 as streamlit_dot_proto_dot_Arrow__pb2
|
|
|
16
16
|
from streamlit.proto import ArrowNamedDataSet_pb2 as streamlit_dot_proto_dot_ArrowNamedDataSet__pb2
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(streamlit/proto/ArrowVegaLiteChart.proto\x1a\x1bstreamlit/proto/Arrow.proto\x1a\'streamlit/proto/ArrowNamedDataSet.proto\"\xc5\x01\n\x12\x41rrowVegaLiteChart\x12\x0c\n\x04spec\x18\x01 \x01(\t\x12\x14\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x06.Arrow\x12$\n\x08\x64\x61tasets\x18\x04 \x03(\x0b\x32\x12.ArrowNamedDataSet\x12\x1b\n\x13use_container_width\x18\x05 \x01(\x08\x12\r\n\x05theme\x18\x06 \x01(\t\x12\n\n\x02id\x18\x07 \x01(\t\x12\x16\n\x0eselection_mode\x18\x08 \x03(\t\x12\x0f\n\x07\x66orm_id\x18\t \x01(\tJ\x04\x08\x03\x10\x04\
|
|
19
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(streamlit/proto/ArrowVegaLiteChart.proto\x1a\x1bstreamlit/proto/Arrow.proto\x1a\'streamlit/proto/ArrowNamedDataSet.proto\"\xc5\x01\n\x12\x41rrowVegaLiteChart\x12\x0c\n\x04spec\x18\x01 \x01(\t\x12\x14\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x06.Arrow\x12$\n\x08\x64\x61tasets\x18\x04 \x03(\x0b\x32\x12.ArrowNamedDataSet\x12\x1b\n\x13use_container_width\x18\x05 \x01(\x08\x12\r\n\x05theme\x18\x06 \x01(\t\x12\n\n\x02id\x18\x07 \x01(\t\x12\x16\n\x0eselection_mode\x18\x08 \x03(\t\x12\x0f\n\x07\x66orm_id\x18\t \x01(\tJ\x04\x08\x03\x10\x04\x62\x06proto3')
|
|
20
20
|
|
|
21
21
|
_globals = globals()
|
|
22
22
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
23
23
|
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'streamlit.proto.ArrowVegaLiteChart_pb2', _globals)
|
|
24
24
|
if not _descriptor._USE_C_DESCRIPTORS:
|
|
25
|
-
|
|
26
|
-
_globals['DESCRIPTOR']._serialized_options = b'\n\034com.snowflake.apps.streamlitB\027ArrowVegaLiteChartProto'
|
|
25
|
+
DESCRIPTOR._loaded_options = None
|
|
27
26
|
_globals['_ARROWVEGALITECHART']._serialized_start=115
|
|
28
27
|
_globals['_ARROWVEGALITECHART']._serialized_end=312
|
|
29
28
|
# @@protoc_insertion_point(module_scope)
|
streamlit/proto/Arrow_pb2.py
CHANGED
|
@@ -14,14 +14,13 @@ _sym_db = _symbol_database.Default()
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bstreamlit/proto/Arrow.proto\"\x9a\x05\n\x05\x41rrow\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12\x17\n\x06styler\x18\x02 \x01(\x0b\x32\x07.Styler\x12\x11\n\x05width\x18\x03 \x01(\rB\x02\x18\x01\x12\x12\n\x06height\x18\x04 \x01(\rB\x02\x18\x01\x12\x1f\n\x13use_container_width\x18\x05 \x01(\x08\x42\x02\x18\x01\x12\n\n\x02id\x18\x06 \x01(\t\x12\x0f\n\x07\x63olumns\x18\x07 \x01(\t\x12(\n\x0c\x65\x64iting_mode\x18\x08 \x01(\x0e\x32\x12.Arrow.EditingMode\x12\x10\n\x08\x64isabled\x18\t \x01(\x08\x12\x0f\n\x07\x66orm_id\x18\n \x01(\t\x12\x14\n\x0c\x63olumn_order\x18\x0b \x03(\t\x12,\n\x0eselection_mode\x18\x0c \x03(\x0e\x32\x14.Arrow.SelectionMode\x12\x17\n\nrow_height\x18\r \x01(\rH\x00\x88\x01\x01\x12&\n\x0b\x62order_mode\x18\x0e \x01(\x0e\x32\x11.Arrow.BorderMode\x12\x18\n\x0bplaceholder\x18\x0f \x01(\tH\x01\x88\x01\x01\"S\n\x0b\x45\x64itingMode\x12\r\n\tREAD_ONLY\x10\x00\x12\t\n\x05\x46IXED\x10\x01\x12\x0b\n\x07\x44YNAMIC\x10\x02\x12\x0c\n\x08\x41\x44\x44_ONLY\x10\x03\x12\x0f\n\x0b\x44\x45LETE_ONLY\x10\x04\"t\n\rSelectionMode\x12\x0e\n\nSINGLE_ROW\x10\x00\x12\r\n\tMULTI_ROW\x10\x01\x12\x11\n\rSINGLE_COLUMN\x10\x02\x12\x10\n\x0cMULTI_COLUMN\x10\x03\x12\x0f\n\x0bSINGLE_CELL\x10\x04\x12\x0e\n\nMULTI_CELL\x10\x05\"/\n\nBorderMode\x12\x07\n\x03\x41LL\x10\x00\x12\x08\n\x04NONE\x10\x01\x12\x0e\n\nHORIZONTAL\x10\x02\x42\r\n\x0b_row_heightB\x0e\n\x0c_placeholder\"O\n\x06Styler\x12\x0c\n\x04uuid\x18\x01 \x01(\t\x12\x0f\n\x07\x63\x61ption\x18\x02 \x01(\t\x12\x0e\n\x06styles\x18\x03 \x01(\t\x12\x16\n\x0e\x64isplay_values\x18\x04 \x01(\x0c\
|
|
17
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bstreamlit/proto/Arrow.proto\"\x9a\x05\n\x05\x41rrow\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12\x17\n\x06styler\x18\x02 \x01(\x0b\x32\x07.Styler\x12\x11\n\x05width\x18\x03 \x01(\rB\x02\x18\x01\x12\x12\n\x06height\x18\x04 \x01(\rB\x02\x18\x01\x12\x1f\n\x13use_container_width\x18\x05 \x01(\x08\x42\x02\x18\x01\x12\n\n\x02id\x18\x06 \x01(\t\x12\x0f\n\x07\x63olumns\x18\x07 \x01(\t\x12(\n\x0c\x65\x64iting_mode\x18\x08 \x01(\x0e\x32\x12.Arrow.EditingMode\x12\x10\n\x08\x64isabled\x18\t \x01(\x08\x12\x0f\n\x07\x66orm_id\x18\n \x01(\t\x12\x14\n\x0c\x63olumn_order\x18\x0b \x03(\t\x12,\n\x0eselection_mode\x18\x0c \x03(\x0e\x32\x14.Arrow.SelectionMode\x12\x17\n\nrow_height\x18\r \x01(\rH\x00\x88\x01\x01\x12&\n\x0b\x62order_mode\x18\x0e \x01(\x0e\x32\x11.Arrow.BorderMode\x12\x18\n\x0bplaceholder\x18\x0f \x01(\tH\x01\x88\x01\x01\"S\n\x0b\x45\x64itingMode\x12\r\n\tREAD_ONLY\x10\x00\x12\t\n\x05\x46IXED\x10\x01\x12\x0b\n\x07\x44YNAMIC\x10\x02\x12\x0c\n\x08\x41\x44\x44_ONLY\x10\x03\x12\x0f\n\x0b\x44\x45LETE_ONLY\x10\x04\"t\n\rSelectionMode\x12\x0e\n\nSINGLE_ROW\x10\x00\x12\r\n\tMULTI_ROW\x10\x01\x12\x11\n\rSINGLE_COLUMN\x10\x02\x12\x10\n\x0cMULTI_COLUMN\x10\x03\x12\x0f\n\x0bSINGLE_CELL\x10\x04\x12\x0e\n\nMULTI_CELL\x10\x05\"/\n\nBorderMode\x12\x07\n\x03\x41LL\x10\x00\x12\x08\n\x04NONE\x10\x01\x12\x0e\n\nHORIZONTAL\x10\x02\x42\r\n\x0b_row_heightB\x0e\n\x0c_placeholder\"O\n\x06Styler\x12\x0c\n\x04uuid\x18\x01 \x01(\t\x12\x0f\n\x07\x63\x61ption\x18\x02 \x01(\t\x12\x0e\n\x06styles\x18\x03 \x01(\t\x12\x16\n\x0e\x64isplay_values\x18\x04 \x01(\x0c\x62\x06proto3')
|
|
18
18
|
|
|
19
19
|
_globals = globals()
|
|
20
20
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
21
21
|
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'streamlit.proto.Arrow_pb2', _globals)
|
|
22
22
|
if not _descriptor._USE_C_DESCRIPTORS:
|
|
23
|
-
|
|
24
|
-
_globals['DESCRIPTOR']._serialized_options = b'\n\034com.snowflake.apps.streamlitB\nArrowProto'
|
|
23
|
+
DESCRIPTOR._loaded_options = None
|
|
25
24
|
_globals['_ARROW'].fields_by_name['width']._loaded_options = None
|
|
26
25
|
_globals['_ARROW'].fields_by_name['width']._serialized_options = b'\030\001'
|
|
27
26
|
_globals['_ARROW'].fields_by_name['height']._loaded_options = None
|
|
@@ -15,14 +15,13 @@ _sym_db = _symbol_database.Default()
|
|
|
15
15
|
from streamlit.proto import LabelVisibilityMessage_pb2 as streamlit_dot_proto_dot_LabelVisibilityMessage__pb2
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n streamlit/proto/AudioInput.proto\x1a,streamlit/proto/LabelVisibilityMessage.proto\"\xb5\x01\n\nAudioInput\x12\n\n\x02id\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x0c\n\x04help\x18\x03 \x01(\t\x12\x0f\n\x07\x66orm_id\x18\x04 \x01(\t\x12\x10\n\x08\x64isabled\x18\x05 \x01(\x08\x12\x31\n\x10label_visibility\x18\x06 \x01(\x0b\x32\x17.LabelVisibilityMessage\x12\x18\n\x0bsample_rate\x18\x07 \x01(\x05H\x00\x88\x01\x01\x42\x0e\n\
|
|
18
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n streamlit/proto/AudioInput.proto\x1a,streamlit/proto/LabelVisibilityMessage.proto\"\xb5\x01\n\nAudioInput\x12\n\n\x02id\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x0c\n\x04help\x18\x03 \x01(\t\x12\x0f\n\x07\x66orm_id\x18\x04 \x01(\t\x12\x10\n\x08\x64isabled\x18\x05 \x01(\x08\x12\x31\n\x10label_visibility\x18\x06 \x01(\x0b\x32\x17.LabelVisibilityMessage\x12\x18\n\x0bsample_rate\x18\x07 \x01(\x05H\x00\x88\x01\x01\x42\x0e\n\x0c_sample_rateb\x06proto3')
|
|
19
19
|
|
|
20
20
|
_globals = globals()
|
|
21
21
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
22
22
|
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'streamlit.proto.AudioInput_pb2', _globals)
|
|
23
23
|
if not _descriptor._USE_C_DESCRIPTORS:
|
|
24
|
-
|
|
25
|
-
_globals['DESCRIPTOR']._serialized_options = b'\n\034com.snowflake.apps.streamlitB\017AudioInputProto'
|
|
24
|
+
DESCRIPTOR._loaded_options = None
|
|
26
25
|
_globals['_AUDIOINPUT']._serialized_start=83
|
|
27
26
|
_globals['_AUDIOINPUT']._serialized_end=264
|
|
28
27
|
# @@protoc_insertion_point(module_scope)
|
streamlit/proto/Audio_pb2.py
CHANGED
|
@@ -15,14 +15,13 @@ _sym_db = _symbol_database.Default()
|
|
|
15
15
|
from streamlit.proto import WidthConfig_pb2 as streamlit_dot_proto_dot_WidthConfig__pb2
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bstreamlit/proto/Audio.proto\x1a!streamlit/proto/WidthConfig.proto\"\xca\x01\n\x05\x41udio\x12\x0b\n\x03url\x18\x05 \x01(\t\x12\x12\n\nstart_time\x18\x03 \x01(\x05\x12\x10\n\x08\x65nd_time\x18\x06 \x01(\x05\x12\x0c\n\x04loop\x18\x07 \x01(\x08\x12\x10\n\x08\x61utoplay\x18\x08 \x01(\x08\x12\n\n\x02id\x18\t \x01(\t\x12\x31\n\x0cwidth_config\x18\n \x01(\x0b\x32\x16.streamlit.WidthConfigH\x00\x88\x01\x01\x42\x0f\n\r_width_configJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x04\x10\x05R\x04\x64\x61taR\x06\
|
|
18
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bstreamlit/proto/Audio.proto\x1a!streamlit/proto/WidthConfig.proto\"\xca\x01\n\x05\x41udio\x12\x0b\n\x03url\x18\x05 \x01(\t\x12\x12\n\nstart_time\x18\x03 \x01(\x05\x12\x10\n\x08\x65nd_time\x18\x06 \x01(\x05\x12\x0c\n\x04loop\x18\x07 \x01(\x08\x12\x10\n\x08\x61utoplay\x18\x08 \x01(\x08\x12\n\n\x02id\x18\t \x01(\t\x12\x31\n\x0cwidth_config\x18\n \x01(\x0b\x32\x16.streamlit.WidthConfigH\x00\x88\x01\x01\x42\x0f\n\r_width_configJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x04\x10\x05R\x04\x64\x61taR\x06\x66ormatb\x06proto3')
|
|
19
19
|
|
|
20
20
|
_globals = globals()
|
|
21
21
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
22
22
|
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'streamlit.proto.Audio_pb2', _globals)
|
|
23
23
|
if not _descriptor._USE_C_DESCRIPTORS:
|
|
24
|
-
|
|
25
|
-
_globals['DESCRIPTOR']._serialized_options = b'\n\034com.snowflake.apps.streamlitB\nAudioProto'
|
|
24
|
+
DESCRIPTOR._loaded_options = None
|
|
26
25
|
_globals['_AUDIO']._serialized_start=67
|
|
27
26
|
_globals['_AUDIO']._serialized_end=269
|
|
28
27
|
# @@protoc_insertion_point(module_scope)
|