# 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.
|
|
"""
|