From d9017bedde4647b553dbfd99cda5436f5f6cdcbf Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Fri, 12 Jun 2026 19:56:49 +0200 Subject: [PATCH] fix: remove prog and description attribute --- tests/test_exit.py | 85 ++++++++++++++++++++++++++++++++++ tiramisu_cmdline_parser/api.py | 22 ++++----- 2 files changed, 95 insertions(+), 12 deletions(-) create mode 100644 tests/test_exit.py diff --git a/tests/test_exit.py b/tests/test_exit.py new file mode 100644 index 0000000..486cbf5 --- /dev/null +++ b/tests/test_exit.py @@ -0,0 +1,85 @@ +import pytest + +from argparse import ArgumentError + +from tiramisu_cmdline_parser import TiramisuCmdlineParser +from tiramisu import StrOption, BoolOption, OptionDescription, Config +from .utils import TestHelpFormatter + + +def get_config(has_tree=False, default_verbosity=False): + booloption = BoolOption('disabled', + 'disabled', + properties=('disabled',), + ) + booloption2 = BoolOption('verbosity', + 'increase output verbosity', + default=default_verbosity, + ) + stroption = StrOption('option', + 'an option', + ) + root = OptionDescription('root', + 'root', + [booloption, booloption2, stroption], + ) + if has_tree: + root = OptionDescription('root', + 'root', + [root], + ) + config = Config(root) + config.property.read_write() + return config + + +def test_exit_boolean(): + config = get_config(default_verbosity=True) + parser = TiramisuCmdlineParser(config, 'prog.py', formatter_class=TestHelpFormatter, color=False, exit_on_error=False) + parser.parse_args(['--verbosity']) + parser.parse_known_args(['--verbosity']) + + +def test_exit_disabled(): + config = get_config(default_verbosity=True) + parser = TiramisuCmdlineParser(config, 'prog.py', formatter_class=TestHelpFormatter, color=False, exit_on_error=False) + error = None + try: + parser.parse_args(['--disabled']) + except ArgumentError as err: + error = err + assert error + assert str(error) == 'unrecognized arguments: --disabled (cannot access to option "disabled" because has property "disabled")' + + +def test_exit_string(): + config = get_config(default_verbosity=True) + parser = TiramisuCmdlineParser(config, 'prog.py', formatter_class=TestHelpFormatter, color=False, exit_on_error=False) + parser.parse_args(['--option', 'value']) + parser.parse_known_args(['--option', 'value']) + + +def test_exit_unknown(): + config = get_config(default_verbosity=True) + parser = TiramisuCmdlineParser(config, 'prog.py', formatter_class=TestHelpFormatter, color=False, exit_on_error=False) + error = None + try: + parser.parse_args(['--unknown', 'value']) + except ArgumentError as err: + error = err + assert error + assert str(error) == 'unrecognized arguments: --unknown value' + parser.parse_known_args(['--unknown', 'value']) + + +def test_exit_known_unknown(): + config = get_config(default_verbosity=True) + parser = TiramisuCmdlineParser(config, 'prog.py', formatter_class=TestHelpFormatter, color=False, exit_on_error=False) + error = None + try: + parser.parse_args(['--option', 'value', '--unknown', 'value']) + except ArgumentError as err: + error = err + assert error + assert str(error) == 'unrecognized arguments: --unknown value' + parser.parse_known_args(['--unknown', 'value']) diff --git a/tiramisu_cmdline_parser/api.py b/tiramisu_cmdline_parser/api.py index aa9305a..2732036 100644 --- a/tiramisu_cmdline_parser/api.py +++ b/tiramisu_cmdline_parser/api.py @@ -403,10 +403,7 @@ class TiramisuCmdlineParser(ArgumentParser): except (ValueError, LeadershipError, AttributeError) as err: self.error(err) if args != args_ and args_ and args_[0].startswith(self.prefix_chars): - kwargs = self.kwargs - if "epilog" in kwargs: - kwargs = kwargs.copy() - del kwargs["epilog"] + kwargs = self.clean_kwargs() # option that was disabled are no more disable # so create a new parser new_parser = TiramisuCmdlineParser( @@ -768,10 +765,7 @@ class TiramisuCmdlineParser(ArgumentParser): return namespaces, unknown def format_usage(self, *args, **kwargs): - kwargs_ = self.kwargs - if "epilog" in kwargs_: - kwargs_ = kwargs_.copy() - del kwargs_["epilog"] + kwargs_ = self.clean_kwargs() help_formatter = TiramisuCmdlineParser( self.config, self.prog, @@ -792,10 +786,7 @@ class TiramisuCmdlineParser(ArgumentParser): ) def format_help(self): - kwargs = self.kwargs - if "epilog" in kwargs: - kwargs = kwargs.copy() - del kwargs["epilog"] + kwargs = self.clean_kwargs() help_formatter = TiramisuCmdlineParser( self.config, self.prog, @@ -821,3 +812,10 @@ class TiramisuCmdlineParser(ArgumentParser): super().error(msg) else: raise ArgumentError(None, msg) + + def clean_kwargs(self): + kwargs = self.kwargs.copy() + for arg in ["epilog", "prog", "description"]: + if arg in kwargs: + del kwargs[arg] + return kwargs