ultraplot 2.5.0__tar.gz → 2.7.0__tar.gz

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 (518) hide show
  1. ultraplot-2.7.0/.github/workflows/black.yml +50 -0
  2. {ultraplot-2.5.0 → ultraplot-2.7.0}/.github/workflows/build-ultraplot.yml +42 -6
  3. {ultraplot-2.5.0 → ultraplot-2.7.0}/.github/workflows/main.yml +76 -11
  4. {ultraplot-2.5.0 → ultraplot-2.7.0}/.github/workflows/publish-pypi.yml +10 -2
  5. {ultraplot-2.5.0 → ultraplot-2.7.0}/.github/workflows/test-map.yml +1 -1
  6. {ultraplot-2.5.0 → ultraplot-2.7.0}/.gitignore +6 -0
  7. {ultraplot-2.5.0 → ultraplot-2.7.0}/.pre-commit-config.yaml +9 -1
  8. {ultraplot-2.5.0 → ultraplot-2.7.0}/INSTALL.rst +10 -4
  9. {ultraplot-2.5.0/ultraplot.egg-info → ultraplot-2.7.0}/PKG-INFO +136 -14
  10. {ultraplot-2.5.0 → ultraplot-2.7.0}/README.rst +117 -4
  11. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/1dplots.py +4 -1
  12. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/Makefile +6 -4
  13. ultraplot-2.7.0/docs/_static/alias-explorer-v3.css +408 -0
  14. ultraplot-2.7.0/docs/_static/alias-explorer-v3.js +476 -0
  15. ultraplot-2.7.0/docs/_static/alias-map.svg +3505 -0
  16. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_static/custom.css +222 -0
  17. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_static/custom.js +151 -0
  18. ultraplot-2.7.0/docs/_static/example_plots/data_aware_example.svg +1159 -0
  19. ultraplot-2.7.0/docs/aliases.rst +1065 -0
  20. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/api.rst +10 -3
  21. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/colorbars_legends.py +4 -0
  22. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/conf.py +24 -4
  23. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/configuration.rst +4 -0
  24. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/contributing.rst +23 -0
  25. ultraplot-2.7.0/docs/data_aware.py +63 -0
  26. ultraplot-2.7.0/docs/first_figure.py +346 -0
  27. ultraplot-2.7.0/docs/index.rst +191 -0
  28. ultraplot-2.7.0/docs/keyword_aliases.rst +49 -0
  29. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/projections.py +7 -8
  30. ultraplot-2.7.0/docs/recipes.py +88 -0
  31. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/sphinxext/custom_roles.py +13 -1
  32. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/stats.py +14 -5
  33. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/subplots.py +1 -1
  34. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/usage.rst +24 -6
  35. ultraplot-2.7.0/docs/why.rst +822 -0
  36. ultraplot-2.7.0/docs/why_ultraplot.py +136 -0
  37. {ultraplot-2.5.0 → ultraplot-2.7.0}/environment.yml +3 -0
  38. {ultraplot-2.5.0 → ultraplot-2.7.0}/noxfile.py +23 -12
  39. ultraplot-2.7.0/pyproject.toml +121 -0
  40. {ultraplot-2.5.0 → ultraplot-2.7.0}/requirements-minimal.txt +1 -1
  41. ultraplot-2.7.0/setup.py +21 -0
  42. ultraplot-2.7.0/tools/ci/check_installed_docstrings.py +47 -0
  43. ultraplot-2.7.0/tools/ci/static_consumer.py +13 -0
  44. {ultraplot-2.5.0 → ultraplot-2.7.0}/tools/ci/version_support.py +40 -0
  45. ultraplot-2.7.0/tools/expand_docstrings.py +126 -0
  46. ultraplot-2.7.0/tools/generate_alias_figure.py +99 -0
  47. ultraplot-2.7.0/tools/generate_alias_reference.py +96 -0
  48. ultraplot-2.7.0/tools/serve_alias_docs.py +85 -0
  49. ultraplot-2.7.0/ultraplot/.opencode/goals/state.json.lock +1 -0
  50. ultraplot-2.7.0/ultraplot/.opencode/goals/state.json.sessions/.migration-v1-complete +4 -0
  51. ultraplot-2.7.0/ultraplot/.opencode/goals/state.json.sessions/cc3e983cb1eb34ad9f66e65e9ff9910c47ddb4f26523966e07d6a8bf3bc830eb/state.json +7 -0
  52. ultraplot-2.7.0/ultraplot/.opencode/goals/state.json.sessions/cc3e983cb1eb34ad9f66e65e9ff9910c47ddb4f26523966e07d6a8bf3bc830eb/state.json.lock +1 -0
  53. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/__init__.py +33 -6
  54. ultraplot-2.7.0/ultraplot/_animation.py +1342 -0
  55. ultraplot-2.7.0/ultraplot/_interaction.py +720 -0
  56. ultraplot-2.7.0/ultraplot/_layout.py +609 -0
  57. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/_lazy.py +2 -1
  58. ultraplot-2.7.0/ultraplot/_sharing.py +554 -0
  59. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/_subplots.py +24 -15
  60. ultraplot-2.7.0/ultraplot/_version.py +1 -0
  61. ultraplot-2.7.0/ultraplot/animation.py +782 -0
  62. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/axes/_formatting.py +43 -0
  63. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/axes/base.py +189 -176
  64. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/axes/cartesian.py +102 -63
  65. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/axes/container.py +62 -1
  66. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/axes/geo.py +113 -69
  67. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/axes/plot.py +299 -292
  68. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/axes/plot_types/circlize.py +30 -0
  69. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/axes/plot_types/ribbon.py +8 -1
  70. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/axes/polar.py +3 -26
  71. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/axes/shared.py +69 -0
  72. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/axes/taylor.py +6 -8
  73. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/axes/three.py +30 -0
  74. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/colorbar.py +76 -35
  75. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/colors.py +0 -45
  76. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/config.py +8 -16
  77. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/constructor.py +24 -26
  78. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/demos.py +0 -1
  79. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/figure.py +568 -103
  80. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/gridspec.py +70 -64
  81. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/internals/__init__.py +5 -0
  82. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/internals/docstring.py +63 -58
  83. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/internals/guides.py +5 -4
  84. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/internals/inputs.py +120 -11
  85. ultraplot-2.7.0/ultraplot/internals/kwargs.py +684 -0
  86. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/internals/rcsetup.py +25 -1
  87. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/internals/warnings.py +6 -3
  88. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/legend.py +52 -9
  89. ultraplot-2.7.0/ultraplot/mcp.py +695 -0
  90. ultraplot-2.7.0/ultraplot/py.typed +1 -0
  91. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/scale.py +4 -15
  92. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/conftest.py +6 -0
  93. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_1dplots.py +212 -0
  94. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_2dplots.py +89 -0
  95. ultraplot-2.7.0/ultraplot/tests/test_alias_signatures.py +164 -0
  96. ultraplot-2.7.0/ultraplot/tests/test_animation.py +1893 -0
  97. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_axes.py +3 -3
  98. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_circlize_integration.py +53 -2
  99. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_colorbar.py +78 -0
  100. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_constructor_helpers_extra.py +35 -3
  101. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_core_versions.py +87 -0
  102. ultraplot-2.7.0/ultraplot/tests/test_docstring_helpers.py +153 -0
  103. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_figure.py +151 -9
  104. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_format.py +499 -0
  105. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_geographic.py +93 -15
  106. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_gridspec.py +5 -2
  107. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_imports.py +34 -2
  108. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_imshow.py +6 -5
  109. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_integration.py +31 -0
  110. ultraplot-2.7.0/ultraplot/tests/test_kwargs_helpers.py +158 -0
  111. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_legend.py +72 -0
  112. ultraplot-2.7.0/ultraplot/tests/test_mcp.py +306 -0
  113. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_statistical_plotting.py +41 -7
  114. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_subplot_manager.py +24 -10
  115. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_subplots.py +16 -8
  116. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_textalign.py +3 -2
  117. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/ticker.py +6 -1
  118. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/ui.py +13 -3
  119. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/ultralayout.py +22 -17
  120. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/utils.py +0 -11
  121. {ultraplot-2.5.0 → ultraplot-2.7.0/ultraplot.egg-info}/PKG-INFO +136 -14
  122. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot.egg-info/SOURCES.txt +32 -1
  123. ultraplot-2.7.0/ultraplot.egg-info/entry_points.txt +2 -0
  124. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot.egg-info/requires.txt +20 -5
  125. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot.egg-info/scm_file_list.json +455 -424
  126. ultraplot-2.5.0/docs/index.rst +0 -164
  127. ultraplot-2.5.0/docs/why.rst +0 -924
  128. ultraplot-2.5.0/pyproject.toml +0 -90
  129. ultraplot-2.5.0/ultraplot/_version.py +0 -1
  130. ultraplot-2.5.0/ultraplot/internals/kwargs.py +0 -345
  131. ultraplot-2.5.0/ultraplot/tests/test_animation.py +0 -109
  132. ultraplot-2.5.0/ultraplot/tests/test_docstring_helpers.py +0 -63
  133. ultraplot-2.5.0/ultraplot/tests/test_kwargs_helpers.py +0 -80
  134. ultraplot-2.5.0/ultraplot.egg-info/scm_version.json +0 -8
  135. {ultraplot-2.5.0 → ultraplot-2.7.0}/.github/ISSUE_TEMPLATE.md +0 -0
  136. {ultraplot-2.5.0 → ultraplot-2.7.0}/.github/dependabot.yml +0 -0
  137. {ultraplot-2.5.0 → ultraplot-2.7.0}/.github/micromamba-condarc.yml +0 -0
  138. {ultraplot-2.5.0 → ultraplot-2.7.0}/.readthedocs.yml +0 -0
  139. {ultraplot-2.5.0 → ultraplot-2.7.0}/.zenodo.json +0 -0
  140. {ultraplot-2.5.0 → ultraplot-2.7.0}/CITATION.cff +0 -0
  141. {ultraplot-2.5.0 → ultraplot-2.7.0}/CODEOFCONDUCT.md +0 -0
  142. {ultraplot-2.5.0 → ultraplot-2.7.0}/CONTRIBUTING.rst +0 -0
  143. {ultraplot-2.5.0 → ultraplot-2.7.0}/LICENSE.txt +0 -0
  144. {ultraplot-2.5.0 → ultraplot-2.7.0}/UltraPlotLogo.svg +0 -0
  145. {ultraplot-2.5.0 → ultraplot-2.7.0}/codecov.yml +0 -0
  146. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/2dplots.py +0 -0
  147. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_ext/notoc.py +0 -0
  148. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_scripts/fetch_releases.py +0 -0
  149. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_static/example_plots/cartesian_example.svg +0 -0
  150. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_static/example_plots/colorbars_legends_example.svg +0 -0
  151. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_static/example_plots/colormaps_example.svg +0 -0
  152. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_static/example_plots/panels_example.svg +0 -0
  153. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_static/example_plots/projection_example.svg +0 -0
  154. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_static/example_plots/subplot_example.svg +0 -0
  155. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_static/logo_blank.svg +0 -0
  156. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_static/logo_long.png +0 -0
  157. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_static/logo_long.svg +0 -0
  158. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_static/logo_social.png +0 -0
  159. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_static/logo_social.svg +0 -0
  160. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_static/logo_square.png +0 -0
  161. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/_templates/whatsnew_sidebar.html +0 -0
  162. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/about.rst +0 -0
  163. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/basics.py +0 -0
  164. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/cartesian.py +0 -0
  165. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/colormaps.py +0 -0
  166. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/colors.py +0 -0
  167. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/cycles.py +0 -0
  168. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/README.txt +0 -0
  169. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/colors/01_cycle_colormap.py +0 -0
  170. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/colors/02_diverging_colormap.py +0 -0
  171. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/colors/README.txt +0 -0
  172. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/geo/01_robin_tracks.py +0 -0
  173. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/geo/02_orthographic_views.py +0 -0
  174. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/geo/03_projections_features.py +0 -0
  175. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/geo/04_choropleth.py +0 -0
  176. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/geo/README.txt +0 -0
  177. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/layouts/01_shared_axes_abc.py +0 -0
  178. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/layouts/02_complex_layout_insets.py +0 -0
  179. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/layouts/03_spanning_labels.py +0 -0
  180. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/layouts/README.txt +0 -0
  181. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/legend_types/01_semantic_legends.py +0 -0
  182. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/legends_colorbars/01_multi_colorbars.py +0 -0
  183. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/legends_colorbars/02_legend_inset_colorbar.py +0 -0
  184. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/legends_colorbars/03_semantic_legends.py +0 -0
  185. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/legends_colorbars/README.txt +0 -0
  186. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/plot_types/01_curved_quiver.py +0 -0
  187. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/plot_types/02_network_graph.py +0 -0
  188. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/plot_types/03_lollipop.py +0 -0
  189. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/plot_types/04_datetime_series.py +0 -0
  190. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/plot_types/05_box_violin.py +0 -0
  191. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/plot_types/06_ridge_plot.py +0 -0
  192. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/plot_types/07_radar.py +0 -0
  193. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/plot_types/07_sankey.py +0 -0
  194. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/plot_types/08_chord_diagram.py +0 -0
  195. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/plot_types/08_ternary.py +0 -0
  196. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/plot_types/09_phylogeny.py +0 -0
  197. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/plot_types/10_circos_bed.py +0 -0
  198. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/plot_types/11_topic_ribbon.py +0 -0
  199. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/plot_types/12_taylor_diagram.py +0 -0
  200. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/examples/plot_types/README.txt +0 -0
  201. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/external-links.rst +0 -0
  202. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/faq.rst +0 -0
  203. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/fonts.py +0 -0
  204. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/insets_panels.py +0 -0
  205. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/install.rst +0 -0
  206. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/lazy_loading.rst +0 -0
  207. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/make.bat +0 -0
  208. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/networks.py +0 -0
  209. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/requirements-rtd.txt +0 -0
  210. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/sphinxext/jupytext_cache.py +0 -0
  211. {ultraplot-2.5.0 → ultraplot-2.7.0}/docs/ultraplotrc +0 -0
  212. {ultraplot-2.5.0 → ultraplot-2.7.0}/logo/PermanentMarker-Regular.ttf +0 -0
  213. {ultraplot-2.5.0 → ultraplot-2.7.0}/logo/environment-logo.yml +0 -0
  214. {ultraplot-2.5.0 → ultraplot-2.7.0}/logo/logo.py +0 -0
  215. {ultraplot-2.5.0 → ultraplot-2.7.0}/logo/run-linter.sh +0 -0
  216. {ultraplot-2.5.0 → ultraplot-2.7.0}/logo/webicon.py +0 -0
  217. {ultraplot-2.5.0 → ultraplot-2.7.0}/logo/whyUltraPlot.svg +0 -0
  218. {ultraplot-2.5.0 → ultraplot-2.7.0}/setup.cfg +0 -0
  219. {ultraplot-2.5.0 → ultraplot-2.7.0}/tools/ci/build_test_map.py +0 -0
  220. {ultraplot-2.5.0 → ultraplot-2.7.0}/tools/ci/select_tests.py +0 -0
  221. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/axes/__init__.py +0 -0
  222. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/axes/plot_types/__init__.py +0 -0
  223. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/axes/plot_types/curved_quiver.py +0 -0
  224. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/axes/plot_types/sankey.py +0 -0
  225. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Algae.rgb +0 -0
  226. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Amp.rgb +0 -0
  227. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/BR.rgb +0 -0
  228. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Balance.rgb +0 -0
  229. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues1_r.xml +0 -0
  230. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues2.xml +0 -0
  231. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues3.xml +0 -0
  232. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues4_r.xml +0 -0
  233. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues5.xml +0 -0
  234. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues6.xml +0 -0
  235. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues7.xml +0 -0
  236. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues8.xml +0 -0
  237. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues9.xml +0 -0
  238. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Boreal.json +0 -0
  239. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns1.xml +0 -0
  240. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns2.xml +0 -0
  241. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns3.xml +0 -0
  242. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns4.xml +0 -0
  243. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns5.xml +0 -0
  244. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns6.xml +0 -0
  245. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns7.xml +0 -0
  246. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns8.xml +0 -0
  247. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns9.xml +0 -0
  248. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/ColdHot.rgb +0 -0
  249. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Crest.rgb +0 -0
  250. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Curl.rgb +0 -0
  251. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Deep.rgb +0 -0
  252. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Delta.rgb +0 -0
  253. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Dense.rgb +0 -0
  254. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Div.json +0 -0
  255. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/DryWet.json +0 -0
  256. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Dusk.json +0 -0
  257. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Fire.json +0 -0
  258. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Flare.rgb +0 -0
  259. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Glacial.json +0 -0
  260. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Greens1_r.xml +0 -0
  261. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Greens2.xml +0 -0
  262. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Greens3_r.xml +0 -0
  263. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Greens4.xml +0 -0
  264. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Greens5.xml +0 -0
  265. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Greens6_r.xml +0 -0
  266. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Greens7.xml +0 -0
  267. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Greens8.xml +0 -0
  268. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Haline.rgb +0 -0
  269. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Ice.rgb +0 -0
  270. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/IceFire.rgb +0 -0
  271. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Mako.rgb +0 -0
  272. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Marine.json +0 -0
  273. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Matter.rgb +0 -0
  274. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Mono.txt +0 -0
  275. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/MonoCycle.txt +0 -0
  276. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/NegPos.json +0 -0
  277. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Oranges1.xml +0 -0
  278. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Oranges2.xml +0 -0
  279. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Oranges3.xml +0 -0
  280. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Oranges4.xml +0 -0
  281. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Oxy.rgb +0 -0
  282. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Phase.rgb +0 -0
  283. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Purples1_r.xml +0 -0
  284. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Purples2.xml +0 -0
  285. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Purples3.xml +0 -0
  286. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Reds1.xml +0 -0
  287. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Reds2.xml +0 -0
  288. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Reds3.xml +0 -0
  289. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Reds4.xml +0 -0
  290. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Reds5.xml +0 -0
  291. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Rocket.rgb +0 -0
  292. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Solar.rgb +0 -0
  293. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Speed.rgb +0 -0
  294. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Stellar.json +0 -0
  295. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Sunrise.json +0 -0
  296. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Sunset.json +0 -0
  297. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Tempo.rgb +0 -0
  298. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Thermal.rgb +0 -0
  299. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Turbid.rgb +0 -0
  300. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Vivid.xml +0 -0
  301. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Vlag.rgb +0 -0
  302. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Yellows1.xml +0 -0
  303. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Yellows2.xml +0 -0
  304. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Yellows3.xml +0 -0
  305. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/Yellows4.xml +0 -0
  306. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/acton.txt +0 -0
  307. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/bam.txt +0 -0
  308. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/bamO.txt +0 -0
  309. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/bamako.txt +0 -0
  310. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/batlow.txt +0 -0
  311. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/batlowK.txt +0 -0
  312. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/batlowW.txt +0 -0
  313. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/berlin.txt +0 -0
  314. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/bilbao.txt +0 -0
  315. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/broc.txt +0 -0
  316. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/brocO.txt +0 -0
  317. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/buda.txt +0 -0
  318. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/bukavu.txt +0 -0
  319. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/cork.txt +0 -0
  320. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/corkO.txt +0 -0
  321. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/davos.txt +0 -0
  322. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/devon.txt +0 -0
  323. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/fes.txt +0 -0
  324. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/hawaii.txt +0 -0
  325. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/imola.txt +0 -0
  326. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/lajolla.txt +0 -0
  327. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/lapaz.txt +0 -0
  328. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/lisbon.txt +0 -0
  329. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/nuuk.txt +0 -0
  330. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/oleron.txt +0 -0
  331. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/oslo.txt +0 -0
  332. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/roma.txt +0 -0
  333. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/romaO.txt +0 -0
  334. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/tofino.txt +0 -0
  335. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/tokyo.txt +0 -0
  336. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/turku.txt +0 -0
  337. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/vanimo.txt +0 -0
  338. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/vik.txt +0 -0
  339. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cmaps/vikO.txt +0 -0
  340. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/colors/opencolor.txt +0 -0
  341. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/colors/xkcd.txt +0 -0
  342. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cycles/538.hex +0 -0
  343. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cycles/FlatUI.hex +0 -0
  344. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cycles/Qual1.rgb +0 -0
  345. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cycles/Qual2.rgb +0 -0
  346. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cycles/bmh.hex +0 -0
  347. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cycles/classic.hex +0 -0
  348. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cycles/colorblind.hex +0 -0
  349. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cycles/colorblind10.hex +0 -0
  350. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cycles/default.hex +0 -0
  351. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cycles/ggplot.hex +0 -0
  352. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cycles/seaborn.hex +0 -0
  353. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/cycles/tableau.hex +0 -0
  354. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/externals/__init__.py +0 -0
  355. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/externals/hsluv.py +0 -0
  356. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraMath-Bold.ttf +0 -0
  357. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraMath-ExtraLight.ttf +0 -0
  358. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraMath-Heavy.ttf +0 -0
  359. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraMath-Light.ttf +0 -0
  360. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraMath-Medium.ttf +0 -0
  361. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraMath-Regular.ttf +0 -0
  362. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraMath-SemiBold.ttf +0 -0
  363. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraMath-UltraLight.ttf +0 -0
  364. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-Black.ttf +0 -0
  365. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-BlackItalic.ttf +0 -0
  366. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-Bold.ttf +0 -0
  367. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-BoldItalic.ttf +0 -0
  368. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-ExtraBold.ttf +0 -0
  369. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-ExtraBoldItalic.ttf +0 -0
  370. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-ExtraLight.ttf +0 -0
  371. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-ExtraLightItalic.ttf +0 -0
  372. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-Italic.ttf +0 -0
  373. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-Light.ttf +0 -0
  374. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-LightItalic.ttf +0 -0
  375. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-Medium.ttf +0 -0
  376. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-MediumItalic.ttf +0 -0
  377. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-Regular.ttf +0 -0
  378. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-SemiBold.ttf +0 -0
  379. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-SemiBoldItalic.ttf +0 -0
  380. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_FIRAMATH.txt +0 -0
  381. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_FIRASANS.txt +0 -0
  382. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_NOTOSANS.txt +0 -0
  383. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_NOTOSERIF.txt +0 -0
  384. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_OPENSANS.txt +0 -0
  385. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_ROBOTO.txt +0 -0
  386. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_SOURCESANS.txt +0 -0
  387. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_SOURCESERIF.txt +0 -0
  388. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_TEXGYRE.txt +0 -0
  389. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_UBUNTU.txt +0 -0
  390. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/NotoSans-Bold.ttf +0 -0
  391. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/NotoSans-BoldItalic.ttf +0 -0
  392. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/NotoSans-Italic.ttf +0 -0
  393. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/NotoSans-Regular.ttf +0 -0
  394. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/NotoSerif-Bold.ttf +0 -0
  395. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/NotoSerif-BoldItalic.ttf +0 -0
  396. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/NotoSerif-Italic.ttf +0 -0
  397. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/NotoSerif-Regular.ttf +0 -0
  398. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/OpenSans-Bold.ttf +0 -0
  399. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/OpenSans-BoldItalic.ttf +0 -0
  400. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/OpenSans-Italic.ttf +0 -0
  401. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/OpenSans-Regular.ttf +0 -0
  402. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/OpenSans-Semibold.ttf +0 -0
  403. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/OpenSans-SemiboldItalic.ttf +0 -0
  404. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-Black.ttf +0 -0
  405. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-BlackItalic.ttf +0 -0
  406. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-Bold.ttf +0 -0
  407. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-BoldItalic.ttf +0 -0
  408. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-Italic.ttf +0 -0
  409. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-Light.ttf +0 -0
  410. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-LightItalic.ttf +0 -0
  411. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-Medium.ttf +0 -0
  412. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-MediumItalic.ttf +0 -0
  413. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-Regular.ttf +0 -0
  414. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-Black.ttf +0 -0
  415. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-BlackItalic.ttf +0 -0
  416. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-Bold.ttf +0 -0
  417. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-BoldItalic.ttf +0 -0
  418. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-ExtraLight.ttf +0 -0
  419. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-ExtraLightItalic.ttf +0 -0
  420. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-Italic.ttf +0 -0
  421. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-Light.ttf +0 -0
  422. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-LightItalic.ttf +0 -0
  423. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-Regular.ttf +0 -0
  424. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-SemiBold.ttf +0 -0
  425. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-SemiBoldItalic.ttf +0 -0
  426. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-Black.ttf +0 -0
  427. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-BlackItalic.ttf +0 -0
  428. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-Bold.ttf +0 -0
  429. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-BoldItalic.ttf +0 -0
  430. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-ExtraLight.ttf +0 -0
  431. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-ExtraLightItalic.ttf +0 -0
  432. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-Italic.ttf +0 -0
  433. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-Light.ttf +0 -0
  434. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-LightItalic.ttf +0 -0
  435. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-Regular.ttf +0 -0
  436. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-SemiBold.ttf +0 -0
  437. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-SemiBoldItalic.ttf +0 -0
  438. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Ubuntu-Bold.ttf +0 -0
  439. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Ubuntu-BoldItalic.ttf +0 -0
  440. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Ubuntu-Italic.ttf +0 -0
  441. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Ubuntu-Light.ttf +0 -0
  442. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Ubuntu-LightItalic.ttf +0 -0
  443. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Ubuntu-Medium.ttf +0 -0
  444. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Ubuntu-MediumItalic.ttf +0 -0
  445. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/Ubuntu-Regular.ttf +0 -0
  446. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreadventor-bold.ttf +0 -0
  447. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreadventor-bolditalic.ttf +0 -0
  448. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreadventor-italic.ttf +0 -0
  449. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreadventor-regular.ttf +0 -0
  450. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrebonum-bold.ttf +0 -0
  451. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrebonum-bolditalic.ttf +0 -0
  452. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrebonum-italic.ttf +0 -0
  453. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrebonum-regular.ttf +0 -0
  454. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrechorus-mediumitalic.ttf +0 -0
  455. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrecursor-bold.ttf +0 -0
  456. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrecursor-bolditalic.ttf +0 -0
  457. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrecursor-italic.ttf +0 -0
  458. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrecursor-regular.ttf +0 -0
  459. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreheros-bold.ttf +0 -0
  460. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreheros-bolditalic.ttf +0 -0
  461. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreheros-italic.ttf +0 -0
  462. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreheros-regular.ttf +0 -0
  463. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrepagella-bold.ttf +0 -0
  464. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrepagella-bolditalic.ttf +0 -0
  465. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrepagella-italic.ttf +0 -0
  466. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrepagella-regular.ttf +0 -0
  467. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreschola-bold.ttf +0 -0
  468. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreschola-bolditalic.ttf +0 -0
  469. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreschola-italic.ttf +0 -0
  470. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreschola-regular.ttf +0 -0
  471. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyretermes-bold.ttf +0 -0
  472. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyretermes-bolditalic.ttf +0 -0
  473. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyretermes-italic.ttf +0 -0
  474. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyretermes-regular.ttf +0 -0
  475. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/internals/benchmarks.py +0 -0
  476. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/internals/context.py +0 -0
  477. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/internals/fonts.py +0 -0
  478. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/internals/labels.py +0 -0
  479. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/internals/versions.py +0 -0
  480. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/proj.py +0 -0
  481. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/__init__.py +0 -0
  482. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_axes_alt_styles.py +0 -0
  483. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_axes_base_colorbar_helpers.py +0 -0
  484. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_base.py +0 -0
  485. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_colorbar_helpers_extra.py +0 -0
  486. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_colormap.py +0 -0
  487. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_colormap_helpers_extra.py +0 -0
  488. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_colors.py +0 -0
  489. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_colors_helpers.py +0 -0
  490. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_config.py +0 -0
  491. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_config_helpers_extra.py +0 -0
  492. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_constructor.py +0 -0
  493. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_demos.py +0 -0
  494. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_docs.py +0 -0
  495. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_docs_fetch_releases.py +0 -0
  496. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_docs_search.py +0 -0
  497. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_external_axes_container_integration.py +0 -0
  498. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_external_container_edge_cases.py +0 -0
  499. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_external_container_mocked.py +0 -0
  500. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_fonts.py +0 -0
  501. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_handlers.py +0 -0
  502. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_inputs.py +0 -0
  503. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_inputs_helpers.py +0 -0
  504. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_inset.py +0 -0
  505. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_plot.py +0 -0
  506. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_proj_helpers.py +0 -0
  507. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_projections.py +0 -0
  508. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_rcsetup_helpers.py +0 -0
  509. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_release_metadata.py +0 -0
  510. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_scale_helpers.py +0 -0
  511. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_semantic_legend.py +0 -0
  512. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_text_helpers.py +0 -0
  513. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_tickers.py +0 -0
  514. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/tests/test_ultralayout.py +0 -0
  515. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/text.py +0 -0
  516. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot/textalign.py +0 -0
  517. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot.egg-info/dependency_links.txt +0 -0
  518. {ultraplot-2.5.0 → ultraplot-2.7.0}/ultraplot.egg-info/top_level.txt +0 -0
