use rawformatter and add epilog

This commit is contained in:
Emmanuel Garette 2019-07-26 16:39:01 +02:00 committed by Emmanuel Garette
parent b0849ab260
commit d8ee3486e9
2 changed files with 80 additions and 3 deletions

74
test/test_help.py Normal file
View file

@ -0,0 +1,74 @@
from io import StringIO
from contextlib import redirect_stdout, redirect_stderr
import pytest
from tiramisu_cmdline_parser import TiramisuCmdlineParser
from tiramisu import IntOption, StrOption, BoolOption, ChoiceOption, \
SymLinkOption, OptionDescription, Config
from tiramisu_json_api import Config as JsonConfig
def get_config(json):
choiceoption = ChoiceOption('cmd',
'choice the sub argument',
('str', 'list', 'int', 'none'),
properties=('mandatory',
'positional'))
od = OptionDescription('od',
'od',
[choiceoption])
root = OptionDescription('root',
'root',
[od])
config = Config(root)
config.property.read_write()
if json == 'tiramisu':
return config
jconfig = JsonConfig(config.option.dict())
return jconfig
@pytest.fixture(params=['tiramisu', 'tiramisu-json'])
def json(request):
return request.param
def test_help(json):
output = """usage: prog.py [-h] {str,list,int,none}
optional arguments:
-h, --help show this help message and exit
od:
od
{str,list,int,none} choice the sub argument
"""
parser = TiramisuCmdlineParser(get_config(json), 'prog.py')
f = StringIO()
with redirect_stdout(f):
parser.print_help()
assert f.getvalue() == output
def test_help_epilog(json):
output = """usage: prog.py [-h] {str,list,int,none}
optional arguments:
-h, --help show this help message and exit
od:
od
{str,list,int,none} choice the sub argument
two
line
"""
parser = TiramisuCmdlineParser(get_config(json), 'prog.py', epilog="\ntwo\nline")
f = StringIO()
with redirect_stdout(f):
parser.print_help()
assert f.getvalue() == output

View file

@ -13,7 +13,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from typing import Union, List, Dict, Tuple, Optional, Any from typing import Union, List, Dict, Tuple, Optional, Any
from argparse import ArgumentParser, Namespace, SUPPRESS, _HelpAction, HelpFormatter from argparse import ArgumentParser, Namespace, SUPPRESS, _HelpAction, RawDescriptionHelpFormatter
from copy import copy from copy import copy
from gettext import gettext as _ from gettext import gettext as _
@ -106,7 +106,7 @@ class TiramisuNamespace(Namespace):
self._config.option(true_key, index).value.set(value) self._config.option(true_key, index).value.set(value)
class TiramisuHelpFormatter(HelpFormatter): class TiramisuHelpFormatter(RawDescriptionHelpFormatter):
def _get_default_metavar_for_optional(self, def _get_default_metavar_for_optional(self,
action): action):
ret = super()._get_default_metavar_for_optional(action) ret = super()._get_default_metavar_for_optional(action)
@ -114,7 +114,7 @@ class TiramisuHelpFormatter(HelpFormatter):
ret = ret.rsplit('.', 1)[1] ret = ret.rsplit('.', 1)[1]
return ret return ret
class _Section(HelpFormatter._Section): class _Section(RawDescriptionHelpFormatter._Section):
def format_help(self): def format_help(self):
# Remove empty OD # Remove empty OD
if self.formatter.remove_empty_od and \ if self.formatter.remove_empty_od and \
@ -272,6 +272,7 @@ class TiramisuCmdlineParser(ArgumentParser):
root=self.root, root=self.root,
remove_empty_od=self.remove_empty_od, remove_empty_od=self.remove_empty_od,
remove_empty_description_od=self.remove_empty_description_od, remove_empty_description_od=self.remove_empty_description_od,
epilog=self.epilog,
fullpath=self.fullpath) fullpath=self.fullpath)
namespace_, args_ = new_parser._parse_known_args(args_, namespace) namespace_, args_ = new_parser._parse_known_args(args_, namespace)
else: else:
@ -509,6 +510,7 @@ class TiramisuCmdlineParser(ArgumentParser):
fullpath=self.fullpath, fullpath=self.fullpath,
remove_empty_od=self.remove_empty_od, remove_empty_od=self.remove_empty_od,
remove_empty_description_od=self.remove_empty_description_od, remove_empty_description_od=self.remove_empty_description_od,
epilog=self.epilog,
_forhelp=True) _forhelp=True)
return super(TiramisuCmdlineParser, help_formatter).format_usage(*args, **kwargs) return super(TiramisuCmdlineParser, help_formatter).format_usage(*args, **kwargs)
@ -519,6 +521,7 @@ class TiramisuCmdlineParser(ArgumentParser):
fullpath=self.fullpath, fullpath=self.fullpath,
remove_empty_od=self.remove_empty_od, remove_empty_od=self.remove_empty_od,
remove_empty_description_od=self.remove_empty_description_od, remove_empty_description_od=self.remove_empty_description_od,
epilog=self.epilog,
_forhelp=True) _forhelp=True)
return super(TiramisuCmdlineParser, help_formatter).format_help() return super(TiramisuCmdlineParser, help_formatter).format_help()