From 25693547e4af574c7c2c508ce2bd5ca1e7c911ed Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Wed, 8 Oct 2025 17:50:28 -0500 Subject: [PATCH 01/16] REL: Bump from v3.10.7 tag From c8125fe88227db007d1a2b739267ec96bc9c1cd5 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Wed, 8 Oct 2025 17:58:01 -0500 Subject: [PATCH 02/16] Zenodo v3.10.7 --- doc/_static/switcher.json | 6 +++--- doc/api/next_api_changes/development/29745-DS.rst | 4 ---- doc/project/citing.rst | 3 +++ doc/users/release_notes.rst | 2 ++ tools/cache_zenodo_svg.py | 1 + 5 files changed, 9 insertions(+), 7 deletions(-) delete mode 100644 doc/api/next_api_changes/development/29745-DS.rst diff --git a/doc/_static/switcher.json b/doc/_static/switcher.json index 2d02ec01ae56..3912afd8a17d 100644 --- a/doc/_static/switcher.json +++ b/doc/_static/switcher.json @@ -1,7 +1,7 @@ [ { "name": "3.10 (stable)", - "version": "3.10.6", + "version": "3.10.7", "url": "https://matplotlib.org/stable/", "preferred": true }, @@ -12,8 +12,8 @@ }, { "name": "3.9", - "version": "3.9.4", - "url": "https://matplotlib.org/3.9.4/" + "version": "3.9.3", + "url": "https://matplotlib.org/3.9.3/" }, { "name": "3.8", diff --git a/doc/api/next_api_changes/development/29745-DS.rst b/doc/api/next_api_changes/development/29745-DS.rst deleted file mode 100644 index 7d9b1c2b143b..000000000000 --- a/doc/api/next_api_changes/development/29745-DS.rst +++ /dev/null @@ -1,4 +0,0 @@ -New minimum version of pyparsing -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The minimum required version of ``pyparsing`` has been updated from 2.3.1 to 3.0.0. diff --git a/doc/project/citing.rst b/doc/project/citing.rst index ae2061e7349c..c5e56e6f12d4 100644 --- a/doc/project/citing.rst +++ b/doc/project/citing.rst @@ -32,6 +32,9 @@ By version .. START OF AUTOGENERATED +v3.10.7 + .. image:: ../_static/zenodo_cache/17298696.svg + :target: https://doi.org/10.5281/zenodo.17298696 v3.10.6 .. image:: ../_static/zenodo_cache/16999430.svg :target: https://doi.org/10.5281/zenodo.16999430 diff --git a/doc/users/release_notes.rst b/doc/users/release_notes.rst index 1ca483ab15a2..ea0541d5f04b 100644 --- a/doc/users/release_notes.rst +++ b/doc/users/release_notes.rst @@ -18,9 +18,11 @@ Version 3.10 :maxdepth: 1 prev_whats_new/whats_new_3.10.0.rst + ../api/prev_api_changes/api_changes_3.10.7.rst ../api/prev_api_changes/api_changes_3.10.1.rst ../api/prev_api_changes/api_changes_3.10.0.rst github_stats.rst + prev_whats_new/github_stats_3.10.6.rst prev_whats_new/github_stats_3.10.5.rst prev_whats_new/github_stats_3.10.3.rst prev_whats_new/github_stats_3.10.1.rst diff --git a/tools/cache_zenodo_svg.py b/tools/cache_zenodo_svg.py index c6783dd9f19d..07b67a3e04ee 100644 --- a/tools/cache_zenodo_svg.py +++ b/tools/cache_zenodo_svg.py @@ -63,6 +63,7 @@ def _get_xdg_cache_dir(): if __name__ == "__main__": data = { + "v3.10.7": "17298696", "v3.10.6": "16999430", "v3.10.5": "16644850", "v3.10.3": "15375714", From 1f3ab23ea727907edeb401bcf91bf24cbd2c3e2f Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Wed, 8 Oct 2025 17:59:33 -0500 Subject: [PATCH 03/16] Zenodo v3.10.7 --- doc/_static/zenodo_cache/17298696.svg | 35 +++++++++++++++++++ .../prev_api_changes/api_changes_3.10.7.rst | 10 ++++++ 2 files changed, 45 insertions(+) create mode 100644 doc/_static/zenodo_cache/17298696.svg create mode 100644 doc/api/prev_api_changes/api_changes_3.10.7.rst diff --git a/doc/_static/zenodo_cache/17298696.svg b/doc/_static/zenodo_cache/17298696.svg new file mode 100644 index 000000000000..9aa8d7c94349 --- /dev/null +++ b/doc/_static/zenodo_cache/17298696.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + DOI + + + DOI + + + 10.5281/zenodo.17298696 + + + 10.5281/zenodo.17298696 + + + \ No newline at end of file diff --git a/doc/api/prev_api_changes/api_changes_3.10.7.rst b/doc/api/prev_api_changes/api_changes_3.10.7.rst new file mode 100644 index 000000000000..16b00597bbfb --- /dev/null +++ b/doc/api/prev_api_changes/api_changes_3.10.7.rst @@ -0,0 +1,10 @@ +API Changes for 3.10.1 +====================== + +Development +----------- + +New minimum version of pyparsing +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The minimum required version of ``pyparsing`` has been updated from 2.3.1 to 3.0.0. From 6e13c086c8893d26954a2337d6ddcecd25e69566 Mon Sep 17 00:00:00 2001 From: Greg Lucas Date: Wed, 26 Mar 2025 19:57:10 -0600 Subject: [PATCH 04/16] Backport PR #29810: Declare free-threaded support in MacOS backend extension --- src/_macosx.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/_macosx.m b/src/_macosx.m index c8e2cea43863..1372157bc80d 100755 --- a/src/_macosx.m +++ b/src/_macosx.m @@ -1895,6 +1895,9 @@ - (void)flagsChanged:(NSEvent *)event Py_XDECREF(m); return NULL; } +#ifdef Py_GIL_DISABLED + PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED); +#endif return m; } From a76759397c40b09d18a13b0ea4d4d993bcbd40ee Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Wed, 22 Oct 2025 22:36:37 +0200 Subject: [PATCH 05/16] Backport PR #30672: Use pathlib.Path instead of matplotlib.path.Path in text.pyi --- lib/matplotlib/text.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/text.pyi b/lib/matplotlib/text.pyi index d65a3dc4c7da..fc1ab1c416cf 100644 --- a/lib/matplotlib/text.pyi +++ b/lib/matplotlib/text.pyi @@ -2,7 +2,7 @@ from .artist import Artist from .backend_bases import RendererBase from .font_manager import FontProperties from .offsetbox import DraggableAnnotation -from .path import Path +from pathlib import Path from .patches import FancyArrowPatch, FancyBboxPatch from .textpath import ( # noqa: F401, reexported API TextPath as TextPath, From b843483d308ce1f8bb94e1449bdb2b77da9a327c Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Tue, 21 Oct 2025 03:55:51 -0400 Subject: [PATCH 06/16] Backport PR #30657: Fix `AttributeError: module 'gi' has no attribute 'require_version'` --- lib/matplotlib/backends/backend_gtk3.py | 4 ++-- lib/matplotlib/backends/backend_gtk4.py | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/backends/backend_gtk3.py b/lib/matplotlib/backends/backend_gtk3.py index 888f5a770f5d..c27b57e36a0a 100644 --- a/lib/matplotlib/backends/backend_gtk3.py +++ b/lib/matplotlib/backends/backend_gtk3.py @@ -10,14 +10,14 @@ CloseEvent, KeyEvent, LocationEvent, MouseEvent, ResizeEvent) try: - import gi + from gi import require_version as gi_require_version except ImportError as err: raise ImportError("The GTK3 backends require PyGObject") from err try: # :raises ValueError: If module/version is already loaded, already # required, or unavailable. - gi.require_version("Gtk", "3.0") + gi_require_version("Gtk", "3.0") except ValueError as e: # in this case we want to re-raise as ImportError so the # auto-backend selection logic correctly skips. diff --git a/lib/matplotlib/backends/backend_gtk4.py b/lib/matplotlib/backends/backend_gtk4.py index cd38968779ed..e3d3548c1cd1 100644 --- a/lib/matplotlib/backends/backend_gtk4.py +++ b/lib/matplotlib/backends/backend_gtk4.py @@ -9,19 +9,20 @@ KeyEvent, LocationEvent, MouseEvent, ResizeEvent, CloseEvent) try: - import gi + from gi import require_version as gi_require_version except ImportError as err: raise ImportError("The GTK4 backends require PyGObject") from err try: # :raises ValueError: If module/version is already loaded, already # required, or unavailable. - gi.require_version("Gtk", "4.0") + gi_require_version("Gtk", "4.0") except ValueError as e: # in this case we want to re-raise as ImportError so the # auto-backend selection logic correctly skips. raise ImportError(e) from e +import gi from gi.repository import Gio, GLib, Gtk, Gdk, GdkPixbuf from . import _backend_gtk from ._backend_gtk import ( # noqa: F401 # pylint: disable=W0611 From c57123f2dc895ee24893d33724d6765769d86b85 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Mon, 27 Oct 2025 17:58:20 +0100 Subject: [PATCH 07/16] Backport PR #30687: DOC: Fix pip link --- doc/install/dependencies.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/install/dependencies.rst b/doc/install/dependencies.rst index 95d170a06b00..4a2ace7f9883 100644 --- a/doc/install/dependencies.rst +++ b/doc/install/dependencies.rst @@ -220,7 +220,7 @@ Build dependencies Python ------ -``pip`` normally builds packages using :external+pip:doc:`build isolation `, +``pip`` normally builds packages using :external+pip:doc:`build isolation `, which means that ``pip`` installs the dependencies listed here for the duration of the build process. However, build isolation is disabled via the the :external+pip:ref:`--no-build-isolation ` flag From 72a01fe0e3611402dbc73d0e1236ef5397707b11 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Mon, 27 Oct 2025 17:58:20 +0100 Subject: [PATCH 08/16] Backport PR #30687: DOC: Fix pip link --- doc/install/dependencies.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/install/dependencies.rst b/doc/install/dependencies.rst index 95d170a06b00..4a2ace7f9883 100644 --- a/doc/install/dependencies.rst +++ b/doc/install/dependencies.rst @@ -220,7 +220,7 @@ Build dependencies Python ------ -``pip`` normally builds packages using :external+pip:doc:`build isolation `, +``pip`` normally builds packages using :external+pip:doc:`build isolation `, which means that ``pip`` installs the dependencies listed here for the duration of the build process. However, build isolation is disabled via the the :external+pip:ref:`--no-build-isolation ` flag From c1feb9dbfce97114e7b837145dc44ded2df42393 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Wed, 29 Oct 2025 00:50:48 +0100 Subject: [PATCH 09/16] Backport PR #30698: BLD: update trove metadata to support py3.14 --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 25f4ce8d4948..23c441b52c9c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,6 +20,7 @@ classifiers=[ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Topic :: Scientific/Engineering :: Visualization", ] From da641b3ed334b087bf6ef226cd89f6d6bf16ac19 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Tue, 28 Oct 2025 21:05:25 -0400 Subject: [PATCH 10/16] Backport PR #30624: TST: Increase tolerances for Ghostscript 10.06 --- lib/matplotlib/tests/test_bbox_tight.py | 2 +- lib/matplotlib/tests/test_image.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/tests/test_bbox_tight.py b/lib/matplotlib/tests/test_bbox_tight.py index 7a2809931757..9965c914daa4 100644 --- a/lib/matplotlib/tests/test_bbox_tight.py +++ b/lib/matplotlib/tests/test_bbox_tight.py @@ -108,7 +108,7 @@ def test_bbox_inches_tight_clipping(): plt.gcf().artists.append(patch) -@image_comparison(['bbox_inches_tight_raster'], +@image_comparison(['bbox_inches_tight_raster'], tol=0.15, # For Ghostscript 10.06+. remove_text=True, savefig_kwarg={'bbox_inches': 'tight'}) def test_bbox_inches_tight_raster(): """Test rasterization with tight_layout""" diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py index 5373ed121560..0d1d30291328 100644 --- a/lib/matplotlib/tests/test_image.py +++ b/lib/matplotlib/tests/test_image.py @@ -37,7 +37,7 @@ def test_alpha_interp(): axr.imshow(img, interpolation="bilinear") -@image_comparison(['interp_nearest_vs_none'], +@image_comparison(['interp_nearest_vs_none'], tol=3.7, # For Ghostscript 10.06+. extensions=['pdf', 'svg'], remove_text=True) def test_interp_nearest_vs_none(): """Test the effect of "nearest" and "none" interpolation""" From 5b8e219d70f1daa443330eb6a5a6211506b37362 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 16 Nov 2024 04:22:48 -0500 Subject: [PATCH 11/16] TST: Run macosx backends in a subprocess In the macosx backend, `event_loop_is_running` returns true after `lazy_init` is called, which happens in the `new` constructor for _any_ class. This means it is "running" as soon as a figure is created, and this will block any other backend tests. --- lib/matplotlib/tests/test_backend_macosx.py | 45 +++++++++++++++------ 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/lib/matplotlib/tests/test_backend_macosx.py b/lib/matplotlib/tests/test_backend_macosx.py index 8e50ddf84024..fe4c9a6fba3c 100644 --- a/lib/matplotlib/tests/test_backend_macosx.py +++ b/lib/matplotlib/tests/test_backend_macosx.py @@ -1,18 +1,18 @@ import os +from pathlib import Path import pytest from unittest import mock import matplotlib as mpl import matplotlib.pyplot as plt -try: - from matplotlib.backends import _macosx -except ImportError: - pytest.skip("These are mac only tests", allow_module_level=True) +from matplotlib.testing import subprocess_run_helper -@pytest.mark.backend('macosx') -def test_cached_renderer(): +_test_timeout = 60 + + +def _test_cached_renderer(): # Make sure that figures have an associated renderer after # a fig.canvas.draw() call fig = plt.figure(1) @@ -24,8 +24,14 @@ def test_cached_renderer(): assert fig.canvas.get_renderer()._renderer is not None -@pytest.mark.backend('macosx') -def test_savefig_rcparam(monkeypatch, tmp_path): +@pytest.mark.backend('macosx', skip_on_importerror=True) +def test_cached_renderer(): + subprocess_run_helper(_test_cached_renderer, timeout=_test_timeout, + extra_env={"MPLBACKEND": "macosx"}) + + +def _test_savefig_rcparam(): + tmp_path = Path(os.environ["TEST_SAVEFIG_PATH"]) def new_choose_save_file(title, directory, filename): # Replacement function instead of opening a GUI window @@ -34,9 +40,10 @@ def new_choose_save_file(title, directory, filename): os.makedirs(f"{directory}/test") return f"{directory}/test/{filename}" - monkeypatch.setattr(_macosx, "choose_save_file", new_choose_save_file) fig = plt.figure() - with mpl.rc_context({"savefig.directory": tmp_path}): + with (mock.patch("matplotlib.backends._macosx.choose_save_file", + new_choose_save_file), + mpl.rc_context({"savefig.directory": tmp_path})): fig.canvas.toolbar.save_figure() # Check the saved location got created save_file = f"{tmp_path}/test/{fig.canvas.get_default_filename()}" @@ -47,14 +54,20 @@ def new_choose_save_file(title, directory, filename): assert mpl.rcParams["savefig.directory"] == f"{tmp_path}/test" -@pytest.mark.backend('macosx') +@pytest.mark.backend('macosx', skip_on_importerror=True) +def test_savefig_rcparam(tmp_path): + subprocess_run_helper( + _test_savefig_rcparam, timeout=_test_timeout, + extra_env={"MPLBACKEND": "macosx", "TEST_SAVEFIG_PATH": tmp_path}) + + +@pytest.mark.backend('macosx', skip_on_importerror=True) def test_ipython(): from matplotlib.testing import ipython_in_subprocess ipython_in_subprocess("osx", {(8, 24): "macosx", (7, 0): "MacOSX"}) -@pytest.mark.backend('macosx') -def test_save_figure_return(): +def _test_save_figure_return(): fig, ax = plt.subplots() ax.imshow([[1]]) prop = "matplotlib.backends._macosx.choose_save_file" @@ -65,3 +78,9 @@ def test_save_figure_return(): with mock.patch(prop, return_value=None): fname = fig.canvas.manager.toolbar.save_figure() assert fname is None + + +@pytest.mark.backend('macosx', skip_on_importerror=True) +def test_save_figure_return(): + subprocess_run_helper(_test_save_figure_return, timeout=_test_timeout, + extra_env={"MPLBACKEND": "macosx"}) From 134000ba19a4354da2ad1084627039e05c936754 Mon Sep 17 00:00:00 2001 From: Greg Lucas Date: Fri, 31 Oct 2025 06:09:02 -0600 Subject: [PATCH 12/16] Merge pull request #30697 from ngoldbaum/fix-plotting-on-worker-threads BUG: raise when creating a MacOS FigureManager outside the main thread (cherry picked from commit 94def4ee50ce92ce96461f269e0c79c188588610) --- lib/matplotlib/tests/test_backend_macosx.py | 23 +++++++++++++++++++++ src/_macosx.m | 10 +++++++++ 2 files changed, 33 insertions(+) diff --git a/lib/matplotlib/tests/test_backend_macosx.py b/lib/matplotlib/tests/test_backend_macosx.py index fe4c9a6fba3c..0648e43cde94 100644 --- a/lib/matplotlib/tests/test_backend_macosx.py +++ b/lib/matplotlib/tests/test_backend_macosx.py @@ -1,4 +1,5 @@ import os +import threading from pathlib import Path import pytest @@ -84,3 +85,25 @@ def _test_save_figure_return(): def test_save_figure_return(): subprocess_run_helper(_test_save_figure_return, timeout=_test_timeout, extra_env={"MPLBACKEND": "macosx"}) + + +def _test_create_figure_on_worker_thread_fails(): + def create_figure(): + warn_msg = "Matplotlib GUI outside of the main thread will likely fail." + err_msg = "Cannot create a GUI FigureManager outside the main thread" + with pytest.warns(UserWarning, match=warn_msg): + with pytest.raises(RuntimeError, match=err_msg): + plt.gcf() + + worker = threading.Thread(target=create_figure) + worker.start() + worker.join() + + +@pytest.mark.backend('macosx', skip_on_importerror=True) +def test_create_figure_on_worker_thread_fails(): + subprocess_run_helper( + _test_create_figure_on_worker_thread_fails, + timeout=_test_timeout, + extra_env={"MPLBACKEND": "macosx"} + ) diff --git a/src/_macosx.m b/src/_macosx.m index 1372157bc80d..fcc221cf6fd5 100755 --- a/src/_macosx.m +++ b/src/_macosx.m @@ -580,6 +580,16 @@ bool mpl_check_modifier(bool present, PyObject* list, char const* name) static PyObject* FigureManager_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { + if (![NSThread isMainThread]) { + PyErr_SetString( + PyExc_RuntimeError, + "Cannot create a GUI FigureManager outside the main thread " + "using the MacOS backend. Use a non-interactive " + "backend like 'agg' to make plots on worker threads." + ); + return NULL; + } + lazy_init(); Window* window = [Window alloc]; if (!window) { return NULL; } From d300769285e2c920804134e40ec83837eabe16d8 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sun, 2 Nov 2025 15:49:16 +0100 Subject: [PATCH 13/16] Backport PR #30714: FIX: Gracefully handle numpy arrays as input to check_in_list() --- lib/matplotlib/_api/__init__.py | 16 +++++++++++++++- lib/matplotlib/tests/test_api.py | 5 +++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/_api/__init__.py b/lib/matplotlib/_api/__init__.py index 22b58b62ff8e..1fc1aeb49e8f 100644 --- a/lib/matplotlib/_api/__init__.py +++ b/lib/matplotlib/_api/__init__.py @@ -106,6 +106,9 @@ def check_in_list(values, /, *, _print_supported_values=True, **kwargs): ---------- values : iterable Sequence of values to check on. + + Note: All values must support == comparisons. + This means in particular the entries must not be numpy arrays. _print_supported_values : bool, default: True Whether to print *values* when raising ValueError. **kwargs : dict @@ -123,7 +126,18 @@ def check_in_list(values, /, *, _print_supported_values=True, **kwargs): if not kwargs: raise TypeError("No argument to check!") for key, val in kwargs.items(): - if val not in values: + try: + exists = val in values + except ValueError: + # `in` internally uses `val == values[i]`. There are some objects + # that do not support == to arbitrary other objects, in particular + # numpy arrays. + # Since such objects are not allowed in values, we can gracefully + # handle the case that val (typically provided by users) is of such + # type and directly state it's not in the list instead of letting + # the individual `val == values[i]` ValueError surface. + exists = False + if not exists: msg = f"{val!r} is not a valid value for {key}" if _print_supported_values: msg += f"; supported values are {', '.join(map(repr, values))}" diff --git a/lib/matplotlib/tests/test_api.py b/lib/matplotlib/tests/test_api.py index f04604c14cce..81b7f9cdc96c 100644 --- a/lib/matplotlib/tests/test_api.py +++ b/lib/matplotlib/tests/test_api.py @@ -150,3 +150,8 @@ def f() -> None: def test_empty_check_in_list() -> None: with pytest.raises(TypeError, match="No argument to check!"): _api.check_in_list(["a"]) + + +def test_check_in_list_numpy() -> None: + with pytest.raises(ValueError, match=r"array\(5\) is not a valid value"): + _api.check_in_list(['a', 'b'], value=np.array(5)) From 86b38d3f29aa2af2ddcbd1895433117caa0fba47 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Wed, 12 Nov 2025 19:45:06 -0600 Subject: [PATCH 14/16] Github stats v3.10.8 --- doc/users/github_stats.rst | 55 +++++++------- .../prev_whats_new/github_stats_3.10.7.rst | 74 +++++++++++++++++++ 2 files changed, 103 insertions(+), 26 deletions(-) create mode 100644 doc/users/prev_whats_new/github_stats_3.10.7.rst diff --git a/doc/users/github_stats.rst b/doc/users/github_stats.rst index c40bedb4cb5b..8d93759ac756 100644 --- a/doc/users/github_stats.rst +++ b/doc/users/github_stats.rst @@ -1,19 +1,18 @@ .. _github-stats: -GitHub statistics for 3.10.7 (Oct 08, 2025) +GitHub statistics for 3.10.8 (Nov 12, 2025) =========================================== -GitHub statistics for 2024/12/14 (tag: v3.10.0) - 2025/10/08 +GitHub statistics for 2024/12/14 (tag: v3.10.0) - 2025/11/12 These lists are automatically generated, and may be incomplete or contain duplicates. We closed 4 issues and merged 16 pull requests. -The full list can be seen `on GitHub `__ +The full list can be seen `on GitHub `__ -The following 32 authors contributed 422 commits. +The following 35 authors contributed 445 commits. * Aasma Gupta -* AASMA GUPTA * Antony Lee * Christine P. Chai * David Stansby @@ -22,6 +21,7 @@ The following 32 authors contributed 422 commits. * G.D. McBain * Greg Lucas * hannah +* heinrich5991 * hu-xiaonan * Ian Thomas * Inês Cachola @@ -29,19 +29,22 @@ The following 32 authors contributed 422 commits. * Jouni K. Seppänen * Khushi_29 * Kyle Sunden +* Lucas Gruwez * Lumberbot (aka Jack) * N R Navaneet * Nathan G. Wiseman +* Nathan Goldbaum +* Nick Coish * Oscar Gustafsson * Praful Gulani * Qian Zhang +* Rafael Katri * Raphael Erik Hviding * Roman * Ruth Comer * saikarna913 * Scott Shambaugh * Thomas A Caswell -* Tim Heap * Tim Hoffmann * Trygve Magnus Ræder @@ -49,29 +52,29 @@ GitHub issues and pull requests: Pull Requests (16): -* :ghpull:`30628`: Backport PR #30626 on branch v3.10.x (MNT: Fix new F401 unused imports warnings) -* :ghpull:`30626`: MNT: Fix new F401 unused imports warnings -* :ghpull:`30589`: Backport PR #29745: Use PEP8 style method and function names from -* :ghpull:`30614`: Backport PR #30612 on branch v3.10.x (MNT: update black pin) -* :ghpull:`30612`: MNT: update black pin -* :ghpull:`30572`: Backport PR #30571 on branch v3.10.x (CI: remove macos13) -* :ghpull:`30571`: CI: remove macos13 -* :ghpull:`30570`: Backport PR #30558 on branch v3.10.x (Fix stubtest with mypy 18) -* :ghpull:`30558`: Fix stubtest with mypy 18 -* :ghpull:`30540`: Backport PR #30539 on branch v3.10.x (Fix scale_unit/scale_units typo in quiver docs) -* :ghpull:`30539`: Fix scale_unit/scale_units typo in quiver docs -* :ghpull:`30518`: Backport PR #30497 on branch v3.10.x (TST: Use a temporary directory for test_save_figure_return) -* :ghpull:`30497`: TST: Use a temporary directory for test_save_figure_return -* :ghpull:`30506`: Backport PR #30490 on branch v3.10.x (Fix SVG rendering error in def update_background) -* :ghpull:`30490`: Fix SVG rendering error in def update_background -* :ghpull:`30494`: Backport PR #30492 on branch v3.10.x (DOC: pytz link should be from PyPI) +* :ghpull:`30717`: Backport PR #30714 on branch v3.10.x (FIX: Gracefully handle numpy arrays as input to check_in_list()) +* :ghpull:`30714`: FIX: Gracefully handle numpy arrays as input to check_in_list() +* :ghpull:`30560`: Consistent zoom boxes +* :ghpull:`30711`: Backport PR #30697 on branch v3.10.x (BUG: raise when creating a MacOS FigureManager outside the main thread) +* :ghpull:`30697`: BUG: raise when creating a MacOS FigureManager outside the main thread +* :ghpull:`30656`: Backport PR #29810 on branch v3.10.x (Declare free-threaded support in MacOS backend extension) +* :ghpull:`30702`: Backport PR #30624 on branch v3.10.x (TST: Increase tolerances for Ghostscript 10.06) +* :ghpull:`30700`: Backport PR #30698 on branch v3.10.x (BLD: update trove metadata to support py3.14) +* :ghpull:`30624`: TST: Increase tolerances for Ghostscript 10.06 +* :ghpull:`30698`: BLD: update trove metadata to support py3.14 +* :ghpull:`30688`: Backport PR #30687 on branch v3.10.x (DOC: Fix pip link) +* :ghpull:`30675`: Backport PR #30657 on branch v3.10.x (Fix AttributeError: module 'gi' has no attribute 'require_version') +* :ghpull:`30674`: Backport PR #30672 on branch v3.10.x (Use pathlib.Path instead of matplotlib.path.Path in text.pyi) +* :ghpull:`30672`: Use pathlib.Path instead of matplotlib.path.Path in text.pyi +* :ghpull:`30657`: Fix ``AttributeError: module 'gi' has no attribute 'require_version'`` +* :ghpull:`29810`: Declare free-threaded support in MacOS backend extension Issues (4): -* :ghissue:`30611`: [MNT]: black version -* :ghissue:`30551`: [Bug]: Mypy stubtest failure on disjoint_base -* :ghissue:`30493`: [Bug]: test_save_figure_return seems flaky -* :ghissue:`30485`: [Bug]: figures with SpanSelector(..., useblit=True) can't be saved to SVG or PDF +* :ghissue:`30706`: [Bug]: Axes.grouped_bar() with non-string orientation (e.g., NumPy array) raises ambiguous truth-value error instead of clean ValueError +* :ghissue:`30666`: [Bug]: calling pyplot.gca() outside the main thread crashes the interpreter with the MacOS backend +* :ghissue:`30669`: [Bug]: Type hint for fontproperties keyword in text.pyi is wrong +* :ghissue:`30654`: [Bug]: error plotting: AttributeError: module 'gi' has no attribute 'require_version' Previous GitHub statistics diff --git a/doc/users/prev_whats_new/github_stats_3.10.7.rst b/doc/users/prev_whats_new/github_stats_3.10.7.rst new file mode 100644 index 000000000000..8c12e4050219 --- /dev/null +++ b/doc/users/prev_whats_new/github_stats_3.10.7.rst @@ -0,0 +1,74 @@ +.. _github-stats_3-10-7: + +GitHub statistics for 3.10.7 (Oct 08, 2025) +=========================================== + +GitHub statistics for 2024/12/14 (tag: v3.10.0) - 2025/10/08 + +These lists are automatically generated, and may be incomplete or contain duplicates. + +We closed 4 issues and merged 16 pull requests. +The full list can be seen `on GitHub `__ + +The following 32 authors contributed 422 commits. + +* Aasma Gupta +* AASMA GUPTA +* Antony Lee +* Christine P. Chai +* David Stansby +* dependabot[bot] +* Elliott Sales de Andrade +* G.D. McBain +* Greg Lucas +* hannah +* hu-xiaonan +* Ian Thomas +* Inês Cachola +* Jody Klymak +* Jouni K. Seppänen +* Khushi_29 +* Kyle Sunden +* Lumberbot (aka Jack) +* N R Navaneet +* Nathan G. Wiseman +* Oscar Gustafsson +* Praful Gulani +* Qian Zhang +* Raphael Erik Hviding +* Roman +* Ruth Comer +* saikarna913 +* Scott Shambaugh +* Thomas A Caswell +* Tim Heap +* Tim Hoffmann +* Trygve Magnus Ræder + +GitHub issues and pull requests: + +Pull Requests (16): + +* :ghpull:`30628`: Backport PR #30626 on branch v3.10.x (MNT: Fix new F401 unused imports warnings) +* :ghpull:`30626`: MNT: Fix new F401 unused imports warnings +* :ghpull:`30589`: Backport PR #29745: Use PEP8 style method and function names from +* :ghpull:`30614`: Backport PR #30612 on branch v3.10.x (MNT: update black pin) +* :ghpull:`30612`: MNT: update black pin +* :ghpull:`30572`: Backport PR #30571 on branch v3.10.x (CI: remove macos13) +* :ghpull:`30571`: CI: remove macos13 +* :ghpull:`30570`: Backport PR #30558 on branch v3.10.x (Fix stubtest with mypy 18) +* :ghpull:`30558`: Fix stubtest with mypy 18 +* :ghpull:`30540`: Backport PR #30539 on branch v3.10.x (Fix scale_unit/scale_units typo in quiver docs) +* :ghpull:`30539`: Fix scale_unit/scale_units typo in quiver docs +* :ghpull:`30518`: Backport PR #30497 on branch v3.10.x (TST: Use a temporary directory for test_save_figure_return) +* :ghpull:`30497`: TST: Use a temporary directory for test_save_figure_return +* :ghpull:`30506`: Backport PR #30490 on branch v3.10.x (Fix SVG rendering error in def update_background) +* :ghpull:`30490`: Fix SVG rendering error in def update_background +* :ghpull:`30494`: Backport PR #30492 on branch v3.10.x (DOC: pytz link should be from PyPI) + +Issues (4): + +* :ghissue:`30611`: [MNT]: black version +* :ghissue:`30551`: [Bug]: Mypy stubtest failure on disjoint_base +* :ghissue:`30493`: [Bug]: test_save_figure_return seems flaky +* :ghissue:`30485`: [Bug]: figures with SpanSelector(..., useblit=True) can't be saved to SVG or PDF From 0b9ebb35f8310f22eb7f932b2ae14befb1f40b6f Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Wed, 12 Nov 2025 19:49:57 -0600 Subject: [PATCH 15/16] Doc release prep v3.10.8 --- doc/_static/switcher.json | 2 +- doc/users/release_notes.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/_static/switcher.json b/doc/_static/switcher.json index 3912afd8a17d..36e743db21b8 100644 --- a/doc/_static/switcher.json +++ b/doc/_static/switcher.json @@ -1,7 +1,7 @@ [ { "name": "3.10 (stable)", - "version": "3.10.7", + "version": "3.10.8", "url": "https://matplotlib.org/stable/", "preferred": true }, diff --git a/doc/users/release_notes.rst b/doc/users/release_notes.rst index ea0541d5f04b..dbdcd61437ac 100644 --- a/doc/users/release_notes.rst +++ b/doc/users/release_notes.rst @@ -22,6 +22,7 @@ Version 3.10 ../api/prev_api_changes/api_changes_3.10.1.rst ../api/prev_api_changes/api_changes_3.10.0.rst github_stats.rst + prev_whats_new/github_stats_3.10.7.rst prev_whats_new/github_stats_3.10.6.rst prev_whats_new/github_stats_3.10.5.rst prev_whats_new/github_stats_3.10.3.rst From 1392cbe3c79cdb93f9282747841d648770f60249 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Wed, 12 Nov 2025 20:07:31 -0600 Subject: [PATCH 16/16] REL: v3.10.8 This is a bugfix release in the 3.10.x series. The primary highlights of this release are: - Properly allow freethreaded mode in the MacOS backend - Better error handling for MacOS backend