Skip to content

Commit 600e649

Browse files
committed
CLI: Use argparse subparsers (#108)
1 parent f059f50 commit 600e649

File tree

10 files changed

+98
-224
lines changed

10 files changed

+98
-224
lines changed

docs/source/changelog.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@
44
# Changelog
55

66

7+
## 1.9.0 (sched 2022-05-16)
8+
9+
- Updated PDFium from `5052` to `XXXX`.
10+
- Significantly improved maintainability of the command-line interface by using argparse subparsers instead of a custom implementation.
11+
- Integrated optional support for shell auto-completion using `argcomplete`.
12+
- Added capabilities to determine bookmark state (open/closed) to the TOC parser. Thanks to PDFium Team for reviewing/merging the CL.
13+
14+
715
## 1.8.0 (2022-05-09)
816

917
- Updated PDFium from `5038` to `5052`.

docs/source/shell_api.rst

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,41 +9,41 @@ pypdfium2 can also be used from the command-line.
99

1010
Main help
1111
*********
12-
``pypdfium2 help``
12+
``pypdfium2 --help``
1313

14-
.. program-output:: python3 -m pypdfium2 help
14+
.. program-output:: pypdfium2 --help
1515

1616

1717
Version
1818
*******
19-
``pypdfium2 version``
19+
``pypdfium2 --version``
2020

21-
.. program-output:: python3 -m pypdfium2 version
21+
.. program-output:: pypdfium2 --version
2222

2323

2424
Renderer
2525
********
26-
``pypdfium2 render``
26+
``pypdfium2 render --help``
2727

28-
.. program-output:: python3 -m pypdfium2 render
28+
.. program-output:: pypdfium2 render --help
2929

3030

3131
Table of Contents Reader
3232
************************
33-
``pypdfium2 toc``
33+
``pypdfium2 toc --help``
3434

35-
.. program-output:: python3 -m pypdfium2 toc
35+
.. program-output:: pypdfium2 toc --help
3636

3737

3838
Merger
3939
******
40-
``pypdfium2 merge``
40+
``pypdfium2 merge --help``
4141

42-
.. program-output:: python3 -m pypdfium2 merge
42+
.. program-output:: pypdfium2 merge --help
4343

4444

4545
Page Tiler
4646
**********
47-
``pypdfium2 tile``
47+
``pypdfium2 tile --help``
4848

49-
.. program-output:: python3 -m pypdfium2 tile
49+
.. program-output:: pypdfium2 tile --help

setup.cfg

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,12 @@ console_scripts =
5353
pypdfium2 = pypdfium2._cli.main:main
5454

5555
[options.extras_require]
56-
converters =
56+
converters =
5757
Pillow>=6.0
5858
inserttext =
5959
uharfbuzz
60+
autocomplete =
61+
argcomplete
6062
test =
6163
pytest
6264
docs =

src/pypdfium2/_cli/_parser.py

Lines changed: 0 additions & 128 deletions
This file was deleted.

src/pypdfium2/_cli/main.py

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,61 @@
1+
# PYTHON_ARGCOMPLETE_OK
12
# SPDX-FileCopyrightText: 2022 geisserml <[email protected]>
23
# SPDX-License-Identifier: Apache-2.0 OR BSD-3-Clause
34

45
import sys
6+
import argparse
57
from pypdfium2._version import (
68
V_PYPDFIUM2,
79
V_LIBPDFIUM,
810
)
9-
from pypdfium2._cli._parser import CliParser
1011
from pypdfium2._cli import (
11-
renderer,
12+
render,
1213
toc,
13-
merger,
14-
tiler,
14+
merge,
15+
tile,
1516
)
1617

18+
try:
19+
import argcomplete
20+
except ImportError:
21+
have_argcomplete = False
22+
else:
23+
have_argcomplete = True
1724

18-
def main(argv=sys.argv[1:]):
25+
26+
Subcommands = dict(
27+
render = render,
28+
toc = toc,
29+
merge = merge,
30+
tile = tile,
31+
)
32+
33+
34+
def parse_args(argv=sys.argv[1:]):
1935

20-
parser = CliParser(
21-
program = "pypdfium2",
22-
version = "%s (libpdfium %s)" % (V_PYPDFIUM2, V_LIBPDFIUM),
36+
parser = argparse.ArgumentParser(
37+
prog = "pypdfium2",
2338
description = "Command line interface to the pypdfium2 Python library",
24-
argv = argv,
25-
)
26-
27-
parser.add_subcommand(
28-
"render",
29-
method = renderer.main,
30-
help = "Rasterise pages of a PDF file",
3139
)
32-
parser.add_subcommand(
33-
"toc",
34-
method = toc.main,
35-
help = "Show the table of contents for a PDF document",
40+
parser.add_argument(
41+
"--version", "-v",
42+
action = "version",
43+
version = "pypdfium2 %s (libpdfium %s)" % (V_PYPDFIUM2, V_LIBPDFIUM),
3644
)
37-
parser.add_subcommand(
38-
"merge",
39-
method = merger.main,
40-
help = "Concatenate PDF files",
41-
)
42-
parser.add_subcommand(
43-
"tile",
44-
method = tiler.main,
45-
help = "Perform page tiling (N-up compositing)",
45+
46+
subparsers = parser.add_subparsers(
47+
dest = "subcommand",
48+
required = True,
4649
)
50+
for cmd in Subcommands.values():
51+
cmd.attach_parser(subparsers)
52+
53+
if have_argcomplete:
54+
argcomplete.autocomplete(parser)
4755

48-
parser.run()
56+
return parser.parse_args(argv)
57+
58+
59+
def main():
60+
args = parse_args()
61+
Subcommands[args.subcommand].main(args)

src/pypdfium2/_cli/merger.py renamed to src/pypdfium2/_cli/merge.py

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
import ctypes
55
from pypdfium2 import _namespace as pdfium
6-
from pypdfium2._cli._parser import ArgParser
76

87

98
def _merge_pdfs(input_paths):
@@ -19,13 +18,11 @@ def _merge_pdfs(input_paths):
1918
return dest_doc
2019

2120

22-
def parse_args(argv, prog, desc):
23-
24-
parser = ArgParser(
25-
prog = prog,
26-
description = desc,
21+
def attach_parser(subparsers):
22+
parser = subparsers.add_parser(
23+
'merge',
24+
help = "Concatenate PDF files",
2725
)
28-
2926
parser.add_argument(
3027
'inputs',
3128
nargs = '+',
@@ -36,14 +33,9 @@ def parse_args(argv, prog, desc):
3633
required = True,
3734
help = "Target path for the output document",
3835
)
39-
40-
return parser.parse_args(argv)
4136

4237

43-
def main(argv, prog, desc):
44-
45-
args = parse_args(argv, prog, desc)
38+
def main(args):
4639
merged_doc = _merge_pdfs(args.inputs)
47-
4840
with open(args.output, 'wb') as file_handle:
4941
pdfium.save_pdf(merged_doc, file_handle)

src/pypdfium2/_cli/renderer.py renamed to src/pypdfium2/_cli/render.py

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import os
55
import ast
66
from pypdfium2 import _namespace as pdfium
7-
from pypdfium2._cli._parser import ArgParser
87
from os.path import (
98
join,
109
abspath,
@@ -69,13 +68,11 @@ def pagetext_type(value):
6968
return page_indices
7069

7170

72-
def parse_args(argv, prog, desc):
73-
74-
parser = ArgParser(
75-
prog = prog,
76-
description = desc,
71+
def attach_parser(subparsers):
72+
parser = subparsers.add_parser(
73+
"render",
74+
help = "Rasterise pages of a PDF file",
7775
)
78-
7976
parser.add_argument(
8077
'inputs',
8178
nargs = '+',
@@ -138,14 +135,10 @@ def parse_args(argv, prog, desc):
138135
type = int,
139136
help = "The number of processes to use for rendering (defaults to the number of CPU cores)"
140137
)
141-
142-
return parser.parse_args(argv)
143138

144139

145-
def main(argv, prog, desc):
146-
147-
args = parse_args(argv, prog, desc)
148-
140+
def main(args):
141+
149142
for input_path in args.inputs:
150143

151144
prefix = splitext(basename(input_path))[0] + '_'

0 commit comments

Comments
 (0)