@@ -0,0 +1,50 @@
1
+ name: Black autoformat
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - "**"
7
+ paths:
8
+ - "ultraplot/**.py"
9
+ - "ultraplot/**.pyi"
10
+ - ".github/workflows/black.yml"
11
+ - ".pre-commit-config.yaml"
12
+ - "pyproject.toml"
13
+
14
+ permissions:
15
+ contents: write
16
+
17
+ concurrency:
18
+ group: black-${{ github.ref }}
19
+ cancel-in-progress: false
20
+
21
+ jobs:
22
+ format:
23
+ runs-on: ubuntu-latest
24
+ steps:
25
+ - uses: actions/checkout@v7
26
+ with:
27
+ ref: ${{ github.ref_name }}
28
+
29
+ - uses: actions/setup-python@v7
30
+ with:
31
+ python-version: "3.14"
32
+
33
+ - name: Install Black
34
+ run: python -m pip install black==26.5.1
35
+
36
+ - name: Format Python files
37
+ run: black ultraplot
38
+
39
+ - name: Commit formatting changes
40
+ run: |
41
+ if git diff --quiet -- '*.py' '*.pyi'; then
42
+ echo "Black made no changes."
43
+ exit 0
44
+ fi
45
+
46
+ git config user.name "github-actions[bot]"
47
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
48
+ git add --update -- '*.py' '*.pyi'
49
+ git commit -m "Apply Black formatting"
50
+ git push
@@ -53,9 +53,15 @@ jobs:
53
53
  with:
