From 452e1fb0e019a47064441a2877ed9d23f4947a1e Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Fri, 26 Jul 2019 21:35:22 +0200 Subject: [PATCH] do not use RawDescriptionHelpFormatter by default --- test/test_help.py | 25 +++++++++++++++++++++++-- tiramisu_cmdline_parser/api.py | 19 +++++++++++++------ 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/test/test_help.py b/test/test_help.py index 3e2226d..42052e4 100644 --- a/test/test_help.py +++ b/test/test_help.py @@ -1,6 +1,7 @@ from io import StringIO from contextlib import redirect_stdout, redirect_stderr import pytest +from argparse import RawDescriptionHelpFormatter from tiramisu_cmdline_parser import TiramisuCmdlineParser @@ -64,11 +65,31 @@ od: {str,list,int,none} choice the sub argument -two -line +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 + + +def test_help_epilog_raw(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", formatter_class=RawDescriptionHelpFormatter) + f = StringIO() + with redirect_stdout(f): + parser.print_help() + assert f.getvalue() == output diff --git a/tiramisu_cmdline_parser/api.py b/tiramisu_cmdline_parser/api.py index 729b158..4ae5ff9 100644 --- a/tiramisu_cmdline_parser/api.py +++ b/tiramisu_cmdline_parser/api.py @@ -13,7 +13,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . from typing import Union, List, Dict, Tuple, Optional, Any -from argparse import ArgumentParser, Namespace, SUPPRESS, _HelpAction, RawDescriptionHelpFormatter +from argparse import ArgumentParser, Namespace, SUPPRESS, _HelpAction, HelpFormatter from copy import copy from gettext import gettext as _ @@ -106,7 +106,7 @@ class TiramisuNamespace(Namespace): self._config.option(true_key, index).value.set(value) -class TiramisuHelpFormatter(RawDescriptionHelpFormatter): +class TiramisuHelpFormatter: def _get_default_metavar_for_optional(self, action): ret = super()._get_default_metavar_for_optional(action) @@ -114,7 +114,7 @@ class TiramisuHelpFormatter(RawDescriptionHelpFormatter): ret = ret.rsplit('.', 1)[1] return ret - class _Section(RawDescriptionHelpFormatter._Section): + class _Section(HelpFormatter._Section): def format_help(self): # Remove empty OD if self.formatter.remove_empty_od and \ @@ -135,6 +135,7 @@ class TiramisuHelpFormatter(RawDescriptionHelpFormatter): return '' return super().format_help() + class _TiramisuHelpAction(_HelpAction): needs = False def __call__(self, *args, **kwargs): @@ -208,6 +209,7 @@ class TiramisuCmdlineParser(ArgumentParser): fullpath: bool=True, remove_empty_od: bool=False, remove_empty_description_od: bool=False, + formatter_class=HelpFormatter, _forhelp: bool=False, **kwargs): self.fullpath = fullpath @@ -215,9 +217,11 @@ class TiramisuCmdlineParser(ArgumentParser): self.root = root self.remove_empty_od = remove_empty_od self.remove_empty_description_od = remove_empty_description_od - TiramisuHelpFormatter.remove_empty_od = self.remove_empty_od - TiramisuHelpFormatter.remove_empty_description_od = self.remove_empty_description_od - kwargs['formatter_class'] = TiramisuHelpFormatter + if TiramisuHelpFormatter not in formatter_class.__mro__: + formatter_class = type('TiramisuHelpFormatter', (TiramisuHelpFormatter, formatter_class), {}) + formatter_class.remove_empty_od = self.remove_empty_od + formatter_class.remove_empty_description_od = self.remove_empty_description_od + kwargs['formatter_class'] = formatter_class if self.root is None: subconfig = self.config.option else: @@ -272,6 +276,7 @@ class TiramisuCmdlineParser(ArgumentParser): root=self.root, remove_empty_od=self.remove_empty_od, remove_empty_description_od=self.remove_empty_description_od, + formatter_class=self.formatter_class, epilog=self.epilog, fullpath=self.fullpath) namespace_, args_ = new_parser._parse_known_args(args_, namespace) @@ -510,6 +515,7 @@ class TiramisuCmdlineParser(ArgumentParser): fullpath=self.fullpath, remove_empty_od=self.remove_empty_od, remove_empty_description_od=self.remove_empty_description_od, + formatter_class=self.formatter_class, epilog=self.epilog, _forhelp=True) return super(TiramisuCmdlineParser, help_formatter).format_usage(*args, **kwargs) @@ -521,6 +527,7 @@ class TiramisuCmdlineParser(ArgumentParser): fullpath=self.fullpath, remove_empty_od=self.remove_empty_od, remove_empty_description_od=self.remove_empty_description_od, + formatter_class=self.formatter_class, epilog=self.epilog, _forhelp=True) return super(TiramisuCmdlineParser, help_formatter).format_help()