From 0205618d243c2c9ac43fc66558daae9364c394d0 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Mon, 4 Apr 2022 17:50:15 +0200 Subject: [PATCH 1/2] Backport PR #22766: FIX: account for constant deprecations in Pillow 9.1 --- azure-pipelines.yml | 3 +++ lib/matplotlib/animation.py | 18 ++++++++++-------- lib/matplotlib/backends/backend_pdf.py | 9 +++++++-- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 2c794033a494..c9a3ec83b70d 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -134,6 +134,9 @@ stages: - script: env displayName: 'print env' + - script: pip list + displayName: 'print pip' + - bash: | PYTHONFAULTHANDLER=1 python -m pytest --junitxml=junit/test-results.xml -raR --maxfail=50 --timeout=300 --durations=25 --cov-report= --cov=lib -n 2 || [[ "$PYTHON_VERSION" = 'Pre' ]] diff --git a/lib/matplotlib/animation.py b/lib/matplotlib/animation.py index 879aa945b00d..4eae790d8200 100644 --- a/lib/matplotlib/animation.py +++ b/lib/matplotlib/animation.py @@ -17,6 +17,7 @@ # * Can blit be enabled for movies? # * Need to consider event sources to allow clicking through multiple figures + import abc import base64 import contextlib @@ -481,14 +482,15 @@ def grab_frame(self, **savefig_kwargs): def finish(self): # Call run here now that all frame grabbing is done. All temp files # are available to be assembled. - self._run() - super().finish() # Will call clean-up - - def _cleanup(self): # Inline to finish() once cleanup() is removed. - super()._cleanup() - if self._tmpdir: - _log.debug('MovieWriter: clearing temporary path=%s', self._tmpdir) - self._tmpdir.cleanup() + try: + self._run() + super().finish() + finally: + if self._tmpdir: + _log.debug( + 'MovieWriter: clearing temporary path=%s', self._tmpdir + ) + self._tmpdir.cleanup() @writers.register('pillow') diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index 9ca791db0c5a..d035d1680da1 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -1718,8 +1718,13 @@ def _writeImg(self, data, id, smask=None): # Convert to indexed color if there are 256 colors or fewer # This can significantly reduce the file size num_colors = len(img_colors) - img = img.convert(mode='P', dither=Image.NONE, - palette=Image.ADAPTIVE, colors=num_colors) + # These constants were converted to IntEnums and deprecated in + # Pillow 9.2 + dither = getattr(Image, 'Dither', Image).NONE + pmode = getattr(Image, 'Palette', Image).ADAPTIVE + img = img.convert( + mode='P', dither=dither, palette=pmode, colors=num_colors + ) png_data, bit_depth, palette = self._writePng(img) if bit_depth is None or palette is None: raise RuntimeError("invalid PNG header") From 520120b1646a16f82c3f1f392c9f8b084a0fec23 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Mon, 4 Apr 2022 18:13:01 +0200 Subject: [PATCH 2/2] Revert the clenaup changes --- lib/matplotlib/animation.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/matplotlib/animation.py b/lib/matplotlib/animation.py index 4eae790d8200..879aa945b00d 100644 --- a/lib/matplotlib/animation.py +++ b/lib/matplotlib/animation.py @@ -17,7 +17,6 @@ # * Can blit be enabled for movies? # * Need to consider event sources to allow clicking through multiple figures - import abc import base64 import contextlib @@ -482,15 +481,14 @@ def grab_frame(self, **savefig_kwargs): def finish(self): # Call run here now that all frame grabbing is done. All temp files # are available to be assembled. - try: - self._run() - super().finish() - finally: - if self._tmpdir: - _log.debug( - 'MovieWriter: clearing temporary path=%s', self._tmpdir - ) - self._tmpdir.cleanup() + self._run() + super().finish() # Will call clean-up + + def _cleanup(self): # Inline to finish() once cleanup() is removed. + super()._cleanup() + if self._tmpdir: + _log.debug('MovieWriter: clearing temporary path=%s', self._tmpdir) + self._tmpdir.cleanup() @writers.register('pillow')