54
54
  fetch-depth: 0
55
55
 
56
- - uses: mamba-org/setup-micromamba@v3.0.0
56
+ - name: Prepare compatible test environment
57
+ run: >-
58
+ python3 tools/ci/version_support.py
59
+ --matplotlib-version '${{ inputs.matplotlib-version }}'
60
+ --environment-output '${{ runner.temp }}/ultraplot-environment.yml'
61
+
62
+ - uses: mamba-org/setup-micromamba@v3.2.1
57
63
  with:
58
- environment-file: ./environment.yml
64
+ environment-file: ${{ runner.temp }}/ultraplot-environment.yml
59
65
  init-shell: bash
60
66
  condarc-file: ./.github/micromamba-condarc.yml
61
67
  post-cleanup: none
@@ -69,6 +75,14 @@ jobs:
69
75
  - name: Build Ultraplot
70
76
  run: |
71
77
  pip install --no-build-isolation --no-deps .
78
+ python - <<'PY'
79
+ import sys
80
+ import matplotlib, mpltern, pycirclize
81
+ assert sys.version_info[:2] == tuple(map(int, '${{ inputs.python-version }}'.split('.')))
82
+ assert matplotlib.__version__.startswith('${{ inputs.matplotlib-version }}.')
83
+ print('Python executable:', sys.executable)
84
+ print('Matplotlib:', matplotlib.__version__)
85
+ PY
72
86
 
