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