ultraplot 2.6.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 (516) hide show
  1. {ultraplot-2.6.0 → ultraplot-2.7.0}/.github/workflows/build-ultraplot.yml +42 -6
  2. {ultraplot-2.6.0 → ultraplot-2.7.0}/.github/workflows/main.yml +75 -10
  3. {ultraplot-2.6.0 → ultraplot-2.7.0}/.github/workflows/test-map.yml +1 -1
  4. {ultraplot-2.6.0 → ultraplot-2.7.0}/.gitignore +5 -0
  5. {ultraplot-2.6.0 → ultraplot-2.7.0}/.pre-commit-config.yaml +8 -0
  6. {ultraplot-2.6.0 → ultraplot-2.7.0}/INSTALL.rst +10 -4
  7. {ultraplot-2.6.0/ultraplot.egg-info → ultraplot-2.7.0}/PKG-INFO +134 -14
  8. {ultraplot-2.6.0 → ultraplot-2.7.0}/README.rst +117 -4
  9. ultraplot-2.7.0/docs/_static/alias-explorer-v3.css +408 -0
  10. ultraplot-2.7.0/docs/_static/alias-explorer-v3.js +476 -0
  11. ultraplot-2.7.0/docs/_static/alias-map.svg +3505 -0
  12. ultraplot-2.7.0/docs/_static/example_plots/data_aware_example.svg +1159 -0
  13. ultraplot-2.7.0/docs/aliases.rst +1065 -0
  14. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/api.rst +10 -0
  15. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/colorbars_legends.py +4 -0
  16. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/conf.py +20 -4
  17. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/configuration.rst +4 -0
  18. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/contributing.rst +23 -0
  19. ultraplot-2.7.0/docs/data_aware.py +63 -0
  20. ultraplot-2.7.0/docs/first_figure.py +346 -0
  21. ultraplot-2.7.0/docs/index.rst +191 -0
  22. ultraplot-2.7.0/docs/keyword_aliases.rst +49 -0
  23. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/projections.py +3 -3
  24. ultraplot-2.7.0/docs/recipes.py +88 -0
  25. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/sphinxext/custom_roles.py +13 -1
  26. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/subplots.py +1 -1
  27. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/usage.rst +23 -5
  28. ultraplot-2.7.0/docs/why_ultraplot.py +136 -0
  29. {ultraplot-2.6.0 → ultraplot-2.7.0}/environment.yml +3 -0
  30. {ultraplot-2.6.0 → ultraplot-2.7.0}/noxfile.py +23 -12
  31. ultraplot-2.7.0/pyproject.toml +121 -0
  32. {ultraplot-2.6.0 → ultraplot-2.7.0}/requirements-minimal.txt +1 -1
  33. ultraplot-2.7.0/setup.py +21 -0
  34. ultraplot-2.7.0/tools/ci/check_installed_docstrings.py +47 -0
  35. ultraplot-2.7.0/tools/ci/static_consumer.py +13 -0
  36. {ultraplot-2.6.0 → ultraplot-2.7.0}/tools/ci/version_support.py +40 -0
  37. ultraplot-2.7.0/tools/expand_docstrings.py +126 -0
  38. ultraplot-2.7.0/tools/generate_alias_figure.py +99 -0
  39. ultraplot-2.7.0/tools/generate_alias_reference.py +96 -0
  40. ultraplot-2.7.0/tools/serve_alias_docs.py +85 -0
  41. ultraplot-2.7.0/ultraplot/.opencode/goals/state.json.lock +1 -0
  42. ultraplot-2.7.0/ultraplot/.opencode/goals/state.json.sessions/.migration-v1-complete +4 -0
  43. ultraplot-2.7.0/ultraplot/.opencode/goals/state.json.sessions/cc3e983cb1eb34ad9f66e65e9ff9910c47ddb4f26523966e07d6a8bf3bc830eb/state.json +7 -0
  44. ultraplot-2.7.0/ultraplot/.opencode/goals/state.json.sessions/cc3e983cb1eb34ad9f66e65e9ff9910c47ddb4f26523966e07d6a8bf3bc830eb/state.json.lock +1 -0
  45. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/__init__.py +2 -0
  46. ultraplot-2.7.0/ultraplot/_animation.py +1342 -0
  47. ultraplot-2.7.0/ultraplot/_interaction.py +720 -0
  48. ultraplot-2.7.0/ultraplot/_layout.py +609 -0
  49. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/_lazy.py +2 -1
  50. ultraplot-2.7.0/ultraplot/_sharing.py +554 -0
  51. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/_subplots.py +22 -11
  52. ultraplot-2.7.0/ultraplot/_version.py +1 -0
  53. ultraplot-2.7.0/ultraplot/animation.py +782 -0
  54. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/axes/_formatting.py +43 -0
  55. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/axes/base.py +133 -176
  56. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/axes/cartesian.py +102 -63
  57. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/axes/container.py +62 -1
  58. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/axes/geo.py +65 -83
  59. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/axes/plot.py +95 -132
  60. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/axes/plot_types/circlize.py +30 -0
  61. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/axes/plot_types/ribbon.py +8 -1
  62. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/axes/polar.py +3 -26
  63. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/axes/shared.py +69 -0
  64. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/axes/taylor.py +6 -8
  65. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/axes/three.py +30 -0
  66. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/colorbar.py +76 -35
  67. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/config.py +8 -2
  68. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/constructor.py +4 -10
  69. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/figure.py +568 -98
  70. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/gridspec.py +70 -64
  71. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/internals/__init__.py +5 -0
  72. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/internals/docstring.py +63 -58
  73. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/internals/guides.py +5 -4
  74. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/internals/inputs.py +16 -11
  75. ultraplot-2.7.0/ultraplot/internals/kwargs.py +684 -0
  76. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/internals/rcsetup.py +7 -0
  77. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/internals/warnings.py +6 -3
  78. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/legend.py +13 -9
  79. ultraplot-2.7.0/ultraplot/mcp.py +695 -0
  80. ultraplot-2.7.0/ultraplot/py.typed +1 -0
  81. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/scale.py +4 -15
  82. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/conftest.py +6 -0
  83. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_2dplots.py +89 -0
  84. ultraplot-2.7.0/ultraplot/tests/test_alias_signatures.py +164 -0
  85. ultraplot-2.7.0/ultraplot/tests/test_animation.py +1893 -0
  86. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_axes.py +3 -3
  87. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_circlize_integration.py +53 -2
  88. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_colorbar.py +78 -0
  89. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_core_versions.py +87 -0
  90. ultraplot-2.7.0/ultraplot/tests/test_docstring_helpers.py +153 -0
  91. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_figure.py +151 -9
  92. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_format.py +499 -0
  93. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_geographic.py +31 -18
  94. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_gridspec.py +5 -2
  95. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_imports.py +33 -0
  96. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_imshow.py +6 -5
  97. ultraplot-2.7.0/ultraplot/tests/test_kwargs_helpers.py +158 -0
  98. ultraplot-2.7.0/ultraplot/tests/test_mcp.py +306 -0
  99. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_statistical_plotting.py +6 -7
  100. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_subplot_manager.py +4 -9
  101. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_subplots.py +16 -8
  102. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_textalign.py +3 -2
  103. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/ticker.py +6 -1
  104. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/ui.py +13 -3
  105. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/ultralayout.py +22 -17
  106. {ultraplot-2.6.0 → ultraplot-2.7.0/ultraplot.egg-info}/PKG-INFO +134 -14
  107. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot.egg-info/SOURCES.txt +32 -0
  108. ultraplot-2.7.0/ultraplot.egg-info/entry_points.txt +2 -0
  109. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot.egg-info/requires.txt +17 -5
  110. ultraplot-2.7.0/ultraplot.egg-info/scm_file_list.json +503 -0
  111. ultraplot-2.6.0/docs/index.rst +0 -164
  112. ultraplot-2.6.0/pyproject.toml +0 -93
  113. ultraplot-2.6.0/ultraplot/_version.py +0 -1
  114. ultraplot-2.6.0/ultraplot/internals/kwargs.py +0 -345
  115. ultraplot-2.6.0/ultraplot/tests/test_animation.py +0 -109
  116. ultraplot-2.6.0/ultraplot/tests/test_docstring_helpers.py +0 -63
  117. ultraplot-2.6.0/ultraplot/tests/test_kwargs_helpers.py +0 -80
  118. {ultraplot-2.6.0 → ultraplot-2.7.0}/.github/ISSUE_TEMPLATE.md +0 -0
  119. {ultraplot-2.6.0 → ultraplot-2.7.0}/.github/dependabot.yml +0 -0
  120. {ultraplot-2.6.0 → ultraplot-2.7.0}/.github/micromamba-condarc.yml +0 -0
  121. {ultraplot-2.6.0 → ultraplot-2.7.0}/.github/workflows/black.yml +0 -0
  122. {ultraplot-2.6.0 → ultraplot-2.7.0}/.github/workflows/publish-pypi.yml +0 -0
  123. {ultraplot-2.6.0 → ultraplot-2.7.0}/.readthedocs.yml +0 -0
  124. {ultraplot-2.6.0 → ultraplot-2.7.0}/.zenodo.json +0 -0
  125. {ultraplot-2.6.0 → ultraplot-2.7.0}/CITATION.cff +0 -0
  126. {ultraplot-2.6.0 → ultraplot-2.7.0}/CODEOFCONDUCT.md +0 -0
  127. {ultraplot-2.6.0 → ultraplot-2.7.0}/CONTRIBUTING.rst +0 -0
  128. {ultraplot-2.6.0 → ultraplot-2.7.0}/LICENSE.txt +0 -0
  129. {ultraplot-2.6.0 → ultraplot-2.7.0}/UltraPlotLogo.svg +0 -0
  130. {ultraplot-2.6.0 → ultraplot-2.7.0}/codecov.yml +0 -0
  131. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/1dplots.py +0 -0
  132. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/2dplots.py +0 -0
  133. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/Makefile +0 -0
  134. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_ext/notoc.py +0 -0
  135. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_scripts/fetch_releases.py +0 -0
  136. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_static/custom.css +0 -0
  137. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_static/custom.js +0 -0
  138. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_static/example_plots/cartesian_example.svg +0 -0
  139. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_static/example_plots/colorbars_legends_example.svg +0 -0
  140. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_static/example_plots/colormaps_example.svg +0 -0
  141. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_static/example_plots/panels_example.svg +0 -0
  142. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_static/example_plots/projection_example.svg +0 -0
  143. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_static/example_plots/subplot_example.svg +0 -0
  144. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_static/logo_blank.svg +0 -0
  145. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_static/logo_long.png +0 -0
  146. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_static/logo_long.svg +0 -0
  147. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_static/logo_social.png +0 -0
  148. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_static/logo_social.svg +0 -0
  149. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_static/logo_square.png +0 -0
  150. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/_templates/whatsnew_sidebar.html +0 -0
  151. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/about.rst +0 -0
  152. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/basics.py +0 -0
  153. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/cartesian.py +0 -0
  154. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/colormaps.py +0 -0
  155. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/colors.py +0 -0
  156. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/cycles.py +0 -0
  157. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/README.txt +0 -0
  158. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/colors/01_cycle_colormap.py +0 -0
  159. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/colors/02_diverging_colormap.py +0 -0
  160. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/colors/README.txt +0 -0
  161. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/geo/01_robin_tracks.py +0 -0
  162. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/geo/02_orthographic_views.py +0 -0
  163. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/geo/03_projections_features.py +0 -0
  164. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/geo/04_choropleth.py +0 -0
  165. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/geo/README.txt +0 -0
  166. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/layouts/01_shared_axes_abc.py +0 -0
  167. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/layouts/02_complex_layout_insets.py +0 -0
  168. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/layouts/03_spanning_labels.py +0 -0
  169. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/layouts/README.txt +0 -0
  170. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/legend_types/01_semantic_legends.py +0 -0
  171. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/legends_colorbars/01_multi_colorbars.py +0 -0
  172. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/legends_colorbars/02_legend_inset_colorbar.py +0 -0
  173. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/legends_colorbars/03_semantic_legends.py +0 -0
  174. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/legends_colorbars/README.txt +0 -0
  175. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/plot_types/01_curved_quiver.py +0 -0
  176. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/plot_types/02_network_graph.py +0 -0
  177. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/plot_types/03_lollipop.py +0 -0
  178. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/plot_types/04_datetime_series.py +0 -0
  179. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/plot_types/05_box_violin.py +0 -0
  180. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/plot_types/06_ridge_plot.py +0 -0
  181. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/plot_types/07_radar.py +0 -0
  182. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/plot_types/07_sankey.py +0 -0
  183. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/plot_types/08_chord_diagram.py +0 -0
  184. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/plot_types/08_ternary.py +0 -0
  185. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/plot_types/09_phylogeny.py +0 -0
  186. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/plot_types/10_circos_bed.py +0 -0
  187. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/plot_types/11_topic_ribbon.py +0 -0
  188. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/plot_types/12_taylor_diagram.py +0 -0
  189. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/examples/plot_types/README.txt +0 -0
  190. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/external-links.rst +0 -0
  191. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/faq.rst +0 -0
  192. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/fonts.py +0 -0
  193. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/insets_panels.py +0 -0
  194. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/install.rst +0 -0
  195. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/lazy_loading.rst +0 -0
  196. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/make.bat +0 -0
  197. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/networks.py +0 -0
  198. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/requirements-rtd.txt +0 -0
  199. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/sphinxext/jupytext_cache.py +0 -0
  200. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/stats.py +0 -0
  201. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/ultraplotrc +0 -0
  202. {ultraplot-2.6.0 → ultraplot-2.7.0}/docs/why.rst +0 -0
  203. {ultraplot-2.6.0 → ultraplot-2.7.0}/logo/PermanentMarker-Regular.ttf +0 -0
  204. {ultraplot-2.6.0 → ultraplot-2.7.0}/logo/environment-logo.yml +0 -0
  205. {ultraplot-2.6.0 → ultraplot-2.7.0}/logo/logo.py +0 -0
  206. {ultraplot-2.6.0 → ultraplot-2.7.0}/logo/run-linter.sh +0 -0
  207. {ultraplot-2.6.0 → ultraplot-2.7.0}/logo/webicon.py +0 -0
  208. {ultraplot-2.6.0 → ultraplot-2.7.0}/logo/whyUltraPlot.svg +0 -0
  209. {ultraplot-2.6.0 → ultraplot-2.7.0}/setup.cfg +0 -0
  210. {ultraplot-2.6.0 → ultraplot-2.7.0}/tools/ci/build_test_map.py +0 -0
  211. {ultraplot-2.6.0 → ultraplot-2.7.0}/tools/ci/select_tests.py +0 -0
  212. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/axes/__init__.py +0 -0
  213. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/axes/plot_types/__init__.py +0 -0
  214. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/axes/plot_types/curved_quiver.py +0 -0
  215. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/axes/plot_types/sankey.py +0 -0
  216. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Algae.rgb +0 -0
  217. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Amp.rgb +0 -0
  218. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/BR.rgb +0 -0
  219. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Balance.rgb +0 -0
  220. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues1_r.xml +0 -0
  221. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues2.xml +0 -0
  222. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues3.xml +0 -0
  223. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues4_r.xml +0 -0
  224. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues5.xml +0 -0
  225. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues6.xml +0 -0
  226. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues7.xml +0 -0
  227. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues8.xml +0 -0
  228. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Blues9.xml +0 -0
  229. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Boreal.json +0 -0
  230. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns1.xml +0 -0
  231. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns2.xml +0 -0
  232. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns3.xml +0 -0
  233. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns4.xml +0 -0
  234. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns5.xml +0 -0
  235. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns6.xml +0 -0
  236. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns7.xml +0 -0
  237. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns8.xml +0 -0
  238. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Browns9.xml +0 -0
  239. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/ColdHot.rgb +0 -0
  240. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Crest.rgb +0 -0
  241. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Curl.rgb +0 -0
  242. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Deep.rgb +0 -0
  243. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Delta.rgb +0 -0
  244. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Dense.rgb +0 -0
  245. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Div.json +0 -0
  246. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/DryWet.json +0 -0
  247. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Dusk.json +0 -0
  248. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Fire.json +0 -0
  249. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Flare.rgb +0 -0
  250. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Glacial.json +0 -0
  251. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Greens1_r.xml +0 -0
  252. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Greens2.xml +0 -0
  253. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Greens3_r.xml +0 -0
  254. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Greens4.xml +0 -0
  255. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Greens5.xml +0 -0
  256. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Greens6_r.xml +0 -0
  257. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Greens7.xml +0 -0
  258. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Greens8.xml +0 -0
  259. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Haline.rgb +0 -0
  260. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Ice.rgb +0 -0
  261. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/IceFire.rgb +0 -0
  262. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Mako.rgb +0 -0
  263. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Marine.json +0 -0
  264. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Matter.rgb +0 -0
  265. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Mono.txt +0 -0
  266. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/MonoCycle.txt +0 -0
  267. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/NegPos.json +0 -0
  268. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Oranges1.xml +0 -0
  269. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Oranges2.xml +0 -0
  270. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Oranges3.xml +0 -0
  271. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Oranges4.xml +0 -0
  272. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Oxy.rgb +0 -0
  273. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Phase.rgb +0 -0
  274. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Purples1_r.xml +0 -0
  275. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Purples2.xml +0 -0
  276. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Purples3.xml +0 -0
  277. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Reds1.xml +0 -0
  278. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Reds2.xml +0 -0
  279. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Reds3.xml +0 -0
  280. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Reds4.xml +0 -0
  281. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Reds5.xml +0 -0
  282. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Rocket.rgb +0 -0
  283. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Solar.rgb +0 -0
  284. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Speed.rgb +0 -0
  285. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Stellar.json +0 -0
  286. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Sunrise.json +0 -0
  287. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Sunset.json +0 -0
  288. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Tempo.rgb +0 -0
  289. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Thermal.rgb +0 -0
  290. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Turbid.rgb +0 -0
  291. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Vivid.xml +0 -0
  292. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Vlag.rgb +0 -0
  293. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Yellows1.xml +0 -0
  294. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Yellows2.xml +0 -0
  295. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Yellows3.xml +0 -0
  296. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/Yellows4.xml +0 -0
  297. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/acton.txt +0 -0
  298. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/bam.txt +0 -0
  299. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/bamO.txt +0 -0
  300. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/bamako.txt +0 -0
  301. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/batlow.txt +0 -0
  302. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/batlowK.txt +0 -0
  303. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/batlowW.txt +0 -0
  304. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/berlin.txt +0 -0
  305. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/bilbao.txt +0 -0
  306. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/broc.txt +0 -0
  307. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/brocO.txt +0 -0
  308. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/buda.txt +0 -0
  309. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/bukavu.txt +0 -0
  310. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/cork.txt +0 -0
  311. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/corkO.txt +0 -0
  312. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/davos.txt +0 -0
  313. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/devon.txt +0 -0
  314. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/fes.txt +0 -0
  315. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/hawaii.txt +0 -0
  316. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/imola.txt +0 -0
  317. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/lajolla.txt +0 -0
  318. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/lapaz.txt +0 -0
  319. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/lisbon.txt +0 -0
  320. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/nuuk.txt +0 -0
  321. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/oleron.txt +0 -0
  322. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/oslo.txt +0 -0
  323. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/roma.txt +0 -0
  324. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/romaO.txt +0 -0
  325. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/tofino.txt +0 -0
  326. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/tokyo.txt +0 -0
  327. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/turku.txt +0 -0
  328. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/vanimo.txt +0 -0
  329. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/vik.txt +0 -0
  330. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cmaps/vikO.txt +0 -0
  331. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/colors/opencolor.txt +0 -0
  332. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/colors/xkcd.txt +0 -0
  333. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/colors.py +0 -0
  334. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cycles/538.hex +0 -0
  335. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cycles/FlatUI.hex +0 -0
  336. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cycles/Qual1.rgb +0 -0
  337. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cycles/Qual2.rgb +0 -0
  338. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cycles/bmh.hex +0 -0
  339. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cycles/classic.hex +0 -0
  340. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cycles/colorblind.hex +0 -0
  341. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cycles/colorblind10.hex +0 -0
  342. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cycles/default.hex +0 -0
  343. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cycles/ggplot.hex +0 -0
  344. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cycles/seaborn.hex +0 -0
  345. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/cycles/tableau.hex +0 -0
  346. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/demos.py +0 -0
  347. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/externals/__init__.py +0 -0
  348. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/externals/hsluv.py +0 -0
  349. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraMath-Bold.ttf +0 -0
  350. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraMath-ExtraLight.ttf +0 -0
  351. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraMath-Heavy.ttf +0 -0
  352. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraMath-Light.ttf +0 -0
  353. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraMath-Medium.ttf +0 -0
  354. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraMath-Regular.ttf +0 -0
  355. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraMath-SemiBold.ttf +0 -0
  356. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraMath-UltraLight.ttf +0 -0
  357. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-Black.ttf +0 -0
  358. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-BlackItalic.ttf +0 -0
  359. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-Bold.ttf +0 -0
  360. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-BoldItalic.ttf +0 -0
  361. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-ExtraBold.ttf +0 -0
  362. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-ExtraBoldItalic.ttf +0 -0
  363. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-ExtraLight.ttf +0 -0
  364. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-ExtraLightItalic.ttf +0 -0
  365. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-Italic.ttf +0 -0
  366. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-Light.ttf +0 -0
  367. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-LightItalic.ttf +0 -0
  368. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-Medium.ttf +0 -0
  369. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-MediumItalic.ttf +0 -0
  370. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-Regular.ttf +0 -0
  371. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-SemiBold.ttf +0 -0
  372. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/FiraSans-SemiBoldItalic.ttf +0 -0
  373. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_FIRAMATH.txt +0 -0
  374. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_FIRASANS.txt +0 -0
  375. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_NOTOSANS.txt +0 -0
  376. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_NOTOSERIF.txt +0 -0
  377. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_OPENSANS.txt +0 -0
  378. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_ROBOTO.txt +0 -0
  379. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_SOURCESANS.txt +0 -0
  380. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_SOURCESERIF.txt +0 -0
  381. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_TEXGYRE.txt +0 -0
  382. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/LICENSE_UBUNTU.txt +0 -0
  383. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/NotoSans-Bold.ttf +0 -0
  384. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/NotoSans-BoldItalic.ttf +0 -0
  385. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/NotoSans-Italic.ttf +0 -0
  386. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/NotoSans-Regular.ttf +0 -0
  387. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/NotoSerif-Bold.ttf +0 -0
  388. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/NotoSerif-BoldItalic.ttf +0 -0
  389. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/NotoSerif-Italic.ttf +0 -0
  390. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/NotoSerif-Regular.ttf +0 -0
  391. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/OpenSans-Bold.ttf +0 -0
  392. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/OpenSans-BoldItalic.ttf +0 -0
  393. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/OpenSans-Italic.ttf +0 -0
  394. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/OpenSans-Regular.ttf +0 -0
  395. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/OpenSans-Semibold.ttf +0 -0
  396. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/OpenSans-SemiboldItalic.ttf +0 -0
  397. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-Black.ttf +0 -0
  398. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-BlackItalic.ttf +0 -0
  399. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-Bold.ttf +0 -0
  400. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-BoldItalic.ttf +0 -0
  401. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-Italic.ttf +0 -0
  402. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-Light.ttf +0 -0
  403. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-LightItalic.ttf +0 -0
  404. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-Medium.ttf +0 -0
  405. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-MediumItalic.ttf +0 -0
  406. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Roboto-Regular.ttf +0 -0
  407. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-Black.ttf +0 -0
  408. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-BlackItalic.ttf +0 -0
  409. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-Bold.ttf +0 -0
  410. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-BoldItalic.ttf +0 -0
  411. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-ExtraLight.ttf +0 -0
  412. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-ExtraLightItalic.ttf +0 -0
  413. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-Italic.ttf +0 -0
  414. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-Light.ttf +0 -0
  415. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-LightItalic.ttf +0 -0
  416. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-Regular.ttf +0 -0
  417. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-SemiBold.ttf +0 -0
  418. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSansPro-SemiBoldItalic.ttf +0 -0
  419. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-Black.ttf +0 -0
  420. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-BlackItalic.ttf +0 -0
  421. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-Bold.ttf +0 -0
  422. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-BoldItalic.ttf +0 -0
  423. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-ExtraLight.ttf +0 -0
  424. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-ExtraLightItalic.ttf +0 -0
  425. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-Italic.ttf +0 -0
  426. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-Light.ttf +0 -0
  427. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-LightItalic.ttf +0 -0
  428. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-Regular.ttf +0 -0
  429. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-SemiBold.ttf +0 -0
  430. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/SourceSerifPro-SemiBoldItalic.ttf +0 -0
  431. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Ubuntu-Bold.ttf +0 -0
  432. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Ubuntu-BoldItalic.ttf +0 -0
  433. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Ubuntu-Italic.ttf +0 -0
  434. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Ubuntu-Light.ttf +0 -0
  435. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Ubuntu-LightItalic.ttf +0 -0
  436. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Ubuntu-Medium.ttf +0 -0
  437. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Ubuntu-MediumItalic.ttf +0 -0
  438. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/Ubuntu-Regular.ttf +0 -0
  439. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreadventor-bold.ttf +0 -0
  440. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreadventor-bolditalic.ttf +0 -0
  441. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreadventor-italic.ttf +0 -0
  442. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreadventor-regular.ttf +0 -0
  443. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrebonum-bold.ttf +0 -0
  444. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrebonum-bolditalic.ttf +0 -0
  445. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrebonum-italic.ttf +0 -0
  446. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrebonum-regular.ttf +0 -0
  447. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrechorus-mediumitalic.ttf +0 -0
  448. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrecursor-bold.ttf +0 -0
  449. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrecursor-bolditalic.ttf +0 -0
  450. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrecursor-italic.ttf +0 -0
  451. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrecursor-regular.ttf +0 -0
  452. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreheros-bold.ttf +0 -0
  453. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreheros-bolditalic.ttf +0 -0
  454. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreheros-italic.ttf +0 -0
  455. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreheros-regular.ttf +0 -0
  456. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrepagella-bold.ttf +0 -0
  457. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrepagella-bolditalic.ttf +0 -0
  458. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrepagella-italic.ttf +0 -0
  459. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyrepagella-regular.ttf +0 -0
  460. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreschola-bold.ttf +0 -0
  461. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreschola-bolditalic.ttf +0 -0
  462. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreschola-italic.ttf +0 -0
  463. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyreschola-regular.ttf +0 -0
  464. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyretermes-bold.ttf +0 -0
  465. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyretermes-bolditalic.ttf +0 -0
  466. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyretermes-italic.ttf +0 -0
  467. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/fonts/texgyretermes-regular.ttf +0 -0
  468. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/internals/benchmarks.py +0 -0
  469. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/internals/context.py +0 -0
  470. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/internals/fonts.py +0 -0
  471. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/internals/labels.py +0 -0
  472. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/internals/versions.py +0 -0
  473. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/proj.py +0 -0
  474. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/__init__.py +0 -0
  475. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_1dplots.py +0 -0
  476. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_axes_alt_styles.py +0 -0
  477. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_axes_base_colorbar_helpers.py +0 -0
  478. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_base.py +0 -0
  479. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_colorbar_helpers_extra.py +0 -0
  480. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_colormap.py +0 -0
  481. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_colormap_helpers_extra.py +0 -0
  482. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_colors.py +0 -0
  483. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_colors_helpers.py +0 -0
  484. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_config.py +0 -0
  485. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_config_helpers_extra.py +0 -0
  486. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_constructor.py +0 -0
  487. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_constructor_helpers_extra.py +0 -0
  488. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_demos.py +0 -0
  489. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_docs.py +0 -0
  490. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_docs_fetch_releases.py +0 -0
  491. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_docs_search.py +0 -0
  492. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_external_axes_container_integration.py +0 -0
  493. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_external_container_edge_cases.py +0 -0
  494. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_external_container_mocked.py +0 -0
  495. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_fonts.py +0 -0
  496. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_handlers.py +0 -0
  497. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_inputs.py +0 -0
  498. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_inputs_helpers.py +0 -0
  499. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_inset.py +0 -0
  500. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_integration.py +0 -0
  501. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_legend.py +0 -0
  502. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_plot.py +0 -0
  503. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_proj_helpers.py +0 -0
  504. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_projections.py +0 -0
  505. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_rcsetup_helpers.py +0 -0
  506. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_release_metadata.py +0 -0
  507. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_scale_helpers.py +0 -0
  508. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_semantic_legend.py +0 -0
  509. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_text_helpers.py +0 -0
  510. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_tickers.py +0 -0
  511. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/tests/test_ultralayout.py +0 -0
  512. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/text.py +0 -0
  513. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/textalign.py +0 -0
  514. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot/utils.py +0 -0
  515. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot.egg-info/dependency_links.txt +0 -0
  516. {ultraplot-2.6.0 → ultraplot-2.7.0}/ultraplot.egg-info/top_level.txt +0 -0