73
87
  compare-baseline:
74
88
  name: Compare baseline Python ${{ inputs.python-version }} with MPL ${{ inputs.matplotlib-version }}
@@ -100,9 +114,15 @@ jobs:
100
114
 
101
115
  - uses: actions/checkout@v7
102
116
 
103
- - uses: mamba-org/setup-micromamba@v3.0.0
117
+ - name: Prepare compatible test environment
118
+ run: >-
119
+ python3 tools/ci/version_support.py
120
+ --matplotlib-version '${{ inputs.matplotlib-version }}'
121
+ --environment-output '${{ runner.temp }}/ultraplot-environment.yml'
122
+
123
+ - uses: mamba-org/setup-micromamba@v3.2.1
104
124
  with:
105
- environment-file: ./environment.yml
125
+ environment-file: ${{ runner.temp }}/ultraplot-environment.yml
106
126
  init-shell: bash
107
127
  condarc-file: ./.github/micromamba-condarc.yml
108
128
  post-cleanup: none
@@ -128,11 +148,26 @@ jobs:
128
148
  echo "base_sha=${BASE_SHA}" >> "${GITHUB_OUTPUT}"
129
149
  echo "Resolved baseline ref=${BASE_REF} sha=${BASE_SHA}"
130
150
 
151
+ - name: Check baseline version support
152
+ id: baseline-support
153
+ run: |
154
+ git show '${{ steps.baseline-ref.outputs.base_sha }}:pyproject.toml' > '${{ runner.temp }}/baseline-pyproject.toml'
155
+ python tools/ci/version_support.py \
156
+ --baseline-pyproject '${{ runner.temp }}/baseline-pyproject.toml' \
157
+ --python-version '${{ inputs.python-version }}' \
158
+ --matplotlib-version '${{ inputs.matplotlib-version }}' >> "$GITHUB_OUTPUT"
159
+
160
+ - name: Explain unavailable baseline
161
+ if: steps.baseline-support.outputs.baseline-supported != 'true'
162
+ run: |
163
+ echo '::notice::Image comparison skipped: the base commit does not support this Python/Matplotlib pair. PR tests still run in the coverage job.'
164
+ echo 'Image comparison skipped for Python ${{ inputs.python-version }} / Matplotlib ${{ inputs.matplotlib-version }}: base commit ${{ steps.baseline-ref.outputs.base_sha }} does not support this pair. The coverage job still tests the PR on this pair.' >> "$GITHUB_STEP_SUMMARY"
165
+
131
166
  # Cache Baseline Figures (Restore step)
