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