streamlit-data-editor-plus 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. streamlit/__init__.py +292 -0
  2. streamlit/__main__.py +20 -0
  3. streamlit/auth_util.py +583 -0
  4. streamlit/cli_util.py +107 -0
  5. streamlit/column_config.py +60 -0
  6. streamlit/commands/__init__.py +13 -0
  7. streamlit/commands/echo.py +128 -0
  8. streamlit/commands/execution_control.py +318 -0
  9. streamlit/commands/logo.py +250 -0
  10. streamlit/commands/navigation.py +430 -0
  11. streamlit/commands/page_config.py +335 -0
  12. streamlit/components/__init__.py +13 -0
  13. streamlit/components/lib/__init__.py +13 -0
  14. streamlit/components/lib/local_component_registry.py +84 -0
  15. streamlit/components/types/__init__.py +13 -0
  16. streamlit/components/types/base_component_registry.py +99 -0
  17. streamlit/components/types/base_custom_component.py +158 -0
  18. streamlit/components/v1/__init__.py +29 -0
  19. streamlit/components/v1/component_arrow.py +141 -0
  20. streamlit/components/v1/component_registry.py +147 -0
  21. streamlit/components/v1/components.py +38 -0
  22. streamlit/components/v1/custom_component.py +239 -0
  23. streamlit/components/v2/__init__.py +531 -0
  24. streamlit/components/v2/bidi_component/__init__.py +20 -0
  25. streamlit/components/v2/bidi_component/constants.py +29 -0
  26. streamlit/components/v2/bidi_component/main.py +537 -0
  27. streamlit/components/v2/bidi_component/serialization.py +272 -0
  28. streamlit/components/v2/bidi_component/state.py +92 -0
  29. streamlit/components/v2/component_definition_resolver.py +143 -0
  30. streamlit/components/v2/component_file_watcher.py +403 -0
  31. streamlit/components/v2/component_manager.py +439 -0
  32. streamlit/components/v2/component_manifest_handler.py +122 -0
  33. streamlit/components/v2/component_path_utils.py +233 -0
  34. streamlit/components/v2/component_registry.py +426 -0
  35. streamlit/components/v2/get_bidi_component_manager.py +51 -0
  36. streamlit/components/v2/manifest_scanner.py +620 -0
  37. streamlit/components/v2/presentation.py +198 -0
  38. streamlit/components/v2/types.py +317 -0
  39. streamlit/config.py +2977 -0
  40. streamlit/config_option.py +319 -0
  41. streamlit/config_util.py +887 -0
  42. streamlit/connections/__init__.py +32 -0
  43. streamlit/connections/base_connection.py +215 -0
  44. streamlit/connections/snowflake_connection.py +765 -0
  45. streamlit/connections/snowpark_connection.py +213 -0
  46. streamlit/connections/sql_connection.py +427 -0
  47. streamlit/connections/util.py +97 -0
  48. streamlit/cursor.py +314 -0
  49. streamlit/dataframe_util.py +1434 -0
  50. streamlit/delta_generator.py +696 -0
  51. streamlit/delta_generator_singletons.py +243 -0
  52. streamlit/deprecation_util.py +253 -0
  53. streamlit/development.py +21 -0
  54. streamlit/elements/__init__.py +13 -0
  55. streamlit/elements/alert.py +341 -0
  56. streamlit/elements/arrow.py +1065 -0
  57. streamlit/elements/balloons.py +47 -0
  58. streamlit/elements/bokeh_chart.py +75 -0
  59. streamlit/elements/code.py +154 -0
  60. streamlit/elements/deck_gl_json_chart.py +627 -0
  61. streamlit/elements/dialog_decorator.py +320 -0
  62. streamlit/elements/empty.py +130 -0
  63. streamlit/elements/exception.py +370 -0
  64. streamlit/elements/form.py +481 -0
  65. streamlit/elements/graphviz_chart.py +226 -0
  66. streamlit/elements/heading.py +407 -0
  67. streamlit/elements/help.py +565 -0
  68. streamlit/elements/html.py +189 -0
  69. streamlit/elements/iframe.py +245 -0
  70. streamlit/elements/image.py +221 -0
  71. streamlit/elements/json.py +171 -0
  72. streamlit/elements/layouts.py +1534 -0
  73. streamlit/elements/lib/__init__.py +13 -0
  74. streamlit/elements/lib/built_in_chart_utils.py +1316 -0
  75. streamlit/elements/lib/color_util.py +272 -0
  76. streamlit/elements/lib/column_config_utils.py +555 -0
  77. streamlit/elements/lib/column_types.py +2699 -0
  78. streamlit/elements/lib/dialog.py +212 -0
  79. streamlit/elements/lib/dicttools.py +152 -0
  80. streamlit/elements/lib/file_uploader_utils.py +91 -0
  81. streamlit/elements/lib/form_utils.py +77 -0
  82. streamlit/elements/lib/image_utils.py +447 -0
  83. streamlit/elements/lib/js_number.py +105 -0
  84. streamlit/elements/lib/layout_utils.py +325 -0
  85. streamlit/elements/lib/mutable_expander_container.py +73 -0
  86. streamlit/elements/lib/mutable_popover_container.py +73 -0
  87. streamlit/elements/lib/mutable_status_container.py +194 -0
  88. streamlit/elements/lib/mutable_tab_container.py +73 -0
  89. streamlit/elements/lib/options_selector_utils.py +480 -0
  90. streamlit/elements/lib/pandas_styler_utils.py +302 -0
  91. streamlit/elements/lib/policies.py +198 -0
  92. streamlit/elements/lib/shortcut_utils.py +152 -0
  93. streamlit/elements/lib/streamlit_plotly_theme.py +206 -0
  94. streamlit/elements/lib/subtitle_utils.py +175 -0
  95. streamlit/elements/lib/utils.py +274 -0
  96. streamlit/elements/map.py +526 -0
  97. streamlit/elements/markdown.py +529 -0
  98. streamlit/elements/media.py +843 -0
  99. streamlit/elements/metric.py +529 -0
  100. streamlit/elements/pdf.py +190 -0
  101. streamlit/elements/plotly_chart.py +779 -0
  102. streamlit/elements/progress.py +172 -0
  103. streamlit/elements/pyplot.py +240 -0
  104. streamlit/elements/snow.py +47 -0
  105. streamlit/elements/space.py +121 -0
  106. streamlit/elements/spinner.py +152 -0
  107. streamlit/elements/table.py +240 -0
  108. streamlit/elements/text.py +113 -0
  109. streamlit/elements/toast.py +175 -0
  110. streamlit/elements/vega_charts.py +2510 -0
  111. streamlit/elements/widgets/__init__.py +13 -0
  112. streamlit/elements/widgets/audio_input.py +334 -0
  113. streamlit/elements/widgets/button.py +1559 -0
  114. streamlit/elements/widgets/button_group.py +1061 -0
  115. streamlit/elements/widgets/camera_input.py +281 -0
  116. streamlit/elements/widgets/chat.py +1028 -0
  117. streamlit/elements/widgets/checkbox.py +420 -0
  118. streamlit/elements/widgets/color_picker.py +329 -0
  119. streamlit/elements/widgets/data_editor.py +1168 -0
  120. streamlit/elements/widgets/data_editor_plus.py +902 -0
  121. streamlit/elements/widgets/feedback.py +322 -0
  122. streamlit/elements/widgets/file_uploader.py +592 -0
  123. streamlit/elements/widgets/multiselect.py +654 -0
  124. streamlit/elements/widgets/number_input.py +719 -0
  125. streamlit/elements/widgets/radio.py +551 -0
  126. streamlit/elements/widgets/select_slider.py +568 -0
  127. streamlit/elements/widgets/selectbox.py +680 -0
  128. streamlit/elements/widgets/slider.py +1093 -0
  129. streamlit/elements/widgets/text_widgets.py +779 -0
  130. streamlit/elements/widgets/time_widgets.py +1712 -0
  131. streamlit/elements/write.py +585 -0
  132. streamlit/emojis.py +34 -0
  133. streamlit/env_util.py +56 -0
  134. streamlit/error_util.py +112 -0
  135. streamlit/errors.py +680 -0
  136. streamlit/external/__init__.py +13 -0
  137. streamlit/external/langchain/__init__.py +23 -0
  138. streamlit/external/langchain/streamlit_callback_handler.py +410 -0
  139. streamlit/file_util.py +266 -0
  140. streamlit/git_util.py +200 -0
  141. streamlit/hello/__init__.py +13 -0
  142. streamlit/hello/__pycache__/__init__.cpython-312.pyc +0 -0
  143. streamlit/hello/__pycache__/streamlit_app.cpython-312.pyc +0 -0
  144. streamlit/hello/animation_demo.py +82 -0
  145. streamlit/hello/dataframe_demo.py +71 -0
  146. streamlit/hello/hello.py +46 -0
  147. streamlit/hello/mapping_demo.py +113 -0
  148. streamlit/hello/plotting_demo.py +62 -0
  149. streamlit/hello/streamlit_app.py +57 -0
  150. streamlit/hello/utils.py +30 -0
  151. streamlit/logger.py +129 -0
  152. streamlit/material_icon_names.py +25 -0
  153. streamlit/navigation/__init__.py +13 -0
  154. streamlit/navigation/page.py +365 -0
  155. streamlit/net_util.py +125 -0
  156. streamlit/path_security.py +98 -0
  157. streamlit/platform.py +31 -0
  158. streamlit/proto/Alert_pb2.py +28 -0
  159. streamlit/proto/Alert_pb2.pyi +100 -0
  160. streamlit/proto/AppPage_pb2.py +25 -0
  161. streamlit/proto/AppPage_pb2.pyi +75 -0
  162. streamlit/proto/ArrowData_pb2.py +27 -0
  163. streamlit/proto/ArrowData_pb2.pyi +103 -0
  164. streamlit/proto/ArrowNamedDataSet_pb2.py +26 -0
  165. streamlit/proto/ArrowNamedDataSet_pb2.pyi +65 -0
  166. streamlit/proto/AudioInput_pb2.py +26 -0
  167. streamlit/proto/AudioInput_pb2.pyi +72 -0
  168. streamlit/proto/Audio_pb2.py +26 -0
  169. streamlit/proto/Audio_pb2.pyi +75 -0
  170. streamlit/proto/AuthRedirect_pb2.py +25 -0
  171. streamlit/proto/AuthRedirect_pb2.pyi +48 -0
  172. streamlit/proto/AutoRerun_pb2.py +25 -0
  173. streamlit/proto/AutoRerun_pb2.pyi +52 -0
  174. streamlit/proto/BackMsg_pb2.py +29 -0
  175. streamlit/proto/BackMsg_pb2.pyi +132 -0
  176. streamlit/proto/Balloons_pb2.py +25 -0
  177. streamlit/proto/Balloons_pb2.pyi +48 -0
  178. streamlit/proto/BidiComponent_pb2.py +32 -0
  179. streamlit/proto/BidiComponent_pb2.pyi +176 -0
  180. streamlit/proto/Block_pb2.py +62 -0
  181. streamlit/proto/Block_pb2.pyi +518 -0
  182. streamlit/proto/ButtonGroup_pb2.py +32 -0
  183. streamlit/proto/ButtonGroup_pb2.pyi +157 -0
  184. streamlit/proto/ButtonLikeIconPosition_pb2.py +25 -0
  185. streamlit/proto/ButtonLikeIconPosition_pb2.pyi +47 -0
  186. streamlit/proto/Button_pb2.py +26 -0
  187. streamlit/proto/Button_pb2.pyi +82 -0
  188. streamlit/proto/CameraInput_pb2.py +26 -0
  189. streamlit/proto/CameraInput_pb2.pyi +66 -0
  190. streamlit/proto/ChatInput_pb2.py +27 -0
  191. streamlit/proto/ChatInput_pb2.pyi +113 -0
  192. streamlit/proto/Checkbox_pb2.py +28 -0
  193. streamlit/proto/Checkbox_pb2.pyi +99 -0
  194. streamlit/proto/ClientState_pb2.py +28 -0
  195. streamlit/proto/ClientState_pb2.pyi +137 -0
  196. streamlit/proto/Code_pb2.py +25 -0
  197. streamlit/proto/Code_pb2.pyi +59 -0
  198. streamlit/proto/ColorPicker_pb2.py +26 -0
  199. streamlit/proto/ColorPicker_pb2.pyi +82 -0
  200. streamlit/proto/Common_pb2.py +49 -0
  201. streamlit/proto/Common_pb2.pyi +325 -0
  202. streamlit/proto/Components_pb2.py +33 -0
  203. streamlit/proto/Components_pb2.pyi +196 -0
  204. streamlit/proto/Dataframe_pb2.py +30 -0
  205. streamlit/proto/Dataframe_pb2.pyi +172 -0
  206. streamlit/proto/DateInput_pb2.py +26 -0
  207. streamlit/proto/DateInput_pb2.pyi +91 -0
  208. streamlit/proto/DateTimeInput_pb2.py +26 -0
  209. streamlit/proto/DateTimeInput_pb2.pyi +94 -0
  210. streamlit/proto/DeckGlJsonChart_pb2.py +27 -0
  211. streamlit/proto/DeckGlJsonChart_pb2.pyi +91 -0
  212. streamlit/proto/Delta_pb2.py +29 -0
  213. streamlit/proto/Delta_pb2.pyi +82 -0
  214. streamlit/proto/DownloadButton_pb2.py +26 -0
  215. streamlit/proto/DownloadButton_pb2.pyi +92 -0
  216. streamlit/proto/Element_pb2.py +81 -0
  217. streamlit/proto/Element_pb2.pyi +348 -0
  218. streamlit/proto/Empty_pb2.py +25 -0
  219. streamlit/proto/Empty_pb2.pyi +42 -0
  220. streamlit/proto/Exception_pb2.py +26 -0
  221. streamlit/proto/Exception_pb2.pyi +88 -0
  222. streamlit/proto/Favicon_pb2.py +25 -0
  223. streamlit/proto/Favicon_pb2.pyi +47 -0
  224. streamlit/proto/Feedback_pb2.py +27 -0
  225. streamlit/proto/Feedback_pb2.pyi +93 -0
  226. streamlit/proto/FileUploader_pb2.py +26 -0
  227. streamlit/proto/FileUploader_pb2.pyi +90 -0
  228. streamlit/proto/ForwardMsg_pb2.py +48 -0
  229. streamlit/proto/ForwardMsg_pb2.pyi +296 -0
  230. streamlit/proto/GapSize_pb2.py +27 -0
  231. streamlit/proto/GapSize_pb2.pyi +82 -0
  232. streamlit/proto/GitInfo_pb2.py +27 -0
  233. streamlit/proto/GitInfo_pb2.pyi +84 -0
  234. streamlit/proto/GraphVizChart_pb2.py +25 -0
  235. streamlit/proto/GraphVizChart_pb2.pyi +56 -0
  236. streamlit/proto/Heading_pb2.py +25 -0
  237. streamlit/proto/Heading_pb2.pyi +63 -0
  238. streamlit/proto/HeightConfig_pb2.py +25 -0
  239. streamlit/proto/HeightConfig_pb2.pyi +61 -0
  240. streamlit/proto/Help_pb2.py +27 -0
  241. streamlit/proto/Help_pb2.pyi +104 -0
  242. streamlit/proto/Html_pb2.py +25 -0
  243. streamlit/proto/Html_pb2.pyi +52 -0
  244. streamlit/proto/IFrame_pb2.py +25 -0
  245. streamlit/proto/IFrame_pb2.pyi +68 -0
  246. streamlit/proto/Image_pb2.py +27 -0
  247. streamlit/proto/Image_pb2.pyi +73 -0
  248. streamlit/proto/Json_pb2.py +25 -0
  249. streamlit/proto/Json_pb2.pyi +63 -0
  250. streamlit/proto/LabelVisibility_pb2.py +27 -0
  251. streamlit/proto/LabelVisibility_pb2.pyi +69 -0
  252. streamlit/proto/LinkButton_pb2.py +26 -0
  253. streamlit/proto/LinkButton_pb2.pyi +76 -0
  254. streamlit/proto/Logo_pb2.py +27 -0
  255. streamlit/proto/Logo_pb2.pyi +82 -0
  256. streamlit/proto/Markdown_pb2.py +27 -0
  257. streamlit/proto/Markdown_pb2.pyi +83 -0
  258. streamlit/proto/Metric_pb2.py +32 -0
  259. streamlit/proto/Metric_pb2.pyi +145 -0
  260. streamlit/proto/MetricsEvent_pb2.py +28 -0
  261. streamlit/proto/MetricsEvent_pb2.pyi +224 -0
  262. streamlit/proto/MultiSelect_pb2.py +26 -0
  263. streamlit/proto/MultiSelect_pb2.pyi +108 -0
  264. streamlit/proto/Navigation_pb2.py +28 -0
  265. streamlit/proto/Navigation_pb2.pyi +89 -0
  266. streamlit/proto/NewSession_pb2.py +47 -0
  267. streamlit/proto/NewSession_pb2.pyi +753 -0
  268. streamlit/proto/NumberInput_pb2.py +28 -0
  269. streamlit/proto/NumberInput_pb2.pyi +138 -0
  270. streamlit/proto/PageConfig_pb2.py +33 -0
  271. streamlit/proto/PageConfig_pb2.pyi +179 -0
  272. streamlit/proto/PageInfo_pb2.py +25 -0
  273. streamlit/proto/PageInfo_pb2.pyi +50 -0
  274. streamlit/proto/PageLink_pb2.py +26 -0
  275. streamlit/proto/PageLink_pb2.pyi +80 -0
  276. streamlit/proto/PageNotFound_pb2.py +25 -0
  277. streamlit/proto/PageNotFound_pb2.pyi +49 -0
  278. streamlit/proto/PageProfile_pb2.py +29 -0
  279. streamlit/proto/PageProfile_pb2.pyi +146 -0
  280. streamlit/proto/ParentMessage_pb2.py +25 -0
  281. streamlit/proto/ParentMessage_pb2.pyi +53 -0
  282. streamlit/proto/PlotlyChart_pb2.py +27 -0
  283. streamlit/proto/PlotlyChart_pb2.pyi +96 -0
  284. streamlit/proto/Progress_pb2.py +25 -0
  285. streamlit/proto/Progress_pb2.pyi +50 -0
  286. streamlit/proto/Radio_pb2.py +26 -0
  287. streamlit/proto/Radio_pb2.pyi +104 -0
  288. streamlit/proto/RootContainer_pb2.py +25 -0
  289. streamlit/proto/RootContainer_pb2.pyi +56 -0
  290. streamlit/proto/Selectbox_pb2.py +26 -0
  291. streamlit/proto/Selectbox_pb2.pyi +107 -0
  292. streamlit/proto/SessionEvent_pb2.py +26 -0
  293. streamlit/proto/SessionEvent_pb2.pyi +72 -0
  294. streamlit/proto/SessionStatus_pb2.py +25 -0
  295. streamlit/proto/SessionStatus_pb2.pyi +64 -0
  296. streamlit/proto/Skeleton_pb2.py +27 -0
  297. streamlit/proto/Skeleton_pb2.pyi +75 -0
  298. streamlit/proto/Slider_pb2.py +30 -0
  299. streamlit/proto/Slider_pb2.pyi +161 -0
  300. streamlit/proto/Snow_pb2.py +25 -0
  301. streamlit/proto/Snow_pb2.pyi +48 -0
  302. streamlit/proto/Space_pb2.py +25 -0
  303. streamlit/proto/Space_pb2.pyi +48 -0
  304. streamlit/proto/Spinner_pb2.py +25 -0
  305. streamlit/proto/Spinner_pb2.pyi +56 -0
  306. streamlit/proto/Table_pb2.py +28 -0
  307. streamlit/proto/Table_pb2.pyi +83 -0
  308. streamlit/proto/TextAlignmentConfig_pb2.py +27 -0
  309. streamlit/proto/TextAlignmentConfig_pb2.pyi +69 -0
  310. streamlit/proto/TextArea_pb2.py +26 -0
  311. streamlit/proto/TextArea_pb2.pyi +97 -0
  312. streamlit/proto/TextInput_pb2.py +28 -0
  313. streamlit/proto/TextInput_pb2.pyi +124 -0
  314. streamlit/proto/Text_pb2.py +25 -0
  315. streamlit/proto/Text_pb2.pyi +53 -0
  316. streamlit/proto/TimeInput_pb2.py +26 -0
  317. streamlit/proto/TimeInput_pb2.pyi +86 -0
  318. streamlit/proto/Toast_pb2.py +25 -0
  319. streamlit/proto/Toast_pb2.pyi +64 -0
  320. streamlit/proto/Transient_pb2.py +26 -0
  321. streamlit/proto/Transient_pb2.pyi +53 -0
  322. streamlit/proto/VegaLiteChart_pb2.py +27 -0
  323. streamlit/proto/VegaLiteChart_pb2.pyi +92 -0
  324. streamlit/proto/Video_pb2.py +30 -0
  325. streamlit/proto/Video_pb2.pyi +129 -0
  326. streamlit/proto/WidgetStates_pb2.py +31 -0
  327. streamlit/proto/WidgetStates_pb2.pyi +157 -0
  328. streamlit/proto/WidthConfig_pb2.py +25 -0
  329. streamlit/proto/WidthConfig_pb2.pyi +61 -0
  330. streamlit/proto/__init__.py +15 -0
  331. streamlit/proto/openmetrics_data_model_pb2.py +58 -0
  332. streamlit/proto/openmetrics_data_model_pb2.pyi +558 -0
  333. streamlit/py.typed +0 -0
  334. streamlit/runtime/__init__.py +50 -0
  335. streamlit/runtime/app_session.py +1302 -0
  336. streamlit/runtime/caching/__init__.py +118 -0
  337. streamlit/runtime/caching/cache_data_api.py +775 -0
  338. streamlit/runtime/caching/cache_errors.py +143 -0
  339. streamlit/runtime/caching/cache_resource_api.py +756 -0
  340. streamlit/runtime/caching/cache_type.py +33 -0
  341. streamlit/runtime/caching/cache_utils.py +601 -0
  342. streamlit/runtime/caching/cached_message_replay.py +290 -0
  343. streamlit/runtime/caching/hashing.py +655 -0
  344. streamlit/runtime/caching/legacy_cache_api.py +170 -0
  345. streamlit/runtime/caching/storage/__init__.py +29 -0
  346. streamlit/runtime/caching/storage/cache_storage_protocol.py +236 -0
  347. streamlit/runtime/caching/storage/dummy_cache_storage.py +60 -0
  348. streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +159 -0
  349. streamlit/runtime/caching/storage/local_disk_cache_storage.py +223 -0
  350. streamlit/runtime/caching/ttl_cleanup_cache.py +85 -0
  351. streamlit/runtime/connection_factory.py +498 -0
  352. streamlit/runtime/context.py +449 -0
  353. streamlit/runtime/context_util.py +49 -0
  354. streamlit/runtime/credentials.py +355 -0
  355. streamlit/runtime/download_data_util.py +53 -0
  356. streamlit/runtime/forward_msg_cache.py +101 -0
  357. streamlit/runtime/forward_msg_queue.py +263 -0
  358. streamlit/runtime/fragment.py +441 -0
  359. streamlit/runtime/media_file_manager.py +409 -0
  360. streamlit/runtime/media_file_storage.py +143 -0
  361. streamlit/runtime/memory_media_file_storage.py +201 -0
  362. streamlit/runtime/memory_session_storage.py +77 -0
  363. streamlit/runtime/memory_uploaded_file_manager.py +149 -0
  364. streamlit/runtime/metrics_util.py +612 -0
  365. streamlit/runtime/pages_manager.py +160 -0
  366. streamlit/runtime/runtime.py +775 -0
  367. streamlit/runtime/runtime_util.py +108 -0
  368. streamlit/runtime/script_data.py +46 -0
  369. streamlit/runtime/scriptrunner/__init__.py +38 -0
  370. streamlit/runtime/scriptrunner/exec_code.py +167 -0
  371. streamlit/runtime/scriptrunner/magic.py +277 -0
  372. streamlit/runtime/scriptrunner/magic_funcs.py +32 -0
  373. streamlit/runtime/scriptrunner/script_cache.py +89 -0
  374. streamlit/runtime/scriptrunner/script_runner.py +805 -0
  375. streamlit/runtime/scriptrunner_utils/__init__.py +19 -0
  376. streamlit/runtime/scriptrunner_utils/exceptions.py +44 -0
  377. streamlit/runtime/scriptrunner_utils/script_requests.py +311 -0
  378. streamlit/runtime/scriptrunner_utils/script_run_context.py +277 -0
  379. streamlit/runtime/secrets.py +533 -0
  380. streamlit/runtime/session_manager.py +430 -0
  381. streamlit/runtime/state/__init__.py +47 -0
  382. streamlit/runtime/state/common.py +256 -0
  383. streamlit/runtime/state/presentation.py +85 -0
  384. streamlit/runtime/state/query_params.py +767 -0
  385. streamlit/runtime/state/query_params_proxy.py +222 -0
  386. streamlit/runtime/state/safe_session_state.py +146 -0
  387. streamlit/runtime/state/session_state.py +1299 -0
  388. streamlit/runtime/state/session_state_proxy.py +153 -0
  389. streamlit/runtime/state/widgets.py +197 -0
  390. streamlit/runtime/stats.py +356 -0
  391. streamlit/runtime/theme_util.py +148 -0
  392. streamlit/runtime/uploaded_file_manager.py +152 -0
  393. streamlit/runtime/websocket_session_manager.py +301 -0
  394. streamlit/source_util.py +97 -0
  395. streamlit/starlette.py +34 -0
  396. streamlit/string_util.py +264 -0
  397. streamlit/temporary_directory.py +67 -0
  398. streamlit/testing/__init__.py +13 -0
  399. streamlit/testing/v1/__init__.py +17 -0
  400. streamlit/testing/v1/app_test.py +1089 -0
  401. streamlit/testing/v1/element_tree.py +2272 -0
  402. streamlit/testing/v1/local_script_runner.py +176 -0
  403. streamlit/testing/v1/util.py +61 -0
  404. streamlit/time_util.py +73 -0
  405. streamlit/type_util.py +480 -0
  406. streamlit/url_util.py +120 -0
  407. streamlit/user_info.py +698 -0
  408. streamlit/util.py +108 -0
  409. streamlit/vendor/__init__.py +0 -0
  410. streamlit/vendor/pympler/__init__.py +0 -0
  411. streamlit/vendor/pympler/asizeof.py +2870 -0
  412. streamlit/version.py +18 -0
  413. streamlit/watcher/__init__.py +28 -0
  414. streamlit/watcher/event_based_path_watcher.py +500 -0
  415. streamlit/watcher/folder_black_list.py +82 -0
  416. streamlit/watcher/local_sources_watcher.py +297 -0
  417. streamlit/watcher/path_watcher.py +244 -0
  418. streamlit/watcher/polling_path_watcher.py +138 -0
  419. streamlit/watcher/util.py +223 -0
  420. streamlit/web/__init__.py +13 -0
  421. streamlit/web/bootstrap.py +463 -0
  422. streamlit/web/cache_storage_manager_config.py +38 -0
  423. streamlit/web/cli.py +465 -0
  424. streamlit/web/server/__init__.py +30 -0
  425. streamlit/web/server/app_discovery.py +422 -0
  426. streamlit/web/server/app_static_file_handler.py +102 -0
  427. streamlit/web/server/authlib_tornado_integration.py +125 -0
  428. streamlit/web/server/bidi_component_request_handler.py +193 -0
  429. streamlit/web/server/browser_websocket_handler.py +341 -0
  430. streamlit/web/server/component_file_utils.py +105 -0
  431. streamlit/web/server/component_request_handler.py +107 -0
  432. streamlit/web/server/media_file_handler.py +148 -0
  433. streamlit/web/server/oauth_authlib_routes.py +314 -0
  434. streamlit/web/server/oidc_mixin.py +138 -0
  435. streamlit/web/server/routes.py +257 -0
  436. streamlit/web/server/server.py +555 -0
  437. streamlit/web/server/server_util.py +235 -0
  438. streamlit/web/server/starlette/__init__.py +23 -0
  439. streamlit/web/server/starlette/starlette_app.py +541 -0
  440. streamlit/web/server/starlette/starlette_app_utils.py +306 -0
  441. streamlit/web/server/starlette/starlette_auth_routes.py +584 -0
  442. streamlit/web/server/starlette/starlette_gzip_middleware.py +121 -0
  443. streamlit/web/server/starlette/starlette_path_security_middleware.py +97 -0
  444. streamlit/web/server/starlette/starlette_routes.py +884 -0
  445. streamlit/web/server/starlette/starlette_server.py +496 -0
  446. streamlit/web/server/starlette/starlette_server_config.py +55 -0
  447. streamlit/web/server/starlette/starlette_static_routes.py +181 -0
  448. streamlit/web/server/starlette/starlette_websocket.py +560 -0
  449. streamlit/web/server/stats_request_handler.py +116 -0
  450. streamlit/web/server/upload_file_request_handler.py +158 -0
  451. streamlit/web/server/websocket_headers.py +56 -0
  452. streamlit_data_editor_plus-0.1.0.dist-info/METADATA +76 -0
  453. streamlit_data_editor_plus-0.1.0.dist-info/RECORD +456 -0
  454. streamlit_data_editor_plus-0.1.0.dist-info/WHEEL +5 -0
  455. streamlit_data_editor_plus-0.1.0.dist-info/entry_points.txt +2 -0
  456. streamlit_data_editor_plus-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,585 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2026)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ import dataclasses