@@ -53,9 +53,15 @@ jobs:
53
53
  with:
54
54
  fetch-depth: 0
55
55
 
56
- - uses: mamba-org/setup-micromamba@v3.1.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.1.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.1.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:"
@@ -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.1.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!"
@@ -23,7 +23,7 @@ jobs:
23
23
  with:
24
24
  fetch-depth: 0
25
25
 
26
- - uses: mamba-org/setup-micromamba@v3.1.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,7 +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
25
28
  !docs/_static/why_plots/
29
+ !docs/_static/example_plots/
30
+ !docs/_static/example_plots/data_aware_example.svg
26
31
  *.html
27
32
  docs/gallery/
28
33
  docs/sg_execution_times.rst
@@ -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,48 +1,55 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultraplot
3
- Version: 2.6.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"
44
49
  Provides-Extra: stats
45
50
  Requires-Dist: scipy; extra == "stats"
51
+ Provides-Extra: typing
52
+ Requires-Dist: basedpyright==1.31.4; extra == "typing"
46
53
  Dynamic: license-file
47
54
 
48
55
  .. image:: https://raw.githubusercontent.com/Ultraplot/ultraplot/refs/heads/main/UltraPlotLogo.svg
@@ -151,13 +158,19 @@ UltraPlot is published on `PyPi <https://pypi.org/project/ultraplot/>`__ and
151
158
  pip install ultraplot
