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