argparse.py revision 539586296d64a51cd58c8c45a7dd850cdcc05fcc
1fb224e303435c9b98fd1a24dbd3cf119d7b90b6bBenjamin Peterson# Author: Steven J. Bethard <steven.bethard@gmail.com>. 2a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 3a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson"""Command-line parsing library 4a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 5a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonThis module is an optparse-inspired command-line parsing library that: 6a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 7a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - handles both optional and positional arguments 8a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - produces highly informative usage messages 9a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - supports parsers that dispatch to sub-parsers 10a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 11a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonThe following is a simple usage example that sums integers from the 12a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersoncommand-line and writes the result to a file:: 13a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 14a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser = argparse.ArgumentParser( 15a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson description='sum the integers at the command line') 16a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser.add_argument( 17a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'integers', metavar='int', nargs='+', type=int, 18a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help='an integer to be summed') 19a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser.add_argument( 20a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson '--log', default=sys.stdout, type=argparse.FileType('w'), 21a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help='the file where the sum should be written') 22a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args = parser.parse_args() 23a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args.log.write('%s' % sum(args.integers)) 24a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args.log.close() 25a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 26a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonThe module contains the following public classes: 27a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 28a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - ArgumentParser -- The main entry point for command-line parsing. As the 29a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson example above shows, the add_argument() method is used to populate 30a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson the parser with actions for optional and positional arguments. Then 31a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson the parse_args() method is invoked to convert the args at the 32a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson command-line into an object with attributes. 33a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 34a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - ArgumentError -- The exception raised by ArgumentParser objects when 35a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson there are errors with the parser's actions. Errors raised while 36a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parsing the command-line are caught by ArgumentParser and emitted 37a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson as command-line messages. 38a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 39a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - FileType -- A factory for defining types of files to be created. As the 40a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson example above shows, instances of FileType are typically passed as 41a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson the type= argument of add_argument() calls. 42a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 43a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - Action -- The base class for parser actions. Typically actions are 44a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson selected by passing strings like 'store_true' or 'append_const' to 45a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson the action= argument of add_argument(). However, for greater 46a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson customization of ArgumentParser actions, subclasses of Action may 47a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson be defined and passed as the action= argument. 48a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 49a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - HelpFormatter, RawDescriptionHelpFormatter, RawTextHelpFormatter, 50a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson ArgumentDefaultsHelpFormatter -- Formatter classes which 51a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson may be passed as the formatter_class= argument to the 52a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson ArgumentParser constructor. HelpFormatter is the default, 53a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson RawDescriptionHelpFormatter and RawTextHelpFormatter tell the parser 54a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson not to change the formatting for help text, and 55a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson ArgumentDefaultsHelpFormatter adds information about argument defaults 56a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson to the help. 57a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 58a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonAll other classes in this module are considered implementation details. 59a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson(Also note that HelpFormatter and RawDescriptionHelpFormatter are only 60a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonconsidered public as object names -- the API of the formatter objects is 61a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonstill considered an implementation detail.) 62a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson""" 63a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 64a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson__version__ = '1.1' 65a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson__all__ = [ 66a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'ArgumentParser', 67a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'ArgumentError', 68931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'ArgumentTypeError', 69a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'FileType', 70a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'HelpFormatter', 71931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'ArgumentDefaultsHelpFormatter', 72a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'RawDescriptionHelpFormatter', 73a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'RawTextHelpFormatter', 74931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'Namespace', 75931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'Action', 76931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'ONE_OR_MORE', 77931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'OPTIONAL', 78931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'PARSER', 79931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'REMAINDER', 80931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'SUPPRESS', 81931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'ZERO_OR_MORE', 82a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson] 83a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 84a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 85a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonimport copy as _copy 86a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonimport os as _os 87a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonimport re as _re 88a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonimport sys as _sys 89a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonimport textwrap as _textwrap 90a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 91a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonfrom gettext import gettext as _ 92a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 93a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 94a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersondef _callable(obj): 95a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return hasattr(obj, '__call__') or hasattr(obj, '__bases__') 96a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 97a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 98a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonSUPPRESS = '==SUPPRESS==' 99a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 100a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonOPTIONAL = '?' 101a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonZERO_OR_MORE = '*' 102a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonONE_OR_MORE = '+' 103a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonPARSER = 'A...' 104a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonREMAINDER = '...' 1052e4d4c414e4275b5a8cbcd152e04ed91fb72af79Steven Bethard_UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args' 106a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 107a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# ============================= 108a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# Utility functions and classes 109a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# ============================= 110a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 111a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _AttributeHolder(object): 112a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Abstract base class that provides __repr__. 113a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 114a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson The __repr__ method returns a string in the format:: 115a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson ClassName(attr=name, attr=name, ...) 116a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson The attributes are determined either by a class-level attribute, 117a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson '_kwarg_names', or by inspecting the instance __dict__. 118a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 119a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 120a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __repr__(self): 121a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type_name = type(self).__name__ 122a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings = [] 123a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for arg in self._get_args(): 124a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings.append(repr(arg)) 125a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for name, value in self._get_kwargs(): 126a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings.append('%s=%r' % (name, value)) 127a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return '%s(%s)' % (type_name, ', '.join(arg_strings)) 128a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 129a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_kwargs(self): 1300e717addd8a03ed10231a578fce894c07ddb157eBenjamin Peterson return sorted(self.__dict__.items()) 131a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 132a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_args(self): 133a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return [] 134a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 135a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 136a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersondef _ensure_value(namespace, name, value): 137a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if getattr(namespace, name, None) is None: 138a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, name, value) 139a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return getattr(namespace, name) 140a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 141a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 142a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# =============== 143a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# Formatting Help 144a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# =============== 145a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 146a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass HelpFormatter(object): 147a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Formatter for generating usage messages and argument help strings. 148a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 149a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Only the name of this class is considered a public API. All the methods 150a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson provided by the class are considered an implementation detail. 151a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 152a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 153a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 154a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prog, 155a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson indent_increment=2, 156a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson max_help_position=24, 157a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson width=None): 158a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 159a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # default setting for width 160a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if width is None: 161a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 162a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson width = int(_os.environ['COLUMNS']) 163a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except (KeyError, ValueError): 164a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson width = 80 165a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson width -= 2 166a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 167a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._prog = prog 168a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._indent_increment = indent_increment 169a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._max_help_position = max_help_position 170a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._width = width 171a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 172a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._current_indent = 0 173a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._level = 0 174a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._action_max_length = 0 175a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 176a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._root_section = self._Section(self, None) 177a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._current_section = self._root_section 178a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 179a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._whitespace_matcher = _re.compile(r'\s+') 180a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._long_break_matcher = _re.compile(r'\n\n\n+') 181a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 182a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # =============================== 183a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Section and indentation methods 184a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # =============================== 185a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _indent(self): 186a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._current_indent += self._indent_increment 187a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._level += 1 188a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 189a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _dedent(self): 190a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._current_indent -= self._indent_increment 191a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson assert self._current_indent >= 0, 'Indent decreased below 0.' 192a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._level -= 1 193a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 194a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson class _Section(object): 195a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 196a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, formatter, parent, heading=None): 197a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.formatter = formatter 198a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.parent = parent 199a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.heading = heading 200a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.items = [] 201a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 202a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def format_help(self): 203a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # format the indented section 204a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self.parent is not None: 205a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.formatter._indent() 206a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson join = self.formatter._join_parts 207a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for func, args in self.items: 208a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson func(*args) 209a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson item_help = join([func(*args) for func, args in self.items]) 210a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self.parent is not None: 211a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.formatter._dedent() 212a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 213a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return nothing if the section was empty 214a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not item_help: 215a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return '' 216a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 217a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add the heading if the section was non-empty 218a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self.heading is not SUPPRESS and self.heading is not None: 219a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson current_indent = self.formatter._current_indent 220a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson heading = '%*s%s:\n' % (current_indent, '', self.heading) 221a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 222a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson heading = '' 223a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 224a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # join the section-initial newline, the heading and the help 225a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return join(['\n', heading, item_help, '\n']) 226a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 227a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _add_item(self, func, args): 228a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._current_section.items.append((func, args)) 229a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 230a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================== 231a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Message building methods 232a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================== 233a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def start_section(self, heading): 234a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._indent() 235a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson section = self._Section(self, self._current_section, heading) 236a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._add_item(section.format_help, []) 237a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._current_section = section 238a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 239a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def end_section(self): 240a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._current_section = self._current_section.parent 241a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._dedent() 242a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 243a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_text(self, text): 244a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if text is not SUPPRESS and text is not None: 245a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._add_item(self._format_text, [text]) 246a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 247a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_usage(self, usage, actions, groups, prefix=None): 248a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if usage is not SUPPRESS: 249a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args = usage, actions, groups, prefix 250a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._add_item(self._format_usage, args) 251a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 252a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_argument(self, action): 253a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.help is not SUPPRESS: 254a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 255a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # find all invocations 256a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson get_invocation = self._format_action_invocation 257a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson invocations = [get_invocation(action)] 258a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for subaction in self._iter_indented_subactions(action): 259a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson invocations.append(get_invocation(subaction)) 260a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 261a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # update the maximum item length 262a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson invocation_length = max([len(s) for s in invocations]) 263a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_length = invocation_length + self._current_indent 264a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._action_max_length = max(self._action_max_length, 265a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_length) 266a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 267a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add the item to the list 268a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._add_item(self._format_action, [action]) 269a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 270a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_arguments(self, actions): 271a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in actions: 272a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.add_argument(action) 273a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 274a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================= 275a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Help-formatting methods 276a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================= 277a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def format_help(self): 278a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help = self._root_section.format_help() 279a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if help: 280a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help = self._long_break_matcher.sub('\n\n', help) 281a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help = help.strip('\n') + '\n' 282a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return help 283a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 284a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _join_parts(self, part_strings): 285a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return ''.join([part 286a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for part in part_strings 287a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if part and part is not SUPPRESS]) 288a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 289a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _format_usage(self, usage, actions, groups, prefix): 290a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if prefix is None: 291a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prefix = _('usage: ') 292a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 293a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if usage is specified, use that 294a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if usage is not None: 295a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson usage = usage % dict(prog=self._prog) 296a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 297a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if no optionals or positionals are available, usage is just prog 298a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif usage is None and not actions: 299a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson usage = '%(prog)s' % dict(prog=self._prog) 300a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 301a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if optionals and positionals are available, calculate usage 302a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif usage is None: 303a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prog = '%(prog)s' % dict(prog=self._prog) 304a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 305a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # split optionals from positionals 306a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson optionals = [] 307a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson positionals = [] 308a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in actions: 309a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.option_strings: 310a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson optionals.append(action) 311a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 312a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson positionals.append(action) 313a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 314a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # build full usage string 315a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson format = self._format_actions_usage 316a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_usage = format(optionals + positionals, groups) 317a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson usage = ' '.join([s for s in [prog, action_usage] if s]) 318a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 319a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # wrap the usage parts if it's too long 320a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text_width = self._width - self._current_indent 321a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if len(prefix) + len(usage) > text_width: 322a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 323a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # break usage into wrappable parts 324a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson part_regexp = r'\(.*?\)+|\[.*?\]+|\S+' 325a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson opt_usage = format(optionals, groups) 326a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson pos_usage = format(positionals, groups) 327a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson opt_parts = _re.findall(part_regexp, opt_usage) 328a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson pos_parts = _re.findall(part_regexp, pos_usage) 329a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson assert ' '.join(opt_parts) == opt_usage 330a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson assert ' '.join(pos_parts) == pos_usage 331a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 332a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # helper for wrapping lines 333a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def get_lines(parts, indent, prefix=None): 334a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines = [] 335a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson line = [] 336a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if prefix is not None: 337a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson line_len = len(prefix) - 1 338a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 339a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson line_len = len(indent) - 1 340a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for part in parts: 341a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if line_len + 1 + len(part) > text_width: 342a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines.append(indent + ' '.join(line)) 343a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson line = [] 344a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson line_len = len(indent) - 1 345a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson line.append(part) 346a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson line_len += len(part) + 1 347a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if line: 348a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines.append(indent + ' '.join(line)) 349a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if prefix is not None: 350a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines[0] = lines[0][len(indent):] 351a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return lines 352a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 353a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if prog is short, follow it with optionals or positionals 354a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if len(prefix) + len(prog) <= 0.75 * text_width: 355a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson indent = ' ' * (len(prefix) + len(prog) + 1) 356a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if opt_parts: 357a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines = get_lines([prog] + opt_parts, indent, prefix) 358a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines.extend(get_lines(pos_parts, indent)) 359a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif pos_parts: 360a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines = get_lines([prog] + pos_parts, indent, prefix) 361a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 362a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines = [prog] 363a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 364a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if prog is long, put it on its own line 365a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 366a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson indent = ' ' * len(prefix) 367a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts = opt_parts + pos_parts 368a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines = get_lines(parts, indent) 369a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if len(lines) > 1: 370a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines = [] 371a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines.extend(get_lines(opt_parts, indent)) 372a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines.extend(get_lines(pos_parts, indent)) 373a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines = [prog] + lines 374a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 375a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # join lines into usage 376a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson usage = '\n'.join(lines) 377a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 378a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # prefix with 'usage:' 379a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return '%s%s\n\n' % (prefix, usage) 380a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 381a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _format_actions_usage(self, actions, groups): 382a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # find group indices and identify actions in groups 3830e717addd8a03ed10231a578fce894c07ddb157eBenjamin Peterson group_actions = set() 384a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson inserts = {} 385a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for group in groups: 386a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 387a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson start = actions.index(group._group_actions[0]) 388a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except ValueError: 389a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson continue 390a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 391a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson end = start + len(group._group_actions) 392a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if actions[start:end] == group._group_actions: 393a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in group._group_actions: 394a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson group_actions.add(action) 395a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not group.required: 39668c3678253eb0bf1a15537d2725df9af15e2c913Steven Bethard if start in inserts: 39768c3678253eb0bf1a15537d2725df9af15e2c913Steven Bethard inserts[start] += ' [' 39868c3678253eb0bf1a15537d2725df9af15e2c913Steven Bethard else: 39968c3678253eb0bf1a15537d2725df9af15e2c913Steven Bethard inserts[start] = '[' 400a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson inserts[end] = ']' 401a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 40268c3678253eb0bf1a15537d2725df9af15e2c913Steven Bethard if start in inserts: 40368c3678253eb0bf1a15537d2725df9af15e2c913Steven Bethard inserts[start] += ' (' 40468c3678253eb0bf1a15537d2725df9af15e2c913Steven Bethard else: 40568c3678253eb0bf1a15537d2725df9af15e2c913Steven Bethard inserts[start] = '(' 406a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson inserts[end] = ')' 407a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for i in range(start + 1, end): 408a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson inserts[i] = '|' 409a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 410a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # collect all actions format strings 411a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts = [] 412a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for i, action in enumerate(actions): 413a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 414a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # suppressed arguments are marked with None 415a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # remove | separators for suppressed arguments 416a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.help is SUPPRESS: 417a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.append(None) 418a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if inserts.get(i) == '|': 419a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson inserts.pop(i) 420a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif inserts.get(i + 1) == '|': 421a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson inserts.pop(i + 1) 422a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 423a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # produce all arg strings 424a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif not action.option_strings: 425a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson part = self._format_args(action, action.dest) 426a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 427a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if it's in a group, strip the outer [] 428a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action in group_actions: 429a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if part[0] == '[' and part[-1] == ']': 430a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson part = part[1:-1] 431a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 432a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add the action string to the list 433a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.append(part) 434a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 435a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # produce the first way to invoke the option in brackets 436a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 437a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_string = action.option_strings[0] 438a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 439a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the Optional doesn't take a value, format is: 440a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # -s or --long 441a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.nargs == 0: 442a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson part = '%s' % option_string 443a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 444a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the Optional takes a value, format is: 445a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # -s ARGS or --long ARGS 446a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 447a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default = action.dest.upper() 448a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args_string = self._format_args(action, default) 449a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson part = '%s %s' % (option_string, args_string) 450a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 451a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # make it look optional if it's not required or in a group 452a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not action.required and action not in group_actions: 453a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson part = '[%s]' % part 454a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 455a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add the action string to the list 456a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.append(part) 457a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 458a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # insert things at the necessary indices 4590e717addd8a03ed10231a578fce894c07ddb157eBenjamin Peterson for i in sorted(inserts, reverse=True): 460a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts[i:i] = [inserts[i]] 461a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 462a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # join all the action items with spaces 463a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = ' '.join([item for item in parts if item is not None]) 464a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 465a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # clean up separators for mutually exclusive groups 466a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson open = r'[\[(]' 467a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson close = r'[\])]' 468a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = _re.sub(r'(%s) ' % open, r'\1', text) 469a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = _re.sub(r' (%s)' % close, r'\1', text) 470a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = _re.sub(r'%s *%s' % (open, close), r'', text) 471a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = _re.sub(r'\(([^|]*)\)', r'\1', text) 472a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = text.strip() 473a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 474a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the text 475a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return text 476a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 477a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _format_text(self, text): 478a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if '%(prog)' in text: 479a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = text % dict(prog=self._prog) 480a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text_width = self._width - self._current_indent 481a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson indent = ' ' * self._current_indent 482a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._fill_text(text, text_width, indent) + '\n\n' 483a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 484a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _format_action(self, action): 485a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # determine the required width and the entry label 486a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help_position = min(self._action_max_length + 2, 487a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._max_help_position) 488a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help_width = self._width - help_position 489a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_width = help_position - self._current_indent - 2 490a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_header = self._format_action_invocation(action) 491a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 492a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ho nelp; start on same line and add a final newline 493a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not action.help: 494a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = self._current_indent, '', action_header 495a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_header = '%*s%s\n' % tup 496a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 497a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # short action name; start on the same line and pad two spaces 498a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif len(action_header) <= action_width: 499a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = self._current_indent, '', action_width, action_header 500a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_header = '%*s%-*s ' % tup 501a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson indent_first = 0 502a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 503a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # long action name; start on the next line 504a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 505a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = self._current_indent, '', action_header 506a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_header = '%*s%s\n' % tup 507a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson indent_first = help_position 508a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 509a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # collect the pieces of the action help 510a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts = [action_header] 511a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 512a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if there was help for the action, add lines of help text 513a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.help: 514a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help_text = self._expand_help(action) 515a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help_lines = self._split_lines(help_text, help_width) 516a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.append('%*s%s\n' % (indent_first, '', help_lines[0])) 517a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for line in help_lines[1:]: 518a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.append('%*s%s\n' % (help_position, '', line)) 519a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 520a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # or add a newline if the description doesn't end with one 521a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif not action_header.endswith('\n'): 522a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.append('\n') 523a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 524a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if there are any sub-actions, add their help as well 525a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for subaction in self._iter_indented_subactions(action): 526a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.append(self._format_action(subaction)) 527a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 528a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return a single string 529a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._join_parts(parts) 530a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 531a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _format_action_invocation(self, action): 532a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not action.option_strings: 533a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar, = self._metavar_formatter(action, action.dest)(1) 534a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return metavar 535a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 536a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 537a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts = [] 538a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 539a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the Optional doesn't take a value, format is: 540a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # -s, --long 541a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.nargs == 0: 542a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.extend(action.option_strings) 543a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 544a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the Optional takes a value, format is: 545a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # -s ARGS, --long ARGS 546a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 547a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default = action.dest.upper() 548a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args_string = self._format_args(action, default) 549a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string in action.option_strings: 550a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.append('%s %s' % (option_string, args_string)) 551a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 552a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return ', '.join(parts) 553a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 554a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _metavar_formatter(self, action, default_metavar): 555a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.metavar is not None: 556a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = action.metavar 557a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif action.choices is not None: 558a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choice_strs = [str(choice) for choice in action.choices] 559a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = '{%s}' % ','.join(choice_strs) 560a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 561a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = default_metavar 562a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 563a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def format(tuple_size): 564a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if isinstance(result, tuple): 565a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return result 566a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 567a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return (result, ) * tuple_size 568a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return format 569a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 570a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _format_args(self, action, default_metavar): 571a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson get_metavar = self._metavar_formatter(action, default_metavar) 572a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.nargs is None: 573a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = '%s' % get_metavar(1) 574a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif action.nargs == OPTIONAL: 575a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = '[%s]' % get_metavar(1) 576a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif action.nargs == ZERO_OR_MORE: 577a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = '[%s [%s ...]]' % get_metavar(2) 578a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif action.nargs == ONE_OR_MORE: 579a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = '%s [%s ...]' % get_metavar(2) 580a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif action.nargs == REMAINDER: 581a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = '...' 582a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif action.nargs == PARSER: 583a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = '%s ...' % get_metavar(1) 584a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 585a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formats = ['%s' for _ in range(action.nargs)] 586a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = ' '.join(formats) % get_metavar(action.nargs) 587a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return result 588a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 589a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _expand_help(self, action): 590a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson params = dict(vars(action), prog=self._prog) 591a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for name in list(params): 592a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if params[name] is SUPPRESS: 593a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson del params[name] 594a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for name in list(params): 595a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if hasattr(params[name], '__name__'): 596a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson params[name] = params[name].__name__ 597a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if params.get('choices') is not None: 598a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choices_str = ', '.join([str(c) for c in params['choices']]) 599a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson params['choices'] = choices_str 600a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._get_help_string(action) % params 601a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 602a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _iter_indented_subactions(self, action): 603a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 604a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson get_subactions = action._get_subactions 605a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except AttributeError: 606a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson pass 607a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 608a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._indent() 609a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for subaction in get_subactions(): 610a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson yield subaction 611a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._dedent() 612a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 613a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _split_lines(self, text, width): 614a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = self._whitespace_matcher.sub(' ', text).strip() 615a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return _textwrap.wrap(text, width) 616a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 617a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _fill_text(self, text, width, indent): 618a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = self._whitespace_matcher.sub(' ', text).strip() 619a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return _textwrap.fill(text, width, initial_indent=indent, 620a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson subsequent_indent=indent) 621a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 622a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_help_string(self, action): 623a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action.help 624a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 625a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 626a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass RawDescriptionHelpFormatter(HelpFormatter): 627a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Help message formatter which retains any formatting in descriptions. 628a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 629a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Only the name of this class is considered a public API. All the methods 630a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson provided by the class are considered an implementation detail. 631a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 632a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 633a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _fill_text(self, text, width, indent): 634a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return ''.join([indent + line for line in text.splitlines(True)]) 635a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 636a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 637a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass RawTextHelpFormatter(RawDescriptionHelpFormatter): 638a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Help message formatter which retains formatting of all help text. 639a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 640a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Only the name of this class is considered a public API. All the methods 641a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson provided by the class are considered an implementation detail. 642a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 643a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 644a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _split_lines(self, text, width): 645a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return text.splitlines() 646a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 647a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 648a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass ArgumentDefaultsHelpFormatter(HelpFormatter): 649a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Help message formatter which adds default values to argument help. 650a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 651a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Only the name of this class is considered a public API. All the methods 652a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson provided by the class are considered an implementation detail. 653a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 654a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 655a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_help_string(self, action): 656a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help = action.help 657a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if '%(default)' not in action.help: 658a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.default is not SUPPRESS: 659a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson defaulting_nargs = [OPTIONAL, ZERO_OR_MORE] 660a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.option_strings or action.nargs in defaulting_nargs: 661a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help += ' (default: %(default)s)' 662a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return help 663a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 664a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 665a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# ===================== 666a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# Options and Arguments 667a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# ===================== 668a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 669a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersondef _get_action_name(argument): 670a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if argument is None: 671a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return None 672a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif argument.option_strings: 673a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return '/'.join(argument.option_strings) 674a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif argument.metavar not in (None, SUPPRESS): 675a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return argument.metavar 676a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif argument.dest not in (None, SUPPRESS): 677a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return argument.dest 678a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 679a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return None 680a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 681a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 682a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass ArgumentError(Exception): 683a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """An error from creating or using an argument (optional or positional). 684a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 685a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson The string value of this exception is the message, augmented with 686a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson information about the argument that caused it. 687a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 688a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 689a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, argument, message): 690a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.argument_name = _get_action_name(argument) 691a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.message = message 692a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 693a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __str__(self): 694a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self.argument_name is None: 695a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson format = '%(message)s' 696a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 697a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson format = 'argument %(argument_name)s: %(message)s' 698a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return format % dict(message=self.message, 699a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson argument_name=self.argument_name) 700a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 701a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 702a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass ArgumentTypeError(Exception): 703a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """An error from trying to convert a command line string to a type.""" 704a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson pass 705a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 706a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 707a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# ============== 708a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# Action classes 709a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# ============== 710a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 711a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass Action(_AttributeHolder): 712a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Information about how to convert command line strings to Python objects. 713a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 714a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Action objects are used by an ArgumentParser to represent the information 715a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson needed to parse a single argument from one or more strings from the 716a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson command line. The keyword arguments to the Action constructor are also 717a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson all attributes of Action instances. 718a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 719a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Keyword Arguments: 720a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 721a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - option_strings -- A list of command-line option strings which 722a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson should be associated with this action. 723a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 724a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - dest -- The name of the attribute to hold the created object(s) 725a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 726a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - nargs -- The number of command-line arguments that should be 727a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson consumed. By default, one argument will be consumed and a single 728a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value will be produced. Other values include: 729a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - N (an integer) consumes N arguments (and produces a list) 730a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - '?' consumes zero or one arguments 731a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - '*' consumes zero or more arguments (and produces a list) 732a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - '+' consumes one or more arguments (and produces a list) 733a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Note that the difference between the default and nargs=1 is that 734a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson with the default, a single value will be produced, while with 735a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=1, a list containing a single value will be produced. 736a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 737a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - const -- The value to be produced if the option is specified and the 738a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option uses an action that takes no values. 739a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 740a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - default -- The value to be produced if the option is not specified. 741a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 742a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - type -- The type which the command-line arguments should be converted 743a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson to, should be one of 'string', 'int', 'float', 'complex' or a 744a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson callable object that accepts a single string argument. If None, 745a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'string' is assumed. 746a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 747a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - choices -- A container of values that should be allowed. If not None, 748a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson after a command-line argument has been converted to the appropriate 749a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type, an exception will be raised if it is not a member of this 750a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson collection. 751a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 752a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - required -- True if the action must always be specified at the 753a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson command line. This is only meaningful for optional command-line 754a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arguments. 755a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 756a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - help -- The help string describing the argument. 757a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 758a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - metavar -- The name to be used for the option's argument with the 759a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help string. If None, the 'dest' value will be used as the name. 760a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 761a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 762a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 763a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 764a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest, 765a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=None, 766a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=None, 767a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=None, 768a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type=None, 769a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choices=None, 770a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=False, 771a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None, 772a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=None): 773a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.option_strings = option_strings 774a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.dest = dest 775a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.nargs = nargs 776a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.const = const 777a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.default = default 778a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.type = type 779a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.choices = choices 780a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.required = required 781a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.help = help 782a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.metavar = metavar 783a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 784a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_kwargs(self): 785a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson names = [ 786a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'option_strings', 787a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'dest', 788a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'nargs', 789a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'const', 790a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'default', 791a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'type', 792a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'choices', 793a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'help', 794a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'metavar', 795a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson ] 796a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return [(name, getattr(self, name)) for name in names] 797a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 798a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 799a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise NotImplementedError(_('.__call__() not defined')) 800a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 801a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 802a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _StoreAction(Action): 803a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 804a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 805a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 806a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest, 807a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=None, 808a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=None, 809a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=None, 810a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type=None, 811a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choices=None, 812a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=False, 813a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None, 814a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=None): 815a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if nargs == 0: 816a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError('nargs for store actions must be > 0; if you ' 817a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'have nothing to store, actions such as store ' 818a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'true or store const may be more appropriate') 819a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if const is not None and nargs != OPTIONAL: 820a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError('nargs must be %r to supply const' % OPTIONAL) 821a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_StoreAction, self).__init__( 822a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 823a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 824a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=nargs, 825a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=const, 826a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 827a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type=type, 828a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choices=choices, 829a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=required, 830a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help, 831a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=metavar) 832a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 833a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 834a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, self.dest, values) 835a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 836a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 837a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _StoreConstAction(Action): 838a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 839a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 840a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 841a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest, 842a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const, 843a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=None, 844a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=False, 845a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None, 846a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=None): 847a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_StoreConstAction, self).__init__( 848a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 849a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 850a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=0, 851a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=const, 852a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 853a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=required, 854a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help) 855a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 856a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 857a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, self.dest, self.const) 858a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 859a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 860a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _StoreTrueAction(_StoreConstAction): 861a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 862a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 863a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 864a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest, 865a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=False, 866a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=False, 867a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None): 868a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_StoreTrueAction, self).__init__( 869a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 870a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 871a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=True, 872a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 873a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=required, 874a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help) 875a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 876a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 877a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _StoreFalseAction(_StoreConstAction): 878a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 879a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 880a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 881a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest, 882a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=True, 883a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=False, 884a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None): 885a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_StoreFalseAction, self).__init__( 886a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 887a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 888a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=False, 889a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 890a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=required, 891a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help) 892a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 893a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 894a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _AppendAction(Action): 895a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 896a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 897a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 898a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest, 899a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=None, 900a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=None, 901a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=None, 902a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type=None, 903a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choices=None, 904a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=False, 905a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None, 906a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=None): 907a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if nargs == 0: 908a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError('nargs for append actions must be > 0; if arg ' 909a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'strings are not supplying the value to append, ' 910a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'the append const action may be more appropriate') 911a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if const is not None and nargs != OPTIONAL: 912a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError('nargs must be %r to supply const' % OPTIONAL) 913a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_AppendAction, self).__init__( 914a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 915a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 916a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=nargs, 917a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=const, 918a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 919a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type=type, 920a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choices=choices, 921a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=required, 922a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help, 923a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=metavar) 924a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 925a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 926a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson items = _copy.copy(_ensure_value(namespace, self.dest, [])) 927a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson items.append(values) 928a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, self.dest, items) 929a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 930a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 931a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _AppendConstAction(Action): 932a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 933a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 934a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 935a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest, 936a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const, 937a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=None, 938a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=False, 939a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None, 940a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=None): 941a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_AppendConstAction, self).__init__( 942a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 943a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 944a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=0, 945a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=const, 946a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 947a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=required, 948a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help, 949a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=metavar) 950a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 951a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 952a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson items = _copy.copy(_ensure_value(namespace, self.dest, [])) 953a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson items.append(self.const) 954a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, self.dest, items) 955a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 956a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 957a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _CountAction(Action): 958a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 959a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 960a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 961a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest, 962a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=None, 963a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=False, 964a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None): 965a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_CountAction, self).__init__( 966a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 967a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 968a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=0, 969a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 970a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=required, 971a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help) 972a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 973a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 974a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson new_count = _ensure_value(namespace, self.dest, 0) + 1 975a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, self.dest, new_count) 976a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 977a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 978a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _HelpAction(Action): 979a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 980a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 981a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 982a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=SUPPRESS, 983a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=SUPPRESS, 984a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None): 985a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_HelpAction, self).__init__( 986a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 987a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 988a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 989a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=0, 990a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help) 991a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 992a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 993a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser.print_help() 994a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser.exit() 995a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 996a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 997a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _VersionAction(Action): 998a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 999a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 1000a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 1001a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson version=None, 1002a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=SUPPRESS, 1003a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=SUPPRESS, 1004dce6e1bd5a5b41b22be10ba119fb5b6d5546959aSteven Bethard help="show program's version number and exit"): 1005a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_VersionAction, self).__init__( 1006a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 1007a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 1008a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 1009a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=0, 1010a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help) 1011a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.version = version 1012a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1013a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 1014a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson version = self.version 1015a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if version is None: 1016a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson version = parser.version 1017a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter = parser._get_formatter() 1018a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_text(version) 1019a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser.exit(message=formatter.format_help()) 1020a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1021a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1022a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _SubParsersAction(Action): 1023a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1024a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson class _ChoicesPseudoAction(Action): 1025a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1026a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, name, help): 1027a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson sup = super(_SubParsersAction._ChoicesPseudoAction, self) 1028a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson sup.__init__(option_strings=[], dest=name, help=help) 1029a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1030a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 1031a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 1032a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prog, 1033a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser_class, 1034a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=SUPPRESS, 1035a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None, 1036a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=None): 1037a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1038a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._prog_prefix = prog 1039a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._parser_class = parser_class 1040a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._name_parser_map = {} 1041a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._choices_actions = [] 1042a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1043a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_SubParsersAction, self).__init__( 1044a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 1045a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 1046a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=PARSER, 1047a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choices=self._name_parser_map, 1048a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help, 1049a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=metavar) 1050a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1051a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_parser(self, name, **kwargs): 1052a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # set prog from the existing prefix 1053a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if kwargs.get('prog') is None: 1054a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs['prog'] = '%s %s' % (self._prog_prefix, name) 1055a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1056a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # create a pseudo-action to hold the choice help 1057a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if 'help' in kwargs: 1058a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help = kwargs.pop('help') 1059a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choice_action = self._ChoicesPseudoAction(name, help) 1060a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._choices_actions.append(choice_action) 1061a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1062a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # create the parser and add it to the map 1063a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser = self._parser_class(**kwargs) 1064a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._name_parser_map[name] = parser 1065a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return parser 1066a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1067a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_subactions(self): 1068a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._choices_actions 1069a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1070a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 1071a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser_name = values[0] 1072a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings = values[1:] 1073a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1074a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # set the parser name if requested 1075a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self.dest is not SUPPRESS: 1076a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, self.dest, parser_name) 1077a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1078a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # select the parser 1079a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 1080a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser = self._name_parser_map[parser_name] 1081a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except KeyError: 1082a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = parser_name, ', '.join(self._name_parser_map) 1083fb3de6b437ba92701e162eb830bbc775cda135b5Éric Araujo msg = _('unknown parser %r (choices: %s)') % tup 1084a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(self, msg) 1085a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1086a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # parse all the remaining options into the namespace 10872e4d4c414e4275b5a8cbcd152e04ed91fb72af79Steven Bethard # store any unrecognized options on the object, so that the top 10882e4d4c414e4275b5a8cbcd152e04ed91fb72af79Steven Bethard # level parser can decide what to do with them 10892e4d4c414e4275b5a8cbcd152e04ed91fb72af79Steven Bethard namespace, arg_strings = parser.parse_known_args(arg_strings, namespace) 10902e4d4c414e4275b5a8cbcd152e04ed91fb72af79Steven Bethard if arg_strings: 10912e4d4c414e4275b5a8cbcd152e04ed91fb72af79Steven Bethard vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, []) 10922e4d4c414e4275b5a8cbcd152e04ed91fb72af79Steven Bethard getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings) 1093a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1094a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1095a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# ============== 1096a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# Type classes 1097a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# ============== 1098a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1099a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass FileType(object): 1100a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Factory for creating file object types 1101a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1102a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Instances of FileType are typically passed as type= arguments to the 1103a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson ArgumentParser add_argument() method. 1104a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1105a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Keyword Arguments: 1106a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - mode -- A string indicating how the file is to be opened. Accepts the 1107a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson same values as the builtin open() function. 1108a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - bufsize -- The file's desired buffer size. Accepts the same values as 1109a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson the builtin open() function. 1110a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 1111a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1112f8583acb534432097671e79eb4110b9861dd2e17Steven Bethard def __init__(self, mode='r', bufsize=-1): 1113a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._mode = mode 1114a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._bufsize = bufsize 1115a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1116a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, string): 1117a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # the special argument "-" means sys.std{in,out} 1118a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if string == '-': 1119a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if 'r' in self._mode: 1120a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return _sys.stdin 1121a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif 'w' in self._mode: 1122a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return _sys.stdout 1123a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1124fb3de6b437ba92701e162eb830bbc775cda135b5Éric Araujo msg = _('argument "-" with mode %r') % self._mode 1125a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError(msg) 1126a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1127a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # all other arguments are used as file names 1128f8583acb534432097671e79eb4110b9861dd2e17Steven Bethard try: 1129a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return open(string, self._mode, self._bufsize) 1130f8583acb534432097671e79eb4110b9861dd2e17Steven Bethard except IOError as e: 1131f8583acb534432097671e79eb4110b9861dd2e17Steven Bethard message = _("can't open '%s': %s") 1132f8583acb534432097671e79eb4110b9861dd2e17Steven Bethard raise ArgumentTypeError(message % (string, e)) 1133a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1134a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __repr__(self): 1135f8583acb534432097671e79eb4110b9861dd2e17Steven Bethard args = self._mode, self._bufsize 1136f8583acb534432097671e79eb4110b9861dd2e17Steven Bethard args_str = ', '.join(repr(arg) for arg in args if arg != -1) 1137a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return '%s(%s)' % (type(self).__name__, args_str) 1138a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1139a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# =========================== 1140a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# Optional and Positional Parsing 1141a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# =========================== 1142a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1143a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass Namespace(_AttributeHolder): 1144a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Simple object for storing attributes. 1145a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1146a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Implements equality by attribute names and values, and provides a simple 1147a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson string representation. 1148a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 1149a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1150a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, **kwargs): 1151a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for name in kwargs: 1152a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(self, name, kwargs[name]) 1153a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 11546b31fd0f13f5730b5a9b70be91a0edba3781e194Benjamin Peterson __hash__ = None 11556b31fd0f13f5730b5a9b70be91a0edba3781e194Benjamin Peterson 1156a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __eq__(self, other): 1157a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return vars(self) == vars(other) 1158a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1159a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __ne__(self, other): 1160a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return not (self == other) 1161a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1162a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __contains__(self, key): 1163a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return key in self.__dict__ 1164a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1165a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1166a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _ActionsContainer(object): 1167a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1168a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 1169a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson description, 1170a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prefix_chars, 1171a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson argument_default, 1172a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflict_handler): 1173a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_ActionsContainer, self).__init__() 1174a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1175a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.description = description 1176a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.argument_default = argument_default 1177a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.prefix_chars = prefix_chars 1178a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.conflict_handler = conflict_handler 1179a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1180a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # set up registries 1181a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._registries = {} 1182a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1183a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # register actions 1184a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', None, _StoreAction) 1185a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'store', _StoreAction) 1186a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'store_const', _StoreConstAction) 1187a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'store_true', _StoreTrueAction) 1188a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'store_false', _StoreFalseAction) 1189a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'append', _AppendAction) 1190a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'append_const', _AppendConstAction) 1191a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'count', _CountAction) 1192a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'help', _HelpAction) 1193a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'version', _VersionAction) 1194a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'parsers', _SubParsersAction) 1195a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1196a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # raise an exception if the conflict handler is invalid 1197a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._get_handler() 1198a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1199a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # action storage 1200a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._actions = [] 1201a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._option_string_actions = {} 1202a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1203a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # groups 1204a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._action_groups = [] 1205a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._mutually_exclusive_groups = [] 1206a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1207a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # defaults storage 1208a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._defaults = {} 1209a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1210a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # determines whether an "option" looks like a negative number 1211a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._negative_number_matcher = _re.compile(r'^-\d+$|^-\d*\.\d+$') 1212a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1213a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # whether or not there are any optionals that look like negative 1214a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # numbers -- uses a list so it can be shared and edited 1215a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._has_negative_number_optionals = [] 1216a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1217a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ==================== 1218a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Registration methods 1219a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ==================== 1220a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def register(self, registry_name, value, object): 1221a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson registry = self._registries.setdefault(registry_name, {}) 1222a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson registry[value] = object 1223a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1224a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _registry_get(self, registry_name, value, default=None): 1225a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._registries[registry_name].get(value, default) 1226a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1227a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ================================== 1228a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Namespace default accessor methods 1229a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ================================== 1230a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def set_defaults(self, **kwargs): 1231a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._defaults.update(kwargs) 1232a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1233a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if these defaults match any existing arguments, replace 1234a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # the previous default on the object with the new one 1235a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in self._actions: 1236a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.dest in kwargs: 1237a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action.default = kwargs[action.dest] 1238a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1239a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def get_default(self, dest): 1240a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in self._actions: 1241a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.dest == dest and action.default is not None: 1242a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action.default 1243a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._defaults.get(dest, None) 1244a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1245a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1246a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================= 1247a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Adding argument actions 1248a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================= 1249a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_argument(self, *args, **kwargs): 1250a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 1251a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson add_argument(dest, ..., name=value, ...) 1252a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson add_argument(option_string, option_string, ..., name=value, ...) 1253a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 1254a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1255a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if no positional args are supplied or only one is supplied and 1256a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # it doesn't look like an option string, parse a positional 1257a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # argument 1258a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson chars = self.prefix_chars 1259a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not args or len(args) == 1 and args[0][0] not in chars: 1260a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if args and 'dest' in kwargs: 1261a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError('dest supplied twice for positional argument') 1262a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs = self._get_positional_kwargs(*args, **kwargs) 1263a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1264a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # otherwise, we're adding an optional argument 1265a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1266a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs = self._get_optional_kwargs(*args, **kwargs) 1267a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1268a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if no default was supplied, use the parser-level default 1269a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if 'default' not in kwargs: 1270a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest = kwargs['dest'] 1271a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if dest in self._defaults: 1272a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs['default'] = self._defaults[dest] 1273a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif self.argument_default is not None: 1274a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs['default'] = self.argument_default 1275a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1276a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # create the action object, and add it to the parser 1277a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_class = self._pop_action_class(kwargs) 1278a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not _callable(action_class): 1279a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError('unknown action "%s"' % action_class) 1280a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = action_class(**kwargs) 1281a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1282a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # raise an error if the action type is not callable 1283a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type_func = self._registry_get('type', action.type, action.type) 1284a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not _callable(type_func): 1285a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError('%r is not callable' % type_func) 1286a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1287539586296d64a51cd58c8c45a7dd850cdcc05fccSteven Bethard # raise an error if the metavar does not match the type 1288539586296d64a51cd58c8c45a7dd850cdcc05fccSteven Bethard if hasattr(self, "_get_formatter"): 1289539586296d64a51cd58c8c45a7dd850cdcc05fccSteven Bethard try: 1290539586296d64a51cd58c8c45a7dd850cdcc05fccSteven Bethard self._get_formatter()._format_args(action, None) 1291539586296d64a51cd58c8c45a7dd850cdcc05fccSteven Bethard except TypeError: 1292539586296d64a51cd58c8c45a7dd850cdcc05fccSteven Bethard raise ValueError("length of metavar tuple does not match nargs") 1293539586296d64a51cd58c8c45a7dd850cdcc05fccSteven Bethard 1294a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._add_action(action) 1295a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1296a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_argument_group(self, *args, **kwargs): 1297a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson group = _ArgumentGroup(self, *args, **kwargs) 1298a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._action_groups.append(group) 1299a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return group 1300a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1301a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_mutually_exclusive_group(self, **kwargs): 1302a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson group = _MutuallyExclusiveGroup(self, **kwargs) 1303a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._mutually_exclusive_groups.append(group) 1304a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return group 1305a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1306a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _add_action(self, action): 1307a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # resolve any conflicts 1308a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._check_conflict(action) 1309a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1310a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add to actions list 1311a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._actions.append(action) 1312a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action.container = self 1313a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1314a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # index the action by any option strings it has 1315a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string in action.option_strings: 1316a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._option_string_actions[option_string] = action 1317a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1318a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # set the flag if any option strings look like negative numbers 1319a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string in action.option_strings: 1320a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self._negative_number_matcher.match(option_string): 1321a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not self._has_negative_number_optionals: 1322a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._has_negative_number_optionals.append(True) 1323a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1324a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the created action 1325a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action 1326a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1327a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _remove_action(self, action): 1328a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._actions.remove(action) 1329a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1330a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _add_container_actions(self, container): 1331a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # collect groups by titles 1332a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson title_group_map = {} 1333a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for group in self._action_groups: 1334a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if group.title in title_group_map: 1335a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('cannot merge actions - two groups are named %r') 1336a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError(msg % (group.title)) 1337a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson title_group_map[group.title] = group 1338a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1339a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # map each action to its group 1340a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson group_map = {} 1341a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for group in container._action_groups: 1342a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1343a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if a group with the title exists, use that, otherwise 1344a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # create a new group matching the container's group 1345a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if group.title not in title_group_map: 1346a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson title_group_map[group.title] = self.add_argument_group( 1347a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson title=group.title, 1348a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson description=group.description, 1349a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflict_handler=group.conflict_handler) 1350a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1351a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # map the actions to their new group 1352a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in group._group_actions: 1353a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson group_map[action] = title_group_map[group.title] 1354a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1355a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add container's mutually exclusive groups 1356a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # NOTE: if add_mutually_exclusive_group ever gains title= and 1357a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # description= then this code will need to be expanded as above 1358a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for group in container._mutually_exclusive_groups: 1359a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson mutex_group = self.add_mutually_exclusive_group( 1360a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=group.required) 1361a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1362a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # map the actions to their new mutex group 1363a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in group._group_actions: 1364a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson group_map[action] = mutex_group 1365a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1366a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add all actions to this container or their group 1367a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in container._actions: 1368a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson group_map.get(action, self)._add_action(action) 1369a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1370a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_positional_kwargs(self, dest, **kwargs): 1371a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # make sure required is not specified 1372a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if 'required' in kwargs: 1373a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _("'required' is an invalid argument for positionals") 1374a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise TypeError(msg) 1375a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1376a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # mark positional arguments as required if at least one is 1377a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # always required 1378a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if kwargs.get('nargs') not in [OPTIONAL, ZERO_OR_MORE]: 1379a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs['required'] = True 1380a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if kwargs.get('nargs') == ZERO_OR_MORE and 'default' not in kwargs: 1381a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs['required'] = True 1382a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1383a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the keyword arguments with no option strings 1384a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return dict(kwargs, dest=dest, option_strings=[]) 1385a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1386a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_optional_kwargs(self, *args, **kwargs): 1387a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # determine short and long option strings 1388a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings = [] 1389a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson long_option_strings = [] 1390a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string in args: 1391a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # error on strings that don't start with an appropriate prefix 1392a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not option_string[0] in self.prefix_chars: 1393a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('invalid option string %r: ' 1394a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'must start with a character %r') 1395a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = option_string, self.prefix_chars 1396a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError(msg % tup) 1397a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1398a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # strings starting with two prefix characters are long options 1399a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings.append(option_string) 1400a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string[0] in self.prefix_chars: 1401a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if len(option_string) > 1: 1402a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string[1] in self.prefix_chars: 1403a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson long_option_strings.append(option_string) 1404a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1405a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # infer destination, '--foo-bar' -> 'foo_bar' and '-x' -> 'x' 1406a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest = kwargs.pop('dest', None) 1407a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if dest is None: 1408a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if long_option_strings: 1409a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest_option_string = long_option_strings[0] 1410a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1411a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest_option_string = option_strings[0] 1412a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest = dest_option_string.lstrip(self.prefix_chars) 1413a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not dest: 1414a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('dest= is required for options like %r') 1415a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError(msg % option_string) 1416a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest = dest.replace('-', '_') 1417a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1418a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the updated keyword arguments 1419a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return dict(kwargs, dest=dest, option_strings=option_strings) 1420a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1421a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _pop_action_class(self, kwargs, default=None): 1422a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = kwargs.pop('action', default) 1423a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._registry_get('action', action, action) 1424a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1425a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_handler(self): 1426a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # determine function from conflict handler string 1427a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson handler_func_name = '_handle_conflict_%s' % self.conflict_handler 1428a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 1429a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return getattr(self, handler_func_name) 1430a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except AttributeError: 1431a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('invalid conflict_resolution value: %r') 1432a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError(msg % self.conflict_handler) 1433a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1434a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _check_conflict(self, action): 1435a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1436a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # find all options that conflict with this option 1437a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson confl_optionals = [] 1438a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string in action.option_strings: 1439a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string in self._option_string_actions: 1440a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson confl_optional = self._option_string_actions[option_string] 1441a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson confl_optionals.append((option_string, confl_optional)) 1442a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1443a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # resolve any conflicts 1444a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if confl_optionals: 1445a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflict_handler = self._get_handler() 1446a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflict_handler(action, confl_optionals) 1447a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1448a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _handle_conflict_error(self, action, conflicting_actions): 1449a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson message = _('conflicting option string(s): %s') 1450a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflict_string = ', '.join([option_string 1451a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string, action 1452a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson in conflicting_actions]) 1453a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, message % conflict_string) 1454a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1455a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _handle_conflict_resolve(self, action, conflicting_actions): 1456a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1457a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # remove all conflicting options 1458a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string, action in conflicting_actions: 1459a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1460a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # remove the conflicting option 1461a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action.option_strings.remove(option_string) 1462a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._option_string_actions.pop(option_string, None) 1463a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1464a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the option now has no option string, remove it from the 1465a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # container holding it 1466a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not action.option_strings: 1467a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action.container._remove_action(action) 1468a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1469a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1470a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _ArgumentGroup(_ActionsContainer): 1471a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1472a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, container, title=None, description=None, **kwargs): 1473a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add any missing keyword arguments by checking the container 1474a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson update = kwargs.setdefault 1475a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson update('conflict_handler', container.conflict_handler) 1476a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson update('prefix_chars', container.prefix_chars) 1477a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson update('argument_default', container.argument_default) 1478a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super_init = super(_ArgumentGroup, self).__init__ 1479a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super_init(description=description, **kwargs) 1480a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1481a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # group attributes 1482a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.title = title 1483a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._group_actions = [] 1484a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1485a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # share most attributes with the container 1486a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._registries = container._registries 1487a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._actions = container._actions 1488a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._option_string_actions = container._option_string_actions 1489a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._defaults = container._defaults 1490a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._has_negative_number_optionals = \ 1491a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson container._has_negative_number_optionals 14927f41b88bb7b978205a438c7eea2b7f6bba6862d0Steven Bethard self._mutually_exclusive_groups = container._mutually_exclusive_groups 1493a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1494a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _add_action(self, action): 1495a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = super(_ArgumentGroup, self)._add_action(action) 1496a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._group_actions.append(action) 1497a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action 1498a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1499a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _remove_action(self, action): 1500a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_ArgumentGroup, self)._remove_action(action) 1501a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._group_actions.remove(action) 1502a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1503a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1504a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _MutuallyExclusiveGroup(_ArgumentGroup): 1505a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1506a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, container, required=False): 1507a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_MutuallyExclusiveGroup, self).__init__(container) 1508a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.required = required 1509a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._container = container 1510a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1511a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _add_action(self, action): 1512a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.required: 1513a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('mutually exclusive arguments must be optional') 1514a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError(msg) 1515a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = self._container._add_action(action) 1516a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._group_actions.append(action) 1517a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action 1518a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1519a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _remove_action(self, action): 1520a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._container._remove_action(action) 1521a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._group_actions.remove(action) 1522a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1523a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1524a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass ArgumentParser(_AttributeHolder, _ActionsContainer): 1525a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Object for parsing command line strings into Python objects. 1526a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1527a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Keyword Arguments: 1528a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - prog -- The name of the program (default: sys.argv[0]) 1529a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - usage -- A usage message (default: auto-generated from arguments) 1530a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - description -- A description of what the program does 1531a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - epilog -- Text following the argument descriptions 1532a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - parents -- Parsers whose arguments should be copied into this one 1533a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - formatter_class -- HelpFormatter class for printing help messages 1534a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - prefix_chars -- Characters that prefix optional arguments 1535a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - fromfile_prefix_chars -- Characters that prefix files containing 1536a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson additional arguments 1537a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - argument_default -- The default value for all arguments 1538a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - conflict_handler -- String indicating how to handle conflicts 1539a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - add_help -- Add a -h/-help option 1540a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 1541a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1542a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 1543a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prog=None, 1544a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson usage=None, 1545a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson description=None, 1546a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson epilog=None, 1547a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson version=None, 1548a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parents=[], 1549a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter_class=HelpFormatter, 1550a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prefix_chars='-', 1551a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson fromfile_prefix_chars=None, 1552a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson argument_default=None, 1553a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflict_handler='error', 1554a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson add_help=True): 1555a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1556a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if version is not None: 1557a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson import warnings 1558a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson warnings.warn( 1559a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """The "version" argument to ArgumentParser is deprecated. """ 1560a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Please use """ 1561a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """"add_argument(..., action='version', version="N", ...)" """ 1562a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """instead""", DeprecationWarning) 1563a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1564a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson superinit = super(ArgumentParser, self).__init__ 1565a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson superinit(description=description, 1566a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prefix_chars=prefix_chars, 1567a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson argument_default=argument_default, 1568a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflict_handler=conflict_handler) 1569a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1570a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # default setting for prog 1571a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if prog is None: 1572a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prog = _os.path.basename(_sys.argv[0]) 1573a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1574a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.prog = prog 1575a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.usage = usage 1576a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.epilog = epilog 1577a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.version = version 1578a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.formatter_class = formatter_class 1579a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.fromfile_prefix_chars = fromfile_prefix_chars 1580a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.add_help = add_help 1581a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1582a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson add_group = self.add_argument_group 1583a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._positionals = add_group(_('positional arguments')) 1584a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._optionals = add_group(_('optional arguments')) 1585a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._subparsers = None 1586a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1587a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # register types 1588a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def identity(string): 1589a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return string 1590a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('type', None, identity) 1591a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1592a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add help and version arguments if necessary 1593a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # (using explicit default to override global argument_default) 15941cbf78e040b1ddfe7a1520d21ea34e1098848713R. David Murray default_prefix = '-' if '-' in prefix_chars else prefix_chars[0] 1595a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self.add_help: 1596a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.add_argument( 15971cbf78e040b1ddfe7a1520d21ea34e1098848713R. David Murray default_prefix+'h', default_prefix*2+'help', 15981cbf78e040b1ddfe7a1520d21ea34e1098848713R. David Murray action='help', default=SUPPRESS, 1599a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=_('show this help message and exit')) 1600a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self.version: 1601a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.add_argument( 16021cbf78e040b1ddfe7a1520d21ea34e1098848713R. David Murray default_prefix+'v', default_prefix*2+'version', 16031cbf78e040b1ddfe7a1520d21ea34e1098848713R. David Murray action='version', default=SUPPRESS, 1604a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson version=self.version, 1605a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=_("show program's version number and exit")) 1606a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1607a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add parent arguments and defaults 1608a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for parent in parents: 1609a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._add_container_actions(parent) 1610a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 1611a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson defaults = parent._defaults 1612a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except AttributeError: 1613a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson pass 1614a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1615a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._defaults.update(defaults) 1616a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1617a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================= 1618a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Pretty __repr__ methods 1619a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================= 1620a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_kwargs(self): 1621a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson names = [ 1622a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'prog', 1623a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'usage', 1624a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'description', 1625a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'version', 1626a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'formatter_class', 1627a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'conflict_handler', 1628a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'add_help', 1629a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson ] 1630a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return [(name, getattr(self, name)) for name in names] 1631a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1632a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ================================== 1633a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Optional/Positional adding methods 1634a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ================================== 1635a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_subparsers(self, **kwargs): 1636a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self._subparsers is not None: 1637a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(_('cannot have multiple subparser arguments')) 1638a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1639a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add the parser class to the arguments if it's not present 1640a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs.setdefault('parser_class', type(self)) 1641a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1642a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if 'title' in kwargs or 'description' in kwargs: 1643a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson title = _(kwargs.pop('title', 'subcommands')) 1644a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson description = _(kwargs.pop('description', None)) 1645a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._subparsers = self.add_argument_group(title, description) 1646a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1647a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._subparsers = self._positionals 1648a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1649a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # prog defaults to the usage message of this parser, skipping 1650a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # optional arguments and with no "usage:" prefix 1651a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if kwargs.get('prog') is None: 1652a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter = self._get_formatter() 1653a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson positionals = self._get_positional_actions() 1654a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson groups = self._mutually_exclusive_groups 1655a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_usage(self.usage, positionals, groups, '') 1656a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs['prog'] = formatter.format_help().strip() 1657a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1658a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # create the parsers action and add it to the positionals list 1659a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parsers_class = self._pop_action_class(kwargs, 'parsers') 1660a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = parsers_class(option_strings=[], **kwargs) 1661a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._subparsers._add_action(action) 1662a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1663a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the created parsers action 1664a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action 1665a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1666a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _add_action(self, action): 1667a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.option_strings: 1668a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._optionals._add_action(action) 1669a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1670a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._positionals._add_action(action) 1671a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action 1672a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1673a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_optional_actions(self): 1674a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return [action 1675a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in self._actions 1676a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.option_strings] 1677a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1678a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_positional_actions(self): 1679a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return [action 1680a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in self._actions 1681a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not action.option_strings] 1682a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1683a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ===================================== 1684a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Command line argument parsing methods 1685a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ===================================== 1686a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def parse_args(self, args=None, namespace=None): 1687a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args, argv = self.parse_known_args(args, namespace) 1688a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if argv: 1689a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('unrecognized arguments: %s') 1690a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(msg % ' '.join(argv)) 1691a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return args 1692a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1693a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def parse_known_args(self, args=None, namespace=None): 1694a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # args default to the system args 1695a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if args is None: 1696a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args = _sys.argv[1:] 1697a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1698a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # default Namespace built from parser defaults 1699a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if namespace is None: 1700a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson namespace = Namespace() 1701a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1702a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add any action defaults that aren't present 1703a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in self._actions: 1704a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.dest is not SUPPRESS: 1705a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not hasattr(namespace, action.dest): 1706a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.default is not SUPPRESS: 1707a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default = action.default 17080e717addd8a03ed10231a578fce894c07ddb157eBenjamin Peterson if isinstance(action.default, basestring): 1709a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default = self._get_value(action, default) 1710a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, action.dest, default) 1711a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1712a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add any parser defaults that aren't present 1713a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for dest in self._defaults: 1714a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not hasattr(namespace, dest): 1715a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, dest, self._defaults[dest]) 1716a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1717a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # parse the arguments and exit if there are any errors 1718a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 17192e4d4c414e4275b5a8cbcd152e04ed91fb72af79Steven Bethard namespace, args = self._parse_known_args(args, namespace) 17202e4d4c414e4275b5a8cbcd152e04ed91fb72af79Steven Bethard if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR): 17212e4d4c414e4275b5a8cbcd152e04ed91fb72af79Steven Bethard args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR)) 17222e4d4c414e4275b5a8cbcd152e04ed91fb72af79Steven Bethard delattr(namespace, _UNRECOGNIZED_ARGS_ATTR) 17232e4d4c414e4275b5a8cbcd152e04ed91fb72af79Steven Bethard return namespace, args 1724a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except ArgumentError: 1725a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson err = _sys.exc_info()[1] 1726a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(str(err)) 1727a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1728a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _parse_known_args(self, arg_strings, namespace): 1729a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # replace arg strings that are file references 1730a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self.fromfile_prefix_chars is not None: 1731a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings = self._read_args_from_files(arg_strings) 1732a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1733a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # map all mutually exclusive arguments to the other arguments 1734a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # they can't occur with 1735a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_conflicts = {} 1736a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for mutex_group in self._mutually_exclusive_groups: 1737a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson group_actions = mutex_group._group_actions 1738a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for i, mutex_action in enumerate(mutex_group._group_actions): 1739a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflicts = action_conflicts.setdefault(mutex_action, []) 1740a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflicts.extend(group_actions[:i]) 1741a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflicts.extend(group_actions[i + 1:]) 1742a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1743a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # find all option indices, and determine the arg_string_pattern 1744a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # which has an 'O' if there is an option at an index, 1745a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # an 'A' if there is an argument, or a '-' if there is a '--' 1746a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_string_indices = {} 1747a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_string_pattern_parts = [] 1748a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings_iter = iter(arg_strings) 1749a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for i, arg_string in enumerate(arg_strings_iter): 1750a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1751a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # all args after -- are non-options 1752a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if arg_string == '--': 1753a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_string_pattern_parts.append('-') 1754a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for arg_string in arg_strings_iter: 1755a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_string_pattern_parts.append('A') 1756a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1757a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # otherwise, add the arg to the arg strings 1758a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # and note the index if it was an option 1759a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1760a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_tuple = self._parse_optional(arg_string) 1761a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_tuple is None: 1762a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson pattern = 'A' 1763a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1764a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_string_indices[i] = option_tuple 1765a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson pattern = 'O' 1766a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_string_pattern_parts.append(pattern) 1767a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1768a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # join the pieces together to form the pattern 1769a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings_pattern = ''.join(arg_string_pattern_parts) 1770a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1771a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # converts arg strings to the appropriate and then takes the action 17720e717addd8a03ed10231a578fce894c07ddb157eBenjamin Peterson seen_actions = set() 17730e717addd8a03ed10231a578fce894c07ddb157eBenjamin Peterson seen_non_default_actions = set() 1774a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1775a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def take_action(action, argument_strings, option_string=None): 1776a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson seen_actions.add(action) 1777a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson argument_values = self._get_values(action, argument_strings) 1778a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1779a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # error if this argument is not allowed with other previously 1780a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # seen arguments, assuming that actions that use the default 1781a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # value don't really count as "present" 1782a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if argument_values is not action.default: 1783a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson seen_non_default_actions.add(action) 1784a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for conflict_action in action_conflicts.get(action, []): 1785a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if conflict_action in seen_non_default_actions: 1786a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('not allowed with argument %s') 1787a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_name = _get_action_name(conflict_action) 1788a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, msg % action_name) 1789a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1790a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # take the action if we didn't receive a SUPPRESS value 1791a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # (e.g. from a default) 1792a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if argument_values is not SUPPRESS: 1793a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action(self, namespace, argument_values, option_string) 1794a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1795a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # function to convert arg_strings into an optional action 1796a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def consume_optional(start_index): 1797a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1798a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # get the optional identified at this index 1799a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_tuple = option_string_indices[start_index] 1800a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action, option_string, explicit_arg = option_tuple 1801a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1802a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # identify additional optionals in the same arg string 1803a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # (e.g. -xyz is the same as -x -y -z if no args are required) 1804a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson match_argument = self._match_argument 1805a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_tuples = [] 1806a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson while True: 1807a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1808a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if we found no optional action, skip it 1809a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action is None: 1810a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson extras.append(arg_strings[start_index]) 1811a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return start_index + 1 1812a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1813a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if there is an explicit argument, try to match the 1814a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # optional's string arguments to only this 1815a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if explicit_arg is not None: 1816a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_count = match_argument(action, 'A') 1817a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1818a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the action is a single-dash option and takes no 1819a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # arguments, try to parse more single-dash options out 1820a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # of the tail of the option string 1821a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson chars = self.prefix_chars 1822a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if arg_count == 0 and option_string[1] not in chars: 1823a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_tuples.append((action, [], option_string)) 1824784dd51ad297d31ee724f38a528ba8472e4b14f9Steven Bethard char = option_string[0] 1825784dd51ad297d31ee724f38a528ba8472e4b14f9Steven Bethard option_string = char + explicit_arg[0] 1826784dd51ad297d31ee724f38a528ba8472e4b14f9Steven Bethard new_explicit_arg = explicit_arg[1:] or None 1827784dd51ad297d31ee724f38a528ba8472e4b14f9Steven Bethard optionals_map = self._option_string_actions 1828784dd51ad297d31ee724f38a528ba8472e4b14f9Steven Bethard if option_string in optionals_map: 1829784dd51ad297d31ee724f38a528ba8472e4b14f9Steven Bethard action = optionals_map[option_string] 1830784dd51ad297d31ee724f38a528ba8472e4b14f9Steven Bethard explicit_arg = new_explicit_arg 1831a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1832a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('ignored explicit argument %r') 1833a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, msg % explicit_arg) 1834a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1835a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the action expect exactly one argument, we've 1836a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # successfully matched the option; exit the loop 1837a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif arg_count == 1: 1838a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson stop = start_index + 1 1839a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args = [explicit_arg] 1840a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_tuples.append((action, args, option_string)) 1841a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson break 1842a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1843a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # error if a double-dash option did not use the 1844a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # explicit argument 1845a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1846a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('ignored explicit argument %r') 1847a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, msg % explicit_arg) 1848a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1849a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if there is no explicit argument, try to match the 1850a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # optional's string arguments with the following strings 1851a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if successful, exit the loop 1852a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1853a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson start = start_index + 1 1854a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson selected_patterns = arg_strings_pattern[start:] 1855a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_count = match_argument(action, selected_patterns) 1856a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson stop = start + arg_count 1857a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args = arg_strings[start:stop] 1858a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_tuples.append((action, args, option_string)) 1859a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson break 1860a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1861a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add the Optional to the list and return the index at which 1862a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # the Optional's string args stopped 1863a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson assert action_tuples 1864a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action, args, option_string in action_tuples: 1865a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson take_action(action, args, option_string) 1866a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return stop 1867a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1868a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # the list of Positionals left to be parsed; this is modified 1869a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # by consume_positionals() 1870a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson positionals = self._get_positional_actions() 1871a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1872a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # function to convert arg_strings into positional actions 1873a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def consume_positionals(start_index): 1874a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # match as many Positionals as possible 1875a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson match_partial = self._match_arguments_partial 1876a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson selected_pattern = arg_strings_pattern[start_index:] 1877a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_counts = match_partial(positionals, selected_pattern) 1878a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1879a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # slice off the appropriate arg strings for each Positional 1880a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # and add the Positional and its args to the list 1881a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action, arg_count in zip(positionals, arg_counts): 1882a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args = arg_strings[start_index: start_index + arg_count] 1883a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson start_index += arg_count 1884a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson take_action(action, args) 1885a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1886a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # slice off the Positionals that we just parsed and return the 1887a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # index at which the Positionals' string args stopped 1888a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson positionals[:] = positionals[len(arg_counts):] 1889a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return start_index 1890a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1891a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # consume Positionals and Optionals alternately, until we have 1892a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # passed the last option string 1893a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson extras = [] 1894a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson start_index = 0 1895a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string_indices: 1896a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson max_option_string_index = max(option_string_indices) 1897a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1898a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson max_option_string_index = -1 1899a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson while start_index <= max_option_string_index: 1900a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1901a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # consume any Positionals preceding the next option 1902a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson next_option_string_index = min([ 1903a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson index 1904a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for index in option_string_indices 1905a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if index >= start_index]) 1906a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if start_index != next_option_string_index: 1907a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson positionals_end_index = consume_positionals(start_index) 1908a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1909a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # only try to parse the next optional if we didn't consume 1910a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # the option string during the positionals parsing 1911a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if positionals_end_index > start_index: 1912a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson start_index = positionals_end_index 1913a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson continue 1914a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1915a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson start_index = positionals_end_index 1916a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1917a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if we consumed all the positionals we could and we're not 1918a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # at the index of an option string, there were extra arguments 1919a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if start_index not in option_string_indices: 1920a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson strings = arg_strings[start_index:next_option_string_index] 1921a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson extras.extend(strings) 1922a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson start_index = next_option_string_index 1923a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1924a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # consume the next optional and any arguments for it 1925a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson start_index = consume_optional(start_index) 1926a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1927a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # consume any positionals following the last Optional 1928a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson stop_index = consume_positionals(start_index) 1929a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1930a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if we didn't consume all the argument strings, there were extras 1931a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson extras.extend(arg_strings[stop_index:]) 1932a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1933a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if we didn't use all the Positional objects, there were too few 1934a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # arg strings supplied. 1935a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if positionals: 1936a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(_('too few arguments')) 1937a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1938a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # make sure all required actions were present 1939a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in self._actions: 1940a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.required: 1941a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action not in seen_actions: 1942a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson name = _get_action_name(action) 1943a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(_('argument %s is required') % name) 1944a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1945a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # make sure all required groups had one option present 1946a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for group in self._mutually_exclusive_groups: 1947a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if group.required: 1948a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in group._group_actions: 1949a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action in seen_non_default_actions: 1950a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson break 1951a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1952a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if no actions were used, report the error 1953a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1954a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson names = [_get_action_name(action) 1955a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in group._group_actions 1956a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.help is not SUPPRESS] 1957a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('one of the arguments %s is required') 1958a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(msg % ' '.join(names)) 1959a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1960a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the updated namespace and the extra arguments 1961a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return namespace, extras 1962a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1963a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _read_args_from_files(self, arg_strings): 1964a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # expand arguments referencing files 1965a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson new_arg_strings = [] 1966a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for arg_string in arg_strings: 1967a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1968a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # for regular arguments, just add them back into the list 1969a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if arg_string[0] not in self.fromfile_prefix_chars: 1970a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson new_arg_strings.append(arg_string) 1971a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1972a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # replace arguments referencing files with the file content 1973a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1974a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 1975a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args_file = open(arg_string[1:]) 1976a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 1977a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings = [] 1978a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for arg_line in args_file.read().splitlines(): 1979a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for arg in self.convert_arg_line_to_args(arg_line): 1980a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings.append(arg) 1981a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings = self._read_args_from_files(arg_strings) 1982a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson new_arg_strings.extend(arg_strings) 1983a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson finally: 1984a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args_file.close() 1985a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except IOError: 1986a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson err = _sys.exc_info()[1] 1987a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(str(err)) 1988a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1989a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the modified argument list 1990a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return new_arg_strings 1991a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1992a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def convert_arg_line_to_args(self, arg_line): 1993a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return [arg_line] 1994a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1995a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _match_argument(self, action, arg_strings_pattern): 1996a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # match the pattern for this action to the arg strings 1997a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = self._get_nargs_pattern(action) 1998a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson match = _re.match(nargs_pattern, arg_strings_pattern) 1999a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2000a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # raise an exception if we weren't able to find a match 2001a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if match is None: 2002a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_errors = { 2003a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson None: _('expected one argument'), 2004a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson OPTIONAL: _('expected at most one argument'), 2005a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson ONE_OR_MORE: _('expected at least one argument'), 2006a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson } 2007a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default = _('expected %s argument(s)') % action.nargs 2008a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = nargs_errors.get(action.nargs, default) 2009a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, msg) 2010a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2011a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the number of arguments matched 2012a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return len(match.group(1)) 2013a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2014a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _match_arguments_partial(self, actions, arg_strings_pattern): 2015a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # progressively shorten the actions list by slicing off the 2016a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # final actions until we find a match 2017a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = [] 2018a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for i in range(len(actions), 0, -1): 2019a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson actions_slice = actions[:i] 2020a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson pattern = ''.join([self._get_nargs_pattern(action) 2021a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in actions_slice]) 2022a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson match = _re.match(pattern, arg_strings_pattern) 2023a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if match is not None: 2024a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result.extend([len(string) for string in match.groups()]) 2025a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson break 2026a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2027a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the list of arg string counts 2028a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return result 2029a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2030a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _parse_optional(self, arg_string): 2031a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if it's an empty string, it was meant to be a positional 2032a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not arg_string: 2033a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return None 2034a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2035a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if it doesn't start with a prefix, it was meant to be positional 2036a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not arg_string[0] in self.prefix_chars: 2037a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return None 2038a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2039a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the option string is present in the parser, return the action 2040a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if arg_string in self._option_string_actions: 2041a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = self._option_string_actions[arg_string] 2042a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action, arg_string, None 2043a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2044a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if it's just a single character, it was meant to be positional 2045a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if len(arg_string) == 1: 2046a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return None 2047a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2048a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the option string before the "=" is present, return the action 2049a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if '=' in arg_string: 2050a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_string, explicit_arg = arg_string.split('=', 1) 2051a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string in self._option_string_actions: 2052a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = self._option_string_actions[option_string] 2053a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action, option_string, explicit_arg 2054a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2055a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # search through all possible prefixes of the option string 2056a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # and all actions in the parser for possible interpretations 2057a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_tuples = self._get_option_tuples(arg_string) 2058a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2059a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if multiple actions match, the option string was ambiguous 2060a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if len(option_tuples) > 1: 2061a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson options = ', '.join([option_string 2062a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action, option_string, explicit_arg in option_tuples]) 2063a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = arg_string, options 2064a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(_('ambiguous option: %s could match %s') % tup) 2065a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2066a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if exactly one action matched, this segmentation is good, 2067a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # so return the parsed action 2068a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif len(option_tuples) == 1: 2069a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_tuple, = option_tuples 2070a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return option_tuple 2071a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2072a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if it was not found as an option, but it looks like a negative 2073a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # number, it was meant to be positional 2074a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # unless there are negative-number-like options 2075a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self._negative_number_matcher.match(arg_string): 2076a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not self._has_negative_number_optionals: 2077a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return None 2078a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2079a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if it contains a space, it was meant to be a positional 2080a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if ' ' in arg_string: 2081a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return None 2082a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2083a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # it was meant to be an optional but there is no such option 2084a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # in this parser (though it might be a valid option in a subparser) 2085a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return None, arg_string, None 2086a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2087a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_option_tuples(self, option_string): 2088a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = [] 2089a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2090a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # option strings starting with two prefix characters are only 2091a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # split at the '=' 2092a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson chars = self.prefix_chars 2093a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string[0] in chars and option_string[1] in chars: 2094a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if '=' in option_string: 2095a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_prefix, explicit_arg = option_string.split('=', 1) 2096a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 2097a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_prefix = option_string 2098a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson explicit_arg = None 2099a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string in self._option_string_actions: 2100a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string.startswith(option_prefix): 2101a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = self._option_string_actions[option_string] 2102a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = action, option_string, explicit_arg 2103a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result.append(tup) 2104a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2105a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # single character options can be concatenated with their arguments 2106a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # but multiple character options always have to have their argument 2107a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # separate 2108a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif option_string[0] in chars and option_string[1] not in chars: 2109a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_prefix = option_string 2110a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson explicit_arg = None 2111a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson short_option_prefix = option_string[:2] 2112a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson short_explicit_arg = option_string[2:] 2113a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2114a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string in self._option_string_actions: 2115a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string == short_option_prefix: 2116a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = self._option_string_actions[option_string] 2117a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = action, option_string, short_explicit_arg 2118a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result.append(tup) 2119a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif option_string.startswith(option_prefix): 2120a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = self._option_string_actions[option_string] 2121a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = action, option_string, explicit_arg 2122a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result.append(tup) 2123a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2124a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # shouldn't ever get here 2125a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 2126a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(_('unexpected option string: %s') % option_string) 2127a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2128a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the collected option tuples 2129a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return result 2130a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2131a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_nargs_pattern(self, action): 2132a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # in all examples below, we have to allow for '--' args 2133a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # which are represented as '-' in the pattern 2134a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs = action.nargs 2135a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2136a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # the default (None) is assumed to be a single argument 2137a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if nargs is None: 2138a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = '(-*A-*)' 2139a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2140a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # allow zero or one arguments 2141a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif nargs == OPTIONAL: 2142a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = '(-*A?-*)' 2143a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2144a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # allow zero or more arguments 2145a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif nargs == ZERO_OR_MORE: 2146a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = '(-*[A-]*)' 2147a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2148a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # allow one or more arguments 2149a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif nargs == ONE_OR_MORE: 2150a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = '(-*A[A-]*)' 2151a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2152a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # allow any number of options or arguments 2153a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif nargs == REMAINDER: 2154a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = '([-AO]*)' 2155a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2156a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # allow one argument followed by any number of options or arguments 2157a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif nargs == PARSER: 2158a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = '(-*A[-AO]*)' 2159a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2160a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # all others should be integers 2161a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 2162a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs) 2163a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2164a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if this is an optional action, -- is not allowed 2165a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.option_strings: 2166a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = nargs_pattern.replace('-*', '') 2167a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = nargs_pattern.replace('-', '') 2168a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2169a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the pattern 2170a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return nargs_pattern 2171a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2172a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================== 2173a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Value conversion methods 2174a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================== 2175a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_values(self, action, arg_strings): 2176a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # for everything but PARSER args, strip out '--' 2177a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.nargs not in [PARSER, REMAINDER]: 2178a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings = [s for s in arg_strings if s != '--'] 2179a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2180a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # optional argument produces a default when not present 2181a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not arg_strings and action.nargs == OPTIONAL: 2182a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.option_strings: 2183a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = action.const 2184a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 2185a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = action.default 21860e717addd8a03ed10231a578fce894c07ddb157eBenjamin Peterson if isinstance(value, basestring): 2187a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = self._get_value(action, value) 2188a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._check_value(action, value) 2189a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2190a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # when nargs='*' on a positional, if there were no command-line 2191a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # args, use the default if it is anything other than None 2192a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif (not arg_strings and action.nargs == ZERO_OR_MORE and 2193a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson not action.option_strings): 2194a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.default is not None: 2195a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = action.default 2196a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 2197a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = arg_strings 2198a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._check_value(action, value) 2199a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2200a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # single argument or optional argument produces a single value 2201a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif len(arg_strings) == 1 and action.nargs in [None, OPTIONAL]: 2202a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_string, = arg_strings 2203a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = self._get_value(action, arg_string) 2204a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._check_value(action, value) 2205a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2206a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # REMAINDER arguments convert all values, checking none 2207a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif action.nargs == REMAINDER: 2208a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = [self._get_value(action, v) for v in arg_strings] 2209a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2210a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # PARSER arguments convert all values, but check only the first 2211a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif action.nargs == PARSER: 2212a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = [self._get_value(action, v) for v in arg_strings] 2213a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._check_value(action, value[0]) 2214a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2215a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # all other types of nargs produce a list 2216a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 2217a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = [self._get_value(action, v) for v in arg_strings] 2218a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for v in value: 2219a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._check_value(action, v) 2220a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2221a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the converted value 2222a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return value 2223a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2224a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_value(self, action, arg_string): 2225a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type_func = self._registry_get('type', action.type, action.type) 2226a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not _callable(type_func): 2227a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('%r is not callable') 2228a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, msg % type_func) 2229a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2230a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # convert the value to the appropriate type 2231a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 2232a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = type_func(arg_string) 2233a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2234a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ArgumentTypeErrors indicate errors 2235a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except ArgumentTypeError: 2236a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson name = getattr(action.type, '__name__', repr(action.type)) 2237a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = str(_sys.exc_info()[1]) 2238a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, msg) 2239a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2240a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # TypeErrors or ValueErrors also indicate errors 2241a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except (TypeError, ValueError): 2242a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson name = getattr(action.type, '__name__', repr(action.type)) 2243a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('invalid %s value: %r') 2244a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, msg % (name, arg_string)) 2245a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2246a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the converted value 2247a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return result 2248a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2249a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _check_value(self, action, value): 2250a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # converted value must be one of the choices (if specified) 2251a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.choices is not None and value not in action.choices: 2252a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = value, ', '.join(map(repr, action.choices)) 2253a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('invalid choice: %r (choose from %s)') % tup 2254a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, msg) 2255a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2256a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================= 2257a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Help-formatting methods 2258a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================= 2259a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def format_usage(self): 2260a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter = self._get_formatter() 2261a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_usage(self.usage, self._actions, 2262a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._mutually_exclusive_groups) 2263a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return formatter.format_help() 2264a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2265a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def format_help(self): 2266a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter = self._get_formatter() 2267a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2268a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # usage 2269a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_usage(self.usage, self._actions, 2270a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._mutually_exclusive_groups) 2271a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2272a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # description 2273a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_text(self.description) 2274a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2275a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # positionals, optionals and user-defined groups 2276a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action_group in self._action_groups: 2277a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.start_section(action_group.title) 2278a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_text(action_group.description) 2279a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_arguments(action_group._group_actions) 2280a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.end_section() 2281a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2282a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # epilog 2283a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_text(self.epilog) 2284a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2285a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # determine help from format above 2286a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return formatter.format_help() 2287a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2288a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def format_version(self): 2289a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson import warnings 2290a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson warnings.warn( 2291a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'The format_version method is deprecated -- the "version" ' 2292a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'argument to ArgumentParser is no longer supported.', 2293a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson DeprecationWarning) 2294a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter = self._get_formatter() 2295a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_text(self.version) 2296a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return formatter.format_help() 2297a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2298a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_formatter(self): 2299a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self.formatter_class(prog=self.prog) 2300a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2301a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ===================== 2302a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Help-printing methods 2303a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ===================== 2304a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def print_usage(self, file=None): 2305a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if file is None: 2306a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson file = _sys.stdout 2307a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._print_message(self.format_usage(), file) 2308a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2309a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def print_help(self, file=None): 2310a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if file is None: 2311a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson file = _sys.stdout 2312a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._print_message(self.format_help(), file) 2313a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2314a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def print_version(self, file=None): 2315a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson import warnings 2316a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson warnings.warn( 2317a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'The print_version method is deprecated -- the "version" ' 2318a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'argument to ArgumentParser is no longer supported.', 2319a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson DeprecationWarning) 2320a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._print_message(self.format_version(), file) 2321a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2322a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _print_message(self, message, file=None): 2323a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if message: 2324a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if file is None: 2325a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson file = _sys.stderr 2326a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson file.write(message) 2327a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2328a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # =============== 2329a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Exiting methods 2330a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # =============== 2331a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def exit(self, status=0, message=None): 2332a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if message: 2333a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._print_message(message, _sys.stderr) 2334a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson _sys.exit(status) 2335a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2336a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def error(self, message): 2337a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """error(message: string) 2338a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2339a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Prints a usage message incorporating the message to stderr and 2340a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson exits. 2341a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2342a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson If you override this in a subclass, it should not return -- it 2343a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson should either exit or raise an exception. 2344a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 2345a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.print_usage(_sys.stderr) 2346a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.exit(2, _('%s: error: %s\n') % (self.prog, message)) 2347