152
159
  conda install -c conda-forge ultraplot
153
160
 
154
- The default install includes optional features (for example, pyCirclize-based plots).
155
- For a minimal install, use ``--no-deps`` and install the core requirements:
161
+ pyCirclize-based plots require the optional ``circos`` extra:
156
162
 
157
163
  .. code-block:: bash
158
164
 
159
- pip install ultraplot --no-deps
160
- 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]'
161
174
 
162
175
  Likewise, an existing installation of UltraPlot can be upgraded
163
176
  to the latest version with:
@@ -172,6 +185,113 @@ To install a development version of UltraPlot, you can use
172
185
  or clone the repository and run ``pip install -e .``
173
186
  inside the ``ultraplot`` folder.
174
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
+
175
295
  If you use UltraPlot in your research, please cite the latest release metadata in
176
296
  ``CITATION.cff``. GitHub can export this metadata as BibTeX from the
177
297
  repository's "Cite this repository" panel, and the Zenodo badge below points to
@@ -104,13 +104,19 @@ UltraPlot is published on `PyPi <https://pypi.org/project/ultraplot/>`__ and
104
104
  pip install ultraplot
105
105
  conda install -c conda-forge ultraplot
106
106
 
107
- The default install includes optional features (for example, pyCirclize-based plots).
108
- For a minimal install, use ``--no-deps`` and install the core requirements:
107
+ pyCirclize-based plots require the optional ``circos`` extra:
109
108
 
