argparse.py revision 931906a7f5974865c9e928332eb6dd8ba10a91c7
1fb224e303435c9b98fd1a24dbd3cf119d7b90b6bBenjamin Peterson# Author: Steven J. Bethard <steven.bethard@gmail.com>. 2a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 3a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson"""Command-line parsing library 4a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 5a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonThis module is an optparse-inspired command-line parsing library that: 6a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 7a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - handles both optional and positional arguments 8a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - produces highly informative usage messages 9a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - supports parsers that dispatch to sub-parsers 10a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 11a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonThe following is a simple usage example that sums integers from the 12a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersoncommand-line and writes the result to a file:: 13a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 14a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser = argparse.ArgumentParser( 15a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson description='sum the integers at the command line') 16a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser.add_argument( 17a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'integers', metavar='int', nargs='+', type=int, 18a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help='an integer to be summed') 19a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser.add_argument( 20a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson '--log', default=sys.stdout, type=argparse.FileType('w'), 21a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help='the file where the sum should be written') 22a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args = parser.parse_args() 23a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args.log.write('%s' % sum(args.integers)) 24a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args.log.close() 25a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 26a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonThe module contains the following public classes: 27a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 28a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - ArgumentParser -- The main entry point for command-line parsing. As the 29a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson example above shows, the add_argument() method is used to populate 30a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson the parser with actions for optional and positional arguments. Then 31a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson the parse_args() method is invoked to convert the args at the 32a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson command-line into an object with attributes. 33a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 34a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - ArgumentError -- The exception raised by ArgumentParser objects when 35a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson there are errors with the parser's actions. Errors raised while 36a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parsing the command-line are caught by ArgumentParser and emitted 37a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson as command-line messages. 38a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 39a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - FileType -- A factory for defining types of files to be created. As the 40a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson example above shows, instances of FileType are typically passed as 41a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson the type= argument of add_argument() calls. 42a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 43a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - Action -- The base class for parser actions. Typically actions are 44a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson selected by passing strings like 'store_true' or 'append_const' to 45a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson the action= argument of add_argument(). However, for greater 46a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson customization of ArgumentParser actions, subclasses of Action may 47a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson be defined and passed as the action= argument. 48a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 49a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - HelpFormatter, RawDescriptionHelpFormatter, RawTextHelpFormatter, 50a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson ArgumentDefaultsHelpFormatter -- Formatter classes which 51a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson may be passed as the formatter_class= argument to the 52a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson ArgumentParser constructor. HelpFormatter is the default, 53a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson RawDescriptionHelpFormatter and RawTextHelpFormatter tell the parser 54a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson not to change the formatting for help text, and 55a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson ArgumentDefaultsHelpFormatter adds information about argument defaults 56a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson to the help. 57a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 58a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonAll other classes in this module are considered implementation details. 59a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson(Also note that HelpFormatter and RawDescriptionHelpFormatter are only 60a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonconsidered public as object names -- the API of the formatter objects is 61a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonstill considered an implementation detail.) 62a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson""" 63a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 64a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson__version__ = '1.1' 65a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson__all__ = [ 66a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'ArgumentParser', 67a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'ArgumentError', 68931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'ArgumentTypeError', 69a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'FileType', 70a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'HelpFormatter', 71931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'ArgumentDefaultsHelpFormatter', 72a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'RawDescriptionHelpFormatter', 73a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'RawTextHelpFormatter', 74931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'Namespace', 75931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'Action', 76931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'ONE_OR_MORE', 77931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'OPTIONAL', 78931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'PARSER', 79931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'REMAINDER', 80931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'SUPPRESS', 81931906a7f5974865c9e928332eb6dd8ba10a91c7Steven Bethard 'ZERO_OR_MORE', 82a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson] 83a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 84a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 85a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonimport copy as _copy 86a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonimport os as _os 87a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonimport re as _re 88a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonimport sys as _sys 89a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonimport textwrap as _textwrap 90a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 91a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonfrom gettext import gettext as _ 92a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 93a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 94a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersondef _callable(obj): 95a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return hasattr(obj, '__call__') or hasattr(obj, '__bases__') 96a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 97a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 98a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonSUPPRESS = '==SUPPRESS==' 99a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 100a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonOPTIONAL = '?' 101a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonZERO_OR_MORE = '*' 102a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonONE_OR_MORE = '+' 103a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonPARSER = 'A...' 104a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin PetersonREMAINDER = '...' 105a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 106a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# ============================= 107a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# Utility functions and classes 108a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# ============================= 109a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 110a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _AttributeHolder(object): 111a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Abstract base class that provides __repr__. 112a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 113a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson The __repr__ method returns a string in the format:: 114a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson ClassName(attr=name, attr=name, ...) 115a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson The attributes are determined either by a class-level attribute, 116a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson '_kwarg_names', or by inspecting the instance __dict__. 117a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 118a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 119a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __repr__(self): 120a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type_name = type(self).__name__ 121a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings = [] 122a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for arg in self._get_args(): 123a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings.append(repr(arg)) 124a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for name, value in self._get_kwargs(): 125a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings.append('%s=%r' % (name, value)) 126a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return '%s(%s)' % (type_name, ', '.join(arg_strings)) 127a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 128a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_kwargs(self): 1290e717addd8a03ed10231a578fce894c07ddb157eBenjamin Peterson return sorted(self.__dict__.items()) 130a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 131a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_args(self): 132a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return [] 133a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 134a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 135a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersondef _ensure_value(namespace, name, value): 136a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if getattr(namespace, name, None) is None: 137a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, name, value) 138a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return getattr(namespace, name) 139a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 140a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 141a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# =============== 142a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# Formatting Help 143a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# =============== 144a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 145a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass HelpFormatter(object): 146a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Formatter for generating usage messages and argument help strings. 147a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 148a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Only the name of this class is considered a public API. All the methods 149a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson provided by the class are considered an implementation detail. 150a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 151a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 152a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 153a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prog, 154a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson indent_increment=2, 155a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson max_help_position=24, 156a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson width=None): 157a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 158a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # default setting for width 159a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if width is None: 160a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 161a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson width = int(_os.environ['COLUMNS']) 162a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except (KeyError, ValueError): 163a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson width = 80 164a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson width -= 2 165a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 166a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._prog = prog 167a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._indent_increment = indent_increment 168a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._max_help_position = max_help_position 169a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._width = width 170a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 171a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._current_indent = 0 172a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._level = 0 173a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._action_max_length = 0 174a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 175a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._root_section = self._Section(self, None) 176a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._current_section = self._root_section 177a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 178a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._whitespace_matcher = _re.compile(r'\s+') 179a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._long_break_matcher = _re.compile(r'\n\n\n+') 180a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 181a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # =============================== 182a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Section and indentation methods 183a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # =============================== 184a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _indent(self): 185a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._current_indent += self._indent_increment 186a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._level += 1 187a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 188a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _dedent(self): 189a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._current_indent -= self._indent_increment 190a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson assert self._current_indent >= 0, 'Indent decreased below 0.' 191a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._level -= 1 192a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 193a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson class _Section(object): 194a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 195a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, formatter, parent, heading=None): 196a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.formatter = formatter 197a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.parent = parent 198a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.heading = heading 199a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.items = [] 200a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 201a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def format_help(self): 202a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # format the indented section 203a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self.parent is not None: 204a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.formatter._indent() 205a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson join = self.formatter._join_parts 206a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for func, args in self.items: 207a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson func(*args) 208a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson item_help = join([func(*args) for func, args in self.items]) 209a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self.parent is not None: 210a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.formatter._dedent() 211a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 212a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return nothing if the section was empty 213a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not item_help: 214a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return '' 215a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 216a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add the heading if the section was non-empty 217a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self.heading is not SUPPRESS and self.heading is not None: 218a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson current_indent = self.formatter._current_indent 219a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson heading = '%*s%s:\n' % (current_indent, '', self.heading) 220a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 221a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson heading = '' 222a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 223a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # join the section-initial newline, the heading and the help 224a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return join(['\n', heading, item_help, '\n']) 225a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 226a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _add_item(self, func, args): 227a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._current_section.items.append((func, args)) 228a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 229a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================== 230a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Message building methods 231a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================== 232a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def start_section(self, heading): 233a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._indent() 234a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson section = self._Section(self, self._current_section, heading) 235a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._add_item(section.format_help, []) 236a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._current_section = section 237a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 238a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def end_section(self): 239a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._current_section = self._current_section.parent 240a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._dedent() 241a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 242a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_text(self, text): 243a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if text is not SUPPRESS and text is not None: 244a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._add_item(self._format_text, [text]) 245a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 246a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_usage(self, usage, actions, groups, prefix=None): 247a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if usage is not SUPPRESS: 248a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args = usage, actions, groups, prefix 249a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._add_item(self._format_usage, args) 250a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 251a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_argument(self, action): 252a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.help is not SUPPRESS: 253a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 254a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # find all invocations 255a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson get_invocation = self._format_action_invocation 256a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson invocations = [get_invocation(action)] 257a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for subaction in self._iter_indented_subactions(action): 258a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson invocations.append(get_invocation(subaction)) 259a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 260a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # update the maximum item length 261a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson invocation_length = max([len(s) for s in invocations]) 262a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_length = invocation_length + self._current_indent 263a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._action_max_length = max(self._action_max_length, 264a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_length) 265a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 266a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add the item to the list 267a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._add_item(self._format_action, [action]) 268a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 269a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_arguments(self, actions): 270a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in actions: 271a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.add_argument(action) 272a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 273a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================= 274a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Help-formatting methods 275a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================= 276a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def format_help(self): 277a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help = self._root_section.format_help() 278a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if help: 279a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help = self._long_break_matcher.sub('\n\n', help) 280a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help = help.strip('\n') + '\n' 281a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return help 282a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 283a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _join_parts(self, part_strings): 284a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return ''.join([part 285a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for part in part_strings 286a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if part and part is not SUPPRESS]) 287a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 288a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _format_usage(self, usage, actions, groups, prefix): 289a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if prefix is None: 290a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prefix = _('usage: ') 291a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 292a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if usage is specified, use that 293a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if usage is not None: 294a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson usage = usage % dict(prog=self._prog) 295a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 296a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if no optionals or positionals are available, usage is just prog 297a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif usage is None and not actions: 298a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson usage = '%(prog)s' % dict(prog=self._prog) 299a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 300a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if optionals and positionals are available, calculate usage 301a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif usage is None: 302a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prog = '%(prog)s' % dict(prog=self._prog) 303a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 304a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # split optionals from positionals 305a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson optionals = [] 306a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson positionals = [] 307a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in actions: 308a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.option_strings: 309a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson optionals.append(action) 310a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 311a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson positionals.append(action) 312a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 313a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # build full usage string 314a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson format = self._format_actions_usage 315a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_usage = format(optionals + positionals, groups) 316a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson usage = ' '.join([s for s in [prog, action_usage] if s]) 317a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 318a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # wrap the usage parts if it's too long 319a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text_width = self._width - self._current_indent 320a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if len(prefix) + len(usage) > text_width: 321a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 322a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # break usage into wrappable parts 323a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson part_regexp = r'\(.*?\)+|\[.*?\]+|\S+' 324a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson opt_usage = format(optionals, groups) 325a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson pos_usage = format(positionals, groups) 326a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson opt_parts = _re.findall(part_regexp, opt_usage) 327a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson pos_parts = _re.findall(part_regexp, pos_usage) 328a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson assert ' '.join(opt_parts) == opt_usage 329a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson assert ' '.join(pos_parts) == pos_usage 330a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 331a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # helper for wrapping lines 332a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def get_lines(parts, indent, prefix=None): 333a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines = [] 334a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson line = [] 335a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if prefix is not None: 336a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson line_len = len(prefix) - 1 337a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 338a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson line_len = len(indent) - 1 339a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for part in parts: 340a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if line_len + 1 + len(part) > text_width: 341a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines.append(indent + ' '.join(line)) 342a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson line = [] 343a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson line_len = len(indent) - 1 344a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson line.append(part) 345a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson line_len += len(part) + 1 346a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if line: 347a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines.append(indent + ' '.join(line)) 348a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if prefix is not None: 349a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines[0] = lines[0][len(indent):] 350a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return lines 351a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 352a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if prog is short, follow it with optionals or positionals 353a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if len(prefix) + len(prog) <= 0.75 * text_width: 354a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson indent = ' ' * (len(prefix) + len(prog) + 1) 355a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if opt_parts: 356a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines = get_lines([prog] + opt_parts, indent, prefix) 357a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines.extend(get_lines(pos_parts, indent)) 358a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif pos_parts: 359a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines = get_lines([prog] + pos_parts, indent, prefix) 360a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 361a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines = [prog] 362a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 363a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if prog is long, put it on its own line 364a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 365a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson indent = ' ' * len(prefix) 366a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts = opt_parts + pos_parts 367a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines = get_lines(parts, indent) 368a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if len(lines) > 1: 369a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines = [] 370a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines.extend(get_lines(opt_parts, indent)) 371a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines.extend(get_lines(pos_parts, indent)) 372a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson lines = [prog] + lines 373a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 374a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # join lines into usage 375a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson usage = '\n'.join(lines) 376a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 377a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # prefix with 'usage:' 378a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return '%s%s\n\n' % (prefix, usage) 379a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 380a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _format_actions_usage(self, actions, groups): 381a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # find group indices and identify actions in groups 3820e717addd8a03ed10231a578fce894c07ddb157eBenjamin Peterson group_actions = set() 383a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson inserts = {} 384a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for group in groups: 385a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 386a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson start = actions.index(group._group_actions[0]) 387a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except ValueError: 388a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson continue 389a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 390a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson end = start + len(group._group_actions) 391a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if actions[start:end] == group._group_actions: 392a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in group._group_actions: 393a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson group_actions.add(action) 394a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not group.required: 395a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson inserts[start] = '[' 396a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson inserts[end] = ']' 397a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 398a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson inserts[start] = '(' 399a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson inserts[end] = ')' 400a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for i in range(start + 1, end): 401a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson inserts[i] = '|' 402a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 403a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # collect all actions format strings 404a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts = [] 405a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for i, action in enumerate(actions): 406a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 407a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # suppressed arguments are marked with None 408a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # remove | separators for suppressed arguments 409a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.help is SUPPRESS: 410a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.append(None) 411a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if inserts.get(i) == '|': 412a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson inserts.pop(i) 413a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif inserts.get(i + 1) == '|': 414a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson inserts.pop(i + 1) 415a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 416a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # produce all arg strings 417a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif not action.option_strings: 418a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson part = self._format_args(action, action.dest) 419a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 420a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if it's in a group, strip the outer [] 421a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action in group_actions: 422a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if part[0] == '[' and part[-1] == ']': 423a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson part = part[1:-1] 424a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 425a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add the action string to the list 426a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.append(part) 427a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 428a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # produce the first way to invoke the option in brackets 429a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 430a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_string = action.option_strings[0] 431a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 432a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the Optional doesn't take a value, format is: 433a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # -s or --long 434a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.nargs == 0: 435a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson part = '%s' % option_string 436a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 437a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the Optional takes a value, format is: 438a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # -s ARGS or --long ARGS 439a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 440a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default = action.dest.upper() 441a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args_string = self._format_args(action, default) 442a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson part = '%s %s' % (option_string, args_string) 443a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 444a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # make it look optional if it's not required or in a group 445a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not action.required and action not in group_actions: 446a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson part = '[%s]' % part 447a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 448a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add the action string to the list 449a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.append(part) 450a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 451a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # insert things at the necessary indices 4520e717addd8a03ed10231a578fce894c07ddb157eBenjamin Peterson for i in sorted(inserts, reverse=True): 453a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts[i:i] = [inserts[i]] 454a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 455a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # join all the action items with spaces 456a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = ' '.join([item for item in parts if item is not None]) 457a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 458a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # clean up separators for mutually exclusive groups 459a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson open = r'[\[(]' 460a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson close = r'[\])]' 461a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = _re.sub(r'(%s) ' % open, r'\1', text) 462a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = _re.sub(r' (%s)' % close, r'\1', text) 463a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = _re.sub(r'%s *%s' % (open, close), r'', text) 464a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = _re.sub(r'\(([^|]*)\)', r'\1', text) 465a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = text.strip() 466a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 467a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the text 468a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return text 469a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 470a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _format_text(self, text): 471a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if '%(prog)' in text: 472a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = text % dict(prog=self._prog) 473a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text_width = self._width - self._current_indent 474a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson indent = ' ' * self._current_indent 475a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._fill_text(text, text_width, indent) + '\n\n' 476a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 477a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _format_action(self, action): 478a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # determine the required width and the entry label 479a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help_position = min(self._action_max_length + 2, 480a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._max_help_position) 481a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help_width = self._width - help_position 482a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_width = help_position - self._current_indent - 2 483a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_header = self._format_action_invocation(action) 484a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 485a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ho nelp; start on same line and add a final newline 486a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not action.help: 487a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = self._current_indent, '', action_header 488a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_header = '%*s%s\n' % tup 489a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 490a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # short action name; start on the same line and pad two spaces 491a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif len(action_header) <= action_width: 492a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = self._current_indent, '', action_width, action_header 493a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_header = '%*s%-*s ' % tup 494a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson indent_first = 0 495a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 496a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # long action name; start on the next line 497a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 498a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = self._current_indent, '', action_header 499a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_header = '%*s%s\n' % tup 500a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson indent_first = help_position 501a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 502a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # collect the pieces of the action help 503a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts = [action_header] 504a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 505a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if there was help for the action, add lines of help text 506a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.help: 507a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help_text = self._expand_help(action) 508a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help_lines = self._split_lines(help_text, help_width) 509a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.append('%*s%s\n' % (indent_first, '', help_lines[0])) 510a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for line in help_lines[1:]: 511a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.append('%*s%s\n' % (help_position, '', line)) 512a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 513a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # or add a newline if the description doesn't end with one 514a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif not action_header.endswith('\n'): 515a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.append('\n') 516a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 517a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if there are any sub-actions, add their help as well 518a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for subaction in self._iter_indented_subactions(action): 519a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.append(self._format_action(subaction)) 520a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 521a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return a single string 522a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._join_parts(parts) 523a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 524a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _format_action_invocation(self, action): 525a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not action.option_strings: 526a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar, = self._metavar_formatter(action, action.dest)(1) 527a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return metavar 528a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 529a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 530a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts = [] 531a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 532a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the Optional doesn't take a value, format is: 533a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # -s, --long 534a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.nargs == 0: 535a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.extend(action.option_strings) 536a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 537a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the Optional takes a value, format is: 538a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # -s ARGS, --long ARGS 539a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 540a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default = action.dest.upper() 541a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args_string = self._format_args(action, default) 542a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string in action.option_strings: 543a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parts.append('%s %s' % (option_string, args_string)) 544a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 545a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return ', '.join(parts) 546a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 547a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _metavar_formatter(self, action, default_metavar): 548a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.metavar is not None: 549a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = action.metavar 550a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif action.choices is not None: 551a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choice_strs = [str(choice) for choice in action.choices] 552a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = '{%s}' % ','.join(choice_strs) 553a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 554a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = default_metavar 555a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 556a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def format(tuple_size): 557a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if isinstance(result, tuple): 558a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return result 559a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 560a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return (result, ) * tuple_size 561a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return format 562a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 563a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _format_args(self, action, default_metavar): 564a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson get_metavar = self._metavar_formatter(action, default_metavar) 565a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.nargs is None: 566a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = '%s' % get_metavar(1) 567a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif action.nargs == OPTIONAL: 568a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = '[%s]' % get_metavar(1) 569a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif action.nargs == ZERO_OR_MORE: 570a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = '[%s [%s ...]]' % get_metavar(2) 571a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif action.nargs == ONE_OR_MORE: 572a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = '%s [%s ...]' % get_metavar(2) 573a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif action.nargs == REMAINDER: 574a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = '...' 575a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif action.nargs == PARSER: 576a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = '%s ...' % get_metavar(1) 577a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 578a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formats = ['%s' for _ in range(action.nargs)] 579a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = ' '.join(formats) % get_metavar(action.nargs) 580a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return result 581a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 582a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _expand_help(self, action): 583a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson params = dict(vars(action), prog=self._prog) 584a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for name in list(params): 585a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if params[name] is SUPPRESS: 586a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson del params[name] 587a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for name in list(params): 588a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if hasattr(params[name], '__name__'): 589a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson params[name] = params[name].__name__ 590a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if params.get('choices') is not None: 591a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choices_str = ', '.join([str(c) for c in params['choices']]) 592a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson params['choices'] = choices_str 593a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._get_help_string(action) % params 594a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 595a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _iter_indented_subactions(self, action): 596a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 597a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson get_subactions = action._get_subactions 598a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except AttributeError: 599a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson pass 600a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 601a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._indent() 602a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for subaction in get_subactions(): 603a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson yield subaction 604a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._dedent() 605a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 606a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _split_lines(self, text, width): 607a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = self._whitespace_matcher.sub(' ', text).strip() 608a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return _textwrap.wrap(text, width) 609a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 610a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _fill_text(self, text, width, indent): 611a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson text = self._whitespace_matcher.sub(' ', text).strip() 612a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return _textwrap.fill(text, width, initial_indent=indent, 613a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson subsequent_indent=indent) 614a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 615a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_help_string(self, action): 616a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action.help 617a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 618a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 619a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass RawDescriptionHelpFormatter(HelpFormatter): 620a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Help message formatter which retains any formatting in descriptions. 621a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 622a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Only the name of this class is considered a public API. All the methods 623a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson provided by the class are considered an implementation detail. 624a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 625a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 626a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _fill_text(self, text, width, indent): 627a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return ''.join([indent + line for line in text.splitlines(True)]) 628a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 629a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 630a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass RawTextHelpFormatter(RawDescriptionHelpFormatter): 631a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Help message formatter which retains formatting of all help text. 632a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 633a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Only the name of this class is considered a public API. All the methods 634a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson provided by the class are considered an implementation detail. 635a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 636a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 637a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _split_lines(self, text, width): 638a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return text.splitlines() 639a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 640a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 641a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass ArgumentDefaultsHelpFormatter(HelpFormatter): 642a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Help message formatter which adds default values to argument help. 643a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 644a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Only the name of this class is considered a public API. All the methods 645a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson provided by the class are considered an implementation detail. 646a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 647a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 648a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_help_string(self, action): 649a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help = action.help 650a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if '%(default)' not in action.help: 651a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.default is not SUPPRESS: 652a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson defaulting_nargs = [OPTIONAL, ZERO_OR_MORE] 653a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.option_strings or action.nargs in defaulting_nargs: 654a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help += ' (default: %(default)s)' 655a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return help 656a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 657a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 658a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# ===================== 659a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# Options and Arguments 660a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# ===================== 661a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 662a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersondef _get_action_name(argument): 663a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if argument is None: 664a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return None 665a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif argument.option_strings: 666a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return '/'.join(argument.option_strings) 667a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif argument.metavar not in (None, SUPPRESS): 668a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return argument.metavar 669a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif argument.dest not in (None, SUPPRESS): 670a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return argument.dest 671a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 672a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return None 673a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 674a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 675a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass ArgumentError(Exception): 676a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """An error from creating or using an argument (optional or positional). 677a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 678a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson The string value of this exception is the message, augmented with 679a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson information about the argument that caused it. 680a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 681a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 682a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, argument, message): 683a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.argument_name = _get_action_name(argument) 684a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.message = message 685a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 686a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __str__(self): 687a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self.argument_name is None: 688a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson format = '%(message)s' 689a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 690a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson format = 'argument %(argument_name)s: %(message)s' 691a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return format % dict(message=self.message, 692a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson argument_name=self.argument_name) 693a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 694a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 695a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass ArgumentTypeError(Exception): 696a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """An error from trying to convert a command line string to a type.""" 697a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson pass 698a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 699a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 700a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# ============== 701a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# Action classes 702a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# ============== 703a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 704a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass Action(_AttributeHolder): 705a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Information about how to convert command line strings to Python objects. 706a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 707a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Action objects are used by an ArgumentParser to represent the information 708a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson needed to parse a single argument from one or more strings from the 709a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson command line. The keyword arguments to the Action constructor are also 710a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson all attributes of Action instances. 711a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 712a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Keyword Arguments: 713a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 714a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - option_strings -- A list of command-line option strings which 715a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson should be associated with this action. 716a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 717a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - dest -- The name of the attribute to hold the created object(s) 718a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 719a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - nargs -- The number of command-line arguments that should be 720a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson consumed. By default, one argument will be consumed and a single 721a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value will be produced. Other values include: 722a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - N (an integer) consumes N arguments (and produces a list) 723a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - '?' consumes zero or one arguments 724a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - '*' consumes zero or more arguments (and produces a list) 725a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - '+' consumes one or more arguments (and produces a list) 726a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Note that the difference between the default and nargs=1 is that 727a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson with the default, a single value will be produced, while with 728a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=1, a list containing a single value will be produced. 729a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 730a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - const -- The value to be produced if the option is specified and the 731a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option uses an action that takes no values. 732a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 733a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - default -- The value to be produced if the option is not specified. 734a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 735a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - type -- The type which the command-line arguments should be converted 736a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson to, should be one of 'string', 'int', 'float', 'complex' or a 737a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson callable object that accepts a single string argument. If None, 738a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'string' is assumed. 739a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 740a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - choices -- A container of values that should be allowed. If not None, 741a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson after a command-line argument has been converted to the appropriate 742a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type, an exception will be raised if it is not a member of this 743a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson collection. 744a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 745a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - required -- True if the action must always be specified at the 746a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson command line. This is only meaningful for optional command-line 747a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arguments. 748a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 749a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - help -- The help string describing the argument. 750a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 751a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - metavar -- The name to be used for the option's argument with the 752a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help string. If None, the 'dest' value will be used as the name. 753a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 754a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 755a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 756a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 757a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest, 758a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=None, 759a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=None, 760a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=None, 761a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type=None, 762a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choices=None, 763a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=False, 764a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None, 765a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=None): 766a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.option_strings = option_strings 767a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.dest = dest 768a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.nargs = nargs 769a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.const = const 770a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.default = default 771a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.type = type 772a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.choices = choices 773a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.required = required 774a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.help = help 775a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.metavar = metavar 776a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 777a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_kwargs(self): 778a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson names = [ 779a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'option_strings', 780a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'dest', 781a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'nargs', 782a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'const', 783a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'default', 784a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'type', 785a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'choices', 786a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'help', 787a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'metavar', 788a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson ] 789a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return [(name, getattr(self, name)) for name in names] 790a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 791a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 792a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise NotImplementedError(_('.__call__() not defined')) 793a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 794a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 795a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _StoreAction(Action): 796a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 797a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 798a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 799a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest, 800a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=None, 801a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=None, 802a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=None, 803a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type=None, 804a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choices=None, 805a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=False, 806a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None, 807a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=None): 808a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if nargs == 0: 809a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError('nargs for store actions must be > 0; if you ' 810a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'have nothing to store, actions such as store ' 811a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'true or store const may be more appropriate') 812a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if const is not None and nargs != OPTIONAL: 813a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError('nargs must be %r to supply const' % OPTIONAL) 814a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_StoreAction, self).__init__( 815a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 816a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 817a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=nargs, 818a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=const, 819a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 820a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type=type, 821a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choices=choices, 822a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=required, 823a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help, 824a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=metavar) 825a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 826a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 827a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, self.dest, values) 828a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 829a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 830a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _StoreConstAction(Action): 831a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 832a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 833a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 834a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest, 835a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const, 836a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=None, 837a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=False, 838a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None, 839a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=None): 840a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_StoreConstAction, self).__init__( 841a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 842a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 843a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=0, 844a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=const, 845a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 846a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=required, 847a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help) 848a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 849a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 850a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, self.dest, self.const) 851a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 852a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 853a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _StoreTrueAction(_StoreConstAction): 854a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 855a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 856a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 857a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest, 858a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=False, 859a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=False, 860a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None): 861a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_StoreTrueAction, self).__init__( 862a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 863a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 864a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=True, 865a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 866a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=required, 867a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help) 868a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 869a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 870a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _StoreFalseAction(_StoreConstAction): 871a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 872a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 873a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 874a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest, 875a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=True, 876a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=False, 877a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None): 878a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_StoreFalseAction, self).__init__( 879a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 880a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 881a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=False, 882a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 883a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=required, 884a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help) 885a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 886a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 887a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _AppendAction(Action): 888a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 889a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 890a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 891a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest, 892a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=None, 893a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=None, 894a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=None, 895a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type=None, 896a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choices=None, 897a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=False, 898a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None, 899a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=None): 900a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if nargs == 0: 901a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError('nargs for append actions must be > 0; if arg ' 902a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'strings are not supplying the value to append, ' 903a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'the append const action may be more appropriate') 904a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if const is not None and nargs != OPTIONAL: 905a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError('nargs must be %r to supply const' % OPTIONAL) 906a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_AppendAction, self).__init__( 907a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 908a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 909a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=nargs, 910a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=const, 911a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 912a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type=type, 913a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choices=choices, 914a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=required, 915a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help, 916a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=metavar) 917a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 918a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 919a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson items = _copy.copy(_ensure_value(namespace, self.dest, [])) 920a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson items.append(values) 921a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, self.dest, items) 922a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 923a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 924a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _AppendConstAction(Action): 925a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 926a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 927a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 928a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest, 929a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const, 930a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=None, 931a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=False, 932a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None, 933a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=None): 934a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_AppendConstAction, self).__init__( 935a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 936a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 937a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=0, 938a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson const=const, 939a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 940a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=required, 941a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help, 942a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=metavar) 943a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 944a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 945a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson items = _copy.copy(_ensure_value(namespace, self.dest, [])) 946a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson items.append(self.const) 947a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, self.dest, items) 948a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 949a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 950a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _CountAction(Action): 951a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 952a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 953a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 954a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest, 955a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=None, 956a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=False, 957a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None): 958a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_CountAction, self).__init__( 959a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 960a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 961a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=0, 962a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 963a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=required, 964a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help) 965a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 966a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 967a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson new_count = _ensure_value(namespace, self.dest, 0) + 1 968a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, self.dest, new_count) 969a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 970a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 971a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _HelpAction(Action): 972a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 973a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 974a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 975a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=SUPPRESS, 976a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=SUPPRESS, 977a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None): 978a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_HelpAction, self).__init__( 979a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 980a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 981a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 982a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=0, 983a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help) 984a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 985a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 986a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser.print_help() 987a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser.exit() 988a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 989a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 990a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _VersionAction(Action): 991a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 992a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 993a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 994a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson version=None, 995a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=SUPPRESS, 996a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=SUPPRESS, 997dce6e1bd5a5b41b22be10ba119fb5b6d5546959aSteven Bethard help="show program's version number and exit"): 998a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_VersionAction, self).__init__( 999a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 1000a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 1001a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default=default, 1002a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=0, 1003a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help) 1004a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.version = version 1005a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1006a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 1007a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson version = self.version 1008a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if version is None: 1009a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson version = parser.version 1010a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter = parser._get_formatter() 1011a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_text(version) 1012a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser.exit(message=formatter.format_help()) 1013a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1014a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1015a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _SubParsersAction(Action): 1016a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1017a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson class _ChoicesPseudoAction(Action): 1018a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1019a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, name, help): 1020a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson sup = super(_SubParsersAction._ChoicesPseudoAction, self) 1021a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson sup.__init__(option_strings=[], dest=name, help=help) 1022a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1023a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 1024a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings, 1025a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prog, 1026a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser_class, 1027a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=SUPPRESS, 1028a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=None, 1029a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=None): 1030a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1031a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._prog_prefix = prog 1032a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._parser_class = parser_class 1033a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._name_parser_map = {} 1034a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._choices_actions = [] 1035a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1036a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_SubParsersAction, self).__init__( 1037a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings=option_strings, 1038a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest=dest, 1039a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs=PARSER, 1040a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choices=self._name_parser_map, 1041a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=help, 1042a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson metavar=metavar) 1043a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1044a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_parser(self, name, **kwargs): 1045a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # set prog from the existing prefix 1046a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if kwargs.get('prog') is None: 1047a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs['prog'] = '%s %s' % (self._prog_prefix, name) 1048a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1049a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # create a pseudo-action to hold the choice help 1050a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if 'help' in kwargs: 1051a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help = kwargs.pop('help') 1052a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson choice_action = self._ChoicesPseudoAction(name, help) 1053a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._choices_actions.append(choice_action) 1054a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1055a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # create the parser and add it to the map 1056a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser = self._parser_class(**kwargs) 1057a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._name_parser_map[name] = parser 1058a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return parser 1059a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1060a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_subactions(self): 1061a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._choices_actions 1062a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1063a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, parser, namespace, values, option_string=None): 1064a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser_name = values[0] 1065a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings = values[1:] 1066a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1067a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # set the parser name if requested 1068a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self.dest is not SUPPRESS: 1069a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, self.dest, parser_name) 1070a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1071a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # select the parser 1072a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 1073a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser = self._name_parser_map[parser_name] 1074a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except KeyError: 1075a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = parser_name, ', '.join(self._name_parser_map) 1076a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('unknown parser %r (choices: %s)' % tup) 1077a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(self, msg) 1078a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1079a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # parse all the remaining options into the namespace 1080a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parser.parse_args(arg_strings, namespace) 1081a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1082a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1083a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# ============== 1084a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# Type classes 1085a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# ============== 1086a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1087a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass FileType(object): 1088a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Factory for creating file object types 1089a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1090a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Instances of FileType are typically passed as type= arguments to the 1091a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson ArgumentParser add_argument() method. 1092a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1093a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Keyword Arguments: 1094a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - mode -- A string indicating how the file is to be opened. Accepts the 1095a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson same values as the builtin open() function. 1096a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - bufsize -- The file's desired buffer size. Accepts the same values as 1097a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson the builtin open() function. 1098a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 1099a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1100a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, mode='r', bufsize=None): 1101a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._mode = mode 1102a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._bufsize = bufsize 1103a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1104a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __call__(self, string): 1105a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # the special argument "-" means sys.std{in,out} 1106a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if string == '-': 1107a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if 'r' in self._mode: 1108a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return _sys.stdin 1109a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif 'w' in self._mode: 1110a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return _sys.stdout 1111a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1112a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('argument "-" with mode %r' % self._mode) 1113a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError(msg) 1114a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1115a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # all other arguments are used as file names 1116a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self._bufsize: 1117a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return open(string, self._mode, self._bufsize) 1118a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1119a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return open(string, self._mode) 1120a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1121a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __repr__(self): 1122a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args = [self._mode, self._bufsize] 1123a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args_str = ', '.join([repr(arg) for arg in args if arg is not None]) 1124a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return '%s(%s)' % (type(self).__name__, args_str) 1125a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1126a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# =========================== 1127a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# Optional and Positional Parsing 1128a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson# =========================== 1129a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1130a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass Namespace(_AttributeHolder): 1131a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Simple object for storing attributes. 1132a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1133a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Implements equality by attribute names and values, and provides a simple 1134a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson string representation. 1135a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 1136a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1137a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, **kwargs): 1138a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for name in kwargs: 1139a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(self, name, kwargs[name]) 1140a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 11416b31fd0f13f5730b5a9b70be91a0edba3781e194Benjamin Peterson __hash__ = None 11426b31fd0f13f5730b5a9b70be91a0edba3781e194Benjamin Peterson 1143a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __eq__(self, other): 1144a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return vars(self) == vars(other) 1145a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1146a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __ne__(self, other): 1147a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return not (self == other) 1148a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1149a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __contains__(self, key): 1150a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return key in self.__dict__ 1151a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1152a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1153a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _ActionsContainer(object): 1154a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1155a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 1156a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson description, 1157a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prefix_chars, 1158a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson argument_default, 1159a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflict_handler): 1160a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_ActionsContainer, self).__init__() 1161a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1162a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.description = description 1163a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.argument_default = argument_default 1164a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.prefix_chars = prefix_chars 1165a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.conflict_handler = conflict_handler 1166a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1167a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # set up registries 1168a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._registries = {} 1169a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1170a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # register actions 1171a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', None, _StoreAction) 1172a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'store', _StoreAction) 1173a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'store_const', _StoreConstAction) 1174a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'store_true', _StoreTrueAction) 1175a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'store_false', _StoreFalseAction) 1176a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'append', _AppendAction) 1177a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'append_const', _AppendConstAction) 1178a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'count', _CountAction) 1179a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'help', _HelpAction) 1180a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'version', _VersionAction) 1181a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('action', 'parsers', _SubParsersAction) 1182a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1183a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # raise an exception if the conflict handler is invalid 1184a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._get_handler() 1185a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1186a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # action storage 1187a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._actions = [] 1188a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._option_string_actions = {} 1189a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1190a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # groups 1191a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._action_groups = [] 1192a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._mutually_exclusive_groups = [] 1193a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1194a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # defaults storage 1195a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._defaults = {} 1196a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1197a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # determines whether an "option" looks like a negative number 1198a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._negative_number_matcher = _re.compile(r'^-\d+$|^-\d*\.\d+$') 1199a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1200a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # whether or not there are any optionals that look like negative 1201a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # numbers -- uses a list so it can be shared and edited 1202a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._has_negative_number_optionals = [] 1203a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1204a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ==================== 1205a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Registration methods 1206a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ==================== 1207a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def register(self, registry_name, value, object): 1208a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson registry = self._registries.setdefault(registry_name, {}) 1209a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson registry[value] = object 1210a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1211a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _registry_get(self, registry_name, value, default=None): 1212a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._registries[registry_name].get(value, default) 1213a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1214a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ================================== 1215a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Namespace default accessor methods 1216a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ================================== 1217a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def set_defaults(self, **kwargs): 1218a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._defaults.update(kwargs) 1219a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1220a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if these defaults match any existing arguments, replace 1221a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # the previous default on the object with the new one 1222a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in self._actions: 1223a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.dest in kwargs: 1224a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action.default = kwargs[action.dest] 1225a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1226a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def get_default(self, dest): 1227a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in self._actions: 1228a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.dest == dest and action.default is not None: 1229a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action.default 1230a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._defaults.get(dest, None) 1231a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1232a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1233a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================= 1234a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Adding argument actions 1235a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================= 1236a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_argument(self, *args, **kwargs): 1237a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 1238a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson add_argument(dest, ..., name=value, ...) 1239a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson add_argument(option_string, option_string, ..., name=value, ...) 1240a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 1241a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1242a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if no positional args are supplied or only one is supplied and 1243a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # it doesn't look like an option string, parse a positional 1244a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # argument 1245a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson chars = self.prefix_chars 1246a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not args or len(args) == 1 and args[0][0] not in chars: 1247a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if args and 'dest' in kwargs: 1248a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError('dest supplied twice for positional argument') 1249a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs = self._get_positional_kwargs(*args, **kwargs) 1250a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1251a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # otherwise, we're adding an optional argument 1252a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1253a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs = self._get_optional_kwargs(*args, **kwargs) 1254a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1255a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if no default was supplied, use the parser-level default 1256a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if 'default' not in kwargs: 1257a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest = kwargs['dest'] 1258a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if dest in self._defaults: 1259a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs['default'] = self._defaults[dest] 1260a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif self.argument_default is not None: 1261a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs['default'] = self.argument_default 1262a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1263a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # create the action object, and add it to the parser 1264a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_class = self._pop_action_class(kwargs) 1265a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not _callable(action_class): 1266a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError('unknown action "%s"' % action_class) 1267a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = action_class(**kwargs) 1268a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1269a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # raise an error if the action type is not callable 1270a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type_func = self._registry_get('type', action.type, action.type) 1271a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not _callable(type_func): 1272a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError('%r is not callable' % type_func) 1273a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1274a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._add_action(action) 1275a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1276a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_argument_group(self, *args, **kwargs): 1277a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson group = _ArgumentGroup(self, *args, **kwargs) 1278a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._action_groups.append(group) 1279a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return group 1280a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1281a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_mutually_exclusive_group(self, **kwargs): 1282a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson group = _MutuallyExclusiveGroup(self, **kwargs) 1283a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._mutually_exclusive_groups.append(group) 1284a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return group 1285a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1286a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _add_action(self, action): 1287a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # resolve any conflicts 1288a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._check_conflict(action) 1289a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1290a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add to actions list 1291a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._actions.append(action) 1292a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action.container = self 1293a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1294a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # index the action by any option strings it has 1295a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string in action.option_strings: 1296a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._option_string_actions[option_string] = action 1297a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1298a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # set the flag if any option strings look like negative numbers 1299a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string in action.option_strings: 1300a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self._negative_number_matcher.match(option_string): 1301a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not self._has_negative_number_optionals: 1302a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._has_negative_number_optionals.append(True) 1303a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1304a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the created action 1305a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action 1306a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1307a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _remove_action(self, action): 1308a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._actions.remove(action) 1309a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1310a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _add_container_actions(self, container): 1311a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # collect groups by titles 1312a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson title_group_map = {} 1313a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for group in self._action_groups: 1314a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if group.title in title_group_map: 1315a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('cannot merge actions - two groups are named %r') 1316a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError(msg % (group.title)) 1317a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson title_group_map[group.title] = group 1318a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1319a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # map each action to its group 1320a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson group_map = {} 1321a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for group in container._action_groups: 1322a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1323a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if a group with the title exists, use that, otherwise 1324a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # create a new group matching the container's group 1325a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if group.title not in title_group_map: 1326a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson title_group_map[group.title] = self.add_argument_group( 1327a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson title=group.title, 1328a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson description=group.description, 1329a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflict_handler=group.conflict_handler) 1330a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1331a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # map the actions to their new group 1332a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in group._group_actions: 1333a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson group_map[action] = title_group_map[group.title] 1334a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1335a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add container's mutually exclusive groups 1336a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # NOTE: if add_mutually_exclusive_group ever gains title= and 1337a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # description= then this code will need to be expanded as above 1338a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for group in container._mutually_exclusive_groups: 1339a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson mutex_group = self.add_mutually_exclusive_group( 1340a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson required=group.required) 1341a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1342a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # map the actions to their new mutex group 1343a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in group._group_actions: 1344a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson group_map[action] = mutex_group 1345a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1346a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add all actions to this container or their group 1347a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in container._actions: 1348a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson group_map.get(action, self)._add_action(action) 1349a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1350a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_positional_kwargs(self, dest, **kwargs): 1351a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # make sure required is not specified 1352a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if 'required' in kwargs: 1353a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _("'required' is an invalid argument for positionals") 1354a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise TypeError(msg) 1355a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1356a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # mark positional arguments as required if at least one is 1357a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # always required 1358a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if kwargs.get('nargs') not in [OPTIONAL, ZERO_OR_MORE]: 1359a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs['required'] = True 1360a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if kwargs.get('nargs') == ZERO_OR_MORE and 'default' not in kwargs: 1361a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs['required'] = True 1362a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1363a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the keyword arguments with no option strings 1364a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return dict(kwargs, dest=dest, option_strings=[]) 1365a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1366a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_optional_kwargs(self, *args, **kwargs): 1367a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # determine short and long option strings 1368a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings = [] 1369a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson long_option_strings = [] 1370a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string in args: 1371a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # error on strings that don't start with an appropriate prefix 1372a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not option_string[0] in self.prefix_chars: 1373a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('invalid option string %r: ' 1374a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'must start with a character %r') 1375a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = option_string, self.prefix_chars 1376a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError(msg % tup) 1377a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1378a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # strings starting with two prefix characters are long options 1379a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_strings.append(option_string) 1380a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string[0] in self.prefix_chars: 1381a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if len(option_string) > 1: 1382a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string[1] in self.prefix_chars: 1383a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson long_option_strings.append(option_string) 1384a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1385a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # infer destination, '--foo-bar' -> 'foo_bar' and '-x' -> 'x' 1386a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest = kwargs.pop('dest', None) 1387a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if dest is None: 1388a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if long_option_strings: 1389a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest_option_string = long_option_strings[0] 1390a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1391a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest_option_string = option_strings[0] 1392a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest = dest_option_string.lstrip(self.prefix_chars) 1393a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not dest: 1394a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('dest= is required for options like %r') 1395a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError(msg % option_string) 1396a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson dest = dest.replace('-', '_') 1397a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1398a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the updated keyword arguments 1399a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return dict(kwargs, dest=dest, option_strings=option_strings) 1400a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1401a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _pop_action_class(self, kwargs, default=None): 1402a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = kwargs.pop('action', default) 1403a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._registry_get('action', action, action) 1404a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1405a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_handler(self): 1406a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # determine function from conflict handler string 1407a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson handler_func_name = '_handle_conflict_%s' % self.conflict_handler 1408a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 1409a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return getattr(self, handler_func_name) 1410a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except AttributeError: 1411a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('invalid conflict_resolution value: %r') 1412a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError(msg % self.conflict_handler) 1413a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1414a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _check_conflict(self, action): 1415a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1416a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # find all options that conflict with this option 1417a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson confl_optionals = [] 1418a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string in action.option_strings: 1419a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string in self._option_string_actions: 1420a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson confl_optional = self._option_string_actions[option_string] 1421a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson confl_optionals.append((option_string, confl_optional)) 1422a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1423a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # resolve any conflicts 1424a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if confl_optionals: 1425a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflict_handler = self._get_handler() 1426a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflict_handler(action, confl_optionals) 1427a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1428a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _handle_conflict_error(self, action, conflicting_actions): 1429a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson message = _('conflicting option string(s): %s') 1430a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflict_string = ', '.join([option_string 1431a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string, action 1432a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson in conflicting_actions]) 1433a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, message % conflict_string) 1434a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1435a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _handle_conflict_resolve(self, action, conflicting_actions): 1436a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1437a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # remove all conflicting options 1438a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string, action in conflicting_actions: 1439a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1440a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # remove the conflicting option 1441a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action.option_strings.remove(option_string) 1442a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._option_string_actions.pop(option_string, None) 1443a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1444a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the option now has no option string, remove it from the 1445a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # container holding it 1446a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not action.option_strings: 1447a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action.container._remove_action(action) 1448a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1449a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1450a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _ArgumentGroup(_ActionsContainer): 1451a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1452a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, container, title=None, description=None, **kwargs): 1453a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add any missing keyword arguments by checking the container 1454a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson update = kwargs.setdefault 1455a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson update('conflict_handler', container.conflict_handler) 1456a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson update('prefix_chars', container.prefix_chars) 1457a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson update('argument_default', container.argument_default) 1458a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super_init = super(_ArgumentGroup, self).__init__ 1459a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super_init(description=description, **kwargs) 1460a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1461a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # group attributes 1462a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.title = title 1463a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._group_actions = [] 1464a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1465a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # share most attributes with the container 1466a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._registries = container._registries 1467a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._actions = container._actions 1468a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._option_string_actions = container._option_string_actions 1469a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._defaults = container._defaults 1470a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._has_negative_number_optionals = \ 1471a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson container._has_negative_number_optionals 1472a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1473a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _add_action(self, action): 1474a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = super(_ArgumentGroup, self)._add_action(action) 1475a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._group_actions.append(action) 1476a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action 1477a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1478a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _remove_action(self, action): 1479a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_ArgumentGroup, self)._remove_action(action) 1480a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._group_actions.remove(action) 1481a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1482a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1483a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass _MutuallyExclusiveGroup(_ArgumentGroup): 1484a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1485a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, container, required=False): 1486a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson super(_MutuallyExclusiveGroup, self).__init__(container) 1487a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.required = required 1488a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._container = container 1489a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1490a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _add_action(self, action): 1491a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.required: 1492a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('mutually exclusive arguments must be optional') 1493a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ValueError(msg) 1494a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = self._container._add_action(action) 1495a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._group_actions.append(action) 1496a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action 1497a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1498a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _remove_action(self, action): 1499a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._container._remove_action(action) 1500a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._group_actions.remove(action) 1501a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1502a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1503a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Petersonclass ArgumentParser(_AttributeHolder, _ActionsContainer): 1504a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Object for parsing command line strings into Python objects. 1505a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1506a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Keyword Arguments: 1507a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - prog -- The name of the program (default: sys.argv[0]) 1508a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - usage -- A usage message (default: auto-generated from arguments) 1509a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - description -- A description of what the program does 1510a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - epilog -- Text following the argument descriptions 1511a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - parents -- Parsers whose arguments should be copied into this one 1512a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - formatter_class -- HelpFormatter class for printing help messages 1513a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - prefix_chars -- Characters that prefix optional arguments 1514a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - fromfile_prefix_chars -- Characters that prefix files containing 1515a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson additional arguments 1516a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - argument_default -- The default value for all arguments 1517a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - conflict_handler -- String indicating how to handle conflicts 1518a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson - add_help -- Add a -h/-help option 1519a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 1520a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1521a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def __init__(self, 1522a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prog=None, 1523a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson usage=None, 1524a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson description=None, 1525a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson epilog=None, 1526a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson version=None, 1527a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parents=[], 1528a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter_class=HelpFormatter, 1529a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prefix_chars='-', 1530a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson fromfile_prefix_chars=None, 1531a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson argument_default=None, 1532a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflict_handler='error', 1533a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson add_help=True): 1534a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1535a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if version is not None: 1536a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson import warnings 1537a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson warnings.warn( 1538a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """The "version" argument to ArgumentParser is deprecated. """ 1539a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """Please use """ 1540a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """"add_argument(..., action='version', version="N", ...)" """ 1541a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """instead""", DeprecationWarning) 1542a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1543a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson superinit = super(ArgumentParser, self).__init__ 1544a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson superinit(description=description, 1545a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prefix_chars=prefix_chars, 1546a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson argument_default=argument_default, 1547a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflict_handler=conflict_handler) 1548a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1549a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # default setting for prog 1550a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if prog is None: 1551a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson prog = _os.path.basename(_sys.argv[0]) 1552a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1553a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.prog = prog 1554a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.usage = usage 1555a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.epilog = epilog 1556a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.version = version 1557a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.formatter_class = formatter_class 1558a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.fromfile_prefix_chars = fromfile_prefix_chars 1559a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.add_help = add_help 1560a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1561a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson add_group = self.add_argument_group 1562a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._positionals = add_group(_('positional arguments')) 1563a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._optionals = add_group(_('optional arguments')) 1564a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._subparsers = None 1565a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1566a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # register types 1567a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def identity(string): 1568a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return string 1569a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.register('type', None, identity) 1570a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1571a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add help and version arguments if necessary 1572a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # (using explicit default to override global argument_default) 15731cbf78e040b1ddfe7a1520d21ea34e1098848713R. David Murray default_prefix = '-' if '-' in prefix_chars else prefix_chars[0] 1574a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self.add_help: 1575a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.add_argument( 15761cbf78e040b1ddfe7a1520d21ea34e1098848713R. David Murray default_prefix+'h', default_prefix*2+'help', 15771cbf78e040b1ddfe7a1520d21ea34e1098848713R. David Murray action='help', default=SUPPRESS, 1578a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=_('show this help message and exit')) 1579a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self.version: 1580a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.add_argument( 15811cbf78e040b1ddfe7a1520d21ea34e1098848713R. David Murray default_prefix+'v', default_prefix*2+'version', 15821cbf78e040b1ddfe7a1520d21ea34e1098848713R. David Murray action='version', default=SUPPRESS, 1583a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson version=self.version, 1584a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson help=_("show program's version number and exit")) 1585a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1586a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add parent arguments and defaults 1587a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for parent in parents: 1588a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._add_container_actions(parent) 1589a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 1590a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson defaults = parent._defaults 1591a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except AttributeError: 1592a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson pass 1593a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1594a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._defaults.update(defaults) 1595a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1596a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================= 1597a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Pretty __repr__ methods 1598a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================= 1599a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_kwargs(self): 1600a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson names = [ 1601a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'prog', 1602a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'usage', 1603a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'description', 1604a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'version', 1605a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'formatter_class', 1606a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'conflict_handler', 1607a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'add_help', 1608a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson ] 1609a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return [(name, getattr(self, name)) for name in names] 1610a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1611a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ================================== 1612a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Optional/Positional adding methods 1613a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ================================== 1614a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def add_subparsers(self, **kwargs): 1615a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self._subparsers is not None: 1616a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(_('cannot have multiple subparser arguments')) 1617a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1618a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add the parser class to the arguments if it's not present 1619a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs.setdefault('parser_class', type(self)) 1620a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1621a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if 'title' in kwargs or 'description' in kwargs: 1622a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson title = _(kwargs.pop('title', 'subcommands')) 1623a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson description = _(kwargs.pop('description', None)) 1624a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._subparsers = self.add_argument_group(title, description) 1625a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1626a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._subparsers = self._positionals 1627a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1628a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # prog defaults to the usage message of this parser, skipping 1629a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # optional arguments and with no "usage:" prefix 1630a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if kwargs.get('prog') is None: 1631a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter = self._get_formatter() 1632a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson positionals = self._get_positional_actions() 1633a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson groups = self._mutually_exclusive_groups 1634a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_usage(self.usage, positionals, groups, '') 1635a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson kwargs['prog'] = formatter.format_help().strip() 1636a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1637a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # create the parsers action and add it to the positionals list 1638a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson parsers_class = self._pop_action_class(kwargs, 'parsers') 1639a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = parsers_class(option_strings=[], **kwargs) 1640a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._subparsers._add_action(action) 1641a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1642a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the created parsers action 1643a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action 1644a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1645a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _add_action(self, action): 1646a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.option_strings: 1647a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._optionals._add_action(action) 1648a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1649a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._positionals._add_action(action) 1650a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action 1651a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1652a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_optional_actions(self): 1653a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return [action 1654a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in self._actions 1655a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.option_strings] 1656a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1657a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_positional_actions(self): 1658a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return [action 1659a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in self._actions 1660a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not action.option_strings] 1661a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1662a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ===================================== 1663a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Command line argument parsing methods 1664a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ===================================== 1665a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def parse_args(self, args=None, namespace=None): 1666a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args, argv = self.parse_known_args(args, namespace) 1667a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if argv: 1668a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('unrecognized arguments: %s') 1669a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(msg % ' '.join(argv)) 1670a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return args 1671a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1672a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def parse_known_args(self, args=None, namespace=None): 1673a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # args default to the system args 1674a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if args is None: 1675a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args = _sys.argv[1:] 1676a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1677a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # default Namespace built from parser defaults 1678a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if namespace is None: 1679a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson namespace = Namespace() 1680a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1681a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add any action defaults that aren't present 1682a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in self._actions: 1683a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.dest is not SUPPRESS: 1684a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not hasattr(namespace, action.dest): 1685a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.default is not SUPPRESS: 1686a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default = action.default 16870e717addd8a03ed10231a578fce894c07ddb157eBenjamin Peterson if isinstance(action.default, basestring): 1688a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default = self._get_value(action, default) 1689a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, action.dest, default) 1690a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1691a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add any parser defaults that aren't present 1692a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for dest in self._defaults: 1693a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not hasattr(namespace, dest): 1694a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson setattr(namespace, dest, self._defaults[dest]) 1695a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1696a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # parse the arguments and exit if there are any errors 1697a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 1698a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self._parse_known_args(args, namespace) 1699a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except ArgumentError: 1700a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson err = _sys.exc_info()[1] 1701a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(str(err)) 1702a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1703a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _parse_known_args(self, arg_strings, namespace): 1704a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # replace arg strings that are file references 1705a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self.fromfile_prefix_chars is not None: 1706a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings = self._read_args_from_files(arg_strings) 1707a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1708a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # map all mutually exclusive arguments to the other arguments 1709a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # they can't occur with 1710a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_conflicts = {} 1711a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for mutex_group in self._mutually_exclusive_groups: 1712a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson group_actions = mutex_group._group_actions 1713a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for i, mutex_action in enumerate(mutex_group._group_actions): 1714a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflicts = action_conflicts.setdefault(mutex_action, []) 1715a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflicts.extend(group_actions[:i]) 1716a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson conflicts.extend(group_actions[i + 1:]) 1717a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1718a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # find all option indices, and determine the arg_string_pattern 1719a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # which has an 'O' if there is an option at an index, 1720a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # an 'A' if there is an argument, or a '-' if there is a '--' 1721a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_string_indices = {} 1722a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_string_pattern_parts = [] 1723a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings_iter = iter(arg_strings) 1724a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for i, arg_string in enumerate(arg_strings_iter): 1725a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1726a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # all args after -- are non-options 1727a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if arg_string == '--': 1728a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_string_pattern_parts.append('-') 1729a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for arg_string in arg_strings_iter: 1730a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_string_pattern_parts.append('A') 1731a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1732a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # otherwise, add the arg to the arg strings 1733a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # and note the index if it was an option 1734a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1735a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_tuple = self._parse_optional(arg_string) 1736a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_tuple is None: 1737a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson pattern = 'A' 1738a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1739a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_string_indices[i] = option_tuple 1740a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson pattern = 'O' 1741a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_string_pattern_parts.append(pattern) 1742a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1743a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # join the pieces together to form the pattern 1744a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings_pattern = ''.join(arg_string_pattern_parts) 1745a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1746a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # converts arg strings to the appropriate and then takes the action 17470e717addd8a03ed10231a578fce894c07ddb157eBenjamin Peterson seen_actions = set() 17480e717addd8a03ed10231a578fce894c07ddb157eBenjamin Peterson seen_non_default_actions = set() 1749a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1750a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def take_action(action, argument_strings, option_string=None): 1751a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson seen_actions.add(action) 1752a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson argument_values = self._get_values(action, argument_strings) 1753a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1754a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # error if this argument is not allowed with other previously 1755a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # seen arguments, assuming that actions that use the default 1756a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # value don't really count as "present" 1757a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if argument_values is not action.default: 1758a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson seen_non_default_actions.add(action) 1759a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for conflict_action in action_conflicts.get(action, []): 1760a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if conflict_action in seen_non_default_actions: 1761a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('not allowed with argument %s') 1762a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_name = _get_action_name(conflict_action) 1763a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, msg % action_name) 1764a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1765a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # take the action if we didn't receive a SUPPRESS value 1766a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # (e.g. from a default) 1767a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if argument_values is not SUPPRESS: 1768a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action(self, namespace, argument_values, option_string) 1769a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1770a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # function to convert arg_strings into an optional action 1771a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def consume_optional(start_index): 1772a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1773a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # get the optional identified at this index 1774a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_tuple = option_string_indices[start_index] 1775a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action, option_string, explicit_arg = option_tuple 1776a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1777a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # identify additional optionals in the same arg string 1778a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # (e.g. -xyz is the same as -x -y -z if no args are required) 1779a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson match_argument = self._match_argument 1780a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_tuples = [] 1781a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson while True: 1782a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1783a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if we found no optional action, skip it 1784a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action is None: 1785a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson extras.append(arg_strings[start_index]) 1786a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return start_index + 1 1787a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1788a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if there is an explicit argument, try to match the 1789a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # optional's string arguments to only this 1790a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if explicit_arg is not None: 1791a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_count = match_argument(action, 'A') 1792a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1793a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the action is a single-dash option and takes no 1794a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # arguments, try to parse more single-dash options out 1795a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # of the tail of the option string 1796a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson chars = self.prefix_chars 1797a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if arg_count == 0 and option_string[1] not in chars: 1798a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_tuples.append((action, [], option_string)) 1799a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for char in self.prefix_chars: 1800a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_string = char + explicit_arg[0] 1801a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson explicit_arg = explicit_arg[1:] or None 1802a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson optionals_map = self._option_string_actions 1803a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string in optionals_map: 1804a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = optionals_map[option_string] 1805a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson break 1806a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1807a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('ignored explicit argument %r') 1808a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, msg % explicit_arg) 1809a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1810a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the action expect exactly one argument, we've 1811a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # successfully matched the option; exit the loop 1812a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif arg_count == 1: 1813a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson stop = start_index + 1 1814a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args = [explicit_arg] 1815a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_tuples.append((action, args, option_string)) 1816a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson break 1817a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1818a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # error if a double-dash option did not use the 1819a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # explicit argument 1820a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1821a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('ignored explicit argument %r') 1822a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, msg % explicit_arg) 1823a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1824a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if there is no explicit argument, try to match the 1825a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # optional's string arguments with the following strings 1826a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if successful, exit the loop 1827a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1828a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson start = start_index + 1 1829a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson selected_patterns = arg_strings_pattern[start:] 1830a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_count = match_argument(action, selected_patterns) 1831a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson stop = start + arg_count 1832a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args = arg_strings[start:stop] 1833a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action_tuples.append((action, args, option_string)) 1834a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson break 1835a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1836a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # add the Optional to the list and return the index at which 1837a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # the Optional's string args stopped 1838a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson assert action_tuples 1839a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action, args, option_string in action_tuples: 1840a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson take_action(action, args, option_string) 1841a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return stop 1842a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1843a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # the list of Positionals left to be parsed; this is modified 1844a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # by consume_positionals() 1845a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson positionals = self._get_positional_actions() 1846a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1847a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # function to convert arg_strings into positional actions 1848a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def consume_positionals(start_index): 1849a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # match as many Positionals as possible 1850a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson match_partial = self._match_arguments_partial 1851a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson selected_pattern = arg_strings_pattern[start_index:] 1852a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_counts = match_partial(positionals, selected_pattern) 1853a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1854a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # slice off the appropriate arg strings for each Positional 1855a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # and add the Positional and its args to the list 1856a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action, arg_count in zip(positionals, arg_counts): 1857a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args = arg_strings[start_index: start_index + arg_count] 1858a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson start_index += arg_count 1859a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson take_action(action, args) 1860a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1861a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # slice off the Positionals that we just parsed and return the 1862a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # index at which the Positionals' string args stopped 1863a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson positionals[:] = positionals[len(arg_counts):] 1864a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return start_index 1865a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1866a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # consume Positionals and Optionals alternately, until we have 1867a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # passed the last option string 1868a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson extras = [] 1869a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson start_index = 0 1870a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string_indices: 1871a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson max_option_string_index = max(option_string_indices) 1872a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1873a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson max_option_string_index = -1 1874a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson while start_index <= max_option_string_index: 1875a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1876a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # consume any Positionals preceding the next option 1877a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson next_option_string_index = min([ 1878a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson index 1879a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for index in option_string_indices 1880a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if index >= start_index]) 1881a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if start_index != next_option_string_index: 1882a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson positionals_end_index = consume_positionals(start_index) 1883a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1884a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # only try to parse the next optional if we didn't consume 1885a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # the option string during the positionals parsing 1886a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if positionals_end_index > start_index: 1887a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson start_index = positionals_end_index 1888a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson continue 1889a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1890a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson start_index = positionals_end_index 1891a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1892a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if we consumed all the positionals we could and we're not 1893a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # at the index of an option string, there were extra arguments 1894a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if start_index not in option_string_indices: 1895a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson strings = arg_strings[start_index:next_option_string_index] 1896a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson extras.extend(strings) 1897a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson start_index = next_option_string_index 1898a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1899a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # consume the next optional and any arguments for it 1900a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson start_index = consume_optional(start_index) 1901a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1902a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # consume any positionals following the last Optional 1903a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson stop_index = consume_positionals(start_index) 1904a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1905a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if we didn't consume all the argument strings, there were extras 1906a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson extras.extend(arg_strings[stop_index:]) 1907a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1908a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if we didn't use all the Positional objects, there were too few 1909a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # arg strings supplied. 1910a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if positionals: 1911a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(_('too few arguments')) 1912a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1913a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # make sure all required actions were present 1914a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in self._actions: 1915a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.required: 1916a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action not in seen_actions: 1917a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson name = _get_action_name(action) 1918a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(_('argument %s is required') % name) 1919a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1920a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # make sure all required groups had one option present 1921a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for group in self._mutually_exclusive_groups: 1922a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if group.required: 1923a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in group._group_actions: 1924a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action in seen_non_default_actions: 1925a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson break 1926a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1927a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if no actions were used, report the error 1928a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1929a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson names = [_get_action_name(action) 1930a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in group._group_actions 1931a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.help is not SUPPRESS] 1932a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('one of the arguments %s is required') 1933a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(msg % ' '.join(names)) 1934a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1935a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the updated namespace and the extra arguments 1936a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return namespace, extras 1937a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1938a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _read_args_from_files(self, arg_strings): 1939a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # expand arguments referencing files 1940a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson new_arg_strings = [] 1941a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for arg_string in arg_strings: 1942a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1943a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # for regular arguments, just add them back into the list 1944a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if arg_string[0] not in self.fromfile_prefix_chars: 1945a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson new_arg_strings.append(arg_string) 1946a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1947a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # replace arguments referencing files with the file content 1948a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 1949a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 1950a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args_file = open(arg_string[1:]) 1951a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 1952a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings = [] 1953a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for arg_line in args_file.read().splitlines(): 1954a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for arg in self.convert_arg_line_to_args(arg_line): 1955a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings.append(arg) 1956a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings = self._read_args_from_files(arg_strings) 1957a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson new_arg_strings.extend(arg_strings) 1958a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson finally: 1959a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson args_file.close() 1960a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except IOError: 1961a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson err = _sys.exc_info()[1] 1962a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(str(err)) 1963a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1964a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the modified argument list 1965a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return new_arg_strings 1966a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1967a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def convert_arg_line_to_args(self, arg_line): 1968a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return [arg_line] 1969a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1970a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _match_argument(self, action, arg_strings_pattern): 1971a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # match the pattern for this action to the arg strings 1972a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = self._get_nargs_pattern(action) 1973a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson match = _re.match(nargs_pattern, arg_strings_pattern) 1974a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1975a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # raise an exception if we weren't able to find a match 1976a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if match is None: 1977a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_errors = { 1978a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson None: _('expected one argument'), 1979a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson OPTIONAL: _('expected at most one argument'), 1980a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson ONE_OR_MORE: _('expected at least one argument'), 1981a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson } 1982a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson default = _('expected %s argument(s)') % action.nargs 1983a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = nargs_errors.get(action.nargs, default) 1984a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, msg) 1985a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1986a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the number of arguments matched 1987a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return len(match.group(1)) 1988a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 1989a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _match_arguments_partial(self, actions, arg_strings_pattern): 1990a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # progressively shorten the actions list by slicing off the 1991a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # final actions until we find a match 1992a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = [] 1993a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for i in range(len(actions), 0, -1): 1994a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson actions_slice = actions[:i] 1995a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson pattern = ''.join([self._get_nargs_pattern(action) 1996a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action in actions_slice]) 1997a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson match = _re.match(pattern, arg_strings_pattern) 1998a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if match is not None: 1999a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result.extend([len(string) for string in match.groups()]) 2000a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson break 2001a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2002a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the list of arg string counts 2003a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return result 2004a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2005a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _parse_optional(self, arg_string): 2006a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if it's an empty string, it was meant to be a positional 2007a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not arg_string: 2008a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return None 2009a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2010a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if it doesn't start with a prefix, it was meant to be positional 2011a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not arg_string[0] in self.prefix_chars: 2012a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return None 2013a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2014a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the option string is present in the parser, return the action 2015a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if arg_string in self._option_string_actions: 2016a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = self._option_string_actions[arg_string] 2017a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action, arg_string, None 2018a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2019a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if it's just a single character, it was meant to be positional 2020a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if len(arg_string) == 1: 2021a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return None 2022a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2023a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if the option string before the "=" is present, return the action 2024a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if '=' in arg_string: 2025a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_string, explicit_arg = arg_string.split('=', 1) 2026a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string in self._option_string_actions: 2027a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = self._option_string_actions[option_string] 2028a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return action, option_string, explicit_arg 2029a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2030a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # search through all possible prefixes of the option string 2031a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # and all actions in the parser for possible interpretations 2032a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_tuples = self._get_option_tuples(arg_string) 2033a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2034a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if multiple actions match, the option string was ambiguous 2035a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if len(option_tuples) > 1: 2036a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson options = ', '.join([option_string 2037a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action, option_string, explicit_arg in option_tuples]) 2038a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = arg_string, options 2039a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(_('ambiguous option: %s could match %s') % tup) 2040a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2041a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if exactly one action matched, this segmentation is good, 2042a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # so return the parsed action 2043a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif len(option_tuples) == 1: 2044a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_tuple, = option_tuples 2045a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return option_tuple 2046a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2047a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if it was not found as an option, but it looks like a negative 2048a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # number, it was meant to be positional 2049a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # unless there are negative-number-like options 2050a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if self._negative_number_matcher.match(arg_string): 2051a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not self._has_negative_number_optionals: 2052a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return None 2053a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2054a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if it contains a space, it was meant to be a positional 2055a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if ' ' in arg_string: 2056a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return None 2057a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2058a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # it was meant to be an optional but there is no such option 2059a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # in this parser (though it might be a valid option in a subparser) 2060a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return None, arg_string, None 2061a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2062a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_option_tuples(self, option_string): 2063a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = [] 2064a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2065a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # option strings starting with two prefix characters are only 2066a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # split at the '=' 2067a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson chars = self.prefix_chars 2068a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string[0] in chars and option_string[1] in chars: 2069a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if '=' in option_string: 2070a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_prefix, explicit_arg = option_string.split('=', 1) 2071a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 2072a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_prefix = option_string 2073a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson explicit_arg = None 2074a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string in self._option_string_actions: 2075a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string.startswith(option_prefix): 2076a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = self._option_string_actions[option_string] 2077a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = action, option_string, explicit_arg 2078a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result.append(tup) 2079a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2080a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # single character options can be concatenated with their arguments 2081a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # but multiple character options always have to have their argument 2082a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # separate 2083a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif option_string[0] in chars and option_string[1] not in chars: 2084a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson option_prefix = option_string 2085a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson explicit_arg = None 2086a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson short_option_prefix = option_string[:2] 2087a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson short_explicit_arg = option_string[2:] 2088a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2089a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for option_string in self._option_string_actions: 2090a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if option_string == short_option_prefix: 2091a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = self._option_string_actions[option_string] 2092a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = action, option_string, short_explicit_arg 2093a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result.append(tup) 2094a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif option_string.startswith(option_prefix): 2095a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson action = self._option_string_actions[option_string] 2096a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = action, option_string, explicit_arg 2097a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result.append(tup) 2098a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2099a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # shouldn't ever get here 2100a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 2101a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.error(_('unexpected option string: %s') % option_string) 2102a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2103a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the collected option tuples 2104a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return result 2105a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2106a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_nargs_pattern(self, action): 2107a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # in all examples below, we have to allow for '--' args 2108a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # which are represented as '-' in the pattern 2109a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs = action.nargs 2110a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2111a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # the default (None) is assumed to be a single argument 2112a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if nargs is None: 2113a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = '(-*A-*)' 2114a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2115a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # allow zero or one arguments 2116a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif nargs == OPTIONAL: 2117a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = '(-*A?-*)' 2118a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2119a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # allow zero or more arguments 2120a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif nargs == ZERO_OR_MORE: 2121a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = '(-*[A-]*)' 2122a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2123a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # allow one or more arguments 2124a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif nargs == ONE_OR_MORE: 2125a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = '(-*A[A-]*)' 2126a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2127a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # allow any number of options or arguments 2128a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif nargs == REMAINDER: 2129a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = '([-AO]*)' 2130a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2131a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # allow one argument followed by any number of options or arguments 2132a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif nargs == PARSER: 2133a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = '(-*A[-AO]*)' 2134a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2135a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # all others should be integers 2136a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 2137a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs) 2138a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2139a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # if this is an optional action, -- is not allowed 2140a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.option_strings: 2141a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = nargs_pattern.replace('-*', '') 2142a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson nargs_pattern = nargs_pattern.replace('-', '') 2143a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2144a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the pattern 2145a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return nargs_pattern 2146a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2147a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================== 2148a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Value conversion methods 2149a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================== 2150a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_values(self, action, arg_strings): 2151a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # for everything but PARSER args, strip out '--' 2152a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.nargs not in [PARSER, REMAINDER]: 2153a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_strings = [s for s in arg_strings if s != '--'] 2154a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2155a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # optional argument produces a default when not present 2156a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not arg_strings and action.nargs == OPTIONAL: 2157a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.option_strings: 2158a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = action.const 2159a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 2160a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = action.default 21610e717addd8a03ed10231a578fce894c07ddb157eBenjamin Peterson if isinstance(value, basestring): 2162a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = self._get_value(action, value) 2163a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._check_value(action, value) 2164a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2165a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # when nargs='*' on a positional, if there were no command-line 2166a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # args, use the default if it is anything other than None 2167a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif (not arg_strings and action.nargs == ZERO_OR_MORE and 2168a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson not action.option_strings): 2169a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.default is not None: 2170a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = action.default 2171a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 2172a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = arg_strings 2173a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._check_value(action, value) 2174a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2175a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # single argument or optional argument produces a single value 2176a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif len(arg_strings) == 1 and action.nargs in [None, OPTIONAL]: 2177a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson arg_string, = arg_strings 2178a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = self._get_value(action, arg_string) 2179a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._check_value(action, value) 2180a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2181a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # REMAINDER arguments convert all values, checking none 2182a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif action.nargs == REMAINDER: 2183a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = [self._get_value(action, v) for v in arg_strings] 2184a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2185a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # PARSER arguments convert all values, but check only the first 2186a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson elif action.nargs == PARSER: 2187a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = [self._get_value(action, v) for v in arg_strings] 2188a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._check_value(action, value[0]) 2189a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2190a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # all other types of nargs produce a list 2191a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson else: 2192a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson value = [self._get_value(action, v) for v in arg_strings] 2193a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for v in value: 2194a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._check_value(action, v) 2195a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2196a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the converted value 2197a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return value 2198a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2199a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_value(self, action, arg_string): 2200a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson type_func = self._registry_get('type', action.type, action.type) 2201a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if not _callable(type_func): 2202a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('%r is not callable') 2203a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, msg % type_func) 2204a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2205a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # convert the value to the appropriate type 2206a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson try: 2207a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson result = type_func(arg_string) 2208a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2209a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ArgumentTypeErrors indicate errors 2210a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except ArgumentTypeError: 2211a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson name = getattr(action.type, '__name__', repr(action.type)) 2212a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = str(_sys.exc_info()[1]) 2213a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, msg) 2214a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2215a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # TypeErrors or ValueErrors also indicate errors 2216a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson except (TypeError, ValueError): 2217a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson name = getattr(action.type, '__name__', repr(action.type)) 2218a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('invalid %s value: %r') 2219a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, msg % (name, arg_string)) 2220a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2221a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # return the converted value 2222a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return result 2223a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2224a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _check_value(self, action, value): 2225a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # converted value must be one of the choices (if specified) 2226a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if action.choices is not None and value not in action.choices: 2227a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson tup = value, ', '.join(map(repr, action.choices)) 2228a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson msg = _('invalid choice: %r (choose from %s)') % tup 2229a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson raise ArgumentError(action, msg) 2230a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2231a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================= 2232a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Help-formatting methods 2233a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ======================= 2234a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def format_usage(self): 2235a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter = self._get_formatter() 2236a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_usage(self.usage, self._actions, 2237a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._mutually_exclusive_groups) 2238a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return formatter.format_help() 2239a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2240a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def format_help(self): 2241a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter = self._get_formatter() 2242a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2243a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # usage 2244a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_usage(self.usage, self._actions, 2245a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._mutually_exclusive_groups) 2246a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2247a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # description 2248a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_text(self.description) 2249a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2250a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # positionals, optionals and user-defined groups 2251a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson for action_group in self._action_groups: 2252a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.start_section(action_group.title) 2253a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_text(action_group.description) 2254a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_arguments(action_group._group_actions) 2255a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.end_section() 2256a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2257a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # epilog 2258a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_text(self.epilog) 2259a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2260a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # determine help from format above 2261a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return formatter.format_help() 2262a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2263a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def format_version(self): 2264a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson import warnings 2265a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson warnings.warn( 2266a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'The format_version method is deprecated -- the "version" ' 2267a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'argument to ArgumentParser is no longer supported.', 2268a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson DeprecationWarning) 2269a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter = self._get_formatter() 2270a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson formatter.add_text(self.version) 2271a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return formatter.format_help() 2272a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2273a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _get_formatter(self): 2274a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson return self.formatter_class(prog=self.prog) 2275a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2276a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ===================== 2277a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Help-printing methods 2278a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # ===================== 2279a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def print_usage(self, file=None): 2280a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if file is None: 2281a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson file = _sys.stdout 2282a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._print_message(self.format_usage(), file) 2283a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2284a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def print_help(self, file=None): 2285a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if file is None: 2286a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson file = _sys.stdout 2287a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._print_message(self.format_help(), file) 2288a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2289a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def print_version(self, file=None): 2290a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson import warnings 2291a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson warnings.warn( 2292a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'The print_version method is deprecated -- the "version" ' 2293a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 'argument to ArgumentParser is no longer supported.', 2294a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson DeprecationWarning) 2295a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._print_message(self.format_version(), file) 2296a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2297a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def _print_message(self, message, file=None): 2298a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if message: 2299a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if file is None: 2300a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson file = _sys.stderr 2301a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson file.write(message) 2302a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2303a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # =============== 2304a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # Exiting methods 2305a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson # =============== 2306a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def exit(self, status=0, message=None): 2307a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson if message: 2308a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self._print_message(message, _sys.stderr) 2309a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson _sys.exit(status) 2310a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2311a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson def error(self, message): 2312a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """error(message: string) 2313a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2314a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson Prints a usage message incorporating the message to stderr and 2315a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson exits. 2316a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson 2317a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson If you override this in a subclass, it should not return -- it 2318a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson should either exit or raise an exception. 2319a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson """ 2320a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.print_usage(_sys.stderr) 2321a39e966e97af0ca8cf395a2ab8a02555ebe684c7Benjamin Peterson self.exit(2, _('%s: error: %s\n') % (self.prog, message)) 2322