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,555 @@
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 copy
18
+ import json
19
+ from collections.abc import Mapping
20
+ from enum import Enum
21
+ from typing import TYPE_CHECKING, Any, Final, Literal, TypeAlias
22
+
23
+ from streamlit.dataframe_util import DataFormat
24
+ from streamlit.elements.lib.column_types import ColumnConfig, ColumnType
25
+ from streamlit.elements.lib.dicttools import remove_none_values
26
+ from streamlit.errors import StreamlitAPIException
27
+
28
+ if TYPE_CHECKING:
29
+ import pyarrow as pa
30
+ from pandas import DataFrame, Index, Series
31
+
32
+ from streamlit.proto.Dataframe_pb2 import Dataframe as DataframeProto
33
+
34
+
35
+ # The index identifier can be used to apply configuration options
36
+ IndexIdentifierType = Literal["_index"]
37
+ INDEX_IDENTIFIER: IndexIdentifierType = "_index"
38
+
39
+ # This is used as prefix for columns that are configured via the numerical position.
40
+ # The integer value is converted into a string key with this prefix.
41
+ # This needs to match with the prefix configured in the frontend.
42
+ _NUMERICAL_POSITION_PREFIX = "_pos:"
43
+
44
+
45
+ # The column data kind is used to describe the type of the data within the column.
46
+ class ColumnDataKind(str, Enum):
47
+ INTEGER = "integer"
48
+ FLOAT = "float"
49
+ DATE = "date"
50
+ TIME = "time"
51
+ DATETIME = "datetime"
52
+ BOOLEAN = "boolean"
53
+ STRING = "string"
54
+ TIMEDELTA = "timedelta"
55
+ PERIOD = "period"
56
+ INTERVAL = "interval"
57
+ BYTES = "bytes"
58
+ DECIMAL = "decimal"
59
+ COMPLEX = "complex"
60
+ LIST = "list"
61
+ DICT = "dict"
62
+ EMPTY = "empty"
63
+ UNKNOWN = "unknown"
64
+
65
+
66
+ # The dataframe schema is a mapping from the name of the column
67
+ # in the underlying dataframe to the column data kind.
68
+ # The index column uses `_index` as name.
69
+ DataframeSchema: TypeAlias = dict[str, ColumnDataKind]
70
+
71
+ # This mapping contains all editable column types mapped to the data kinds
72
+ # that the column type is compatible for editing.
73
+ _EDITING_COMPATIBILITY_MAPPING: Final[dict[ColumnType, list[ColumnDataKind]]] = {
74
+ "text": [ColumnDataKind.STRING, ColumnDataKind.EMPTY],
75
+ "number": [
76
+ ColumnDataKind.INTEGER,
77
+ ColumnDataKind.FLOAT,
78
+ ColumnDataKind.DECIMAL,
79
+ ColumnDataKind.STRING,
80
+ ColumnDataKind.TIMEDELTA,
81
+ ColumnDataKind.EMPTY,
82
+ ],
83
+ "checkbox": [
84
+ ColumnDataKind.BOOLEAN,
85
+ ColumnDataKind.STRING,
86
+ ColumnDataKind.INTEGER,
87
+ ColumnDataKind.EMPTY,
88
+ ],
89
+ "selectbox": [
90
+ ColumnDataKind.STRING,
91
+ ColumnDataKind.BOOLEAN,
92
+ ColumnDataKind.INTEGER,
93
+ ColumnDataKind.FLOAT,
94
+ ColumnDataKind.EMPTY,
95
+ ],
96
+ "date": [ColumnDataKind.DATE, ColumnDataKind.DATETIME, ColumnDataKind.EMPTY],
97
+ "time": [ColumnDataKind.TIME, ColumnDataKind.DATETIME, ColumnDataKind.EMPTY],
98
+ "datetime": [
99
+ ColumnDataKind.DATETIME,
100
+ ColumnDataKind.DATE,
101
+ ColumnDataKind.TIME,
102
+ ColumnDataKind.EMPTY,
103
+ ],
104
+ "link": [ColumnDataKind.STRING, ColumnDataKind.EMPTY],
105
+ "list": [
106
+ ColumnDataKind.LIST,
107
+ ColumnDataKind.STRING,
108
+ ColumnDataKind.EMPTY,
109
+ ],
110
+ "multiselect": [
111
+ ColumnDataKind.LIST,
112
+ ColumnDataKind.STRING,
113
+ ColumnDataKind.EMPTY,
114
+ ],
115
+ }
116
+
117
+
118
+ def is_type_compatible(column_type: ColumnType, data_kind: ColumnDataKind) -> bool:
119
+ """Check if the column type is compatible with the underlying data kind.
120
+
121
+ This check only applies to editable column types (e.g. number or text).
122
+ Non-editable column types (e.g. bar_chart or image) can be configured for
123
+ all data kinds (this might change in the future).
124
+
125
+ Parameters
126
+ ----------
127
+ column_type : ColumnType
128
+ The column type to check.
129
+
130
+ data_kind : ColumnDataKind
131
+ The data kind to check.
132
+
133
+ Returns
134
+ -------
135
+ bool
136
+ True if the column type is compatible with the data kind, False otherwise.
137
+ """
138
+
139
+ if column_type not in _EDITING_COMPATIBILITY_MAPPING:
140
+ return True
141
+
142
+ return data_kind in _EDITING_COMPATIBILITY_MAPPING[column_type]
143
+
144
+
145
+ def _determine_data_kind_via_arrow(field: pa.Field) -> ColumnDataKind:
146
+ """Determine the data kind via the arrow type information.
147
+
148
+ The column data kind refers to the shared data type of the values
149
+ in the column (e.g. int, float, str, bool).
150
+
151
+ Parameters
152
+ ----------
153
+ field : pa.Field
154
+ The arrow field from the arrow table schema.
155
+
156
+ Returns
157
+ -------
158
+ ColumnDataKind
159
+ The data kind of the field.
160
+ """
161
+ import pyarrow as pa
162
+
163
+ field_type = field.type
164
+ if pa.types.is_integer(field_type):
165
+ return ColumnDataKind.INTEGER
166
+
167
+ if pa.types.is_floating(field_type):
168
+ return ColumnDataKind.FLOAT
169
+
170
+ if pa.types.is_boolean(field_type):
171
+ return ColumnDataKind.BOOLEAN
172
+
173
+ if pa.types.is_string(field_type):
174
+ return ColumnDataKind.STRING
175
+
176
+ if pa.types.is_date(field_type):
177
+ return ColumnDataKind.DATE
178
+
179
+ if pa.types.is_time(field_type):
180
+ return ColumnDataKind.TIME
181
+
182
+ if pa.types.is_timestamp(field_type):
183
+ return ColumnDataKind.DATETIME
184
+
185
+ if pa.types.is_duration(field_type):
186
+ return ColumnDataKind.TIMEDELTA
187
+
188
+ if pa.types.is_list(field_type):
189
+ return ColumnDataKind.LIST
190
+
191
+ if pa.types.is_decimal(field_type):
192
+ return ColumnDataKind.DECIMAL
193
+
194
+ if pa.types.is_null(field_type):
195
+ return ColumnDataKind.EMPTY
196
+
197
+ # Interval does not seem to work correctly:
198
+ # if pa.types.is_interval(field_type):
199
+ # return ColumnDataKind.INTERVAL # noqa: ERA001
200
+
201
+ if pa.types.is_binary(field_type):
202
+ return ColumnDataKind.BYTES
203
+
204
+ if pa.types.is_struct(field_type):
205
+ return ColumnDataKind.DICT
206
+
207
+ return ColumnDataKind.UNKNOWN
208
+
209
+
210
+ def _determine_data_kind_via_pandas_dtype(
211
+ column: Series[Any] | Index[Any],
212
+ ) -> ColumnDataKind:
213
+ """Determine the data kind by using the pandas dtype.
214
+
215
+ The column data kind refers to the shared data type of the values
216
+ in the column (e.g. int, float, str, bool).
217
+
218
+ Parameters
219
+ ----------
220
+ column : pd.Series, pd.Index
221
+ The column for which the data kind should be determined.
222
+
223
+ Returns
224
+ -------
225
+ ColumnDataKind
226
+ The data kind of the column.
227
+ """
228
+ import pandas as pd
229
+
230
+ column_dtype = column.dtype
231
+ if pd.api.types.is_bool_dtype(column_dtype):
232
+ return ColumnDataKind.BOOLEAN
233
+
234
+ if pd.api.types.is_integer_dtype(column_dtype):
235
+ return ColumnDataKind.INTEGER
236
+
237
+ if pd.api.types.is_float_dtype(column_dtype):
238
+ return ColumnDataKind.FLOAT
239
+
240
+ if pd.api.types.is_datetime64_any_dtype(column_dtype):
241
+ return ColumnDataKind.DATETIME
242
+
243
+ if pd.api.types.is_timedelta64_dtype(column_dtype):
244
+ return ColumnDataKind.TIMEDELTA
245
+
246
+ if isinstance(column_dtype, pd.PeriodDtype):
247
+ return ColumnDataKind.PERIOD
248
+
249
+ if isinstance(column_dtype, pd.IntervalDtype):
250
+ return ColumnDataKind.INTERVAL
251
+
252
+ if pd.api.types.is_complex_dtype(column_dtype):
253
+ return ColumnDataKind.COMPLEX
254
+
255
+ if pd.api.types.is_object_dtype(
256
+ column_dtype
257
+ ) is False and pd.api.types.is_string_dtype(column_dtype):
258
+ # This handles pandas 3.0+ StringDtype (and PyArrow-backed string types).
259
+ # We exclude object dtype here because object columns with string values
260
+ # are handled via _determine_data_kind_via_inferred_type in the caller.
261
+ return ColumnDataKind.STRING
262
+
263
+ return ColumnDataKind.UNKNOWN
264
+
265
+
266
+ def _determine_data_kind_via_inferred_type(
267
+ column: Series[Any] | Index[Any],
268
+ ) -> ColumnDataKind:
269
+ """Determine the data kind by inferring it from the underlying data.
270
+
271
+ The column data kind refers to the shared data type of the values
272
+ in the column (e.g. int, float, str, bool).
273
+
274
+ Parameters
275
+ ----------
276
+ column : pd.Series, pd.Index
277
+ The column to determine the data kind for.
278
+
279
+ Returns
280
+ -------
281
+ ColumnDataKind
282
+ The data kind of the column.
283
+ """
284
+ from pandas.api.types import infer_dtype
285
+
286
+ inferred_type = infer_dtype(column)
287
+
288
+ if inferred_type == "string":
289
+ return ColumnDataKind.STRING
290
+
291
+ if inferred_type == "bytes":
292
+ return ColumnDataKind.BYTES
293
+
294
+ if inferred_type in {"floating", "mixed-integer-float"}:
295
+ return ColumnDataKind.FLOAT
296
+
297
+ if inferred_type == "integer":
298
+ return ColumnDataKind.INTEGER
299
+
300
+ if inferred_type == "decimal":
301
+ return ColumnDataKind.DECIMAL
302
+
303
+ if inferred_type == "complex":
304
+ return ColumnDataKind.COMPLEX
305
+
306
+ if inferred_type == "boolean":
307
+ return ColumnDataKind.BOOLEAN
308
+
309
+ if inferred_type in {"datetime64", "datetime"}:
310
+ return ColumnDataKind.DATETIME
311
+
312
+ if inferred_type == "date":
313
+ return ColumnDataKind.DATE
314
+
315
+ if inferred_type in {"timedelta64", "timedelta"}:
316
+ return ColumnDataKind.TIMEDELTA
317
+
318
+ if inferred_type == "time":
319
+ return ColumnDataKind.TIME
320
+
321
+ if inferred_type == "period":
322
+ return ColumnDataKind.PERIOD
323
+
324
+ if inferred_type == "interval":
325
+ return ColumnDataKind.INTERVAL
326
+
327
+ if inferred_type == "empty":
328
+ return ColumnDataKind.EMPTY
329
+
330
+ # Unused types: mixed, unknown-array, categorical, mixed-integer
331
+
332
+ return ColumnDataKind.UNKNOWN
333
+
334
+
335
+ def _determine_data_kind(
336
+ column: Series[Any] | Index[Any], field: pa.Field | None = None
337
+ ) -> ColumnDataKind:
338
+ """Determine the data kind of a column.
339
+
340
+ The column data kind refers to the shared data type of the values
341
+ in the column (e.g. int, float, str, bool).
342
+
343
+ Parameters
344
+ ----------
345
+ column : pd.Series, pd.Index
346
+ The column to determine the data kind for.
347
+ field : pa.Field, optional
348
+ The arrow field from the arrow table schema.
349
+
350
+ Returns
351
+ -------
352
+ ColumnDataKind
353
+ The data kind of the column.
354
+ """
355
+ import pandas as pd
356
+
357
+ if isinstance(column.dtype, pd.CategoricalDtype):
358
+ # Categorical columns can have different underlying data kinds
359
+ # depending on the categories.
360
+ return _determine_data_kind_via_inferred_type(column.dtype.categories)
361
+
362
+ if field is not None:
363
+ data_kind = _determine_data_kind_via_arrow(field)
364
+ if data_kind != ColumnDataKind.UNKNOWN:
365
+ return data_kind
366
+
367
+ if column.dtype.name == "object":
368
+ # If dtype is object, we need to infer the type from the column
369
+ return _determine_data_kind_via_inferred_type(column)
370
+ return _determine_data_kind_via_pandas_dtype(column)
371
+
372
+
373
+ def determine_dataframe_schema(
374
+ data_df: DataFrame, arrow_schema: pa.Schema
375
+ ) -> DataframeSchema:
376
+ """Determine the schema of a dataframe.
377
+
378
+ Parameters
379
+ ----------
380
+ data_df : pd.DataFrame
381
+ The dataframe to determine the schema of.
382
+ arrow_schema : pa.Schema
383
+ The Arrow schema of the dataframe.
384
+
385
+ Returns
386
+ -------
387
+ DataframeSchema
388
+ A mapping that contains the detected data type for the index and columns.
389
+ The key is the column name in the underlying dataframe or ``_index`` for index columns.
390
+ """
391
+
392
+ dataframe_schema: DataframeSchema = {}
393
+
394
+ # Add type of index:
395
+ # TODO(lukasmasuch): We need to apply changes here to support multiindex.
396
+ dataframe_schema[INDEX_IDENTIFIER] = _determine_data_kind(data_df.index)
397
+
398
+ # Add types for all columns:
399
+ for i, column in enumerate(data_df.items()):
400
+ column_name = str(column[0])
401
+ column_data = column[1]
402
+ dataframe_schema[column_name] = _determine_data_kind(
403
+ column_data, arrow_schema.field(i)
404
+ )
405
+ return dataframe_schema
406
+
407
+
408
+ # A mapping of column names/IDs to column configs.
409
+ ColumnConfigMapping: TypeAlias = dict[IndexIdentifierType | str | int, ColumnConfig]
410
+ ColumnConfigMappingInput: TypeAlias = Mapping[
411
+ # TODO(lukasmasuch): This should also use int here to
412
+ # correctly type the support for positional index. However,
413
+ # allowing int here leads mypy to complain about simple dict[str, ...]
414
+ # as input -> which seems like a mypy bug.
415
+ IndexIdentifierType | str,
416
+ ColumnConfig | str | None,
417
+ ]
418
+
419
+
420
+ def process_config_mapping(
421
+ column_config: ColumnConfigMappingInput | None = None,
422
+ ) -> ColumnConfigMapping:
423
+ """Transforms a user-provided column config mapping into a valid column config mapping
424
+ that can be used by the frontend.
425
+
426
+ Parameters
427
+ ----------
428
+ column_config: dict or None
429
+ The user-provided column config mapping.
430
+
431
+ Returns
432
+ -------
433
+ dict
434
+ The transformed column config mapping.
435
+ """
436
+ if column_config is None:
437
+ return {}
438
+
439
+ transformed_column_config: ColumnConfigMapping = {}
440
+ for column, config in column_config.items():
441
+ if config is None:
442
+ transformed_column_config[column] = ColumnConfig(hidden=True)
443
+ elif isinstance(config, str):
444
+ transformed_column_config[column] = ColumnConfig(label=config)
445
+ elif isinstance(config, dict):
446
+ # Ensure that the column config objects are cloned
447
+ # since we will apply in-place changes to it.
448
+ transformed_column_config[column] = copy.deepcopy(config)
449
+ else:
450
+ raise StreamlitAPIException(
451
+ f"Invalid column config for column `{column}`. "
452
+ f"Expected `None`, `str` or `dict`, but got `{type(config)}`."
453
+ )
454
+ return transformed_column_config
455
+
456
+
457
+ def update_column_config(
458
+ column_config_mapping: ColumnConfigMapping,
459
+ column: str | int,
460
+ column_config: ColumnConfig,
461
+ ) -> None:
462
+ """Updates the column config value for a single column within the mapping.
463
+
464
+ Parameters
465
+ ----------
466
+ column_config_mapping : ColumnConfigMapping
467
+ The column config mapping to update.
468
+
469
+ column : str | int
470
+ The column to update the config value for. This can be the column name or
471
+ the numerical position of the column.
472
+
473
+ column_config : ColumnConfig
474
+ The column config to update.
475
+ """
476
+
477
+ if column not in column_config_mapping:
478
+ column_config_mapping[column] = {}
479
+
480
+ column_config_mapping[column].update(column_config)
481
+
482
+
483
+ def apply_data_specific_configs(
484
+ columns_config: ColumnConfigMapping,
485
+ data_format: DataFormat,
486
+ ) -> None:
487
+ """Apply data specific configurations to the provided dataframe.
488
+
489
+ This will apply inplace changes to the dataframe and the column configurations
490
+ depending on the data format.
491
+
492
+ Parameters
493
+ ----------
494
+ columns_config : ColumnConfigMapping
495
+ A mapping of column names/ids to column configurations.
496
+
497
+ data_format : DataFormat
498
+ The format of the data.
499
+ """
500
+
501
+ # Pandas adds a range index as default to all datastructures
502
+ # but for most of the non-pandas data objects it is unnecessary
503
+ # to show this index to the user. Therefore, we will hide it as default.
504
+ if data_format in {
505
+ DataFormat.SET_OF_VALUES,
506
+ DataFormat.TUPLE_OF_VALUES,
507
+ DataFormat.LIST_OF_VALUES,
508
+ DataFormat.NUMPY_LIST,
509
+ DataFormat.NUMPY_MATRIX,
510
+ DataFormat.LIST_OF_RECORDS,
511
+ DataFormat.LIST_OF_ROWS,
512
+ DataFormat.COLUMN_VALUE_MAPPING,
513
+ # Dataframe-like objects that don't have an index:
514
+ DataFormat.PANDAS_ARRAY,
515
+ DataFormat.PANDAS_INDEX,
516
+ DataFormat.POLARS_DATAFRAME,
517
+ DataFormat.POLARS_SERIES,
518
+ DataFormat.POLARS_LAZYFRAME,
519
+ DataFormat.PYARROW_ARRAY,
520
+ DataFormat.RAY_DATASET,
521
+ }:
522
+ update_column_config(columns_config, INDEX_IDENTIFIER, {"hidden": True})
523
+
524
+
525
+ def _convert_column_config_to_json(column_config_mapping: ColumnConfigMapping) -> str:
526
+ try:
527
+ # Ignore all None values and prefix columns specified by numerical index:
528
+ return json.dumps(
529
+ {
530
+ (f"{_NUMERICAL_POSITION_PREFIX}{k!s}" if isinstance(k, int) else k): v
531
+ for (k, v) in remove_none_values(column_config_mapping).items()
532
+ },
533
+ allow_nan=False,
534
+ )
535
+ except ValueError as ex:
536
+ raise StreamlitAPIException(
537
+ f"The provided column config cannot be serialized into JSON: {ex}"
538
+ ) from ex
539
+
540
+
541
+ def marshall_column_config(
542
+ proto: DataframeProto, column_config_mapping: ColumnConfigMapping
543
+ ) -> None:
544
+ """Marshall the column config into the Dataframe proto.
545
+
546
+ Parameters
547
+ ----------
548
+ proto : DataframeProto
549
+ The proto to marshall into.
550
+
551
+ column_config_mapping : ColumnConfigMapping
552
+ The column config to marshall.
553
+ """
554
+
555
+ proto.columns = _convert_column_config_to_json(column_config_mapping)