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