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