annotate Lib/argparse.py @ 87690:66c1c9f32567 default tip

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