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