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