1"""A powerful, extensible, and easy-to-use option parser. 2 3By Greg Ward <gward@python.net> 4 5Originally distributed as Optik. 6 7For support, use the optik-users@lists.sourceforge.net mailing list 8(http://lists.sourceforge.net/lists/listinfo/optik-users). 9 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() 22""" 23 24__version__ = "1.5.3" 25 26__all__ = ['Option', 27 'make_option', 28 'SUPPRESS_HELP', 29 'SUPPRESS_USAGE', 30 'Values', 31 'OptionContainer', 32 'OptionGroup', 33 'OptionParser', 34 'HelpFormatter', 35 'IndentedHelpFormatter', 36 'TitledHelpFormatter', 37 'OptParseError', 38 'OptionError', 39 'OptionConflictError', 40 'OptionValueError', 41 'BadOptionError', 42 'check_choice'] 43 44__copyright__ = """ 45Copyright (c) 2001-2006 Gregory P. Ward. All rights reserved. 46Copyright (c) 2002-2006 Python Software Foundation. All rights reserved. 47 48Redistribution and use in source and binary forms, with or without 49modification, are permitted provided that the following conditions are 50met: 51 52 * Redistributions of source code must retain the above copyright 53 notice, this list of conditions and the following disclaimer. 54 55 * Redistributions in binary form must reproduce the above copyright 56 notice, this list of conditions and the following disclaimer in the 57 documentation and/or other materials provided with the distribution. 58 59 * Neither the name of the author nor the names of its 60 contributors may be used to endorse or promote products derived from 61 this software without specific prior written permission. 62 63THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 64IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 65TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 66PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR 67CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 68EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 69PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 70PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 71LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 72NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 73SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 74""" 75 76import sys, os 77import textwrap 78 79def _repr(self): 80 return "<%s at 0x%x: %s>" % (self.__class__.__name__, id(self), self) 81 82 83# This file was generated from: 84# Id: option_parser.py 527 2006-07-23 15:21:30Z greg 85# Id: option.py 522 2006-06-11 16:22:03Z gward 86# Id: help.py 527 2006-07-23 15:21:30Z greg 87# Id: errors.py 509 2006-04-20 00:58:24Z gward 88 89try: 90 from gettext import gettext, ngettext 91except ImportError: 92 def gettext(message): 93 return message 94 95 def ngettext(singular, plural, n): 96 if n == 1: 97 return singular 98 return plural 99 100_ = gettext 101 102 103class OptParseError (Exception): 104 def __init__(self, msg): 105 self.msg = msg 106 107 def __str__(self): 108 return self.msg 109 110 111class OptionError (OptParseError): 112 """ 113 Raised if an Option instance is created with invalid or 114 inconsistent arguments. 115 """ 116 117 def __init__(self, msg, option): 118 self.msg = msg 119 self.option_id = str(option) 120 121 def __str__(self): 122 if self.option_id: 123 return "option %s: %s" % (self.option_id, self.msg) 124 else: 125 return self.msg 126 127class OptionConflictError (OptionError): 128 """ 129 Raised if conflicting options are added to an OptionParser. 130 """ 131 132class OptionValueError (OptParseError): 133 """ 134 Raised if an invalid option value is encountered on the command 135 line. 136 """ 137 138class BadOptionError (OptParseError): 139 """ 140 Raised if an invalid option is seen on the command line. 141 """ 142 def __init__(self, opt_str): 143 self.opt_str = opt_str 144 145 def __str__(self): 146 return _("no such option: %s") % self.opt_str 147 148class AmbiguousOptionError (BadOptionError): 149 """ 150 Raised if an ambiguous option is seen on the command line. 151 """ 152 def __init__(self, opt_str, possibilities): 153 BadOptionError.__init__(self, opt_str) 154 self.possibilities = possibilities 155 156 def __str__(self): 157 return (_("ambiguous option: %s (%s?)") 158 % (self.opt_str, ", ".join(self.possibilities))) 159 160 161class HelpFormatter: 162 163 """ 164 Abstract base class for formatting option help. OptionParser 165 instances should use one of the HelpFormatter subclasses for 166 formatting help; by default IndentedHelpFormatter is used. 167 168 Instance attributes: 169 parser : OptionParser 170 the controlling OptionParser instance 171 indent_increment : int 172 the number of columns to indent per nesting level 173 max_help_position : int 174 the maximum starting column for option help text 175 help_position : int 176 the calculated starting column for option help text; 177 initially the same as the maximum 178 width : int 179 total number of columns for output (pass None to constructor for 180 this value to be taken from the $COLUMNS environment variable) 181 level : int 182 current indentation level 183 current_indent : int 184 current indentation level (in columns) 185 help_width : int 186 number of columns available for option help text (calculated) 187 default_tag : str 188 text to replace with each option's default value, "%default" 189 by default. Set to false value to disable default value expansion. 190 option_strings : { Option : str } 191 maps Option instances to the snippet of help text explaining 192 the syntax of that option, e.g. "-h, --help" or 193 "-fFILE, --file=FILE" 194 _short_opt_fmt : str 195 format string controlling how short options with values are 196 printed in help text. Must be either "%s%s" ("-fFILE") or 197 "%s %s" ("-f FILE"), because those are the two syntaxes that 198 Optik supports. 199 _long_opt_fmt : str 200 similar but for long options; must be either "%s %s" ("--file FILE") 201 or "%s=%s" ("--file=FILE"). 202 """ 203 204 NO_DEFAULT_VALUE = "none" 205 206 def __init__(self, 207 indent_increment, 208 max_help_position, 209 width, 210 short_first): 211 self.parser = None 212 self.indent_increment = indent_increment 213 if width is None: 214 try: 215 width = int(os.environ['COLUMNS']) 216 except (KeyError, ValueError): 217 width = 80 218 width -= 2 219 self.width = width 220 self.help_position = self.max_help_position = \ 221 min(max_help_position, max(width - 20, indent_increment * 2)) 222 self.current_indent = 0 223 self.level = 0 224 self.help_width = None # computed later 225 self.short_first = short_first 226 self.default_tag = "%default" 227 self.option_strings = {} 228 self._short_opt_fmt = "%s %s" 229 self._long_opt_fmt = "%s=%s" 230 231 def set_parser(self, parser): 232 self.parser = parser 233 234 def set_short_opt_delimiter(self, delim): 235 if delim not in ("", " "): 236 raise ValueError( 237 "invalid metavar delimiter for short options: %r" % delim) 238 self._short_opt_fmt = "%s" + delim + "%s" 239 240 def set_long_opt_delimiter(self, delim): 241 if delim not in ("=", " "): 242 raise ValueError( 243 "invalid metavar delimiter for long options: %r" % delim) 244 self._long_opt_fmt = "%s" + delim + "%s" 245 246 def indent(self): 247 self.current_indent += self.indent_increment 248 self.level += 1 249 250 def dedent(self): 251 self.current_indent -= self.indent_increment 252 assert self.current_indent >= 0, "Indent decreased below 0." 253 self.level -= 1 254 255 def format_usage(self, usage): 256 raise NotImplementedError("subclasses must implement") 257 258 def format_heading(self, heading): 259 raise NotImplementedError("subclasses must implement") 260 261 def _format_text(self, text): 262 """ 263 Format a paragraph of free-form text for inclusion in the 264 help output at the current indentation level. 265 """ 266 text_width = max(self.width - self.current_indent, 11) 267 indent = " "*self.current_indent 268 return textwrap.fill(text, 269 text_width, 270 initial_indent=indent, 271 subsequent_indent=indent) 272 273 def format_description(self, description): 274 if description: 275 return self._format_text(description) + "\n" 276 else: 277 return "" 278 279 def format_epilog(self, epilog): 280 if epilog: 281 return "\n" + self._format_text(epilog) + "\n" 282 else: 283 return "" 284 285 286 def expand_default(self, option): 287 if self.parser is None or not self.default_tag: 288 return option.help 289 290 default_value = self.parser.defaults.get(option.dest) 291 if default_value is NO_DEFAULT or default_value is None: 292 default_value = self.NO_DEFAULT_VALUE 293 294 return option.help.replace(self.default_tag, str(default_value)) 295 296 def format_option(self, option): 297 # The help for each option consists of two parts: 298 # * the opt strings and metavars 299 # eg. ("-x", or "-fFILENAME, --file=FILENAME") 300 # * the user-supplied help string 301 # eg. ("turn on expert mode", "read data from FILENAME") 302 # 303 # If possible, we write both of these on the same line: 304 # -x turn on expert mode 305 # 306 # But if the opt string list is too long, we put the help 307 # string on a second line, indented to the same column it would 308 # start in if it fit on the first line. 309 # -fFILENAME, --file=FILENAME 310 # read data from FILENAME 311 result = [] 312 opts = self.option_strings[option] 313 opt_width = self.help_position - self.current_indent - 2 314 if len(opts) > opt_width: 315 opts = "%*s%s\n" % (self.current_indent, "", opts) 316 indent_first = self.help_position 317 else: # start help on same line as opts 318 opts = "%*s%-*s " % (self.current_indent, "", opt_width, opts) 319 indent_first = 0 320 result.append(opts) 321 if option.help: 322 help_text = self.expand_default(option) 323 help_lines = textwrap.wrap(help_text, self.help_width) 324 result.append("%*s%s\n" % (indent_first, "", help_lines[0])) 325 result.extend(["%*s%s\n" % (self.help_position, "", line) 326 for line in help_lines[1:]]) 327 elif opts[-1] != "\n": 328 result.append("\n") 329 return "".join(result) 330 331 def store_option_strings(self, parser): 332 self.indent() 333 max_len = 0 334 for opt in parser.option_list: 335 strings = self.format_option_strings(opt) 336 self.option_strings[opt] = strings 337 max_len = max(max_len, len(strings) + self.current_indent) 338 self.indent() 339 for group in parser.option_groups: 340 for opt in group.option_list: 341 strings = self.format_option_strings(opt) 342 self.option_strings[opt] = strings 343 max_len = max(max_len, len(strings) + self.current_indent) 344 self.dedent() 345 self.dedent() 346 self.help_position = min(max_len + 2, self.max_help_position) 347 self.help_width = max(self.width - self.help_position, 11) 348 349 def format_option_strings(self, option): 350 """Return a comma-separated list of option strings & metavariables.""" 351 if option.takes_value(): 352 metavar = option.metavar or option.dest.upper() 353 short_opts = [self._short_opt_fmt % (sopt, metavar) 354 for sopt in option._short_opts] 355 long_opts = [self._long_opt_fmt % (lopt, metavar) 356 for lopt in option._long_opts] 357 else: 358 short_opts = option._short_opts 359 long_opts = option._long_opts 360 361 if self.short_first: 362 opts = short_opts + long_opts 363 else: 364 opts = long_opts + short_opts 365 366 return ", ".join(opts) 367 368class IndentedHelpFormatter (HelpFormatter): 369 """Format help with indented section bodies. 370 """ 371 372 def __init__(self, 373 indent_increment=2, 374 max_help_position=24, 375 width=None, 376 short_first=1): 377 HelpFormatter.__init__( 378 self, indent_increment, max_help_position, width, short_first) 379 380 def format_usage(self, usage): 381 return _("Usage: %s\n") % usage 382 383 def format_heading(self, heading): 384 return "%*s%s:\n" % (self.current_indent, "", heading) 385 386 387class TitledHelpFormatter (HelpFormatter): 388 """Format help with underlined section headers. 389 """ 390 391 def __init__(self, 392 indent_increment=0, 393 max_help_position=24, 394 width=None, 395 short_first=0): 396 HelpFormatter.__init__ ( 397 self, indent_increment, max_help_position, width, short_first) 398 399 def format_usage(self, usage): 400 return "%s %s\n" % (self.format_heading(_("Usage")), usage) 401 402 def format_heading(self, heading): 403 return "%s\n%s\n" % (heading, "=-"[self.level] * len(heading)) 404 405 406def _parse_num(val, type): 407 if val[:2].lower() == "0x": # hexadecimal 408 radix = 16 409 elif val[:2].lower() == "0b": # binary 410 radix = 2 411 val = val[2:] or "0" # have to remove "0b" prefix 412 elif val[:1] == "0": # octal 413 radix = 8 414 else: # decimal 415 radix = 10 416 417 return type(val, radix) 418 419def _parse_int(val): 420 return _parse_num(val, int) 421 422_builtin_cvt = { "int" : (_parse_int, _("integer")), 423 "long" : (_parse_int, _("integer")), 424 "float" : (float, _("floating-point")), 425 "complex" : (complex, _("complex")) } 426 427def check_builtin(option, opt, value): 428 (cvt, what) = _builtin_cvt[option.type] 429 try: 430 return cvt(value) 431 except ValueError: 432 raise OptionValueError( 433 _("option %s: invalid %s value: %r") % (opt, what, value)) 434 435def check_choice(option, opt, value): 436 if value in option.choices: 437 return value 438 else: 439 choices = ", ".join(map(repr, option.choices)) 440 raise OptionValueError( 441 _("option %s: invalid choice: %r (choose from %s)") 442 % (opt, value, choices)) 443 444# Not supplying a default is different from a default of None, 445# so we need an explicit "not supplied" value. 446NO_DEFAULT = ("NO", "DEFAULT") 447 448 449class Option: 450 """ 451 Instance attributes: 452 _short_opts : [string] 453 _long_opts : [string] 454 455 action : string 456 type : string 457 dest : string 458 default : any 459 nargs : int 460 const : any 461 choices : [string] 462 callback : function 463 callback_args : (any*) 464 callback_kwargs : { string : any } 465 help : string 466 metavar : string 467 """ 468 469 # The list of instance attributes that may be set through 470 # keyword args to the constructor. 471 ATTRS = ['action', 472 'type', 473 'dest', 474 'default', 475 'nargs', 476 'const', 477 'choices', 478 'callback', 479 'callback_args', 480 'callback_kwargs', 481 'help', 482 'metavar'] 483 484 # The set of actions allowed by option parsers. Explicitly listed 485 # here so the constructor can validate its arguments. 486 ACTIONS = ("store", 487 "store_const", 488 "store_true", 489 "store_false", 490 "append", 491 "append_const", 492 "count", 493 "callback", 494 "help", 495 "version") 496 497 # The set of actions that involve storing a value somewhere; 498 # also listed just for constructor argument validation. (If 499 # the action is one of these, there must be a destination.) 500 STORE_ACTIONS = ("store", 501 "store_const", 502 "store_true", 503 "store_false", 504 "append", 505 "append_const", 506 "count") 507 508 # The set of actions for which it makes sense to supply a value 509 # type, ie. which may consume an argument from the command line. 510 TYPED_ACTIONS = ("store", 511 "append", 512 "callback") 513 514 # The set of actions which *require* a value type, ie. that 515 # always consume an argument from the command line. 516 ALWAYS_TYPED_ACTIONS = ("store", 517 "append") 518 519 # The set of actions which take a 'const' attribute. 520 CONST_ACTIONS = ("store_const", 521 "append_const") 522 523 # The set of known types for option parsers. Again, listed here for 524 # constructor argument validation. 525 TYPES = ("string", "int", "long", "float", "complex", "choice") 526 527 # Dictionary of argument checking functions, which convert and 528 # validate option arguments according to the option type. 529 # 530 # Signature of checking functions is: 531 # check(option : Option, opt : string, value : string) -> any 532 # where 533 # option is the Option instance calling the checker 534 # opt is the actual option seen on the command-line 535 # (eg. "-a", "--file") 536 # value is the option argument seen on the command-line 537 # 538 # The return value should be in the appropriate Python type 539 # for option.type -- eg. an integer if option.type == "int". 540 # 541 # If no checker is defined for a type, arguments will be 542 # unchecked and remain strings. 543 TYPE_CHECKER = { "int" : check_builtin, 544 "long" : check_builtin, 545 "float" : check_builtin, 546 "complex": check_builtin, 547 "choice" : check_choice, 548 } 549 550 551 # CHECK_METHODS is a list of unbound method objects; they are called 552 # by the constructor, in order, after all attributes are 553 # initialized. The list is created and filled in later, after all 554 # the methods are actually defined. (I just put it here because I 555 # like to define and document all class attributes in the same 556 # place.) Subclasses that add another _check_*() method should 557 # define their own CHECK_METHODS list that adds their check method 558 # to those from this class. 559 CHECK_METHODS = None 560 561 562 # -- Constructor/initialization methods ---------------------------- 563 564 def __init__(self, *opts, **attrs): 565 # Set _short_opts, _long_opts attrs from 'opts' tuple. 566 # Have to be set now, in case no option strings are supplied. 567 self._short_opts = [] 568 self._long_opts = [] 569 opts = self._check_opt_strings(opts) 570 self._set_opt_strings(opts) 571 572 # Set all other attrs (action, type, etc.) from 'attrs' dict 573 self._set_attrs(attrs) 574 575 # Check all the attributes we just set. There are lots of 576 # complicated interdependencies, but luckily they can be farmed 577 # out to the _check_*() methods listed in CHECK_METHODS -- which 578 # could be handy for subclasses! The one thing these all share 579 # is that they raise OptionError if they discover a problem. 580 for checker in self.CHECK_METHODS: 581 checker(self) 582 583 def _check_opt_strings(self, opts): 584 # Filter out None because early versions of Optik had exactly 585 # one short option and one long option, either of which 586 # could be None. 587 opts = [opt for opt in opts if opt] 588 if not opts: 589 raise TypeError("at least one option string must be supplied") 590 return opts 591 592 def _set_opt_strings(self, opts): 593 for opt in opts: 594 if len(opt) < 2: 595 raise OptionError( 596 "invalid option string %r: " 597 "must be at least two characters long" % opt, self) 598 elif len(opt) == 2: 599 if not (opt[0] == "-" and opt[1] != "-"): 600 raise OptionError( 601 "invalid short option string %r: " 602 "must be of the form -x, (x any non-dash char)" % opt, 603 self) 604 self._short_opts.append(opt) 605 else: 606 if not (opt[0:2] == "--" and opt[2] != "-"): 607 raise OptionError( 608 "invalid long option string %r: " 609 "must start with --, followed by non-dash" % opt, 610 self) 611 self._long_opts.append(opt) 612 613 def _set_attrs(self, attrs): 614 for attr in self.ATTRS: 615 if attr in attrs: 616 setattr(self, attr, attrs[attr]) 617 del attrs[attr] 618 else: 619 if attr == 'default': 620 setattr(self, attr, NO_DEFAULT) 621 else: 622 setattr(self, attr, None) 623 if attrs: 624 attrs = sorted(attrs.keys()) 625 raise OptionError( 626 "invalid keyword arguments: %s" % ", ".join(attrs), 627 self) 628 629 630 # -- Constructor validation methods -------------------------------- 631 632 def _check_action(self): 633 if self.action is None: 634 self.action = "store" 635 elif self.action not in self.ACTIONS: 636 raise OptionError("invalid action: %r" % self.action, self) 637 638 def _check_type(self): 639 if self.type is None: 640 if self.action in self.ALWAYS_TYPED_ACTIONS: 641 if self.choices is not None: 642 # The "choices" attribute implies "choice" type. 643 self.type = "choice" 644 else: 645 # No type given? "string" is the most sensible default. 646 self.type = "string" 647 else: 648 # Allow type objects or builtin type conversion functions 649 # (int, str, etc.) as an alternative to their names. 650 if isinstance(self.type, type): 651 self.type = self.type.__name__ 652 653 if self.type == "str": 654 self.type = "string" 655 656 if self.type not in self.TYPES: 657 raise OptionError("invalid option type: %r" % self.type, self) 658 if self.action not in self.TYPED_ACTIONS: 659 raise OptionError( 660 "must not supply a type for action %r" % self.action, self) 661 662 def _check_choice(self): 663 if self.type == "choice": 664 if self.choices is None: 665 raise OptionError( 666 "must supply a list of choices for type 'choice'", self) 667 elif not isinstance(self.choices, (tuple, list)): 668 raise OptionError( 669 "choices must be a list of strings ('%s' supplied)" 670 % str(type(self.choices)).split("'")[1], self) 671 elif self.choices is not None: 672 raise OptionError( 673 "must not supply choices for type %r" % self.type, self) 674 675 def _check_dest(self): 676 # No destination given, and we need one for this action. The 677 # self.type check is for callbacks that take a value. 678 takes_value = (self.action in self.STORE_ACTIONS or 679 self.type is not None) 680 if self.dest is None and takes_value: 681 682 # Glean a destination from the first long option string, 683 # or from the first short option string if no long options. 684 if self._long_opts: 685 # eg. "--foo-bar" -> "foo_bar" 686 self.dest = self._long_opts[0][2:].replace('-', '_') 687 else: 688 self.dest = self._short_opts[0][1] 689 690 def _check_const(self): 691 if self.action not in self.CONST_ACTIONS and self.const is not None: 692 raise OptionError( 693 "'const' must not be supplied for action %r" % self.action, 694 self) 695 696 def _check_nargs(self): 697 if self.action in self.TYPED_ACTIONS: 698 if self.nargs is None: 699 self.nargs = 1 700 elif self.nargs is not None: 701 raise OptionError( 702 "'nargs' must not be supplied for action %r" % self.action, 703 self) 704 705 def _check_callback(self): 706 if self.action == "callback": 707 if not callable(self.callback): 708 raise OptionError( 709 "callback not callable: %r" % self.callback, self) 710 if (self.callback_args is not None and 711 not isinstance(self.callback_args, tuple)): 712 raise OptionError( 713 "callback_args, if supplied, must be a tuple: not %r" 714 % self.callback_args, self) 715 if (self.callback_kwargs is not None and 716 not isinstance(self.callback_kwargs, dict)): 717 raise OptionError( 718 "callback_kwargs, if supplied, must be a dict: not %r" 719 % self.callback_kwargs, self) 720 else: 721 if self.callback is not None: 722 raise OptionError( 723 "callback supplied (%r) for non-callback option" 724 % self.callback, self) 725 if self.callback_args is not None: 726 raise OptionError( 727 "callback_args supplied for non-callback option", self) 728 if self.callback_kwargs is not None: 729 raise OptionError( 730 "callback_kwargs supplied for non-callback option", self) 731 732 733 CHECK_METHODS = [_check_action, 734 _check_type, 735 _check_choice, 736 _check_dest, 737 _check_const, 738 _check_nargs, 739 _check_callback] 740 741 742 # -- Miscellaneous methods ----------------------------------------- 743 744 def __str__(self): 745 return "/".join(self._short_opts + self._long_opts) 746 747 __repr__ = _repr 748 749 def takes_value(self): 750 return self.type is not None 751 752 def get_opt_string(self): 753 if self._long_opts: 754 return self._long_opts[0] 755 else: 756 return self._short_opts[0] 757 758 759 # -- Processing methods -------------------------------------------- 760 761 def check_value(self, opt, value): 762 checker = self.TYPE_CHECKER.get(self.type) 763 if checker is None: 764 return value 765 else: 766 return checker(self, opt, value) 767 768 def convert_value(self, opt, value): 769 if value is not None: 770 if self.nargs == 1: 771 return self.check_value(opt, value) 772 else: 773 return tuple([self.check_value(opt, v) for v in value]) 774 775 def process(self, opt, value, values, parser): 776 777 # First, convert the value(s) to the right type. Howl if any 778 # value(s) are bogus. 779 value = self.convert_value(opt, value) 780 781 # And then take whatever action is expected of us. 782 # This is a separate method to make life easier for 783 # subclasses to add new actions. 784 return self.take_action( 785 self.action, self.dest, opt, value, values, parser) 786 787 def take_action(self, action, dest, opt, value, values, parser): 788 if action == "store": 789 setattr(values, dest, value) 790 elif action == "store_const": 791 setattr(values, dest, self.const) 792 elif action == "store_true": 793 setattr(values, dest, True) 794 elif action == "store_false": 795 setattr(values, dest, False) 796 elif action == "append": 797 values.ensure_value(dest, []).append(value) 798 elif action == "append_const": 799 values.ensure_value(dest, []).append(self.const) 800 elif action == "count": 801 setattr(values, dest, values.ensure_value(dest, 0) + 1) 802 elif action == "callback": 803 args = self.callback_args or () 804 kwargs = self.callback_kwargs or {} 805 self.callback(self, opt, value, parser, *args, **kwargs) 806 elif action == "help": 807 parser.print_help() 808 parser.exit() 809 elif action == "version": 810 parser.print_version() 811 parser.exit() 812 else: 813 raise ValueError("unknown action %r" % self.action) 814 815 return 1 816 817# class Option 818 819 820SUPPRESS_HELP = "SUPPRESS"+"HELP" 821SUPPRESS_USAGE = "SUPPRESS"+"USAGE" 822 823class Values: 824 825 def __init__(self, defaults=None): 826 if defaults: 827 for (attr, val) in defaults.items(): 828 setattr(self, attr, val) 829 830 def __str__(self): 831 return str(self.__dict__) 832 833 __repr__ = _repr 834 835 def __eq__(self, other): 836 if isinstance(other, Values): 837 return self.__dict__ == other.__dict__ 838 elif isinstance(other, dict): 839 return self.__dict__ == other 840 else: 841 return NotImplemented 842 843 def _update_careful(self, dict): 844 """ 845 Update the option values from an arbitrary dictionary, but only 846 use keys from dict that already have a corresponding attribute 847 in self. Any keys in dict without a corresponding attribute 848 are silently ignored. 849 """ 850 for attr in dir(self): 851 if attr in dict: 852 dval = dict[attr] 853 if dval is not None: 854 setattr(self, attr, dval) 855 856 def _update_loose(self, dict): 857 """ 858 Update the option values from an arbitrary dictionary, 859 using all keys from the dictionary regardless of whether 860 they have a corresponding attribute in self or not. 861 """ 862 self.__dict__.update(dict) 863 864 def _update(self, dict, mode): 865 if mode == "careful": 866 self._update_careful(dict) 867 elif mode == "loose": 868 self._update_loose(dict) 869 else: 870 raise ValueError("invalid update mode: %r" % mode) 871 872 def read_module(self, modname, mode="careful"): 873 __import__(modname) 874 mod = sys.modules[modname] 875 self._update(vars(mod), mode) 876 877 def read_file(self, filename, mode="careful"): 878 vars = {} 879 exec(open(filename).read(), vars) 880 self._update(vars, mode) 881 882 def ensure_value(self, attr, value): 883 if not hasattr(self, attr) or getattr(self, attr) is None: 884 setattr(self, attr, value) 885 return getattr(self, attr) 886 887 888class OptionContainer: 889 890 """ 891 Abstract base class. 892 893 Class attributes: 894 standard_option_list : [Option] 895 list of standard options that will be accepted by all instances 896 of this parser class (intended to be overridden by subclasses). 897 898 Instance attributes: 899 option_list : [Option] 900 the list of Option objects contained by this OptionContainer 901 _short_opt : { string : Option } 902 dictionary mapping short option strings, eg. "-f" or "-X", 903 to the Option instances that implement them. If an Option 904 has multiple short option strings, it will appear in this 905 dictionary multiple times. [1] 906 _long_opt : { string : Option } 907 dictionary mapping long option strings, eg. "--file" or 908 "--exclude", to the Option instances that implement them. 909 Again, a given Option can occur multiple times in this 910 dictionary. [1] 911 defaults : { string : any } 912 dictionary mapping option destination names to default 913 values for each destination [1] 914 915 [1] These mappings are common to (shared by) all components of the 916 controlling OptionParser, where they are initially created. 917 918 """ 919 920 def __init__(self, option_class, conflict_handler, description): 921 # Initialize the option list and related data structures. 922 # This method must be provided by subclasses, and it must 923 # initialize at least the following instance attributes: 924 # option_list, _short_opt, _long_opt, defaults. 925 self._create_option_list() 926 927 self.option_class = option_class 928 self.set_conflict_handler(conflict_handler) 929 self.set_description(description) 930 931 def _create_option_mappings(self): 932 # For use by OptionParser constructor -- create the main 933 # option mappings used by this OptionParser and all 934 # OptionGroups that it owns. 935 self._short_opt = {} # single letter -> Option instance 936 self._long_opt = {} # long option -> Option instance 937 self.defaults = {} # maps option dest -> default value 938 939 940 def _share_option_mappings(self, parser): 941 # For use by OptionGroup constructor -- use shared option 942 # mappings from the OptionParser that owns this OptionGroup. 943 self._short_opt = parser._short_opt 944 self._long_opt = parser._long_opt 945 self.defaults = parser.defaults 946 947 def set_conflict_handler(self, handler): 948 if handler not in ("error", "resolve"): 949 raise ValueError("invalid conflict_resolution value %r" % handler) 950 self.conflict_handler = handler 951 952 def set_description(self, description): 953 self.description = description 954 955 def get_description(self): 956 return self.description 957 958 959 def destroy(self): 960 """see OptionParser.destroy().""" 961 del self._short_opt 962 del self._long_opt 963 del self.defaults 964 965 966 # -- Option-adding methods ----------------------------------------- 967 968 def _check_conflict(self, option): 969 conflict_opts = [] 970 for opt in option._short_opts: 971 if opt in self._short_opt: 972 conflict_opts.append((opt, self._short_opt[opt])) 973 for opt in option._long_opts: 974 if opt in self._long_opt: 975 conflict_opts.append((opt, self._long_opt[opt])) 976 977 if conflict_opts: 978 handler = self.conflict_handler 979 if handler == "error": 980 raise OptionConflictError( 981 "conflicting option string(s): %s" 982 % ", ".join([co[0] for co in conflict_opts]), 983 option) 984 elif handler == "resolve": 985 for (opt, c_option) in conflict_opts: 986 if opt.startswith("--"): 987 c_option._long_opts.remove(opt) 988 del self._long_opt[opt] 989 else: 990 c_option._short_opts.remove(opt) 991 del self._short_opt[opt] 992 if not (c_option._short_opts or c_option._long_opts): 993 c_option.container.option_list.remove(c_option) 994 995 def add_option(self, *args, **kwargs): 996 """add_option(Option) 997 add_option(opt_str, ..., kwarg=val, ...) 998 """ 999 if isinstance(args[0], str): 1000 option = self.option_class(*args, **kwargs) 1001 elif len(args) == 1 and not kwargs: 1002 option = args[0] 1003 if not isinstance(option, Option): 1004 raise TypeError("not an Option instance: %r" % option) 1005 else: 1006 raise TypeError("invalid arguments") 1007 1008 self._check_conflict(option) 1009 1010 self.option_list.append(option) 1011 option.container = self 1012 for opt in option._short_opts: 1013 self._short_opt[opt] = option 1014 for opt in option._long_opts: 1015 self._long_opt[opt] = option 1016 1017 if option.dest is not None: # option has a dest, we need a default 1018 if option.default is not NO_DEFAULT: 1019 self.defaults[option.dest] = option.default 1020 elif option.dest not in self.defaults: 1021 self.defaults[option.dest] = None 1022 1023 return option 1024 1025 def add_options(self, option_list): 1026 for option in option_list: 1027 self.add_option(option) 1028 1029 # -- Option query/removal methods ---------------------------------- 1030 1031 def get_option(self, opt_str): 1032 return (self._short_opt.get(opt_str) or 1033 self._long_opt.get(opt_str)) 1034 1035 def has_option(self, opt_str): 1036 return (opt_str in self._short_opt or 1037 opt_str in self._long_opt) 1038 1039 def remove_option(self, opt_str): 1040 option = self._short_opt.get(opt_str) 1041 if option is None: 1042 option = self._long_opt.get(opt_str) 1043 if option is None: 1044 raise ValueError("no such option %r" % opt_str) 1045 1046 for opt in option._short_opts: 1047 del self._short_opt[opt] 1048 for opt in option._long_opts: 1049 del self._long_opt[opt] 1050 option.container.option_list.remove(option) 1051 1052 1053 # -- Help-formatting methods --------------------------------------- 1054 1055 def format_option_help(self, formatter): 1056 if not self.option_list: 1057 return "" 1058 result = [] 1059 for option in self.option_list: 1060 if not option.help is SUPPRESS_HELP: 1061 result.append(formatter.format_option(option)) 1062 return "".join(result) 1063 1064 def format_description(self, formatter): 1065 return formatter.format_description(self.get_description()) 1066 1067 def format_help(self, formatter): 1068 result = [] 1069 if self.description: 1070 result.append(self.format_description(formatter)) 1071 if self.option_list: 1072 result.append(self.format_option_help(formatter)) 1073 return "\n".join(result) 1074 1075 1076class OptionGroup (OptionContainer): 1077 1078 def __init__(self, parser, title, description=None): 1079 self.parser = parser 1080 OptionContainer.__init__( 1081 self, parser.option_class, parser.conflict_handler, description) 1082 self.title = title 1083 1084 def _create_option_list(self): 1085 self.option_list = [] 1086 self._share_option_mappings(self.parser) 1087 1088 def set_title(self, title): 1089 self.title = title 1090 1091 def destroy(self): 1092 """see OptionParser.destroy().""" 1093 OptionContainer.destroy(self) 1094 del self.option_list 1095 1096 # -- Help-formatting methods --------------------------------------- 1097 1098 def format_help(self, formatter): 1099 result = formatter.format_heading(self.title) 1100 formatter.indent() 1101 result += OptionContainer.format_help(self, formatter) 1102 formatter.dedent() 1103 return result 1104 1105 1106class OptionParser (OptionContainer): 1107 1108 """ 1109 Class attributes: 1110 standard_option_list : [Option] 1111 list of standard options that will be accepted by all instances 1112 of this parser class (intended to be overridden by subclasses). 1113 1114 Instance attributes: 1115 usage : string 1116 a usage string for your program. Before it is displayed 1117 to the user, "%prog" will be expanded to the name of 1118 your program (self.prog or os.path.basename(sys.argv[0])). 1119 prog : string 1120 the name of the current program (to override 1121 os.path.basename(sys.argv[0])). 1122 description : string 1123 A paragraph of text giving a brief overview of your program. 1124 optparse reformats this paragraph to fit the current terminal 1125 width and prints it when the user requests help (after usage, 1126 but before the list of options). 1127 epilog : string 1128 paragraph of help text to print after option help 1129 1130 option_groups : [OptionGroup] 1131 list of option groups in this parser (option groups are 1132 irrelevant for parsing the command-line, but very useful 1133 for generating help) 1134 1135 allow_interspersed_args : bool = true 1136 if true, positional arguments may be interspersed with options. 1137 Assuming -a and -b each take a single argument, the command-line 1138 -ablah foo bar -bboo baz 1139 will be interpreted the same as 1140 -ablah -bboo -- foo bar baz 1141 If this flag were false, that command line would be interpreted as 1142 -ablah -- foo bar -bboo baz 1143 -- ie. we stop processing options as soon as we see the first 1144 non-option argument. (This is the tradition followed by 1145 Python's getopt module, Perl's Getopt::Std, and other argument- 1146 parsing libraries, but it is generally annoying to users.) 1147 1148 process_default_values : bool = true 1149 if true, option default values are processed similarly to option 1150 values from the command line: that is, they are passed to the 1151 type-checking function for the option's type (as long as the 1152 default value is a string). (This really only matters if you 1153 have defined custom types; see SF bug #955889.) Set it to false 1154 to restore the behaviour of Optik 1.4.1 and earlier. 1155 1156 rargs : [string] 1157 the argument list currently being parsed. Only set when 1158 parse_args() is active, and continually trimmed down as 1159 we consume arguments. Mainly there for the benefit of 1160 callback options. 1161 largs : [string] 1162 the list of leftover arguments that we have skipped while 1163 parsing options. If allow_interspersed_args is false, this 1164 list is always empty. 1165 values : Values 1166 the set of option values currently being accumulated. Only 1167 set when parse_args() is active. Also mainly for callbacks. 1168 1169 Because of the 'rargs', 'largs', and 'values' attributes, 1170 OptionParser is not thread-safe. If, for some perverse reason, you 1171 need to parse command-line arguments simultaneously in different 1172 threads, use different OptionParser instances. 1173 1174 """ 1175 1176 standard_option_list = [] 1177 1178 def __init__(self, 1179 usage=None, 1180 option_list=None, 1181 option_class=Option, 1182 version=None, 1183 conflict_handler="error", 1184 description=None, 1185 formatter=None, 1186 add_help_option=True, 1187 prog=None, 1188 epilog=None): 1189 OptionContainer.__init__( 1190 self, option_class, conflict_handler, description) 1191 self.set_usage(usage) 1192 self.prog = prog 1193 self.version = version 1194 self.allow_interspersed_args = True 1195 self.process_default_values = True 1196 if formatter is None: 1197 formatter = IndentedHelpFormatter() 1198 self.formatter = formatter 1199 self.formatter.set_parser(self) 1200 self.epilog = epilog 1201 1202 # Populate the option list; initial sources are the 1203 # standard_option_list class attribute, the 'option_list' 1204 # argument, and (if applicable) the _add_version_option() and 1205 # _add_help_option() methods. 1206 self._populate_option_list(option_list, 1207 add_help=add_help_option) 1208 1209 self._init_parsing_state() 1210 1211 1212 def destroy(self): 1213 """ 1214 Declare that you are done with this OptionParser. This cleans up 1215 reference cycles so the OptionParser (and all objects referenced by 1216 it) can be garbage-collected promptly. After calling destroy(), the 1217 OptionParser is unusable. 1218 """ 1219 OptionContainer.destroy(self) 1220 for group in self.option_groups: 1221 group.destroy() 1222 del self.option_list 1223 del self.option_groups 1224 del self.formatter 1225 1226 1227 # -- Private methods ----------------------------------------------- 1228 # (used by our or OptionContainer's constructor) 1229 1230 def _create_option_list(self): 1231 self.option_list = [] 1232 self.option_groups = [] 1233 self._create_option_mappings() 1234 1235 def _add_help_option(self): 1236 self.add_option("-h", "--help", 1237 action="help", 1238 help=_("show this help message and exit")) 1239 1240 def _add_version_option(self): 1241 self.add_option("--version", 1242 action="version", 1243 help=_("show program's version number and exit")) 1244 1245 def _populate_option_list(self, option_list, add_help=True): 1246 if self.standard_option_list: 1247 self.add_options(self.standard_option_list) 1248 if option_list: 1249 self.add_options(option_list) 1250 if self.version: 1251 self._add_version_option() 1252 if add_help: 1253 self._add_help_option() 1254 1255 def _init_parsing_state(self): 1256 # These are set in parse_args() for the convenience of callbacks. 1257 self.rargs = None 1258 self.largs = None 1259 self.values = None 1260 1261 1262 # -- Simple modifier methods --------------------------------------- 1263 1264 def set_usage(self, usage): 1265 if usage is None: 1266 self.usage = _("%prog [options]") 1267 elif usage is SUPPRESS_USAGE: 1268 self.usage = None 1269 # For backwards compatibility with Optik 1.3 and earlier. 1270 elif usage.lower().startswith("usage: "): 1271 self.usage = usage[7:] 1272 else: 1273 self.usage = usage 1274 1275 def enable_interspersed_args(self): 1276 """Set parsing to not stop on the first non-option, allowing 1277 interspersing switches with command arguments. This is the 1278 default behavior. See also disable_interspersed_args() and the 1279 class documentation description of the attribute 1280 allow_interspersed_args.""" 1281 self.allow_interspersed_args = True 1282 1283 def disable_interspersed_args(self): 1284 """Set parsing to stop on the first non-option. Use this if 1285 you have a command processor which runs another command that 1286 has options of its own and you want to make sure these options 1287 don't get confused. 1288 """ 1289 self.allow_interspersed_args = False 1290 1291 def set_process_default_values(self, process): 1292 self.process_default_values = process 1293 1294 def set_default(self, dest, value): 1295 self.defaults[dest] = value 1296 1297 def set_defaults(self, **kwargs): 1298 self.defaults.update(kwargs) 1299 1300 def _get_all_options(self): 1301 options = self.option_list[:] 1302 for group in self.option_groups: 1303 options.extend(group.option_list) 1304 return options 1305 1306 def get_default_values(self): 1307 if not self.process_default_values: 1308 # Old, pre-Optik 1.5 behaviour. 1309 return Values(self.defaults) 1310 1311 defaults = self.defaults.copy() 1312 for option in self._get_all_options(): 1313 default = defaults.get(option.dest) 1314 if isinstance(default, str): 1315 opt_str = option.get_opt_string() 1316 defaults[option.dest] = option.check_value(opt_str, default) 1317 1318 return Values(defaults) 1319 1320 1321 # -- OptionGroup methods ------------------------------------------- 1322 1323 def add_option_group(self, *args, **kwargs): 1324 # XXX lots of overlap with OptionContainer.add_option() 1325 if isinstance(args[0], str): 1326 group = OptionGroup(self, *args, **kwargs) 1327 elif len(args) == 1 and not kwargs: 1328 group = args[0] 1329 if not isinstance(group, OptionGroup): 1330 raise TypeError("not an OptionGroup instance: %r" % group) 1331 if group.parser is not self: 1332 raise ValueError("invalid OptionGroup (wrong parser)") 1333 else: 1334 raise TypeError("invalid arguments") 1335 1336 self.option_groups.append(group) 1337 return group 1338 1339 def get_option_group(self, opt_str): 1340 option = (self._short_opt.get(opt_str) or 1341 self._long_opt.get(opt_str)) 1342 if option and option.container is not self: 1343 return option.container 1344 return None 1345 1346 1347 # -- Option-parsing methods ---------------------------------------- 1348 1349 def _get_args(self, args): 1350 if args is None: 1351 return sys.argv[1:] 1352 else: 1353 return args[:] # don't modify caller's list 1354 1355 def parse_args(self, args=None, values=None): 1356 """ 1357 parse_args(args : [string] = sys.argv[1:], 1358 values : Values = None) 1359 -> (values : Values, args : [string]) 1360 1361 Parse the command-line options found in 'args' (default: 1362 sys.argv[1:]). Any errors result in a call to 'error()', which 1363 by default prints the usage message to stderr and calls 1364 sys.exit() with an error message. On success returns a pair 1365 (values, args) where 'values' is a Values instance (with all 1366 your option values) and 'args' is the list of arguments left 1367 over after parsing options. 1368 """ 1369 rargs = self._get_args(args) 1370 if values is None: 1371 values = self.get_default_values() 1372 1373 # Store the halves of the argument list as attributes for the 1374 # convenience of callbacks: 1375 # rargs 1376 # the rest of the command-line (the "r" stands for 1377 # "remaining" or "right-hand") 1378 # largs 1379 # the leftover arguments -- ie. what's left after removing 1380 # options and their arguments (the "l" stands for "leftover" 1381 # or "left-hand") 1382 self.rargs = rargs 1383 self.largs = largs = [] 1384 self.values = values 1385 1386 try: 1387 stop = self._process_args(largs, rargs, values) 1388 except (BadOptionError, OptionValueError) as err: 1389 self.error(str(err)) 1390 1391 args = largs + rargs 1392 return self.check_values(values, args) 1393 1394 def check_values(self, values, args): 1395 """ 1396 check_values(values : Values, args : [string]) 1397 -> (values : Values, args : [string]) 1398 1399 Check that the supplied option values and leftover arguments are 1400 valid. Returns the option values and leftover arguments 1401 (possibly adjusted, possibly completely new -- whatever you 1402 like). Default implementation just returns the passed-in 1403 values; subclasses may override as desired. 1404 """ 1405 return (values, args) 1406 1407 def _process_args(self, largs, rargs, values): 1408 """_process_args(largs : [string], 1409 rargs : [string], 1410 values : Values) 1411 1412 Process command-line arguments and populate 'values', consuming 1413 options and arguments from 'rargs'. If 'allow_interspersed_args' is 1414 false, stop at the first non-option argument. If true, accumulate any 1415 interspersed non-option arguments in 'largs'. 1416 """ 1417 while rargs: 1418 arg = rargs[0] 1419 # We handle bare "--" explicitly, and bare "-" is handled by the 1420 # standard arg handler since the short arg case ensures that the 1421 # len of the opt string is greater than 1. 1422 if arg == "--": 1423 del rargs[0] 1424 return 1425 elif arg[0:2] == "--": 1426 # process a single long option (possibly with value(s)) 1427 self._process_long_opt(rargs, values) 1428 elif arg[:1] == "-" and len(arg) > 1: 1429 # process a cluster of short options (possibly with 1430 # value(s) for the last one only) 1431 self._process_short_opts(rargs, values) 1432 elif self.allow_interspersed_args: 1433 largs.append(arg) 1434 del rargs[0] 1435 else: 1436 return # stop now, leave this arg in rargs 1437 1438 # Say this is the original argument list: 1439 # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] 1440 # ^ 1441 # (we are about to process arg(i)). 1442 # 1443 # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of 1444 # [arg0, ..., arg(i-1)] (any options and their arguments will have 1445 # been removed from largs). 1446 # 1447 # The while loop will usually consume 1 or more arguments per pass. 1448 # If it consumes 1 (eg. arg is an option that takes no arguments), 1449 # then after _process_arg() is done the situation is: 1450 # 1451 # largs = subset of [arg0, ..., arg(i)] 1452 # rargs = [arg(i+1), ..., arg(N-1)] 1453 # 1454 # If allow_interspersed_args is false, largs will always be 1455 # *empty* -- still a subset of [arg0, ..., arg(i-1)], but 1456 # not a very interesting subset! 1457 1458 def _match_long_opt(self, opt): 1459 """_match_long_opt(opt : string) -> string 1460 1461 Determine which long option string 'opt' matches, ie. which one 1462 it is an unambiguous abbreviation for. Raises BadOptionError if 1463 'opt' doesn't unambiguously match any long option string. 1464 """ 1465 return _match_abbrev(opt, self._long_opt) 1466 1467 def _process_long_opt(self, rargs, values): 1468 arg = rargs.pop(0) 1469 1470 # Value explicitly attached to arg? Pretend it's the next 1471 # argument. 1472 if "=" in arg: 1473 (opt, next_arg) = arg.split("=", 1) 1474 rargs.insert(0, next_arg) 1475 had_explicit_value = True 1476 else: 1477 opt = arg 1478 had_explicit_value = False 1479 1480 opt = self._match_long_opt(opt) 1481 option = self._long_opt[opt] 1482 if option.takes_value(): 1483 nargs = option.nargs 1484 if len(rargs) < nargs: 1485 self.error(ngettext( 1486 "%(option)s option requires %(number)d argument", 1487 "%(option)s option requires %(number)d arguments", 1488 nargs) % {"option": opt, "number": nargs}) 1489 elif nargs == 1: 1490 value = rargs.pop(0) 1491 else: 1492 value = tuple(rargs[0:nargs]) 1493 del rargs[0:nargs] 1494 1495 elif had_explicit_value: 1496 self.error(_("%s option does not take a value") % opt) 1497 1498 else: 1499 value = None 1500 1501 option.process(opt, value, values, self) 1502 1503 def _process_short_opts(self, rargs, values): 1504 arg = rargs.pop(0) 1505 stop = False 1506 i = 1 1507 for ch in arg[1:]: 1508 opt = "-" + ch 1509 option = self._short_opt.get(opt) 1510 i += 1 # we have consumed a character 1511 1512 if not option: 1513 raise BadOptionError(opt) 1514 if option.takes_value(): 1515 # Any characters left in arg? Pretend they're the 1516 # next arg, and stop consuming characters of arg. 1517 if i < len(arg): 1518 rargs.insert(0, arg[i:]) 1519 stop = True 1520 1521 nargs = option.nargs 1522 if len(rargs) < nargs: 1523 self.error(ngettext( 1524 "%(option)s option requires %(number)d argument", 1525 "%(option)s option requires %(number)d arguments", 1526 nargs) % {"option": opt, "number": nargs}) 1527 elif nargs == 1: 1528 value = rargs.pop(0) 1529 else: 1530 value = tuple(rargs[0:nargs]) 1531 del rargs[0:nargs] 1532 1533 else: # option doesn't take a value 1534 value = None 1535 1536 option.process(opt, value, values, self) 1537 1538 if stop: 1539 break 1540 1541 1542 # -- Feedback methods ---------------------------------------------- 1543 1544 def get_prog_name(self): 1545 if self.prog is None: 1546 return os.path.basename(sys.argv[0]) 1547 else: 1548 return self.prog 1549 1550 def expand_prog_name(self, s): 1551 return s.replace("%prog", self.get_prog_name()) 1552 1553 def get_description(self): 1554 return self.expand_prog_name(self.description) 1555 1556 def exit(self, status=0, msg=None): 1557 if msg: 1558 sys.stderr.write(msg) 1559 sys.exit(status) 1560 1561 def error(self, msg): 1562 """error(msg : string) 1563 1564 Print a usage message incorporating 'msg' to stderr and exit. 1565 If you override this in a subclass, it should not return -- it 1566 should either exit or raise an exception. 1567 """ 1568 self.print_usage(sys.stderr) 1569 self.exit(2, "%s: error: %s\n" % (self.get_prog_name(), msg)) 1570 1571 def get_usage(self): 1572 if self.usage: 1573 return self.formatter.format_usage( 1574 self.expand_prog_name(self.usage)) 1575 else: 1576 return "" 1577 1578 def print_usage(self, file=None): 1579 """print_usage(file : file = stdout) 1580 1581 Print the usage message for the current program (self.usage) to 1582 'file' (default stdout). Any occurrence of the string "%prog" in 1583 self.usage is replaced with the name of the current program 1584 (basename of sys.argv[0]). Does nothing if self.usage is empty 1585 or not defined. 1586 """ 1587 if self.usage: 1588 print(self.get_usage(), file=file) 1589 1590 def get_version(self): 1591 if self.version: 1592 return self.expand_prog_name(self.version) 1593 else: 1594 return "" 1595 1596 def print_version(self, file=None): 1597 """print_version(file : file = stdout) 1598 1599 Print the version message for this program (self.version) to 1600 'file' (default stdout). As with print_usage(), any occurrence 1601 of "%prog" in self.version is replaced by the current program's 1602 name. Does nothing if self.version is empty or undefined. 1603 """ 1604 if self.version: 1605 print(self.get_version(), file=file) 1606 1607 def format_option_help(self, formatter=None): 1608 if formatter is None: 1609 formatter = self.formatter 1610 formatter.store_option_strings(self) 1611 result = [] 1612 result.append(formatter.format_heading(_("Options"))) 1613 formatter.indent() 1614 if self.option_list: 1615 result.append(OptionContainer.format_option_help(self, formatter)) 1616 result.append("\n") 1617 for group in self.option_groups: 1618 result.append(group.format_help(formatter)) 1619 result.append("\n") 1620 formatter.dedent() 1621 # Drop the last "\n", or the header if no options or option groups: 1622 return "".join(result[:-1]) 1623 1624 def format_epilog(self, formatter): 1625 return formatter.format_epilog(self.epilog) 1626 1627 def format_help(self, formatter=None): 1628 if formatter is None: 1629 formatter = self.formatter 1630 result = [] 1631 if self.usage: 1632 result.append(self.get_usage() + "\n") 1633 if self.description: 1634 result.append(self.format_description(formatter) + "\n") 1635 result.append(self.format_option_help(formatter)) 1636 result.append(self.format_epilog(formatter)) 1637 return "".join(result) 1638 1639 def print_help(self, file=None): 1640 """print_help(file : file = stdout) 1641 1642 Print an extended help message, listing all options and any 1643 help text provided with them, to 'file' (default stdout). 1644 """ 1645 if file is None: 1646 file = sys.stdout 1647 file.write(self.format_help()) 1648 1649# class OptionParser 1650 1651 1652def _match_abbrev(s, wordmap): 1653 """_match_abbrev(s : string, wordmap : {string : Option}) -> string 1654 1655 Return the string key in 'wordmap' for which 's' is an unambiguous 1656 abbreviation. If 's' is found to be ambiguous or doesn't match any of 1657 'words', raise BadOptionError. 1658 """ 1659 # Is there an exact match? 1660 if s in wordmap: 1661 return s 1662 else: 1663 # Isolate all words with s as a prefix. 1664 possibilities = [word for word in wordmap.keys() 1665 if word.startswith(s)] 1666 # No exact match, so there had better be just one possibility. 1667 if len(possibilities) == 1: 1668 return possibilities[0] 1669 elif not possibilities: 1670 raise BadOptionError(s) 1671 else: 1672 # More than one possible completion: ambiguous prefix. 1673 possibilities.sort() 1674 raise AmbiguousOptionError(s, possibilities) 1675 1676 1677# Some day, there might be many Option classes. As of Optik 1.3, the 1678# preferred way to instantiate Options is indirectly, via make_option(), 1679# which will become a factory function when there are many Option 1680# classes. 1681make_option = Option 1682