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