ultraplot 2.1.9__tar.gz → 2.3.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.
- {ultraplot-2.1.9 → ultraplot-2.3.0}/.github/workflows/main.yml +1 -1
- {ultraplot-2.1.9 → ultraplot-2.3.0}/.github/workflows/publish-pypi.yml +50 -51
- {ultraplot-2.1.9 → ultraplot-2.3.0}/.pre-commit-config.yaml +1 -1
- {ultraplot-2.1.9/ultraplot.egg-info → ultraplot-2.3.0}/PKG-INFO +2 -2
- ultraplot-2.3.0/docs/_scripts/fetch_releases.py +154 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/_static/custom.css +38 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/_static/custom.js +127 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/colorbars_legends.py +56 -2
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/contributing.rst +33 -0
- ultraplot-2.3.0/docs/examples/legend_types/01_semantic_legends.py +5 -0
- ultraplot-2.3.0/docs/examples/legends_colorbars/03_semantic_legends.py +233 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/environment.yml +2 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/pyproject.toml +1 -1
- {ultraplot-2.1.9 → ultraplot-2.3.0}/tools/release/publish_zenodo.py +53 -2
- ultraplot-2.3.0/ultraplot/_version.py +1 -0
- ultraplot-2.3.0/ultraplot/axes/_formatting.py +102 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/axes/base.py +247 -70
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/axes/cartesian.py +178 -20
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/axes/geo.py +133 -73
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/axes/plot.py +27 -4
- ultraplot-2.3.0/ultraplot/axes/polar.py +747 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/axes/shared.py +40 -26
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/colors.py +0 -1
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/config.py +63 -5
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/figure.py +551 -83
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/gridspec.py +36 -4
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/internals/__init__.py +1 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/internals/docstring.py +1 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/internals/inputs.py +1 -1
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/internals/labels.py +29 -3
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/legend.py +426 -176
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_1dplots.py +18 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_animation.py +49 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_axes.py +42 -8
- ultraplot-2.3.0/ultraplot/tests/test_axes_alt_styles.py +256 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_colorbar.py +308 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_config_helpers_extra.py +15 -0
- ultraplot-2.3.0/ultraplot/tests/test_docs_fetch_releases.py +172 -0
- ultraplot-2.3.0/ultraplot/tests/test_docs_search.py +119 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_figure.py +50 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_geographic.py +29 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_inputs_helpers.py +22 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_legend.py +97 -0
- ultraplot-2.3.0/ultraplot/tests/test_projections.py +536 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_release_metadata.py +6 -8
- ultraplot-2.3.0/ultraplot/tests/test_semantic_legend.py +544 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_subplots.py +62 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/text.py +47 -4
- {ultraplot-2.1.9 → ultraplot-2.3.0/ultraplot.egg-info}/PKG-INFO +2 -2
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot.egg-info/SOURCES.txt +6 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot.egg-info/requires.txt +1 -1
- ultraplot-2.1.9/docs/_scripts/fetch_releases.py +0 -139
- ultraplot-2.1.9/docs/examples/legends_colorbars/03_semantic_legends.py +0 -108
- ultraplot-2.1.9/ultraplot/_version.py +0 -1
- ultraplot-2.1.9/ultraplot/axes/polar.py +0 -392
- ultraplot-2.1.9/ultraplot/tests/test_projections.py +0 -212
- {ultraplot-2.1.9 → ultraplot-2.3.0}/.github/ISSUE_TEMPLATE.md +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/.github/dependabot.yml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/.github/micromamba-condarc.yml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/.github/workflows/build-ultraplot.yml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/.github/workflows/test-map.yml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/.gitignore +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/.readthedocs.yml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/CITATION.cff +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/CODEOFCONDUCT.md +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/CONTRIBUTING.rst +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/INSTALL.rst +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/LICENSE.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/README.rst +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/UltraPlotLogo.svg +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/codecov.yml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/1dplots.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/2dplots.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/Makefile +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/_ext/notoc.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/_static/example_plots/cartesian_example.svg +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/_static/example_plots/colorbars_legends_example.svg +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/_static/example_plots/colormaps_example.svg +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/_static/example_plots/panels_example.svg +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/_static/example_plots/projection_example.svg +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/_static/example_plots/subplot_example.svg +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/_static/logo_blank.svg +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/_static/logo_long.png +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/_static/logo_long.svg +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/_static/logo_social.png +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/_static/logo_social.svg +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/_static/logo_square.png +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/_templates/whatsnew_sidebar.html +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/about.rst +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/api.rst +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/basics.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/cartesian.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/colormaps.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/colors.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/conf.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/configuration.rst +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/cycles.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/README.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/colors/01_cycle_colormap.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/colors/02_diverging_colormap.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/colors/README.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/geo/01_robin_tracks.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/geo/02_orthographic_views.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/geo/03_projections_features.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/geo/04_choropleth.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/geo/README.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/layouts/01_shared_axes_abc.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/layouts/02_complex_layout_insets.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/layouts/03_spanning_labels.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/layouts/README.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/legends_colorbars/01_multi_colorbars.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/legends_colorbars/02_legend_inset_colorbar.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/legends_colorbars/README.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/plot_types/01_curved_quiver.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/plot_types/02_network_graph.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/plot_types/03_lollipop.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/plot_types/04_datetime_series.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/plot_types/05_box_violin.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/plot_types/06_ridge_plot.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/plot_types/07_radar.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/plot_types/07_sankey.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/plot_types/08_chord_diagram.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/plot_types/08_ternary.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/plot_types/09_phylogeny.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/plot_types/10_circos_bed.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/plot_types/11_topic_ribbon.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/examples/plot_types/README.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/external-links.rst +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/faq.rst +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/fonts.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/index.rst +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/insets_panels.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/install.rst +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/lazy_loading.rst +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/make.bat +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/networks.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/projections.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/requirements-rtd.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/sphinxext/custom_roles.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/sphinxext/jupytext_cache.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/stats.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/subplots.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/ultraplotrc +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/usage.rst +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/docs/why.rst +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/logo/PermanentMarker-Regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/logo/environment-logo.yml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/logo/logo.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/logo/run-linter.sh +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/logo/webicon.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/logo/whyUltraPlot.svg +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/noxfile.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/requirements-minimal.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/setup.cfg +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/tools/ci/build_test_map.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/tools/ci/select_tests.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/tools/ci/version_support.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/tools/release/sync_citation.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/__init__.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/_lazy.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/axes/__init__.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/axes/container.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/axes/plot_types/__init__.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/axes/plot_types/circlize.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/axes/plot_types/curved_quiver.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/axes/plot_types/ribbon.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/axes/plot_types/sankey.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/axes/three.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Algae.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Amp.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/BR.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Balance.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Blues1_r.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Blues2.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Blues3.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Blues4_r.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Blues5.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Blues6.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Blues7.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Blues8.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Blues9.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Boreal.json +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Browns1.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Browns2.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Browns3.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Browns4.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Browns5.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Browns6.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Browns7.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Browns8.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Browns9.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/ColdHot.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Crest.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Curl.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Deep.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Delta.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Dense.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Div.json +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/DryWet.json +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Dusk.json +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Fire.json +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Flare.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Glacial.json +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Greens1_r.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Greens2.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Greens3_r.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Greens4.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Greens5.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Greens6_r.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Greens7.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Greens8.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Haline.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Ice.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/IceFire.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Mako.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Marine.json +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Matter.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Mono.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/MonoCycle.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/NegPos.json +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Oranges1.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Oranges2.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Oranges3.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Oranges4.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Oxy.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Phase.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Purples1_r.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Purples2.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Purples3.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Reds1.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Reds2.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Reds3.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Reds4.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Reds5.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Rocket.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Solar.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Speed.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Stellar.json +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Sunrise.json +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Sunset.json +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Tempo.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Thermal.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Turbid.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Vivid.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Vlag.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Yellows1.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Yellows2.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Yellows3.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/Yellows4.xml +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/acton.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/bam.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/bamO.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/bamako.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/batlow.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/batlowK.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/batlowW.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/berlin.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/bilbao.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/broc.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/brocO.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/buda.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/bukavu.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/cork.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/corkO.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/davos.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/devon.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/fes.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/hawaii.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/imola.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/lajolla.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/lapaz.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/lisbon.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/nuuk.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/oleron.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/oslo.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/roma.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/romaO.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/tofino.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/tokyo.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/turku.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/vanimo.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/vik.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cmaps/vikO.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/colorbar.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/colors/opencolor.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/colors/xkcd.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/constructor.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cycles/538.hex +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cycles/FlatUI.hex +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cycles/Qual1.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cycles/Qual2.rgb +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cycles/bmh.hex +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cycles/classic.hex +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cycles/colorblind.hex +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cycles/colorblind10.hex +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cycles/default.hex +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cycles/ggplot.hex +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cycles/seaborn.hex +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/cycles/tableau.hex +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/demos.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/externals/__init__.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/externals/hsluv.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraMath-Bold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraMath-ExtraLight.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraMath-Heavy.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraMath-Light.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraMath-Medium.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraMath-Regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraMath-SemiBold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraMath-UltraLight.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraSans-Black.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraSans-BlackItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraSans-Bold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraSans-BoldItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraSans-ExtraBold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraSans-ExtraBoldItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraSans-ExtraLight.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraSans-ExtraLightItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraSans-Italic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraSans-Light.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraSans-LightItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraSans-Medium.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraSans-MediumItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraSans-Regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraSans-SemiBold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/FiraSans-SemiBoldItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/LICENSE_FIRAMATH.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/LICENSE_FIRASANS.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/LICENSE_NOTOSANS.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/LICENSE_NOTOSERIF.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/LICENSE_OPENSANS.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/LICENSE_ROBOTO.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/LICENSE_SOURCESANS.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/LICENSE_SOURCESERIF.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/LICENSE_TEXGYRE.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/LICENSE_UBUNTU.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/NotoSans-Bold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/NotoSans-BoldItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/NotoSans-Italic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/NotoSans-Regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/NotoSerif-Bold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/NotoSerif-BoldItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/NotoSerif-Italic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/NotoSerif-Regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/OpenSans-Bold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/OpenSans-BoldItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/OpenSans-Italic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/OpenSans-Regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/OpenSans-Semibold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/OpenSans-SemiboldItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Roboto-Black.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Roboto-BlackItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Roboto-Bold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Roboto-BoldItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Roboto-Italic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Roboto-Light.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Roboto-LightItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Roboto-Medium.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Roboto-MediumItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Roboto-Regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSansPro-Black.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSansPro-BlackItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSansPro-Bold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSansPro-BoldItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSansPro-ExtraLight.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSansPro-ExtraLightItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSansPro-Italic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSansPro-Light.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSansPro-LightItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSansPro-Regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSansPro-SemiBold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSansPro-SemiBoldItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSerifPro-Black.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSerifPro-BlackItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSerifPro-Bold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSerifPro-BoldItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSerifPro-ExtraLight.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSerifPro-ExtraLightItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSerifPro-Italic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSerifPro-Light.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSerifPro-LightItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSerifPro-Regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSerifPro-SemiBold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/SourceSerifPro-SemiBoldItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Ubuntu-Bold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Ubuntu-BoldItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Ubuntu-Italic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Ubuntu-Light.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Ubuntu-LightItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Ubuntu-Medium.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Ubuntu-MediumItalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/Ubuntu-Regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyreadventor-bold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyreadventor-bolditalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyreadventor-italic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyreadventor-regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyrebonum-bold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyrebonum-bolditalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyrebonum-italic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyrebonum-regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyrechorus-mediumitalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyrecursor-bold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyrecursor-bolditalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyrecursor-italic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyrecursor-regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyreheros-bold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyreheros-bolditalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyreheros-italic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyreheros-regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyrepagella-bold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyrepagella-bolditalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyrepagella-italic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyrepagella-regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyreschola-bold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyreschola-bolditalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyreschola-italic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyreschola-regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyretermes-bold.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyretermes-bolditalic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyretermes-italic.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/fonts/texgyretermes-regular.ttf +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/internals/benchmarks.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/internals/context.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/internals/fonts.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/internals/guides.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/internals/rcsetup.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/internals/versions.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/internals/warnings.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/proj.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/scale.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/__init__.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/conftest.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_2dplots.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_axes_base_colorbar_helpers.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_base.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_circlize_integration.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_colorbar_helpers_extra.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_colormap.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_colormap_helpers_extra.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_colors.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_colors_helpers.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_config.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_constructor.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_constructor_helpers_extra.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_core_versions.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_demos.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_docs.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_external_axes_container_integration.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_external_container_edge_cases.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_external_container_mocked.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_fonts.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_format.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_gridspec.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_handlers.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_imports.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_imshow.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_inputs.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_inset.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_integration.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_plot.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_proj_helpers.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_rcsetup_helpers.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_scale_helpers.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_statistical_plotting.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_text_helpers.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_tickers.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/tests/test_ultralayout.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/ticker.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/ui.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/ultralayout.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot/utils.py +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot.egg-info/dependency_links.txt +0 -0
- {ultraplot-2.1.9 → ultraplot-2.3.0}/ultraplot.egg-info/top_level.txt +0 -0
|
@@ -9,7 +9,7 @@ jobs:
|
|
|
9
9
|
run-if-changes:
|
|
10
10
|
runs-on: ubuntu-latest
|
|
11
11
|
outputs:
|
|
12
|
-
run: ${{
|
|
12
|
+
run: ${{ github.event_name == 'push' && 'true' || steps.filter.outputs.python }}
|
|
13
13
|
steps:
|
|
14
14
|
- uses: actions/checkout@v6
|
|
15
15
|
- uses: dorny/paths-filter@v4
|
|
@@ -3,8 +3,7 @@ name: Publish to PyPI
|
|
|
3
3
|
on:
|
|
4
4
|
pull_request:
|
|
5
5
|
push:
|
|
6
|
-
tags:
|
|
7
|
-
- "v*"
|
|
6
|
+
tags: ["v*"]
|
|
8
7
|
|
|
9
8
|
concurrency:
|
|
10
9
|
group: publish-pypi-${{ github.sha }}
|
|
@@ -131,55 +130,55 @@ jobs:
|
|
|
131
130
|
contents: write
|
|
132
131
|
steps:
|
|
133
132
|
- name: Create GitHub release
|
|
134
|
-
uses: softprops/action-gh-release@
|
|
133
|
+
uses: softprops/action-gh-release@v3
|
|
135
134
|
with:
|
|
136
135
|
generate_release_notes: true
|
|
137
136
|
|
|
138
|
-
publish-zenodo:
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
137
|
+
# publish-zenodo:
|
|
138
|
+
# name: Publish Zenodo release
|
|
139
|
+
# needs: publish-github-release
|
|
140
|
+
# runs-on: ubuntu-latest
|
|
141
|
+
# if: github.event_name == 'push'
|
|
142
|
+
# permissions:
|
|
143
|
+
# contents: read
|
|
144
|
+
# env:
|
|
145
|
+
# ZENODO_ACCESS_TOKEN: ${{ secrets.ZENODO_ACCESS_TOKEN }}
|
|
146
|
+
# steps:
|
|
147
|
+
# - uses: actions/checkout@v6
|
|
148
|
+
# with:
|
|
149
|
+
# fetch-depth: 0
|
|
150
|
+
#
|
|
151
|
+
# - uses: actions/setup-python@v6
|
|
152
|
+
# with:
|
|
153
|
+
# python-version: "3.12"
|
|
154
|
+
#
|
|
155
|
+
# - name: Install release tooling
|
|
156
|
+
# run: |
|
|
157
|
+
# python -m pip install --upgrade pip
|
|
158
|
+
# python -m pip install PyYAML
|
|
159
|
+
# shell: bash
|
|
160
|
+
#
|
|
161
|
+
# - name: Download artifacts
|
|
162
|
+
# uses: actions/download-artifact@v8
|
|
163
|
+
# with:
|
|
164
|
+
# name: dist-${{ github.sha }}-${{ github.run_id }}-${{ github.run_number }}
|
|
165
|
+
# path: dist
|
|
166
|
+
#
|
|
167
|
+
# - name: Generate release citation metadata
|
|
168
|
+
# run: |
|
|
169
|
+
# python tools/release/sync_citation.py \
|
|
170
|
+
# --tag "${GITHUB_REF_NAME}" \
|
|
171
|
+
# --output "${RUNNER_TEMP}/CITATION.cff"
|
|
172
|
+
# shell: bash
|
|
173
|
+
#
|
|
174
|
+
# - name: Check tree stayed clean
|
|
175
|
+
# run: |
|
|
176
|
+
# git diff --quiet || (git status --short && git diff && exit 1)
|
|
177
|
+
# shell: bash
|
|
178
|
+
#
|
|
179
|
+
# - name: Publish to Zenodo
|
|
180
|
+
# run: |
|
|
181
|
+
# python tools/release/publish_zenodo.py \
|
|
182
|
+
# --dist-dir dist \
|
|
183
|
+
# --citation-file "${RUNNER_TEMP}/CITATION.cff"
|
|
184
|
+
# shell: bash
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ultraplot
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.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>
|
|
@@ -29,7 +29,7 @@ Provides-Extra: docs
|
|
|
29
29
|
Requires-Dist: jupyter; extra == "docs"
|
|
30
30
|
Requires-Dist: jupytext; extra == "docs"
|
|
31
31
|
Requires-Dist: lxml-html-clean; extra == "docs"
|
|
32
|
-
Requires-Dist:
|
|
32
|
+
Requires-Dist: markdown; extra == "docs"
|
|
33
33
|
Requires-Dist: mpltern; extra == "docs"
|
|
34
34
|
Requires-Dist: nbsphinx; extra == "docs"
|
|
35
35
|
Requires-Dist: sphinx; extra == "docs"
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Dynamically build the "What's new?" page from the GitHub releases feed.
|
|
3
|
+
|
|
4
|
+
The release notes on GitHub are written in Markdown and frequently mix raw
|
|
5
|
+
HTML (``<details><summary>`` blocks wrapping fenced code samples). The
|
|
6
|
+
previous implementation converted the body to RST via ``m2r2``, which left
|
|
7
|
+
the inner Markdown code fences inside ``.. raw:: html`` directives — Sphinx
|
|
8
|
+
then rendered them as literal text. This module instead converts each
|
|
9
|
+
release body to HTML (so fences become ``<pre><code>`` elements) and emits
|
|
10
|
+
a single ``.. raw:: html`` block per release wrapped in a styling hook
|
|
11
|
+
``div.uplt-whats-new-release-body``.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import re
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Iterable
|
|
19
|
+
|
|
20
|
+
import markdown
|
|
21
|
+
import requests
|
|
22
|
+
|
|
23
|
+
GITHUB_REPO = "ultraplot/ultraplot"
|
|
24
|
+
OUTPUT_RST = Path("whats_new.rst")
|
|
25
|
+
GITHUB_API_URL = f"https://api.github.com/repos/{GITHUB_REPO}/releases"
|
|
26
|
+
|
|
27
|
+
# Markdown extensions: fenced code (for ```python blocks), tables, attribute
|
|
28
|
+
# lists for class hooks, and md_in_html so block-level HTML such as
|
|
29
|
+
# ``<details>`` correctly contains parsed Markdown children.
|
|
30
|
+
_MD_EXTENSIONS = ("fenced_code", "tables", "attr_list", "md_in_html")
|
|
31
|
+
|
|
32
|
+
# Strip the trailing "by @user in PR_URL" attribution that GitHub auto-adds
|
|
33
|
+
# to release notes. Keep the PR link in parentheses so credit/traceability
|
|
34
|
+
# remains while removing the contributor handles from rendered output.
|
|
35
|
+
# GitHub author handles can include ``[bot]`` suffixes (``@dependabot[bot]``,
|
|
36
|
+
# ``@pre-commit-ci[bot]``); ``\w`` alone misses the brackets.
|
|
37
|
+
_PR_ATTRIBUTION = re.compile(
|
|
38
|
+
r" by @[\w.\-]+(?:\[bot\])? in (https://github\.com/[^\s]+)"
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
# Match an ATX heading line, tolerating up-to-3 leading spaces. Authors
|
|
42
|
+
# occasionally indent whole sections by two spaces in the GitHub release
|
|
43
|
+
# editor (e.g. v2.0.1's "### Layout, Rendering, and Geo Improvements"),
|
|
44
|
+
# which python-markdown then parses as a paragraph rather than a heading.
|
|
45
|
+
# We capture the ``#`` run so we can both strip the indent and downgrade
|
|
46
|
+
# one level — the page already provides the H1 ("What's new?") and each
|
|
47
|
+
# release contributes a per-release RST H2, so body headings start at H2.
|
|
48
|
+
_ATX_HEADING = re.compile(r"^[ ]{0,3}(#{1,5})(?=\s)", flags=re.MULTILINE)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _strip_pr_attribution(text: str) -> str:
|
|
52
|
+
return _PR_ATTRIBUTION.sub(r" (\1)", text)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _downgrade_headings(text: str) -> str:
|
|
56
|
+
"""Demote every Markdown ATX heading by one level (``#`` → ``##``, etc.)."""
|
|
57
|
+
return _ATX_HEADING.sub(lambda m: "#" + m.group(1), text)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _normalize_unicode(text: str) -> str:
|
|
61
|
+
return text.replace("→", "->")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _indent_html(html: str, indent: str = " ") -> str:
|
|
65
|
+
"""Indent every line of ``html`` by ``indent`` for inclusion under ``.. raw:: html``."""
|
|
66
|
+
return "\n".join(indent + line if line else line for line in html.splitlines())
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def format_release_body(text: str) -> str:
|
|
70
|
+
"""
|
|
71
|
+
Convert a GitHub release body (Markdown + embedded HTML) into an RST
|
|
72
|
+
``.. raw:: html`` block wrapped in ``div.uplt-whats-new-release-body``.
|
|
73
|
+
|
|
74
|
+
Parameters
|
|
75
|
+
----------
|
|
76
|
+
text : str
|
|
77
|
+
Raw Markdown release body as returned by the GitHub releases API.
|
|
78
|
+
|
|
79
|
+
Returns
|
|
80
|
+
-------
|
|
81
|
+
str
|
|
82
|
+
Indented RST snippet ready to be appended to ``whats_new.rst``.
|
|
83
|
+
"""
|
|
84
|
+
cleaned = _downgrade_headings(
|
|
85
|
+
_normalize_unicode(_strip_pr_attribution(text or ""))
|
|
86
|
+
).strip()
|
|
87
|
+
html_body = markdown.markdown(cleaned, extensions=list(_MD_EXTENSIONS))
|
|
88
|
+
wrapped = f'<div class="uplt-whats-new-release-body">\n{html_body}\n</div>'
|
|
89
|
+
return ".. raw:: html\n\n" + _indent_html(wrapped) + "\n"
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _format_release_title(release: dict) -> str:
|
|
93
|
+
"""
|
|
94
|
+
Build the per-release section title in ``"<tag>: <name>"`` form,
|
|
95
|
+
de-duplicating the tag if it is already a prefix of the release name.
|
|
96
|
+
"""
|
|
97
|
+
tag = release["tag_name"].lower()
|
|
98
|
+
title = (release.get("name") or "").strip()
|
|
99
|
+
if title.lower().startswith(tag):
|
|
100
|
+
title = title[len(tag) :].lstrip(" :-—–")
|
|
101
|
+
return f"{tag}: {title}" if title else tag
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def fetch_all_releases() -> list[dict]:
|
|
105
|
+
"""Fetch every GitHub release across paginated responses."""
|
|
106
|
+
releases: list[dict] = []
|
|
107
|
+
page = 1
|
|
108
|
+
while True:
|
|
109
|
+
response = requests.get(GITHUB_API_URL, params={"per_page": 30, "page": page})
|
|
110
|
+
if response.status_code != 200:
|
|
111
|
+
print(f"Error fetching releases: {response.status_code}")
|
|
112
|
+
break
|
|
113
|
+
page_data = response.json()
|
|
114
|
+
if not page_data:
|
|
115
|
+
break
|
|
116
|
+
releases.extend(page_data)
|
|
117
|
+
page += 1
|
|
118
|
+
return releases
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _render_releases(releases: Iterable[dict]) -> str:
|
|
122
|
+
"""Render an iterable of release dicts to the full ``whats_new.rst`` body."""
|
|
123
|
+
header = "What's new?"
|
|
124
|
+
out = f".. _whats_new:\n\n{header}\n{'=' * len(header)}\n\n"
|
|
125
|
+
for release in releases:
|
|
126
|
+
title = _format_release_title(release)
|
|
127
|
+
date = release["published_at"][:10]
|
|
128
|
+
heading = f"{title} ({date})"
|
|
129
|
+
out += f"{heading}\n{'-' * len(heading)}\n\n"
|
|
130
|
+
out += format_release_body(release.get("body") or "") + "\n"
|
|
131
|
+
return out
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def fetch_releases() -> str:
|
|
135
|
+
"""Fetch the latest releases from GitHub and format them as RST."""
|
|
136
|
+
releases = fetch_all_releases()
|
|
137
|
+
if not releases:
|
|
138
|
+
print("Error fetching releases!")
|
|
139
|
+
return ""
|
|
140
|
+
return _render_releases(releases)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def write_rst() -> None:
|
|
144
|
+
"""Write fetched releases to ``whats_new.rst``."""
|
|
145
|
+
content = fetch_releases()
|
|
146
|
+
if content:
|
|
147
|
+
OUTPUT_RST.write_text(content, encoding="utf-8")
|
|
148
|
+
print(f"Updated {OUTPUT_RST}")
|
|
149
|
+
else:
|
|
150
|
+
print("No updates to write.")
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
if __name__ == "__main__":
|
|
154
|
+
write_rst()
|
|
@@ -1212,3 +1212,41 @@ body.wy-body-for-nav
|
|
|
1212
1212
|
border-radius: 0.2rem;
|
|
1213
1213
|
background: var(--uplt-color-sidebar-bg);
|
|
1214
1214
|
}
|
|
1215
|
+
|
|
1216
|
+
/* What's-new release bodies generated by docs/_scripts/fetch_releases.py.
|
|
1217
|
+
Each release is emitted inside a <div class="uplt-whats-new-release-body">
|
|
1218
|
+
so we have a single styling hook for spacing, code-block padding, and the
|
|
1219
|
+
<details> snippet affordance. */
|
|
1220
|
+
.uplt-whats-new-release-body {
|
|
1221
|
+
margin-top: 0.5rem;
|
|
1222
|
+
margin-bottom: 1.5rem;
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
.uplt-whats-new-release-body h2,
|
|
1226
|
+
.uplt-whats-new-release-body h3,
|
|
1227
|
+
.uplt-whats-new-release-body h4 {
|
|
1228
|
+
margin-top: 1.25rem;
|
|
1229
|
+
margin-bottom: 0.5rem;
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
.uplt-whats-new-release-body details {
|
|
1233
|
+
margin: 0.5rem 0 1rem;
|
|
1234
|
+
padding: 0.25rem 0.75rem;
|
|
1235
|
+
border: 1px solid var(--uplt-color-sidebar-bg, #e5e7eb);
|
|
1236
|
+
border-radius: 0.35rem;
|
|
1237
|
+
background: var(--uplt-color-sidebar-bg, #f9fafb);
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1240
|
+
.uplt-whats-new-release-body details > summary {
|
|
1241
|
+
cursor: pointer;
|
|
1242
|
+
font-weight: 600;
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
.uplt-whats-new-release-body pre {
|
|
1246
|
+
overflow-x: auto;
|
|
1247
|
+
}
|
|
1248
|
+
|
|
1249
|
+
.uplt-whats-new-release-body img {
|
|
1250
|
+
max-width: 100%;
|
|
1251
|
+
height: auto;
|
|
1252
|
+
}
|
|
@@ -329,7 +329,134 @@ function initShibuyaRightToc() {
|
|
|
329
329
|
syncRightTocCodeButtons(localtoc);
|
|
330
330
|
}
|
|
331
331
|
|
|
332
|
+
const upltApiSearchGenericTerms = new Set([
|
|
333
|
+
"api",
|
|
334
|
+
"apis",
|
|
335
|
+
"attribute",
|
|
336
|
+
"attributes",
|
|
337
|
+
"class",
|
|
338
|
+
"classes",
|
|
339
|
+
"doc",
|
|
340
|
+
"docs",
|
|
341
|
+
"documentation",
|
|
342
|
+
"function",
|
|
343
|
+
"functions",
|
|
344
|
+
"method",
|
|
345
|
+
"methods",
|
|
346
|
+
"object",
|
|
347
|
+
"objects",
|
|
348
|
+
"reference",
|
|
349
|
+
"references",
|
|
350
|
+
]);
|
|
351
|
+
|
|
352
|
+
function normalizeApiSearchTerm(term) {
|
|
353
|
+
return String(term || "")
|
|
354
|
+
.toLowerCase()
|
|
355
|
+
.replace(/\(\)$/, "")
|
|
356
|
+
.trim();
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function isGenericApiSearchTerm(term) {
|
|
360
|
+
return upltApiSearchGenericTerms.has(normalizeApiSearchTerm(term));
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
function getApiSearchTerms(terms) {
|
|
364
|
+
if (terms instanceof Set) {
|
|
365
|
+
return Array.from(terms);
|
|
366
|
+
}
|
|
367
|
+
return Array.from(terms || []);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
function apiSearchResultMatchesQueryTerm(title, anchor, terms) {
|
|
371
|
+
const haystack = `${title || ""} ${anchor || ""}`.toLowerCase();
|
|
372
|
+
const leaf = haystack.split("#").pop().split(".").pop();
|
|
373
|
+
return getApiSearchTerms(terms).some((term) => {
|
|
374
|
+
const normalized = normalizeApiSearchTerm(term);
|
|
375
|
+
if (!normalized || isGenericApiSearchTerm(normalized)) return false;
|
|
376
|
+
return (
|
|
377
|
+
leaf === normalized ||
|
|
378
|
+
leaf.includes(normalized) ||
|
|
379
|
+
haystack.includes("." + normalized)
|
|
380
|
+
);
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
function initApiSearchScoring() {
|
|
385
|
+
if (typeof Search === "undefined" || typeof Scorer === "undefined") return;
|
|
386
|
+
if (Search.upltApiSearchScoring === "1") return;
|
|
387
|
+
|
|
388
|
+
const previousParseQuery = Search._parseQuery;
|
|
389
|
+
if (typeof previousParseQuery === "function") {
|
|
390
|
+
Search._parseQuery = function (query) {
|
|
391
|
+
const parsed = previousParseQuery.call(this, query);
|
|
392
|
+
const queryTerms = new Set(
|
|
393
|
+
getApiSearchTerms(parsed && parsed[4])
|
|
394
|
+
.map(normalizeApiSearchTerm)
|
|
395
|
+
.filter(Boolean),
|
|
396
|
+
);
|
|
397
|
+
Search.upltQueryTerms = queryTerms;
|
|
398
|
+
Search.upltApiLikeQuery =
|
|
399
|
+
/[.()]/.test(query || "") ||
|
|
400
|
+
getApiSearchTerms(queryTerms).some(isGenericApiSearchTerm);
|
|
401
|
+
return parsed;
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
const previousObjectSearch = Search.performObjectSearch;
|
|
406
|
+
if (typeof previousObjectSearch === "function") {
|
|
407
|
+
Search.performObjectSearch = function (object, objectTerms) {
|
|
408
|
+
const normalizedObject = normalizeApiSearchTerm(object);
|
|
409
|
+
const filteredTerms = new Set(
|
|
410
|
+
getApiSearchTerms(objectTerms)
|
|
411
|
+
.map(normalizeApiSearchTerm)
|
|
412
|
+
.filter((term) => term && !isGenericApiSearchTerm(term)),
|
|
413
|
+
);
|
|
414
|
+
if (normalizedObject && !isGenericApiSearchTerm(normalizedObject)) {
|
|
415
|
+
filteredTerms.add(normalizedObject);
|
|
416
|
+
}
|
|
417
|
+
return previousObjectSearch.call(this, object, filteredTerms);
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
const previousScore = Scorer.score;
|
|
422
|
+
Scorer.score = function (result) {
|
|
423
|
+
let score =
|
|
424
|
+
typeof previousScore === "function" ? previousScore(result) : result[4];
|
|
425
|
+
if (!Number.isFinite(score)) {
|
|
426
|
+
score = Number.isFinite(result[4]) ? result[4] : 0;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
const [docname, title, anchor, descr, _baseScore, _filename, kind] = result;
|
|
430
|
+
const isApiReference = String(docname || "").startsWith("api/");
|
|
431
|
+
const isApiLikeQuery = !!Search.upltApiLikeQuery;
|
|
432
|
+
const queryTerms = Search.upltQueryTerms || new Set();
|
|
433
|
+
|
|
434
|
+
if (isApiReference && kind === "object") {
|
|
435
|
+
score += 24;
|
|
436
|
+
if (isApiLikeQuery) score += 16;
|
|
437
|
+
if (apiSearchResultMatchesQueryTerm(title, anchor, queryTerms)) {
|
|
438
|
+
score += 12;
|
|
439
|
+
}
|
|
440
|
+
if (
|
|
441
|
+
queryTerms.has("function") &&
|
|
442
|
+
String(descr || "").toLowerCase().includes("python function")
|
|
443
|
+
) {
|
|
444
|
+
score += 4;
|
|
445
|
+
}
|
|
446
|
+
} else if (isApiReference && isApiLikeQuery) {
|
|
447
|
+
score += kind === "title" || kind === "index" ? 12 : 8;
|
|
448
|
+
} else if (!isApiReference && isApiLikeQuery) {
|
|
449
|
+
score -= 4;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
return score;
|
|
453
|
+
};
|
|
454
|
+
|
|
455
|
+
Search.upltApiSearchScoring = "1";
|
|
456
|
+
}
|
|
457
|
+
|
|
332
458
|
document.addEventListener("DOMContentLoaded", function () {
|
|
459
|
+
initApiSearchScoring();
|
|
333
460
|
initScrollChromeFade();
|
|
334
461
|
|
|
335
462
|
if (document.querySelector(".sphx-glr-thumbcontainer")) {
|
|
@@ -477,13 +477,19 @@ axs.format(xlabel="xlabel", ylabel="ylabel", suptitle="Legend formatting demo")
|
|
|
477
477
|
#
|
|
478
478
|
# Legends usually annotate artists already drawn on an axes, but sometimes you need
|
|
479
479
|
# standalone semantic keys (categories, size scales, color levels, or geometry types).
|
|
480
|
-
# UltraPlot provides helper methods that build these entries directly
|
|
480
|
+
# UltraPlot provides helper methods that build these entries directly on both
|
|
481
|
+
# axes and figures:
|
|
481
482
|
#
|
|
482
483
|
# * :meth:`~ultraplot.axes.Axes.entrylegend`
|
|
483
484
|
# * :meth:`~ultraplot.axes.Axes.catlegend`
|
|
484
485
|
# * :meth:`~ultraplot.axes.Axes.sizelegend`
|
|
485
486
|
# * :meth:`~ultraplot.axes.Axes.numlegend`
|
|
486
487
|
# * :meth:`~ultraplot.axes.Axes.geolegend`
|
|
488
|
+
# * :meth:`~ultraplot.figure.Figure.entrylegend`
|
|
489
|
+
# * :meth:`~ultraplot.figure.Figure.catlegend`
|
|
490
|
+
# * :meth:`~ultraplot.figure.Figure.sizelegend`
|
|
491
|
+
# * :meth:`~ultraplot.figure.Figure.numlegend`
|
|
492
|
+
# * :meth:`~ultraplot.figure.Figure.geolegend`
|
|
487
493
|
#
|
|
488
494
|
# These helpers are useful whenever the legend should describe an encoding rather than
|
|
489
495
|
# mirror artists that already happen to be drawn. In practice there are two distinct
|
|
@@ -513,7 +519,8 @@ axs.format(xlabel="xlabel", ylabel="ylabel", suptitle="Legend formatting demo")
|
|
|
513
519
|
#
|
|
514
520
|
# The helpers are intentionally composable. Each one accepts ``add=False`` and returns
|
|
515
521
|
# ``(handles, labels)`` so you can merge semantic sections and pass the result through
|
|
516
|
-
# :meth:`~ultraplot.axes.Axes.legend`
|
|
522
|
+
# :meth:`~ultraplot.axes.Axes.legend` or :meth:`~ultraplot.figure.Figure.legend`
|
|
523
|
+
# yourself.
|
|
517
524
|
#
|
|
518
525
|
# .. code-block:: python
|
|
519
526
|
#
|
|
@@ -568,6 +575,27 @@ axs.format(xlabel="xlabel", ylabel="ylabel", suptitle="Legend formatting demo")
|
|
|
568
575
|
#
|
|
569
576
|
# .. code-block:: python
|
|
570
577
|
#
|
|
578
|
+
# # Add semantic legends around an entire subplot group.
|
|
579
|
+
# fig, axs = uplt.subplots(ncols=2)
|
|
580
|
+
# fig.catlegend(
|
|
581
|
+
# ["Control", "Treatment"],
|
|
582
|
+
# colors={"Control": "blue7", "Treatment": "red7"},
|
|
583
|
+
# markers={"Control": "o", "Treatment": "^"},
|
|
584
|
+
# ref=axs,
|
|
585
|
+
# loc="b",
|
|
586
|
+
# title="Group",
|
|
587
|
+
# )
|
|
588
|
+
# fig.sizelegend(
|
|
589
|
+
# [10, 50, 200],
|
|
590
|
+
# labels=["Small", "Medium", "Large"],
|
|
591
|
+
# color="gray6",
|
|
592
|
+
# ref=axs,
|
|
593
|
+
# loc="r",
|
|
594
|
+
# title="Population",
|
|
595
|
+
# )
|
|
596
|
+
#
|
|
597
|
+
# .. code-block:: python
|
|
598
|
+
#
|
|
571
599
|
# # Compose multiple semantic helpers into one legend.
|
|
572
600
|
# size_handles, size_labels = ax.sizelegend(
|
|
573
601
|
# [10, 50, 200],
|
|
@@ -685,6 +713,32 @@ ax.geolegend(
|
|
|
685
713
|
ax.axis("off")
|
|
686
714
|
|
|
687
715
|
|
|
716
|
+
# %%
|
|
717
|
+
fig, axs = uplt.subplots(ncols=2, refwidth=2.8, share=False)
|
|
718
|
+
axs[0].scatter([0, 1, 2], [3, 1, 2], c=[0.2, 0.5, 0.8], s=[40, 120, 260])
|
|
719
|
+
axs[1].scatter([0, 1, 2], [2, 3, 1], c=[0.8, 0.4, 0.1], s=[60, 90, 220])
|
|
720
|
+
axs.format(title="Figure semantic legend helpers", grid=False)
|
|
721
|
+
|
|
722
|
+
fig.catlegend(
|
|
723
|
+
["Control", "Treatment"],
|
|
724
|
+
colors={"Control": "blue7", "Treatment": "red7"},
|
|
725
|
+
markers={"Control": "o", "Treatment": "^"},
|
|
726
|
+
ref=axs,
|
|
727
|
+
loc="bottom",
|
|
728
|
+
title="Group",
|
|
729
|
+
frameon=False,
|
|
730
|
+
)
|
|
731
|
+
fig.sizelegend(
|
|
732
|
+
[40, 120, 260],
|
|
733
|
+
labels=["Small", "Medium", "Large"],
|
|
734
|
+
color="gray6",
|
|
735
|
+
ref=axs,
|
|
736
|
+
loc="right",
|
|
737
|
+
title="Size scale",
|
|
738
|
+
frameon=False,
|
|
739
|
+
)
|
|
740
|
+
|
|
741
|
+
|
|
688
742
|
# %% [raw] raw_mimetype="text/restructuredtext"
|
|
689
743
|
# .. _ug_guides_decouple:
|
|
690
744
|
#
|
|
@@ -241,6 +241,39 @@ Note that you can create the pull request before you're finished with your
|
|
|
241
241
|
feature addition or bug fix. The PR will update as you add more commits. UltraPlot
|
|
242
242
|
developers and contributors can then review your code and offer suggestions.
|
|
243
243
|
|
|
244
|
+
.. _contrib_ai:
|
|
245
|
+
|
|
246
|
+
AI policy
|
|
247
|
+
=========
|
|
248
|
+
|
|
249
|
+
UltraPlot welcomes contributions from developers at all skill levels, including
|
|
250
|
+
those who use AI tools as part of their workflow. To keep contributions
|
|
251
|
+
meaningful and to help new contributors genuinely learn the codebase, we ask
|
|
252
|
+
that you follow these guidelines.
|
|
253
|
+
|
|
254
|
+
**Good first issues must be written by humans.**
|
|
255
|
+
Issues labelled *good first issue* are intentionally kept for people who want
|
|
256
|
+
to get familiar with the backend. These issues should be scoped, described, and
|
|
257
|
+
solved by a human — not generated or resolved wholesale by an AI assistant.
|
|
258
|
+
Working through them yourself is how you build the mental model of the code
|
|
259
|
+
that makes future contributions easier.
|
|
260
|
+
|
|
261
|
+
**AI-assisted contributions are welcome for other issues**, provided that:
|
|
262
|
+
|
|
263
|
+
* You understand and can explain every change you submit. Maintainers may ask
|
|
264
|
+
questions during review; if you cannot answer them the PR will be closed.
|
|
265
|
+
* You disclose AI assistance in the PR description (a one-line note is fine).
|
|
266
|
+
* The code meets the same quality bar as any other contribution — correct,
|
|
267
|
+
tested, and consistent with the existing style.
|
|
268
|
+
|
|
269
|
+
**AI must not be used to bulk-generate issues, comments, or spam.**
|
|
270
|
+
Automated issue creation or low-effort AI-generated content will be removed and
|
|
271
|
+
may result in being blocked from the repository.
|
|
272
|
+
|
|
273
|
+
The spirit of this policy is simple: AI is a tool, not a substitute for
|
|
274
|
+
understanding. We want contributions that improve UltraPlot *and* grow the
|
|
275
|
+
contributor.
|
|
276
|
+
|
|
244
277
|
.. _contrib_release:
|
|
245
278
|
|
|
246
279
|
Release procedure
|