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