From db69b4d11a9b2116f4e9c76b00c4a880609e0e73 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Wed, 22 May 2019 15:55:48 -0700 Subject: [PATCH] Improve argparse behavior for its role in making the API work --- src/ocrmypdf/api.py | 6 ++---- src/ocrmypdf/cli.py | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/ocrmypdf/api.py b/src/ocrmypdf/api.py index 7d9dcddf..fc22b20b 100644 --- a/src/ocrmypdf/api.py +++ b/src/ocrmypdf/api.py @@ -128,10 +128,8 @@ def create_options(*, input_file, output_file, **kwargs): cmdline.append(str(input_file)) cmdline.append(str(output_file)) - try: - options = parser.parse_args(cmdline) - except argparse.ArgumentError as e: - raise ValueError(str(e)) + parser.api_mode = True + options = parser.parse_args(cmdline) return options diff --git a/src/ocrmypdf/cli.py b/src/ocrmypdf/cli.py index 8491ae1e..503f591b 100644 --- a/src/ocrmypdf/cli.py +++ b/src/ocrmypdf/cli.py @@ -36,7 +36,24 @@ def numeric(basetype, min_=None, max_=None): return _numeric -parser = argparse.ArgumentParser( +class ArgumentParser(argparse.ArgumentParser): + """Override parser's default behavior of calling sys.exit() + + https://stackoverflow.com/questions/5943249/python-argparse-and-controlling-overriding-the-exit-status-code + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.api_mode = False + + def error(self, message): + if not self.api_mode: + super().error(message) + return + raise ValueError(message) + + +parser = ArgumentParser( prog=PROGRAM_NAME, fromfile_prefix_chars='@', formatter_class=argparse.RawDescriptionHelpFormatter,