argparse.py revision 7cb20a8605d79faae64cccf8bbe8418b492f0e30
12b37fc4ce3efef7d49c3c989de0667c2a319048dBenjamin Peterson# Author: Steven J. Bethard <steven.bethard@gmail.com>. 2698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 3698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson"""Command-line parsing library 4698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 5698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin PetersonThis module is an optparse-inspired command-line parsing library that: 6698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 7698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - handles both optional and positional arguments 8698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - produces highly informative usage messages 9698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - supports parsers that dispatch to sub-parsers 10698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 11698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin PetersonThe following is a simple usage example that sums integers from the 12698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersoncommand-line and writes the result to a file:: 13698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 14698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parser = argparse.ArgumentParser( 15698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson description='sum the integers at the command line') 16698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parser.add_argument( 17698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'integers', metavar='int', nargs='+', type=int, 18698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help='an integer to be summed') 19698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parser.add_argument( 20698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson '--log', default=sys.stdout, type=argparse.FileType('w'), 21698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help='the file where the sum should be written') 22698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson args = parser.parse_args() 23698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson args.log.write('%s' % sum(args.integers)) 24698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson args.log.close() 25698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 26698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin PetersonThe module contains the following public classes: 27698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 28698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - ArgumentParser -- The main entry point for command-line parsing. As the 29698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson example above shows, the add_argument() method is used to populate 30698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson the parser with actions for optional and positional arguments. Then 31698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson the parse_args() method is invoked to convert the args at the 32698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson command-line into an object with attributes. 33698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 34698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - ArgumentError -- The exception raised by ArgumentParser objects when 35698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson there are errors with the parser's actions. Errors raised while 36698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parsing the command-line are caught by ArgumentParser and emitted 37698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson as command-line messages. 38698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 39698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - FileType -- A factory for defining types of files to be created. As the 40698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson example above shows, instances of FileType are typically passed as 41698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson the type= argument of add_argument() calls. 42698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 43698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - Action -- The base class for parser actions. Typically actions are 44698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson selected by passing strings like 'store_true' or 'append_const' to 45698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson the action= argument of add_argument(). However, for greater 46698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson customization of ArgumentParser actions, subclasses of Action may 47698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson be defined and passed as the action= argument. 48698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 49698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - HelpFormatter, RawDescriptionHelpFormatter, RawTextHelpFormatter, 50698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson ArgumentDefaultsHelpFormatter -- Formatter classes which 51698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson may be passed as the formatter_class= argument to the 52698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson ArgumentParser constructor. HelpFormatter is the default, 53698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson RawDescriptionHelpFormatter and RawTextHelpFormatter tell the parser 54698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson not to change the formatting for help text, and 55698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson ArgumentDefaultsHelpFormatter adds information about argument defaults 56698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson to the help. 57698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 58698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin PetersonAll other classes in this module are considered implementation details. 59698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson(Also note that HelpFormatter and RawDescriptionHelpFormatter are only 60698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonconsidered public as object names -- the API of the formatter objects is 61698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonstill considered an implementation detail.) 62698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson""" 63698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 64698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson__version__ = '1.1' 65698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson__all__ = [ 66698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'ArgumentParser', 67698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'ArgumentError', 6872c553829a271923fc110c23af49b8a4a0a5367eSteven Bethard 'ArgumentTypeError', 69698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'FileType', 70698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'HelpFormatter', 7172c553829a271923fc110c23af49b8a4a0a5367eSteven Bethard 'ArgumentDefaultsHelpFormatter', 72698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'RawDescriptionHelpFormatter', 73698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'RawTextHelpFormatter', 7472c553829a271923fc110c23af49b8a4a0a5367eSteven Bethard 'Namespace', 7572c553829a271923fc110c23af49b8a4a0a5367eSteven Bethard 'Action', 7672c553829a271923fc110c23af49b8a4a0a5367eSteven Bethard 'ONE_OR_MORE', 7772c553829a271923fc110c23af49b8a4a0a5367eSteven Bethard 'OPTIONAL', 7872c553829a271923fc110c23af49b8a4a0a5367eSteven Bethard 'PARSER', 7972c553829a271923fc110c23af49b8a4a0a5367eSteven Bethard 'REMAINDER', 8072c553829a271923fc110c23af49b8a4a0a5367eSteven Bethard 'SUPPRESS', 8172c553829a271923fc110c23af49b8a4a0a5367eSteven Bethard 'ZERO_OR_MORE', 82698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson] 83698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 84698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 858a6a198abff504067fb74b669c672901a97a44b6Steven Bethardimport collections as _collections 86698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonimport copy as _copy 87698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonimport os as _os 88698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonimport re as _re 89698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonimport sys as _sys 90698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonimport textwrap as _textwrap 91698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 921215915045d620d44e14ba12af8949f8ec700b5dÉric Araujofrom gettext import gettext as _, ngettext 93698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 94698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 95698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersondef _callable(obj): 96698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return hasattr(obj, '__call__') or hasattr(obj, '__bases__') 97698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 98698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 99698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin PetersonSUPPRESS = '==SUPPRESS==' 100698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 101698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin PetersonOPTIONAL = '?' 102698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin PetersonZERO_OR_MORE = '*' 103698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin PetersonONE_OR_MORE = '+' 104698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin PetersonPARSER = 'A...' 105698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin PetersonREMAINDER = '...' 106fca2e8aeb8e841a18c4b9d2954254b2a086a3d56Steven Bethard_UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args' 107698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 108698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# ============================= 109698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# Utility functions and classes 110698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# ============================= 111698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 112698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass _AttributeHolder(object): 113698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """Abstract base class that provides __repr__. 114698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 115698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson The __repr__ method returns a string in the format:: 116698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson ClassName(attr=name, attr=name, ...) 117698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson The attributes are determined either by a class-level attribute, 118698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson '_kwarg_names', or by inspecting the instance __dict__. 119698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """ 120698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 121698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __repr__(self): 122698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson type_name = type(self).__name__ 123698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_strings = [] 124698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for arg in self._get_args(): 125698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_strings.append(repr(arg)) 126698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for name, value in self._get_kwargs(): 127698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_strings.append('%s=%r' % (name, value)) 128698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return '%s(%s)' % (type_name, ', '.join(arg_strings)) 129698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 130698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_kwargs(self): 13116f2fd013d4559f1458efbf21c68034d85bb255eBenjamin Peterson return sorted(self.__dict__.items()) 132698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 133698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_args(self): 134698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return [] 135698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 136698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 137698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersondef _ensure_value(namespace, name, value): 138698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if getattr(namespace, name, None) is None: 139698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson setattr(namespace, name, value) 140698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return getattr(namespace, name) 141698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 142698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 143698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# =============== 144698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# Formatting Help 145698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# =============== 146698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 147698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass HelpFormatter(object): 148698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """Formatter for generating usage messages and argument help strings. 149698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 150698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson Only the name of this class is considered a public API. All the methods 151698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson provided by the class are considered an implementation detail. 152698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """ 153698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 154698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, 155698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson prog, 156698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson indent_increment=2, 157698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson max_help_position=24, 158698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson width=None): 159698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 160698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # default setting for width 161698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if width is None: 162698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson try: 163698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson width = int(_os.environ['COLUMNS']) 164698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson except (KeyError, ValueError): 165698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson width = 80 166698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson width -= 2 167698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 168698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._prog = prog 169698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._indent_increment = indent_increment 170698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._max_help_position = max_help_position 171698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._width = width 172698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 173698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._current_indent = 0 174698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._level = 0 175698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._action_max_length = 0 176698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 177698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._root_section = self._Section(self, None) 178698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._current_section = self._root_section 179698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 180698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._whitespace_matcher = _re.compile(r'\s+') 181698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._long_break_matcher = _re.compile(r'\n\n\n+') 182698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 183698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # =============================== 184698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # Section and indentation methods 185698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # =============================== 186698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _indent(self): 187698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._current_indent += self._indent_increment 188698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._level += 1 189698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 190698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _dedent(self): 191698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._current_indent -= self._indent_increment 192698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson assert self._current_indent >= 0, 'Indent decreased below 0.' 193698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._level -= 1 194698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 195698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson class _Section(object): 196698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 197698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, formatter, parent, heading=None): 198698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.formatter = formatter 199698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.parent = parent 200698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.heading = heading 201698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.items = [] 202698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 203698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def format_help(self): 204698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # format the indented section 205698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if self.parent is not None: 206698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.formatter._indent() 207698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson join = self.formatter._join_parts 208698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for func, args in self.items: 209698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson func(*args) 210698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson item_help = join([func(*args) for func, args in self.items]) 211698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if self.parent is not None: 212698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.formatter._dedent() 213698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 214698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # return nothing if the section was empty 215698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not item_help: 216698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return '' 217698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 218698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # add the heading if the section was non-empty 219698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if self.heading is not SUPPRESS and self.heading is not None: 220698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson current_indent = self.formatter._current_indent 221698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson heading = '%*s%s:\n' % (current_indent, '', self.heading) 222698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 223698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson heading = '' 224698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 225698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # join the section-initial newline, the heading and the help 226698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return join(['\n', heading, item_help, '\n']) 227698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 228698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _add_item(self, func, args): 229698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._current_section.items.append((func, args)) 230698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 231698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ======================== 232698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # Message building methods 233698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ======================== 234698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def start_section(self, heading): 235698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._indent() 236698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson section = self._Section(self, self._current_section, heading) 237698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._add_item(section.format_help, []) 238698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._current_section = section 239698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 240698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def end_section(self): 241698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._current_section = self._current_section.parent 242698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._dedent() 243698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 244698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def add_text(self, text): 245698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if text is not SUPPRESS and text is not None: 246698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._add_item(self._format_text, [text]) 247698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 248698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def add_usage(self, usage, actions, groups, prefix=None): 249698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if usage is not SUPPRESS: 250698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson args = usage, actions, groups, prefix 251698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._add_item(self._format_usage, args) 252698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 253698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def add_argument(self, action): 254698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.help is not SUPPRESS: 255698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 256698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # find all invocations 257698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson get_invocation = self._format_action_invocation 258698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson invocations = [get_invocation(action)] 259698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for subaction in self._iter_indented_subactions(action): 260698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson invocations.append(get_invocation(subaction)) 261698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 262698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # update the maximum item length 263698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson invocation_length = max([len(s) for s in invocations]) 264698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action_length = invocation_length + self._current_indent 265698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._action_max_length = max(self._action_max_length, 266698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action_length) 267698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 268698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # add the item to the list 269698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._add_item(self._format_action, [action]) 270698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 271698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def add_arguments(self, actions): 272698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action in actions: 273698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.add_argument(action) 274698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 275698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ======================= 276698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # Help-formatting methods 277698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ======================= 278698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def format_help(self): 279698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help = self._root_section.format_help() 280698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if help: 281698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help = self._long_break_matcher.sub('\n\n', help) 282698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help = help.strip('\n') + '\n' 283698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return help 284698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 285698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _join_parts(self, part_strings): 286698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return ''.join([part 287698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for part in part_strings 288698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if part and part is not SUPPRESS]) 289698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 290698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _format_usage(self, usage, actions, groups, prefix): 291698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if prefix is None: 292698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson prefix = _('usage: ') 293698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 294698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if usage is specified, use that 295698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if usage is not None: 296698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson usage = usage % dict(prog=self._prog) 297698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 298698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if no optionals or positionals are available, usage is just prog 299698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif usage is None and not actions: 300698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson usage = '%(prog)s' % dict(prog=self._prog) 301698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 302698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if optionals and positionals are available, calculate usage 303698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif usage is None: 304698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson prog = '%(prog)s' % dict(prog=self._prog) 305698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 306698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # split optionals from positionals 307698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson optionals = [] 308698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson positionals = [] 309698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action in actions: 310698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.option_strings: 311698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson optionals.append(action) 312698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 313698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson positionals.append(action) 314698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 315698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # build full usage string 316698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson format = self._format_actions_usage 317698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action_usage = format(optionals + positionals, groups) 318698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson usage = ' '.join([s for s in [prog, action_usage] if s]) 319698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 320698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # wrap the usage parts if it's too long 321698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson text_width = self._width - self._current_indent 322698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if len(prefix) + len(usage) > text_width: 323698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 324698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # break usage into wrappable parts 325698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson part_regexp = r'\(.*?\)+|\[.*?\]+|\S+' 326698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson opt_usage = format(optionals, groups) 327698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson pos_usage = format(positionals, groups) 328698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson opt_parts = _re.findall(part_regexp, opt_usage) 329698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson pos_parts = _re.findall(part_regexp, pos_usage) 330698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson assert ' '.join(opt_parts) == opt_usage 331698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson assert ' '.join(pos_parts) == pos_usage 332698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 333698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # helper for wrapping lines 334698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def get_lines(parts, indent, prefix=None): 335698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson lines = [] 336698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson line = [] 337698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if prefix is not None: 338698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson line_len = len(prefix) - 1 339698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 340698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson line_len = len(indent) - 1 341698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for part in parts: 342698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if line_len + 1 + len(part) > text_width: 343698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson lines.append(indent + ' '.join(line)) 344698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson line = [] 345698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson line_len = len(indent) - 1 346698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson line.append(part) 347698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson line_len += len(part) + 1 348698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if line: 349698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson lines.append(indent + ' '.join(line)) 350698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if prefix is not None: 351698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson lines[0] = lines[0][len(indent):] 352698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return lines 353698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 354698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if prog is short, follow it with optionals or positionals 355698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if len(prefix) + len(prog) <= 0.75 * text_width: 356698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson indent = ' ' * (len(prefix) + len(prog) + 1) 357698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if opt_parts: 358698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson lines = get_lines([prog] + opt_parts, indent, prefix) 359698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson lines.extend(get_lines(pos_parts, indent)) 360698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif pos_parts: 361698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson lines = get_lines([prog] + pos_parts, indent, prefix) 362698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 363698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson lines = [prog] 364698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 365698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if prog is long, put it on its own line 366698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 367698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson indent = ' ' * len(prefix) 368698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parts = opt_parts + pos_parts 369698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson lines = get_lines(parts, indent) 370698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if len(lines) > 1: 371698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson lines = [] 372698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson lines.extend(get_lines(opt_parts, indent)) 373698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson lines.extend(get_lines(pos_parts, indent)) 374698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson lines = [prog] + lines 375698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 376698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # join lines into usage 377698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson usage = '\n'.join(lines) 378698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 379698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # prefix with 'usage:' 380698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return '%s%s\n\n' % (prefix, usage) 381698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 382698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _format_actions_usage(self, actions, groups): 383698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # find group indices and identify actions in groups 38416f2fd013d4559f1458efbf21c68034d85bb255eBenjamin Peterson group_actions = set() 385698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson inserts = {} 386698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for group in groups: 387698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson try: 388698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson start = actions.index(group._group_actions[0]) 389698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson except ValueError: 390698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson continue 391698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 392698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson end = start + len(group._group_actions) 393698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if actions[start:end] == group._group_actions: 394698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action in group._group_actions: 395698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson group_actions.add(action) 396698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not group.required: 39749998eec49f16262381219eb43dcb58bbe092842Steven Bethard if start in inserts: 39849998eec49f16262381219eb43dcb58bbe092842Steven Bethard inserts[start] += ' [' 39949998eec49f16262381219eb43dcb58bbe092842Steven Bethard else: 40049998eec49f16262381219eb43dcb58bbe092842Steven Bethard inserts[start] = '[' 401698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson inserts[end] = ']' 402698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 40349998eec49f16262381219eb43dcb58bbe092842Steven Bethard if start in inserts: 40449998eec49f16262381219eb43dcb58bbe092842Steven Bethard inserts[start] += ' (' 40549998eec49f16262381219eb43dcb58bbe092842Steven Bethard else: 40649998eec49f16262381219eb43dcb58bbe092842Steven Bethard inserts[start] = '(' 407698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson inserts[end] = ')' 408698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for i in range(start + 1, end): 409698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson inserts[i] = '|' 410698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 411698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # collect all actions format strings 412698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parts = [] 413698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for i, action in enumerate(actions): 414698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 415698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # suppressed arguments are marked with None 416698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # remove | separators for suppressed arguments 417698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.help is SUPPRESS: 418698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parts.append(None) 419698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if inserts.get(i) == '|': 420698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson inserts.pop(i) 421698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif inserts.get(i + 1) == '|': 422698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson inserts.pop(i + 1) 423698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 424698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # produce all arg strings 425698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif not action.option_strings: 426698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson part = self._format_args(action, action.dest) 427698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 428698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if it's in a group, strip the outer [] 429698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action in group_actions: 430698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if part[0] == '[' and part[-1] == ']': 431698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson part = part[1:-1] 432698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 433698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # add the action string to the list 434698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parts.append(part) 435698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 436698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # produce the first way to invoke the option in brackets 437698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 438698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_string = action.option_strings[0] 439698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 440698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if the Optional doesn't take a value, format is: 441698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # -s or --long 442698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.nargs == 0: 443698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson part = '%s' % option_string 444698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 445698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if the Optional takes a value, format is: 446698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # -s ARGS or --long ARGS 447698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 448698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default = action.dest.upper() 449698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson args_string = self._format_args(action, default) 450698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson part = '%s %s' % (option_string, args_string) 451698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 452698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # make it look optional if it's not required or in a group 453698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not action.required and action not in group_actions: 454698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson part = '[%s]' % part 455698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 456698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # add the action string to the list 457698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parts.append(part) 458698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 459698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # insert things at the necessary indices 46016f2fd013d4559f1458efbf21c68034d85bb255eBenjamin Peterson for i in sorted(inserts, reverse=True): 461698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parts[i:i] = [inserts[i]] 462698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 463698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # join all the action items with spaces 464698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson text = ' '.join([item for item in parts if item is not None]) 465698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 466698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # clean up separators for mutually exclusive groups 467698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson open = r'[\[(]' 468698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson close = r'[\])]' 469698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson text = _re.sub(r'(%s) ' % open, r'\1', text) 470698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson text = _re.sub(r' (%s)' % close, r'\1', text) 471698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson text = _re.sub(r'%s *%s' % (open, close), r'', text) 472698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson text = _re.sub(r'\(([^|]*)\)', r'\1', text) 473698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson text = text.strip() 474698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 475698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # return the text 476698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return text 477698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 478698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _format_text(self, text): 479698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if '%(prog)' in text: 480698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson text = text % dict(prog=self._prog) 481698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson text_width = self._width - self._current_indent 482698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson indent = ' ' * self._current_indent 483698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return self._fill_text(text, text_width, indent) + '\n\n' 484698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 485698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _format_action(self, action): 486698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # determine the required width and the entry label 487698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help_position = min(self._action_max_length + 2, 488698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._max_help_position) 489698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help_width = self._width - help_position 490698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action_width = help_position - self._current_indent - 2 491698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action_header = self._format_action_invocation(action) 492698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 493698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ho nelp; start on same line and add a final newline 494698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not action.help: 495698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson tup = self._current_indent, '', action_header 496698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action_header = '%*s%s\n' % tup 497698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 498698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # short action name; start on the same line and pad two spaces 499698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif len(action_header) <= action_width: 500698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson tup = self._current_indent, '', action_width, action_header 501698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action_header = '%*s%-*s ' % tup 502698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson indent_first = 0 503698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 504698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # long action name; start on the next line 505698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 506698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson tup = self._current_indent, '', action_header 507698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action_header = '%*s%s\n' % tup 508698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson indent_first = help_position 509698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 510698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # collect the pieces of the action help 511698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parts = [action_header] 512698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 513698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if there was help for the action, add lines of help text 514698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.help: 515698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help_text = self._expand_help(action) 516698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help_lines = self._split_lines(help_text, help_width) 517698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parts.append('%*s%s\n' % (indent_first, '', help_lines[0])) 518698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for line in help_lines[1:]: 519698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parts.append('%*s%s\n' % (help_position, '', line)) 520698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 521698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # or add a newline if the description doesn't end with one 522698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif not action_header.endswith('\n'): 523698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parts.append('\n') 524698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 525698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if there are any sub-actions, add their help as well 526698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for subaction in self._iter_indented_subactions(action): 527698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parts.append(self._format_action(subaction)) 528698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 529698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # return a single string 530698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return self._join_parts(parts) 531698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 532698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _format_action_invocation(self, action): 533698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not action.option_strings: 534698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson metavar, = self._metavar_formatter(action, action.dest)(1) 535698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return metavar 536698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 537698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 538698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parts = [] 539698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 540698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if the Optional doesn't take a value, format is: 541698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # -s, --long 542698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.nargs == 0: 543698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parts.extend(action.option_strings) 544698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 545698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if the Optional takes a value, format is: 546698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # -s ARGS, --long ARGS 547698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 548698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default = action.dest.upper() 549698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson args_string = self._format_args(action, default) 550698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for option_string in action.option_strings: 551698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parts.append('%s %s' % (option_string, args_string)) 552698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 553698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return ', '.join(parts) 554698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 555698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _metavar_formatter(self, action, default_metavar): 556698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.metavar is not None: 557698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result = action.metavar 558698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif action.choices is not None: 559698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson choice_strs = [str(choice) for choice in action.choices] 560698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result = '{%s}' % ','.join(choice_strs) 561698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 562698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result = default_metavar 563698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 564698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def format(tuple_size): 565698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if isinstance(result, tuple): 566698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return result 567698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 568698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return (result, ) * tuple_size 569698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return format 570698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 571698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _format_args(self, action, default_metavar): 572698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson get_metavar = self._metavar_formatter(action, default_metavar) 573698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.nargs is None: 574698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result = '%s' % get_metavar(1) 575698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif action.nargs == OPTIONAL: 576698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result = '[%s]' % get_metavar(1) 577698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif action.nargs == ZERO_OR_MORE: 578698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result = '[%s [%s ...]]' % get_metavar(2) 579698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif action.nargs == ONE_OR_MORE: 580698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result = '%s [%s ...]' % get_metavar(2) 581698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif action.nargs == REMAINDER: 582698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result = '...' 583698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif action.nargs == PARSER: 584698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result = '%s ...' % get_metavar(1) 585698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 586698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formats = ['%s' for _ in range(action.nargs)] 587698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result = ' '.join(formats) % get_metavar(action.nargs) 588698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return result 589698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 590698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _expand_help(self, action): 591698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson params = dict(vars(action), prog=self._prog) 592698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for name in list(params): 593698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if params[name] is SUPPRESS: 594698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson del params[name] 595698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for name in list(params): 596698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if hasattr(params[name], '__name__'): 597698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson params[name] = params[name].__name__ 598698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if params.get('choices') is not None: 599698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson choices_str = ', '.join([str(c) for c in params['choices']]) 600698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson params['choices'] = choices_str 601698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return self._get_help_string(action) % params 602698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 603698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _iter_indented_subactions(self, action): 604698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson try: 605698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson get_subactions = action._get_subactions 606698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson except AttributeError: 607698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson pass 608698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 609698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._indent() 610698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for subaction in get_subactions(): 611698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson yield subaction 612698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._dedent() 613698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 614698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _split_lines(self, text, width): 615698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson text = self._whitespace_matcher.sub(' ', text).strip() 616698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return _textwrap.wrap(text, width) 617698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 618698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _fill_text(self, text, width, indent): 619698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson text = self._whitespace_matcher.sub(' ', text).strip() 620698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return _textwrap.fill(text, width, initial_indent=indent, 621698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson subsequent_indent=indent) 622698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 623698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_help_string(self, action): 624698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return action.help 625698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 626698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 627698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass RawDescriptionHelpFormatter(HelpFormatter): 628698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """Help message formatter which retains any formatting in descriptions. 629698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 630698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson Only the name of this class is considered a public API. All the methods 631698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson provided by the class are considered an implementation detail. 632698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """ 633698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 634698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _fill_text(self, text, width, indent): 635698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return ''.join([indent + line for line in text.splitlines(True)]) 636698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 637698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 638698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass RawTextHelpFormatter(RawDescriptionHelpFormatter): 639698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """Help message formatter which retains formatting of all help text. 640698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 641698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson Only the name of this class is considered a public API. All the methods 642698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson provided by the class are considered an implementation detail. 643698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """ 644698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 645698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _split_lines(self, text, width): 646698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return text.splitlines() 647698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 648698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 649698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass ArgumentDefaultsHelpFormatter(HelpFormatter): 650698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """Help message formatter which adds default values to argument help. 651698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 652698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson Only the name of this class is considered a public API. All the methods 653698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson provided by the class are considered an implementation detail. 654698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """ 655698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 656698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_help_string(self, action): 657698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help = action.help 658698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if '%(default)' not in action.help: 659698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.default is not SUPPRESS: 660698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson defaulting_nargs = [OPTIONAL, ZERO_OR_MORE] 661698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.option_strings or action.nargs in defaulting_nargs: 662698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help += ' (default: %(default)s)' 663698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return help 664698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 665698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 666698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# ===================== 667698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# Options and Arguments 668698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# ===================== 669698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 670698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersondef _get_action_name(argument): 671698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if argument is None: 672698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return None 673698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif argument.option_strings: 674698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return '/'.join(argument.option_strings) 675698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif argument.metavar not in (None, SUPPRESS): 676698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return argument.metavar 677698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif argument.dest not in (None, SUPPRESS): 678698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return argument.dest 679698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 680698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return None 681698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 682698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 683698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass ArgumentError(Exception): 684698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """An error from creating or using an argument (optional or positional). 685698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 686698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson The string value of this exception is the message, augmented with 687698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson information about the argument that caused it. 688698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """ 689698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 690698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, argument, message): 691698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.argument_name = _get_action_name(argument) 692698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.message = message 693698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 694698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __str__(self): 695698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if self.argument_name is None: 696698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson format = '%(message)s' 697698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 698698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson format = 'argument %(argument_name)s: %(message)s' 699698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return format % dict(message=self.message, 700698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson argument_name=self.argument_name) 701698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 702698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 703698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass ArgumentTypeError(Exception): 704698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """An error from trying to convert a command line string to a type.""" 705698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson pass 706698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 707698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 708698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# ============== 709698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# Action classes 710698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# ============== 711698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 712698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass Action(_AttributeHolder): 713698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """Information about how to convert command line strings to Python objects. 714698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 715698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson Action objects are used by an ArgumentParser to represent the information 716698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson needed to parse a single argument from one or more strings from the 717698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson command line. The keyword arguments to the Action constructor are also 718698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson all attributes of Action instances. 719698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 720698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson Keyword Arguments: 721698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 722698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - option_strings -- A list of command-line option strings which 723698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson should be associated with this action. 724698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 725698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - dest -- The name of the attribute to hold the created object(s) 726698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 727698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - nargs -- The number of command-line arguments that should be 728698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson consumed. By default, one argument will be consumed and a single 729698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson value will be produced. Other values include: 730698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - N (an integer) consumes N arguments (and produces a list) 731698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - '?' consumes zero or one arguments 732698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - '*' consumes zero or more arguments (and produces a list) 733698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - '+' consumes one or more arguments (and produces a list) 734698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson Note that the difference between the default and nargs=1 is that 735698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson with the default, a single value will be produced, while with 736698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs=1, a list containing a single value will be produced. 737698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 738698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - const -- The value to be produced if the option is specified and the 739698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option uses an action that takes no values. 740698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 741698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - default -- The value to be produced if the option is not specified. 742698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 743698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - type -- The type which the command-line arguments should be converted 744698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson to, should be one of 'string', 'int', 'float', 'complex' or a 745698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson callable object that accepts a single string argument. If None, 746698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'string' is assumed. 747698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 748698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - choices -- A container of values that should be allowed. If not None, 749698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson after a command-line argument has been converted to the appropriate 750698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson type, an exception will be raised if it is not a member of this 751698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson collection. 752698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 753698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - required -- True if the action must always be specified at the 754698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson command line. This is only meaningful for optional command-line 755698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arguments. 756698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 757698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - help -- The help string describing the argument. 758698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 759698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - metavar -- The name to be used for the option's argument with the 760698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help string. If None, the 'dest' value will be used as the name. 761698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """ 762698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 763698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, 764698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings, 765698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest, 766698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs=None, 767698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson const=None, 768698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=None, 769698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson type=None, 770698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson choices=None, 771698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson required=False, 772698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=None, 773698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson metavar=None): 774698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.option_strings = option_strings 775698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.dest = dest 776698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.nargs = nargs 777698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.const = const 778698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.default = default 779698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.type = type 780698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.choices = choices 781698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.required = required 782698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.help = help 783698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.metavar = metavar 784698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 785698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_kwargs(self): 786698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson names = [ 787698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'option_strings', 788698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'dest', 789698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'nargs', 790698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'const', 791698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'default', 792698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'type', 793698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'choices', 794698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'help', 795698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'metavar', 796698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson ] 797698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return [(name, getattr(self, name)) for name in names] 798698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 799698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 800698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise NotImplementedError(_('.__call__() not defined')) 801698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 802698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 803698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass _StoreAction(Action): 804698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 805698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, 806698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings, 807698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest, 808698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs=None, 809698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson const=None, 810698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=None, 811698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson type=None, 812698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson choices=None, 813698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson required=False, 814698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=None, 815698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson metavar=None): 816698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if nargs == 0: 817698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ValueError('nargs for store actions must be > 0; if you ' 818698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'have nothing to store, actions such as store ' 819698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'true or store const may be more appropriate') 820698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if const is not None and nargs != OPTIONAL: 821698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ValueError('nargs must be %r to supply const' % OPTIONAL) 822698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson super(_StoreAction, self).__init__( 823698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings=option_strings, 824698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest=dest, 825698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs=nargs, 826698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson const=const, 827698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=default, 828698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson type=type, 829698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson choices=choices, 830698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson required=required, 831698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=help, 832698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson metavar=metavar) 833698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 834698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 835698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson setattr(namespace, self.dest, values) 836698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 837698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 838698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass _StoreConstAction(Action): 839698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 840698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, 841698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings, 842698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest, 843698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson const, 844698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=None, 845698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson required=False, 846698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=None, 847698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson metavar=None): 848698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson super(_StoreConstAction, self).__init__( 849698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings=option_strings, 850698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest=dest, 851698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs=0, 852698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson const=const, 853698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=default, 854698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson required=required, 855698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=help) 856698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 857698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 858698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson setattr(namespace, self.dest, self.const) 859698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 860698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 861698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass _StoreTrueAction(_StoreConstAction): 862698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 863698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, 864698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings, 865698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest, 866698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=False, 867698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson required=False, 868698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=None): 869698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson super(_StoreTrueAction, self).__init__( 870698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings=option_strings, 871698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest=dest, 872698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson const=True, 873698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=default, 874698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson required=required, 875698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=help) 876698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 877698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 878698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass _StoreFalseAction(_StoreConstAction): 879698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 880698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, 881698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings, 882698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest, 883698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=True, 884698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson required=False, 885698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=None): 886698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson super(_StoreFalseAction, self).__init__( 887698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings=option_strings, 888698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest=dest, 889698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson const=False, 890698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=default, 891698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson required=required, 892698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=help) 893698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 894698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 895698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass _AppendAction(Action): 896698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 897698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, 898698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings, 899698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest, 900698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs=None, 901698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson const=None, 902698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=None, 903698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson type=None, 904698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson choices=None, 905698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson required=False, 906698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=None, 907698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson metavar=None): 908698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if nargs == 0: 909698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ValueError('nargs for append actions must be > 0; if arg ' 910698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'strings are not supplying the value to append, ' 911698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'the append const action may be more appropriate') 912698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if const is not None and nargs != OPTIONAL: 913698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ValueError('nargs must be %r to supply const' % OPTIONAL) 914698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson super(_AppendAction, self).__init__( 915698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings=option_strings, 916698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest=dest, 917698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs=nargs, 918698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson const=const, 919698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=default, 920698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson type=type, 921698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson choices=choices, 922698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson required=required, 923698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=help, 924698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson metavar=metavar) 925698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 926698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 927698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson items = _copy.copy(_ensure_value(namespace, self.dest, [])) 928698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson items.append(values) 929698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson setattr(namespace, self.dest, items) 930698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 931698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 932698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass _AppendConstAction(Action): 933698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 934698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, 935698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings, 936698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest, 937698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson const, 938698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=None, 939698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson required=False, 940698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=None, 941698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson metavar=None): 942698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson super(_AppendConstAction, self).__init__( 943698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings=option_strings, 944698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest=dest, 945698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs=0, 946698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson const=const, 947698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=default, 948698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson required=required, 949698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=help, 950698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson metavar=metavar) 951698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 952698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 953698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson items = _copy.copy(_ensure_value(namespace, self.dest, [])) 954698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson items.append(self.const) 955698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson setattr(namespace, self.dest, items) 956698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 957698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 958698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass _CountAction(Action): 959698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 960698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, 961698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings, 962698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest, 963698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=None, 964698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson required=False, 965698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=None): 966698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson super(_CountAction, self).__init__( 967698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings=option_strings, 968698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest=dest, 969698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs=0, 970698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=default, 971698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson required=required, 972698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=help) 973698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 974698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 975698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson new_count = _ensure_value(namespace, self.dest, 0) + 1 976698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson setattr(namespace, self.dest, new_count) 977698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 978698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 979698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass _HelpAction(Action): 980698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 981698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, 982698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings, 983698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest=SUPPRESS, 984698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=SUPPRESS, 985698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=None): 986698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson super(_HelpAction, self).__init__( 987698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings=option_strings, 988698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest=dest, 989698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=default, 990698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs=0, 991698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=help) 992698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 993698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 994698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parser.print_help() 995698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parser.exit() 996698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 997698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 998698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass _VersionAction(Action): 999698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1000698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, 1001698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings, 1002698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson version=None, 1003698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest=SUPPRESS, 1004698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=SUPPRESS, 100550fe593ae97230d1d058844908a04e6b03855f7fSteven Bethard help="show program's version number and exit"): 1006698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson super(_VersionAction, self).__init__( 1007698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings=option_strings, 1008698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest=dest, 1009698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default=default, 1010698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs=0, 1011698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=help) 1012698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.version = version 1013698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1014698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 1015698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson version = self.version 1016698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if version is None: 1017698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson version = parser.version 1018698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter = parser._get_formatter() 1019698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter.add_text(version) 1020698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parser.exit(message=formatter.format_help()) 1021698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1022698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1023698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass _SubParsersAction(Action): 1024698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1025698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson class _ChoicesPseudoAction(Action): 1026698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1027fd311a712d5876c3a3efff265978452eea759f85Steven Bethard def __init__(self, name, aliases, help): 1028fd311a712d5876c3a3efff265978452eea759f85Steven Bethard metavar = dest = name 1029fd311a712d5876c3a3efff265978452eea759f85Steven Bethard if aliases: 1030fd311a712d5876c3a3efff265978452eea759f85Steven Bethard metavar += ' (%s)' % ', '.join(aliases) 1031698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson sup = super(_SubParsersAction._ChoicesPseudoAction, self) 1032fd311a712d5876c3a3efff265978452eea759f85Steven Bethard sup.__init__(option_strings=[], dest=dest, help=help, 1033fd311a712d5876c3a3efff265978452eea759f85Steven Bethard metavar=metavar) 1034698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1035698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, 1036698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings, 1037698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson prog, 1038698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parser_class, 1039698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest=SUPPRESS, 1040698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=None, 1041698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson metavar=None): 1042698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1043698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._prog_prefix = prog 1044698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._parser_class = parser_class 10458a6a198abff504067fb74b669c672901a97a44b6Steven Bethard self._name_parser_map = _collections.OrderedDict() 1046698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._choices_actions = [] 1047698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1048698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson super(_SubParsersAction, self).__init__( 1049698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings=option_strings, 1050698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest=dest, 1051698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs=PARSER, 1052698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson choices=self._name_parser_map, 1053698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=help, 1054698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson metavar=metavar) 1055698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1056698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def add_parser(self, name, **kwargs): 1057698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # set prog from the existing prefix 1058698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if kwargs.get('prog') is None: 1059698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson kwargs['prog'] = '%s %s' % (self._prog_prefix, name) 1060698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1061fd311a712d5876c3a3efff265978452eea759f85Steven Bethard aliases = kwargs.pop('aliases', ()) 1062fd311a712d5876c3a3efff265978452eea759f85Steven Bethard 1063698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # create a pseudo-action to hold the choice help 1064698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if 'help' in kwargs: 1065698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help = kwargs.pop('help') 1066fd311a712d5876c3a3efff265978452eea759f85Steven Bethard choice_action = self._ChoicesPseudoAction(name, aliases, help) 1067698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._choices_actions.append(choice_action) 1068698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1069698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # create the parser and add it to the map 1070698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parser = self._parser_class(**kwargs) 1071698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._name_parser_map[name] = parser 1072fd311a712d5876c3a3efff265978452eea759f85Steven Bethard 1073fd311a712d5876c3a3efff265978452eea759f85Steven Bethard # make parser available under aliases also 1074fd311a712d5876c3a3efff265978452eea759f85Steven Bethard for alias in aliases: 1075fd311a712d5876c3a3efff265978452eea759f85Steven Bethard self._name_parser_map[alias] = parser 1076fd311a712d5876c3a3efff265978452eea759f85Steven Bethard 1077698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return parser 1078698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1079698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_subactions(self): 1080698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return self._choices_actions 1081698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1082698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 1083698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parser_name = values[0] 1084698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_strings = values[1:] 1085698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1086698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # set the parser name if requested 1087698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if self.dest is not SUPPRESS: 1088698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson setattr(namespace, self.dest, parser_name) 1089698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1090698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # select the parser 1091698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson try: 1092698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parser = self._name_parser_map[parser_name] 1093698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson except KeyError: 1094bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo args = {'parser_name': parser_name, 1095bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo 'choices': ', '.join(self._name_parser_map)} 1096bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo msg = _('unknown parser %(parser_name)r (choices: %(choices)s)') % args 1097698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ArgumentError(self, msg) 1098698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1099698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # parse all the remaining options into the namespace 1100fca2e8aeb8e841a18c4b9d2954254b2a086a3d56Steven Bethard # store any unrecognized options on the object, so that the top 1101fca2e8aeb8e841a18c4b9d2954254b2a086a3d56Steven Bethard # level parser can decide what to do with them 1102fca2e8aeb8e841a18c4b9d2954254b2a086a3d56Steven Bethard namespace, arg_strings = parser.parse_known_args(arg_strings, namespace) 1103fca2e8aeb8e841a18c4b9d2954254b2a086a3d56Steven Bethard if arg_strings: 1104fca2e8aeb8e841a18c4b9d2954254b2a086a3d56Steven Bethard vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, []) 1105fca2e8aeb8e841a18c4b9d2954254b2a086a3d56Steven Bethard getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings) 1106698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1107698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1108698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# ============== 1109698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# Type classes 1110698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# ============== 1111698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1112698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass FileType(object): 1113698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """Factory for creating file object types 1114698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1115698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson Instances of FileType are typically passed as type= arguments to the 1116698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson ArgumentParser add_argument() method. 1117698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1118698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson Keyword Arguments: 1119698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - mode -- A string indicating how the file is to be opened. Accepts the 1120698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson same values as the builtin open() function. 1121698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - bufsize -- The file's desired buffer size. Accepts the same values as 1122698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson the builtin open() function. 1123698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """ 1124698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1125b02701101b94bda88179652b0133557baa801368Steven Bethard def __init__(self, mode='r', bufsize=-1): 1126698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._mode = mode 1127698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._bufsize = bufsize 1128698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1129698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __call__(self, string): 1130698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # the special argument "-" means sys.std{in,out} 1131698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if string == '-': 1132698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if 'r' in self._mode: 1133698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return _sys.stdin 1134698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif 'w' in self._mode: 1135698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return _sys.stdout 1136698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 1137a9c7a8fa5bded740bba314cb07ebd3c99eba928eÉric Araujo msg = _('argument "-" with mode %r') % self._mode 1138698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ValueError(msg) 1139698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1140698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # all other arguments are used as file names 1141b02701101b94bda88179652b0133557baa801368Steven Bethard try: 1142698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return open(string, self._mode, self._bufsize) 1143b02701101b94bda88179652b0133557baa801368Steven Bethard except IOError as e: 1144b02701101b94bda88179652b0133557baa801368Steven Bethard message = _("can't open '%s': %s") 1145b02701101b94bda88179652b0133557baa801368Steven Bethard raise ArgumentTypeError(message % (string, e)) 1146698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1147698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __repr__(self): 1148b02701101b94bda88179652b0133557baa801368Steven Bethard args = self._mode, self._bufsize 1149b02701101b94bda88179652b0133557baa801368Steven Bethard args_str = ', '.join(repr(arg) for arg in args if arg != -1) 1150698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return '%s(%s)' % (type(self).__name__, args_str) 1151698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1152698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# =========================== 1153698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# Optional and Positional Parsing 1154698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson# =========================== 1155698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1156698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass Namespace(_AttributeHolder): 1157698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """Simple object for storing attributes. 1158698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1159698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson Implements equality by attribute names and values, and provides a simple 1160698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson string representation. 1161698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """ 1162698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1163698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, **kwargs): 1164698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for name in kwargs: 1165698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson setattr(self, name, kwargs[name]) 1166698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1167698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __eq__(self, other): 1168698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return vars(self) == vars(other) 1169698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1170698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __ne__(self, other): 1171698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return not (self == other) 1172698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1173698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __contains__(self, key): 1174698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return key in self.__dict__ 1175698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1176698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1177698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass _ActionsContainer(object): 1178698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1179698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, 1180698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson description, 1181698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson prefix_chars, 1182698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson argument_default, 1183698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson conflict_handler): 1184698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson super(_ActionsContainer, self).__init__() 1185698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1186698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.description = description 1187698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.argument_default = argument_default 1188698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.prefix_chars = prefix_chars 1189698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.conflict_handler = conflict_handler 1190698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1191698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # set up registries 1192698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._registries = {} 1193698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1194698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # register actions 1195698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.register('action', None, _StoreAction) 1196698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.register('action', 'store', _StoreAction) 1197698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.register('action', 'store_const', _StoreConstAction) 1198698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.register('action', 'store_true', _StoreTrueAction) 1199698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.register('action', 'store_false', _StoreFalseAction) 1200698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.register('action', 'append', _AppendAction) 1201698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.register('action', 'append_const', _AppendConstAction) 1202698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.register('action', 'count', _CountAction) 1203698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.register('action', 'help', _HelpAction) 1204698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.register('action', 'version', _VersionAction) 1205698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.register('action', 'parsers', _SubParsersAction) 1206698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1207698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # raise an exception if the conflict handler is invalid 1208698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._get_handler() 1209698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1210698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # action storage 1211698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._actions = [] 1212698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._option_string_actions = {} 1213698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1214698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # groups 1215698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._action_groups = [] 1216698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._mutually_exclusive_groups = [] 1217698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1218698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # defaults storage 1219698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._defaults = {} 1220698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1221698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # determines whether an "option" looks like a negative number 1222698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._negative_number_matcher = _re.compile(r'^-\d+$|^-\d*\.\d+$') 1223698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1224698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # whether or not there are any optionals that look like negative 1225698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # numbers -- uses a list so it can be shared and edited 1226698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._has_negative_number_optionals = [] 1227698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1228698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ==================== 1229698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # Registration methods 1230698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ==================== 1231698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def register(self, registry_name, value, object): 1232698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson registry = self._registries.setdefault(registry_name, {}) 1233698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson registry[value] = object 1234698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1235698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _registry_get(self, registry_name, value, default=None): 1236698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return self._registries[registry_name].get(value, default) 1237698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1238698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ================================== 1239698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # Namespace default accessor methods 1240698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ================================== 1241698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def set_defaults(self, **kwargs): 1242698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._defaults.update(kwargs) 1243698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1244698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if these defaults match any existing arguments, replace 1245698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # the previous default on the object with the new one 1246698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action in self._actions: 1247698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.dest in kwargs: 1248698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action.default = kwargs[action.dest] 1249698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1250698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def get_default(self, dest): 1251698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action in self._actions: 1252698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.dest == dest and action.default is not None: 1253698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return action.default 1254698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return self._defaults.get(dest, None) 1255698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1256698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1257698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ======================= 1258698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # Adding argument actions 1259698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ======================= 1260698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def add_argument(self, *args, **kwargs): 1261698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """ 1262698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson add_argument(dest, ..., name=value, ...) 1263698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson add_argument(option_string, option_string, ..., name=value, ...) 1264698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """ 1265698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1266698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if no positional args are supplied or only one is supplied and 1267698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # it doesn't look like an option string, parse a positional 1268698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # argument 1269698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson chars = self.prefix_chars 1270698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not args or len(args) == 1 and args[0][0] not in chars: 1271698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if args and 'dest' in kwargs: 1272698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ValueError('dest supplied twice for positional argument') 1273698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson kwargs = self._get_positional_kwargs(*args, **kwargs) 1274698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1275698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # otherwise, we're adding an optional argument 1276698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 1277698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson kwargs = self._get_optional_kwargs(*args, **kwargs) 1278698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1279698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if no default was supplied, use the parser-level default 1280698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if 'default' not in kwargs: 1281698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest = kwargs['dest'] 1282698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if dest in self._defaults: 1283698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson kwargs['default'] = self._defaults[dest] 1284698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif self.argument_default is not None: 1285698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson kwargs['default'] = self.argument_default 1286698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1287698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # create the action object, and add it to the parser 1288698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action_class = self._pop_action_class(kwargs) 1289698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not _callable(action_class): 12907cb20a8605d79faae64cccf8bbe8418b492f0e30Steven Bethard raise ValueError('unknown action "%s"' % (action_class,)) 1291698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action = action_class(**kwargs) 1292698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1293698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # raise an error if the action type is not callable 1294698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson type_func = self._registry_get('type', action.type, action.type) 1295698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not _callable(type_func): 12967cb20a8605d79faae64cccf8bbe8418b492f0e30Steven Bethard raise ValueError('%r is not callable' % (type_func,)) 1297698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 12988d9a4628c35811a803bde626c76573c722beea03Steven Bethard # raise an error if the metavar does not match the type 12998d9a4628c35811a803bde626c76573c722beea03Steven Bethard if hasattr(self, "_get_formatter"): 13008d9a4628c35811a803bde626c76573c722beea03Steven Bethard try: 13018d9a4628c35811a803bde626c76573c722beea03Steven Bethard self._get_formatter()._format_args(action, None) 13028d9a4628c35811a803bde626c76573c722beea03Steven Bethard except TypeError: 13038d9a4628c35811a803bde626c76573c722beea03Steven Bethard raise ValueError("length of metavar tuple does not match nargs") 13048d9a4628c35811a803bde626c76573c722beea03Steven Bethard 1305698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return self._add_action(action) 1306698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1307698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def add_argument_group(self, *args, **kwargs): 1308698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson group = _ArgumentGroup(self, *args, **kwargs) 1309698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._action_groups.append(group) 1310698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return group 1311698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1312698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def add_mutually_exclusive_group(self, **kwargs): 1313698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson group = _MutuallyExclusiveGroup(self, **kwargs) 1314698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._mutually_exclusive_groups.append(group) 1315698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return group 1316698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1317698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _add_action(self, action): 1318698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # resolve any conflicts 1319698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._check_conflict(action) 1320698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1321698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # add to actions list 1322698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._actions.append(action) 1323698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action.container = self 1324698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1325698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # index the action by any option strings it has 1326698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for option_string in action.option_strings: 1327698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._option_string_actions[option_string] = action 1328698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1329698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # set the flag if any option strings look like negative numbers 1330698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for option_string in action.option_strings: 1331698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if self._negative_number_matcher.match(option_string): 1332698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not self._has_negative_number_optionals: 1333698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._has_negative_number_optionals.append(True) 1334698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1335698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # return the created action 1336698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return action 1337698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1338698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _remove_action(self, action): 1339698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._actions.remove(action) 1340698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1341698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _add_container_actions(self, container): 1342698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # collect groups by titles 1343698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson title_group_map = {} 1344698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for group in self._action_groups: 1345698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if group.title in title_group_map: 1346698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson msg = _('cannot merge actions - two groups are named %r') 1347698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ValueError(msg % (group.title)) 1348698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson title_group_map[group.title] = group 1349698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1350698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # map each action to its group 1351698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson group_map = {} 1352698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for group in container._action_groups: 1353698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1354698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if a group with the title exists, use that, otherwise 1355698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # create a new group matching the container's group 1356698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if group.title not in title_group_map: 1357698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson title_group_map[group.title] = self.add_argument_group( 1358698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson title=group.title, 1359698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson description=group.description, 1360698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson conflict_handler=group.conflict_handler) 1361698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1362698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # map the actions to their new group 1363698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action in group._group_actions: 1364698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson group_map[action] = title_group_map[group.title] 1365698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1366698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # add container's mutually exclusive groups 1367698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # NOTE: if add_mutually_exclusive_group ever gains title= and 1368698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # description= then this code will need to be expanded as above 1369698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for group in container._mutually_exclusive_groups: 1370698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson mutex_group = self.add_mutually_exclusive_group( 1371698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson required=group.required) 1372698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1373698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # map the actions to their new mutex group 1374698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action in group._group_actions: 1375698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson group_map[action] = mutex_group 1376698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1377698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # add all actions to this container or their group 1378698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action in container._actions: 1379698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson group_map.get(action, self)._add_action(action) 1380698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1381698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_positional_kwargs(self, dest, **kwargs): 1382698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # make sure required is not specified 1383698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if 'required' in kwargs: 1384698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson msg = _("'required' is an invalid argument for positionals") 1385698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise TypeError(msg) 1386698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1387698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # mark positional arguments as required if at least one is 1388698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # always required 1389698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if kwargs.get('nargs') not in [OPTIONAL, ZERO_OR_MORE]: 1390698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson kwargs['required'] = True 1391698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if kwargs.get('nargs') == ZERO_OR_MORE and 'default' not in kwargs: 1392698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson kwargs['required'] = True 1393698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1394698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # return the keyword arguments with no option strings 1395698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return dict(kwargs, dest=dest, option_strings=[]) 1396698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1397698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_optional_kwargs(self, *args, **kwargs): 1398698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # determine short and long option strings 1399698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings = [] 1400698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson long_option_strings = [] 1401698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for option_string in args: 1402698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # error on strings that don't start with an appropriate prefix 1403698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not option_string[0] in self.prefix_chars: 1404bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo args = {'option': option_string, 1405bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo 'prefix_chars': self.prefix_chars} 1406bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo msg = _('invalid option string %(option)r: ' 1407bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo 'must start with a character %(prefix_chars)r') 1408bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo raise ValueError(msg % args) 1409698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1410698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # strings starting with two prefix characters are long options 1411698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_strings.append(option_string) 1412698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if option_string[0] in self.prefix_chars: 1413698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if len(option_string) > 1: 1414698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if option_string[1] in self.prefix_chars: 1415698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson long_option_strings.append(option_string) 1416698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1417698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # infer destination, '--foo-bar' -> 'foo_bar' and '-x' -> 'x' 1418698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest = kwargs.pop('dest', None) 1419698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if dest is None: 1420698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if long_option_strings: 1421698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest_option_string = long_option_strings[0] 1422698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 1423698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest_option_string = option_strings[0] 1424698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest = dest_option_string.lstrip(self.prefix_chars) 1425698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not dest: 1426698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson msg = _('dest= is required for options like %r') 1427698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ValueError(msg % option_string) 1428698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson dest = dest.replace('-', '_') 1429698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1430698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # return the updated keyword arguments 1431698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return dict(kwargs, dest=dest, option_strings=option_strings) 1432698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1433698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _pop_action_class(self, kwargs, default=None): 1434698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action = kwargs.pop('action', default) 1435698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return self._registry_get('action', action, action) 1436698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1437698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_handler(self): 1438698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # determine function from conflict handler string 1439698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson handler_func_name = '_handle_conflict_%s' % self.conflict_handler 1440698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson try: 1441698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return getattr(self, handler_func_name) 1442698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson except AttributeError: 1443698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson msg = _('invalid conflict_resolution value: %r') 1444698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ValueError(msg % self.conflict_handler) 1445698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1446698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _check_conflict(self, action): 1447698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1448698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # find all options that conflict with this option 1449698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson confl_optionals = [] 1450698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for option_string in action.option_strings: 1451698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if option_string in self._option_string_actions: 1452698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson confl_optional = self._option_string_actions[option_string] 1453698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson confl_optionals.append((option_string, confl_optional)) 1454698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1455698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # resolve any conflicts 1456698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if confl_optionals: 1457698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson conflict_handler = self._get_handler() 1458698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson conflict_handler(action, confl_optionals) 1459698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1460698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _handle_conflict_error(self, action, conflicting_actions): 14611215915045d620d44e14ba12af8949f8ec700b5dÉric Araujo message = ngettext('conflicting option string: %s', 14621215915045d620d44e14ba12af8949f8ec700b5dÉric Araujo 'conflicting option strings: %s', 14631215915045d620d44e14ba12af8949f8ec700b5dÉric Araujo len(conflicting_actions)) 1464698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson conflict_string = ', '.join([option_string 1465698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for option_string, action 1466698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson in conflicting_actions]) 1467698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ArgumentError(action, message % conflict_string) 1468698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1469698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _handle_conflict_resolve(self, action, conflicting_actions): 1470698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1471698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # remove all conflicting options 1472698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for option_string, action in conflicting_actions: 1473698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1474698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # remove the conflicting option 1475698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action.option_strings.remove(option_string) 1476698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._option_string_actions.pop(option_string, None) 1477698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1478698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if the option now has no option string, remove it from the 1479698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # container holding it 1480698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not action.option_strings: 1481698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action.container._remove_action(action) 1482698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1483698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1484698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass _ArgumentGroup(_ActionsContainer): 1485698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1486698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, container, title=None, description=None, **kwargs): 1487698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # add any missing keyword arguments by checking the container 1488698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson update = kwargs.setdefault 1489698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson update('conflict_handler', container.conflict_handler) 1490698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson update('prefix_chars', container.prefix_chars) 1491698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson update('argument_default', container.argument_default) 1492698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson super_init = super(_ArgumentGroup, self).__init__ 1493698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson super_init(description=description, **kwargs) 1494698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1495698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # group attributes 1496698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.title = title 1497698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._group_actions = [] 1498698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1499698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # share most attributes with the container 1500698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._registries = container._registries 1501698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._actions = container._actions 1502698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._option_string_actions = container._option_string_actions 1503698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._defaults = container._defaults 1504698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._has_negative_number_optionals = \ 1505698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson container._has_negative_number_optionals 15060f6b47a338fdc0063c651657fcbb6908da27f0b9Georg Brandl self._mutually_exclusive_groups = container._mutually_exclusive_groups 1507698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1508698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _add_action(self, action): 1509698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action = super(_ArgumentGroup, self)._add_action(action) 1510698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._group_actions.append(action) 1511698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return action 1512698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1513698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _remove_action(self, action): 1514698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson super(_ArgumentGroup, self)._remove_action(action) 1515698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._group_actions.remove(action) 1516698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1517698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1518698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass _MutuallyExclusiveGroup(_ArgumentGroup): 1519698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1520698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, container, required=False): 1521698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson super(_MutuallyExclusiveGroup, self).__init__(container) 1522698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.required = required 1523698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._container = container 1524698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1525698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _add_action(self, action): 1526698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.required: 1527698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson msg = _('mutually exclusive arguments must be optional') 1528698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ValueError(msg) 1529698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action = self._container._add_action(action) 1530698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._group_actions.append(action) 1531698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return action 1532698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1533698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _remove_action(self, action): 1534698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._container._remove_action(action) 1535698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._group_actions.remove(action) 1536698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1537698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1538698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Petersonclass ArgumentParser(_AttributeHolder, _ActionsContainer): 1539698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """Object for parsing command line strings into Python objects. 1540698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1541698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson Keyword Arguments: 1542698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - prog -- The name of the program (default: sys.argv[0]) 1543698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - usage -- A usage message (default: auto-generated from arguments) 1544698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - description -- A description of what the program does 1545698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - epilog -- Text following the argument descriptions 1546698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - parents -- Parsers whose arguments should be copied into this one 1547698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - formatter_class -- HelpFormatter class for printing help messages 1548698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - prefix_chars -- Characters that prefix optional arguments 1549698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - fromfile_prefix_chars -- Characters that prefix files containing 1550698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson additional arguments 1551698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - argument_default -- The default value for all arguments 1552698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - conflict_handler -- String indicating how to handle conflicts 1553698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson - add_help -- Add a -h/-help option 1554698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """ 1555698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1556698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def __init__(self, 1557698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson prog=None, 1558698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson usage=None, 1559698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson description=None, 1560698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson epilog=None, 1561698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson version=None, 1562698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parents=[], 1563698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter_class=HelpFormatter, 1564698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson prefix_chars='-', 1565698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson fromfile_prefix_chars=None, 1566698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson argument_default=None, 1567698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson conflict_handler='error', 1568698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson add_help=True): 1569698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1570698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if version is not None: 1571698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson import warnings 1572698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson warnings.warn( 1573698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """The "version" argument to ArgumentParser is deprecated. """ 1574698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """Please use """ 1575698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """"add_argument(..., action='version', version="N", ...)" """ 1576698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """instead""", DeprecationWarning) 1577698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1578698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson superinit = super(ArgumentParser, self).__init__ 1579698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson superinit(description=description, 1580698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson prefix_chars=prefix_chars, 1581698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson argument_default=argument_default, 1582698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson conflict_handler=conflict_handler) 1583698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1584698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # default setting for prog 1585698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if prog is None: 1586698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson prog = _os.path.basename(_sys.argv[0]) 1587698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1588698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.prog = prog 1589698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.usage = usage 1590698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.epilog = epilog 1591698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.version = version 1592698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.formatter_class = formatter_class 1593698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.fromfile_prefix_chars = fromfile_prefix_chars 1594698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.add_help = add_help 1595698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1596698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson add_group = self.add_argument_group 1597698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._positionals = add_group(_('positional arguments')) 1598698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._optionals = add_group(_('optional arguments')) 1599698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._subparsers = None 1600698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1601698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # register types 1602698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def identity(string): 1603698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return string 1604698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.register('type', None, identity) 1605698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1606698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # add help and version arguments if necessary 1607698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # (using explicit default to override global argument_default) 160888c49fe32054e28627eb41134656da606e9f9595R. David Murray default_prefix = '-' if '-' in prefix_chars else prefix_chars[0] 1609698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if self.add_help: 1610698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.add_argument( 161188c49fe32054e28627eb41134656da606e9f9595R. David Murray default_prefix+'h', default_prefix*2+'help', 161288c49fe32054e28627eb41134656da606e9f9595R. David Murray action='help', default=SUPPRESS, 1613698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=_('show this help message and exit')) 1614698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if self.version: 1615698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.add_argument( 161688c49fe32054e28627eb41134656da606e9f9595R. David Murray default_prefix+'v', default_prefix*2+'version', 161788c49fe32054e28627eb41134656da606e9f9595R. David Murray action='version', default=SUPPRESS, 1618698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson version=self.version, 1619698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson help=_("show program's version number and exit")) 1620698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1621698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # add parent arguments and defaults 1622698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for parent in parents: 1623698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._add_container_actions(parent) 1624698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson try: 1625698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson defaults = parent._defaults 1626698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson except AttributeError: 1627698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson pass 1628698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 1629698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._defaults.update(defaults) 1630698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1631698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ======================= 1632698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # Pretty __repr__ methods 1633698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ======================= 1634698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_kwargs(self): 1635698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson names = [ 1636698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'prog', 1637698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'usage', 1638698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'description', 1639698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'version', 1640698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'formatter_class', 1641698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'conflict_handler', 1642698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'add_help', 1643698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson ] 1644698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return [(name, getattr(self, name)) for name in names] 1645698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1646698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ================================== 1647698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # Optional/Positional adding methods 1648698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ================================== 1649698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def add_subparsers(self, **kwargs): 1650698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if self._subparsers is not None: 1651698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.error(_('cannot have multiple subparser arguments')) 1652698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1653698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # add the parser class to the arguments if it's not present 1654698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson kwargs.setdefault('parser_class', type(self)) 1655698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1656698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if 'title' in kwargs or 'description' in kwargs: 1657698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson title = _(kwargs.pop('title', 'subcommands')) 1658698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson description = _(kwargs.pop('description', None)) 1659698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._subparsers = self.add_argument_group(title, description) 1660698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 1661698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._subparsers = self._positionals 1662698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1663698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # prog defaults to the usage message of this parser, skipping 1664698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # optional arguments and with no "usage:" prefix 1665698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if kwargs.get('prog') is None: 1666698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter = self._get_formatter() 1667698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson positionals = self._get_positional_actions() 1668698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson groups = self._mutually_exclusive_groups 1669698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter.add_usage(self.usage, positionals, groups, '') 1670698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson kwargs['prog'] = formatter.format_help().strip() 1671698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1672698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # create the parsers action and add it to the positionals list 1673698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson parsers_class = self._pop_action_class(kwargs, 'parsers') 1674698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action = parsers_class(option_strings=[], **kwargs) 1675698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._subparsers._add_action(action) 1676698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1677698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # return the created parsers action 1678698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return action 1679698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1680698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _add_action(self, action): 1681698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.option_strings: 1682698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._optionals._add_action(action) 1683698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 1684698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._positionals._add_action(action) 1685698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return action 1686698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1687698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_optional_actions(self): 1688698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return [action 1689698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action in self._actions 1690698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.option_strings] 1691698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1692698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_positional_actions(self): 1693698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return [action 1694698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action in self._actions 1695698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not action.option_strings] 1696698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1697698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ===================================== 1698698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # Command line argument parsing methods 1699698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ===================================== 1700698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def parse_args(self, args=None, namespace=None): 1701698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson args, argv = self.parse_known_args(args, namespace) 1702698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if argv: 1703698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson msg = _('unrecognized arguments: %s') 1704698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.error(msg % ' '.join(argv)) 1705698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return args 1706698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1707698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def parse_known_args(self, args=None, namespace=None): 1708698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # args default to the system args 1709698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if args is None: 1710698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson args = _sys.argv[1:] 1711698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1712698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # default Namespace built from parser defaults 1713698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if namespace is None: 1714698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson namespace = Namespace() 1715698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1716698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # add any action defaults that aren't present 1717698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action in self._actions: 1718698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.dest is not SUPPRESS: 1719698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not hasattr(namespace, action.dest): 1720698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.default is not SUPPRESS: 1721698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default = action.default 172216f2fd013d4559f1458efbf21c68034d85bb255eBenjamin Peterson if isinstance(action.default, str): 1723698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson default = self._get_value(action, default) 1724698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson setattr(namespace, action.dest, default) 1725698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1726698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # add any parser defaults that aren't present 1727698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for dest in self._defaults: 1728698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not hasattr(namespace, dest): 1729698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson setattr(namespace, dest, self._defaults[dest]) 1730698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1731698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # parse the arguments and exit if there are any errors 1732698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson try: 1733fca2e8aeb8e841a18c4b9d2954254b2a086a3d56Steven Bethard namespace, args = self._parse_known_args(args, namespace) 1734fca2e8aeb8e841a18c4b9d2954254b2a086a3d56Steven Bethard if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR): 1735fca2e8aeb8e841a18c4b9d2954254b2a086a3d56Steven Bethard args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR)) 1736fca2e8aeb8e841a18c4b9d2954254b2a086a3d56Steven Bethard delattr(namespace, _UNRECOGNIZED_ARGS_ATTR) 1737fca2e8aeb8e841a18c4b9d2954254b2a086a3d56Steven Bethard return namespace, args 1738698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson except ArgumentError: 1739698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson err = _sys.exc_info()[1] 1740698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.error(str(err)) 1741698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1742698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _parse_known_args(self, arg_strings, namespace): 1743698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # replace arg strings that are file references 1744698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if self.fromfile_prefix_chars is not None: 1745698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_strings = self._read_args_from_files(arg_strings) 1746698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1747698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # map all mutually exclusive arguments to the other arguments 1748698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # they can't occur with 1749698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action_conflicts = {} 1750698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for mutex_group in self._mutually_exclusive_groups: 1751698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson group_actions = mutex_group._group_actions 1752698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for i, mutex_action in enumerate(mutex_group._group_actions): 1753698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson conflicts = action_conflicts.setdefault(mutex_action, []) 1754698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson conflicts.extend(group_actions[:i]) 1755698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson conflicts.extend(group_actions[i + 1:]) 1756698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1757698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # find all option indices, and determine the arg_string_pattern 1758698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # which has an 'O' if there is an option at an index, 1759698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # an 'A' if there is an argument, or a '-' if there is a '--' 1760698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_string_indices = {} 1761698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_string_pattern_parts = [] 1762698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_strings_iter = iter(arg_strings) 1763698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for i, arg_string in enumerate(arg_strings_iter): 1764698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1765698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # all args after -- are non-options 1766698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if arg_string == '--': 1767698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_string_pattern_parts.append('-') 1768698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for arg_string in arg_strings_iter: 1769698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_string_pattern_parts.append('A') 1770698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1771698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # otherwise, add the arg to the arg strings 1772698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # and note the index if it was an option 1773698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 1774698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_tuple = self._parse_optional(arg_string) 1775698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if option_tuple is None: 1776698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson pattern = 'A' 1777698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 1778698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_string_indices[i] = option_tuple 1779698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson pattern = 'O' 1780698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_string_pattern_parts.append(pattern) 1781698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1782698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # join the pieces together to form the pattern 1783698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_strings_pattern = ''.join(arg_string_pattern_parts) 1784698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1785698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # converts arg strings to the appropriate and then takes the action 178616f2fd013d4559f1458efbf21c68034d85bb255eBenjamin Peterson seen_actions = set() 178716f2fd013d4559f1458efbf21c68034d85bb255eBenjamin Peterson seen_non_default_actions = set() 1788698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1789698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def take_action(action, argument_strings, option_string=None): 1790698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson seen_actions.add(action) 1791698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson argument_values = self._get_values(action, argument_strings) 1792698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1793698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # error if this argument is not allowed with other previously 1794698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # seen arguments, assuming that actions that use the default 1795698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # value don't really count as "present" 1796698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if argument_values is not action.default: 1797698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson seen_non_default_actions.add(action) 1798698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for conflict_action in action_conflicts.get(action, []): 1799698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if conflict_action in seen_non_default_actions: 1800698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson msg = _('not allowed with argument %s') 1801698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action_name = _get_action_name(conflict_action) 1802698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ArgumentError(action, msg % action_name) 1803698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1804698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # take the action if we didn't receive a SUPPRESS value 1805698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # (e.g. from a default) 1806698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if argument_values is not SUPPRESS: 1807698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action(self, namespace, argument_values, option_string) 1808698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1809698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # function to convert arg_strings into an optional action 1810698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def consume_optional(start_index): 1811698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1812698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # get the optional identified at this index 1813698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_tuple = option_string_indices[start_index] 1814698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action, option_string, explicit_arg = option_tuple 1815698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1816698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # identify additional optionals in the same arg string 1817698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # (e.g. -xyz is the same as -x -y -z if no args are required) 1818698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson match_argument = self._match_argument 1819698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action_tuples = [] 1820698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson while True: 1821698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1822698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if we found no optional action, skip it 1823698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action is None: 1824698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson extras.append(arg_strings[start_index]) 1825698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return start_index + 1 1826698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1827698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if there is an explicit argument, try to match the 1828698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # optional's string arguments to only this 1829698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if explicit_arg is not None: 1830698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_count = match_argument(action, 'A') 1831698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1832698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if the action is a single-dash option and takes no 1833698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # arguments, try to parse more single-dash options out 1834698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # of the tail of the option string 1835698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson chars = self.prefix_chars 1836698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if arg_count == 0 and option_string[1] not in chars: 1837698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action_tuples.append((action, [], option_string)) 18381ca45a5292a382d5902b80de5c8274994a985e84Steven Bethard char = option_string[0] 18391ca45a5292a382d5902b80de5c8274994a985e84Steven Bethard option_string = char + explicit_arg[0] 18401ca45a5292a382d5902b80de5c8274994a985e84Steven Bethard new_explicit_arg = explicit_arg[1:] or None 18411ca45a5292a382d5902b80de5c8274994a985e84Steven Bethard optionals_map = self._option_string_actions 18421ca45a5292a382d5902b80de5c8274994a985e84Steven Bethard if option_string in optionals_map: 18431ca45a5292a382d5902b80de5c8274994a985e84Steven Bethard action = optionals_map[option_string] 18441ca45a5292a382d5902b80de5c8274994a985e84Steven Bethard explicit_arg = new_explicit_arg 1845698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 1846698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson msg = _('ignored explicit argument %r') 1847698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ArgumentError(action, msg % explicit_arg) 1848698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1849698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if the action expect exactly one argument, we've 1850698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # successfully matched the option; exit the loop 1851698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif arg_count == 1: 1852698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson stop = start_index + 1 1853698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson args = [explicit_arg] 1854698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action_tuples.append((action, args, option_string)) 1855698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson break 1856698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1857698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # error if a double-dash option did not use the 1858698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # explicit argument 1859698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 1860698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson msg = _('ignored explicit argument %r') 1861698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ArgumentError(action, msg % explicit_arg) 1862698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1863698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if there is no explicit argument, try to match the 1864698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # optional's string arguments with the following strings 1865698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if successful, exit the loop 1866698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 1867698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson start = start_index + 1 1868698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson selected_patterns = arg_strings_pattern[start:] 1869698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_count = match_argument(action, selected_patterns) 1870698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson stop = start + arg_count 1871698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson args = arg_strings[start:stop] 1872698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action_tuples.append((action, args, option_string)) 1873698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson break 1874698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1875698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # add the Optional to the list and return the index at which 1876698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # the Optional's string args stopped 1877698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson assert action_tuples 1878698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action, args, option_string in action_tuples: 1879698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson take_action(action, args, option_string) 1880698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return stop 1881698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1882698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # the list of Positionals left to be parsed; this is modified 1883698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # by consume_positionals() 1884698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson positionals = self._get_positional_actions() 1885698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1886698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # function to convert arg_strings into positional actions 1887698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def consume_positionals(start_index): 1888698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # match as many Positionals as possible 1889698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson match_partial = self._match_arguments_partial 1890698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson selected_pattern = arg_strings_pattern[start_index:] 1891698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_counts = match_partial(positionals, selected_pattern) 1892698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1893698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # slice off the appropriate arg strings for each Positional 1894698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # and add the Positional and its args to the list 1895698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action, arg_count in zip(positionals, arg_counts): 1896698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson args = arg_strings[start_index: start_index + arg_count] 1897698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson start_index += arg_count 1898698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson take_action(action, args) 1899698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1900698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # slice off the Positionals that we just parsed and return the 1901698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # index at which the Positionals' string args stopped 1902698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson positionals[:] = positionals[len(arg_counts):] 1903698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return start_index 1904698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1905698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # consume Positionals and Optionals alternately, until we have 1906698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # passed the last option string 1907698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson extras = [] 1908698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson start_index = 0 1909698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if option_string_indices: 1910698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson max_option_string_index = max(option_string_indices) 1911698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 1912698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson max_option_string_index = -1 1913698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson while start_index <= max_option_string_index: 1914698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1915698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # consume any Positionals preceding the next option 1916698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson next_option_string_index = min([ 1917698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson index 1918698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for index in option_string_indices 1919698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if index >= start_index]) 1920698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if start_index != next_option_string_index: 1921698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson positionals_end_index = consume_positionals(start_index) 1922698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1923698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # only try to parse the next optional if we didn't consume 1924698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # the option string during the positionals parsing 1925698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if positionals_end_index > start_index: 1926698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson start_index = positionals_end_index 1927698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson continue 1928698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 1929698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson start_index = positionals_end_index 1930698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1931698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if we consumed all the positionals we could and we're not 1932698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # at the index of an option string, there were extra arguments 1933698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if start_index not in option_string_indices: 1934698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson strings = arg_strings[start_index:next_option_string_index] 1935698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson extras.extend(strings) 1936698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson start_index = next_option_string_index 1937698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1938698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # consume the next optional and any arguments for it 1939698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson start_index = consume_optional(start_index) 1940698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1941698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # consume any positionals following the last Optional 1942698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson stop_index = consume_positionals(start_index) 1943698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1944698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if we didn't consume all the argument strings, there were extras 1945698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson extras.extend(arg_strings[stop_index:]) 1946698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1947698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if we didn't use all the Positional objects, there were too few 1948698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # arg strings supplied. 1949698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if positionals: 1950698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.error(_('too few arguments')) 1951698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1952698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # make sure all required actions were present 1953698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action in self._actions: 1954698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.required: 1955698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action not in seen_actions: 1956698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson name = _get_action_name(action) 1957698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.error(_('argument %s is required') % name) 1958698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1959698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # make sure all required groups had one option present 1960698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for group in self._mutually_exclusive_groups: 1961698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if group.required: 1962698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action in group._group_actions: 1963698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action in seen_non_default_actions: 1964698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson break 1965698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1966698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if no actions were used, report the error 1967698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 1968698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson names = [_get_action_name(action) 1969698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action in group._group_actions 1970698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.help is not SUPPRESS] 1971698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson msg = _('one of the arguments %s is required') 1972698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.error(msg % ' '.join(names)) 1973698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1974698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # return the updated namespace and the extra arguments 1975698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return namespace, extras 1976698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1977698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _read_args_from_files(self, arg_strings): 1978698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # expand arguments referencing files 1979698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson new_arg_strings = [] 1980698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for arg_string in arg_strings: 1981698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1982698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # for regular arguments, just add them back into the list 1983698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if arg_string[0] not in self.fromfile_prefix_chars: 1984698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson new_arg_strings.append(arg_string) 1985698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 1986698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # replace arguments referencing files with the file content 1987698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 1988698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson try: 1989698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson args_file = open(arg_string[1:]) 1990698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson try: 1991698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_strings = [] 1992698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for arg_line in args_file.read().splitlines(): 1993698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for arg in self.convert_arg_line_to_args(arg_line): 1994698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_strings.append(arg) 1995698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_strings = self._read_args_from_files(arg_strings) 1996698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson new_arg_strings.extend(arg_strings) 1997698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson finally: 1998698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson args_file.close() 1999698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson except IOError: 2000698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson err = _sys.exc_info()[1] 2001698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.error(str(err)) 2002698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2003698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # return the modified argument list 2004698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return new_arg_strings 2005698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2006698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def convert_arg_line_to_args(self, arg_line): 2007698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return [arg_line] 2008698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2009698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _match_argument(self, action, arg_strings_pattern): 2010698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # match the pattern for this action to the arg strings 2011698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs_pattern = self._get_nargs_pattern(action) 2012698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson match = _re.match(nargs_pattern, arg_strings_pattern) 2013698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2014698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # raise an exception if we weren't able to find a match 2015698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if match is None: 2016698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs_errors = { 2017698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson None: _('expected one argument'), 2018698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson OPTIONAL: _('expected at most one argument'), 2019698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson ONE_OR_MORE: _('expected at least one argument'), 2020698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson } 20211215915045d620d44e14ba12af8949f8ec700b5dÉric Araujo default = ngettext('expected %s argument', 20221215915045d620d44e14ba12af8949f8ec700b5dÉric Araujo 'expected %s arguments', 20231215915045d620d44e14ba12af8949f8ec700b5dÉric Araujo action.nargs) % action.nargs 2024698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson msg = nargs_errors.get(action.nargs, default) 2025698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ArgumentError(action, msg) 2026698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2027698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # return the number of arguments matched 2028698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return len(match.group(1)) 2029698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2030698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _match_arguments_partial(self, actions, arg_strings_pattern): 2031698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # progressively shorten the actions list by slicing off the 2032698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # final actions until we find a match 2033698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result = [] 2034698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for i in range(len(actions), 0, -1): 2035698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson actions_slice = actions[:i] 2036698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson pattern = ''.join([self._get_nargs_pattern(action) 2037698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action in actions_slice]) 2038698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson match = _re.match(pattern, arg_strings_pattern) 2039698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if match is not None: 2040698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result.extend([len(string) for string in match.groups()]) 2041698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson break 2042698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2043698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # return the list of arg string counts 2044698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return result 2045698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2046698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _parse_optional(self, arg_string): 2047698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if it's an empty string, it was meant to be a positional 2048698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not arg_string: 2049698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return None 2050698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2051698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if it doesn't start with a prefix, it was meant to be positional 2052698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not arg_string[0] in self.prefix_chars: 2053698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return None 2054698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2055698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if the option string is present in the parser, return the action 2056698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if arg_string in self._option_string_actions: 2057698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action = self._option_string_actions[arg_string] 2058698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return action, arg_string, None 2059698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2060698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if it's just a single character, it was meant to be positional 2061698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if len(arg_string) == 1: 2062698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return None 2063698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2064698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if the option string before the "=" is present, return the action 2065698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if '=' in arg_string: 2066698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_string, explicit_arg = arg_string.split('=', 1) 2067698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if option_string in self._option_string_actions: 2068698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action = self._option_string_actions[option_string] 2069698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return action, option_string, explicit_arg 2070698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2071698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # search through all possible prefixes of the option string 2072698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # and all actions in the parser for possible interpretations 2073698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_tuples = self._get_option_tuples(arg_string) 2074698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2075698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if multiple actions match, the option string was ambiguous 2076698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if len(option_tuples) > 1: 2077698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson options = ', '.join([option_string 2078698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action, option_string, explicit_arg in option_tuples]) 2079bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo args = {'option': arg_string, 'matches': options} 2080bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo msg = _('ambiguous option: %(option)s could match %(matches)s') 2081bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo self.error(msg % args) 2082698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2083698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if exactly one action matched, this segmentation is good, 2084698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # so return the parsed action 2085698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif len(option_tuples) == 1: 2086698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_tuple, = option_tuples 2087698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return option_tuple 2088698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2089698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if it was not found as an option, but it looks like a negative 2090698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # number, it was meant to be positional 2091698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # unless there are negative-number-like options 2092698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if self._negative_number_matcher.match(arg_string): 2093698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not self._has_negative_number_optionals: 2094698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return None 2095698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2096698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if it contains a space, it was meant to be a positional 2097698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if ' ' in arg_string: 2098698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return None 2099698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2100698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # it was meant to be an optional but there is no such option 2101698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # in this parser (though it might be a valid option in a subparser) 2102698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return None, arg_string, None 2103698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2104698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_option_tuples(self, option_string): 2105698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result = [] 2106698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2107698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # option strings starting with two prefix characters are only 2108698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # split at the '=' 2109698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson chars = self.prefix_chars 2110698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if option_string[0] in chars and option_string[1] in chars: 2111698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if '=' in option_string: 2112698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_prefix, explicit_arg = option_string.split('=', 1) 2113698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 2114698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_prefix = option_string 2115698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson explicit_arg = None 2116698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for option_string in self._option_string_actions: 2117698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if option_string.startswith(option_prefix): 2118698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action = self._option_string_actions[option_string] 2119698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson tup = action, option_string, explicit_arg 2120698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result.append(tup) 2121698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2122698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # single character options can be concatenated with their arguments 2123698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # but multiple character options always have to have their argument 2124698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # separate 2125698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif option_string[0] in chars and option_string[1] not in chars: 2126698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson option_prefix = option_string 2127698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson explicit_arg = None 2128698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson short_option_prefix = option_string[:2] 2129698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson short_explicit_arg = option_string[2:] 2130698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2131698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for option_string in self._option_string_actions: 2132698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if option_string == short_option_prefix: 2133698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action = self._option_string_actions[option_string] 2134698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson tup = action, option_string, short_explicit_arg 2135698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result.append(tup) 2136698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif option_string.startswith(option_prefix): 2137698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson action = self._option_string_actions[option_string] 2138698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson tup = action, option_string, explicit_arg 2139698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result.append(tup) 2140698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2141698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # shouldn't ever get here 2142698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 2143698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.error(_('unexpected option string: %s') % option_string) 2144698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2145698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # return the collected option tuples 2146698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return result 2147698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2148698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_nargs_pattern(self, action): 2149698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # in all examples below, we have to allow for '--' args 2150698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # which are represented as '-' in the pattern 2151698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs = action.nargs 2152698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2153698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # the default (None) is assumed to be a single argument 2154698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if nargs is None: 2155698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs_pattern = '(-*A-*)' 2156698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2157698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # allow zero or one arguments 2158698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif nargs == OPTIONAL: 2159698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs_pattern = '(-*A?-*)' 2160698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2161698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # allow zero or more arguments 2162698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif nargs == ZERO_OR_MORE: 2163698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs_pattern = '(-*[A-]*)' 2164698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2165698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # allow one or more arguments 2166698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif nargs == ONE_OR_MORE: 2167698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs_pattern = '(-*A[A-]*)' 2168698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2169698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # allow any number of options or arguments 2170698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif nargs == REMAINDER: 2171698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs_pattern = '([-AO]*)' 2172698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2173698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # allow one argument followed by any number of options or arguments 2174698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif nargs == PARSER: 2175698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs_pattern = '(-*A[-AO]*)' 2176698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2177698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # all others should be integers 2178698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 2179698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs) 2180698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2181698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # if this is an optional action, -- is not allowed 2182698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.option_strings: 2183698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs_pattern = nargs_pattern.replace('-*', '') 2184698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson nargs_pattern = nargs_pattern.replace('-', '') 2185698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2186698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # return the pattern 2187698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return nargs_pattern 2188698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2189698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ======================== 2190698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # Value conversion methods 2191698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ======================== 2192698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_values(self, action, arg_strings): 2193698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # for everything but PARSER args, strip out '--' 2194698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.nargs not in [PARSER, REMAINDER]: 2195698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_strings = [s for s in arg_strings if s != '--'] 2196698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2197698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # optional argument produces a default when not present 2198698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not arg_strings and action.nargs == OPTIONAL: 2199698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.option_strings: 2200698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson value = action.const 2201698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 2202698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson value = action.default 220316f2fd013d4559f1458efbf21c68034d85bb255eBenjamin Peterson if isinstance(value, str): 2204698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson value = self._get_value(action, value) 2205698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._check_value(action, value) 2206698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2207698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # when nargs='*' on a positional, if there were no command-line 2208698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # args, use the default if it is anything other than None 2209698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif (not arg_strings and action.nargs == ZERO_OR_MORE and 2210698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson not action.option_strings): 2211698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.default is not None: 2212698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson value = action.default 2213698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 2214698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson value = arg_strings 2215698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._check_value(action, value) 2216698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2217698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # single argument or optional argument produces a single value 2218698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif len(arg_strings) == 1 and action.nargs in [None, OPTIONAL]: 2219698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson arg_string, = arg_strings 2220698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson value = self._get_value(action, arg_string) 2221698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._check_value(action, value) 2222698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2223698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # REMAINDER arguments convert all values, checking none 2224698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif action.nargs == REMAINDER: 2225698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson value = [self._get_value(action, v) for v in arg_strings] 2226698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2227698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # PARSER arguments convert all values, but check only the first 2228698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson elif action.nargs == PARSER: 2229698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson value = [self._get_value(action, v) for v in arg_strings] 2230698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._check_value(action, value[0]) 2231698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2232698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # all other types of nargs produce a list 2233698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson else: 2234698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson value = [self._get_value(action, v) for v in arg_strings] 2235698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for v in value: 2236698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._check_value(action, v) 2237698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2238698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # return the converted value 2239698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return value 2240698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2241698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_value(self, action, arg_string): 2242698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson type_func = self._registry_get('type', action.type, action.type) 2243698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if not _callable(type_func): 2244698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson msg = _('%r is not callable') 2245698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ArgumentError(action, msg % type_func) 2246698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2247698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # convert the value to the appropriate type 2248698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson try: 2249698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson result = type_func(arg_string) 2250698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2251698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ArgumentTypeErrors indicate errors 2252698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson except ArgumentTypeError: 2253698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson name = getattr(action.type, '__name__', repr(action.type)) 2254698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson msg = str(_sys.exc_info()[1]) 2255698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson raise ArgumentError(action, msg) 2256698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2257698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # TypeErrors or ValueErrors also indicate errors 2258698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson except (TypeError, ValueError): 2259698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson name = getattr(action.type, '__name__', repr(action.type)) 2260bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo args = {'type': name, 'value': arg_string} 2261bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo msg = _('invalid %(type)s value: %(value)r') 2262bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo raise ArgumentError(action, msg % args) 2263698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2264698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # return the converted value 2265698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return result 2266698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2267698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _check_value(self, action, value): 2268698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # converted value must be one of the choices (if specified) 2269698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if action.choices is not None and value not in action.choices: 2270bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo args = {'value': value, 2271bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo 'choices': ', '.join(map(repr, action.choices))} 2272bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo msg = _('invalid choice: %(value)r (choose from %(choices)s)') 2273bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo raise ArgumentError(action, msg % args) 2274698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2275698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ======================= 2276698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # Help-formatting methods 2277698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ======================= 2278698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def format_usage(self): 2279698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter = self._get_formatter() 2280698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter.add_usage(self.usage, self._actions, 2281698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._mutually_exclusive_groups) 2282698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return formatter.format_help() 2283698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2284698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def format_help(self): 2285698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter = self._get_formatter() 2286698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2287698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # usage 2288698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter.add_usage(self.usage, self._actions, 2289698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._mutually_exclusive_groups) 2290698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2291698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # description 2292698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter.add_text(self.description) 2293698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2294698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # positionals, optionals and user-defined groups 2295698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson for action_group in self._action_groups: 2296698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter.start_section(action_group.title) 2297698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter.add_text(action_group.description) 2298698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter.add_arguments(action_group._group_actions) 2299698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter.end_section() 2300698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2301698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # epilog 2302698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter.add_text(self.epilog) 2303698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2304698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # determine help from format above 2305698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return formatter.format_help() 2306698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2307698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def format_version(self): 2308698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson import warnings 2309698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson warnings.warn( 2310698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'The format_version method is deprecated -- the "version" ' 2311698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'argument to ArgumentParser is no longer supported.', 2312698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson DeprecationWarning) 2313698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter = self._get_formatter() 2314698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson formatter.add_text(self.version) 2315698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return formatter.format_help() 2316698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2317698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _get_formatter(self): 2318698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson return self.formatter_class(prog=self.prog) 2319698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2320698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ===================== 2321698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # Help-printing methods 2322698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # ===================== 2323698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def print_usage(self, file=None): 2324698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if file is None: 2325698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson file = _sys.stdout 2326698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._print_message(self.format_usage(), file) 2327698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2328698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def print_help(self, file=None): 2329698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if file is None: 2330698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson file = _sys.stdout 2331698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._print_message(self.format_help(), file) 2332698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2333698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def print_version(self, file=None): 2334698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson import warnings 2335698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson warnings.warn( 2336698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'The print_version method is deprecated -- the "version" ' 2337698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 'argument to ArgumentParser is no longer supported.', 2338698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson DeprecationWarning) 2339698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._print_message(self.format_version(), file) 2340698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2341698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def _print_message(self, message, file=None): 2342698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if message: 2343698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if file is None: 2344698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson file = _sys.stderr 2345698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson file.write(message) 2346698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2347698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # =============== 2348698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # Exiting methods 2349698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson # =============== 2350698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def exit(self, status=0, message=None): 2351698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson if message: 2352698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self._print_message(message, _sys.stderr) 2353698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson _sys.exit(status) 2354698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2355698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson def error(self, message): 2356698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """error(message: string) 2357698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2358698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson Prints a usage message incorporating the message to stderr and 2359698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson exits. 2360698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson 2361698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson If you override this in a subclass, it should not return -- it 2362698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson should either exit or raise an exception. 2363698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson """ 2364698a18aa9e8e0f3fca081dc12544002a4d0e83ecBenjamin Peterson self.print_usage(_sys.stderr) 2365bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo args = {'prog': self.prog, 'message': message} 2366bb48a8b59a8e8573f6ba2761c09fc1ad271d8068Éric Araujo self.exit(2, _('%(prog)s: error: %(message)s\n') % args) 2367