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.
Files changed (563) hide show
  1. streamlit/__init__.py +306 -0
  2. streamlit/__main__.py +20 -0
  3. streamlit/auth_util.py +218 -0
  4. streamlit/cli_util.py +105 -0
  5. streamlit/column_config.py +56 -0
  6. streamlit/commands/__init__.py +13 -0
  7. streamlit/commands/echo.py +126 -0
  8. streamlit/commands/execution_control.py +238 -0
  9. streamlit/commands/experimental_query_params.py +169 -0
  10. streamlit/commands/logo.py +189 -0
  11. streamlit/commands/navigation.py +385 -0
  12. streamlit/commands/page_config.py +311 -0
  13. streamlit/components/__init__.py +13 -0
  14. streamlit/components/lib/__init__.py +13 -0
  15. streamlit/components/lib/local_component_registry.py +84 -0
  16. streamlit/components/types/__init__.py +13 -0
  17. streamlit/components/types/base_component_registry.py +99 -0
  18. streamlit/components/types/base_custom_component.py +150 -0
  19. streamlit/components/v1/__init__.py +31 -0
  20. streamlit/components/v1/component_arrow.py +141 -0
  21. streamlit/components/v1/component_registry.py +130 -0
  22. streamlit/components/v1/components.py +38 -0
  23. streamlit/components/v1/custom_component.py +243 -0
  24. streamlit/config.py +1513 -0
  25. streamlit/config_option.py +311 -0
  26. streamlit/config_util.py +177 -0
  27. streamlit/connections/__init__.py +28 -0
  28. streamlit/connections/base_connection.py +174 -0
  29. streamlit/connections/snowflake_connection.py +562 -0
  30. streamlit/connections/snowpark_connection.py +213 -0
  31. streamlit/connections/sql_connection.py +425 -0
  32. streamlit/connections/util.py +97 -0
  33. streamlit/cursor.py +210 -0
  34. streamlit/dataframe_util.py +1416 -0
  35. streamlit/delta_generator.py +602 -0
  36. streamlit/delta_generator_singletons.py +204 -0
  37. streamlit/deprecation_util.py +209 -0
  38. streamlit/development.py +21 -0
  39. streamlit/elements/__init__.py +13 -0
  40. streamlit/elements/alert.py +234 -0
  41. streamlit/elements/arrow.py +962 -0
  42. streamlit/elements/balloons.py +47 -0
  43. streamlit/elements/bokeh_chart.py +133 -0
  44. streamlit/elements/code.py +114 -0
  45. streamlit/elements/deck_gl_json_chart.py +546 -0
  46. streamlit/elements/dialog_decorator.py +267 -0
  47. streamlit/elements/doc_string.py +558 -0
  48. streamlit/elements/empty.py +130 -0
  49. streamlit/elements/exception.py +331 -0
  50. streamlit/elements/form.py +354 -0
  51. streamlit/elements/graphviz_chart.py +150 -0
  52. streamlit/elements/heading.py +302 -0
  53. streamlit/elements/html.py +105 -0
  54. streamlit/elements/iframe.py +191 -0
  55. streamlit/elements/image.py +196 -0
  56. streamlit/elements/json.py +139 -0
  57. streamlit/elements/layouts.py +879 -0
  58. streamlit/elements/lib/__init__.py +13 -0
  59. streamlit/elements/lib/built_in_chart_utils.py +1157 -0
  60. streamlit/elements/lib/color_util.py +263 -0
  61. streamlit/elements/lib/column_config_utils.py +542 -0
  62. streamlit/elements/lib/column_types.py +2188 -0
  63. streamlit/elements/lib/dialog.py +147 -0
  64. streamlit/elements/lib/dicttools.py +154 -0
  65. streamlit/elements/lib/event_utils.py +37 -0
  66. streamlit/elements/lib/file_uploader_utils.py +66 -0
  67. streamlit/elements/lib/form_utils.py +77 -0
  68. streamlit/elements/lib/image_utils.py +441 -0
  69. streamlit/elements/lib/js_number.py +105 -0
  70. streamlit/elements/lib/mutable_status_container.py +183 -0
  71. streamlit/elements/lib/options_selector_utils.py +250 -0
  72. streamlit/elements/lib/pandas_styler_utils.py +274 -0
  73. streamlit/elements/lib/policies.py +194 -0
  74. streamlit/elements/lib/streamlit_plotly_theme.py +207 -0
  75. streamlit/elements/lib/subtitle_utils.py +176 -0
  76. streamlit/elements/lib/utils.py +250 -0
  77. streamlit/elements/map.py +508 -0
  78. streamlit/elements/markdown.py +277 -0
  79. streamlit/elements/media.py +793 -0
  80. streamlit/elements/metric.py +301 -0
  81. streamlit/elements/plotly_chart.py +546 -0
  82. streamlit/elements/progress.py +156 -0
  83. streamlit/elements/pyplot.py +194 -0
  84. streamlit/elements/snow.py +47 -0
  85. streamlit/elements/spinner.py +113 -0
  86. streamlit/elements/text.py +76 -0
  87. streamlit/elements/toast.py +98 -0
  88. streamlit/elements/vega_charts.py +1984 -0
  89. streamlit/elements/widgets/__init__.py +13 -0
  90. streamlit/elements/widgets/audio_input.py +310 -0
  91. streamlit/elements/widgets/button.py +1123 -0
  92. streamlit/elements/widgets/button_group.py +1008 -0
  93. streamlit/elements/widgets/camera_input.py +263 -0
  94. streamlit/elements/widgets/chat.py +647 -0
  95. streamlit/elements/widgets/checkbox.py +352 -0
  96. streamlit/elements/widgets/color_picker.py +265 -0
  97. streamlit/elements/widgets/data_editor.py +983 -0
  98. streamlit/elements/widgets/file_uploader.py +486 -0
  99. streamlit/elements/widgets/multiselect.py +338 -0
  100. streamlit/elements/widgets/number_input.py +545 -0
  101. streamlit/elements/widgets/radio.py +407 -0
  102. streamlit/elements/widgets/select_slider.py +437 -0
  103. streamlit/elements/widgets/selectbox.py +366 -0
  104. streamlit/elements/widgets/slider.py +880 -0
  105. streamlit/elements/widgets/text_widgets.py +628 -0
  106. streamlit/elements/widgets/time_widgets.py +970 -0
  107. streamlit/elements/write.py +574 -0
  108. streamlit/emojis.py +34 -0
  109. streamlit/env_util.py +61 -0
  110. streamlit/error_util.py +105 -0
  111. streamlit/errors.py +452 -0
  112. streamlit/external/__init__.py +13 -0
  113. streamlit/external/langchain/__init__.py +23 -0
  114. streamlit/external/langchain/streamlit_callback_handler.py +406 -0
  115. streamlit/file_util.py +247 -0
  116. streamlit/git_util.py +173 -0
  117. streamlit/hello/__init__.py +13 -0
  118. streamlit/hello/animation_demo.py +82 -0
  119. streamlit/hello/dataframe_demo.py +71 -0
  120. streamlit/hello/hello.py +37 -0
  121. streamlit/hello/mapping_demo.py +114 -0
  122. streamlit/hello/plotting_demo.py +55 -0
  123. streamlit/hello/streamlit_app.py +55 -0
  124. streamlit/hello/utils.py +28 -0
  125. streamlit/logger.py +130 -0
  126. streamlit/material_icon_names.py +25 -0
  127. streamlit/navigation/__init__.py +13 -0
  128. streamlit/navigation/page.py +302 -0
  129. streamlit/net_util.py +125 -0
  130. streamlit/platform.py +33 -0
  131. streamlit/proto/Alert_pb2.py +29 -0
  132. streamlit/proto/Alert_pb2.pyi +90 -0
  133. streamlit/proto/AppPage_pb2.py +27 -0
  134. streamlit/proto/AppPage_pb2.pyi +64 -0
  135. streamlit/proto/ArrowNamedDataSet_pb2.py +28 -0
  136. streamlit/proto/ArrowNamedDataSet_pb2.pyi +57 -0
  137. streamlit/proto/ArrowVegaLiteChart_pb2.py +29 -0
  138. streamlit/proto/ArrowVegaLiteChart_pb2.pyi +84 -0
  139. streamlit/proto/Arrow_pb2.py +33 -0
  140. streamlit/proto/Arrow_pb2.pyi +188 -0
  141. streamlit/proto/AudioInput_pb2.py +28 -0
  142. streamlit/proto/AudioInput_pb2.pyi +58 -0
  143. streamlit/proto/Audio_pb2.py +27 -0
  144. streamlit/proto/Audio_pb2.pyi +58 -0
  145. streamlit/proto/AuthRedirect_pb2.py +27 -0
  146. streamlit/proto/AuthRedirect_pb2.pyi +41 -0
  147. streamlit/proto/AutoRerun_pb2.py +27 -0
  148. streamlit/proto/AutoRerun_pb2.pyi +45 -0
  149. streamlit/proto/BackMsg_pb2.py +29 -0
  150. streamlit/proto/BackMsg_pb2.pyi +105 -0
  151. streamlit/proto/Balloons_pb2.py +27 -0
  152. streamlit/proto/Balloons_pb2.pyi +43 -0
  153. streamlit/proto/Block_pb2.py +53 -0
  154. streamlit/proto/Block_pb2.pyi +322 -0
  155. streamlit/proto/BokehChart_pb2.py +27 -0
  156. streamlit/proto/BokehChart_pb2.pyi +49 -0
  157. streamlit/proto/ButtonGroup_pb2.py +36 -0
  158. streamlit/proto/ButtonGroup_pb2.pyi +169 -0
  159. streamlit/proto/Button_pb2.py +27 -0
  160. streamlit/proto/Button_pb2.pyi +71 -0
  161. streamlit/proto/CameraInput_pb2.py +28 -0
  162. streamlit/proto/CameraInput_pb2.pyi +58 -0
  163. streamlit/proto/ChatInput_pb2.py +31 -0
  164. streamlit/proto/ChatInput_pb2.pyi +111 -0
  165. streamlit/proto/Checkbox_pb2.py +30 -0
  166. streamlit/proto/Checkbox_pb2.pyi +90 -0
  167. streamlit/proto/ClientState_pb2.py +30 -0
  168. streamlit/proto/ClientState_pb2.pyi +90 -0
  169. streamlit/proto/Code_pb2.py +27 -0
  170. streamlit/proto/Code_pb2.pyi +55 -0
  171. streamlit/proto/ColorPicker_pb2.py +28 -0
  172. streamlit/proto/ColorPicker_pb2.pyi +67 -0
  173. streamlit/proto/Common_pb2.py +51 -0
  174. streamlit/proto/Common_pb2.pyi +293 -0
  175. streamlit/proto/Components_pb2.py +35 -0
  176. streamlit/proto/Components_pb2.pyi +172 -0
  177. streamlit/proto/DataFrame_pb2.py +56 -0
  178. streamlit/proto/DataFrame_pb2.pyi +397 -0
  179. streamlit/proto/DateInput_pb2.py +28 -0
  180. streamlit/proto/DateInput_pb2.pyi +83 -0
  181. streamlit/proto/DeckGlJsonChart_pb2.py +29 -0
  182. streamlit/proto/DeckGlJsonChart_pb2.pyi +102 -0
  183. streamlit/proto/Delta_pb2.py +31 -0
  184. streamlit/proto/Delta_pb2.pyi +74 -0
  185. streamlit/proto/DocString_pb2.py +29 -0
  186. streamlit/proto/DocString_pb2.pyi +93 -0
  187. streamlit/proto/DownloadButton_pb2.py +27 -0
  188. streamlit/proto/DownloadButton_pb2.pyi +70 -0
  189. streamlit/proto/Element_pb2.py +78 -0
  190. streamlit/proto/Element_pb2.pyi +312 -0
  191. streamlit/proto/Empty_pb2.py +27 -0
  192. streamlit/proto/Empty_pb2.pyi +36 -0
  193. streamlit/proto/Exception_pb2.py +27 -0
  194. streamlit/proto/Exception_pb2.pyi +72 -0
  195. streamlit/proto/Favicon_pb2.py +27 -0
  196. streamlit/proto/Favicon_pb2.pyi +40 -0
  197. streamlit/proto/FileUploader_pb2.py +28 -0
  198. streamlit/proto/FileUploader_pb2.pyi +78 -0
  199. streamlit/proto/ForwardMsg_pb2.py +53 -0
  200. streamlit/proto/ForwardMsg_pb2.pyi +293 -0
  201. streamlit/proto/GitInfo_pb2.py +29 -0
  202. streamlit/proto/GitInfo_pb2.pyi +83 -0
  203. streamlit/proto/GraphVizChart_pb2.py +27 -0
  204. streamlit/proto/GraphVizChart_pb2.pyi +53 -0
  205. streamlit/proto/Heading_pb2.py +27 -0
  206. streamlit/proto/Heading_pb2.pyi +56 -0
  207. streamlit/proto/Html_pb2.py +27 -0
  208. streamlit/proto/Html_pb2.pyi +42 -0
  209. streamlit/proto/IFrame_pb2.py +27 -0
  210. streamlit/proto/IFrame_pb2.pyi +59 -0
  211. streamlit/proto/Image_pb2.py +29 -0
  212. streamlit/proto/Image_pb2.pyi +84 -0
  213. streamlit/proto/Json_pb2.py +27 -0
  214. streamlit/proto/Json_pb2.pyi +53 -0
  215. streamlit/proto/LabelVisibilityMessage_pb2.py +29 -0
  216. streamlit/proto/LabelVisibilityMessage_pb2.pyi +68 -0
  217. streamlit/proto/LinkButton_pb2.py +27 -0
  218. streamlit/proto/LinkButton_pb2.pyi +58 -0
  219. streamlit/proto/Logo_pb2.py +27 -0
  220. streamlit/proto/Logo_pb2.pyi +51 -0
  221. streamlit/proto/Markdown_pb2.py +29 -0
  222. streamlit/proto/Markdown_pb2.pyi +86 -0
  223. streamlit/proto/Metric_pb2.py +32 -0
  224. streamlit/proto/Metric_pb2.pyi +101 -0
  225. streamlit/proto/MetricsEvent_pb2.py +30 -0
  226. streamlit/proto/MetricsEvent_pb2.pyi +200 -0
  227. streamlit/proto/MultiSelect_pb2.py +28 -0
  228. streamlit/proto/MultiSelect_pb2.pyi +81 -0
  229. streamlit/proto/NamedDataSet_pb2.py +28 -0
  230. streamlit/proto/NamedDataSet_pb2.pyi +59 -0
  231. streamlit/proto/Navigation_pb2.py +30 -0
  232. streamlit/proto/Navigation_pb2.pyi +84 -0
  233. streamlit/proto/NewSession_pb2.py +51 -0
  234. streamlit/proto/NewSession_pb2.pyi +481 -0
  235. streamlit/proto/NumberInput_pb2.py +30 -0
  236. streamlit/proto/NumberInput_pb2.pyi +121 -0
  237. streamlit/proto/PageConfig_pb2.py +33 -0
  238. streamlit/proto/PageConfig_pb2.pyi +126 -0
  239. streamlit/proto/PageInfo_pb2.py +27 -0
  240. streamlit/proto/PageInfo_pb2.pyi +43 -0
  241. streamlit/proto/PageLink_pb2.py +27 -0
  242. streamlit/proto/PageLink_pb2.pyi +63 -0
  243. streamlit/proto/PageNotFound_pb2.py +27 -0
  244. streamlit/proto/PageNotFound_pb2.pyi +42 -0
  245. streamlit/proto/PageProfile_pb2.py +31 -0
  246. streamlit/proto/PageProfile_pb2.pyi +127 -0
  247. streamlit/proto/PagesChanged_pb2.py +28 -0
  248. streamlit/proto/PagesChanged_pb2.pyi +48 -0
  249. streamlit/proto/ParentMessage_pb2.py +27 -0
  250. streamlit/proto/ParentMessage_pb2.pyi +46 -0
  251. streamlit/proto/PlotlyChart_pb2.py +31 -0
  252. streamlit/proto/PlotlyChart_pb2.pyi +131 -0
  253. streamlit/proto/Progress_pb2.py +27 -0
  254. streamlit/proto/Progress_pb2.pyi +43 -0
  255. streamlit/proto/Radio_pb2.py +28 -0
  256. streamlit/proto/Radio_pb2.pyi +84 -0
  257. streamlit/proto/RootContainer_pb2.py +27 -0
  258. streamlit/proto/RootContainer_pb2.pyi +56 -0
  259. streamlit/proto/Selectbox_pb2.py +28 -0
  260. streamlit/proto/Selectbox_pb2.pyi +80 -0
  261. streamlit/proto/SessionEvent_pb2.py +28 -0
  262. streamlit/proto/SessionEvent_pb2.pyi +62 -0
  263. streamlit/proto/SessionStatus_pb2.py +27 -0
  264. streamlit/proto/SessionStatus_pb2.pyi +57 -0
  265. streamlit/proto/Skeleton_pb2.py +29 -0
  266. streamlit/proto/Skeleton_pb2.pyi +71 -0
  267. streamlit/proto/Slider_pb2.py +32 -0
  268. streamlit/proto/Slider_pb2.pyi +142 -0
  269. streamlit/proto/Snow_pb2.py +27 -0
  270. streamlit/proto/Snow_pb2.pyi +43 -0
  271. streamlit/proto/Spinner_pb2.py +27 -0
  272. streamlit/proto/Spinner_pb2.pyi +49 -0
  273. streamlit/proto/TextArea_pb2.py +28 -0
  274. streamlit/proto/TextArea_pb2.pyi +80 -0
  275. streamlit/proto/TextInput_pb2.py +30 -0
  276. streamlit/proto/TextInput_pb2.pyi +107 -0
  277. streamlit/proto/Text_pb2.py +27 -0
  278. streamlit/proto/Text_pb2.pyi +46 -0
  279. streamlit/proto/TimeInput_pb2.py +28 -0
  280. streamlit/proto/TimeInput_pb2.pyi +74 -0
  281. streamlit/proto/Toast_pb2.py +27 -0
  282. streamlit/proto/Toast_pb2.pyi +45 -0
  283. streamlit/proto/VegaLiteChart_pb2.py +29 -0
  284. streamlit/proto/VegaLiteChart_pb2.pyi +71 -0
  285. streamlit/proto/Video_pb2.py +31 -0
  286. streamlit/proto/Video_pb2.pyi +117 -0
  287. streamlit/proto/WidgetStates_pb2.py +31 -0
  288. streamlit/proto/WidgetStates_pb2.pyi +126 -0
  289. streamlit/proto/__init__.py +15 -0
  290. streamlit/proto/openmetrics_data_model_pb2.py +60 -0
  291. streamlit/proto/openmetrics_data_model_pb2.pyi +522 -0
  292. streamlit/py.typed +0 -0
  293. streamlit/runtime/__init__.py +50 -0
  294. streamlit/runtime/app_session.py +982 -0
  295. streamlit/runtime/caching/__init__.py +98 -0
  296. streamlit/runtime/caching/cache_data_api.py +665 -0
  297. streamlit/runtime/caching/cache_errors.py +142 -0
  298. streamlit/runtime/caching/cache_resource_api.py +527 -0
  299. streamlit/runtime/caching/cache_type.py +33 -0
  300. streamlit/runtime/caching/cache_utils.py +523 -0
  301. streamlit/runtime/caching/cached_message_replay.py +290 -0
  302. streamlit/runtime/caching/hashing.py +637 -0
  303. streamlit/runtime/caching/legacy_cache_api.py +169 -0
  304. streamlit/runtime/caching/storage/__init__.py +29 -0
  305. streamlit/runtime/caching/storage/cache_storage_protocol.py +239 -0
  306. streamlit/runtime/caching/storage/dummy_cache_storage.py +60 -0
  307. streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +145 -0
  308. streamlit/runtime/caching/storage/local_disk_cache_storage.py +223 -0
  309. streamlit/runtime/connection_factory.py +436 -0
  310. streamlit/runtime/context.py +280 -0
  311. streamlit/runtime/credentials.py +364 -0
  312. streamlit/runtime/forward_msg_cache.py +296 -0
  313. streamlit/runtime/forward_msg_queue.py +240 -0
  314. streamlit/runtime/fragment.py +477 -0
  315. streamlit/runtime/media_file_manager.py +234 -0
  316. streamlit/runtime/media_file_storage.py +143 -0
  317. streamlit/runtime/memory_media_file_storage.py +181 -0
  318. streamlit/runtime/memory_session_storage.py +77 -0
  319. streamlit/runtime/memory_uploaded_file_manager.py +138 -0
  320. streamlit/runtime/metrics_util.py +486 -0
  321. streamlit/runtime/pages_manager.py +165 -0
  322. streamlit/runtime/runtime.py +792 -0
  323. streamlit/runtime/runtime_util.py +106 -0
  324. streamlit/runtime/script_data.py +46 -0
  325. streamlit/runtime/scriptrunner/__init__.py +38 -0
  326. streamlit/runtime/scriptrunner/exec_code.py +159 -0
  327. streamlit/runtime/scriptrunner/magic.py +273 -0
  328. streamlit/runtime/scriptrunner/magic_funcs.py +32 -0
  329. streamlit/runtime/scriptrunner/script_cache.py +89 -0
  330. streamlit/runtime/scriptrunner/script_runner.py +756 -0
  331. streamlit/runtime/scriptrunner_utils/__init__.py +19 -0
  332. streamlit/runtime/scriptrunner_utils/exceptions.py +48 -0
  333. streamlit/runtime/scriptrunner_utils/script_requests.py +307 -0
  334. streamlit/runtime/scriptrunner_utils/script_run_context.py +287 -0
  335. streamlit/runtime/secrets.py +534 -0
  336. streamlit/runtime/session_manager.py +394 -0
  337. streamlit/runtime/state/__init__.py +41 -0
  338. streamlit/runtime/state/common.py +191 -0
  339. streamlit/runtime/state/query_params.py +205 -0
  340. streamlit/runtime/state/query_params_proxy.py +218 -0
  341. streamlit/runtime/state/safe_session_state.py +138 -0
  342. streamlit/runtime/state/session_state.py +772 -0
  343. streamlit/runtime/state/session_state_proxy.py +153 -0
  344. streamlit/runtime/state/widgets.py +135 -0
  345. streamlit/runtime/stats.py +109 -0
  346. streamlit/runtime/uploaded_file_manager.py +148 -0
  347. streamlit/runtime/websocket_session_manager.py +167 -0
  348. streamlit/source_util.py +98 -0
  349. streamlit/static/favicon.png +0 -0
  350. streamlit/static/index.html +61 -0
  351. streamlit/static/static/css/index.Bmkmz40k.css +1 -0
  352. streamlit/static/static/css/index.DpJG_94W.css +1 -0
  353. streamlit/static/static/css/index.DzuxGC_t.css +1 -0
  354. streamlit/static/static/js/FileDownload.esm.Bp9m5jrx.js +1 -0
  355. streamlit/static/static/js/FileHelper.D_3pbilj.js +5 -0
  356. streamlit/static/static/js/FormClearHelper.Ct2rwLXo.js +1 -0
  357. streamlit/static/static/js/Hooks.BKdzj5MJ.js +1 -0
  358. streamlit/static/static/js/InputInstructions.DB3QGNJP.js +1 -0
  359. streamlit/static/static/js/ProgressBar.D40A5xc2.js +2 -0
  360. streamlit/static/static/js/RenderInPortalIfExists.DLUCooTN.js +1 -0
  361. streamlit/static/static/js/Toolbar.BiGGIQun.js +1 -0
  362. streamlit/static/static/js/UploadFileInfo.C-jY39rj.js +1 -0
  363. streamlit/static/static/js/base-input.CQBQT24M.js +4 -0
  364. streamlit/static/static/js/checkbox.Buj8gd_M.js +9 -0
  365. streamlit/static/static/js/createDownloadLinkElement.DZMwyjvU.js +1 -0
  366. streamlit/static/static/js/createSuper.CesK3I23.js +1 -0
  367. streamlit/static/static/js/data-grid-overlay-editor.B69OOFM4.js +1 -0
  368. streamlit/static/static/js/downloader.BZQhlBNT.js +1 -0
  369. streamlit/static/static/js/es6.D9Zhqujy.js +2 -0
  370. streamlit/static/static/js/iframeResizer.contentWindow.CAzcBpCC.js +1 -0
  371. streamlit/static/static/js/index.08vcOOvb.js +1 -0
  372. streamlit/static/static/js/index.0uqKfJUS.js +1 -0
  373. streamlit/static/static/js/index.B02M5u69.js +203 -0
  374. streamlit/static/static/js/index.B7mcZKMx.js +1 -0
  375. streamlit/static/static/js/index.BAQDHFA_.js +1 -0
  376. streamlit/static/static/js/index.BI60cMVr.js +2 -0
  377. streamlit/static/static/js/index.BLug2inK.js +1 -0
  378. streamlit/static/static/js/index.BM6TMY8g.js +2 -0
  379. streamlit/static/static/js/index.BZ9p1t7G.js +1 -0
  380. streamlit/static/static/js/index.BZqa87a1.js +2 -0
  381. streamlit/static/static/js/index.BcsRUzZZ.js +1 -0
  382. streamlit/static/static/js/index.BgVMiY_P.js +197 -0
  383. streamlit/static/static/js/index.BtuGy7By.js +6 -0
  384. streamlit/static/static/js/index.BuDuBmrs.js +1 -0
  385. streamlit/static/static/js/index.BvXU2oKV.js +1 -0
  386. streamlit/static/static/js/index.BxcwPacT.js +73 -0
  387. streamlit/static/static/js/index.CWX8KB81.js +1 -0
  388. streamlit/static/static/js/index.CXzZTo_q.js +1 -0
  389. streamlit/static/static/js/index.CcRWp_KL.js +1 -0
  390. streamlit/static/static/js/index.Cd-_xe55.js +3 -0
  391. streamlit/static/static/js/index.CdG2PXln.js +4537 -0
  392. streamlit/static/static/js/index.CjXvXmcP.js +1 -0
  393. streamlit/static/static/js/index.D1HZENZx.js +776 -0
  394. streamlit/static/static/js/index.D21Efo64.js +1617 -0
  395. streamlit/static/static/js/index.D9WgGVBx.js +7 -0
  396. streamlit/static/static/js/index.DEcsHtvb.js +12 -0
  397. streamlit/static/static/js/index.DFeMfr_K.js +1 -0
  398. streamlit/static/static/js/index.DHFBoItz.js +1 -0
  399. streamlit/static/static/js/index.D_PrBKnJ.js +3 -0
  400. streamlit/static/static/js/index.DmuRkekN.js +3855 -0
  401. streamlit/static/static/js/index.Do6eY8sf.js +1 -0
  402. streamlit/static/static/js/index.Dz3lP2P-.js +1 -0
  403. streamlit/static/static/js/index.Dz_UqF-s.js +1 -0
  404. streamlit/static/static/js/index.GkSUsPhJ.js +1 -0
  405. streamlit/static/static/js/index.H1U1IC_d.js +3 -0
  406. streamlit/static/static/js/index.g6p_4DPr.js +1 -0
  407. streamlit/static/static/js/index.g9x_GKss.js +1 -0
  408. streamlit/static/static/js/index.zo9jm08y.js +1 -0
  409. streamlit/static/static/js/input.DnaFglHq.js +2 -0
  410. streamlit/static/static/js/inputUtils.CQWz5UKz.js +1 -0
  411. streamlit/static/static/js/memory.Crb9x4-F.js +1 -0
  412. streamlit/static/static/js/mergeWith.ouAz0sK3.js +1 -0
  413. streamlit/static/static/js/number-overlay-editor._UaN-O48.js +9 -0
  414. streamlit/static/static/js/possibleConstructorReturn.CtGjGFHz.js +1 -0
  415. streamlit/static/static/js/sandbox.CBybYOhV.js +1 -0
  416. streamlit/static/static/js/sprintf.D7DtBTRn.js +1 -0
  417. streamlit/static/static/js/textarea.Cb_uJt5U.js +2 -0
  418. streamlit/static/static/js/threshold.DjX0wlsa.js +1 -0
  419. streamlit/static/static/js/timepicker.DKT7pfoF.js +4 -0
  420. streamlit/static/static/js/timer.CAwTRJ_g.js +1 -0
  421. streamlit/static/static/js/toConsumableArray.05Ikp13-.js +3 -0
  422. streamlit/static/static/js/uniqueId.D2FMWUEI.js +1 -0
  423. streamlit/static/static/js/useBasicWidgetState.urnZLANY.js +1 -0
  424. streamlit/static/static/js/useOnInputChange.BOKIIdJ1.js +1 -0
  425. streamlit/static/static/js/value.CgPGBV_l.js +1 -0
  426. streamlit/static/static/js/withFullScreenWrapper.C_N8J0Xx.js +1 -0
  427. streamlit/static/static/media/KaTeX_AMS-Regular.BQhdFMY1.woff2 +0 -0
  428. streamlit/static/static/media/KaTeX_AMS-Regular.DMm9YOAa.woff +0 -0
  429. streamlit/static/static/media/KaTeX_AMS-Regular.DRggAlZN.ttf +0 -0
  430. streamlit/static/static/media/KaTeX_Caligraphic-Bold.ATXxdsX0.ttf +0 -0
  431. streamlit/static/static/media/KaTeX_Caligraphic-Bold.BEiXGLvX.woff +0 -0
  432. streamlit/static/static/media/KaTeX_Caligraphic-Bold.Dq_IR9rO.woff2 +0 -0
  433. streamlit/static/static/media/KaTeX_Caligraphic-Regular.CTRA-rTL.woff +0 -0
  434. streamlit/static/static/media/KaTeX_Caligraphic-Regular.Di6jR-x-.woff2 +0 -0
  435. streamlit/static/static/media/KaTeX_Caligraphic-Regular.wX97UBjC.ttf +0 -0
  436. streamlit/static/static/media/KaTeX_Fraktur-Bold.BdnERNNW.ttf +0 -0
  437. streamlit/static/static/media/KaTeX_Fraktur-Bold.BsDP51OF.woff +0 -0
  438. streamlit/static/static/media/KaTeX_Fraktur-Bold.CL6g_b3V.woff2 +0 -0
  439. streamlit/static/static/media/KaTeX_Fraktur-Regular.CB_wures.ttf +0 -0
  440. streamlit/static/static/media/KaTeX_Fraktur-Regular.CTYiF6lA.woff2 +0 -0
  441. streamlit/static/static/media/KaTeX_Fraktur-Regular.Dxdc4cR9.woff +0 -0
  442. streamlit/static/static/media/KaTeX_Main-Bold.Cx986IdX.woff2 +0 -0
  443. streamlit/static/static/media/KaTeX_Main-Bold.Jm3AIy58.woff +0 -0
  444. streamlit/static/static/media/KaTeX_Main-Bold.waoOVXN0.ttf +0 -0
  445. streamlit/static/static/media/KaTeX_Main-BoldItalic.DxDJ3AOS.woff2 +0 -0
  446. streamlit/static/static/media/KaTeX_Main-BoldItalic.DzxPMmG6.ttf +0 -0
  447. streamlit/static/static/media/KaTeX_Main-BoldItalic.SpSLRI95.woff +0 -0
  448. streamlit/static/static/media/KaTeX_Main-Italic.3WenGoN9.ttf +0 -0
  449. streamlit/static/static/media/KaTeX_Main-Italic.BMLOBm91.woff +0 -0
  450. streamlit/static/static/media/KaTeX_Main-Italic.NWA7e6Wa.woff2 +0 -0
  451. streamlit/static/static/media/KaTeX_Main-Regular.B22Nviop.woff2 +0 -0
  452. streamlit/static/static/media/KaTeX_Main-Regular.Dr94JaBh.woff +0 -0
  453. streamlit/static/static/media/KaTeX_Main-Regular.ypZvNtVU.ttf +0 -0
  454. streamlit/static/static/media/KaTeX_Math-BoldItalic.B3XSjfu4.ttf +0 -0
  455. streamlit/static/static/media/KaTeX_Math-BoldItalic.CZnvNsCZ.woff2 +0 -0
  456. streamlit/static/static/media/KaTeX_Math-BoldItalic.iY-2wyZ7.woff +0 -0
  457. streamlit/static/static/media/KaTeX_Math-Italic.DA0__PXp.woff +0 -0
  458. streamlit/static/static/media/KaTeX_Math-Italic.flOr_0UB.ttf +0 -0
  459. streamlit/static/static/media/KaTeX_Math-Italic.t53AETM-.woff2 +0 -0
  460. streamlit/static/static/media/KaTeX_SansSerif-Bold.CFMepnvq.ttf +0 -0
  461. streamlit/static/static/media/KaTeX_SansSerif-Bold.D1sUS0GD.woff2 +0 -0
  462. streamlit/static/static/media/KaTeX_SansSerif-Bold.DbIhKOiC.woff +0 -0
  463. streamlit/static/static/media/KaTeX_SansSerif-Italic.C3H0VqGB.woff2 +0 -0
  464. streamlit/static/static/media/KaTeX_SansSerif-Italic.DN2j7dab.woff +0 -0
  465. streamlit/static/static/media/KaTeX_SansSerif-Italic.YYjJ1zSn.ttf +0 -0
  466. streamlit/static/static/media/KaTeX_SansSerif-Regular.BNo7hRIc.ttf +0 -0
  467. streamlit/static/static/media/KaTeX_SansSerif-Regular.CS6fqUqJ.woff +0 -0
  468. streamlit/static/static/media/KaTeX_SansSerif-Regular.DDBCnlJ7.woff2 +0 -0
  469. streamlit/static/static/media/KaTeX_Script-Regular.C5JkGWo-.ttf +0 -0
  470. streamlit/static/static/media/KaTeX_Script-Regular.D3wIWfF6.woff2 +0 -0
  471. streamlit/static/static/media/KaTeX_Script-Regular.D5yQViql.woff +0 -0
  472. streamlit/static/static/media/KaTeX_Size1-Regular.C195tn64.woff +0 -0
  473. streamlit/static/static/media/KaTeX_Size1-Regular.Dbsnue_I.ttf +0 -0
  474. streamlit/static/static/media/KaTeX_Size1-Regular.mCD8mA8B.woff2 +0 -0
  475. streamlit/static/static/media/KaTeX_Size2-Regular.B7gKUWhC.ttf +0 -0
  476. streamlit/static/static/media/KaTeX_Size2-Regular.Dy4dx90m.woff2 +0 -0
  477. streamlit/static/static/media/KaTeX_Size2-Regular.oD1tc_U0.woff +0 -0
  478. streamlit/static/static/media/KaTeX_Size3-Regular.CTq5MqoE.woff +0 -0
  479. streamlit/static/static/media/KaTeX_Size3-Regular.DgpXs0kz.ttf +0 -0
  480. streamlit/static/static/media/KaTeX_Size4-Regular.BF-4gkZK.woff +0 -0
  481. streamlit/static/static/media/KaTeX_Size4-Regular.DWFBv043.ttf +0 -0
  482. streamlit/static/static/media/KaTeX_Size4-Regular.Dl5lxZxV.woff2 +0 -0
  483. streamlit/static/static/media/KaTeX_Typewriter-Regular.C0xS9mPB.woff +0 -0
  484. streamlit/static/static/media/KaTeX_Typewriter-Regular.CO6r4hn1.woff2 +0 -0
  485. streamlit/static/static/media/KaTeX_Typewriter-Regular.D3Ib7_Hf.ttf +0 -0
  486. streamlit/static/static/media/MaterialSymbols-Rounded.DcZbplWk.woff2 +0 -0
  487. streamlit/static/static/media/SourceCodePro-Bold.CFEfr7-q.woff2 +0 -0
  488. streamlit/static/static/media/SourceCodePro-BoldItalic.C-LkFXxa.woff2 +0 -0
  489. streamlit/static/static/media/SourceCodePro-Italic.CxFOx7N-.woff2 +0 -0
  490. streamlit/static/static/media/SourceCodePro-Regular.CBOlD63d.woff2 +0 -0
  491. streamlit/static/static/media/SourceCodePro-SemiBold.CFHwW3Wd.woff2 +0 -0
  492. streamlit/static/static/media/SourceCodePro-SemiBoldItalic.Cg2yRu82.woff2 +0 -0
  493. streamlit/static/static/media/SourceSansPro-Bold.-6c9oR8J.woff2 +0 -0
  494. streamlit/static/static/media/SourceSansPro-BoldItalic.DmM_grLY.woff2 +0 -0
  495. streamlit/static/static/media/SourceSansPro-Italic.I1ipWe7Q.woff2 +0 -0
  496. streamlit/static/static/media/SourceSansPro-Regular.DZLUzqI4.woff2 +0 -0
  497. streamlit/static/static/media/SourceSansPro-SemiBold.sKQIyTMz.woff2 +0 -0
  498. streamlit/static/static/media/SourceSansPro-SemiBoldItalic.C0wP0icr.woff2 +0 -0
  499. streamlit/static/static/media/SourceSerifPro-Bold.8TUnKj4x.woff2 +0 -0
  500. streamlit/static/static/media/SourceSerifPro-BoldItalic.CBVO7Ve7.woff2 +0 -0
  501. streamlit/static/static/media/SourceSerifPro-Italic.DkFgL2HZ.woff2 +0 -0
  502. streamlit/static/static/media/SourceSerifPro-Regular.CNJNET2S.woff2 +0 -0
  503. streamlit/static/static/media/SourceSerifPro-SemiBold.CHyh9GC5.woff2 +0 -0
  504. streamlit/static/static/media/SourceSerifPro-SemiBoldItalic.CBtz8sWN.woff2 +0 -0
  505. streamlit/static/static/media/balloon-0.Czj7AKwE.png +0 -0
  506. streamlit/static/static/media/balloon-1.CNvFFrND.png +0 -0
  507. streamlit/static/static/media/balloon-2.DTvC6B1t.png +0 -0
  508. streamlit/static/static/media/balloon-3.CgSk4tbL.png +0 -0
  509. streamlit/static/static/media/balloon-4.mbtFrzxf.png +0 -0
  510. streamlit/static/static/media/balloon-5.CSwkUfRA.png +0 -0
  511. streamlit/static/static/media/fireworks.B4d-_KUe.gif +0 -0
  512. streamlit/static/static/media/flake-0.DgWaVvm5.png +0 -0
  513. streamlit/static/static/media/flake-1.B2r5AHMK.png +0 -0
  514. streamlit/static/static/media/flake-2.BnWSExPC.png +0 -0
  515. streamlit/static/static/media/snowflake.JU2jBHL8.svg +11 -0
  516. streamlit/string_util.py +203 -0
  517. streamlit/temporary_directory.py +56 -0
  518. streamlit/testing/__init__.py +13 -0
  519. streamlit/testing/v1/__init__.py +17 -0
  520. streamlit/testing/v1/app_test.py +1050 -0
  521. streamlit/testing/v1/element_tree.py +2083 -0
  522. streamlit/testing/v1/local_script_runner.py +180 -0
  523. streamlit/testing/v1/util.py +53 -0
  524. streamlit/time_util.py +75 -0
  525. streamlit/type_util.py +460 -0
  526. streamlit/url_util.py +122 -0
  527. streamlit/user_info.py +519 -0
  528. streamlit/util.py +72 -0
  529. streamlit/vendor/__init__.py +0 -0
  530. streamlit/vendor/pympler/__init__.py +0 -0
  531. streamlit/vendor/pympler/asizeof.py +2869 -0
  532. streamlit/version.py +18 -0
  533. streamlit/watcher/__init__.py +28 -0
  534. streamlit/watcher/event_based_path_watcher.py +406 -0
  535. streamlit/watcher/folder_black_list.py +82 -0
  536. streamlit/watcher/local_sources_watcher.py +233 -0
  537. streamlit/watcher/path_watcher.py +185 -0
  538. streamlit/watcher/polling_path_watcher.py +124 -0
  539. streamlit/watcher/util.py +207 -0
  540. streamlit/web/__init__.py +13 -0
  541. streamlit/web/bootstrap.py +353 -0
  542. streamlit/web/cache_storage_manager_config.py +38 -0
  543. streamlit/web/cli.py +369 -0
  544. streamlit/web/server/__init__.py +26 -0
  545. streamlit/web/server/app_static_file_handler.py +93 -0
  546. streamlit/web/server/authlib_tornado_integration.py +60 -0
  547. streamlit/web/server/browser_websocket_handler.py +246 -0
  548. streamlit/web/server/component_request_handler.py +116 -0
  549. streamlit/web/server/media_file_handler.py +141 -0
  550. streamlit/web/server/oauth_authlib_routes.py +176 -0
  551. streamlit/web/server/oidc_mixin.py +108 -0
  552. streamlit/web/server/routes.py +295 -0
  553. streamlit/web/server/server.py +479 -0
  554. streamlit/web/server/server_util.py +161 -0
  555. streamlit/web/server/stats_request_handler.py +95 -0
  556. streamlit/web/server/upload_file_request_handler.py +137 -0
  557. streamlit/web/server/websocket_headers.py +56 -0
  558. streamlit_nightly-1.43.2.dev20250307.data/scripts/streamlit.cmd +16 -0
  559. streamlit_nightly-1.43.2.dev20250307.dist-info/METADATA +207 -0
  560. streamlit_nightly-1.43.2.dev20250307.dist-info/RECORD +563 -0
  561. streamlit_nightly-1.43.2.dev20250307.dist-info/WHEEL +5 -0
  562. streamlit_nightly-1.43.2.dev20250307.dist-info/entry_points.txt +2 -0
  563. streamlit_nightly-1.43.2.dev20250307.dist-info/top_level.txt +1 -0