132
167
  - name: Cache Baseline Figures
133
168
  id: cache-baseline
134
169
  uses: actions/cache@v6
135
- if: ${{ env.IS_PR }}
170
+ if: env.IS_PR == 'true' && steps.baseline-support.outputs.baseline-supported == 'true'
136
171
  with:
137
172
  path: ./ultraplot/tests/baseline # The directory to cache
138
173
  # Key is based on OS, Python/Matplotlib versions, and the base commit SHA
@@ -143,7 +178,7 @@ jobs:
143
178
  # Conditional Baseline Generation (Only runs on cache miss)
144
179
  - name: Generate baseline from main
145
180
  # Skip this step if the cache was found (cache-hit is true)
146
- if: steps.cache-baseline.outputs.cache-hit != 'true' || !env.IS_PR
181
+ if: steps.baseline-support.outputs.baseline-supported == 'true' && (steps.cache-baseline.outputs.cache-hit != 'true' || env.IS_PR != 'true')
147
182
  run: |
148
183
  mkdir -p ultraplot/tests/baseline
149
184
  echo "TEST_MODE=${TEST_MODE}"
@@ -219,6 +254,7 @@ jobs:
219
254
 
220
255
  # Image Comparison (Uses cached or newly generated baseline)
221
256
  - name: Image Comparison Ultraplot
