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