blob: d97a1f7aca30534ea02f628de448ec354a914798 [file] [log] [blame]
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001"""A powerful, extensible, and easy-to-use option parser.
Guido van Rossumb9ba4582002-11-14 22:00:19 +00002
3By Greg Ward <gward@python.net>
4
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00005Originally distributed as Optik.
Greg Ward2492fcf2003-04-21 02:40:34 +00006
7For support, use the optik-users@lists.sourceforge.net mailing list
8(http://lists.sourceforge.net/lists/listinfo/optik-users).
Georg Brandlf3532df2009-04-27 16:41:41 +00009
10Simple usage example:
11
12 from optparse import OptionParser
13
14 parser = OptionParser()
15 parser.add_option("-f", "--file", dest="filename",
16 help="write report to FILE", metavar="FILE")
17 parser.add_option("-q", "--quiet",
18 action="store_false", dest="verbose", default=True,
19 help="don't print status messages to stdout")
20
21 (options, args) = parser.parse_args()
Guido van Rossumb9ba4582002-11-14 22:00:19 +000022"""
23
Thomas Wouters0e3f5912006-08-11 14:57:12 +000024__version__ = "1.5.3"
Greg Ward2492fcf2003-04-21 02:40:34 +000025
Greg Ward4656ed42003-05-08 01:38:52 +000026__all__ = ['Option',
Benjamin Petersond23f8222009-04-05 19:13:16 +000027 'make_option',
Greg Ward4656ed42003-05-08 01:38:52 +000028 'SUPPRESS_HELP',
29 'SUPPRESS_USAGE',
Greg Ward4656ed42003-05-08 01:38:52 +000030 'Values',
31 'OptionContainer',
32 'OptionGroup',
33 'OptionParser',
34 'HelpFormatter',
35 'IndentedHelpFormatter',
36 'TitledHelpFormatter',
37 'OptParseError',
38 'OptionError',
39 'OptionConflictError',
40 'OptionValueError',
41 'BadOptionError']
Greg Ward2492fcf2003-04-21 02:40:34 +000042
Guido van Rossumb9ba4582002-11-14 22:00:19 +000043__copyright__ = """
Thomas Wouters477c8d52006-05-27 19:21:47 +000044Copyright (c) 2001-2006 Gregory P. Ward. All rights reserved.
45Copyright (c) 2002-2006 Python Software Foundation. All rights reserved.
Guido van Rossumb9ba4582002-11-14 22:00:19 +000046
47Redistribution and use in source and binary forms, with or without
48modification, are permitted provided that the following conditions are
49met:
50
51 * Redistributions of source code must retain the above copyright
52 notice, this list of conditions and the following disclaimer.
53
54 * Redistributions in binary form must reproduce the above copyright
55 notice, this list of conditions and the following disclaimer in the
56 documentation and/or other materials provided with the distribution.
57
58 * Neither the name of the author nor the names of its
59 contributors may be used to endorse or promote products derived from
60 this software without specific prior written permission.
61
62THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
63IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
64TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
65PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
66CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
67EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
68PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
69PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
70LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
71NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
72SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
73"""
74
75import sys, os
Guido van Rossumb9ba4582002-11-14 22:00:19 +000076import textwrap
Greg Wardeba20e62004-07-31 16:15:44 +000077
78def _repr(self):
79 return "<%s at 0x%x: %s>" % (self.__class__.__name__, id(self), self)
80
81
82# This file was generated from:
Thomas Wouters0e3f5912006-08-11 14:57:12 +000083# Id: option_parser.py 527 2006-07-23 15:21:30Z greg
84# Id: option.py 522 2006-06-11 16:22:03Z gward
85# Id: help.py 527 2006-07-23 15:21:30Z greg
Thomas Wouters477c8d52006-05-27 19:21:47 +000086# Id: errors.py 509 2006-04-20 00:58:24Z gward
87
88try:
89 from gettext import gettext
90except ImportError:
91 def gettext(message):
92 return message
93_ = gettext
94
Guido van Rossumb9ba4582002-11-14 22:00:19 +000095
Guido van Rossumb9ba4582002-11-14 22:00:19 +000096class OptParseError (Exception):
Greg Wardeba20e62004-07-31 16:15:44 +000097 def __init__(self, msg):
Guido van Rossumb9ba4582002-11-14 22:00:19 +000098 self.msg = msg
99
Greg Wardeba20e62004-07-31 16:15:44 +0000100 def __str__(self):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000101 return self.msg
102
Greg Ward2492fcf2003-04-21 02:40:34 +0000103
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000104class OptionError (OptParseError):
105 """
106 Raised if an Option instance is created with invalid or
107 inconsistent arguments.
108 """
109
Greg Wardeba20e62004-07-31 16:15:44 +0000110 def __init__(self, msg, option):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000111 self.msg = msg
112 self.option_id = str(option)
113
Greg Wardeba20e62004-07-31 16:15:44 +0000114 def __str__(self):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000115 if self.option_id:
116 return "option %s: %s" % (self.option_id, self.msg)
117 else:
118 return self.msg
119
120class OptionConflictError (OptionError):
121 """
122 Raised if conflicting options are added to an OptionParser.
123 """
124
125class OptionValueError (OptParseError):
126 """
127 Raised if an invalid option value is encountered on the command
128 line.
129 """
130
131class BadOptionError (OptParseError):
132 """
Thomas Wouters477c8d52006-05-27 19:21:47 +0000133 Raised if an invalid option is seen on the command line.
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000134 """
Thomas Wouters477c8d52006-05-27 19:21:47 +0000135 def __init__(self, opt_str):
136 self.opt_str = opt_str
137
138 def __str__(self):
139 return _("no such option: %s") % self.opt_str
140
141class AmbiguousOptionError (BadOptionError):
142 """
143 Raised if an ambiguous option is seen on the command line.
144 """
145 def __init__(self, opt_str, possibilities):
146 BadOptionError.__init__(self, opt_str)
147 self.possibilities = possibilities
148
149 def __str__(self):
150 return (_("ambiguous option: %s (%s?)")
151 % (self.opt_str, ", ".join(self.possibilities)))
Greg Ward2492fcf2003-04-21 02:40:34 +0000152
153
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000154class HelpFormatter:
155
156 """
157 Abstract base class for formatting option help. OptionParser
158 instances should use one of the HelpFormatter subclasses for
159 formatting help; by default IndentedHelpFormatter is used.
160
161 Instance attributes:
Greg Wardeba20e62004-07-31 16:15:44 +0000162 parser : OptionParser
163 the controlling OptionParser instance
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000164 indent_increment : int
165 the number of columns to indent per nesting level
166 max_help_position : int
167 the maximum starting column for option help text
168 help_position : int
169 the calculated starting column for option help text;
170 initially the same as the maximum
171 width : int
Greg Wardeba20e62004-07-31 16:15:44 +0000172 total number of columns for output (pass None to constructor for
173 this value to be taken from the $COLUMNS environment variable)
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000174 level : int
175 current indentation level
176 current_indent : int
177 current indentation level (in columns)
178 help_width : int
179 number of columns available for option help text (calculated)
Greg Wardeba20e62004-07-31 16:15:44 +0000180 default_tag : str
181 text to replace with each option's default value, "%default"
182 by default. Set to false value to disable default value expansion.
183 option_strings : { Option : str }
184 maps Option instances to the snippet of help text explaining
185 the syntax of that option, e.g. "-h, --help" or
186 "-fFILE, --file=FILE"
187 _short_opt_fmt : str
188 format string controlling how short options with values are
189 printed in help text. Must be either "%s%s" ("-fFILE") or
190 "%s %s" ("-f FILE"), because those are the two syntaxes that
191 Optik supports.
192 _long_opt_fmt : str
193 similar but for long options; must be either "%s %s" ("--file FILE")
194 or "%s=%s" ("--file=FILE").
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000195 """
196
Greg Wardeba20e62004-07-31 16:15:44 +0000197 NO_DEFAULT_VALUE = "none"
198
199 def __init__(self,
200 indent_increment,
201 max_help_position,
202 width,
203 short_first):
204 self.parser = None
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000205 self.indent_increment = indent_increment
206 self.help_position = self.max_help_position = max_help_position
Greg Wardeba20e62004-07-31 16:15:44 +0000207 if width is None:
208 try:
209 width = int(os.environ['COLUMNS'])
210 except (KeyError, ValueError):
211 width = 80
212 width -= 2
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000213 self.width = width
214 self.current_indent = 0
215 self.level = 0
Greg Wardeba20e62004-07-31 16:15:44 +0000216 self.help_width = None # computed later
Greg Ward2492fcf2003-04-21 02:40:34 +0000217 self.short_first = short_first
Greg Wardeba20e62004-07-31 16:15:44 +0000218 self.default_tag = "%default"
219 self.option_strings = {}
220 self._short_opt_fmt = "%s %s"
221 self._long_opt_fmt = "%s=%s"
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000222
Greg Wardeba20e62004-07-31 16:15:44 +0000223 def set_parser(self, parser):
224 self.parser = parser
225
226 def set_short_opt_delimiter(self, delim):
227 if delim not in ("", " "):
228 raise ValueError(
229 "invalid metavar delimiter for short options: %r" % delim)
230 self._short_opt_fmt = "%s" + delim + "%s"
231
232 def set_long_opt_delimiter(self, delim):
233 if delim not in ("=", " "):
234 raise ValueError(
235 "invalid metavar delimiter for long options: %r" % delim)
236 self._long_opt_fmt = "%s" + delim + "%s"
237
238 def indent(self):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000239 self.current_indent += self.indent_increment
240 self.level += 1
241
Greg Wardeba20e62004-07-31 16:15:44 +0000242 def dedent(self):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000243 self.current_indent -= self.indent_increment
244 assert self.current_indent >= 0, "Indent decreased below 0."
245 self.level -= 1
246
Greg Wardeba20e62004-07-31 16:15:44 +0000247 def format_usage(self, usage):
Collin Winterce36ad82007-08-30 01:19:48 +0000248 raise NotImplementedError("subclasses must implement")
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000249
Greg Wardeba20e62004-07-31 16:15:44 +0000250 def format_heading(self, heading):
Collin Winterce36ad82007-08-30 01:19:48 +0000251 raise NotImplementedError("subclasses must implement")
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000252
Thomas Wouters477c8d52006-05-27 19:21:47 +0000253 def _format_text(self, text):
254 """
255 Format a paragraph of free-form text for inclusion in the
256 help output at the current indentation level.
257 """
258 text_width = self.width - self.current_indent
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000259 indent = " "*self.current_indent
Thomas Wouters477c8d52006-05-27 19:21:47 +0000260 return textwrap.fill(text,
261 text_width,
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000262 initial_indent=indent,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000263 subsequent_indent=indent)
264
265 def format_description(self, description):
266 if description:
267 return self._format_text(description) + "\n"
268 else:
269 return ""
270
271 def format_epilog(self, epilog):
272 if epilog:
273 return "\n" + self._format_text(epilog) + "\n"
274 else:
275 return ""
276
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000277
Greg Wardeba20e62004-07-31 16:15:44 +0000278 def expand_default(self, option):
279 if self.parser is None or not self.default_tag:
280 return option.help
281
282 default_value = self.parser.defaults.get(option.dest)
283 if default_value is NO_DEFAULT or default_value is None:
284 default_value = self.NO_DEFAULT_VALUE
285
286 return option.help.replace(self.default_tag, str(default_value))
287
288 def format_option(self, option):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000289 # The help for each option consists of two parts:
290 # * the opt strings and metavars
291 # eg. ("-x", or "-fFILENAME, --file=FILENAME")
292 # * the user-supplied help string
293 # eg. ("turn on expert mode", "read data from FILENAME")
294 #
295 # If possible, we write both of these on the same line:
296 # -x turn on expert mode
297 #
298 # But if the opt string list is too long, we put the help
299 # string on a second line, indented to the same column it would
300 # start in if it fit on the first line.
301 # -fFILENAME, --file=FILENAME
302 # read data from FILENAME
303 result = []
Greg Wardeba20e62004-07-31 16:15:44 +0000304 opts = self.option_strings[option]
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000305 opt_width = self.help_position - self.current_indent - 2
306 if len(opts) > opt_width:
307 opts = "%*s%s\n" % (self.current_indent, "", opts)
308 indent_first = self.help_position
309 else: # start help on same line as opts
310 opts = "%*s%-*s " % (self.current_indent, "", opt_width, opts)
311 indent_first = 0
312 result.append(opts)
313 if option.help:
Greg Wardeba20e62004-07-31 16:15:44 +0000314 help_text = self.expand_default(option)
315 help_lines = textwrap.wrap(help_text, self.help_width)
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000316 result.append("%*s%s\n" % (indent_first, "", help_lines[0]))
317 result.extend(["%*s%s\n" % (self.help_position, "", line)
318 for line in help_lines[1:]])
319 elif opts[-1] != "\n":
320 result.append("\n")
321 return "".join(result)
322
Greg Wardeba20e62004-07-31 16:15:44 +0000323 def store_option_strings(self, parser):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000324 self.indent()
325 max_len = 0
326 for opt in parser.option_list:
327 strings = self.format_option_strings(opt)
Greg Wardeba20e62004-07-31 16:15:44 +0000328 self.option_strings[opt] = strings
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000329 max_len = max(max_len, len(strings) + self.current_indent)
330 self.indent()
331 for group in parser.option_groups:
332 for opt in group.option_list:
333 strings = self.format_option_strings(opt)
Greg Wardeba20e62004-07-31 16:15:44 +0000334 self.option_strings[opt] = strings
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000335 max_len = max(max_len, len(strings) + self.current_indent)
336 self.dedent()
337 self.dedent()
338 self.help_position = min(max_len + 2, self.max_help_position)
Greg Wardeba20e62004-07-31 16:15:44 +0000339 self.help_width = self.width - self.help_position
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000340
Greg Wardeba20e62004-07-31 16:15:44 +0000341 def format_option_strings(self, option):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000342 """Return a comma-separated list of option strings & metavariables."""
Greg Ward2492fcf2003-04-21 02:40:34 +0000343 if option.takes_value():
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000344 metavar = option.metavar or option.dest.upper()
Greg Wardeba20e62004-07-31 16:15:44 +0000345 short_opts = [self._short_opt_fmt % (sopt, metavar)
346 for sopt in option._short_opts]
347 long_opts = [self._long_opt_fmt % (lopt, metavar)
348 for lopt in option._long_opts]
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000349 else:
Greg Ward2492fcf2003-04-21 02:40:34 +0000350 short_opts = option._short_opts
351 long_opts = option._long_opts
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000352
Greg Ward2492fcf2003-04-21 02:40:34 +0000353 if self.short_first:
354 opts = short_opts + long_opts
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000355 else:
Greg Ward2492fcf2003-04-21 02:40:34 +0000356 opts = long_opts + short_opts
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000357
Greg Ward2492fcf2003-04-21 02:40:34 +0000358 return ", ".join(opts)
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000359
360class IndentedHelpFormatter (HelpFormatter):
361 """Format help with indented section bodies.
362 """
363
Greg Wardeba20e62004-07-31 16:15:44 +0000364 def __init__(self,
365 indent_increment=2,
366 max_help_position=24,
367 width=None,
368 short_first=1):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000369 HelpFormatter.__init__(
370 self, indent_increment, max_help_position, width, short_first)
371
Greg Wardeba20e62004-07-31 16:15:44 +0000372 def format_usage(self, usage):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000373 return _("Usage: %s\n") % usage
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000374
Greg Wardeba20e62004-07-31 16:15:44 +0000375 def format_heading(self, heading):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000376 return "%*s%s:\n" % (self.current_indent, "", heading)
377
378
379class TitledHelpFormatter (HelpFormatter):
380 """Format help with underlined section headers.
381 """
382
Greg Wardeba20e62004-07-31 16:15:44 +0000383 def __init__(self,
384 indent_increment=0,
385 max_help_position=24,
386 width=None,
387 short_first=0):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000388 HelpFormatter.__init__ (
389 self, indent_increment, max_help_position, width, short_first)
390
Greg Wardeba20e62004-07-31 16:15:44 +0000391 def format_usage(self, usage):
392 return "%s %s\n" % (self.format_heading(_("Usage")), usage)
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000393
Greg Wardeba20e62004-07-31 16:15:44 +0000394 def format_heading(self, heading):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000395 return "%s\n%s\n" % (heading, "=-"[self.level] * len(heading))
Greg Ward2492fcf2003-04-21 02:40:34 +0000396
397
Thomas Wouters477c8d52006-05-27 19:21:47 +0000398def _parse_num(val, type):
399 if val[:2].lower() == "0x": # hexadecimal
400 radix = 16
401 elif val[:2].lower() == "0b": # binary
402 radix = 2
403 val = val[2:] or "0" # have to remove "0b" prefix
404 elif val[:1] == "0": # octal
405 radix = 8
406 else: # decimal
407 radix = 10
408
409 return type(val, radix)
410
411def _parse_int(val):
412 return _parse_num(val, int)
413
414def _parse_long(val):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000415 return _parse_num(val, int)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000416
417_builtin_cvt = { "int" : (_parse_int, _("integer")),
418 "long" : (_parse_long, _("long integer")),
Greg Wardeba20e62004-07-31 16:15:44 +0000419 "float" : (float, _("floating-point")),
420 "complex" : (complex, _("complex")) }
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000421
Greg Wardeba20e62004-07-31 16:15:44 +0000422def check_builtin(option, opt, value):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000423 (cvt, what) = _builtin_cvt[option.type]
424 try:
425 return cvt(value)
426 except ValueError:
427 raise OptionValueError(
Greg Wardeba20e62004-07-31 16:15:44 +0000428 _("option %s: invalid %s value: %r") % (opt, what, value))
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000429
430def check_choice(option, opt, value):
431 if value in option.choices:
432 return value
433 else:
434 choices = ", ".join(map(repr, option.choices))
435 raise OptionValueError(
Greg Wardeba20e62004-07-31 16:15:44 +0000436 _("option %s: invalid choice: %r (choose from %s)")
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000437 % (opt, value, choices))
438
439# Not supplying a default is different from a default of None,
440# so we need an explicit "not supplied" value.
Greg Wardeba20e62004-07-31 16:15:44 +0000441NO_DEFAULT = ("NO", "DEFAULT")
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000442
443
444class Option:
445 """
446 Instance attributes:
447 _short_opts : [string]
448 _long_opts : [string]
449
450 action : string
451 type : string
452 dest : string
453 default : any
454 nargs : int
455 const : any
456 choices : [string]
457 callback : function
458 callback_args : (any*)
459 callback_kwargs : { string : any }
460 help : string
461 metavar : string
462 """
463
464 # The list of instance attributes that may be set through
465 # keyword args to the constructor.
466 ATTRS = ['action',
467 'type',
468 'dest',
469 'default',
470 'nargs',
471 'const',
472 'choices',
473 'callback',
474 'callback_args',
475 'callback_kwargs',
476 'help',
477 'metavar']
478
479 # The set of actions allowed by option parsers. Explicitly listed
480 # here so the constructor can validate its arguments.
481 ACTIONS = ("store",
482 "store_const",
483 "store_true",
484 "store_false",
485 "append",
Thomas Wouters477c8d52006-05-27 19:21:47 +0000486 "append_const",
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000487 "count",
488 "callback",
489 "help",
490 "version")
491
492 # The set of actions that involve storing a value somewhere;
493 # also listed just for constructor argument validation. (If
494 # the action is one of these, there must be a destination.)
495 STORE_ACTIONS = ("store",
496 "store_const",
497 "store_true",
498 "store_false",
499 "append",
Thomas Wouters477c8d52006-05-27 19:21:47 +0000500 "append_const",
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000501 "count")
502
503 # The set of actions for which it makes sense to supply a value
Greg Ward48aa84b2004-10-27 02:20:04 +0000504 # type, ie. which may consume an argument from the command line.
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000505 TYPED_ACTIONS = ("store",
506 "append",
507 "callback")
508
Greg Ward48aa84b2004-10-27 02:20:04 +0000509 # The set of actions which *require* a value type, ie. that
510 # always consume an argument from the command line.
511 ALWAYS_TYPED_ACTIONS = ("store",
512 "append")
513
Thomas Wouters477c8d52006-05-27 19:21:47 +0000514 # The set of actions which take a 'const' attribute.
515 CONST_ACTIONS = ("store_const",
516 "append_const")
517
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000518 # The set of known types for option parsers. Again, listed here for
519 # constructor argument validation.
520 TYPES = ("string", "int", "long", "float", "complex", "choice")
521
522 # Dictionary of argument checking functions, which convert and
523 # validate option arguments according to the option type.
524 #
525 # Signature of checking functions is:
526 # check(option : Option, opt : string, value : string) -> any
527 # where
528 # option is the Option instance calling the checker
529 # opt is the actual option seen on the command-line
530 # (eg. "-a", "--file")
531 # value is the option argument seen on the command-line
532 #
533 # The return value should be in the appropriate Python type
534 # for option.type -- eg. an integer if option.type == "int".
535 #
536 # If no checker is defined for a type, arguments will be
537 # unchecked and remain strings.
538 TYPE_CHECKER = { "int" : check_builtin,
539 "long" : check_builtin,
540 "float" : check_builtin,
Greg Wardeba20e62004-07-31 16:15:44 +0000541 "complex": check_builtin,
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000542 "choice" : check_choice,
543 }
544
545
546 # CHECK_METHODS is a list of unbound method objects; they are called
547 # by the constructor, in order, after all attributes are
548 # initialized. The list is created and filled in later, after all
549 # the methods are actually defined. (I just put it here because I
550 # like to define and document all class attributes in the same
551 # place.) Subclasses that add another _check_*() method should
552 # define their own CHECK_METHODS list that adds their check method
553 # to those from this class.
554 CHECK_METHODS = None
555
556
557 # -- Constructor/initialization methods ----------------------------
558
Greg Wardeba20e62004-07-31 16:15:44 +0000559 def __init__(self, *opts, **attrs):
Greg Ward2492fcf2003-04-21 02:40:34 +0000560 # Set _short_opts, _long_opts attrs from 'opts' tuple.
561 # Have to be set now, in case no option strings are supplied.
562 self._short_opts = []
563 self._long_opts = []
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000564 opts = self._check_opt_strings(opts)
565 self._set_opt_strings(opts)
566
567 # Set all other attrs (action, type, etc.) from 'attrs' dict
568 self._set_attrs(attrs)
569
570 # Check all the attributes we just set. There are lots of
571 # complicated interdependencies, but luckily they can be farmed
572 # out to the _check_*() methods listed in CHECK_METHODS -- which
573 # could be handy for subclasses! The one thing these all share
574 # is that they raise OptionError if they discover a problem.
575 for checker in self.CHECK_METHODS:
576 checker(self)
577
Greg Wardeba20e62004-07-31 16:15:44 +0000578 def _check_opt_strings(self, opts):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000579 # Filter out None because early versions of Optik had exactly
580 # one short option and one long option, either of which
581 # could be None.
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000582 opts = [opt for opt in opts if opt]
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000583 if not opts:
Greg Ward2492fcf2003-04-21 02:40:34 +0000584 raise TypeError("at least one option string must be supplied")
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000585 return opts
586
Greg Wardeba20e62004-07-31 16:15:44 +0000587 def _set_opt_strings(self, opts):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000588 for opt in opts:
589 if len(opt) < 2:
590 raise OptionError(
591 "invalid option string %r: "
592 "must be at least two characters long" % opt, self)
593 elif len(opt) == 2:
594 if not (opt[0] == "-" and opt[1] != "-"):
595 raise OptionError(
596 "invalid short option string %r: "
597 "must be of the form -x, (x any non-dash char)" % opt,
598 self)
599 self._short_opts.append(opt)
600 else:
601 if not (opt[0:2] == "--" and opt[2] != "-"):
602 raise OptionError(
603 "invalid long option string %r: "
604 "must start with --, followed by non-dash" % opt,
605 self)
606 self._long_opts.append(opt)
607
Greg Wardeba20e62004-07-31 16:15:44 +0000608 def _set_attrs(self, attrs):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000609 for attr in self.ATTRS:
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000610 if attr in attrs:
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000611 setattr(self, attr, attrs[attr])
612 del attrs[attr]
613 else:
614 if attr == 'default':
615 setattr(self, attr, NO_DEFAULT)
616 else:
617 setattr(self, attr, None)
618 if attrs:
Georg Brandlc2d9d7f2007-02-11 23:06:17 +0000619 attrs = sorted(attrs.keys())
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000620 raise OptionError(
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000621 "invalid keyword arguments: %s" % ", ".join(attrs),
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000622 self)
623
624
625 # -- Constructor validation methods --------------------------------
626
Greg Wardeba20e62004-07-31 16:15:44 +0000627 def _check_action(self):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000628 if self.action is None:
629 self.action = "store"
630 elif self.action not in self.ACTIONS:
631 raise OptionError("invalid action: %r" % self.action, self)
632
Greg Wardeba20e62004-07-31 16:15:44 +0000633 def _check_type(self):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000634 if self.type is None:
Greg Ward48aa84b2004-10-27 02:20:04 +0000635 if self.action in self.ALWAYS_TYPED_ACTIONS:
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000636 if self.choices is not None:
637 # The "choices" attribute implies "choice" type.
638 self.type = "choice"
639 else:
640 # No type given? "string" is the most sensible default.
641 self.type = "string"
642 else:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000643 # Allow type objects or builtin type conversion functions
644 # (int, str, etc.) as an alternative to their names. (The
Georg Brandl1a3284e2007-12-02 09:40:06 +0000645 # complicated check of builtins is only necessary for
Thomas Wouters477c8d52006-05-27 19:21:47 +0000646 # Python 2.1 and earlier, and is short-circuited by the
647 # first check on modern Pythons.)
Georg Brandl1a3284e2007-12-02 09:40:06 +0000648 import builtins
Guido van Rossum13257902007-06-07 23:15:56 +0000649 if ( isinstance(self.type, type) or
Thomas Wouters477c8d52006-05-27 19:21:47 +0000650 (hasattr(self.type, "__name__") and
Georg Brandl1a3284e2007-12-02 09:40:06 +0000651 getattr(builtins, self.type.__name__, None) is self.type) ):
Greg Wardeba20e62004-07-31 16:15:44 +0000652 self.type = self.type.__name__
Thomas Wouters477c8d52006-05-27 19:21:47 +0000653
Greg Wardeba20e62004-07-31 16:15:44 +0000654 if self.type == "str":
655 self.type = "string"
656
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000657 if self.type not in self.TYPES:
658 raise OptionError("invalid option type: %r" % self.type, self)
659 if self.action not in self.TYPED_ACTIONS:
660 raise OptionError(
661 "must not supply a type for action %r" % self.action, self)
662
663 def _check_choice(self):
664 if self.type == "choice":
665 if self.choices is None:
666 raise OptionError(
667 "must supply a list of choices for type 'choice'", self)
Guido van Rossum13257902007-06-07 23:15:56 +0000668 elif not isinstance(self.choices, (tuple, list)):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000669 raise OptionError(
670 "choices must be a list of strings ('%s' supplied)"
671 % str(type(self.choices)).split("'")[1], self)
672 elif self.choices is not None:
673 raise OptionError(
674 "must not supply choices for type %r" % self.type, self)
675
Greg Wardeba20e62004-07-31 16:15:44 +0000676 def _check_dest(self):
677 # No destination given, and we need one for this action. The
678 # self.type check is for callbacks that take a value.
679 takes_value = (self.action in self.STORE_ACTIONS or
680 self.type is not None)
681 if self.dest is None and takes_value:
682
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000683 # Glean a destination from the first long option string,
684 # or from the first short option string if no long options.
685 if self._long_opts:
686 # eg. "--foo-bar" -> "foo_bar"
687 self.dest = self._long_opts[0][2:].replace('-', '_')
688 else:
689 self.dest = self._short_opts[0][1]
690
Greg Wardeba20e62004-07-31 16:15:44 +0000691 def _check_const(self):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000692 if self.action not in self.CONST_ACTIONS and self.const is not None:
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000693 raise OptionError(
694 "'const' must not be supplied for action %r" % self.action,
695 self)
696
Greg Wardeba20e62004-07-31 16:15:44 +0000697 def _check_nargs(self):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000698 if self.action in self.TYPED_ACTIONS:
699 if self.nargs is None:
700 self.nargs = 1
701 elif self.nargs is not None:
702 raise OptionError(
703 "'nargs' must not be supplied for action %r" % self.action,
704 self)
705
Greg Wardeba20e62004-07-31 16:15:44 +0000706 def _check_callback(self):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000707 if self.action == "callback":
Florent Xicluna5d1155c2011-10-28 14:45:05 +0200708 if not callable(self.callback):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000709 raise OptionError(
710 "callback not callable: %r" % self.callback, self)
711 if (self.callback_args is not None and
Guido van Rossum13257902007-06-07 23:15:56 +0000712 not isinstance(self.callback_args, tuple)):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000713 raise OptionError(
714 "callback_args, if supplied, must be a tuple: not %r"
715 % self.callback_args, self)
716 if (self.callback_kwargs is not None and
Guido van Rossum13257902007-06-07 23:15:56 +0000717 not isinstance(self.callback_kwargs, dict)):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000718 raise OptionError(
719 "callback_kwargs, if supplied, must be a dict: not %r"
720 % self.callback_kwargs, self)
721 else:
722 if self.callback is not None:
723 raise OptionError(
724 "callback supplied (%r) for non-callback option"
725 % self.callback, self)
726 if self.callback_args is not None:
727 raise OptionError(
728 "callback_args supplied for non-callback option", self)
729 if self.callback_kwargs is not None:
730 raise OptionError(
731 "callback_kwargs supplied for non-callback option", self)
732
733
734 CHECK_METHODS = [_check_action,
735 _check_type,
736 _check_choice,
737 _check_dest,
738 _check_const,
739 _check_nargs,
740 _check_callback]
741
742
743 # -- Miscellaneous methods -----------------------------------------
744
Greg Wardeba20e62004-07-31 16:15:44 +0000745 def __str__(self):
Greg Ward2492fcf2003-04-21 02:40:34 +0000746 return "/".join(self._short_opts + self._long_opts)
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000747
Greg Wardeba20e62004-07-31 16:15:44 +0000748 __repr__ = _repr
749
750 def takes_value(self):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000751 return self.type is not None
752
Greg Wardeba20e62004-07-31 16:15:44 +0000753 def get_opt_string(self):
754 if self._long_opts:
755 return self._long_opts[0]
756 else:
757 return self._short_opts[0]
758
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000759
760 # -- Processing methods --------------------------------------------
761
Greg Wardeba20e62004-07-31 16:15:44 +0000762 def check_value(self, opt, value):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000763 checker = self.TYPE_CHECKER.get(self.type)
764 if checker is None:
765 return value
766 else:
767 return checker(self, opt, value)
768
Greg Wardeba20e62004-07-31 16:15:44 +0000769 def convert_value(self, opt, value):
770 if value is not None:
771 if self.nargs == 1:
772 return self.check_value(opt, value)
773 else:
774 return tuple([self.check_value(opt, v) for v in value])
775
776 def process(self, opt, value, values, parser):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000777
778 # First, convert the value(s) to the right type. Howl if any
779 # value(s) are bogus.
Greg Wardeba20e62004-07-31 16:15:44 +0000780 value = self.convert_value(opt, value)
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000781
782 # And then take whatever action is expected of us.
783 # This is a separate method to make life easier for
784 # subclasses to add new actions.
785 return self.take_action(
786 self.action, self.dest, opt, value, values, parser)
787
Greg Wardeba20e62004-07-31 16:15:44 +0000788 def take_action(self, action, dest, opt, value, values, parser):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000789 if action == "store":
790 setattr(values, dest, value)
791 elif action == "store_const":
792 setattr(values, dest, self.const)
793 elif action == "store_true":
Greg Ward2492fcf2003-04-21 02:40:34 +0000794 setattr(values, dest, True)
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000795 elif action == "store_false":
Greg Ward2492fcf2003-04-21 02:40:34 +0000796 setattr(values, dest, False)
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000797 elif action == "append":
798 values.ensure_value(dest, []).append(value)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000799 elif action == "append_const":
800 values.ensure_value(dest, []).append(self.const)
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000801 elif action == "count":
802 setattr(values, dest, values.ensure_value(dest, 0) + 1)
803 elif action == "callback":
804 args = self.callback_args or ()
805 kwargs = self.callback_kwargs or {}
806 self.callback(self, opt, value, parser, *args, **kwargs)
807 elif action == "help":
808 parser.print_help()
Greg Ward48aa84b2004-10-27 02:20:04 +0000809 parser.exit()
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000810 elif action == "version":
811 parser.print_version()
Greg Ward48aa84b2004-10-27 02:20:04 +0000812 parser.exit()
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000813 else:
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000814 raise ValueError("unknown action %r" % self.action)
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000815
816 return 1
817
818# class Option
Greg Ward2492fcf2003-04-21 02:40:34 +0000819
820
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000821SUPPRESS_HELP = "SUPPRESS"+"HELP"
822SUPPRESS_USAGE = "SUPPRESS"+"USAGE"
823
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000824class Values:
825
Greg Wardeba20e62004-07-31 16:15:44 +0000826 def __init__(self, defaults=None):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000827 if defaults:
828 for (attr, val) in defaults.items():
829 setattr(self, attr, val)
830
Greg Wardeba20e62004-07-31 16:15:44 +0000831 def __str__(self):
832 return str(self.__dict__)
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000833
Greg Wardeba20e62004-07-31 16:15:44 +0000834 __repr__ = _repr
835
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000836 def __eq__(self, other):
Greg Wardeba20e62004-07-31 16:15:44 +0000837 if isinstance(other, Values):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000838 return self.__dict__ == other.__dict__
Guido van Rossum13257902007-06-07 23:15:56 +0000839 elif isinstance(other, dict):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000840 return self.__dict__ == other
Greg Wardeba20e62004-07-31 16:15:44 +0000841 else:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000842 return NotImplemented
Greg Wardeba20e62004-07-31 16:15:44 +0000843
844 def _update_careful(self, dict):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000845 """
846 Update the option values from an arbitrary dictionary, but only
847 use keys from dict that already have a corresponding attribute
848 in self. Any keys in dict without a corresponding attribute
849 are silently ignored.
850 """
851 for attr in dir(self):
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000852 if attr in dict:
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000853 dval = dict[attr]
854 if dval is not None:
855 setattr(self, attr, dval)
856
Greg Wardeba20e62004-07-31 16:15:44 +0000857 def _update_loose(self, dict):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000858 """
859 Update the option values from an arbitrary dictionary,
860 using all keys from the dictionary regardless of whether
861 they have a corresponding attribute in self or not.
862 """
863 self.__dict__.update(dict)
864
Greg Wardeba20e62004-07-31 16:15:44 +0000865 def _update(self, dict, mode):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000866 if mode == "careful":
867 self._update_careful(dict)
868 elif mode == "loose":
869 self._update_loose(dict)
870 else:
Collin Winterce36ad82007-08-30 01:19:48 +0000871 raise ValueError("invalid update mode: %r" % mode)
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000872
Greg Wardeba20e62004-07-31 16:15:44 +0000873 def read_module(self, modname, mode="careful"):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000874 __import__(modname)
875 mod = sys.modules[modname]
876 self._update(vars(mod), mode)
877
Greg Wardeba20e62004-07-31 16:15:44 +0000878 def read_file(self, filename, mode="careful"):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000879 vars = {}
Neal Norwitz01688022007-08-12 00:43:29 +0000880 exec(open(filename).read(), vars)
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000881 self._update(vars, mode)
882
Greg Wardeba20e62004-07-31 16:15:44 +0000883 def ensure_value(self, attr, value):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000884 if not hasattr(self, attr) or getattr(self, attr) is None:
885 setattr(self, attr, value)
886 return getattr(self, attr)
887
888
889class OptionContainer:
890
891 """
892 Abstract base class.
893
894 Class attributes:
895 standard_option_list : [Option]
896 list of standard options that will be accepted by all instances
897 of this parser class (intended to be overridden by subclasses).
898
899 Instance attributes:
900 option_list : [Option]
901 the list of Option objects contained by this OptionContainer
902 _short_opt : { string : Option }
903 dictionary mapping short option strings, eg. "-f" or "-X",
904 to the Option instances that implement them. If an Option
905 has multiple short option strings, it will appears in this
906 dictionary multiple times. [1]
907 _long_opt : { string : Option }
908 dictionary mapping long option strings, eg. "--file" or
909 "--exclude", to the Option instances that implement them.
910 Again, a given Option can occur multiple times in this
911 dictionary. [1]
912 defaults : { string : any }
913 dictionary mapping option destination names to default
914 values for each destination [1]
915
916 [1] These mappings are common to (shared by) all components of the
917 controlling OptionParser, where they are initially created.
918
919 """
920
Greg Wardeba20e62004-07-31 16:15:44 +0000921 def __init__(self, option_class, conflict_handler, description):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000922 # Initialize the option list and related data structures.
923 # This method must be provided by subclasses, and it must
924 # initialize at least the following instance attributes:
925 # option_list, _short_opt, _long_opt, defaults.
926 self._create_option_list()
927
928 self.option_class = option_class
929 self.set_conflict_handler(conflict_handler)
930 self.set_description(description)
931
Greg Wardeba20e62004-07-31 16:15:44 +0000932 def _create_option_mappings(self):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000933 # For use by OptionParser constructor -- create the master
934 # option mappings used by this OptionParser and all
935 # OptionGroups that it owns.
936 self._short_opt = {} # single letter -> Option instance
937 self._long_opt = {} # long option -> Option instance
938 self.defaults = {} # maps option dest -> default value
939
940
Greg Wardeba20e62004-07-31 16:15:44 +0000941 def _share_option_mappings(self, parser):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000942 # For use by OptionGroup constructor -- use shared option
943 # mappings from the OptionParser that owns this OptionGroup.
944 self._short_opt = parser._short_opt
945 self._long_opt = parser._long_opt
946 self.defaults = parser.defaults
947
Greg Wardeba20e62004-07-31 16:15:44 +0000948 def set_conflict_handler(self, handler):
Greg Ward48aa84b2004-10-27 02:20:04 +0000949 if handler not in ("error", "resolve"):
Collin Winterce36ad82007-08-30 01:19:48 +0000950 raise ValueError("invalid conflict_resolution value %r" % handler)
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000951 self.conflict_handler = handler
952
Greg Wardeba20e62004-07-31 16:15:44 +0000953 def set_description(self, description):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000954 self.description = description
955
Greg Wardeba20e62004-07-31 16:15:44 +0000956 def get_description(self):
957 return self.description
958
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000959
Thomas Wouters477c8d52006-05-27 19:21:47 +0000960 def destroy(self):
961 """see OptionParser.destroy()."""
962 del self._short_opt
963 del self._long_opt
964 del self.defaults
965
966
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000967 # -- Option-adding methods -----------------------------------------
968
Greg Wardeba20e62004-07-31 16:15:44 +0000969 def _check_conflict(self, option):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000970 conflict_opts = []
971 for opt in option._short_opts:
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000972 if opt in self._short_opt:
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000973 conflict_opts.append((opt, self._short_opt[opt]))
974 for opt in option._long_opts:
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000975 if opt in self._long_opt:
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000976 conflict_opts.append((opt, self._long_opt[opt]))
977
978 if conflict_opts:
979 handler = self.conflict_handler
Greg Ward48aa84b2004-10-27 02:20:04 +0000980 if handler == "error":
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000981 raise OptionConflictError(
982 "conflicting option string(s): %s"
983 % ", ".join([co[0] for co in conflict_opts]),
984 option)
Greg Ward48aa84b2004-10-27 02:20:04 +0000985 elif handler == "resolve":
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000986 for (opt, c_option) in conflict_opts:
987 if opt.startswith("--"):
988 c_option._long_opts.remove(opt)
989 del self._long_opt[opt]
990 else:
991 c_option._short_opts.remove(opt)
992 del self._short_opt[opt]
993 if not (c_option._short_opts or c_option._long_opts):
994 c_option.container.option_list.remove(c_option)
995
Greg Wardeba20e62004-07-31 16:15:44 +0000996 def add_option(self, *args, **kwargs):
Guido van Rossumb9ba4582002-11-14 22:00:19 +0000997 """add_option(Option)
998 add_option(opt_str, ..., kwarg=val, ...)
999 """
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001000 if isinstance(args[0], str):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001001 option = self.option_class(*args, **kwargs)
1002 elif len(args) == 1 and not kwargs:
1003 option = args[0]
1004 if not isinstance(option, Option):
Collin Winterce36ad82007-08-30 01:19:48 +00001005 raise TypeError("not an Option instance: %r" % option)
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001006 else:
Collin Winterce36ad82007-08-30 01:19:48 +00001007 raise TypeError("invalid arguments")
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001008
1009 self._check_conflict(option)
1010
1011 self.option_list.append(option)
1012 option.container = self
1013 for opt in option._short_opts:
1014 self._short_opt[opt] = option
1015 for opt in option._long_opts:
1016 self._long_opt[opt] = option
1017
1018 if option.dest is not None: # option has a dest, we need a default
1019 if option.default is not NO_DEFAULT:
1020 self.defaults[option.dest] = option.default
Guido van Rossume2b70bc2006-08-18 22:13:04 +00001021 elif option.dest not in self.defaults:
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001022 self.defaults[option.dest] = None
1023
1024 return option
1025
Greg Wardeba20e62004-07-31 16:15:44 +00001026 def add_options(self, option_list):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001027 for option in option_list:
1028 self.add_option(option)
1029
1030 # -- Option query/removal methods ----------------------------------
1031
Greg Wardeba20e62004-07-31 16:15:44 +00001032 def get_option(self, opt_str):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001033 return (self._short_opt.get(opt_str) or
1034 self._long_opt.get(opt_str))
1035
Greg Wardeba20e62004-07-31 16:15:44 +00001036 def has_option(self, opt_str):
Guido van Rossume2b70bc2006-08-18 22:13:04 +00001037 return (opt_str in self._short_opt or
Guido van Rossum93662412006-08-19 16:09:41 +00001038 opt_str in self._long_opt)
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001039
Greg Wardeba20e62004-07-31 16:15:44 +00001040 def remove_option(self, opt_str):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001041 option = self._short_opt.get(opt_str)
1042 if option is None:
1043 option = self._long_opt.get(opt_str)
1044 if option is None:
1045 raise ValueError("no such option %r" % opt_str)
1046
1047 for opt in option._short_opts:
1048 del self._short_opt[opt]
1049 for opt in option._long_opts:
1050 del self._long_opt[opt]
1051 option.container.option_list.remove(option)
1052
1053
1054 # -- Help-formatting methods ---------------------------------------
1055
Greg Wardeba20e62004-07-31 16:15:44 +00001056 def format_option_help(self, formatter):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001057 if not self.option_list:
1058 return ""
1059 result = []
1060 for option in self.option_list:
1061 if not option.help is SUPPRESS_HELP:
1062 result.append(formatter.format_option(option))
1063 return "".join(result)
1064
Greg Wardeba20e62004-07-31 16:15:44 +00001065 def format_description(self, formatter):
1066 return formatter.format_description(self.get_description())
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001067
Greg Wardeba20e62004-07-31 16:15:44 +00001068 def format_help(self, formatter):
1069 result = []
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001070 if self.description:
Greg Wardeba20e62004-07-31 16:15:44 +00001071 result.append(self.format_description(formatter))
1072 if self.option_list:
1073 result.append(self.format_option_help(formatter))
1074 return "\n".join(result)
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001075
1076
1077class OptionGroup (OptionContainer):
1078
Greg Wardeba20e62004-07-31 16:15:44 +00001079 def __init__(self, parser, title, description=None):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001080 self.parser = parser
1081 OptionContainer.__init__(
1082 self, parser.option_class, parser.conflict_handler, description)
1083 self.title = title
1084
Greg Wardeba20e62004-07-31 16:15:44 +00001085 def _create_option_list(self):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001086 self.option_list = []
1087 self._share_option_mappings(self.parser)
1088
Greg Wardeba20e62004-07-31 16:15:44 +00001089 def set_title(self, title):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001090 self.title = title
1091
Thomas Wouters477c8d52006-05-27 19:21:47 +00001092 def destroy(self):
1093 """see OptionParser.destroy()."""
1094 OptionContainer.destroy(self)
1095 del self.option_list
1096
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001097 # -- Help-formatting methods ---------------------------------------
1098
Greg Wardeba20e62004-07-31 16:15:44 +00001099 def format_help(self, formatter):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001100 result = formatter.format_heading(self.title)
1101 formatter.indent()
1102 result += OptionContainer.format_help(self, formatter)
1103 formatter.dedent()
1104 return result
1105
1106
1107class OptionParser (OptionContainer):
1108
1109 """
1110 Class attributes:
1111 standard_option_list : [Option]
1112 list of standard options that will be accepted by all instances
1113 of this parser class (intended to be overridden by subclasses).
1114
1115 Instance attributes:
1116 usage : string
1117 a usage string for your program. Before it is displayed
1118 to the user, "%prog" will be expanded to the name of
Greg Ward2492fcf2003-04-21 02:40:34 +00001119 your program (self.prog or os.path.basename(sys.argv[0])).
1120 prog : string
1121 the name of the current program (to override
1122 os.path.basename(sys.argv[0])).
R David Murrayfc5ed802011-05-04 21:06:57 -04001123 description : string
1124 A paragraph of text giving a brief overview of your program.
1125 optparse reformats this paragraph to fit the current terminal
1126 width and prints it when the user requests help (after usage,
1127 but before the list of options).
Thomas Wouters477c8d52006-05-27 19:21:47 +00001128 epilog : string
1129 paragraph of help text to print after option help
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001130
Greg Wardeba20e62004-07-31 16:15:44 +00001131 option_groups : [OptionGroup]
1132 list of option groups in this parser (option groups are
1133 irrelevant for parsing the command-line, but very useful
1134 for generating help)
1135
1136 allow_interspersed_args : bool = true
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001137 if true, positional arguments may be interspersed with options.
1138 Assuming -a and -b each take a single argument, the command-line
1139 -ablah foo bar -bboo baz
1140 will be interpreted the same as
1141 -ablah -bboo -- foo bar baz
1142 If this flag were false, that command line would be interpreted as
1143 -ablah -- foo bar -bboo baz
1144 -- ie. we stop processing options as soon as we see the first
1145 non-option argument. (This is the tradition followed by
1146 Python's getopt module, Perl's Getopt::Std, and other argument-
1147 parsing libraries, but it is generally annoying to users.)
1148
Greg Wardeba20e62004-07-31 16:15:44 +00001149 process_default_values : bool = true
1150 if true, option default values are processed similarly to option
1151 values from the command line: that is, they are passed to the
1152 type-checking function for the option's type (as long as the
1153 default value is a string). (This really only matters if you
1154 have defined custom types; see SF bug #955889.) Set it to false
1155 to restore the behaviour of Optik 1.4.1 and earlier.
1156
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001157 rargs : [string]
1158 the argument list currently being parsed. Only set when
1159 parse_args() is active, and continually trimmed down as
1160 we consume arguments. Mainly there for the benefit of
1161 callback options.
1162 largs : [string]
1163 the list of leftover arguments that we have skipped while
1164 parsing options. If allow_interspersed_args is false, this
1165 list is always empty.
1166 values : Values
1167 the set of option values currently being accumulated. Only
1168 set when parse_args() is active. Also mainly for callbacks.
1169
1170 Because of the 'rargs', 'largs', and 'values' attributes,
1171 OptionParser is not thread-safe. If, for some perverse reason, you
1172 need to parse command-line arguments simultaneously in different
1173 threads, use different OptionParser instances.
1174
1175 """
1176
1177 standard_option_list = []
1178
Greg Wardeba20e62004-07-31 16:15:44 +00001179 def __init__(self,
1180 usage=None,
1181 option_list=None,
1182 option_class=Option,
1183 version=None,
1184 conflict_handler="error",
1185 description=None,
1186 formatter=None,
1187 add_help_option=True,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001188 prog=None,
1189 epilog=None):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001190 OptionContainer.__init__(
1191 self, option_class, conflict_handler, description)
1192 self.set_usage(usage)
Greg Ward2492fcf2003-04-21 02:40:34 +00001193 self.prog = prog
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001194 self.version = version
Greg Wardeba20e62004-07-31 16:15:44 +00001195 self.allow_interspersed_args = True
1196 self.process_default_values = True
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001197 if formatter is None:
1198 formatter = IndentedHelpFormatter()
1199 self.formatter = formatter
Greg Wardeba20e62004-07-31 16:15:44 +00001200 self.formatter.set_parser(self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001201 self.epilog = epilog
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001202
1203 # Populate the option list; initial sources are the
1204 # standard_option_list class attribute, the 'option_list'
Greg Wardeba20e62004-07-31 16:15:44 +00001205 # argument, and (if applicable) the _add_version_option() and
1206 # _add_help_option() methods.
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001207 self._populate_option_list(option_list,
1208 add_help=add_help_option)
1209
1210 self._init_parsing_state()
1211
Thomas Wouters477c8d52006-05-27 19:21:47 +00001212
1213 def destroy(self):
1214 """
1215 Declare that you are done with this OptionParser. This cleans up
1216 reference cycles so the OptionParser (and all objects referenced by
1217 it) can be garbage-collected promptly. After calling destroy(), the
1218 OptionParser is unusable.
1219 """
1220 OptionContainer.destroy(self)
1221 for group in self.option_groups:
1222 group.destroy()
1223 del self.option_list
1224 del self.option_groups
1225 del self.formatter
1226
1227
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001228 # -- Private methods -----------------------------------------------
1229 # (used by our or OptionContainer's constructor)
1230
Greg Wardeba20e62004-07-31 16:15:44 +00001231 def _create_option_list(self):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001232 self.option_list = []
1233 self.option_groups = []
1234 self._create_option_mappings()
1235
Greg Wardeba20e62004-07-31 16:15:44 +00001236 def _add_help_option(self):
1237 self.add_option("-h", "--help",
1238 action="help",
1239 help=_("show this help message and exit"))
1240
1241 def _add_version_option(self):
1242 self.add_option("--version",
1243 action="version",
1244 help=_("show program's version number and exit"))
1245
1246 def _populate_option_list(self, option_list, add_help=True):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001247 if self.standard_option_list:
1248 self.add_options(self.standard_option_list)
1249 if option_list:
1250 self.add_options(option_list)
1251 if self.version:
Greg Wardeba20e62004-07-31 16:15:44 +00001252 self._add_version_option()
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001253 if add_help:
Greg Wardeba20e62004-07-31 16:15:44 +00001254 self._add_help_option()
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001255
Greg Wardeba20e62004-07-31 16:15:44 +00001256 def _init_parsing_state(self):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001257 # These are set in parse_args() for the convenience of callbacks.
1258 self.rargs = None
1259 self.largs = None
1260 self.values = None
1261
1262
1263 # -- Simple modifier methods ---------------------------------------
1264
Greg Wardeba20e62004-07-31 16:15:44 +00001265 def set_usage(self, usage):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001266 if usage is None:
Greg Wardeba20e62004-07-31 16:15:44 +00001267 self.usage = _("%prog [options]")
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001268 elif usage is SUPPRESS_USAGE:
1269 self.usage = None
Greg Wardeba20e62004-07-31 16:15:44 +00001270 # For backwards compatibility with Optik 1.3 and earlier.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001271 elif usage.lower().startswith("usage: "):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001272 self.usage = usage[7:]
1273 else:
1274 self.usage = usage
1275
Greg Wardeba20e62004-07-31 16:15:44 +00001276 def enable_interspersed_args(self):
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001277 """Set parsing to not stop on the first non-option, allowing
1278 interspersing switches with command arguments. This is the
1279 default behavior. See also disable_interspersed_args() and the
1280 class documentation description of the attribute
1281 allow_interspersed_args."""
Greg Wardeba20e62004-07-31 16:15:44 +00001282 self.allow_interspersed_args = True
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001283
Greg Wardeba20e62004-07-31 16:15:44 +00001284 def disable_interspersed_args(self):
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001285 """Set parsing to stop on the first non-option. Use this if
1286 you have a command processor which runs another command that
1287 has options of its own and you want to make sure these options
1288 don't get confused.
1289 """
Greg Wardeba20e62004-07-31 16:15:44 +00001290 self.allow_interspersed_args = False
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001291
Greg Wardeba20e62004-07-31 16:15:44 +00001292 def set_process_default_values(self, process):
1293 self.process_default_values = process
1294
1295 def set_default(self, dest, value):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001296 self.defaults[dest] = value
1297
Greg Wardeba20e62004-07-31 16:15:44 +00001298 def set_defaults(self, **kwargs):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001299 self.defaults.update(kwargs)
1300
Greg Wardeba20e62004-07-31 16:15:44 +00001301 def _get_all_options(self):
1302 options = self.option_list[:]
1303 for group in self.option_groups:
1304 options.extend(group.option_list)
1305 return options
1306
1307 def get_default_values(self):
1308 if not self.process_default_values:
1309 # Old, pre-Optik 1.5 behaviour.
1310 return Values(self.defaults)
1311
1312 defaults = self.defaults.copy()
1313 for option in self._get_all_options():
1314 default = defaults.get(option.dest)
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001315 if isinstance(default, str):
Greg Wardeba20e62004-07-31 16:15:44 +00001316 opt_str = option.get_opt_string()
1317 defaults[option.dest] = option.check_value(opt_str, default)
1318
1319 return Values(defaults)
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001320
1321
1322 # -- OptionGroup methods -------------------------------------------
1323
Greg Wardeba20e62004-07-31 16:15:44 +00001324 def add_option_group(self, *args, **kwargs):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001325 # XXX lots of overlap with OptionContainer.add_option()
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001326 if isinstance(args[0], str):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001327 group = OptionGroup(self, *args, **kwargs)
1328 elif len(args) == 1 and not kwargs:
1329 group = args[0]
1330 if not isinstance(group, OptionGroup):
Collin Winterce36ad82007-08-30 01:19:48 +00001331 raise TypeError("not an OptionGroup instance: %r" % group)
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001332 if group.parser is not self:
Collin Winterce36ad82007-08-30 01:19:48 +00001333 raise ValueError("invalid OptionGroup (wrong parser)")
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001334 else:
Collin Winterce36ad82007-08-30 01:19:48 +00001335 raise TypeError("invalid arguments")
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001336
1337 self.option_groups.append(group)
1338 return group
1339
Greg Wardeba20e62004-07-31 16:15:44 +00001340 def get_option_group(self, opt_str):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001341 option = (self._short_opt.get(opt_str) or
1342 self._long_opt.get(opt_str))
1343 if option and option.container is not self:
1344 return option.container
1345 return None
1346
1347
1348 # -- Option-parsing methods ----------------------------------------
1349
Greg Wardeba20e62004-07-31 16:15:44 +00001350 def _get_args(self, args):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001351 if args is None:
1352 return sys.argv[1:]
1353 else:
1354 return args[:] # don't modify caller's list
1355
Greg Wardeba20e62004-07-31 16:15:44 +00001356 def parse_args(self, args=None, values=None):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001357 """
1358 parse_args(args : [string] = sys.argv[1:],
1359 values : Values = None)
1360 -> (values : Values, args : [string])
1361
1362 Parse the command-line options found in 'args' (default:
1363 sys.argv[1:]). Any errors result in a call to 'error()', which
1364 by default prints the usage message to stderr and calls
1365 sys.exit() with an error message. On success returns a pair
1366 (values, args) where 'values' is an Values instance (with all
1367 your option values) and 'args' is the list of arguments left
1368 over after parsing options.
1369 """
1370 rargs = self._get_args(args)
1371 if values is None:
1372 values = self.get_default_values()
1373
1374 # Store the halves of the argument list as attributes for the
1375 # convenience of callbacks:
1376 # rargs
1377 # the rest of the command-line (the "r" stands for
1378 # "remaining" or "right-hand")
1379 # largs
1380 # the leftover arguments -- ie. what's left after removing
1381 # options and their arguments (the "l" stands for "leftover"
1382 # or "left-hand")
1383 self.rargs = rargs
1384 self.largs = largs = []
1385 self.values = values
1386
1387 try:
1388 stop = self._process_args(largs, rargs, values)
Guido van Rossumb940e112007-01-10 16:19:56 +00001389 except (BadOptionError, OptionValueError) as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001390 self.error(str(err))
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001391
1392 args = largs + rargs
1393 return self.check_values(values, args)
1394
Greg Wardeba20e62004-07-31 16:15:44 +00001395 def check_values(self, values, args):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001396 """
1397 check_values(values : Values, args : [string])
1398 -> (values : Values, args : [string])
1399
1400 Check that the supplied option values and leftover arguments are
1401 valid. Returns the option values and leftover arguments
1402 (possibly adjusted, possibly completely new -- whatever you
1403 like). Default implementation just returns the passed-in
1404 values; subclasses may override as desired.
1405 """
1406 return (values, args)
1407
Greg Wardeba20e62004-07-31 16:15:44 +00001408 def _process_args(self, largs, rargs, values):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001409 """_process_args(largs : [string],
1410 rargs : [string],
1411 values : Values)
1412
1413 Process command-line arguments and populate 'values', consuming
1414 options and arguments from 'rargs'. If 'allow_interspersed_args' is
1415 false, stop at the first non-option argument. If true, accumulate any
1416 interspersed non-option arguments in 'largs'.
1417 """
1418 while rargs:
1419 arg = rargs[0]
1420 # We handle bare "--" explicitly, and bare "-" is handled by the
1421 # standard arg handler since the short arg case ensures that the
1422 # len of the opt string is greater than 1.
1423 if arg == "--":
1424 del rargs[0]
1425 return
1426 elif arg[0:2] == "--":
1427 # process a single long option (possibly with value(s))
1428 self._process_long_opt(rargs, values)
1429 elif arg[:1] == "-" and len(arg) > 1:
1430 # process a cluster of short options (possibly with
1431 # value(s) for the last one only)
1432 self._process_short_opts(rargs, values)
1433 elif self.allow_interspersed_args:
1434 largs.append(arg)
1435 del rargs[0]
1436 else:
1437 return # stop now, leave this arg in rargs
1438
1439 # Say this is the original argument list:
1440 # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)]
1441 # ^
1442 # (we are about to process arg(i)).
1443 #
1444 # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of
1445 # [arg0, ..., arg(i-1)] (any options and their arguments will have
1446 # been removed from largs).
1447 #
1448 # The while loop will usually consume 1 or more arguments per pass.
1449 # If it consumes 1 (eg. arg is an option that takes no arguments),
1450 # then after _process_arg() is done the situation is:
1451 #
1452 # largs = subset of [arg0, ..., arg(i)]
1453 # rargs = [arg(i+1), ..., arg(N-1)]
1454 #
1455 # If allow_interspersed_args is false, largs will always be
1456 # *empty* -- still a subset of [arg0, ..., arg(i-1)], but
1457 # not a very interesting subset!
1458
Greg Wardeba20e62004-07-31 16:15:44 +00001459 def _match_long_opt(self, opt):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001460 """_match_long_opt(opt : string) -> string
1461
1462 Determine which long option string 'opt' matches, ie. which one
1463 it is an unambiguous abbrevation for. Raises BadOptionError if
1464 'opt' doesn't unambiguously match any long option string.
1465 """
1466 return _match_abbrev(opt, self._long_opt)
1467
Greg Wardeba20e62004-07-31 16:15:44 +00001468 def _process_long_opt(self, rargs, values):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001469 arg = rargs.pop(0)
1470
1471 # Value explicitly attached to arg? Pretend it's the next
1472 # argument.
1473 if "=" in arg:
1474 (opt, next_arg) = arg.split("=", 1)
1475 rargs.insert(0, next_arg)
Greg Wardeba20e62004-07-31 16:15:44 +00001476 had_explicit_value = True
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001477 else:
1478 opt = arg
Greg Wardeba20e62004-07-31 16:15:44 +00001479 had_explicit_value = False
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001480
1481 opt = self._match_long_opt(opt)
1482 option = self._long_opt[opt]
1483 if option.takes_value():
1484 nargs = option.nargs
1485 if len(rargs) < nargs:
1486 if nargs == 1:
Greg Wardeba20e62004-07-31 16:15:44 +00001487 self.error(_("%s option requires an argument") % opt)
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001488 else:
Greg Wardeba20e62004-07-31 16:15:44 +00001489 self.error(_("%s option requires %d arguments")
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001490 % (opt, nargs))
1491 elif nargs == 1:
1492 value = rargs.pop(0)
1493 else:
1494 value = tuple(rargs[0:nargs])
1495 del rargs[0:nargs]
1496
1497 elif had_explicit_value:
Greg Wardeba20e62004-07-31 16:15:44 +00001498 self.error(_("%s option does not take a value") % opt)
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001499
1500 else:
1501 value = None
1502
1503 option.process(opt, value, values, self)
1504
Greg Wardeba20e62004-07-31 16:15:44 +00001505 def _process_short_opts(self, rargs, values):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001506 arg = rargs.pop(0)
Greg Wardeba20e62004-07-31 16:15:44 +00001507 stop = False
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001508 i = 1
1509 for ch in arg[1:]:
1510 opt = "-" + ch
1511 option = self._short_opt.get(opt)
1512 i += 1 # we have consumed a character
1513
1514 if not option:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001515 raise BadOptionError(opt)
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001516 if option.takes_value():
1517 # Any characters left in arg? Pretend they're the
1518 # next arg, and stop consuming characters of arg.
1519 if i < len(arg):
1520 rargs.insert(0, arg[i:])
Greg Wardeba20e62004-07-31 16:15:44 +00001521 stop = True
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001522
1523 nargs = option.nargs
1524 if len(rargs) < nargs:
1525 if nargs == 1:
Greg Wardeba20e62004-07-31 16:15:44 +00001526 self.error(_("%s option requires an argument") % opt)
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001527 else:
Greg Wardeba20e62004-07-31 16:15:44 +00001528 self.error(_("%s option requires %d arguments")
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001529 % (opt, nargs))
1530 elif nargs == 1:
1531 value = rargs.pop(0)
1532 else:
1533 value = tuple(rargs[0:nargs])
1534 del rargs[0:nargs]
1535
1536 else: # option doesn't take a value
1537 value = None
1538
1539 option.process(opt, value, values, self)
1540
1541 if stop:
1542 break
1543
1544
1545 # -- Feedback methods ----------------------------------------------
1546
Greg Wardeba20e62004-07-31 16:15:44 +00001547 def get_prog_name(self):
1548 if self.prog is None:
1549 return os.path.basename(sys.argv[0])
1550 else:
1551 return self.prog
1552
1553 def expand_prog_name(self, s):
1554 return s.replace("%prog", self.get_prog_name())
1555
1556 def get_description(self):
1557 return self.expand_prog_name(self.description)
1558
Greg Ward48aa84b2004-10-27 02:20:04 +00001559 def exit(self, status=0, msg=None):
1560 if msg:
1561 sys.stderr.write(msg)
1562 sys.exit(status)
1563
Greg Wardeba20e62004-07-31 16:15:44 +00001564 def error(self, msg):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001565 """error(msg : string)
1566
1567 Print a usage message incorporating 'msg' to stderr and exit.
1568 If you override this in a subclass, it should not return -- it
1569 should either exit or raise an exception.
1570 """
1571 self.print_usage(sys.stderr)
Greg Ward48aa84b2004-10-27 02:20:04 +00001572 self.exit(2, "%s: error: %s\n" % (self.get_prog_name(), msg))
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001573
Greg Wardeba20e62004-07-31 16:15:44 +00001574 def get_usage(self):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001575 if self.usage:
1576 return self.formatter.format_usage(
Greg Wardeba20e62004-07-31 16:15:44 +00001577 self.expand_prog_name(self.usage))
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001578 else:
1579 return ""
1580
Greg Wardeba20e62004-07-31 16:15:44 +00001581 def print_usage(self, file=None):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001582 """print_usage(file : file = stdout)
1583
1584 Print the usage message for the current program (self.usage) to
Mark Dickinson934896d2009-02-21 20:59:32 +00001585 'file' (default stdout). Any occurrence of the string "%prog" in
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001586 self.usage is replaced with the name of the current program
1587 (basename of sys.argv[0]). Does nothing if self.usage is empty
1588 or not defined.
1589 """
1590 if self.usage:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001591 print(self.get_usage(), file=file)
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001592
Greg Wardeba20e62004-07-31 16:15:44 +00001593 def get_version(self):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001594 if self.version:
Greg Wardeba20e62004-07-31 16:15:44 +00001595 return self.expand_prog_name(self.version)
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001596 else:
1597 return ""
1598
Greg Wardeba20e62004-07-31 16:15:44 +00001599 def print_version(self, file=None):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001600 """print_version(file : file = stdout)
1601
1602 Print the version message for this program (self.version) to
Mark Dickinson934896d2009-02-21 20:59:32 +00001603 'file' (default stdout). As with print_usage(), any occurrence
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001604 of "%prog" in self.version is replaced by the current program's
1605 name. Does nothing if self.version is empty or undefined.
1606 """
1607 if self.version:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001608 print(self.get_version(), file=file)
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001609
Greg Wardeba20e62004-07-31 16:15:44 +00001610 def format_option_help(self, formatter=None):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001611 if formatter is None:
1612 formatter = self.formatter
1613 formatter.store_option_strings(self)
1614 result = []
Thomas Wouters477c8d52006-05-27 19:21:47 +00001615 result.append(formatter.format_heading(_("Options")))
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001616 formatter.indent()
1617 if self.option_list:
1618 result.append(OptionContainer.format_option_help(self, formatter))
1619 result.append("\n")
1620 for group in self.option_groups:
1621 result.append(group.format_help(formatter))
1622 result.append("\n")
1623 formatter.dedent()
1624 # Drop the last "\n", or the header if no options or option groups:
1625 return "".join(result[:-1])
1626
Thomas Wouters477c8d52006-05-27 19:21:47 +00001627 def format_epilog(self, formatter):
1628 return formatter.format_epilog(self.epilog)
1629
Greg Wardeba20e62004-07-31 16:15:44 +00001630 def format_help(self, formatter=None):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001631 if formatter is None:
1632 formatter = self.formatter
1633 result = []
1634 if self.usage:
1635 result.append(self.get_usage() + "\n")
1636 if self.description:
1637 result.append(self.format_description(formatter) + "\n")
1638 result.append(self.format_option_help(formatter))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001639 result.append(self.format_epilog(formatter))
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001640 return "".join(result)
1641
Greg Wardeba20e62004-07-31 16:15:44 +00001642 def print_help(self, file=None):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001643 """print_help(file : file = stdout)
1644
1645 Print an extended help message, listing all options and any
1646 help text provided with them, to 'file' (default stdout).
1647 """
1648 if file is None:
1649 file = sys.stdout
Guido van Rossum34d19282007-08-09 01:03:29 +00001650 file.write(self.format_help())
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001651
1652# class OptionParser
1653
1654
Greg Wardeba20e62004-07-31 16:15:44 +00001655def _match_abbrev(s, wordmap):
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001656 """_match_abbrev(s : string, wordmap : {string : Option}) -> string
1657
1658 Return the string key in 'wordmap' for which 's' is an unambiguous
1659 abbreviation. If 's' is found to be ambiguous or doesn't match any of
1660 'words', raise BadOptionError.
1661 """
1662 # Is there an exact match?
Guido van Rossume2b70bc2006-08-18 22:13:04 +00001663 if s in wordmap:
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001664 return s
1665 else:
1666 # Isolate all words with s as a prefix.
1667 possibilities = [word for word in wordmap.keys()
1668 if word.startswith(s)]
1669 # No exact match, so there had better be just one possibility.
1670 if len(possibilities) == 1:
1671 return possibilities[0]
1672 elif not possibilities:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001673 raise BadOptionError(s)
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001674 else:
1675 # More than one possible completion: ambiguous prefix.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001676 possibilities.sort()
Thomas Wouters477c8d52006-05-27 19:21:47 +00001677 raise AmbiguousOptionError(s, possibilities)
Guido van Rossumb9ba4582002-11-14 22:00:19 +00001678
1679
1680# Some day, there might be many Option classes. As of Optik 1.3, the
1681# preferred way to instantiate Options is indirectly, via make_option(),
1682# which will become a factory function when there are many Option
1683# classes.
1684make_option = Option