commit:     ba04da63dc74a4c63775e26e8917559447279698
Author:     Ben Kohler <bkohler <AT> gentoo <DOT> org>
AuthorDate: Wed Dec 28 18:00:24 2022 +0000
Commit:     Ben Kohler <bkohler <AT> gentoo <DOT> org>
CommitDate: Wed Dec 28 18:01:13 2022 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=ba04da63

dev-python/stapler: support PyPDF2-3.0.0 & misc fixes

Signed-off-by: Ben Kohler <bkohler <AT> gentoo.org>

 ...-1.0.0_p20220330-fix-tests-for-PyPDF2-2.x.patch |  13 +
 ...pler-1.0.0_p20220330-port-to-PyPDF2-3.0.0.patch | 302 +++++++++++++++++++++
 ...220330-use-poetry-core-backend-for-PEP517.patch |  32 +++
 .../stapler/stapler-1.0.0_p20220330-r2.ebuild      |  29 ++
 4 files changed, 376 insertions(+)

diff --git 
a/dev-python/stapler/files/stapler-1.0.0_p20220330-fix-tests-for-PyPDF2-2.x.patch
 
b/dev-python/stapler/files/stapler-1.0.0_p20220330-fix-tests-for-PyPDF2-2.x.patch
new file mode 100644
index 000000000000..125b06a7735a
--- /dev/null
+++ 
b/dev-python/stapler/files/stapler-1.0.0_p20220330-fix-tests-for-PyPDF2-2.x.patch
@@ -0,0 +1,13 @@
+diff --git a/staplelib/tests.py b/staplelib/tests.py
+index 4d59153..447d48a 100755
+--- a/staplelib/tests.py
++++ b/staplelib/tests.py
+@@ -5,7 +5,7 @@ import shutil
+ import tempfile
+ import unittest
+ 
+-from PyPDF2.pdf import PdfFileReader
++from PyPDF2 import PdfFileReader
+ 
+ from staplelib import main, CommandError
+ 