@@ -0,0 +1,194 @@
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 TYPE_CHECKING, Any, Final
18
+
19
+ from streamlit import config, errors, logger, runtime
20
+ from streamlit.elements.lib.form_utils import is_in_form
21
+ from streamlit.errors import (
22
+ StreamlitAPIWarning,
23
+ StreamlitFragmentWidgetsNotAllowedOutsideError,
24
+ StreamlitInvalidFormCallbackError,
25
+ StreamlitValueAssignmentNotAllowedError,
26
+ )
27
+ from streamlit.runtime.scriptrunner_utils.script_run_context import (
28
+ get_script_run_ctx,
29
+ in_cached_function,
30
+ )
31
+ from streamlit.runtime.state import WidgetCallback, get_session_state
32
+
33
+ if TYPE_CHECKING:
34
+ from collections.abc import Sequence
35
+
36
+ from streamlit.delta_generator import DeltaGenerator
37
+
38
+
39
+ _LOGGER: Final = logger.get_logger(__name__)
40
+
41
+
42
+ def check_callback_rules(dg: DeltaGenerator, on_change: WidgetCallback | None) -> None:
43
+ """Ensures that widgets other than `st.form_submit_button` within a form don't have
44
+ an on_change callback set.
45
+
46
+ Raises
47
+ ------
48
+ StreamlitInvalidFormCallbackError:
49
+ Raised when the described rule is violated.
50
+ """
51
+
52
+ if runtime.exists() and is_in_form(dg) and on_change is not None:
53
+ raise StreamlitInvalidFormCallbackError()
54
+
55
+
56
+ _shown_default_value_warning: bool = False
57
+
58
+
59
+ def check_session_state_rules(
60
+ default_value: Any, key: str | None, writes_allowed: bool = True
61
+ ) -> None:
62
+ """Ensures that no values are set for widgets with the given key when writing
63
+ is not allowed.
64
+
65
+ Additionally, if `global.disableWidgetStateDuplicationWarning` is False a warning is
66
+ shown when a widget has a default value but its value is also set via session state.
67
+
68
+ Raises
69
+ ------
70
+ StreamlitAPIException:
71
+ Raised when the described rule is violated.
72
+ """
73
+ global _shown_default_value_warning
74
+
75
+ if key is None or not runtime.exists():
76
+ return
77
+
78
+ session_state = get_session_state()
79
+ if not session_state.is_new_state_value(key):
80
+ return
81
+
82
+ if not writes_allowed:
83
+ raise StreamlitValueAssignmentNotAllowedError(key=key)
84
+
85
+ if (
86
+ default_value is not None
87
+ and not _shown_default_value_warning
88
+ and not config.get_option("global.disableWidgetStateDuplicationWarning")
89
+ ):
90
+ from streamlit import warning
91
+
92
+ warning(
93
+ f'The widget with key "{key}" was created with a default value but'
94
+ " also had its value set via the Session State API."
95
+ )
96
+ _shown_default_value_warning = True
97
+
98
+
99
+ class CachedWidgetWarning(StreamlitAPIWarning):
100
+ def __init__(self):
101
+ super().__init__(
102
+ """
103
+ Your script uses a widget command in a cached function
104
+ (function decorated with `@st.cache_data` or `@st.cache_resource`).
105
+ This code will only be called when we detect a cache "miss",
106
+ which can lead to unexpected results.
107
+
108
+ To fix this, move all widget commands outside the cached function.
109
+ """
110
+ )
111
+
112
+
113
+ def check_cache_replay_rules() -> None:
114
+ """Check if a widget is allowed to be used in the current context.
115
+ More specifically, this checks if the current context is inside a
116
+ cached function that disallows widget usage. If so, it raises a warning.
117
+
118
+ If there are other similar checks in the future, we could extend this
119
+ function to check for those as well. And rename it to check_widget_usage_rules.
120
+ """
121
+ if in_cached_function.get():
122
+ from streamlit import exception
123
+
124
+ # We use an exception here to show a proper stack trace
125
+ # that indicates to the user where the issue is.
126
+ exception(CachedWidgetWarning())
127
+
128
+
129
+ def check_fragment_path_policy(dg: DeltaGenerator):
130
+ """Ensures that the current widget is not written outside of the
131
+ fragment's delta path.
132
+
133
+ Should be called by ever element that acts as a widget.
134
+ We don't allow writing widgets from within a widget to the outside path
135
+ because it can lead to unexpected behavior. For elements, this is okay
136
+ because they do not trigger a re-run.
137
+ """
138
+
139
+ ctx = get_script_run_ctx()
140
+ # Check is only relevant for fragments
141
+ if ctx is None or ctx.current_fragment_id is None:
142
+ return
143
+
144
+ current_fragment_delta_path = ctx.current_fragment_delta_path
145
+ current_cursor = dg._active_dg._cursor
146
+ if current_cursor is None:
147
+ return
148
+
149
+ current_cursor_delta_path = current_cursor.delta_path
150
+
151
+ # the elements delta path cannot be smaller than the fragment's delta path if it is
152
+ # inside of the fragment
153
+ if len(current_cursor_delta_path) < len(current_fragment_delta_path):
154
+ raise StreamlitFragmentWidgetsNotAllowedOutsideError()
155
+
156
+ # all path indices of the fragment-path must occur in the inner-elements delta path,
157
+ # otherwise it is outside of the fragment container
158
+ for index, path_index in enumerate(current_fragment_delta_path):
159
+ if current_cursor_delta_path[index] != path_index:
160
+ raise StreamlitFragmentWidgetsNotAllowedOutsideError()
161
+
162
+
163
+ def check_widget_policies(
164
+ dg: DeltaGenerator,
165
+ key: str | None,
166
+ on_change: WidgetCallback | None = None,
167
+ *,
168
+ default_value: Sequence[Any] | Any | None = None,
169
+ writes_allowed: bool = True,
170
+ enable_check_callback_rules: bool = True,
171
+ ):
172
+ """Check all widget policies for the given DeltaGenerator."""
173
+ check_fragment_path_policy(dg)
174
+ check_cache_replay_rules()
175
+ if enable_check_callback_rules:
176
+ check_callback_rules(dg, on_change)
177
+ check_session_state_rules(
178
+ default_value=default_value, key=key, writes_allowed=writes_allowed
179
+ )
180
+
181
+
182
+ def maybe_raise_label_warnings(label: str | None, label_visibility: str | None):
183
+ if not label:
184
+ _LOGGER.warning(
185
+ "`label` got an empty value. This is discouraged for accessibility "
186
+ "reasons and may be disallowed in the future by raising an exception. "
187
+ "Please provide a non-empty label and hide it with label_visibility "
188
+ "if needed."
189
+ )
190
+ if label_visibility not in ("visible", "hidden", "collapsed"):
191
+ raise errors.StreamlitAPIException(
192
+ f"Unsupported label_visibility option '{label_visibility}'. "
193
+ f"Valid values are 'visible', 'hidden' or 'collapsed'."
194
+ )
@@ -0,0 +1,207 @@
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 contextlib
18
+
19
+
20
+ def configure_streamlit_plotly_theme() -> None:
21
+ """Configure the Streamlit chart theme for Plotly.
22
+
23
+ The theme is only configured if Plotly is installed.
24
+ """
25
+ # We do nothing if Plotly is not installed. This is expected since Plotly is an optional dependency.
26
+ with contextlib.suppress(ImportError):
27
+ import plotly.graph_objects as go
28
+ import plotly.io as pio
29
+
30
+ # This is the streamlit theme for plotly where we pass in a template.data
31
+ # and a template.layout.
32
+ # Template.data is for changing specific graph properties in a general aspect
33
+ # such as Contour plots or Waterfall plots.
34
+ # Template.layout is for changing things such as the x axis and fonts and other
35
+ # general layout properties for general graphs.
36
+ # We pass in temporary colors to the frontend and the frontend will replace
37
+ # those colors because we want to change colors based on the background color.
38
+ # Start at #0000001 because developers may be likely to use #000000
39
+ CATEGORY_0 = "#000001"
40
+ CATEGORY_1 = "#000002"
41
+ CATEGORY_2 = "#000003"
42
+ CATEGORY_3 = "#000004"
43
+ CATEGORY_4 = "#000005"
44
+ CATEGORY_5 = "#000006"
45
+ CATEGORY_6 = "#000007"
46
+ CATEGORY_7 = "#000008"
47
+ CATEGORY_8 = "#000009"
48
+ CATEGORY_9 = "#000010"
49
+
50
+ SEQUENTIAL_0 = "#000011"
51
+ SEQUENTIAL_1 = "#000012"
52
+ SEQUENTIAL_2 = "#000013"
53
+ SEQUENTIAL_3 = "#000014"
54
+ SEQUENTIAL_4 = "#000015"
55
+ SEQUENTIAL_5 = "#000016"
56
+ SEQUENTIAL_6 = "#000017"
57
+ SEQUENTIAL_7 = "#000018"
58
+ SEQUENTIAL_8 = "#000019"
59
+ SEQUENTIAL_9 = "#000020"
60
+
61
+ DIVERGING_0 = "#000021"
62
+ DIVERGING_1 = "#000022"
63
+ DIVERGING_2 = "#000023"
64
+ DIVERGING_3 = "#000024"
65
+ DIVERGING_4 = "#000025"
66
+ DIVERGING_5 = "#000026"
67
+ DIVERGING_6 = "#000027"
68
+ DIVERGING_7 = "#000028"
69
+ DIVERGING_8 = "#000029"
70
+ DIVERGING_9 = "#000030"
71
+ DIVERGING_10 = "#000031"
72
+
73
+ INCREASING = "#000032"
74
+ DECREASING = "#000033"
75
+ TOTAL = "#000034"
76
+
77
+ GRAY_70 = "#000036"
78
+ GRAY_90 = "#000037"
79
+ BG_COLOR = "#000038"
80
+ FADED_TEXT_05 = "#000039"
81
+ BG_MIX = "#000040"
82
+
83
+ # Plotly represents continuous colorscale through an array of pairs.
84
+ # The pair's first index is the starting point and the next pair's first index is the end point.
85
+ # The pair's second index is the starting color and the next pair's second index is the end color.
86
+ # For more information, please refer to https://plotly.com/python/colorscales/
87
+
88
+ streamlit_colorscale = [
89
+ [0.0, SEQUENTIAL_0],
90
+ [0.1111111111111111, SEQUENTIAL_1],
91
+ [0.2222222222222222, SEQUENTIAL_2],
92
+ [0.3333333333333333, SEQUENTIAL_3],
93
+ [0.4444444444444444, SEQUENTIAL_4],
94
+ [0.5555555555555556, SEQUENTIAL_5],
95
+ [0.6666666666666666, SEQUENTIAL_6],
96
+ [0.7777777777777778, SEQUENTIAL_7],
97
+ [0.8888888888888888, SEQUENTIAL_8],
98
+ [1.0, SEQUENTIAL_9],
99
+ ]
100
+
101
+ pio.templates["streamlit"] = go.layout.Template(
102
+ data=go.layout.template.Data(
103
+ candlestick=[
104
+ go.layout.template.data.Candlestick(
105
+ decreasing=go.candlestick.Decreasing(
106
+ line=go.candlestick.decreasing.Line(color=DECREASING)
107
+ ),
108
+ increasing=go.candlestick.Increasing(
109
+ line=go.candlestick.increasing.Line(color=INCREASING)
110
+ ),
111
+ )
112
+ ],
113
+ contour=[
114
+ go.layout.template.data.Contour(colorscale=streamlit_colorscale)
115
+ ],
116
+ contourcarpet=[
117
+ go.layout.template.data.Contourcarpet(
118
+ colorscale=streamlit_colorscale
119
+ )
120
+ ],
121
+ heatmap=[
122
+ go.layout.template.data.Heatmap(colorscale=streamlit_colorscale)
123
+ ],
124
+ histogram2d=[
125
+ go.layout.template.data.Histogram2d(colorscale=streamlit_colorscale)
126
+ ],
127
+ icicle=[
128
+ go.layout.template.data.Icicle(
129
+ textfont=go.icicle.Textfont(color="white")
130
+ )
131
+ ],
132
+ sankey=[
133
+ go.layout.template.data.Sankey(
134
+ textfont=go.sankey.Textfont(color=GRAY_70)
135
+ )
136
+ ],
137
+ scatter=[
138
+ go.layout.template.data.Scatter(
139
+ marker=go.scatter.Marker(line=go.scatter.marker.Line(width=0))
140
+ )
141
+ ],
142
+ table=[
143
+ go.layout.template.data.Table(
144
+ cells=go.table.Cells(
145
+ fill=go.table.cells.Fill(color=BG_COLOR),
146
+ font=go.table.cells.Font(color=GRAY_90),
147
+ line=go.table.cells.Line(color=FADED_TEXT_05),
148
+ ),
149
+ header=go.table.Header(
150
+ font=go.table.header.Font(color=GRAY_70),
151
+ line=go.table.header.Line(color=FADED_TEXT_05),
152
+ fill=go.table.header.Fill(color=BG_MIX),
153
+ ),
154
+ )
155
+ ],
156
+ waterfall=[
157
+ go.layout.template.data.Waterfall(
158
+ increasing=go.waterfall.Increasing(
159
+ marker=go.waterfall.increasing.Marker(color=INCREASING)
160
+ ),
161
+ decreasing=go.waterfall.Decreasing(
162
+ marker=go.waterfall.decreasing.Marker(color=DECREASING)
163
+ ),
164
+ totals=go.waterfall.Totals(
165
+ marker=go.waterfall.totals.Marker(color=TOTAL)
166
+ ),
167
+ connector=go.waterfall.Connector(
168
+ line=go.waterfall.connector.Line(color=GRAY_70, width=2)
169
+ ),
170
+ )
171
+ ],
172
+ ),
173
+ layout=go.Layout(
174
+ colorway=[
175
+ CATEGORY_0,
176
+ CATEGORY_1,
177
+ CATEGORY_2,
178
+ CATEGORY_3,
179
+ CATEGORY_4,
180
+ CATEGORY_5,
181
+ CATEGORY_6,
182
+ CATEGORY_7,
183
+ CATEGORY_8,
184
+ CATEGORY_9,
185
+ ],
186
+ colorscale=go.layout.Colorscale(
187
+ sequential=streamlit_colorscale,
188
+ sequentialminus=streamlit_colorscale,
189
+ diverging=[
190
+ [0.0, DIVERGING_0],
191
+ [0.1, DIVERGING_1],
192
+ [0.2, DIVERGING_2],
193
+ [0.3, DIVERGING_3],
194
+ [0.4, DIVERGING_4],
195
+ [0.5, DIVERGING_5],
196
+ [0.6, DIVERGING_6],
197
+ [0.7, DIVERGING_7],
198
+ [0.8, DIVERGING_8],
199
+ [0.9, DIVERGING_9],
200
+ [1.0, DIVERGING_10],
201
+ ],
202
+ ),
203
+ coloraxis=go.layout.Coloraxis(colorscale=streamlit_colorscale),
204
+ ),
205
+ )
206
+
207
+ pio.templates.default = "streamlit"
@@ -0,0 +1,176 @@
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 io
18
+ import os
19
+ import re
20
+ from pathlib import Path
21
+
22
+ from streamlit import runtime
23
+ from streamlit.runtime import caching
24
+ from streamlit.util import calc_md5
25
+
26
+ # Regular expression to match the SRT timestamp format
27
+ # It matches the
28
+ # "hours:minutes:seconds,milliseconds --> hours:minutes:seconds,milliseconds" format
29
+ SRT_VALIDATION_REGEX = r"\d{2}:\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3}"
30
+
31
+ SRT_CONVERSION_REGEX = r"(\d{2}:\d{2}:\d{2}),(\d{3})"
32
+
33
+ SUBTITLE_ALLOWED_FORMATS = (".srt", ".vtt")
34
+
35
+
36
+ def _is_srt(stream: str | io.BytesIO | bytes) -> bool:
37
+ # Handle raw bytes
38
+ if isinstance(stream, bytes):
39
+ stream = io.BytesIO(stream)
40
+
41
+ # Convert str to io.BytesIO if 'stream' is a string
42
+ if isinstance(stream, str):
43
+ stream = io.BytesIO(stream.encode("utf-8"))
44
+
45
+ # Set the stream position to the beginning in case it's been moved
46
+ stream.seek(0)
47
+
48
+ # Read enough bytes to reliably check for SRT patterns
49
+ # This might be adjusted, but 33 bytes should be enough to read the first numeric
50
+ # line, the full timestamp line, and a bit of the next line
51
+ header = stream.read(33)
52
+
53
+ try:
54
+ header_str = header.decode("utf-8").strip() # Decode and strip whitespace
55
+ except UnicodeDecodeError:
56
+ # If it's not valid utf-8, it's probably not a valid SRT file
57
+ return False
58
+
59
+ # Split the header into lines and process them
60
+ lines = header_str.split("\n")
61
+
62
+ # Check for the pattern of an SRT file: digit(s), newline, timestamp
63
+ if len(lines) >= 2 and lines[0].isdigit():
64
+ match = re.search(SRT_VALIDATION_REGEX, lines[1])
65
+ if match:
66
+ return True
67
+
68
+ return False
69
+
70
+
71
+ def _srt_to_vtt(srt_data: str | bytes) -> bytes:
72
+ """
73
+ Convert subtitles from SubRip (.srt) format to WebVTT (.vtt) format.
74
+ This function accepts the content of the .srt file either as a string
75
+ or as a BytesIO stream.
76
+ Parameters
77
+ ----------
78
+ srt_data : str or bytes
79
+ The content of the .srt file as a string or a bytes stream.
80
+ Returns
81
+ -------
82
+ bytes
83
+ The content converted into .vtt format.
84
+ """
85
+
86
+ # If the input is a bytes stream, convert it to a string
87
+ if isinstance(srt_data, bytes):
88
+ # Decode the bytes to a UTF-8 string
89
+ try:
90
+ srt_data = srt_data.decode("utf-8")
91
+ except UnicodeDecodeError as e:
92
+ raise ValueError("Could not decode the input stream as UTF-8.") from e
93
+ if not isinstance(srt_data, str):
94
+ # If it's not a string by this point, something is wrong.
95
+ raise TypeError(
96
+ f"Input must be a string or a bytes stream, not {type(srt_data)}."
97
+ )
98
+
99
+ # Replace SubRip timing with WebVTT timing
100
+ vtt_data = re.sub(SRT_CONVERSION_REGEX, r"\1.\2", srt_data)
101
+
102
+ # Add WebVTT file header
103
+ vtt_content = "WEBVTT\n\n" + vtt_data
104
+ # Convert the vtt content to bytes
105
+ vtt_content = vtt_content.strip().encode("utf-8")
106
+
107
+ return vtt_content
108
+
109
+
110
+ def _handle_string_or_path_data(data_or_path: str | Path) -> bytes:
111
+ """Handles string data, either as a file path or raw content."""
112
+ if os.path.isfile(data_or_path):
113
+ path = Path(data_or_path)
114
+ file_extension = path.suffix.lower()
115
+
116
+ if file_extension not in SUBTITLE_ALLOWED_FORMATS:
117
+ raise ValueError(
118
+ f"Incorrect subtitle format {file_extension}. Subtitles must be in "
119
+ f"one of the following formats: {', '.join(SUBTITLE_ALLOWED_FORMATS)}"
120
+ )
121
+ with open(data_or_path, "rb") as file:
122
+ content = file.read()
123
+ return _srt_to_vtt(content) if file_extension == ".srt" else content
124
+ elif isinstance(data_or_path, Path):
125
+ raise ValueError(f"File {data_or_path} does not exist.")
126
+
127
+ content_string = data_or_path.strip()
128
+
129
+ if content_string.startswith("WEBVTT") or content_string == "":
130
+ return content_string.encode("utf-8")
131
+ elif _is_srt(content_string):
132
+ return _srt_to_vtt(content_string)
133
+ raise ValueError("The provided string neither matches valid VTT nor SRT format.")
134
+
135
+
136
+ def _handle_stream_data(stream: io.BytesIO) -> bytes:
137
+ """Handles io.BytesIO data, converting SRT to VTT content if needed."""
138
+ stream.seek(0)
139
+ stream_data = stream.getvalue()
140
+ return _srt_to_vtt(stream_data) if _is_srt(stream) else stream_data
141
+
142
+
143
+ def _handle_bytes_data(data: bytes) -> bytes:
144
+ """Handles io.BytesIO data, converting SRT to VTT content if needed."""
145
+ return _srt_to_vtt(data) if _is_srt(data) else data
146
+
147
+
148
+ def process_subtitle_data(
149
+ coordinates: str,
150
+ data: str | bytes | Path | io.BytesIO,
151
+ label: str,
152
+ ) -> str:
153
+ # Determine the type of data and process accordingly
154
+ if isinstance(data, (str, Path)):
155
+ subtitle_data = _handle_string_or_path_data(data)
156
+ elif isinstance(data, io.BytesIO):
157
+ subtitle_data = _handle_stream_data(data)
158
+ elif isinstance(data, bytes):
159
+ subtitle_data = _handle_bytes_data(data)
160
+ else:
161
+ raise TypeError(f"Invalid binary data format for subtitle: {type(data)}.")
162
+
163
+ if runtime.exists():
164
+ filename = calc_md5(label.encode())
165
+ # Save the processed data and return the file URL
166
+ file_url = runtime.get_instance().media_file_mgr.add(
167
+ path_or_data=subtitle_data,
168
+ mimetype="text/vtt",
169
+ coordinates=coordinates,
170
+ file_name=f"{filename}.vtt",
171
+ )
172
+ caching.save_media_data(subtitle_data, "text/vtt", coordinates)
173
+ return file_url
174
+ else:
175
+ # When running in "raw mode", we can't access the MediaFileManager.
176
+ return ""