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