257
+ if: steps.baseline-support.outputs.baseline-supported == 'true'
222
258
  run: |
223
259
  set -uo pipefail
224
260
  # This workflow runs in a login shell (bash -el), which executes
@@ -22,6 +22,8 @@ jobs:
22
22
  - 'environment.yml'
23
23
  - '.github/workflows/**'
24
24
  - 'tools/ci/**'
25
+ - 'tools/expand_docstrings.py'
26
+ - 'setup.py'
25
27
 
26
28
  select-tests:
27
29
  runs-on: ubuntu-latest
@@ -50,7 +52,7 @@ jobs:
50
52
 
51
53
  - name: Build test map on cache miss
52
54
  if: steps.restore-map.outputs.cache-hit != 'true'
53
- uses: mamba-org/setup-micromamba@v3.0.0
55
+ uses: mamba-org/setup-micromamba@v3.2.1
54
56
  with:
55
57
  environment-file: ./environment.yml
56
58
  init-shell: bash
@@ -99,6 +101,8 @@ jobs:
99
101
  --always-full 'pyproject.toml' \
100
102
  --always-full 'environment.yml' \
101
103
  --always-full 'ultraplot/__init__.py' \
104
+ --always-full 'tools/expand_docstrings.py' \
105
+ --always-full 'setup.py' \
102
106
  --ignore 'docs/**' \
103
107
  --ignore 'README.rst'
104
108
  echo "Selection output:"
@@ -126,7 +130,7 @@ jobs:
126
130
  with:
127
131
  fetch-depth: 0
128
132
 
129
- - uses: actions/setup-python@v6
133
+ - uses: actions/setup-python@v7
130
134
  with:
131
135
  python-version: "3.11"
132
136
 
@@ -138,12 +142,55 @@ jobs:
138
142
  echo "Detected test matrix: $(echo "$OUTPUT" | jq -c '.test_matrix')"
139
143
  python tools/ci/version_support.py --format github-output >> $GITHUB_OUTPUT
140
144
 
145
+ static-api:
146
+ name: Static API and installed docstrings
147
+ runs-on: ubuntu-latest
148
+ needs:
149
+ - run-if-changes
150
+ if: always() && needs.run-if-changes.outputs.run == 'true'
151
+ steps:
152
+ - uses: actions/checkout@v7
153
+
154
+ - uses: actions/setup-python@v7
155
+ with:
156
+ python-version: "3.13"
157
+ cache: pip
158
+
159
+ - name: Install built package and check static API
160
+ run: |
161
+ pip install ".[typing]"
162
+ mkdir -p /tmp/ultraplot-static
163
+ cp tools/ci/static_consumer.py /tmp/ultraplot-static/consumer.py
164
+ cp tools/ci/check_installed_docstrings.py /tmp/ultraplot-static/check_docstrings.py
165
+ (
166
+ cd /tmp/ultraplot-static
167
+ basedpyright consumer.py --outputjson > basedpyright.json || true
168
+ python - <<'PY'
169
+ import json
170
+
171
+ report = json.load(open("/tmp/ultraplot-static/basedpyright.json", encoding="utf-8"))
172
+ summary = report["summary"]
173
+ print(
174
+ f"BasedPyright: {summary['errorCount']} errors, "
175
+ f"{summary['warningCount']} warnings"
176
+ )
177
+ if summary["errorCount"]:
178
+ raise SystemExit(1)
179
+ PY
180
+ python check_docstrings.py
181
+ )
182
+
141
183
  coverage:
142
- name: Coverage
184
+ name: Coverage Python ${{ matrix.python-version }} / MPL ${{ matrix.matplotlib-version }}
143
185
  runs-on: ubuntu-latest
144
186
  needs:
145
187
  - run-if-changes
146
- if: always() && needs.run-if-changes.outputs.run == 'true' && github.event_name == 'pull_request'
188
+ - get-versions
189
+ if: always() && needs.run-if-changes.outputs.run == 'true' && needs.get-versions.result == 'success' && github.event_name == 'pull_request'
190
+ strategy:
191
+ fail-fast: false
192
+ matrix:
193
+ include: ${{ fromJson(needs.get-versions.outputs.test-matrix) }}
147
194
  defaults:
148
195
  run:
149
196
  shell: bash -el {0}
@@ -157,25 +204,41 @@ jobs:
157
204
  with:
158
205
  fetch-depth: 0
159
206
 
160
- - uses: mamba-org/setup-micromamba@v3.0.0
207
+ - name: Prepare compatible coverage environment
208
+ run: >-
209
+ python3 tools/ci/version_support.py
210
+ --matplotlib-version '${{ matrix.matplotlib-version }}'
211
+ --environment-output '${{ runner.temp }}/ultraplot-environment.yml'
212
+
213
+ - uses: mamba-org/setup-micromamba@v3.2.1
161
214
  with:
162
- environment-file: ./environment.yml
215
+ environment-file: ${{ runner.temp }}/ultraplot-environment.yml
163
216
  init-shell: bash
164
217
  condarc-file: ./.github/micromamba-condarc.yml
165
218
  post-cleanup: none
166
219
  create-args: >-
167
220
  --verbose
168
- python=3.10
169
- matplotlib=3.9
221
+ python=${{ matrix.python-version }}
222
+ matplotlib=${{ matrix.matplotlib-version }}
170
223
  cache-environment: true
171
224
  cache-downloads: false
172
225
 
173
226
  - name: Build Ultraplot
174
227
  run: |
175
- pip install --no-build-isolation --no-deps .
228
+ pip install --no-build-isolation ".[mcp]"
176
229
 
177
230
  - name: Run full coverage suite
178
231
  run: |
232
+ python - <<'PY'
233
+ import sys
234
+ from importlib.metadata import version
235
+ import matplotlib, mpltern, pycirclize
236
+ assert sys.version_info[:2] == tuple(map(int, '${{ matrix.python-version }}'.split('.')))
237
+ assert matplotlib.__version__.startswith('${{ matrix.matplotlib-version }}.')
238
+ print('Python executable:', sys.executable)
239
+ for package in ('matplotlib', 'mpltern', 'pycirclize', 'cartopy'):
240
+ print(f'{package}: {version(package)}')
241
+ PY
179
242
  pytest -q --tb=short --disable-warnings -n auto -p pytest_cov \
180
243
  --cov=ultraplot --cov-branch --cov-context=test \
181
244
  --cov-report=xml:coverage.xml --cov-report= \
@@ -186,7 +249,7 @@ jobs:
186
249
  with:
187
250
  token: ${{ secrets.CODECOV_TOKEN }}
188
251
  files: ./coverage.xml
189
- name: codecov-pr-python3.10-mpl3.9
252
+ name: codecov-pr-python${{ matrix.python-version }}-mpl${{ matrix.matplotlib-version }}
190
253
 
191
254
  build:
192
255
  needs:
@@ -212,7 +275,9 @@ jobs:
212
275
  build-success:
213
276
  needs:
214
277
  - build
278
+ - coverage
215
279
  - run-if-changes
280
+ - static-api
216
281
  if: always()
