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