18
+ import inspect
19
+ import types
20
+ from collections import ChainMap, UserDict, UserList
21
+ from collections.abc import (
22
+ AsyncGenerator,
23
+ Callable,
24
+ Generator,
25
+ ItemsView,
26
+ Iterable,
27
+ KeysView,
28
+ ValuesView,
29
+ )
30
+ from io import StringIO
31
+ from typing import (
32
+ TYPE_CHECKING,
33
+ Any,
34
+ Final,
35
+ cast,
36
+ )
37
+
38
+ from streamlit import dataframe_util, type_util
39
+ from streamlit.errors import StreamlitAPIException
40
+ from streamlit.runtime.metrics_util import gather_metrics
41
+ from streamlit.string_util import (
42
+ is_mem_address_str,
43
+ max_char_sequence,
44
+ )
45
+
46
+ if TYPE_CHECKING:
47
+ from streamlit.delta_generator import DeltaGenerator
48
+
49
+ # Special methods:
50
+ HELP_TYPES: Final[tuple[type[Any], ...]] = (
51
+ types.BuiltinFunctionType,
52
+ types.BuiltinMethodType,
53
+ types.FunctionType,
54
+ types.MethodType,
55
+ types.ModuleType,
56
+ )
57
+
58
+
59
+ class StreamingOutput(list[Any]): # noqa: FURB189
60
+ pass
61
+
62
+
63
+ class WriteMixin:
64
+ @gather_metrics("write_stream")
65
+ def write_stream(
66
+ self,
67
+ stream: Callable[..., Any]
68
+ | Generator[Any, Any, Any]
69
+ | Iterable[Any]
70
+ | AsyncGenerator[Any, Any],
71
+ *,
72
+ cursor: str | None = None,
73
+ ) -> list[Any] | str:
74
+ r"""Stream a generator, iterable, or stream-like sequence to the app.
75
+
76
+ ``st.write_stream`` iterates through the given sequences and writes all
77
+ chunks to the app. String chunks will be written using a typewriter effect.
78
+ Other data types will be written using ``st.write``.
79
+
80
+ Parameters
81
+ ----------
82
+ stream : Callable, Generator, Iterable, OpenAI Stream, or LangChain Stream
83
+ The generator or iterable to stream.
84
+
85
+ If you pass an async generator, Streamlit will internally convert
86
+ it to a sync generator. If the generator depends on a cached object
87
+ with async references, this can raise an error.
88
+
89
+ .. note::
90
+ To use additional LLM libraries, you can create a wrapper to
91
+ manually define a generator function and include custom output
92
+ parsing.
93
+
94
+ cursor : str or None
95
+ A string to append to text as it's being written. If this is
96
+ ``None`` (default), no cursor is shown. Otherwise, the string is
97
+ rendered as Markdown and appears as a cursor at the end of the
98
+ streamed text. For example, you can use an emoji, emoji shortcode,
99
+ or Material icon.
100
+
101
+ The first line of the cursor string can contain GitHub-flavored
102
+ Markdown of the following types: Bold, Italics, Strikethroughs,
103
+ Inline Code, Links, and Images. Images display like icons, with a
104
+ max height equal to the font height. If you pass a multiline
105
+ string, additional lines display after the text with the full
106
+ Markdown rendering capabilities of ``st.markdown``.
107
+
108
+ See the ``body`` parameter of |st.markdown|_ for additional,
109
+ supported Markdown directives.
110
+
111
+ .. |st.markdown| replace:: ``st.markdown``
112
+ .. _st.markdown: https://docs.streamlit.io/develop/api-reference/text/st.markdown
113
+
114
+
115
+ Returns
116
+ -------
117
+ str or list
118
+ The full response. If the streamed output only contains text, this
119
+ is a string. Otherwise, this is a list of all the streamed objects.
120
+ The return value is fully compatible as input for ``st.write``.
121
+
122
+ Example
123
+ -------
124
+ You can pass an OpenAI stream as shown in our tutorial, `Build a \
125
+ basic LLM chat app <https://docs.streamlit.io/develop/tutorials/llms\
126
+ /build-conversational-apps#build-a-chatgpt-like-app>`_. Alternatively,
127
+ you can pass a generic generator function as input:
128
+
129
+ >>> import time
130
+ >>> import numpy as np
131
+ >>> import pandas as pd
132
+ >>> import streamlit as st
133
+ >>>
134
+ >>> _LOREM_IPSUM = \"\"\"
135
+ >>> Lorem ipsum dolor sit amet, **consectetur adipiscing** elit, sed do eiusmod tempor
136
+ >>> incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
137
+ >>> nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
138
+ >>> \"\"\"
139
+ >>>
140
+ >>>
141
+ >>> def stream_data():
142
+ >>> for word in _LOREM_IPSUM.split(" "):
143
+ >>> yield word + " "
144
+ >>> time.sleep(0.02)
145
+ >>>
146
+ >>> yield pd.DataFrame(
147
+ >>> np.random.randn(5, 10),
148
+ >>> columns=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
149
+ >>> )
150
+ >>>
151
+ >>> for word in _LOREM_IPSUM.split(" "):
152
+ >>> yield word + " "
153
+ >>> time.sleep(0.02)
154
+ >>>
155
+ >>>
156
+ >>> if st.button("Stream data"):
157
+ >>> st.write_stream(stream_data)
158
+
159
+ .. output::
160
+ https://doc-write-stream-data.streamlit.app/
161
+ height: 550px
162
+
163
+ """
164
+
165
+ # Just apply some basic checks for common iterable types that should
166
+ # not be passed in here.
167
+ if isinstance(stream, str) or dataframe_util.is_dataframe_like(stream):
168
+ raise StreamlitAPIException(
169
+ "`st.write_stream` expects a generator or stream-like object as input "
170
+ f"not {type(stream)}. Please use `st.write` instead for "
171
+ "this data type."
172
+ )
173
+
174
+ cursor_str = cursor or ""
175
+ stream_container: DeltaGenerator | None = None
176
+ streamed_response: str = ""
177
+ written_content: list[Any] = StreamingOutput()
178
+
179
+ def flush_stream_response() -> None:
180
+ """Write the full response to the app."""
181
+ nonlocal streamed_response, stream_container
182
+
183
+ if streamed_response and stream_container:
184
+ # Replace the stream_container element the full response
185
+ stream_container.markdown(streamed_response)
186
+ written_content.append(streamed_response)
187
+ stream_container = None
188
+ streamed_response = ""
189
+
190
+ # Make sure we have a generator and not just a generator function.
191
+ if inspect.isgeneratorfunction(stream) or inspect.isasyncgenfunction(stream):
192
+ stream = stream()
193
+
194
+ # If the stream is an async generator, convert it to a sync generator:
195
+ if inspect.isasyncgen(stream):
196
+ stream = type_util.async_generator_to_sync(stream)
197
+
198
+ try:
199
+ iter(stream) # type: ignore
200
+ except TypeError as exc:
201
+ raise StreamlitAPIException(
202
+ f"The provided input (type: {type(stream)}) cannot be iterated. "
203
+ "Please make sure that it is a generator, generator function or iterable."
204
+ ) from exc
205
+
206
+ # Iterate through the generator and write each chunk to the app
207
+ # with a type writer effect.
208
+ for chunk in stream: # type: ignore
209
+ if type_util.is_openai_chunk(chunk):
210
+ # Try to convert OpenAI chat completion chunk to a string:
211
+ try:
212
+ if len(chunk.choices) == 0 or chunk.choices[0].delta is None:
213
+ # The choices list can be empty. E.g. when using the
214
+ # AzureOpenAI client, the first chunk will always be empty.
215
+ chunk = "" # noqa: PLW2901
216
+ else:
217
+ chunk = chunk.choices[0].delta.content or "" # noqa: PLW2901
218
+ except AttributeError as err:
219
+ raise StreamlitAPIException(
220
+ "Failed to parse the OpenAI ChatCompletionChunk. "
221
+ "The most likely cause is a change of the chunk object structure "
222
+ "due to a recent OpenAI update. You might be able to fix this "
223
+ "by downgrading the OpenAI library or upgrading Streamlit. Also, "
224
+ "please report this issue to: https://github.com/streamlit/streamlit/issues."
225
+ ) from err
226
+
227
+ if type_util.is_type(chunk, "langchain_core.messages.ai.AIMessageChunk"):
228
+ # Try to convert LangChain message chunk to a string:
229
+ try:
230
+ chunk = chunk.content or "" # noqa: PLW2901 # type: ignore[possibly-unbound-attribute]
231
+ except AttributeError as err:
232
+ raise StreamlitAPIException(
233
+ "Failed to parse the LangChain AIMessageChunk. "
234
+ "The most likely cause is a change of the chunk object structure "
235
+ "due to a recent LangChain update. You might be able to fix this "
236
+ "by downgrading the OpenAI library or upgrading Streamlit. Also, "
237
+ "please report this issue to: https://github.com/streamlit/streamlit/issues."
238
+ ) from err
239
+
240
+ if isinstance(chunk, str):
241
+ if not chunk:
242
+ # Empty strings can be ignored
243
+ continue
244
+
245
+ first_text = False
246
+ if not stream_container:
247
+ stream_container = self.dg.empty()
248
+ first_text = True
249
+ streamed_response += chunk
250
+ # Only add the streaming symbol on the second text chunk
251
+ stream_container.markdown(
252
+ streamed_response + ("" if first_text else cursor_str),
253
+ )
254
+ elif callable(chunk):
255
+ flush_stream_response()
256
+ chunk()
257
+ else:
258
+ flush_stream_response()
259
+ self.write(chunk)
260
+ written_content.append(chunk)
261
+
262
+ flush_stream_response()
263
+
264
+ if not written_content:
265
+ # If nothing was streamed, return an empty string.
266
+ return ""
267
+ if len(written_content) == 1 and isinstance(written_content[0], str):
268
+ # If the output only contains a single string, return it as a string
269
+ return written_content[0]
270
+
271
+ # Otherwise return it as a list of write-compatible objects
272
+ return written_content
273
+
274
+ @gather_metrics("write")
275
+ def write(self, *args: Any, unsafe_allow_html: bool = False) -> None:
276
+ """Displays arguments in the app.
277
+
278
+ This is the Swiss Army knife of Streamlit commands: it does different
279
+ things depending on what you throw at it. Unlike other Streamlit
280
+ commands, ``st.write()`` has some unique properties:
281
+
282
+ - You can pass in multiple arguments, all of which will be displayed.
283
+ - Its behavior depends on the input type(s).
284
+
285
+ Parameters
286
+ ----------
287
+ *args : any
288
+ One or many objects to display in the app.
289
+
290
+ .. list-table:: Each type of argument is handled as follows:
291
+ :header-rows: 1
292
+
293
+ * - Type
294
+ - Handling
295
+ * - ``str``
296
+ - Uses ``st.markdown()``.
297
+ * - dataframe-like, ``dict``, or ``list``
298
+ - Uses ``st.dataframe()``.
299
+ * - ``Exception``
300
+ - Uses ``st.exception()``.
301
+ * - function, module, or class
302
+ - Uses ``st.help()``.
303
+ * - ``DeltaGenerator``
304
+ - Uses ``st.help()``.
305
+ * - Altair chart
306
+ - Uses ``st.altair_chart()``.
307
+ * - Bokeh figure
308
+ - Uses ``st.bokeh_chart()``.
309
+ * - Graphviz graph
310
+ - Uses ``st.graphviz_chart()``.
311
+ * - Keras model
312
+ - Converts model and uses ``st.graphviz_chart()``.
313
+ * - Matplotlib figure
314
+ - Uses ``st.pyplot()``.
315
+ * - Plotly figure
316
+ - Uses ``st.plotly_chart()``.
317
+ * - ``PIL.Image``
318
+ - Uses ``st.image()``.
319
+ * - generator or stream (like ``openai.Stream``)
320
+ - Uses ``st.write_stream()``.
321
+ * - SymPy expression
322
+ - Uses ``st.latex()``.
323
+ * - An object with ``._repr_html()``
324
+ - Uses ``st.html()``.
325
+ * - Database cursor
326
+ - Displays DB API 2.0 cursor results in a table.
327
+ * - Any
328
+ - Displays ``str(arg)`` as inline code.
329
+
330
+ unsafe_allow_html : bool
331
+ Whether to render HTML within ``*args``. This only applies to
332
+ strings or objects falling back on ``_repr_html_()``. If this is
333
+ ``False`` (default), any HTML tags found in ``body`` will be
334
+ escaped and therefore treated as raw text. If this is ``True``, any
335
+ HTML expressions within ``body`` will be rendered.
336
+
337
+ Adding custom HTML to your app impacts safety, styling, and
338
+ maintainability.
339
+
340
+ .. note::
341
+ If you only want to insert HTML or CSS without Markdown text,
342
+ we recommend using ``st.html`` instead.
343
+
344
+
345
+ Returns
346
+ -------
347
+ None
348
+
349
+ Examples
350
+ --------
351
+ Its basic use case is to draw Markdown-formatted text, whenever the
352
+ input is a string:
353
+
354
+ >>> import streamlit as st
355
+ >>>
356
+ >>> st.write("Hello, *World!* :sunglasses:")
357
+
358
+ .. output::
359
+ https://doc-write1.streamlit.app/
360
+ height: 150px
361
+
362
+ As mentioned earlier, ``st.write()`` also accepts other data formats, such as
363
+ numbers, data frames, styled data frames, and assorted objects:
364
+
365
+ >>> import streamlit as st
366
+ >>> import pandas as pd
367
+ >>>
368
+ >>> st.write(1234)
369
+ >>> st.write(
370
+ ... pd.DataFrame(
371
+ ... {
372
+ ... "first column": [1, 2, 3, 4],
373
+ ... "second column": [10, 20, 30, 40],
374
+ ... }
375
+ ... )
376
+ ... )
377
+
378
+ .. output::
379
+ https://doc-write2.streamlit.app/
380
+ height: 350px
381
+
382
+ Finally, you can pass in multiple arguments to do things like:
383
+
384
+ >>> import streamlit as st
385
+ >>>
386
+ >>> st.write("1 + 1 = ", 2)
387
+ >>> st.write("Below is a DataFrame:", data_frame, "Above is a dataframe.")
388
+
389
+ .. output::
390
+ https://doc-write3.streamlit.app/
391
+ height: 410px
392
+
393
+ Oh, one more thing: ``st.write`` accepts chart objects too! For example:
394
+
395
+ >>> import altair as alt
396
+ >>> import pandas as pd
397
+ >>> import streamlit as st
398
+ >>> from numpy.random import default_rng as rng
399
+ >>>
400
+ >>> df = pd.DataFrame(rng(0).standard_normal((200, 3)), columns=["a", "b", "c"])
401
+ >>> chart = (
402
+ ... alt.Chart(df)
403
+ ... .mark_circle()
404
+ ... .encode(x="a", y="b", size="c", color="c", tooltip=["a", "b", "c"])
405
+ ... )
406
+ >>>
407
+ >>> st.write(chart)
408
+
409
+ .. output::
410
+ https://doc-vega-lite-chart.streamlit.app/
411
+ height: 300px
412
+
413
+ """
414
+
415
+ if len(args) == 1 and isinstance(args[0], str):
416
+ # Optimization: If there is only one arg, and it's a string,
417
+ # we can just call markdown directly and skip the buffer logic.
418
+ # This also prevents unnecessary usage of `st.empty()`.
419
+ # This covers > 80% of all `st.write` uses.
420
+ self.dg.markdown(args[0], unsafe_allow_html=unsafe_allow_html)
421
+ return
422
+
423
+ string_buffer: list[str] = []
424
+
425
+ # This bans some valid cases like: e = st.empty(); e.write("a", "b").
426
+ # BUT: 1) such cases are rare, 2) this rule is easy to understand,
427
+ # and 3) this rule should be removed once we have st.container()
428
+ if not self.dg._is_top_level and len(args) > 1:
429
+ raise StreamlitAPIException(
430
+ "Cannot replace a single element with multiple elements.\n\n"
431
+ "The `write()` method only supports multiple elements when "
432
+ "inserting elements rather than replacing. That is, only "
433
+ "when called as `st.write()` or `st.sidebar.write()`."
434
+ )
435
+
436
+ def flush_buffer() -> None:
437
+ if string_buffer:
438
+ text_content = " ".join(string_buffer)
439
+ # The usage of empty here prevents
440
+ # some grey out effects:
441
+ text_container = self.dg.empty()
442
+ text_container.markdown(
443
+ text_content,
444
+ unsafe_allow_html=unsafe_allow_html,
445
+ )
446
+ string_buffer[:] = []
447
+
448
+ for arg in args:
449
+ # Order matters!
450
+ if isinstance(arg, str):
451
+ string_buffer.append(arg)
452
+ elif isinstance(arg, StreamingOutput):
453
+ flush_buffer()
454
+ for item in arg:
455
+ if callable(item):
456
+ flush_buffer()
457
+ item()
458
+ else:
459
+ self.write(item, unsafe_allow_html=unsafe_allow_html)
460
+ elif isinstance(arg, Exception):
461
+ flush_buffer()
462
+ self.dg.exception(arg)
463
+ elif type_util.is_delta_generator(arg):
464
+ flush_buffer()
465
+ self.dg.help(arg)
466
+ elif dataframe_util.is_dataframe_like(arg):
467
+ flush_buffer()
468
+ self.dg.dataframe(arg)
469
+ elif type_util.is_altair_chart(arg):
470
+ flush_buffer()
471
+ self.dg.altair_chart(arg)
472
+ elif type_util.is_type(arg, "matplotlib.figure.Figure"):
473
+ flush_buffer()
474
+ self.dg.pyplot(arg)
475
+ elif type_util.is_plotly_chart(arg):
476
+ flush_buffer()
477
+ self.dg.plotly_chart(arg)
478
+ elif type_util.is_type(arg, "bokeh.plotting.figure.Figure"):
479
+ flush_buffer()
480
+ self.dg.bokeh_chart(arg)
481
+ elif type_util.is_graphviz_chart(arg):
482
+ flush_buffer()
483
+ self.dg.graphviz_chart(arg)
484
+ elif type_util.is_sympy_expression(arg):
485
+ flush_buffer()
486
+ self.dg.latex(arg)
487
+ elif type_util.is_pillow_image(arg):
488
+ flush_buffer()
489
+ self.dg.image(arg)
490
+ elif type_util.is_keras_model(arg):
491
+ from tensorflow.python.keras.utils import ( # type: ignore
492
+ vis_utils,
493
+ )
494
+
495
+ flush_buffer()
496
+ dot = vis_utils.model_to_dot(arg)
497
+ self.dg.graphviz_chart(dot.to_string())
498
+ elif (
499
+ isinstance(
500
+ arg,
501
+ (
502
+ dict,
503
+ list,
504
+ map,
505
+ enumerate,
506
+ types.MappingProxyType,
507
+ UserDict,
508
+ ChainMap,
509
+ UserList,
510
+ ItemsView,
511
+ KeysView,
512
+ ValuesView,
513
+ ),
514
+ )
515
+ or type_util.is_custom_dict(arg)
516
+ or type_util.is_namedtuple(arg)
517
+ or type_util.is_pydantic_model(arg)
518
+ ):
519
+ flush_buffer()
520
+ self.dg.json(arg)
521
+ elif type_util.is_pydeck(arg):
522
+ flush_buffer()
523
+ self.dg.pydeck_chart(arg)
524
+ elif isinstance(arg, StringIO):
525
+ flush_buffer()
526
+ self.dg.markdown(arg.getvalue())
527
+ elif (
528
+ inspect.isgenerator(arg)
529
+ or inspect.isgeneratorfunction(arg)
530
+ or inspect.isasyncgenfunction(arg)
531
+ or inspect.isasyncgen(arg)
532
+ or type_util.is_type(arg, "openai.Stream")
533
+ ):
534
+ flush_buffer()
535
+ self.write_stream(arg)
536
+ elif isinstance(arg, HELP_TYPES) or dataclasses.is_dataclass(arg):
537
+ flush_buffer()
538
+ self.dg.help(arg)
539
+ elif inspect.isclass(arg):
540
+ flush_buffer()
541
+ # We cast arg to type here to appease mypy, due to bug in mypy:
542
+ # https://github.com/python/mypy/issues/12933
543
+ self.dg.help(cast("type", arg))
544
+ elif unsafe_allow_html and type_util.has_callable_attr(arg, "_repr_html_"):
545
+ self.dg.html(arg._repr_html_())
546
+ elif type_util.has_callable_attr(
547
+ arg, "to_pandas"
548
+ ) or type_util.has_callable_attr(arg, "__dataframe__"):
549
+ # This object can very likely be converted to a DataFrame
550
+ # using the to_pandas, to_arrow, or the dataframe interchange
551
+ # protocol.
552
+ flush_buffer()
553
+ self.dg.dataframe(arg)
554
+ else:
555
+ stringified_arg = str(arg)
556
+
557
+ if is_mem_address_str(stringified_arg):
558
+ flush_buffer()
559
+ self.dg.help(arg)
560
+
561
+ elif "\n" in stringified_arg:
562
+ # With a multi-line string, use a preformatted block
563
+ # To fully escape backticks, we wrap with backticks larger than
564
+ # the largest sequence of backticks in the string.
565
+ backtick_count = max(3, max_char_sequence(stringified_arg, "`") + 1)
566
+ backtick_wrapper = "`" * backtick_count
567
+ string_buffer.append(
568
+ f"{backtick_wrapper}\n{stringified_arg}\n{backtick_wrapper}"
569
+ )
570
+ else:
571
+ # With a single-line string, use a preformatted text
572
+ # To fully escape backticks, we wrap with backticks larger than
573
+ # the largest sequence of backticks in the string.
574
+ backtick_count = max_char_sequence(stringified_arg, "`") + 1
575
+ backtick_wrapper = "`" * backtick_count
576
+ string_buffer.append(
577
+ f"{backtick_wrapper}{stringified_arg}{backtick_wrapper}"
578
+ )
579
+
580
+ flush_buffer()
581
+
582
+ @property
583
+ def dg(self) -> DeltaGenerator:
584
+ """Get our DeltaGenerator."""
585
+ return cast("DeltaGenerator", self)