diff --git 
a/dev-python/stapler/files/stapler-1.0.0_p20220330-port-to-PyPDF2-3.0.0.patch 
b/dev-python/stapler/files/stapler-1.0.0_p20220330-port-to-PyPDF2-3.0.0.patch
new file mode 100644
index 000000000000..91eea95ae217
--- /dev/null
+++ 
b/dev-python/stapler/files/stapler-1.0.0_p20220330-port-to-PyPDF2-3.0.0.patch
@@ -0,0 +1,302 @@
+From 48d6ab21369f1e71dc57890f9bf78fff66c00a90 Mon Sep 17 00:00:00 2001
+From: Ben Kohler <bkoh...@gentoo.org>
+Date: Wed, 28 Dec 2022 10:08:30 -0600
+Subject: [PATCH 2/2] Port to PyPDF2-3.0.0
+
+Lots of functions got renamed in the recent PyPDF2-3.0.0 release
+
+Signed-off-by: Ben Kohler <bkoh...@gentoo.org>
+---
+ staplelib/commands.py | 46 +++++++++++++++++++++----------------------
+ staplelib/iohelper.py | 12 +++++------
+ staplelib/tests.py    | 34 ++++++++++++++++----------------
+ 3 files changed, 46 insertions(+), 46 deletions(-)
+
+diff --git a/staplelib/commands.py b/staplelib/commands.py
+index d37bfa7..caf75f9 100644
+--- a/staplelib/commands.py
++++ b/staplelib/commands.py
+@@ -4,9 +4,9 @@ import math
+ import os
+ 
+ try:
+-    from PyPDF2 import PdfFileWriter, PdfFileReader
++    from PyPDF2 import PdfWriter, PdfReader
+ except:
+-    from pyPdf import PdfFileWriter, PdfFileReader
++    from pyPdf import PdfWriter, PdfReader
+ 
+ from . import CommandError, iohelper
+ import staplelib
+@@ -33,7 +33,7 @@ def select(args, inverse=False):
+     if not filesandranges or not outputfilename:
+         raise CommandError("Both input and output filenames are required.")
+ 
+-    output = PdfFileWriter()
++    output = PdfWriter()
+     try:
+         for input in filesandranges:
+             pdf = input['pdf']
+@@ -44,21 +44,21 @@ def select(args, inverse=False):
+             if not inverse:
+                 pagerange = input['pages'] or [
+                     (p, iohelper.ROTATION_NONE) for p in
+-                    range(1, pdf.getNumPages() + 1)]
++                    range(1, len(pdf.pages) + 1)]
+             else:
+                 excluded = [p for p, r in input['pages']]
+                 pagerange = [(p, iohelper.ROTATION_NONE) for p in
+-                             range(1, pdf.getNumPages() + 1) if
++                             range(1, len(pdf.pages) + 1) if
+                              p not in excluded]
+ 
+             for pageno, rotate in pagerange:
+-                if 1 <= pageno <= pdf.getNumPages():
++                if 1 <= pageno <= len(pdf.pages):
+                     if verbose:
+                         print("Using page: {} (rotation: {} deg.)".format(
+                             pageno, rotate))
+ 
+-                    output.addPage(pdf.getPage(pageno-1)
+-                                   .rotateClockwise(rotate))
++                    output.add_page(pdf.pages[pageno-1]
++                                   .rotate(rotate))
+                 else:
+                     raise CommandError("Page {} not found in {}.".format(
+                         pageno, input['name']))
+@@ -98,14 +98,14 @@ def split(args):
+             base,
+             '_',
+             '%0',
+-            str(math.ceil(math.log10(input.getNumPages()))),
++            str(math.ceil(math.log10(len(input.pages)))),
+             'd',
+             ext
+         ])
+ 
+-        for pageno in range(input.getNumPages()):
+-            output = PdfFileWriter()
+-            output.addPage(input.getPage(pageno))
++        for pageno in range(len(input.pages)):
++            output = PdfWriter()
++            output.add_page(input.pages[pageno])
+ 
+             outputname = output_template % (pageno + 1)
+             if verbose:
+@@ -150,17 +150,17 @@ def zip_pdf_pages(filesandranges, verbose):
+         # empty range means "include all pages"
+         pagerange = input['pages'] or [
+             (p, iohelper.ROTATION_NONE) for p in
+-            range(1, pdf.getNumPages() + 1)]
++            range(1, len(pdf.pages) + 1)]
+ 
+         pagestozip = []
+         for pageno, rotate in pagerange:
+-            if 1 <= pageno <= pdf.getNumPages():
++            if 1 <= pageno <= len(pdf.pages):
+                 if verbose:
+                     print("Using page: {} (rotation: {} deg.)".format(
+                         pageno, rotate))
+ 
+-                pagestozip.append(pdf.getPage(pageno-1)
+-                               .rotateClockwise(rotate))
++                pagestozip.append(pdf.pages[pageno-1]
++                               .rotate(rotate))
+             else:
+                 raise CommandError("Page {} not found in {}.".format(
+                     pageno, input['name']))
+@@ -181,7 +181,7 @@ def background(args):
+     try:
+         filestozip = zip_pdf_pages(filesandranges, verbose)
+ 
+-        output = PdfFileWriter()
++        output = PdfWriter()
+         for pageno in range(max(map(len, filestozip))):
+             page = None
+             for listno in range(len(filestozip)):
+@@ -190,8 +190,8 @@ def background(args):
+                     if not page:
+                         page = p
+                     else:
+-                        page.mergePage(p)
+-            output.addPage(page)
++                        page.merge_page(p)
++            output.add_page(page)
+ 
+     except Exception as e:
+         import sys
+@@ -213,11 +213,11 @@ def zip(args):
+     filestozip = zip_pdf_pages(filesandranges, verbose)
+ 
+     # Interweave pages.
+-    output = PdfFileWriter()
++    output = PdfWriter()
+     for pageno in range(max(map(len, filestozip))):
+         for listno in range(len(filestozip)):
+             if pageno < len(filestozip[listno]):
+-                output.addPage(filestozip[listno][pageno])
++                output.add_page(filestozip[listno][pageno])
+ 
+     _write_output(output, outputfilename)
+ 
+@@ -266,7 +266,7 @@ def pdf_page_enumeration(pdf):
+         pagelabels = pdf.trailer["/Root"]["/PageLabels"]
+     except:
+         # ("No /Root/PageLabels object"), so infer the list.
+-        return range(1, pdf.getNumPages() + 1)
++        return range(1, len(pdf.pages) + 1)
+     
+     # """Select the item that is most likely to contain the information you 
desire; e.g.
+     #        {'/Nums': [0, IndirectObject(42, 0)]}
+@@ -292,7 +292,7 @@ def pdf_page_enumeration(pdf):
+     style = '/D'
+     prefix = ''
+     next_pageno = 1
+-    for i in range(0, pdf.getNumPages()):
++    for i in range(0, len(pdf.pages)):
+         if len(pagelabels_nums_list) > 0 and i >= pagelabels_nums_list[0]:
+             pagelabels_nums_list.pop(0)  # discard index
+             pnle = pagelabels_nums_list.pop(0)
+diff --git a/staplelib/iohelper.py b/staplelib/iohelper.py
+index 959e900..8df365c 100644
+--- a/staplelib/iohelper.py
++++ b/staplelib/iohelper.py
+@@ -7,9 +7,9 @@ import re
+ import sys
+ 
+ try:
+-    from PyPDF2 import PdfFileWriter, PdfFileReader
++    from PyPDF2 import PdfWriter, PdfReader
+ except ImportError:
+-    from pyPdf import PdfFileWriter, PdfFileReader
++    from pyPdf import PdfWriter, PdfReader
+ 
+ 
+ from . import CommandError
+@@ -31,8 +31,8 @@ def read_pdf(filename):
+     """Open a PDF file with PyPDF2."""
+     if not os.path.exists(filename):
+         raise CommandError("{} does not exist".format(filename))
+-    pdf = PdfFileReader(open(filename, "rb"))
+-    if pdf.isEncrypted:
++    pdf = PdfReader(open(filename, "rb"))
++    if pdf.is_encrypted:
+         while True:
+             pw = prompt_for_pw(filename)
+             matched = pdf.decrypt(pw)
+@@ -46,7 +46,7 @@ def read_pdf(filename):
+ def write_pdf(pdf, filename):
+     force = staplelib.OPTIONS.force
+ 
+-    """Write the content of a PdfFileWriter object to a file."""
++    """Write the content of a PdfWriter object to a file."""
+     if os.path.exists(filename) and not force:
+         raise CommandError("File already exists: {}".format(filename))
+ 
+@@ -123,7 +123,7 @@ def parse_ranges(handles_files_and_ranges):
+                         "page range '{}'".format(handle_key, inputname))
+ 
+             current = operations[-1]
+-            max_page = current['pdf'].getNumPages()
++            max_page = len(current['pdf'].pages)
+             # allow "end" as alias for the last page
+             replace_end = lambda page: (
+                 max_page if page.lower() == 'end' else int(page))
+diff --git a/staplelib/tests.py b/staplelib/tests.py
+index 4d59153..3350dfc 100755
+--- a/staplelib/tests.py
++++ b/staplelib/tests.py
+@@ -5,7 +5,7 @@ import shutil
+ import tempfile
+ import unittest
+ 
+-from PyPDF2 import PdfFileReader
++from PyPDF2 import PdfReader
+ 
+ from staplelib import main, CommandError
+ 
+@@ -38,40 +38,40 @@ class TestStapler(unittest.TestCase):
+                      self.outputfile])
+         self.assertTrue(os.path.isfile(self.outputfile))
+         with open(self.outputfile, 'rb') as outputfile:
+-            pdf = PdfFileReader(outputfile)
+-            self.assertEqual(pdf.getNumPages(), 6)
++            pdf = PdfReader(outputfile)
++            self.assertEqual(len(pdf.pages), 6)
+ 
+     def test_sel_one_page(self):
+         """Test select of a one page from a PDF file."""
+         run_stapler(['sel', 'A=' + FIVEPAGE_PDF, 'A2', self.outputfile])
+         self.assertTrue(os.path.isfile(self.outputfile))
+         with open(self.outputfile, 'rb') as outputfile:
+-            pdf = PdfFileReader(outputfile)
+-            self.assertEqual(pdf.getNumPages(), 1)
++            pdf = PdfReader(outputfile)
++            self.assertEqual(len(pdf.pages), 1)
+ 
+     def test_sel_range(self):
+         """Test select of more pages from a PDF file."""
+         run_stapler(['cat', 'A=' + FIVEPAGE_PDF, 'A2-4', self.outputfile])
+         self.assertTrue(os.path.isfile(self.outputfile))
+         with open(self.outputfile, 'rb') as outputfile:
+-            pdf = PdfFileReader(outputfile)
+-            self.assertEqual(pdf.getNumPages(), 3)
++            pdf = PdfReader(outputfile)
++            self.assertEqual(len(pdf.pages), 3)
+ 
+     def test_del_one_page(self):
+         """Test del command for inverse select of one page."""
+         run_stapler(['del', 'A=' + FIVEPAGE_PDF, 'A1', self.outputfile])
+         self.assertTrue(os.path.isfile(self.outputfile))
+         with open(self.outputfile, 'rb') as outputfile:
+-            pdf = PdfFileReader(outputfile)
+-            self.assertEqual(pdf.getNumPages(), 4)
++            pdf = PdfReader(outputfile)
++            self.assertEqual(len(pdf.pages), 4)
+ 
+     def test_del_range(self):
+         """Test del command for inverse select multiple pages."""
+         run_stapler(['del', 'A=' + FIVEPAGE_PDF, 'A2-4', self.outputfile])
+         self.assertTrue(os.path.isfile(self.outputfile))
+         with open(self.outputfile, 'rb') as outputfile:
+-            pdf = PdfFileReader(outputfile)
+-            self.assertEqual(pdf.getNumPages(), 2)
++            pdf = PdfReader(outputfile)
++            self.assertEqual(len(pdf.pages), 2)
+ 
+     def test_split(self):
+         """Make sure a file is properly split into pages."""
+@@ -81,24 +81,24 @@ class TestStapler(unittest.TestCase):
+         self.assertEqual(len(filelist), 5)
+         for f in os.listdir(self.tmpdir):
+             with open(os.path.join(self.tmpdir, f), 'rb') as pdf_file:
+-                pdf = PdfFileReader(pdf_file)
+-                self.assertEqual(pdf.getNumPages(), 1)
++                pdf = PdfReader(pdf_file)
++                self.assertEqual(len(pdf.pages), 1)
+ 
+     def test_background(self):
+         """Test background."""
+         run_stapler(['background', ONEPAGE_PDF, FIVEPAGE_PDF, 
self.outputfile])
+         self.assertTrue(os.path.isfile(self.outputfile))
+         with open(self.outputfile, 'rb') as outputfile:
+-            pdf = PdfFileReader(outputfile)
+-            self.assertEqual(pdf.getNumPages(), 5)
++            pdf = PdfReader(outputfile)
++            self.assertEqual(len(pdf.pages), 5)
+ 
+     def test_zip(self):
+         """Test zip."""
+         run_stapler(['zip', ONEPAGE_PDF, FIVEPAGE_PDF, self.outputfile])
+         self.assertTrue(os.path.isfile(self.outputfile))
+         with open(self.outputfile, 'rb') as outputfile:
+-            pdf = PdfFileReader(outputfile)
+-            self.assertEqual(pdf.getNumPages(), 6)
++            pdf = PdfReader(outputfile)
++            self.assertEqual(len(pdf.pages), 6)
+ 
+     def test_output_file_already_exists(self):
+         """Test zip."""
+-- 
+2.39.0
+

