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,529 @@
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
+ from dataclasses import dataclass
18
+ from textwrap import dedent
19
+ from typing import TYPE_CHECKING, Any, Final, Literal, TypeAlias, cast
20
+
21
+ from streamlit.dataframe_util import OptionSequence, convert_anything_to_list
22
+ from streamlit.elements.lib.layout_utils import (
23
+ Height,
24
+ LayoutConfig,
25
+ Width,
26
+ validate_height,
27
+ validate_width,
28
+ )
29
+ from streamlit.elements.lib.policies import maybe_raise_label_warnings
30
+ from streamlit.elements.lib.utils import (
31
+ LabelVisibility,
32
+ get_label_visibility_proto_value,
33
+ )
34
+ from streamlit.errors import StreamlitAPIException, StreamlitValueError
35
+ from streamlit.proto.Metric_pb2 import Metric as MetricProto
36
+ from streamlit.runtime.metrics_util import gather_metrics
37
+ from streamlit.string_util import AnyNumber, clean_text, from_number
38
+
39
+ if TYPE_CHECKING:
40
+ from streamlit.delta_generator import DeltaGenerator
41
+ from streamlit.elements.lib.column_types import NumberFormat
42
+
43
+
44
+ Value: TypeAlias = AnyNumber | str | None
45
+ Delta: TypeAlias = AnyNumber | str | None
46
+ DeltaColor: TypeAlias = Literal[
47
+ "normal",
48
+ "inverse",
49
+ "off",
50
+ "red",
51
+ "orange",
52
+ "yellow",
53
+ "green",
54
+ "blue",
55
+ "violet",
56
+ "gray",
57
+ "grey",
58
+ "primary",
59
+ ]
60
+ DeltaArrow: TypeAlias = Literal["auto", "up", "down", "off"]
61
+
62
+ # Mapping from delta_color string values to proto enum values
63
+ _DELTA_COLOR_TO_PROTO: Final[dict[str, MetricProto.MetricColor.ValueType]] = {
64
+ "red": MetricProto.MetricColor.RED,
65
+ "orange": MetricProto.MetricColor.ORANGE,
66
+ "yellow": MetricProto.MetricColor.YELLOW,
67
+ "green": MetricProto.MetricColor.GREEN,
68
+ "blue": MetricProto.MetricColor.BLUE,
69
+ "violet": MetricProto.MetricColor.VIOLET,
70
+ "gray": MetricProto.MetricColor.GRAY,
71
+ "grey": MetricProto.MetricColor.GRAY,
72
+ "primary": MetricProto.MetricColor.PRIMARY,
73
+ }
74
+
75
+ # Valid delta_color values for validation
76
+ _VALID_DELTA_COLORS: Final[set[str]] = {
77
+ "normal",
78
+ "inverse",
79
+ "off",
80
+ *_DELTA_COLOR_TO_PROTO.keys(),
81
+ }
82
+
83
+ # Mapping from delta_arrow string values to proto enum values
84
+ _DELTA_ARROW_TO_PROTO: Final[dict[str, MetricProto.MetricDirection.ValueType]] = {
85
+ "off": MetricProto.MetricDirection.NONE,
86
+ "up": MetricProto.MetricDirection.UP,
87
+ "down": MetricProto.MetricDirection.DOWN,
88
+ }
89
+
90
+
91
+ @dataclass(frozen=True)
92
+ class MetricColorAndDirection:
93
+ color: MetricProto.MetricColor.ValueType
94
+ direction: MetricProto.MetricDirection.ValueType
95
+
96
+
97
+ class MetricMixin:
98
+ @gather_metrics("metric")
99
+ def metric(
100
+ self,
101
+ label: str,
102
+ value: Value,
103
+ delta: Delta = None,
104
+ delta_color: DeltaColor = "normal",
105
+ *,
106
+ help: str | None = None,
107
+ label_visibility: LabelVisibility = "visible",
108
+ border: bool = False,
109
+ width: Width = "stretch",
110
+ height: Height = "content",
111
+ chart_data: OptionSequence[Any] | None = None,
112
+ chart_type: Literal["line", "bar", "area"] = "line",
113
+ delta_arrow: DeltaArrow = "auto",
114
+ format: str | NumberFormat | None = None,
115
+ delta_description: str | None = None,
116
+ ) -> DeltaGenerator:
117
+ r"""Display a metric in big bold font, with an optional indicator of how the metric changed.
118
+
119
+ Parameters
120
+ ----------
121
+ label : str
122
+ The header or title for the metric. The label can optionally
123
+ contain GitHub-flavored Markdown of the following types: Bold, Italics,
124
+ Strikethroughs, Inline Code, Links, and Images. Images display like
125
+ icons, with a max height equal to the font height.
126
+
127
+ Unsupported Markdown elements are unwrapped so only their children
128
+ (text contents) render. Display unsupported elements as literal
129
+ characters by backslash-escaping them. E.g.,
130
+ ``"1\. Not an ordered list"``.
131
+
132
+ See the ``body`` parameter of |st.markdown|_ for additional,
133
+ supported Markdown directives.
134
+
135
+ .. |st.markdown| replace:: ``st.markdown``
136
+ .. _st.markdown: https://docs.streamlit.io/develop/api-reference/text/st.markdown
137
+
138
+ value : int, float, decimal.Decimal, str, or None
139
+ Value of the metric. ``None`` is rendered as a long dash.
140
+
141
+ The value can optionally contain GitHub-flavored Markdown, subject
142
+ to the same limitations described in the ``label`` parameter.
143
+
144
+ delta : int, float, decimal.Decimal, str, or None
145
+ Amount or indicator of change in the metric. An arrow is shown next
146
+ to the delta, oriented according to its sign:
147
+
148
+ - If the delta is ``None`` or an empty string, no arrow is shown.
149
+ - If the delta is a negative number or starts with a minus sign,
150
+ the arrow points down and the delta is red.
151
+ - Otherwise, the arrow points up and the delta is green.
152
+
153
+ You can modify the display, color, and orientation of the arrow
154
+ using the ``delta_color`` and ``delta_arrow`` parameters.
155
+
156
+ The delta can optionally contain GitHub-flavored Markdown, subject
157
+ to the same limitations described in the ``label`` parameter.
158
+
159
+ delta_color : str
160
+ The color of the delta and chart. This can be one of the following:
161
+
162
+ - ``"normal"`` (default): The color is red when the delta is
163
+ negative and green otherwise.
164
+ - ``"inverse"``: The color is green when the delta is negative and
165
+ red otherwise. This is useful when a negative change is
166
+ considered good, like a decrease in cost.
167
+ - ``"off"``: The color is gray regardless of the delta.
168
+ - A named color from the basic palette: The chart and delta are the
169
+ specified color regardless of their value. This can be one of the
170
+ following: ``"red"``, ``"orange"``, ``"yellow"``, ``"green"``,
171
+ ``"blue"``, ``"violet"``, ``"gray"``/``"grey"``, or
172
+ ``"primary"``.
173
+
174
+ help : str or None
175
+ A tooltip that gets displayed next to the metric label. Streamlit
176
+ only displays the tooltip when ``label_visibility="visible"``. If
177
+ this is ``None`` (default), no tooltip is displayed.
178
+
179
+ The tooltip can optionally contain GitHub-flavored Markdown,
180
+ including the Markdown directives described in the ``body``
181
+ parameter of ``st.markdown``.
182
+
183
+ label_visibility : "visible", "hidden", or "collapsed"
184
+ The visibility of the label. The default is ``"visible"``. If this
185
+ is ``"hidden"``, Streamlit displays an empty spacer instead of the
186
+ label, which can help keep the widget aligned with other widgets.
187
+ If this is ``"collapsed"``, Streamlit displays no label or spacer.
188
+
189
+ border : bool
190
+ Whether to show a border around the metric container. If this is
191
+ ``False`` (default), no border is shown. If this is ``True``, a
192
+ border is shown.
193
+
194
+ height : "content", "stretch", or int
195
+ The height of the metric element. This can be one of the following:
196
+
197
+ - ``"content"`` (default): The height of the element matches the
198
+ height of its content.
199
+ - ``"stretch"``: The height of the element matches the height of
200
+ its content or the height of the parent container, whichever is
201
+ larger. If the element is not in a parent container, the height
202
+ of the element matches the height of its content.
203
+ - An integer specifying the height in pixels: The element has a
204
+ fixed height. If the content is larger than the specified
205
+ height, scrolling is enabled.
206
+
207
+ width : "stretch", "content", or int
208
+ The width of the metric element. This can be one of the following:
209
+
210
+ - ``"stretch"`` (default): The width of the element matches the
211
+ width of the parent container.
212
+ - ``"content"``: The width of the element matches the width of its
213
+ content, but doesn't exceed the width of the parent container.
214
+ - An integer specifying the width in pixels: The element has a
215
+ fixed width. If the specified width is greater than the width of
216
+ the parent container, the width of the element matches the width
217
+ of the parent container.
218
+
219
+ chart_data : Iterable or None
220
+ A sequence of numeric values to display as a sparkline chart. If
221
+ this is ``None`` (default), no chart is displayed. The sequence can
222
+ be anything supported by ``st.dataframe``, including a ``list`` or
223
+ ``set``. If the sequence is dataframe-like, the first column will
224
+ be used. Each value will be cast to ``float`` internally by
225
+ default.
226
+
227
+ The chart uses the color of the delta indicator, which can be
228
+ modified using the ``delta_color`` parameter.
229
+
230
+ chart_type : "line", "bar", or "area"
231
+ The type of sparkline chart to display. This can be one of the
232
+ following:
233
+
234
+ - ``"line"`` (default): A simple sparkline.
235
+ - ``"area"``: A sparkline with area shading.
236
+ - ``"bar"``: A bar chart.
237
+
238
+ delta_arrow : "auto", "up", "down", or "off"
239
+ Controls the direction of the delta indicator arrow. This can be
240
+ one of the following strings:
241
+
242
+ - ``"auto"`` (default): The arrow direction follows the sign of
243
+ ``delta``.
244
+ - ``"up"`` or ``"down"``: The arrow is forced to point in the
245
+ specified direction.
246
+ - ``"off"``: No arrow is shown, but the delta value remains
247
+ visible.
248
+
249
+ format : str or None
250
+ A format string controlling how numbers are displayed for ``value``
251
+ and ``delta``. The format is only applied if the value or delta is
252
+ numeric. If the value or delta is a string with non-numeric
253
+ characters, the format is ignored. The format can be one of the
254
+ following values:
255
+
256
+ - ``None`` (default): No formatting is applied.
257
+ - ``"plain"``: Show the full number without any formatting (e.g. "1234.567").
258
+ - ``"localized"``: Show the number in the default locale format (e.g. "1,234.567").
259
+ - ``"percent"``: Show the number as a percentage (e.g. "123456.70%").
260
+ - ``"dollar"``: Show the number as a dollar amount (e.g. "$1,234.57").
261
+ - ``"euro"``: Show the number as a euro amount (e.g. "€1,234.57").
262
+ - ``"yen"``: Show the number as a yen amount (e.g. "¥1,235").
263
+ - ``"accounting"``: Show the number in an accounting format (e.g. "1,234.00").
264
+ - ``"bytes"``: Show the number in a byte format (e.g. "1.2KB").
265
+ - ``"compact"``: Show the number in a compact format (e.g. "1.2K").
266
+ - ``"scientific"``: Show the number in scientific notation (e.g. "1.235E3").
267
+ - ``"engineering"``: Show the number in engineering notation (e.g. "1.235E3").
268
+ - printf-style format string: Format the number with a printf
269
+ specifier, like ``"%d"`` to show a signed integer (e.g. "1234") or
270
+ ``"%.2f"`` to show a float with 2 decimal places. Use ``,`` for
271
+ thousand separators (e.g. ``"%,d"`` yields ``"1,234"``).
272
+
273
+ delta_description : str or None
274
+ A short description displayed next to the delta value, such as
275
+ "month over month" or "vs. last quarter". If this is ``None``
276
+ (default), no description is shown. The description is displayed
277
+ in a smaller, muted font style similar to ``st.caption``.
278
+
279
+ Examples
280
+ --------
281
+ **Example 1: Show a metric**
282
+
283
+ >>> import streamlit as st
284
+ >>>
285
+ >>> st.metric(label="Temperature", value="70 °F", delta="1.2 °F")
286
+
287
+ .. output::
288
+ https://doc-metric-example1.streamlit.app/
289
+ height: 210px
290
+
291
+ **Example 2: Create a row of metrics**
292
+
293
+ ``st.metric`` looks especially nice in combination with ``st.columns``.
294
+
295
+ >>> import streamlit as st
296
+ >>>
297
+ >>> col1, col2, col3 = st.columns(3)
298
+ >>> col1.metric("Temperature", "70 °F", "1.2 °F")
299
+ >>> col2.metric("Wind", "9 mph", "-8%")
300
+ >>> col3.metric("Humidity", "86%", "4%")
301
+
302
+ .. output::
303
+ https://doc-metric-example2.streamlit.app/
304
+ height: 210px
305
+
306
+ **Example 3: Modify the delta indicator**
307
+
308
+ The delta indicator color can also be inverted or turned off.
309
+
310
+ >>> import streamlit as st
311
+ >>>
312
+ >>> st.metric(
313
+ ... label="Gas price", value=4, delta=-0.5, delta_color="inverse"
314
+ ... )
315
+ >>>
316
+ >>> st.metric(
317
+ ... label="Active developers",
318
+ ... value=123,
319
+ ... delta=123,
320
+ ... delta_color="off",
321
+ ... )
322
+
323
+ .. output::
324
+ https://doc-metric-example3.streamlit.app/
325
+ height: 320px
326
+
327
+ **Example 4: Create a grid of metric cards**
328
+
329
+ Add borders to your metrics to create a dashboard look.
330
+
331
+ >>> import streamlit as st
332
+ >>>
333
+ >>> a, b = st.columns(2)
334
+ >>> c, d = st.columns(2)
335
+ >>>
336
+ >>> a.metric("Temperature", "30°F", "-9°F", border=True)
337
+ >>> b.metric("Wind", "4 mph", "2 mph", border=True)
338
+ >>>
339
+ >>> c.metric("Humidity", "77%", "5%", border=True)
340
+ >>> d.metric("Pressure", "30.34 inHg", "-2 inHg", border=True)
341
+
342
+ .. output::
343
+ https://doc-metric-example4.streamlit.app/
344
+ height: 350px
345
+
346
+ **Example 5: Show sparklines**
347
+
348
+ To show trends over time, add sparklines.
349
+
350
+ >>> import streamlit as st
351
+ >>> from numpy.random import default_rng as rng
352
+ >>>
353
+ >>> changes = list(rng(4).standard_normal(20))
354
+ >>> data = [sum(changes[:i]) for i in range(20)]
355
+ >>> delta = round(data[-1], 2)
356
+ >>>
357
+ >>> row = st.container(horizontal=True)
358
+ >>> with row:
359
+ >>> st.metric(
360
+ ... "Line", 10, delta, chart_data=data, chart_type="line", border=True
361
+ ... )
362
+ >>> st.metric(
363
+ ... "Area", 10, delta, chart_data=data, chart_type="area", border=True
364
+ ... )
365
+ >>> st.metric(
366
+ ... "Bar", 10, delta, chart_data=data, chart_type="bar", border=True
367
+ ... )
368
+
369
+ .. output::
370
+ https://doc-metric-example5.streamlit.app/
371
+ height: 300px
372
+
373
+ """
374
+ maybe_raise_label_warnings(label, label_visibility)
375
+
376
+ metric_proto = MetricProto()
377
+ metric_proto.body = _parse_value(value)
378
+ metric_proto.label = _parse_label(label)
379
+ metric_proto.delta = _parse_delta(delta)
380
+ metric_proto.show_border = border
381
+ if help is not None:
382
+ metric_proto.help = dedent(help)
383
+
384
+ color_and_direction = _determine_delta_color_and_direction(
385
+ cast("DeltaColor", clean_text(delta_color)), delta
386
+ )
387
+ metric_proto.color = color_and_direction.color
388
+ metric_proto.direction = color_and_direction.direction
389
+ parsed_delta_arrow = _parse_delta_arrow(
390
+ cast("DeltaArrow", clean_text(delta_arrow))
391
+ )
392
+
393
+ if parsed_delta_arrow in _DELTA_ARROW_TO_PROTO:
394
+ metric_proto.direction = _DELTA_ARROW_TO_PROTO[parsed_delta_arrow]
395
+ metric_proto.label_visibility.value = get_label_visibility_proto_value(
396
+ label_visibility
397
+ )
398
+
399
+ if chart_data is not None:
400
+ prepared_data: list[float] = []
401
+ for val in convert_anything_to_list(chart_data):
402
+ try:
403
+ prepared_data.append(float(val))
404
+ except Exception as ex: # noqa: PERF203
405
+ raise StreamlitAPIException(
406
+ "Only numeric values are supported for chart data sequence. The "
407
+ f"value '{val}' is of type {type(val)} and "
408
+ "cannot be converted to float."
409
+ ) from ex
410
+ if len(prepared_data) > 0:
411
+ metric_proto.chart_data.extend(prepared_data)
412
+
413
+ metric_proto.chart_type = _parse_chart_type(chart_type)
414
+
415
+ if format is not None:
416
+ metric_proto.format = format
417
+
418
+ if delta_description is not None:
419
+ metric_proto.delta_description = delta_description
420
+
421
+ validate_height(height, allow_content=True)
422
+ validate_width(width, allow_content=True)
423
+ layout_config = LayoutConfig(width=width, height=height)
424
+
425
+ return self.dg._enqueue("metric", metric_proto, layout_config=layout_config)
426
+
427
+ @property
428
+ def dg(self) -> DeltaGenerator:
429
+ return cast("DeltaGenerator", self)
430
+
431
+
432
+ def _parse_chart_type(
433
+ chart_type: Literal["line", "bar", "area"],
434
+ ) -> MetricProto.ChartType.ValueType:
435
+ if chart_type == "bar":
436
+ return MetricProto.ChartType.BAR
437
+ if chart_type == "area":
438
+ return MetricProto.ChartType.AREA
439
+ # Use line as default chart:
440
+ return MetricProto.ChartType.LINE
441
+
442
+
443
+ def _parse_delta_arrow(delta_arrow: DeltaArrow) -> DeltaArrow:
444
+ if delta_arrow not in {"auto", "up", "down", "off"}:
445
+ raise StreamlitValueError("delta_arrow", ["auto", "up", "down", "off"])
446
+ return delta_arrow
447
+
448
+
449
+ def _parse_label(label: str) -> str:
450
+ if not isinstance(label, str):
451
+ raise TypeError(
452
+ f"'{label}' is of type {type(label)}, which is not an accepted type."
453
+ " label only accepts: str. Please convert the label to an accepted type."
454
+ )
455
+ return label
456
+
457
+
458
+ def _parse_value(value: Value) -> str:
459
+ if value is None:
460
+ return "—"
461
+ if isinstance(value, str):
462
+ return value
463
+ return from_number(value)
464
+
465
+
466
+ def _parse_delta(delta: Delta) -> str:
467
+ if delta is None or delta == "":
468
+ return ""
469
+ if isinstance(delta, str):
470
+ return dedent(delta)
471
+ return from_number(delta)
472
+
473
+
474
+ def _determine_delta_color_and_direction(
475
+ delta_color: DeltaColor,
476
+ delta: Delta,
477
+ ) -> MetricColorAndDirection:
478
+ if delta_color not in _VALID_DELTA_COLORS:
479
+ raise StreamlitAPIException(
480
+ f"'{delta_color}' is not an accepted value. delta_color only accepts: "
481
+ "'normal', 'inverse', 'off', or a color name ('red', 'orange', 'yellow', "
482
+ "'green', 'blue', 'violet', 'gray'/'grey', 'primary')"
483
+ )
484
+
485
+ if delta is None or delta == "":
486
+ return MetricColorAndDirection(
487
+ color=MetricProto.MetricColor.GRAY,
488
+ direction=MetricProto.MetricDirection.NONE,
489
+ )
490
+
491
+ # Determine direction based on delta sign
492
+ cd_direction = (
493
+ MetricProto.MetricDirection.DOWN
494
+ if _is_negative_delta(delta)
495
+ else MetricProto.MetricDirection.UP
496
+ )
497
+
498
+ # Handle explicit color names
499
+ if delta_color in _DELTA_COLOR_TO_PROTO:
500
+ return MetricColorAndDirection(
501
+ color=_DELTA_COLOR_TO_PROTO[delta_color],
502
+ direction=cd_direction,
503
+ )
504
+
505
+ # Handle "normal", "inverse", "off" modes
506
+ is_negative = cd_direction == MetricProto.MetricDirection.DOWN
507
+ if delta_color == "normal":
508
+ cd_color = (
509
+ MetricProto.MetricColor.RED
510
+ if is_negative
511
+ else MetricProto.MetricColor.GREEN
512
+ )
513
+ elif delta_color == "inverse":
514
+ cd_color = (
515
+ MetricProto.MetricColor.GREEN
516
+ if is_negative
517
+ else MetricProto.MetricColor.RED
518
+ )
519
+ else: # "off"
520
+ cd_color = MetricProto.MetricColor.GRAY
521
+
522
+ return MetricColorAndDirection(
523
+ color=cd_color,
524
+ direction=cd_direction,
525
+ )
526
+
527
+
528
+ def _is_negative_delta(delta: Delta) -> bool:
529
+ return dedent(str(delta)).startswith("-")