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,441 @@
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 collections.abc import Sequence
21
+ from enum import IntEnum
22
+ from pathlib import Path
23
+ from typing import TYPE_CHECKING, Final, Literal, Union, cast
24
+
25
+ from typing_extensions import TypeAlias
26
+
27
+ from streamlit import runtime, url_util
28
+ from streamlit.errors import StreamlitAPIException
29
+ from streamlit.runtime import caching
30
+ from streamlit.type_util import NumpyShape
31
+
32
+ if TYPE_CHECKING:
33
+ from typing import Any
34
+
35
+ import numpy.typing as npt
36
+ from PIL import GifImagePlugin, Image, ImageFile
37
+
38
+ from streamlit.proto.Image_pb2 import ImageList as ImageListProto
39
+
40
+ PILImage: TypeAlias = Union[
41
+ "ImageFile.ImageFile", "Image.Image", "GifImagePlugin.GifImageFile"
42
+ ]
43
+ AtomicImage: TypeAlias = Union[
44
+ PILImage, "npt.NDArray[Any]", io.BytesIO, str, Path, bytes
45
+ ]
46
+
47
+ Channels: TypeAlias = Literal["RGB", "BGR"]
48
+ ImageFormat: TypeAlias = Literal["JPEG", "PNG", "GIF"]
49
+ ImageFormatOrAuto: TypeAlias = Literal[ImageFormat, "auto"]
50
+ ImageOrImageList: TypeAlias = Union[AtomicImage, Sequence[AtomicImage]]
51
+
52
+ # This constant is related to the frontend maximum content width specified
53
+ # in App.jsx main container
54
+ # 730 is the max width of element-container in the frontend, and 2x is for high
55
+ # DPI.
56
+ MAXIMUM_CONTENT_WIDTH: Final[int] = 2 * 730
57
+
58
+
59
+ # @see Image.proto
60
+ # @see WidthBehavior on the frontend
61
+ class WidthBehavior(IntEnum):
62
+ """
63
+ Special values that are recognized by the frontend and allow us to change the
64
+ behavior of the displayed image.
65
+ """
66
+
67
+ ORIGINAL = -1
68
+ COLUMN = -2
69
+ AUTO = -3
70
+ MIN_IMAGE_OR_CONTAINER = -4
71
+ MAX_IMAGE_OR_CONTAINER = -5
72
+
73
+
74
+ WidthBehavior.ORIGINAL.__doc__ = """Display the image at its original width"""
75
+ WidthBehavior.COLUMN.__doc__ = (
76
+ """Display the image at the width of the column it's in."""
77
+ )
78
+ WidthBehavior.AUTO.__doc__ = """Display the image at its original width, unless it
79
+ would exceed the width of its column in which case clamp it to
80
+ its column width"""
81
+
82
+
83
+ def _image_may_have_alpha_channel(image: PILImage) -> bool:
84
+ return image.mode in ("RGBA", "LA", "P")
85
+
86
+
87
+ def _image_is_gif(image: PILImage) -> bool:
88
+ return image.format == "GIF"
89
+
90
+
91
+ def _validate_image_format_string(
92
+ image_data: bytes | PILImage, format: str
93
+ ) -> ImageFormat:
94
+ """Return either "JPEG", "PNG", or "GIF", based on the input `format` string.
95
+ - If `format` is "JPEG" or "JPG" (or any capitalization thereof), return "JPEG"
96
+ - If `format` is "PNG" (or any capitalization thereof), return "PNG"
97
+ - For all other strings, return "PNG" if the image has an alpha channel,
98
+ "GIF" if the image is a GIF, and "JPEG" otherwise.
99
+ """
100
+ format = format.upper()
101
+ if format in {"JPEG", "PNG"}:
102
+ return cast(ImageFormat, format)
103
+
104
+ # We are forgiving on the spelling of JPEG
105
+ if format == "JPG":
106
+ return "JPEG"
107
+
108
+ pil_image: PILImage
109
+ if isinstance(image_data, bytes):
110
+ from PIL import Image
111
+
112
+ pil_image = Image.open(io.BytesIO(image_data))
113
+ else:
114
+ pil_image = image_data
115
+
116
+ if _image_is_gif(pil_image):
117
+ return "GIF"
118
+
119
+ if _image_may_have_alpha_channel(pil_image):
120
+ return "PNG"
121
+
122
+ return "JPEG"
123
+
124
+
125
+ def _PIL_to_bytes(
126
+ image: PILImage,
127
+ format: ImageFormat = "JPEG",
128
+ quality: int = 100,
129
+ ) -> bytes:
130
+ """Convert a PIL image to bytes."""
131
+ tmp = io.BytesIO()
132
+
133
+ # User must have specified JPEG, so we must convert it
134
+ if format == "JPEG" and _image_may_have_alpha_channel(image):
135
+ image = image.convert("RGB")
136
+
137
+ image.save(tmp, format=format, quality=quality)
138
+
139
+ return tmp.getvalue()
140
+
141
+
142
+ def _BytesIO_to_bytes(data: io.BytesIO) -> bytes:
143
+ data.seek(0)
144
+ return data.getvalue()
145
+
146
+
147
+ def _np_array_to_bytes(array: npt.NDArray[Any], output_format: str = "JPEG") -> bytes:
148
+ import numpy as np
149
+ from PIL import Image
150
+
151
+ img = Image.fromarray(array.astype(np.uint8))
152
+ format = _validate_image_format_string(img, output_format)
153
+
154
+ return _PIL_to_bytes(img, format)
155
+
156
+
157
+ def _verify_np_shape(array: npt.NDArray[Any]) -> npt.NDArray[Any]:
158
+ shape: NumpyShape = array.shape
159
+ if len(shape) not in (2, 3):
160
+ raise StreamlitAPIException("Numpy shape has to be of length 2 or 3.")
161
+ if len(shape) == 3 and shape[-1] not in (1, 3, 4):
162
+ raise StreamlitAPIException(
163
+ "Channel can only be 1, 3, or 4 got %d. Shape is %s"
164
+ % (shape[-1], str(shape))
165
+ )
166
+
167
+ # If there's only one channel, convert is to x, y
168
+ if len(shape) == 3 and shape[-1] == 1:
169
+ array = array[:, :, 0]
170
+
171
+ return array
172
+
173
+
174
+ def _get_image_format_mimetype(image_format: ImageFormat) -> str:
175
+ """Get the mimetype string for the given ImageFormat."""
176
+ return f"image/{image_format.lower()}"
177
+
178
+
179
+ def _ensure_image_size_and_format(
180
+ image_data: bytes, width: int, image_format: ImageFormat
181
+ ) -> bytes:
182
+ """Resize an image if it exceeds the given width, or if exceeds
183
+ MAXIMUM_CONTENT_WIDTH. Ensure the image's format corresponds to the given
184
+ ImageFormat. Return the (possibly resized and reformatted) image bytes.
185
+ """
186
+ from PIL import Image
187
+
188
+ pil_image: PILImage = Image.open(io.BytesIO(image_data))
189
+ actual_width, actual_height = pil_image.size
190
+
191
+ if width < 0 and actual_width > MAXIMUM_CONTENT_WIDTH:
192
+ width = MAXIMUM_CONTENT_WIDTH
193
+
194
+ if width > 0 and actual_width > width:
195
+ # We need to resize the image.
196
+ new_height = int(1.0 * actual_height * width / actual_width)
197
+ # pillow reexports Image.Resampling.BILINEAR as Image.BILINEAR for backwards
198
+ # compatibility reasons, so we use the reexport to support older pillow
199
+ # versions. The types don't seem to reflect this, though, hence the type: ignore
200
+ # below.
201
+ pil_image = pil_image.resize((width, new_height), resample=Image.BILINEAR) # type: ignore[attr-defined]
202
+ return _PIL_to_bytes(pil_image, format=image_format, quality=90)
203
+
204
+ if pil_image.format != image_format:
205
+ # We need to reformat the image.
206
+ return _PIL_to_bytes(pil_image, format=image_format, quality=90)
207
+
208
+ # No resizing or reformatting necessary - return the original bytes.
209
+ return image_data
210
+
211
+
212
+ def _clip_image(image: npt.NDArray[Any], clamp: bool) -> npt.NDArray[Any]:
213
+ import numpy as np
214
+
215
+ data = image
216
+ if issubclass(image.dtype.type, np.floating):
217
+ if clamp:
218
+ data = np.clip(image, 0, 1.0)
219
+ else:
220
+ if np.amin(image) < 0.0 or np.amax(image) > 1.0:
221
+ raise RuntimeError("Data is outside [0.0, 1.0] and clamp is not set.")
222
+ data = data * 255
223
+ else:
224
+ if clamp:
225
+ data = np.clip(image, 0, 255)
226
+ else:
227
+ if np.amin(image) < 0 or np.amax(image) > 255:
228
+ raise RuntimeError("Data is outside [0, 255] and clamp is not set.")
229
+ return data
230
+
231
+
232
+ def image_to_url(
233
+ image: AtomicImage,
234
+ width: int,
235
+ clamp: bool,
236
+ channels: Channels,
237
+ output_format: ImageFormatOrAuto,
238
+ image_id: str,
239
+ ) -> str:
240
+ """Return a URL that an image can be served from.
241
+ If `image` is already a URL, return it unmodified.
242
+ Otherwise, add the image to the MediaFileManager and return the URL.
243
+ (When running in "raw" mode, we won't actually load data into the
244
+ MediaFileManager, and we'll return an empty URL.)
245
+ """
246
+ import numpy as np
247
+ from PIL import Image, ImageFile
248
+
249
+ image_data: bytes
250
+
251
+ # Convert Path to string if necessary
252
+ if isinstance(image, Path):
253
+ image = str(image)
254
+
255
+ # Strings
256
+ if isinstance(image, str):
257
+ if not os.path.isfile(image) and url_util.is_url(
258
+ image, allowed_schemas=("http", "https", "data")
259
+ ):
260
+ # If it's a url, return it directly.
261
+ return image
262
+
263
+ if image.endswith(".svg") and os.path.isfile(image):
264
+ # Unpack local SVG image file to an SVG string
265
+ with open(image) as textfile:
266
+ image = textfile.read()
267
+
268
+ # Following regex allows svg image files to start either via a "<?xml...>" tag
269
+ # eventually followed by a "<svg...>" tag or directly starting with a "<svg>" tag
270
+ if re.search(r"(^\s?(<\?xml[\s\S]*<svg\s)|^\s?<svg\s|^\s?<svg>\s)", image):
271
+ if "xmlns" not in image:
272
+ # The xmlns attribute is required for SVGs to render in an img tag.
273
+ # If it's not present, we add to the first SVG tag:
274
+ image = image.replace(
275
+ "<svg", '<svg xmlns="http://www.w3.org/2000/svg" ', 1
276
+ )
277
+ # Convert to base64 to prevent issues with encoding:
278
+ import base64
279
+
280
+ image_b64_encoded = base64.b64encode(image.encode("utf-8")).decode("utf-8")
281
+ # Return SVG as data URI:
282
+ return f"data:image/svg+xml;base64,{image_b64_encoded}"
283
+
284
+ # Otherwise, try to open it as a file.
285
+ try:
286
+ with open(image, "rb") as f:
287
+ image_data = f.read()
288
+ except Exception:
289
+ # When we aren't able to open the image file, we still pass the path to
290
+ # the MediaFileManager - its storage backend may have access to files
291
+ # that Streamlit does not.
292
+ import mimetypes
293
+
294
+ mimetype, _ = mimetypes.guess_type(image)
295
+ if mimetype is None:
296
+ mimetype = "application/octet-stream"
297
+
298
+ url = runtime.get_instance().media_file_mgr.add(image, mimetype, image_id)
299
+ caching.save_media_data(image, mimetype, image_id)
300
+ return url
301
+
302
+ # PIL Images
303
+ elif isinstance(image, (ImageFile.ImageFile, Image.Image)):
304
+ format = _validate_image_format_string(image, output_format)
305
+ image_data = _PIL_to_bytes(image, format)
306
+
307
+ # BytesIO
308
+ # Note: This doesn't support SVG. We could convert to png (cairosvg.svg2png)
309
+ # or just decode BytesIO to string and handle that way.
310
+ elif isinstance(image, io.BytesIO):
311
+ image_data = _BytesIO_to_bytes(image)
312
+
313
+ # Numpy Arrays (ie opencv)
314
+ elif isinstance(image, np.ndarray):
315
+ image = _clip_image(_verify_np_shape(image), clamp)
316
+
317
+ if channels == "BGR":
318
+ if len(cast(NumpyShape, image.shape)) == 3:
319
+ image = image[:, :, [2, 1, 0]]
320
+ else:
321
+ raise StreamlitAPIException(
322
+ 'When using `channels="BGR"`, the input image should '
323
+ "have exactly 3 color channels"
324
+ )
325
+
326
+ image_data = _np_array_to_bytes(array=image, output_format=output_format)
327
+
328
+ # Raw bytes
329
+ else:
330
+ image_data = image
331
+
332
+ # Determine the image's format, resize it, and get its mimetype
333
+ image_format = _validate_image_format_string(image_data, output_format)
334
+ image_data = _ensure_image_size_and_format(image_data, width, image_format)
335
+ mimetype = _get_image_format_mimetype(image_format)
336
+
337
+ if runtime.exists():
338
+ url = runtime.get_instance().media_file_mgr.add(image_data, mimetype, image_id)
339
+ caching.save_media_data(image_data, mimetype, image_id)
340
+ return url
341
+ else:
342
+ # When running in "raw mode", we can't access the MediaFileManager.
343
+ return ""
344
+
345
+
346
+ def _4d_to_list_3d(array: npt.NDArray[Any]) -> list[npt.NDArray[Any]]:
347
+ return [array[i, :, :, :] for i in range(array.shape[0])]
348
+
349
+
350
+ def marshall_images(
351
+ coordinates: str,
352
+ image: ImageOrImageList,
353
+ caption: str | npt.NDArray[Any] | list[str] | None,
354
+ width: int | WidthBehavior,
355
+ proto_imgs: ImageListProto,
356
+ clamp: bool,
357
+ channels: Channels = "RGB",
358
+ output_format: ImageFormatOrAuto = "auto",
359
+ ) -> None:
360
+ """Fill an ImageListProto with a list of images and their captions.
361
+ The images will be resized and reformatted as necessary.
362
+ Parameters
363
+ ----------
364
+ coordinates
365
+ A string indentifying the images' location in the frontend.
366
+ image
367
+ The image or images to include in the ImageListProto.
368
+ caption
369
+ Image caption. If displaying multiple images, caption should be a
370
+ list of captions (one for each image).
371
+ width
372
+ The desired width of the image or images. This parameter will be
373
+ passed to the frontend.
374
+ Positive values set the image width explicitly.
375
+ Negative values has some special. For details, see: `WidthBehaviour`
376
+ proto_imgs
377
+ The ImageListProto to fill in.
378
+ clamp
379
+ Clamp image pixel values to a valid range ([0-255] per channel).
380
+ This is only meaningful for byte array images; the parameter is
381
+ ignored for image URLs. If this is not set, and an image has an
382
+ out-of-range value, an error will be thrown.
383
+ channels
384
+ If image is an nd.array, this parameter denotes the format used to
385
+ represent color information. Defaults to 'RGB', meaning
386
+ `image[:, :, 0]` is the red channel, `image[:, :, 1]` is green, and
387
+ `image[:, :, 2]` is blue. For images coming from libraries like
388
+ OpenCV you should set this to 'BGR', instead.
389
+ output_format
390
+ This parameter specifies the format to use when transferring the
391
+ image data. Photos should use the JPEG format for lossy compression
392
+ while diagrams should use the PNG format for lossless compression.
393
+ Defaults to 'auto' which identifies the compression type based
394
+ on the type and format of the image argument.
395
+ """
396
+ import numpy as np
397
+
398
+ channels = cast(Channels, channels.upper())
399
+
400
+ # Turn single image and caption into one element list.
401
+ images: Sequence[AtomicImage]
402
+ if isinstance(image, (list, set, tuple)):
403
+ images = list(image)
404
+ elif isinstance(image, np.ndarray) and len(cast(NumpyShape, image.shape)) == 4:
405
+ images = _4d_to_list_3d(image)
406
+ else:
407
+ images = [image] # type: ignore
408
+
409
+ if isinstance(caption, list):
410
+ captions: Sequence[str | None] = caption
411
+ elif isinstance(caption, str):
412
+ captions = [caption]
413
+ elif isinstance(caption, np.ndarray) and len(cast(NumpyShape, caption.shape)) == 1:
414
+ captions = caption.tolist()
415
+ elif caption is None:
416
+ captions = [None] * len(images)
417
+ else:
418
+ captions = [str(caption)]
419
+
420
+ assert isinstance(captions, list), (
421
+ "If image is a list then caption should be as well"
422
+ )
423
+ assert len(captions) == len(images), "Cannot pair %d captions with %d images." % (
424
+ len(captions),
425
+ len(images),
426
+ )
427
+
428
+ proto_imgs.width = int(width)
429
+ # Each image in an image list needs to be kept track of at its own coordinates.
430
+ for coord_suffix, (image, caption) in enumerate(zip(images, captions)):
431
+ proto_img = proto_imgs.imgs.add()
432
+ if caption is not None:
433
+ proto_img.caption = str(caption)
434
+
435
+ # We use the index of the image in the input image list to identify this image inside
436
+ # MediaFileManager. For this, we just add the index to the image's "coordinates".
437
+ image_id = "%s-%i" % (coordinates, coord_suffix)
438
+
439
+ proto_img.url = image_to_url(
440
+ image, width, clamp, channels, output_format, image_id
441
+ )
@@ -0,0 +1,105 @@
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 numbers
18
+
19
+
20
+ class JSNumberBoundsException(Exception):
21
+ pass
22
+
23
+
24
+ class JSNumber:
25
+ """Utility class for exposing JavaScript Number constants."""
26
+
27
+ # The largest int that can be represented with perfect precision
28
+ # in JavaScript.
29
+ MAX_SAFE_INTEGER = (1 << 53) - 1
30
+
31
+ # The smallest int that can be represented with perfect precision
32
+ # in JavaScript.
33
+ MIN_SAFE_INTEGER = -((1 << 53) - 1)
34
+
35
+ # The largest float that can be represented in JavaScript.
36
+ MAX_VALUE = 1.7976931348623157e308
37
+
38
+ # The closest number to zero that can be represented in JavaScript.
39
+ MIN_VALUE = 5e-324
40
+
41
+ # The largest negative float that can be represented in JavaScript.
42
+ MIN_NEGATIVE_VALUE = -MAX_VALUE
43
+
44
+ @classmethod
45
+ def validate_int_bounds(cls, value: int, value_name: str | None = None) -> None:
46
+ """Validate that an int value can be represented with perfect precision
47
+ by a JavaScript Number.
48
+
49
+ Parameters
50
+ ----------
51
+ value : int
52
+ value_name : str or None
53
+ The name of the value parameter. If specified, this will be used
54
+ in any exception that is thrown.
55
+
56
+ Raises
57
+ ------
58
+ JSNumberBoundsException
59
+ Raised with a human-readable explanation if the value falls outside
60
+ JavaScript int bounds.
61
+
62
+ """
63
+ if value_name is None:
64
+ value_name = "value"
65
+
66
+ if value < cls.MIN_SAFE_INTEGER:
67
+ raise JSNumberBoundsException(
68
+ f"{value_name} ({value}) must be >= -((1 << 53) - 1)"
69
+ )
70
+ elif value > cls.MAX_SAFE_INTEGER:
71
+ raise JSNumberBoundsException(
72
+ f"{value_name} ({value}) must be <= (1 << 53) - 1"
73
+ )
74
+
75
+ @classmethod
76
+ def validate_float_bounds(cls, value: int | float, value_name: str | None) -> None:
77
+ """Validate that a float value can be represented by a JavaScript Number.
78
+
79
+ Parameters
80
+ ----------
81
+ value : float
82
+ value_name : str or None
83
+ The name of the value parameter. If specified, this will be used
84
+ in any exception that is thrown.
85
+
86
+ Raises
87
+ ------
88
+ JSNumberBoundsException
89
+ Raised with a human-readable explanation if the value falls outside
90
+ JavaScript float bounds.
91
+
92
+ """
93
+ if value_name is None:
94
+ value_name = "value"
95
+
96
+ if not isinstance(value, (numbers.Integral, float)):
97
+ raise JSNumberBoundsException(f"{value_name} ({value}) is not a float")
98
+ elif value < cls.MIN_NEGATIVE_VALUE:
99
+ raise JSNumberBoundsException(
100
+ f"{value_name} ({value}) must be >= -1.797e+308"
101
+ )
102
+ elif value > cls.MAX_VALUE:
103
+ raise JSNumberBoundsException(
104
+ f"{value_name} ({value}) must be <= 1.797e+308"
105
+ )