217
282
  runs-on: ubuntu-latest
218
283
  steps:
@@ -220,7 +285,7 @@ jobs:
220
285
  if [[ '${{ needs.run-if-changes.outputs.run }}' == 'false' ]]; then
221
286
  echo "No changes detected, tests skipped."
222
287
  else
223
- if [[ '${{ needs.build.result }}' == 'success' ]]; then
288
+ if [[ '${{ needs.build.result }}' == 'success' && '${{ needs.static-api.result }}' == 'success' ]]; then
224
289
  echo "All tests passed successfully!"
225
290
  else
226
291
  echo "Tests failed!"
@@ -18,10 +18,18 @@ jobs:
18
18
  with:
19
19
  fetch-depth: 0
20
20
 
21
- - uses: actions/setup-python@v6
21
+ - uses: actions/setup-python@v7
22
22
  with:
23
23
  python-version: "3.12"
24
24
 
25
+ - name: Pin version from tag on release builds
26
+ if: startsWith(github.ref, 'refs/tags/')
27
+ run: |
28
+ VERSION="${GITHUB_REF_NAME#v}"
29
+ echo "Using tagged version: $VERSION"
30
+ echo "SETUPTOOLS_SCM_PRETEND_VERSION=$VERSION" >> "$GITHUB_ENV"
31
+ shell: bash
32
+
25
33
  - name: Ensure clean tree before build
26
34
  run: |
27
35
  git diff --quiet || (git status --short && git diff && exit 1)
@@ -46,7 +54,7 @@ jobs:
46
54
 
47
55
  version=$(python -c "import ultraplot; print(ultraplot.__version__)")
48
56
  echo "Version: $version"
49
- if [[ "$version" == "0."* ]]; then
57
+ if [[ "${{ github.event_name }}" != "pull_request" && "$version" == "0."* ]]; then
50
58
  echo "Version is not set correctly!"
51
59
  exit 1
52
60
  fi
@@ -23,7 +23,7 @@ jobs:
23
23
  with:
24
24
  fetch-depth: 0
25
25
 
26
- - uses: mamba-org/setup-micromamba@v3.0.0
26
+ - uses: mamba-org/setup-micromamba@v3.2.1
27
27
  with:
28
28
  environment-file: ./environment.yml
29
29
  init-shell: bash
@@ -22,6 +22,12 @@ docs/_build
22
22
  docs/_static/ultraplotrc
23
23
  docs/_static/rctable.rst
