Compare commits

...

3 commits

5 changed files with 106 additions and 15 deletions

View file

@ -1,3 +1,10 @@
## 0.7.0a7 (2026-06-12)
### Fix
- remove prog and description attribute
- support exit_on_error
## 0.7.0a6 (2026-06-11)
### Feat

View file

@ -4,7 +4,7 @@ requires = ["flit_core >=3.8.0,<4"]
[project]
name = "tiramisu_cmdline_parser"
version = "0.7.0a6"
version = "0.7.0a7"
authors = [{name = "Emmanuel Garette", email = "gnunux@gnunux.info"}]
readme = "README.md"
description = "command-line parser using Tiramisu"

85
tests/test_exit.py Normal file
View file

@ -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'])

View file

@ -1 +1 @@
__version__ = "0.7.0a6"
__version__ = "0.7.0a7"

View file

@ -327,6 +327,7 @@ class TiramisuCmdlineParser(ArgumentParser):
add_extra_options: bool = True,
short_name_max_len: int = 1,
add_help: bool = True,
exit_on_error: bool = True,
_forhelp: bool = False,
**kwargs,
):
@ -360,7 +361,7 @@ class TiramisuCmdlineParser(ArgumentParser):
else:
subconfig = subconfig.option(self.root)
self.namespace = TiramisuNamespace(self.config, self.root)
super().__init__(*args, add_help=add_help, **kwargs)
super().__init__(*args, add_help=add_help, exit_on_error=exit_on_error, **kwargs)
self.register("action", "help", _TiramisuHelpAction)
self._config_to_argparser(
_forhelp,
@ -402,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(
@ -767,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,
@ -791,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,
@ -820,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