From 296585450add8371a42cded005b2a646031de174 Mon Sep 17 00:00:00 2001 From: Stefan <96178532+stefan6419846@users.noreply.github.com> Date: Tue, 28 Apr 2026 16:50:57 +0200 Subject: [PATCH 1/4] DEV: Enable PyPy testing again The verbosity issues have been fixed upstream. --- .github/workflows/github-ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/github-ci.yaml b/.github/workflows/github-ci.yaml index 0e3777db16..b6e10b907a 100644 --- a/.github/workflows/github-ci.yaml +++ b/.github/workflows/github-ci.yaml @@ -131,7 +131,7 @@ jobs: runs-on: ubuntu-24.04 strategy: matrix: - python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14'] # , 'pypy3.11'] + python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14', 'pypy3.11'] use-crypto-lib: ['cryptography'] include: - python-version: '3.9' From c6810650ca8fd7121ebcb284d3d9169082d25efb Mon Sep 17 00:00:00 2001 From: Stefan <96178532+stefan6419846@users.noreply.github.com> Date: Wed, 6 May 2026 15:13:28 +0200 Subject: [PATCH 2/4] use check-latest for PyPy --- .github/workflows/github-ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/github-ci.yaml b/.github/workflows/github-ci.yaml index b6e10b907a..a27b94c685 100644 --- a/.github/workflows/github-ci.yaml +++ b/.github/workflows/github-ci.yaml @@ -183,6 +183,7 @@ jobs: allow-prereleases: true cache: 'pip' cache-dependency-path: '**/requirements/ci-3.11.txt' + check-latest: ${{ startsWith(matrix.python-version, 'pypy') }} - name: Upgrade pip run: | python -m pip install --upgrade pip From 865ca85f56d0c4caa30839cc0fbf4bf078945b84 Mon Sep 17 00:00:00 2001 From: Stefan <96178532+stefan6419846@users.noreply.github.com> Date: Thu, 7 May 2026 09:23:32 +0200 Subject: [PATCH 3/4] add workaround for PyPy and Pillow --- tests/test_workflows.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/tests/test_workflows.py b/tests/test_workflows.py index 6ca9d7c26a..c8f0fac1da 100644 --- a/tests/test_workflows.py +++ b/tests/test_workflows.py @@ -5,6 +5,7 @@ """ import binascii +import platform from io import BytesIO from pathlib import Path from re import findall @@ -14,6 +15,7 @@ from PIL import __version__ as pil_version from pypdf import PdfReader, PdfWriter, Transformation +from pypdf._utils import Version from pypdf.constants import PageAttributes as PG from pypdf.errors import PdfReadError, PdfReadWarning from pypdf.generic import ( @@ -955,7 +957,20 @@ def test_fields_returning_stream(): assert "BtchIssQATit_time" in reader.get_form_text_fields()["TimeStampData"] -def test_replace_image(tmp_path): +def test_replace_image(tmp_path, monkeypatch): + from PIL import PdfParser # noqa: PLC0415 + + def pdf_parser_close_buf(pdf_parser: PdfParser.PdfParser) -> None: + if isinstance(pdf_parser.buf, memoryview): + pdf_parser.buf.release() + elif isinstance(pdf_parser.buf, PdfParser.mmap.mmap): + pdf_parser.buf.close() + pdf_parser.buf = None + + if Version(pil_version) < Version("12.3.0") and platform.python_implementation() == "PyPy": + # Regression since PyPy 7.3.22. + monkeypatch.setattr(PdfParser.PdfParser, "close_buf", pdf_parser_close_buf) + writer = PdfWriter(clone_from=RESOURCE_ROOT / "labeled-edges-center-image.pdf") reader = PdfReader(RESOURCE_ROOT / "jpeg.pdf") img = reader.pages[0].images[0].image From 18b8b746f90989ef6aa43dda86f461479b5bcc95 Mon Sep 17 00:00:00 2001 From: Stefan <96178532+stefan6419846@users.noreply.github.com> Date: Thu, 7 May 2026 09:35:04 +0200 Subject: [PATCH 4/4] further limit patch --- tests/test_workflows.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/test_workflows.py b/tests/test_workflows.py index c8f0fac1da..4010156669 100644 --- a/tests/test_workflows.py +++ b/tests/test_workflows.py @@ -6,6 +6,7 @@ import binascii import platform +import sys from io import BytesIO from pathlib import Path from re import findall @@ -967,7 +968,11 @@ def pdf_parser_close_buf(pdf_parser: PdfParser.PdfParser) -> None: pdf_parser.buf.close() pdf_parser.buf = None - if Version(pil_version) < Version("12.3.0") and platform.python_implementation() == "PyPy": + if ( + Version(pil_version) < Version("12.3.0") and + platform.python_implementation() == "PyPy" and + sys.pypy_version_info[:3] >= (7, 3, 22) + ): # Regression since PyPy 7.3.22. monkeypatch.setattr(PdfParser.PdfParser, "close_buf", pdf_parser_close_buf)