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