# coding: utf-8 # # Copyright © 2010—2014 Andrey Mikhaylenko and contributors # # This file is part of Argh. # # Argh is free software under terms of the GNU Lesser # General Public License version 3 (LGPLv3) as published by the Free # Software Foundation. See the file README.rst for copying conditions. # import argparse __all__ = ( 'ATTR_NAME', 'ATTR_ALIASES', 'ATTR_ARGS', 'ATTR_WRAPPED_EXCEPTIONS', 'ATTR_WRAPPED_EXCEPTIONS_PROCESSOR', 'ATTR_EXPECTS_NAMESPACE_OBJECT', 'PARSER_FORMATTER', 'DEFAULT_ARGUMENT_TEMPLATE', 'DEST_FUNCTION', ) # # Names of function attributes where Argh stores command behaviour # #: explicit command name (differing from function name) ATTR_NAME = 'argh_name' #: alternative command names ATTR_ALIASES = 'argh_aliases' #: declared arguments ATTR_ARGS = 'argh_args' #: list of exception classes that should be wrapped and printed as results ATTR_WRAPPED_EXCEPTIONS = 'argh_wrap_errors' #: a function to preprocess the exception object when it is wrapped ATTR_WRAPPED_EXCEPTIONS_PROCESSOR = 'argh_wrap_errors_processor' #: forcing argparse.Namespace object instead of signature introspection ATTR_EXPECTS_NAMESPACE_OBJECT = 'argh_expects_namespace_object' # # Dest names in parser defaults # #: dest name for a function mapped to given endpoint (goes to Namespace obj) DEST_FUNCTION = 'function' # # Other library-wide stuff # class CustomFormatter(argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter): def _expand_help(self, action): """ This method is copied verbatim from ArgumentDefaultsHelpFormatter with a couple of lines added just before the end. Reason: we need to `repr()` default values instead of simply inserting them as is. This helps notice, for example, an empty string as the default value; moreover, it prevents breaking argparse due to logical quirks inside of its formatters. Ideally this could be achieved by simply defining :attr:`DEFAULT_ARGUMENT_TEMPLATE` as ``{default!r}`` but unfortunately argparse only supports the old printf syntax. """ params = dict(vars(action), prog=self._prog) for name in list(params): if params[name] is argparse.SUPPRESS: del params[name] for name in list(params): if hasattr(params[name], '__name__'): params[name] = params[name].__name__ if params.get('choices') is not None: choices_str = ', '.join([str(c) for c in params['choices']]) params['choices'] = choices_str # XXX this is added in Argh vs. argparse.ArgumentDefaultsHelpFormatter # (avoiding empty strings, otherwise Argparse would die with # an IndexError in _format_action) # if 'default' in params: if params['default'] is None: params['default'] = '-' else: params['default'] = repr(params['default']) # # / return self._get_help_string(action) % params #: Default formatter to be used in implicitly instantiated ArgumentParser. PARSER_FORMATTER = CustomFormatter DEFAULT_ARGUMENT_TEMPLATE = '%(default)s' """ Default template of argument help message (see issue #64). The template ``%(default)s`` is used by `argparse` to display the argument's default value. """