diff --git a/0001-matplotlibrc-path-search-fix.patch b/0001-matplotlibrc-path-search-fix.patch index 09d5ebd..97b781c 100644 --- a/0001-matplotlibrc-path-search-fix.patch +++ b/0001-matplotlibrc-path-search-fix.patch @@ -1,7 +1,7 @@ From e5fc2dc6299a3965fae77246f088a10633e6ba03 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 27 Sep 2017 19:35:59 -0400 -Subject: [PATCH 1/5] matplotlibrc path search fix +Subject: [PATCH 1/8] matplotlibrc path search fix Signed-off-by: Elliott Sales de Andrade --- @@ -39,5 +39,5 @@ index b279c46516..27de76f0c4 100644 for fname in gen_candidates(): -- -2.39.2 +2.41.0 diff --git a/0002-Don-t-require-oldest-supported-numpy.patch b/0002-Don-t-require-oldest-supported-numpy.patch index 2654876..bec6306 100644 --- a/0002-Don-t-require-oldest-supported-numpy.patch +++ b/0002-Don-t-require-oldest-supported-numpy.patch @@ -1,7 +1,7 @@ From 42ccc6269120bea873873e3479f549b30004680b Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Thu, 26 Jan 2023 06:40:06 -0500 -Subject: [PATCH 2/5] Don't require oldest-supported-numpy +Subject: [PATCH 2/8] Don't require oldest-supported-numpy Signed-off-by: Elliott Sales de Andrade --- @@ -22,5 +22,5 @@ index 907b05a39b..81e3d80035 100644 "setuptools_scm>=7", ] -- -2.39.2 +2.41.0 diff --git a/0003-Set-FreeType-version-to-2.12.1-and-update-tolerances.patch b/0003-Set-FreeType-version-to-2.12.1-and-update-tolerances.patch index 841eaad..847c166 100644 --- a/0003-Set-FreeType-version-to-2.12.1-and-update-tolerances.patch +++ b/0003-Set-FreeType-version-to-2.12.1-and-update-tolerances.patch @@ -1,7 +1,7 @@ From c00966e628018f2b1edc103c2c24e4296a6f24e3 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Fri, 14 Feb 2020 06:05:42 -0500 -Subject: [PATCH 3/5] Set FreeType version to 2.12.1 and update tolerances +Subject: [PATCH 3/8] Set FreeType version to 2.12.1 and update tolerances Signed-off-by: Elliott Sales de Andrade --- @@ -174,5 +174,5 @@ index a898d642d6..26cd6fe277 100644 def do_custom_build(self, env): # We're using a system freetype -- -2.39.2 +2.41.0 diff --git a/0004-Use-old-stride_windows-implementation-on-32-bit-x86.patch b/0004-Use-old-stride_windows-implementation-on-32-bit-x86.patch index bdaadf5..2c582fe 100644 --- a/0004-Use-old-stride_windows-implementation-on-32-bit-x86.patch +++ b/0004-Use-old-stride_windows-implementation-on-32-bit-x86.patch @@ -1,7 +1,7 @@ From c00da95dde370d3b04c0134cd10674d226830c67 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Mon, 22 Aug 2022 18:43:28 -0400 -Subject: [PATCH 4/5] Use old stride_windows implementation on 32-bit x86 +Subject: [PATCH 4/8] Use old stride_windows implementation on 32-bit x86 Signed-off-by: Elliott Sales de Andrade --- @@ -32,5 +32,5 @@ index 059cf0f162..943eb18e6f 100644 raise ValueError('noverlap must be less than n') return np.lib.stride_tricks.sliding_window_view( -- -2.39.2 +2.41.0 diff --git a/0006-migrate-from-utcfromtimestamp-to-fromtimestamp-25918.patch b/0006-migrate-from-utcfromtimestamp-to-fromtimestamp-25918.patch new file mode 100644 index 0000000..3b9c5d2 --- /dev/null +++ b/0006-migrate-from-utcfromtimestamp-to-fromtimestamp-25918.patch @@ -0,0 +1,105 @@ +From c6282abd0b354707755e6f10881a67ed08c82614 Mon Sep 17 00:00:00 2001 +From: Smeet nagda <81572407+smeet07@users.noreply.github.com> +Date: Tue, 23 May 2023 18:26:07 +0530 +Subject: [PATCH 6/8] migrate from utcfromtimestamp to fromtimestamp (#25918) + +closes #25912 + +Signed-off-by: Elliott Sales de Andrade +--- + doc/api/prev_api_changes/api_changes_3.7.0/removals.rst | 2 +- + doc/conf.py | 5 +++-- + lib/matplotlib/backends/backend_pdf.py | 3 ++- + lib/matplotlib/backends/backend_ps.py | 5 +++-- + lib/matplotlib/backends/backend_svg.py | 2 +- + 5 files changed, 10 insertions(+), 7 deletions(-) + +diff --git a/doc/api/prev_api_changes/api_changes_3.7.0/removals.rst b/doc/api/prev_api_changes/api_changes_3.7.0/removals.rst +index c8f4996665..76ce9ff718 100644 +--- a/doc/api/prev_api_changes/api_changes_3.7.0/removals.rst ++++ b/doc/api/prev_api_changes/api_changes_3.7.0/removals.rst +@@ -7,7 +7,7 @@ Removals + These methods convert from unix timestamps to matplotlib floats, but are not + used internally to Matplotlib, and should not be needed by end users. To + convert a unix timestamp to datetime, simply use +-`datetime.datetime.utcfromtimestamp`, or to use NumPy `~numpy.datetime64` ++`datetime.datetime.fromtimestamp`, or to use NumPy `~numpy.datetime64` + ``dt = np.datetime64(e*1e6, 'us')``. + + Locator and Formatter wrapper methods +diff --git a/doc/conf.py b/doc/conf.py +index acb36254db..eecd1957fb 100644 +--- a/doc/conf.py ++++ b/doc/conf.py +@@ -22,6 +22,7 @@ import warnings + + import matplotlib + ++from datetime import timezone + from datetime import datetime + import time + +@@ -36,8 +37,8 @@ CIRCLECI = 'CIRCLECI' in os.environ + + # Parse year using SOURCE_DATE_EPOCH, falling back to current time. + # https://reproducible-builds.org/specs/source-date-epoch/ +-sourceyear = datetime.utcfromtimestamp( +- int(os.environ.get('SOURCE_DATE_EPOCH', time.time()))).year ++sourceyear = datetime.fromtimestamp( ++ int(os.environ.get('SOURCE_DATE_EPOCH', time.time())), timezone.utc).year + + # If your extensions are in another directory, add it here. If the directory + # is relative to the documentation root, use os.path.abspath to make it +diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py +index 7bd0afc456..bbbca64c7a 100644 +--- a/lib/matplotlib/backends/backend_pdf.py ++++ b/lib/matplotlib/backends/backend_pdf.py +@@ -5,6 +5,7 @@ Author: Jouni K Seppänen and others. + """ + + import codecs ++from datetime import timezone + from datetime import datetime + from enum import Enum + from functools import total_ordering +@@ -153,7 +154,7 @@ def _create_pdf_info_dict(backend, metadata): + # See https://reproducible-builds.org/specs/source-date-epoch/ + source_date_epoch = os.getenv("SOURCE_DATE_EPOCH") + if source_date_epoch: +- source_date = datetime.utcfromtimestamp(int(source_date_epoch)) ++ source_date = datetime.fromtimestamp(int(source_date_epoch), timezone.utc) + source_date = source_date.replace(tzinfo=UTC) + else: + source_date = datetime.today() +diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py +index 68dd61e6f1..75ed4ff557 100644 +--- a/lib/matplotlib/backends/backend_ps.py ++++ b/lib/matplotlib/backends/backend_ps.py +@@ -841,8 +841,9 @@ class FigureCanvasPS(FigureCanvasBase): + # See https://reproducible-builds.org/specs/source-date-epoch/ + source_date_epoch = os.getenv("SOURCE_DATE_EPOCH") + dsc_comments["CreationDate"] = ( +- datetime.datetime.utcfromtimestamp( +- int(source_date_epoch)).strftime("%a %b %d %H:%M:%S %Y") ++ datetime.datetime.fromtimestamp( ++ int(source_date_epoch), ++ datetime.timezone.utc).strftime("%a %b %d %H:%M:%S %Y") + if source_date_epoch + else time.ctime()) + dsc_comments = "\n".join( +diff --git a/lib/matplotlib/backends/backend_svg.py b/lib/matplotlib/backends/backend_svg.py +index df39e620f8..4a6c1bb426 100644 +--- a/lib/matplotlib/backends/backend_svg.py ++++ b/lib/matplotlib/backends/backend_svg.py +@@ -410,7 +410,7 @@ class RendererSVG(RendererBase): + # See https://reproducible-builds.org/specs/source-date-epoch/ + date = os.getenv("SOURCE_DATE_EPOCH") + if date: +- date = datetime.datetime.utcfromtimestamp(int(date)) ++ date = datetime.datetime.fromtimestamp(int(date), datetime.timezone.utc) + metadata['Date'] = date.replace(tzinfo=UTC).isoformat() + else: + metadata['Date'] = datetime.datetime.today().isoformat() +-- +2.41.0 + diff --git a/0007-MNT-py312-deprecates-pickling-objects-in-itertools.patch b/0007-MNT-py312-deprecates-pickling-objects-in-itertools.patch new file mode 100644 index 0000000..7d0a238 --- /dev/null +++ b/0007-MNT-py312-deprecates-pickling-objects-in-itertools.patch @@ -0,0 +1,79 @@ +From adc9461c316b5e6f693d362140bf5483aa77ad81 Mon Sep 17 00:00:00 2001 +From: Thomas A Caswell +Date: Mon, 19 Jun 2023 21:28:02 -0400 +Subject: [PATCH 7/8] MNT: py312 deprecates pickling objects in itertools + +Signed-off-by: Elliott Sales de Andrade +--- + lib/matplotlib/cbook/__init__.py | 3 +++ + lib/matplotlib/figure.py | 11 +++++++++++ + lib/matplotlib/tests/test_cbook.py | 7 +++++++ + 3 files changed, 21 insertions(+) + +diff --git a/lib/matplotlib/cbook/__init__.py b/lib/matplotlib/cbook/__init__.py +index 1e51f6a834..b0d06cddf6 100644 +--- a/lib/matplotlib/cbook/__init__.py ++++ b/lib/matplotlib/cbook/__init__.py +@@ -206,9 +206,11 @@ class CallbackRegistry: + for s, d in self.callbacks.items()}, + # It is simpler to reconstruct this from callbacks in __setstate__. + "_func_cid_map": None, ++ "_cid_gen": next(self._cid_gen) + } + + def __setstate__(self, state): ++ cid_count = state.pop('_cid_gen') + vars(self).update(state) + self.callbacks = { + s: {cid: _weak_or_strong_ref(func, self._remove_proxy) +@@ -217,6 +219,7 @@ class CallbackRegistry: + self._func_cid_map = { + s: {proxy: cid for cid, proxy in d.items()} + for s, d in self.callbacks.items()} ++ self._cid_gen = itertools.count(cid_count) + + def connect(self, signal, func): + """Register *func* to be called when signal *signal* is generated.""" +diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py +index c6df929e04..b64c677b5d 100644 +--- a/lib/matplotlib/figure.py ++++ b/lib/matplotlib/figure.py +@@ -106,6 +106,17 @@ class _AxesStack: + """Return the active axes, or None if the stack is empty.""" + return max(self._axes, key=self._axes.__getitem__, default=None) + ++ def __getstate__(self): ++ return { ++ **vars(self), ++ "_counter": max(self._axes.values(), default=0) ++ } ++ ++ def __setstate__(self, state): ++ next_counter = state.pop('_counter') ++ vars(self).update(state) ++ self._counter = itertools.count(next_counter) ++ + + class SubplotParams: + """ +diff --git a/lib/matplotlib/tests/test_cbook.py b/lib/matplotlib/tests/test_cbook.py +index aa5c999b70..da3868b0f8 100644 +--- a/lib/matplotlib/tests/test_cbook.py ++++ b/lib/matplotlib/tests/test_cbook.py +@@ -207,6 +207,13 @@ class Test_callback_registry: + assert self.callbacks._func_cid_map != {} + assert self.callbacks.callbacks != {} + ++ def test_cid_restore(self): ++ cb = cbook.CallbackRegistry() ++ cb.connect('a', lambda: None) ++ cb2 = pickle.loads(pickle.dumps(cb)) ++ cid = cb2.connect('c', lambda: None) ++ assert cid == 1 ++ + @pytest.mark.parametrize('pickle', [True, False]) + def test_callback_complete(self, pickle): + # ensure we start with an empty registry +-- +2.41.0 + diff --git a/0008-Avoid-Py_VerboseFlag-deprecation-from-Python-3.12.patch b/0008-Avoid-Py_VerboseFlag-deprecation-from-Python-3.12.patch new file mode 100644 index 0000000..58e323c --- /dev/null +++ b/0008-Avoid-Py_VerboseFlag-deprecation-from-Python-3.12.patch @@ -0,0 +1,79 @@ +From a74988db693861d86c85a1307d51b9017af3c33e Mon Sep 17 00:00:00 2001 +From: Elliott Sales de Andrade +Date: Wed, 21 Jun 2023 22:14:27 -0400 +Subject: [PATCH 8/8] Avoid Py_VerboseFlag deprecation from Python 3.12 + +Signed-off-by: Elliott Sales de Andrade +--- + lib/matplotlib/tri/_triangulation.py | 4 +++- + src/_qhull_wrapper.cpp | 12 ++++++++---- + 2 files changed, 11 insertions(+), 5 deletions(-) + +diff --git a/lib/matplotlib/tri/_triangulation.py b/lib/matplotlib/tri/_triangulation.py +index fa03a9c030..15bb1760c5 100644 +--- a/lib/matplotlib/tri/_triangulation.py ++++ b/lib/matplotlib/tri/_triangulation.py +@@ -1,3 +1,5 @@ ++import sys ++ + import numpy as np + + from matplotlib import _api +@@ -55,7 +57,7 @@ class Triangulation: + if triangles is None: + # No triangulation specified, so use matplotlib._qhull to obtain + # Delaunay triangulation. +- self.triangles, self._neighbors = _qhull.delaunay(x, y) ++ self.triangles, self._neighbors = _qhull.delaunay(x, y, sys.flags.verbose) + self.is_delaunay = True + else: + # Triangulation specified. Copy, since we may correct triangle +diff --git a/src/_qhull_wrapper.cpp b/src/_qhull_wrapper.cpp +index e27c4215b9..6b8173d3a3 100644 +--- a/src/_qhull_wrapper.cpp ++++ b/src/_qhull_wrapper.cpp +@@ -258,10 +258,12 @@ delaunay(PyObject *self, PyObject *args) + npy_intp npoints; + const double* x; + const double* y; ++ int verbose = 0; + +- if (!PyArg_ParseTuple(args, "O&O&", ++ if (!PyArg_ParseTuple(args, "O&O&i:delaunay", + &xarray.converter_contiguous, &xarray, +- &yarray.converter_contiguous, &yarray)) { ++ &yarray.converter_contiguous, &yarray, ++ &verbose)) { + return NULL; + } + +@@ -288,7 +290,7 @@ delaunay(PyObject *self, PyObject *args) + } + + CALL_CPP("qhull.delaunay", +- (ret = delaunay_impl(npoints, x, y, Py_VerboseFlag == 0))); ++ (ret = delaunay_impl(npoints, x, y, verbose == 0))); + + return ret; + } +@@ -302,7 +304,7 @@ version(PyObject *self, PyObject *arg) + + static PyMethodDef qhull_methods[] = { + {"delaunay", delaunay, METH_VARARGS, +- "delaunay(x, y, /)\n" ++ "delaunay(x, y, verbose, /)\n" + "--\n\n" + "Compute a Delaunay triangulation.\n" + "\n" +@@ -311,6 +313,8 @@ static PyMethodDef qhull_methods[] = { + "x, y : 1d arrays\n" + " The coordinates of the point set, which must consist of at least\n" + " three unique points.\n" ++ "verbose : int\n" ++ " Python's verbosity level.\n" + "\n" + "Returns\n" + "-------\n" +-- +2.41.0 + diff --git a/python-matplotlib.spec b/python-matplotlib.spec index f10b8d8..71c3e58 100644 --- a/python-matplotlib.spec +++ b/python-matplotlib.spec @@ -62,6 +62,12 @@ Patch0001: 0004-Use-old-stride_windows-implementation-on-32-bit-x86.patch # https://github.com/matplotlib/matplotlib/pull/25068 Source2000: pgf_pdflatex.pdf Source2001: pgf_rcupdate2.pdf +# https://github.com/matplotlib/matplotlib/pull/25918 +Patch0002: 0006-migrate-from-utcfromtimestamp-to-fromtimestamp-25918.patch +# https://github.com/matplotlib/matplotlib/pull/26154 +Patch0003: 0007-MNT-py312-deprecates-pickling-objects-in-itertools.patch +# https://github.com/matplotlib/matplotlib/pull/26165 +Patch0004: 0008-Avoid-Py_VerboseFlag-deprecation-from-Python-3.12.patch BuildRequires: gcc BuildRequires: gcc-c++ @@ -299,17 +305,15 @@ Requires: python3-matplotlib%{?_isa} = %{version}-%{release} %autosetup -n matplotlib-%{Version} -N # Fedora-specific patches follow: -%patch1001 -p1 -%patch1002 -p1 +%autopatch -p1 -m 1000 # Updated test images for new FreeType. -%patch1003 -p1 gzip -dc %SOURCE1000 | tar xf - --transform='s~^mpl-images-%{mpl_images_version}-with-freetype-%{ftver}/~~' # Copy mplsetup.cfg to the builddir cp -p %{SOURCE1} mplsetup.cfg # Backports or reported upstream -%patch0001 -p1 +%autopatch -p1 -M 999 # https://github.com/matplotlib/matplotlib/pull/25068 cp -a %SOURCE2000 %SOURCE2001 lib/matplotlib/tests/baseline_images/test_backend_pgf/