Home | History | Annotate | Download | only in Lib
      1 """A powerful, extensible, and easy-to-use option parser.
      2 
      3 By Greg Ward <gward (at] python.net>
      4 
      5 Originally distributed as Optik.
      6 
      7 For support, use the optik-users (at] lists.sourceforge.net mailing list
      8 (http://lists.sourceforge.net/lists/listinfo/optik-users).
      9 
     10 Simple 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__ = """
     45 Copyright (c) 2001-2006 Gregory P. Ward.  All rights reserved.
     46 Copyright (c) 2002-2006 Python Software Foundation.  All rights reserved.
     47 
     48 Redistribution and use in source and binary forms, with or without
     49 modification, are permitted provided that the following conditions are
     50 met:
     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 
     63 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
     64 IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     65 TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
     66 PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
     67 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     68 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     69 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     70 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     71 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     72 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     73 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     74 """
     75 
     76 import sys, os
     77 import textwrap
     78 
     79 def _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 
     89 try:
     90     from gettext import gettext, ngettext
     91 except 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 
    103 class OptParseError (Exception):
    104     def __init__(self, msg):
    105         self.msg = msg
    106 
    107     def __str__(self):
    108         return self.msg
    109 
    110 
    111 class 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 
    127 class OptionConflictError (OptionError):
    128     """
    129     Raised if conflicting options are added to an OptionParser.
    130     """
    131 
    132 class OptionValueError (OptParseError):
    133     """
    134     Raised if an invalid option value is encountered on the command
    135     line.
    136     """
    137 
    138 class 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 
    148 class 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 
    161 class 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 
    368 class 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 
    387 class 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 
    406 def _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 
    419 def _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 
    427 def 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 
    435 def 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.
    446 NO_DEFAULT = ("NO", "DEFAULT")
    447 
    448 
    449 class 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 
    820 SUPPRESS_HELP = "SUPPRESS"+"HELP"
    821 SUPPRESS_USAGE = "SUPPRESS"+"USAGE"
    822 
    823 class 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 
    888 class 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 master
    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 
   1076 class 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 
   1106 class 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 
   1652 def _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.
   1681 make_option = Option
   1682