diff --git 
a/dev-python/stapler/files/stapler-1.0.0_p20220330-use-poetry-core-backend-for-PEP517.patch
 
b/dev-python/stapler/files/stapler-1.0.0_p20220330-use-poetry-core-backend-for-PEP517.patch
new file mode 100644
index 000000000000..276df746791f
--- /dev/null
+++ 
b/dev-python/stapler/files/stapler-1.0.0_p20220330-use-poetry-core-backend-for-PEP517.patch
@@ -0,0 +1,32 @@
+From 3907d86f515ff0e9f042df7111515205e9abaa11 Mon Sep 17 00:00:00 2001
+From: Ben Kohler <bkoh...@gentoo.org>
+Date: Thu, 26 May 2022 13:33:38 -0500
+Subject: [PATCH 1/2] pyproject.toml: use poetry-core backend for PEP517
+
+Per poetry upstream, "If your pyproject.toml file still references
+poetry directly as a build backend, you should update it to reference
+poetry-core instead."
+
+https://python-poetry.org/docs/pyproject/#poetry-and-pep-517
+https://projects.gentoo.org/python/guide/distutils.html#deprecated-pep-517-backends
+
+Signed-off-by: Ben Kohler <bkoh...@gentoo.org>
+---
+ pyproject.toml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/pyproject.toml b/pyproject.toml
+index efa98ea..d34823e 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -28,5 +28,5 @@ pdf-stapler = 'staplelib:main'
+ 
+ # this section is for PEP517 compliance. It is technically unnecessary if 
using Poetry
+ [build-system]
+-requires = ["poetry>=1.0"]
+-build-backend = "poetry.masonry.api"
++requires = ["poetry-core>=1.0.0"]
++build-backend = "poetry.core.masonry.api"
+-- 
+2.39.0
+

