From 1f7b054d9c703e594b243ed50d77eb6a35c954d9 Mon Sep 17 00:00:00 2001 From: Plom Heller Date: Sun, 1 Nov 2026 15:29:04 +0100 Subject: [PATCH] Differentiate error messaging. --- src/bookmaker/misc.py | 102 +++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 46 deletions(-) diff --git a/src/bookmaker/misc.py b/src/bookmaker/misc.py index d5a8d9e..767c32f 100755 --- a/src/bookmaker/misc.py +++ b/src/bookmaker/misc.py @@ -342,21 +342,32 @@ class Nup4Geometry: self.shrink_for_spine = 1 - spine_part_of_page -class ArgFail(Exception): - 'Collects relevant command character, followed by explanation.' +class MsgFail(Exception): + 'Collects relevant explanation.' def __init__( self, - arg_char: str, msg: str, *args, **kwargs ) -> None: super().__init__(*args, **kwargs) - self.arg_char = arg_char self.msg = msg +class ArgFail(MsgFail): + 'Collects relevant command character, with explanation.' + + def __init__( + self, + arg_char: str, + *args, + **kwargs + ) -> None: + super().__init__(*args, **kwargs) + self.arg_char = arg_char + + def parse_args( ) -> ArgsNamespace: 'Collect command line arguments.' @@ -427,15 +438,14 @@ def _validate_args_syntax( 'Check command args against general syntax expectations.' def validate_page_range( - pr_string: str, - arg_char: str + pr_string: str ) -> None: prefix = 'page range string' if '-' not in pr_string: - raise ArgFail(arg_char, f'{prefix} lacks "-": {pr_string}') + raise MsgFail(f'{prefix} lacks "-": {pr_string}') tokens = pr_string.split('-') if len(tokens) > 2: - raise ArgFail(arg_char, f'{prefix} has too many "-": {pr_string}') + raise MsgFail(f'{prefix} has too many "-": {pr_string}') for i, token in enumerate(tokens): if token == '': continue @@ -446,12 +456,10 @@ def _validate_args_syntax( try: int(token) except ValueError as e: - raise ArgFail(arg_char, - f'{prefix} carries value neither integer, ' + raise MsgFail(f'{prefix} carries value neither integer, ' f'nor "start", nor "end": {pr_string}') from e if int(token) < 1: - raise ArgFail(arg_char, - f'{prefix} carries page number <1: {pr_string}') + raise MsgFail(f'{prefix} carries page number <1: {pr_string}') start = -1 end = -1 try: @@ -460,45 +468,47 @@ def _validate_args_syntax( except ValueError: pass if start > end > 0: - raise ArgFail( - arg_char, + raise MsgFail( f'{prefix} has higher start than end value: {pr_string}') - if args.page_range: - for p_string in args.page_range: - validate_page_range(p_string, 'p') - if len(args.page_range) > len(args.input_file): - raise ArgFail( - 'p', + try: + if args.page_range: + arg_char = 'p' + for p_string in args.page_range: + validate_page_range(p_string) + if len(args.page_range) > len(args.input_file): + raise MsgFail( 'more --page_range arguments than --input_file arguments') - if args.crops: - for c_string in args.crops: - initial_split = c_string.split(':') - if len(initial_split) > 2: - raise ArgFail('c', - f'cropping string has multiple ":": {c_string}') - page_range, crops_str = split_crops_string(c_string) - crops = crops_str.split(',') - if page_range: - validate_page_range(page_range, 'c') - if len(crops) != 4: - raise ArgFail( - 'c', - f'cropping does not contain exactly three ",": {c_string}') - for crop in crops: + if args.crops: + arg_char = 'c' + for c_string in args.crops: + initial_split = c_string.split(':') + if len(initial_split) > 2: + raise MsgFail( + f'cropping string has multiple ":": {c_string}') + page_range, crops_str = split_crops_string(c_string) + crops = crops_str.split(',') + if page_range: + validate_page_range(page_range) + if len(crops) != 4: + raise MsgFail('cropping does not contain exactly three ' + f'",": {c_string}') + for crop in crops: + try: + float(crop) + except ValueError as e: + raise MsgFail(f'non-number crop in: {c_string}') from e + if args.rotate_page: + arg_char = 'r' + for r in args.rotate_page: try: - float(crop) + int(r) except ValueError as e: - raise ArgFail('c', - f'non-number crop in: {c_string}') from e - if args.rotate_page: - for r in args.rotate_page: - try: - int(r) - except ValueError as e: - raise ArgFail('r', f'non-integer value: {r}') from e - if r < 1: - raise ArgFail('r', 'value must not be <1: {r}') + raise MsgFail(f'non-integer value: {r}') from e + if r < 1: + raise MsgFail('value must not be <1: {r}') + except MsgFail as e: + raise ArgFail(arg_char, e.msg) try: float(args.print_margin) except ValueError as e: -- 2.30.2