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,526 @@
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
+ """A wrapper for simple PyDeck scatter charts."""
16
+
17
+ from __future__ import annotations
18
+
19
+ import copy
20
+ import json
21
+ from typing import TYPE_CHECKING, Any, Final, cast
22
+
23
+ from streamlit import config, dataframe_util
24
+ from streamlit.deprecation_util import (
25
+ make_deprecated_name_warning,
26
+ show_deprecation_warning,
27
+ )
28
+ from streamlit.elements import deck_gl_json_chart
29
+ from streamlit.elements.lib.color_util import (
30
+ Color,
31
+ IntColorTuple,
32
+ is_color_like,
33
+ to_int_color_tuple,
34
+ )
35
+ from streamlit.elements.lib.layout_utils import (
36
+ HeightWithoutContent,
37
+ LayoutConfig,
38
+ WidthWithoutContent,
39
+ validate_height,
40
+ validate_width,
41
+ )
42
+ from streamlit.errors import StreamlitAPIException
43
+ from streamlit.proto.DeckGlJsonChart_pb2 import DeckGlJsonChart as DeckGlJsonChartProto
44
+ from streamlit.runtime.metrics_util import gather_metrics
45
+
46
+ if TYPE_CHECKING:
47
+ from collections.abc import Collection
48
+
49
+ from pandas import DataFrame
50
+
51
+ from streamlit.dataframe_util import Data
52
+ from streamlit.delta_generator import DeltaGenerator
53
+
54
+ # Map used as the basis for st.map.
55
+ _DEFAULT_MAP: Final[dict[str, Any]] = dict(deck_gl_json_chart.EMPTY_MAP)
56
+
57
+ # Other default parameters for st.map.
58
+ _DEFAULT_LAT_COL_NAMES: Final = {"lat", "latitude", "LAT", "LATITUDE"}
59
+ _DEFAULT_LON_COL_NAMES: Final = {"lon", "longitude", "LON", "LONGITUDE"}
60
+ _DEFAULT_COLOR: Final = (200, 30, 0, 160)
61
+ _DEFAULT_SIZE: Final = 100
62
+ _DEFAULT_ZOOM_LEVEL: Final = 12
63
+ _ZOOM_LEVELS: Final = [
64
+ 360,
65
+ 180,
66
+ 90,
67
+ 45,
68
+ 22.5,
69
+ 11.25,
70
+ 5.625,
71
+ 2.813,
72
+ 1.406,
73
+ 0.703,
74
+ 0.352,
75
+ 0.176,
76
+ 0.088,
77
+ 0.044,
78
+ 0.022,
79
+ 0.011,
80
+ 0.005,
81
+ 0.003,
82
+ 0.001,
83
+ 0.0005,
84
+ 0.00025,
85
+ ]
86
+
87
+
88
+ class MapMixin:
89
+ @gather_metrics("map")
90
+ def map(
91
+ self,
92
+ data: Data = None,
93
+ *,
94
+ latitude: str | None = None,
95
+ longitude: str | None = None,
96
+ color: str | Color | None = None,
97
+ size: str | float | None = None,
98
+ zoom: int | None = None,
99
+ width: WidthWithoutContent = "stretch",
100
+ height: HeightWithoutContent = 500,
101
+ use_container_width: bool | None = None,
102
+ ) -> DeltaGenerator:
103
+ """Display a map with a scatterplot overlaid onto it.
104
+
105
+ This is a wrapper around ``st.pydeck_chart`` to quickly create
106
+ scatterplot charts on top of a map, with auto-centering and auto-zoom.
107
+
108
+ When using this command, a service called Carto_ provides the map tiles to render
109
+ map content. If you're using advanced PyDeck features you may need to obtain
110
+ an API key from Carto first. You can do that as
111
+ ``pydeck.Deck(api_keys={"carto": YOUR_KEY})`` or by setting the CARTO_API_KEY
112
+ environment variable. See `PyDeck's documentation`_ for more information.
113
+
114
+ Another common provider for map tiles is Mapbox_. If you prefer to use that,
115
+ you'll need to create an account at https://mapbox.com and specify your Mapbox
116
+ key when creating the ``pydeck.Deck`` object. You can do that as
117
+ ``pydeck.Deck(api_keys={"mapbox": YOUR_KEY})`` or by setting the MAPBOX_API_KEY
118
+ environment variable.
119
+
120
+ .. _Carto: https://carto.com
121
+ .. _Mapbox: https://mapbox.com
122
+ .. _PyDeck's documentation: https://deckgl.readthedocs.io/en/latest/deck.html
123
+
124
+ Carto and Mapbox are third-party products and Streamlit accepts no responsibility
125
+ or liability of any kind for Carto or Mapbox, or for any content or information
126
+ made available by Carto or Mapbox. The use of Carto or Mapbox is governed by
127
+ their respective Terms of Use.
128
+
129
+ Parameters
130
+ ----------
131
+ data : Anything supported by st.dataframe
132
+ The data to be plotted.
133
+
134
+ latitude : str or None
135
+ The name of the column containing the latitude coordinates of
136
+ the datapoints in the chart.
137
+
138
+ If None, the latitude data will come from any column named 'lat',
139
+ 'latitude', 'LAT', or 'LATITUDE'.
140
+
141
+ longitude : str or None
142
+ The name of the column containing the longitude coordinates of
143
+ the datapoints in the chart.
144
+
145
+ If None, the longitude data will come from any column named 'lon',
146
+ 'longitude', 'LON', or 'LONGITUDE'.
147
+
148
+ color : str or tuple or None
149
+ The color of the circles representing each datapoint.
150
+
151
+ Can be:
152
+
153
+ - None, to use the default color.
154
+ - A hex string like "#ffaa00" or "#ffaa0088".
155
+ - An RGB or RGBA tuple with the red, green, blue, and alpha
156
+ components specified as ints from 0 to 255 or floats from 0.0 to
157
+ 1.0.
158
+ - The name of the column to use for the color. Cells in this column
159
+ should contain colors represented as a hex string or color tuple,
160
+ as described above.
161
+
162
+ size : str or float or None
163
+ The size of the circles representing each point, in meters.
164
+
165
+ This can be:
166
+
167
+ - None, to use the default size.
168
+ - A number like 100, to specify a single size to use for all
169
+ datapoints.
170
+ - The name of the column to use for the size. This allows each
171
+ datapoint to be represented by a circle of a different size.
172
+
173
+ zoom : int
174
+ Zoom level as specified in
175
+ https://wiki.openstreetmap.org/wiki/Zoom_levels.
176
+
177
+ width : "stretch" or int
178
+ The width of the chart element. This can be one of the following:
179
+
180
+ - ``"stretch"`` (default): The width of the element matches the
181
+ width of the parent container.
182
+ - An integer specifying the width in pixels: The element has a
183
+ fixed width. If the specified width is greater than the width of
184
+ the parent container, the width of the element matches the width
185
+ of the parent container.
186
+
187
+ height : "stretch" or int
188
+ The height of the chart element. This can be one of the following:
189
+
190
+ - An integer specifying the height in pixels: The element has a
191
+ fixed height. If the content is larger than the specified
192
+ height, scrolling is enabled. This is ``500`` by default.
193
+ - ``"stretch"``: The height of the element matches the height of
194
+ its content or the height of the parent container, whichever is
195
+ larger. If the element is not in a parent container, the height
196
+ of the element matches the height of its content.
197
+
198
+ use_container_width : bool or None
199
+ Whether to override the map's native width with the width of
200
+ the parent container. This can be one of the following:
201
+
202
+ - ``None`` (default): Streamlit will use the map's default behavior.
203
+ - ``True``: Streamlit sets the width of the map to match the
204
+ width of the parent container.
205
+ - ``False``: Streamlit sets the width of the map to fit its
206
+ contents according to the plotting library, up to the width of
207
+ the parent container.
208
+
209
+ .. deprecated::
210
+ ``use_container_width`` is deprecated and will be removed in a
211
+ future release. For ``use_container_width=True``, use
212
+ ``width="stretch"``.
213
+
214
+ Examples
215
+ --------
216
+ >>> import pandas as pd
217
+ >>> import streamlit as st
218
+ >>> from numpy.random import default_rng as rng
219
+ >>>
220
+ >>> df = pd.DataFrame(
221
+ >>> rng(0).standard_normal((1000, 2)) / [50, 50] + [37.76, -122.4],
222
+ >>> columns=["lat", "lon"],
223
+ >>> )
224
+ >>>
225
+ >>> st.map(df)
226
+
227
+ .. output::
228
+ https://doc-map.streamlit.app/
229
+ height: 600px
230
+
231
+ You can also customize the size and color of the datapoints:
232
+
233
+ >>> st.map(df, size=20, color="#0044ff")
234
+
235
+ And finally, you can choose different columns to use for the latitude
236
+ and longitude components, as well as set size and color of each
237
+ datapoint dynamically based on other columns:
238
+
239
+ >>> import pandas as pd
240
+ >>> import streamlit as st
241
+ >>> from numpy.random import default_rng as rng
242
+ >>>
243
+ >>> df = pd.DataFrame(
244
+ ... {
245
+ ... "col1": rng(0).standard_normal(1000) / 50 + 37.76,
246
+ ... "col2": rng(1).standard_normal(1000) / 50 + -122.4,
247
+ ... "col3": rng(2).standard_normal(1000) * 100,
248
+ ... "col4": rng(3).standard_normal((1000, 4)).tolist(),
249
+ ... }
250
+ ... )
251
+ >>>
252
+ >>> st.map(df, latitude="col1", longitude="col2", size="col3", color="col4")
253
+
254
+ .. output::
255
+ https://doc-map-color.streamlit.app/
256
+ height: 600px
257
+
258
+ """
259
+ # Handle use_container_width deprecation (for elements that already had width parameter)
260
+ if use_container_width is not None:
261
+ show_deprecation_warning(
262
+ make_deprecated_name_warning(
263
+ "use_container_width",
264
+ "width",
265
+ "2025-12-31",
266
+ "For `use_container_width=True`, use `width='stretch'`. "
267
+ "For `use_container_width=False`, specify an integer width.",
268
+ include_st_prefix=False,
269
+ ),
270
+ show_in_browser=False,
271
+ )
272
+ if use_container_width:
273
+ width = "stretch"
274
+ # For use_container_width=False, preserve any integer width that was set.
275
+
276
+ validate_width(width, allow_content=False)
277
+ validate_height(height, allow_content=False)
278
+
279
+ map_proto = DeckGlJsonChartProto()
280
+ deck_gl_json = to_deckgl_json(data, latitude, longitude, size, color, zoom)
281
+
282
+ marshall(map_proto, deck_gl_json)
283
+
284
+ layout_config = LayoutConfig(width=width, height=height)
285
+ return self.dg._enqueue(
286
+ "deck_gl_json_chart", map_proto, layout_config=layout_config
287
+ )
288
+
289
+ @property
290
+ def dg(self) -> DeltaGenerator:
291
+ """Get our DeltaGenerator."""
292
+ return cast("DeltaGenerator", self)
293
+
294
+
295
+ def to_deckgl_json(
296
+ data: Data,
297
+ lat: str | None,
298
+ lon: str | None,
299
+ size: str | float | None,
300
+ color: str | Collection[float] | None,
301
+ zoom: int | None,
302
+ ) -> str:
303
+ if data is None:
304
+ return json.dumps(_DEFAULT_MAP)
305
+
306
+ # TODO(harahu): iterables don't have the empty attribute. This is either
307
+ # a bug, or the documented data type is too broad. One or the other
308
+ # should be addressed
309
+ if hasattr(data, "empty") and data.empty:
310
+ return json.dumps(_DEFAULT_MAP)
311
+
312
+ df = dataframe_util.convert_anything_to_pandas_df(data)
313
+
314
+ lat_col_name = _get_lat_or_lon_col_name(df, "latitude", lat, _DEFAULT_LAT_COL_NAMES)
315
+ lon_col_name = _get_lat_or_lon_col_name(
316
+ df, "longitude", lon, _DEFAULT_LON_COL_NAMES
317
+ )
318
+ size_arg, size_col_name = _get_value_and_col_name(df, size, _DEFAULT_SIZE)
319
+ color_arg, color_col_name = _get_value_and_col_name(df, color, _DEFAULT_COLOR)
320
+
321
+ # Drop columns we're not using.
322
+ # (Sort for tests)
323
+ used_columns = sorted(
324
+ [
325
+ c
326
+ for c in {lat_col_name, lon_col_name, size_col_name, color_col_name}
327
+ if c is not None
328
+ ]
329
+ )
330
+ df = df[used_columns]
331
+
332
+ converted_color_arg = _convert_color_arg_or_column(df, color_arg, color_col_name)
333
+
334
+ zoom, center_lat, center_lon = _get_viewport_details(
335
+ df, lat_col_name, lon_col_name, zoom
336
+ )
337
+
338
+ default = copy.deepcopy(_DEFAULT_MAP)
339
+ default["initialViewState"]["latitude"] = center_lat
340
+ default["initialViewState"]["longitude"] = center_lon
341
+ default["initialViewState"]["zoom"] = zoom
342
+ default["layers"] = [
343
+ {
344
+ "@@type": "ScatterplotLayer",
345
+ "getPosition": f"@@=[{lon_col_name}, {lat_col_name}]",
346
+ "getRadius": size_arg,
347
+ "radiusMinPixels": 3,
348
+ "radiusUnits": "meters",
349
+ "getFillColor": converted_color_arg,
350
+ "data": df.to_dict("records"),
351
+ }
352
+ ]
353
+
354
+ return json.dumps(default)
355
+
356
+
357
+ def _get_lat_or_lon_col_name(
358
+ data: DataFrame,
359
+ human_readable_name: str,
360
+ col_name_from_user: str | None,
361
+ default_col_names: set[str],
362
+ ) -> str:
363
+ """Returns the column name to be used for latitude or longitude."""
364
+
365
+ if isinstance(col_name_from_user, str) and col_name_from_user in data.columns:
366
+ col_name = col_name_from_user
367
+
368
+ else:
369
+ # Try one of the default col_names:
370
+ candidate_col_name = None
371
+
372
+ for c in default_col_names:
373
+ if c in data.columns:
374
+ candidate_col_name = c
375
+ break
376
+
377
+ if candidate_col_name is None:
378
+ formatted_allowed_col_name = ", ".join(map(repr, sorted(default_col_names)))
379
+ formmated_col_names = ", ".join(map(repr, list(data.columns)))
380
+
381
+ raise StreamlitAPIException(
382
+ f"Map data must contain a {human_readable_name} column named: "
383
+ f"{formatted_allowed_col_name}. Existing columns: {formmated_col_names}"
384
+ )
385
+ col_name = candidate_col_name
386
+
387
+ # Check that the column is well-formed.
388
+ # IMPLEMENTATION NOTE: We can't use isnull().values.any() because .values can return
389
+ # ExtensionArrays, which don't have a .any() method.
390
+ # (Read about ExtensionArrays here: # https://pandas.pydata.org/community/blog/extension-arrays.html)
391
+ # However, after a performance test I found the solution below runs basically as
392
+ # fast as .values.any().
393
+ if any(data[col_name].isna().array):
394
+ raise StreamlitAPIException(
395
+ f"Column {col_name} is not allowed to contain null values, such "
396
+ "as NaN, NaT, or None."
397
+ )
398
+
399
+ return col_name
400
+
401
+
402
+ def _get_value_and_col_name(
403
+ data: DataFrame,
404
+ value_or_name: Any,
405
+ default_value: Any,
406
+ ) -> tuple[str, str | None]:
407
+ """Take a value_or_name passed in by the Streamlit developer and return a PyDeck
408
+ argument and column name for that property.
409
+
410
+ This is used for the size and color properties of the chart.
411
+
412
+ Example:
413
+ - If the user passes size=None, this returns the default size value and no column.
414
+ - If the user passes size=42, this returns 42 and no column.
415
+ - If the user passes size="my_col_123", this returns "@@=my_col_123" and "my_col_123".
416
+ """
417
+
418
+ pydeck_arg: str
419
+
420
+ if isinstance(value_or_name, str) and value_or_name in data.columns:
421
+ col_name = value_or_name
422
+ pydeck_arg = f"@@={col_name}"
423
+ else:
424
+ col_name = None
425
+
426
+ pydeck_arg = default_value if value_or_name is None else value_or_name
427
+
428
+ return pydeck_arg, col_name
429
+
430
+
431
+ def _convert_color_arg_or_column(
432
+ data: DataFrame,
433
+ color_arg: str,
434
+ color_col_name: str | None,
435
+ ) -> str | IntColorTuple | None:
436
+ """Converts color to a format accepted by PyDeck.
437
+
438
+ For example:
439
+ - If color_arg is "#fff", then returns (255, 255, 255, 255).
440
+ - If color_col_name is "my_col_123", then it converts everything in column my_col_123 to
441
+ an accepted color format such as (0, 100, 200, 255).
442
+
443
+ NOTE: This function mutates the data argument.
444
+ """
445
+
446
+ color_arg_out: str | IntColorTuple | None = None
447
+
448
+ if color_col_name is not None:
449
+ # Convert color column to the right format.
450
+ if len(data[color_col_name]) > 0 and is_color_like(data[color_col_name].iat[0]): # type: ignore[arg-type]
451
+ # Use .loc[] to avoid a SettingWithCopyWarning in some cases.
452
+ data.loc[:, color_col_name] = data.loc[:, color_col_name].map(
453
+ to_int_color_tuple
454
+ )
455
+ else:
456
+ raise StreamlitAPIException(
457
+ f'Column "{color_col_name}" does not appear to contain valid colors.'
458
+ )
459
+
460
+ color_arg_out = color_arg
461
+
462
+ elif color_arg is not None:
463
+ color_arg_out = to_int_color_tuple(color_arg)
464
+
465
+ return color_arg_out
466
+
467
+
468
+ def _get_viewport_details(
469
+ data: DataFrame, lat_col_name: str, lon_col_name: str, zoom: int | None
470
+ ) -> tuple[int, float, float]:
471
+ """Auto-set viewport when not fully specified by user."""
472
+ min_lat = data[lat_col_name].min()
473
+ max_lat = data[lat_col_name].max()
474
+ min_lon = data[lon_col_name].min()
475
+ max_lon = data[lon_col_name].max()
476
+ center_lat = (max_lat + min_lat) / 2.0
477
+ center_lon = (max_lon + min_lon) / 2.0
478
+ range_lon = abs(max_lon - min_lon)
479
+ range_lat = abs(max_lat - min_lat)
480
+
481
+ if zoom is None:
482
+ longitude_distance = max(range_lat, range_lon)
483
+ zoom = _get_zoom_level(longitude_distance)
484
+
485
+ return zoom, center_lat, center_lon
486
+
487
+
488
+ def _get_zoom_level(distance: float) -> int:
489
+ """Get the zoom level for a given distance in degrees.
490
+
491
+ See https://wiki.openstreetmap.org/wiki/Zoom_levels for reference.
492
+
493
+ Parameters
494
+ ----------
495
+ distance : float
496
+ How many degrees of longitude should fit in the map.
497
+
498
+ Returns
499
+ -------
500
+ int
501
+ The zoom level, from 0 to 20.
502
+
503
+ """
504
+ for i in range(len(_ZOOM_LEVELS) - 1):
505
+ if _ZOOM_LEVELS[i + 1] < distance <= _ZOOM_LEVELS[i]:
506
+ return i
507
+
508
+ # For small number of points the default zoom level will be used.
509
+ return _DEFAULT_ZOOM_LEVEL
510
+
511
+
512
+ def marshall(
513
+ pydeck_proto: DeckGlJsonChartProto,
514
+ pydeck_json: str,
515
+ ) -> None:
516
+ """Marshall a map proto with the given pydeck JSON specification.
517
+
518
+ Layout configuration (width, height, etc.) is handled by the LayoutConfig
519
+ system and not through proto fields.
520
+ """
521
+ pydeck_proto.json = pydeck_json
522
+ pydeck_proto.id = ""
523
+
524
+ mapbox_token = config.get_option("mapbox.token")
525
+ if mapbox_token:
526
+ pydeck_proto.mapbox_token = mapbox_token