24
24
  docs/_static/*
25
+ !docs/_static/alias-explorer-v3.css
26
+ !docs/_static/alias-explorer-v3.js
27
+ !docs/_static/alias-map.svg
28
+ !docs/_static/why_plots/
29
+ !docs/_static/example_plots/
30
+ !docs/_static/example_plots/data_aware_example.svg
25
31
  *.html
26
32
  docs/gallery/
27
33
  docs/sg_execution_times.rst
@@ -6,7 +6,7 @@ ci:
6
6
  autofix_prs: false
7
7
  autoupdate_commit_msg: '[pre-commit.ci] pre-commit autoupdate'
8
8
  autoupdate_schedule: monthly
9
- skip: []
9
+ skip: [black]
10
10
  submodules: false
11
11
 
12
12
  repos:
@@ -14,3 +14,11 @@ repos:
14
14
  rev: 26.5.1
15
15
  hooks:
16
16
  - id: black
17
+
18
+ - repo: https://github.com/tombi-toml/tombi-pre-commit
19
+ rev: v1.5.2
20
+ hooks:
21
+ - id: tombi-format
22
+ args: ["--offline"]
23
+ - id: tombi-lint
24
+ args: ["--offline"]
@@ -10,13 +10,19 @@ with ``pip`` or ``conda`` as follows:
10
10
  pip install ultraplot
11
11
  conda install -c conda-forge ultraplot
12
12
 
13
- The default install includes optional features (for example, pyCirclize-based plots).
14
- For a minimal install, use ``--no-deps`` and install the core requirements:
13
+ pyCirclize-based plots require the optional ``circos`` extra:
15
14
 
16
15
  .. code-block:: bash
17
16
 
18
- pip install ultraplot --no-deps
19
- pip install -r requirements-minimal.txt
17
+ pip install 'ultraplot[circos]'
18
+
19
+ The ``docs`` extra also includes pyCirclize for building the documentation.
20
+
21
+ To install all optional dependency groups (``circos``, ``docs``, and ``stats``):
22
+
23
+ .. code-block:: bash
24
+
25
+ pip install 'ultraplot[all]'
20
26
 
21
27
  Likewise, an existing installation of ultraplot can be upgraded to the latest version with:
22
28
 
@@ -1,46 +1,55 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultraplot
3
- Version: 2.5.0
3
+ Version: 2.7.0
4
4
  Summary: A succinct matplotlib wrapper for making beautiful, publication-quality graphics.
5
5
  Author-email: Casper van Elteren <caspervanelteren@gmail.com>, Luke Davis <lukelbd@gmail.com>
6
6
  Maintainer-email: Casper van Elteren <caspervanelteren@gmail.com>, "Matthew R. Becker" <becker.mr@gmail.com>
7
- License: MIT
7
+ License-Expression: MIT
8
8
  Project-URL: Documentation, https://ultraplot.readthedocs.io
9
9
  Project-URL: Issue Tracker, https://github.com/ultraplot/ultraplot/issues
10
10
  Project-URL: Source Code, https://github.com/ultraplot/ultraplot
11
- Classifier: License :: OSI Approved :: MIT License
12
- Classifier: Operating System :: OS Independent
11
+ Classifier: Framework :: Matplotlib
13
12
  Classifier: Intended Audience :: Science/Research
13
+ Classifier: Operating System :: OS Independent
14
14
  Classifier: Programming Language :: Python :: 3 :: Only
15
15
  Classifier: Programming Language :: Python :: 3.10
16
16
  Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
18
  Classifier: Programming Language :: Python :: 3.13
19
19
  Classifier: Programming Language :: Python :: 3.14
20
- Classifier: Framework :: Matplotlib
21
20
  Requires-Python: <3.15,>=3.10
22
21
  Description-Content-Type: text/x-rst
23
22
  License-File: LICENSE.txt
23
+ Requires-Dist: matplotlib<3.12,>=3.9
24
24
  Requires-Dist: numpy>=1.26.0
25
- Requires-Dist: matplotlib<3.11,>=3.9
26
- Requires-Dist: pycirclize>=1.10.1
27
25
  Requires-Dist: typing-extensions; python_version < "3.12"
26
+ Provides-Extra: all
27
+ Requires-Dist: ultraplot[circos,docs,stats]; extra == "all"
28
+ Provides-Extra: circos
29
+ Requires-Dist: pycirclize>=1.10.1; extra == "circos"
28
30
  Provides-Extra: docs
29
31
  Requires-Dist: jupyter; extra == "docs"
30
32
  Requires-Dist: jupytext; extra == "docs"
31
33
  Requires-Dist: lxml-html-clean; extra == "docs"
32
34
  Requires-Dist: markdown; extra == "docs"
33
35
  Requires-Dist: mpltern; extra == "docs"
34
- Requires-Dist: nbsphinx; extra == "docs"
36
+ Requires-Dist: pycirclize>=1.10.1; extra == "docs"
37
+ Requires-Dist: nbsphinx>=0.9.8; extra == "docs"
35
38
  Requires-Dist: sphinx; extra == "docs"
36
39
  Requires-Dist: sphinx-autoapi; extra == "docs"
37
- Requires-Dist: sphinx-automodapi; extra == "docs"
40
+ Requires-Dist: sphinx-automodapi>=0.22; extra == "docs"
38
41
  Requires-Dist: sphinx-copybutton; extra == "docs"
39
- Requires-Dist: sphinx-design; extra == "docs"
42
+ Requires-Dist: sphinx-design>=0.7; extra == "docs"
40
43
  Requires-Dist: sphinx-gallery; extra == "docs"
41
44
  Requires-Dist: shibuya; extra == "docs"
42
45
  Requires-Dist: sphinx-sitemap; extra == "docs"
43
46
  Requires-Dist: typing-extensions; extra == "docs"
47
+ Provides-Extra: mcp
48
+ Requires-Dist: mcp<3,>=2.1; extra == "mcp"
49
+ Provides-Extra: stats
50
+ Requires-Dist: scipy; extra == "stats"
51
+ Provides-Extra: typing
52
+ Requires-Dist: basedpyright==1.31.4; extra == "typing"
44
53
  Dynamic: license-file
45
54
 
46
55
  .. image:: https://raw.githubusercontent.com/Ultraplot/ultraplot/refs/heads/main/UltraPlotLogo.svg
@@ -149,13 +158,19 @@ UltraPlot is published on `PyPi <https://pypi.org/project/ultraplot/>`__ and
149
158
  pip install ultraplot
150
159
  conda install -c conda-forge ultraplot
151
160
 
152
- The default install includes optional features (for example, pyCirclize-based plots).
153
- For a minimal install, use ``--no-deps`` and install the core requirements:
161
+ pyCirclize-based plots require the optional ``circos`` extra:
154
162
 
155
163
  .. code-block:: bash
156
164
 
157
- pip install ultraplot --no-deps
158
- pip install -r requirements-minimal.txt
165
+ pip install 'ultraplot[circos]'
166
+
167
+ The ``docs`` extra also includes pyCirclize for building the documentation.
168
+
169
+ To install the ``circos``, ``docs``, and ``stats`` dependency groups together:
170
+
171
+ .. code-block:: bash
172
+
173
+ pip install 'ultraplot[all]'
159
174
 
160
175
  Likewise, an existing installation of UltraPlot can be upgraded
161
176
  to the latest version with:
@@ -170,6 +185,113 @@ To install a development version of UltraPlot, you can use
170
185
  or clone the repository and run ``pip install -e .``
171
186
  inside the ``ultraplot`` folder.
172
187
 
188
+ MCP server
189
+ ==========
190
+
191
+ UltraPlot includes a Model Context Protocol (MCP) server that lets AI assistants
192
+ search documentation and examples, inspect the live Python API, and read source
193
+ code and release notes.
194
+
195
+ Run directly with uvx
196
+ ---------------------
197
+
198
+ With `uv <https://docs.astral.sh/uv/getting-started/installation/>`__ installed,
199
+ your MCP client can launch the server with ``uvx``. uv installs the package and
200
+ its dependencies in an isolated environment automatically, so you do not need
201
+ to create a virtual environment or install UltraPlot separately.
202
+
203
+ For a PyPI release containing the MCP server, the launch command is:
204
+
205
+ .. code-block:: bash
206
+
207
+ uvx --from 'ultraplot[mcp]' ultraplot-mcp
208
+
209
+ For clients that use an ``mcpServers`` configuration, add:
210
+
211
+ .. code-block:: json
212
+
213
+ {
214
+ "mcpServers": {
215
+ "ultraplot": {
216
+ "command": "uvx",
217
+ "args": ["--from", "ultraplot[mcp]", "ultraplot-mcp"]
218
+ }
219
+ }
220
+ }
221
+
222
+ The client starts the server when needed and communicates with it over stdio.
223
+ Other clients may use a different configuration format; use the same command
224
+ and arguments. ``uvx`` is equivalent to ``uv tool run``.
225
+
226
+ Until the MCP server is released on PyPI, run it directly from the feature
227
+ branch instead:
228
+
229
+ .. code-block:: bash
230
+
231
+ uvx --from 'ultraplot[mcp] @ git+https://github.com/ultraplot/ultraplot.git@feat/mcp' ultraplot-mcp
232
+
233
+ For this development version, replace ``ultraplot[mcp]`` in the client
234
+ configuration with
235
+ ``ultraplot[mcp] @ git+https://github.com/ultraplot/ultraplot.git@feat/mcp``.
236
+
237
+ Install persistently with uv
238
+ ----------------------------
239
+
240
+ Alternatively, keep the executable on your ``PATH`` by installing it as a uv
241
+ tool. For a PyPI release containing the MCP server:
242
+
243
+ .. code-block:: bash
244
+
245
+ uv tool install 'ultraplot[mcp]'
246
+ ultraplot-mcp --help
247
+
248
+ Before that release, install from the feature branch:
249
+
250
+ .. code-block:: bash
251
+
252
+ uv tool install 'ultraplot[mcp] @ git+https://github.com/ultraplot/ultraplot.git@feat/mcp'
253
+
254
+ Then configure your client to launch ``ultraplot-mcp`` with no arguments.
255
+ If uv reports that its executable directory is missing from ``PATH``, run
256
+ ``uv tool update-shell`` and restart your shell.
257
+
258
+ Install from a checkout
259
+ -----------------------
260
+
261
+ From a checkout containing the MCP implementation, install the optional ``mcp``
262
+ extra in the Python environment you want the server to use:
263
+
264
+ .. code-block:: bash
265
+
266
+ pip install -e '.[mcp]'
267
+
268
+ Connect an MCP client
269
+ ---------------------
270
+
271
+ After installing persistently with uv or pip, register the server with an
272
+ installed Codex CLI:
273
+
274
+ .. code-block:: bash
275
+
276
+ ultraplot-mcp install codex
277
+
278
+ Restart Codex after registration. Try asking it to search the UltraPlot
279
+ examples for shared colorbars or inspect ``ultraplot.subplots``.
280
+
281
+ For other MCP clients, configure a stdio server with ``ultraplot-mcp`` as the
282
+ command and no arguments. Use the executable's absolute path if the client does
283
+ not inherit your Python environment's ``PATH``. Running ``ultraplot-mcp`` starts
284
+ the server; ``ultraplot-mcp --help`` lists the available commands.
285
+
286
+ Documentation tools read the checkout's ``docs`` directory. Direct uvx and uv
287
+ tool installations require a separate documentation checkout for these tools.
288
+ If documentation lives elsewhere, set ``ULTRAPLOT_MCP_DOCS`` to its absolute path in the MCP
289
+ client's server environment. Documentation is not currently bundled in the
290
+ Python package; API and source inspection use the installed UltraPlot version.
291
+
292
+ Citing UltraPlot
293
+ ================
294
+
173
295
  If you use UltraPlot in your research, please cite the latest release metadata in
174
296
  ``CITATION.cff``. GitHub can export this metadata as BibTeX from the
175
297
  repository's "Cite this repository" panel, and the Zenodo badge below points to