diff --git a/dev-python/stapler/stapler-1.0.0_p20220330-r2.ebuild 
b/dev-python/stapler/stapler-1.0.0_p20220330-r2.ebuild
new file mode 100644
index 000000000000..93ca68b5fcee
--- /dev/null
+++ b/dev-python/stapler/stapler-1.0.0_p20220330-r2.ebuild
@@ -0,0 +1,29 @@
+# Copyright 1999-2022 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+PYTHON_COMPAT=( python3_{9..11} )
+DISTUTILS_USE_PEP517=poetry
+
+inherit distutils-r1
+
+COMMIT="382f1edc62296e071093a5419811a2fca9d78d93"
+
+DESCRIPTION="Suite of tools for PDF files manipulation written in Python"
+HOMEPAGE="https://github.com/hellerbarde/stapler";
+SRC_URI="https://github.com/hellerbarde/${PN}/archive/${COMMIT}.tar.gz -> 
${P}.tar.gz"
+S="${WORKDIR}/${PN}-${COMMIT}"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+
+DEPEND="test? ( >=dev-python/PyPDF2-3.0.0[${PYTHON_USEDEP}] )"
+RDEPEND=">=dev-python/PyPDF2-3.0.0[${PYTHON_USEDEP}]"
+
+distutils_enable_tests unittest
+
+PATCHES=( "${FILESDIR}"/${P}-fix-tests-for-PyPDF2-2.x.patch
+       "${FILESDIR}"/${P}-port-to-PyPDF2-3.0.0.patch 
+       "${FILESDIR}"/${P}-use-poetry-core-backend-for-PEP517.patch )

Reply via email to