110
109
  .. code-block:: bash
111
110
 
112
- pip install ultraplot --no-deps
113
- pip install -r requirements-minimal.txt
111
+ pip install 'ultraplot[circos]'
112
+
113
+ The ``docs`` extra also includes pyCirclize for building the documentation.
114
+
115
+ To install the ``circos``, ``docs``, and ``stats`` dependency groups together:
116
+
117
+ .. code-block:: bash
118
+
119
+ pip install 'ultraplot[all]'
114
120
 
115
121
  Likewise, an existing installation of UltraPlot can be upgraded
116
122
  to the latest version with:
@@ -125,6 +131,113 @@ To install a development version of UltraPlot, you can use
125
131
  or clone the repository and run ``pip install -e .``
126
132
  inside the ``ultraplot`` folder.
127
133
 
134
+ MCP server
135
+ ==========
136
+
137
+ UltraPlot includes a Model Context Protocol (MCP) server that lets AI assistants
138
+ search documentation and examples, inspect the live Python API, and read source
139
+ code and release notes.
140
+
141
+ Run directly with uvx
142
+ ---------------------
143
+
144
+ With `uv <https://docs.astral.sh/uv/getting-started/installation/>`__ installed,
145
+ your MCP client can launch the server with ``uvx``. uv installs the package and
146
+ its dependencies in an isolated environment automatically, so you do not need
147
+ to create a virtual environment or install UltraPlot separately.
148
+
149
+ For a PyPI release containing the MCP server, the launch command is:
150
+
151
+ .. code-block:: bash
152
+
153
+ uvx --from 'ultraplot[mcp]' ultraplot-mcp
154
+
155
+ For clients that use an ``mcpServers`` configuration, add:
156
+
157
+ .. code-block:: json
158
+
159
+ {
160
+ "mcpServers": {
161
+ "ultraplot": {
162
+ "command": "uvx",
163
+ "args": ["--from", "ultraplot[mcp]", "ultraplot-mcp"]
164
+ }
165
+ }
166
+ }
167
+
168
+ The client starts the server when needed and communicates with it over stdio.
169
+ Other clients may use a different configuration format; use the same command
170
+ and arguments. ``uvx`` is equivalent to ``uv tool run``.
171
+
172
+ Until the MCP server is released on PyPI, run it directly from the feature
173
+ branch instead:
174
+
175
+ .. code-block:: bash
176
+
177
+ uvx --from 'ultraplot[mcp] @ git+https://github.com/ultraplot/ultraplot.git@feat/mcp' ultraplot-mcp
178
+
179
+ For this development version, replace ``ultraplot[mcp]`` in the client
180
+ configuration with
181
+ ``ultraplot[mcp] @ git+https://github.com/ultraplot/ultraplot.git@feat/mcp``.
182
+
183
+ Install persistently with uv
184
+ ----------------------------
185
+
186
+ Alternatively, keep the executable on your ``PATH`` by installing it as a uv
187
+ tool. For a PyPI release containing the MCP server:
188
+
189
+ .. code-block:: bash
190
+
191
+ uv tool install 'ultraplot[mcp]'
192
+ ultraplot-mcp --help
193
+
194
+ Before that release, install from the feature branch:
195
+
196
+ .. code-block:: bash
197
+
198
+ uv tool install 'ultraplot[mcp] @ git+https://github.com/ultraplot/ultraplot.git@feat/mcp'
199
+
200
+ Then configure your client to launch ``ultraplot-mcp`` with no arguments.
201
+ If uv reports that its executable directory is missing from ``PATH``, run
202
+ ``uv tool update-shell`` and restart your shell.
203
+
204
+ Install from a checkout
205
+ -----------------------
206
+
207
+ From a checkout containing the MCP implementation, install the optional ``mcp``
208
+ extra in the Python environment you want the server to use:
209
+
210
+ .. code-block:: bash
211
+
212
+ pip install -e '.[mcp]'
213
+
214
+ Connect an MCP client
215
+ ---------------------
216
+
217
+ After installing persistently with uv or pip, register the server with an
218
+ installed Codex CLI:
219
+
220
+ .. code-block:: bash
221
+
222
+ ultraplot-mcp install codex
223
+
224
+ Restart Codex after registration. Try asking it to search the UltraPlot
225
+ examples for shared colorbars or inspect ``ultraplot.subplots``.
226
+
227
+ For other MCP clients, configure a stdio server with ``ultraplot-mcp`` as the
228
+ command and no arguments. Use the executable's absolute path if the client does
229
+ not inherit your Python environment's ``PATH``. Running ``ultraplot-mcp`` starts
230
+ the server; ``ultraplot-mcp --help`` lists the available commands.
231
+
232
+ Documentation tools read the checkout's ``docs`` directory. Direct uvx and uv
233
+ tool installations require a separate documentation checkout for these tools.
234
+ If documentation lives elsewhere, set ``ULTRAPLOT_MCP_DOCS`` to its absolute path in the MCP
235
+ client's server environment. Documentation is not currently bundled in the
236
+ Python package; API and source inspection use the installed UltraPlot version.
237
+
238
+ Citing UltraPlot
239
+ ================
240
+
128
241
  If you use UltraPlot in your research, please cite the latest release metadata in
129
242
  ``CITATION.cff``. GitHub can export this metadata as BibTeX from the
130
243
  repository's "Cite this repository" panel, and the Zenodo badge below points to