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