183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh"""A powerful, extensible, and easy-to-use option parser.
283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehBy Greg Ward <gward@python.net>
483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehOriginally distributed as Optik.
683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehFor support, use the optik-users@lists.sourceforge.net mailing list
883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh(http://lists.sourceforge.net/lists/listinfo/optik-users).
983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehSimple usage example:
1183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh   from optparse import OptionParser
1383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh   parser = OptionParser()
1583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh   parser.add_option("-f", "--file", dest="filename",
1683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     help="write report to FILE", metavar="FILE")
1783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh   parser.add_option("-q", "--quiet",
1883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     action="store_false", dest="verbose", default=True,
1983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     help="don't print status messages to stdout")
2083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh   (options, args) = parser.parse_args()
2283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh"""
2383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh__version__ = "1.5.3"
2583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh__all__ = ['Option',
2783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh           'make_option',
2883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh           'SUPPRESS_HELP',
2983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh           'SUPPRESS_USAGE',
3083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh           'Values',
3183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh           'OptionContainer',
3283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh           'OptionGroup',
3383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh           'OptionParser',
3483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh           'HelpFormatter',
3583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh           'IndentedHelpFormatter',
3683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh           'TitledHelpFormatter',
3783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh           'OptParseError',
3883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh           'OptionError',
3983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh           'OptionConflictError',
4083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh           'OptionValueError',
4183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh           'BadOptionError']
4283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh__copyright__ = """
4483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehCopyright (c) 2001-2006 Gregory P. Ward.  All rights reserved.
4583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehCopyright (c) 2002-2006 Python Software Foundation.  All rights reserved.
4683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehRedistribution and use in source and binary forms, with or without
4883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehmodification, are permitted provided that the following conditions are
4983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehmet:
5083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh  * Redistributions of source code must retain the above copyright
5283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    notice, this list of conditions and the following disclaimer.
5383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh  * Redistributions in binary form must reproduce the above copyright
5583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    notice, this list of conditions and the following disclaimer in the
5683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    documentation and/or other materials provided with the distribution.
5783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh  * Neither the name of the author nor the names of its
5983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    contributors may be used to endorse or promote products derived from
6083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    this software without specific prior written permission.
6183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
6283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
6383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehIS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
6483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
6583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
6683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
6783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
6883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
6983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
7083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
7183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
7283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
7383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh"""
7483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
7583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport sys, os
7683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport types
7783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport textwrap
7883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
7983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef _repr(self):
8083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    return "<%s at 0x%x: %s>" % (self.__class__.__name__, id(self), self)
8183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# This file was generated from:
8483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh#   Id: option_parser.py 527 2006-07-23 15:21:30Z greg
8583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh#   Id: option.py 522 2006-06-11 16:22:03Z gward
8683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh#   Id: help.py 527 2006-07-23 15:21:30Z greg
8783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh#   Id: errors.py 509 2006-04-20 00:58:24Z gward
8883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehtry:
9083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    from gettext import gettext
9183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehexcept ImportError:
9283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def gettext(message):
9383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return message
9483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_ = gettext
9583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
9683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
9783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass OptParseError (Exception):
9883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, msg):
9983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.msg = msg
10083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __str__(self):
10283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.msg
10383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass OptionError (OptParseError):
10683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
10783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Raised if an Option instance is created with invalid or
10883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    inconsistent arguments.
10983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
11083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, msg, option):
11283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.msg = msg
11383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.option_id = str(option)
11483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __str__(self):
11683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.option_id:
11783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return "option %s: %s" % (self.option_id, self.msg)
11883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
11983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return self.msg
12083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
12183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass OptionConflictError (OptionError):
12283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
12383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Raised if conflicting options are added to an OptionParser.
12483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
12583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
12683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass OptionValueError (OptParseError):
12783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
12883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Raised if an invalid option value is encountered on the command
12983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    line.
13083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
13183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
13283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass BadOptionError (OptParseError):
13383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
13483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Raised if an invalid option is seen on the command line.
13583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
13683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, opt_str):
13783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.opt_str = opt_str
13883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
13983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __str__(self):
14083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return _("no such option: %s") % self.opt_str
14183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
14283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass AmbiguousOptionError (BadOptionError):
14383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
14483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Raised if an ambiguous option is seen on the command line.
14583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
14683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, opt_str, possibilities):
14783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        BadOptionError.__init__(self, opt_str)
14883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.possibilities = possibilities
14983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
15083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __str__(self):
15183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return (_("ambiguous option: %s (%s?)")
15283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                % (self.opt_str, ", ".join(self.possibilities)))
15383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
15483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
15583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass HelpFormatter:
15683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
15783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
15883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Abstract base class for formatting option help.  OptionParser
15983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    instances should use one of the HelpFormatter subclasses for
16083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    formatting help; by default IndentedHelpFormatter is used.
16183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
16283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Instance attributes:
16383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      parser : OptionParser
16483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        the controlling OptionParser instance
16583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      indent_increment : int
16683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        the number of columns to indent per nesting level
16783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      max_help_position : int
16883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        the maximum starting column for option help text
16983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      help_position : int
17083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        the calculated starting column for option help text;
17183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        initially the same as the maximum
17283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      width : int
17383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        total number of columns for output (pass None to constructor for
17483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        this value to be taken from the $COLUMNS environment variable)
17583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      level : int
17683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        current indentation level
17783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      current_indent : int
17883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        current indentation level (in columns)
17983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      help_width : int
18083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        number of columns available for option help text (calculated)
18183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      default_tag : str
18283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        text to replace with each option's default value, "%default"
18383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        by default.  Set to false value to disable default value expansion.
18483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      option_strings : { Option : str }
18583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        maps Option instances to the snippet of help text explaining
18683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        the syntax of that option, e.g. "-h, --help" or
18783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        "-fFILE, --file=FILE"
18883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      _short_opt_fmt : str
18983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        format string controlling how short options with values are
19083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        printed in help text.  Must be either "%s%s" ("-fFILE") or
19183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        "%s %s" ("-f FILE"), because those are the two syntaxes that
19283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Optik supports.
19383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      _long_opt_fmt : str
19483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        similar but for long options; must be either "%s %s" ("--file FILE")
19583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        or "%s=%s" ("--file=FILE").
19683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
19783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
19883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    NO_DEFAULT_VALUE = "none"
19983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
20083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self,
20183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 indent_increment,
20283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 max_help_position,
20383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 width,
20483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 short_first):
20583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.parser = None
20683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.indent_increment = indent_increment
20783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.help_position = self.max_help_position = max_help_position
20883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if width is None:
20983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            try:
21083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                width = int(os.environ['COLUMNS'])
21183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            except (KeyError, ValueError):
21283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                width = 80
21383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            width -= 2
21483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.width = width
21583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.current_indent = 0
21683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.level = 0
21783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.help_width = None          # computed later
21883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.short_first = short_first
21983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.default_tag = "%default"
22083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.option_strings = {}
22183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._short_opt_fmt = "%s %s"
22283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._long_opt_fmt = "%s=%s"
22383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
22483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def set_parser(self, parser):
22583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.parser = parser
22683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
22783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def set_short_opt_delimiter(self, delim):
22883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if delim not in ("", " "):
22983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError(
23083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                "invalid metavar delimiter for short options: %r" % delim)
23183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._short_opt_fmt = "%s" + delim + "%s"
23283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
23383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def set_long_opt_delimiter(self, delim):
23483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if delim not in ("=", " "):
23583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError(
23683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                "invalid metavar delimiter for long options: %r" % delim)
23783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._long_opt_fmt = "%s" + delim + "%s"
23883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
23983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def indent(self):
24083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.current_indent += self.indent_increment
24183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.level += 1
24283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
24383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def dedent(self):
24483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.current_indent -= self.indent_increment
24583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        assert self.current_indent >= 0, "Indent decreased below 0."
24683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.level -= 1
24783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
24883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_usage(self, usage):
24983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError, "subclasses must implement"
25083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
25183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_heading(self, heading):
25283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError, "subclasses must implement"
25383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
25483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _format_text(self, text):
25583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
25683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Format a paragraph of free-form text for inclusion in the
25783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        help output at the current indentation level.
25883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
25983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        text_width = self.width - self.current_indent
26083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        indent = " "*self.current_indent
26183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return textwrap.fill(text,
26283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                             text_width,
26383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                             initial_indent=indent,
26483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                             subsequent_indent=indent)
26583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
26683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_description(self, description):
26783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if description:
26883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return self._format_text(description) + "\n"
26983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
27083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return ""
27183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
27283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_epilog(self, epilog):
27383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if epilog:
27483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return "\n" + self._format_text(epilog) + "\n"
27583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
27683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return ""
27783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
27883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
27983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def expand_default(self, option):
28083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.parser is None or not self.default_tag:
28183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return option.help
28283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
28383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        default_value = self.parser.defaults.get(option.dest)
28483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if default_value is NO_DEFAULT or default_value is None:
28583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            default_value = self.NO_DEFAULT_VALUE
28683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
28783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return option.help.replace(self.default_tag, str(default_value))
28883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
28983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_option(self, option):
29083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # The help for each option consists of two parts:
29183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #   * the opt strings and metavars
29283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #     eg. ("-x", or "-fFILENAME, --file=FILENAME")
29383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #   * the user-supplied help string
29483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #     eg. ("turn on expert mode", "read data from FILENAME")
29583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #
29683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # If possible, we write both of these on the same line:
29783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #   -x      turn on expert mode
29883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #
29983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # But if the opt string list is too long, we put the help
30083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # string on a second line, indented to the same column it would
30183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # start in if it fit on the first line.
30283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #   -fFILENAME, --file=FILENAME
30383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #           read data from FILENAME
30483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        result = []
30583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        opts = self.option_strings[option]
30683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        opt_width = self.help_position - self.current_indent - 2
30783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if len(opts) > opt_width:
30883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            opts = "%*s%s\n" % (self.current_indent, "", opts)
30983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            indent_first = self.help_position
31083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:                       # start help on same line as opts
31183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            opts = "%*s%-*s  " % (self.current_indent, "", opt_width, opts)
31283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            indent_first = 0
31383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        result.append(opts)
31483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if option.help:
31583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            help_text = self.expand_default(option)
31683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            help_lines = textwrap.wrap(help_text, self.help_width)
31783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            result.append("%*s%s\n" % (indent_first, "", help_lines[0]))
31883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            result.extend(["%*s%s\n" % (self.help_position, "", line)
31983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                           for line in help_lines[1:]])
32083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif opts[-1] != "\n":
32183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            result.append("\n")
32283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return "".join(result)
32383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
32483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def store_option_strings(self, parser):
32583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.indent()
32683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        max_len = 0
32783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for opt in parser.option_list:
32883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            strings = self.format_option_strings(opt)
32983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.option_strings[opt] = strings
33083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            max_len = max(max_len, len(strings) + self.current_indent)
33183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.indent()
33283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for group in parser.option_groups:
33383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for opt in group.option_list:
33483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                strings = self.format_option_strings(opt)
33583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.option_strings[opt] = strings
33683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                max_len = max(max_len, len(strings) + self.current_indent)
33783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.dedent()
33883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.dedent()
33983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.help_position = min(max_len + 2, self.max_help_position)
34083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.help_width = self.width - self.help_position
34183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
34283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_option_strings(self, option):
34383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Return a comma-separated list of option strings & metavariables."""
34483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if option.takes_value():
34583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            metavar = option.metavar or option.dest.upper()
34683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            short_opts = [self._short_opt_fmt % (sopt, metavar)
34783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                          for sopt in option._short_opts]
34883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            long_opts = [self._long_opt_fmt % (lopt, metavar)
34983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         for lopt in option._long_opts]
35083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
35183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            short_opts = option._short_opts
35283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            long_opts = option._long_opts
35383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
35483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.short_first:
35583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            opts = short_opts + long_opts
35683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
35783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            opts = long_opts + short_opts
35883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
35983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return ", ".join(opts)
36083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
36183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass IndentedHelpFormatter (HelpFormatter):
36283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Format help with indented section bodies.
36383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
36483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
36583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self,
36683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 indent_increment=2,
36783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 max_help_position=24,
36883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 width=None,
36983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 short_first=1):
37083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        HelpFormatter.__init__(
37183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self, indent_increment, max_help_position, width, short_first)
37283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
37383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_usage(self, usage):
37483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return _("Usage: %s\n") % usage
37583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
37683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_heading(self, heading):
37783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return "%*s%s:\n" % (self.current_indent, "", heading)
37883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
37983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
38083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TitledHelpFormatter (HelpFormatter):
38183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Format help with underlined section headers.
38283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
38383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
38483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self,
38583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 indent_increment=0,
38683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 max_help_position=24,
38783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 width=None,
38883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 short_first=0):
38983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        HelpFormatter.__init__ (
39083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self, indent_increment, max_help_position, width, short_first)
39183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
39283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_usage(self, usage):
39383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return "%s  %s\n" % (self.format_heading(_("Usage")), usage)
39483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
39583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_heading(self, heading):
39683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return "%s\n%s\n" % (heading, "=-"[self.level] * len(heading))
39783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
39883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
39983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef _parse_num(val, type):
40083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if val[:2].lower() == "0x":         # hexadecimal
40183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radix = 16
40283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    elif val[:2].lower() == "0b":       # binary
40383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radix = 2
40483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        val = val[2:] or "0"            # have to remove "0b" prefix
40583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    elif val[:1] == "0":                # octal
40683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radix = 8
40783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    else:                               # decimal
40883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radix = 10
40983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
41083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    return type(val, radix)
41183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
41283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef _parse_int(val):
41383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    return _parse_num(val, int)
41483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
41583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef _parse_long(val):
41683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    return _parse_num(val, long)
41783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
41883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_builtin_cvt = { "int" : (_parse_int, _("integer")),
41983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 "long" : (_parse_long, _("long integer")),
42083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 "float" : (float, _("floating-point")),
42183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 "complex" : (complex, _("complex")) }
42283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
42383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef check_builtin(option, opt, value):
42483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    (cvt, what) = _builtin_cvt[option.type]
42583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    try:
42683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return cvt(value)
42783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    except ValueError:
42883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise OptionValueError(
42983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            _("option %s: invalid %s value: %r") % (opt, what, value))
43083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
43183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef check_choice(option, opt, value):
43283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if value in option.choices:
43383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return value
43483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    else:
43583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        choices = ", ".join(map(repr, option.choices))
43683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise OptionValueError(
43783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            _("option %s: invalid choice: %r (choose from %s)")
43883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            % (opt, value, choices))
43983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
44083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Not supplying a default is different from a default of None,
44183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# so we need an explicit "not supplied" value.
44283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehNO_DEFAULT = ("NO", "DEFAULT")
44383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
44483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
44583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass Option:
44683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
44783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Instance attributes:
44883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      _short_opts : [string]
44983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      _long_opts : [string]
45083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
45183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      action : string
45283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      type : string
45383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      dest : string
45483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      default : any
45583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      nargs : int
45683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      const : any
45783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      choices : [string]
45883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      callback : function
45983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      callback_args : (any*)
46083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      callback_kwargs : { string : any }
46183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      help : string
46283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      metavar : string
46383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
46483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
46583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # The list of instance attributes that may be set through
46683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # keyword args to the constructor.
46783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ATTRS = ['action',
46883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh             'type',
46983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh             'dest',
47083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh             'default',
47183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh             'nargs',
47283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh             'const',
47383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh             'choices',
47483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh             'callback',
47583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh             'callback_args',
47683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh             'callback_kwargs',
47783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh             'help',
47883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh             'metavar']
47983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
48083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # The set of actions allowed by option parsers.  Explicitly listed
48183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # here so the constructor can validate its arguments.
48283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ACTIONS = ("store",
48383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh               "store_const",
48483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh               "store_true",
48583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh               "store_false",
48683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh               "append",
48783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh               "append_const",
48883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh               "count",
48983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh               "callback",
49083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh               "help",
49183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh               "version")
49283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
49383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # The set of actions that involve storing a value somewhere;
49483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # also listed just for constructor argument validation.  (If
49583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # the action is one of these, there must be a destination.)
49683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    STORE_ACTIONS = ("store",
49783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     "store_const",
49883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     "store_true",
49983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     "store_false",
50083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     "append",
50183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     "append_const",
50283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     "count")
50383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
50483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # The set of actions for which it makes sense to supply a value
50583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # type, ie. which may consume an argument from the command line.
50683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    TYPED_ACTIONS = ("store",
50783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     "append",
50883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     "callback")
50983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
51083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # The set of actions which *require* a value type, ie. that
51183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # always consume an argument from the command line.
51283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    ALWAYS_TYPED_ACTIONS = ("store",
51383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                            "append")
51483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
51583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # The set of actions which take a 'const' attribute.
51683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    CONST_ACTIONS = ("store_const",
51783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     "append_const")
51883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
51983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # The set of known types for option parsers.  Again, listed here for
52083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # constructor argument validation.
52183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    TYPES = ("string", "int", "long", "float", "complex", "choice")
52283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
52383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Dictionary of argument checking functions, which convert and
52483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # validate option arguments according to the option type.
52583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    #
52683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Signature of checking functions is:
52783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    #   check(option : Option, opt : string, value : string) -> any
52883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # where
52983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    #   option is the Option instance calling the checker
53083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    #   opt is the actual option seen on the command-line
53183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    #     (eg. "-a", "--file")
53283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    #   value is the option argument seen on the command-line
53383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    #
53483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # The return value should be in the appropriate Python type
53583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # for option.type -- eg. an integer if option.type == "int".
53683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    #
53783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # If no checker is defined for a type, arguments will be
53883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # unchecked and remain strings.
53983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    TYPE_CHECKER = { "int"    : check_builtin,
54083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     "long"   : check_builtin,
54183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     "float"  : check_builtin,
54283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     "complex": check_builtin,
54383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     "choice" : check_choice,
54483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                   }
54583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
54683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
54783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # CHECK_METHODS is a list of unbound method objects; they are called
54883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # by the constructor, in order, after all attributes are
54983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # initialized.  The list is created and filled in later, after all
55083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # the methods are actually defined.  (I just put it here because I
55183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # like to define and document all class attributes in the same
55283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # place.)  Subclasses that add another _check_*() method should
55383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # define their own CHECK_METHODS list that adds their check method
55483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # to those from this class.
55583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    CHECK_METHODS = None
55683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
55783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
55883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # -- Constructor/initialization methods ----------------------------
55983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
56083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, *opts, **attrs):
56183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Set _short_opts, _long_opts attrs from 'opts' tuple.
56283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Have to be set now, in case no option strings are supplied.
56383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._short_opts = []
56483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._long_opts = []
56583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        opts = self._check_opt_strings(opts)
56683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._set_opt_strings(opts)
56783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
56883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Set all other attrs (action, type, etc.) from 'attrs' dict
56983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._set_attrs(attrs)
57083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
57183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Check all the attributes we just set.  There are lots of
57283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # complicated interdependencies, but luckily they can be farmed
57383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # out to the _check_*() methods listed in CHECK_METHODS -- which
57483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # could be handy for subclasses!  The one thing these all share
57583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # is that they raise OptionError if they discover a problem.
57683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for checker in self.CHECK_METHODS:
57783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            checker(self)
57883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
57983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _check_opt_strings(self, opts):
58083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Filter out None because early versions of Optik had exactly
58183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # one short option and one long option, either of which
58283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # could be None.
58383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        opts = filter(None, opts)
58483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not opts:
58583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise TypeError("at least one option string must be supplied")
58683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return opts
58783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
58883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _set_opt_strings(self, opts):
58983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for opt in opts:
59083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if len(opt) < 2:
59183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise OptionError(
59283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    "invalid option string %r: "
59383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    "must be at least two characters long" % opt, self)
59483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            elif len(opt) == 2:
59583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if not (opt[0] == "-" and opt[1] != "-"):
59683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    raise OptionError(
59783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        "invalid short option string %r: "
59883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        "must be of the form -x, (x any non-dash char)" % opt,
59983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        self)
60083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self._short_opts.append(opt)
60183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else:
60283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if not (opt[0:2] == "--" and opt[2] != "-"):
60383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    raise OptionError(
60483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        "invalid long option string %r: "
60583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        "must start with --, followed by non-dash" % opt,
60683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        self)
60783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self._long_opts.append(opt)
60883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
60983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _set_attrs(self, attrs):
61083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for attr in self.ATTRS:
61183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if attr in attrs:
61283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                setattr(self, attr, attrs[attr])
61383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                del attrs[attr]
61483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else:
61583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if attr == 'default':
61683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    setattr(self, attr, NO_DEFAULT)
61783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                else:
61883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    setattr(self, attr, None)
61983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if attrs:
62083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            attrs = attrs.keys()
62183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            attrs.sort()
62283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise OptionError(
62383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                "invalid keyword arguments: %s" % ", ".join(attrs),
62483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self)
62583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
62683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
62783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # -- Constructor validation methods --------------------------------
62883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
62983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _check_action(self):
63083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.action is None:
63183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.action = "store"
63283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif self.action not in self.ACTIONS:
63383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise OptionError("invalid action: %r" % self.action, self)
63483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
63583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _check_type(self):
63683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.type is None:
63783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self.action in self.ALWAYS_TYPED_ACTIONS:
63883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if self.choices is not None:
63983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    # The "choices" attribute implies "choice" type.
64083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.type = "choice"
64183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                else:
64283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    # No type given?  "string" is the most sensible default.
64383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.type = "string"
64483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
64583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Allow type objects or builtin type conversion functions
64683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # (int, str, etc.) as an alternative to their names.  (The
64783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # complicated check of __builtin__ is only necessary for
64883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Python 2.1 and earlier, and is short-circuited by the
64983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # first check on modern Pythons.)
65083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            import __builtin__
65183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if ( type(self.type) is types.TypeType or
65283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 (hasattr(self.type, "__name__") and
65383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                  getattr(__builtin__, self.type.__name__, None) is self.type) ):
65483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.type = self.type.__name__
65583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
65683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self.type == "str":
65783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.type = "string"
65883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
65983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self.type not in self.TYPES:
66083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise OptionError("invalid option type: %r" % self.type, self)
66183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self.action not in self.TYPED_ACTIONS:
66283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise OptionError(
66383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    "must not supply a type for action %r" % self.action, self)
66483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
66583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _check_choice(self):
66683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.type == "choice":
66783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self.choices is None:
66883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise OptionError(
66983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    "must supply a list of choices for type 'choice'", self)
67083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            elif type(self.choices) not in (types.TupleType, types.ListType):
67183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise OptionError(
67283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    "choices must be a list of strings ('%s' supplied)"
67383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    % str(type(self.choices)).split("'")[1], self)
67483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif self.choices is not None:
67583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise OptionError(
67683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                "must not supply choices for type %r" % self.type, self)
67783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
67883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _check_dest(self):
67983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # No destination given, and we need one for this action.  The
68083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # self.type check is for callbacks that take a value.
68183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        takes_value = (self.action in self.STORE_ACTIONS or
68283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                       self.type is not None)
68383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.dest is None and takes_value:
68483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
68583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Glean a destination from the first long option string,
68683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # or from the first short option string if no long options.
68783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self._long_opts:
68883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # eg. "--foo-bar" -> "foo_bar"
68983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.dest = self._long_opts[0][2:].replace('-', '_')
69083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else:
69183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.dest = self._short_opts[0][1]
69283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
69383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _check_const(self):
69483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.action not in self.CONST_ACTIONS and self.const is not None:
69583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise OptionError(
69683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                "'const' must not be supplied for action %r" % self.action,
69783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self)
69883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
69983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _check_nargs(self):
70083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.action in self.TYPED_ACTIONS:
70183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self.nargs is None:
70283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.nargs = 1
70383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif self.nargs is not None:
70483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise OptionError(
70583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                "'nargs' must not be supplied for action %r" % self.action,
70683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self)
70783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
70883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _check_callback(self):
70983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.action == "callback":
71083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if not hasattr(self.callback, '__call__'):
71183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise OptionError(
71283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    "callback not callable: %r" % self.callback, self)
71383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if (self.callback_args is not None and
71483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                type(self.callback_args) is not types.TupleType):
71583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise OptionError(
71683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    "callback_args, if supplied, must be a tuple: not %r"
71783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    % self.callback_args, self)
71883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if (self.callback_kwargs is not None and
71983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                type(self.callback_kwargs) is not types.DictType):
72083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise OptionError(
72183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    "callback_kwargs, if supplied, must be a dict: not %r"
72283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    % self.callback_kwargs, self)
72383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
72483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self.callback is not None:
72583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise OptionError(
72683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    "callback supplied (%r) for non-callback option"
72783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    % self.callback, self)
72883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self.callback_args is not None:
72983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise OptionError(
73083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    "callback_args supplied for non-callback option", self)
73183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self.callback_kwargs is not None:
73283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise OptionError(
73383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    "callback_kwargs supplied for non-callback option", self)
73483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
73583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
73683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    CHECK_METHODS = [_check_action,
73783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     _check_type,
73883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     _check_choice,
73983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     _check_dest,
74083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     _check_const,
74183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     _check_nargs,
74283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                     _check_callback]
74383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
74483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
74583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # -- Miscellaneous methods -----------------------------------------
74683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
74783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __str__(self):
74883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return "/".join(self._short_opts + self._long_opts)
74983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
75083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    __repr__ = _repr
75183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
75283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def takes_value(self):
75383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.type is not None
75483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
75583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def get_opt_string(self):
75683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self._long_opts:
75783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return self._long_opts[0]
75883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
75983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return self._short_opts[0]
76083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
76183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
76283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # -- Processing methods --------------------------------------------
76383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
76483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def check_value(self, opt, value):
76583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        checker = self.TYPE_CHECKER.get(self.type)
76683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if checker is None:
76783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return value
76883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
76983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return checker(self, opt, value)
77083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
77183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def convert_value(self, opt, value):
77283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if value is not None:
77383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self.nargs == 1:
77483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return self.check_value(opt, value)
77583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else:
77683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return tuple([self.check_value(opt, v) for v in value])
77783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
77883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def process(self, opt, value, values, parser):
77983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
78083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # First, convert the value(s) to the right type.  Howl if any
78183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # value(s) are bogus.
78283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value = self.convert_value(opt, value)
78383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
78483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # And then take whatever action is expected of us.
78583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # This is a separate method to make life easier for
78683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # subclasses to add new actions.
78783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.take_action(
78883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.action, self.dest, opt, value, values, parser)
78983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
79083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def take_action(self, action, dest, opt, value, values, parser):
79183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if action == "store":
79283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            setattr(values, dest, value)
79383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif action == "store_const":
79483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            setattr(values, dest, self.const)
79583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif action == "store_true":
79683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            setattr(values, dest, True)
79783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif action == "store_false":
79883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            setattr(values, dest, False)
79983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif action == "append":
80083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            values.ensure_value(dest, []).append(value)
80183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif action == "append_const":
80283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            values.ensure_value(dest, []).append(self.const)
80383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif action == "count":
80483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            setattr(values, dest, values.ensure_value(dest, 0) + 1)
80583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif action == "callback":
80683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            args = self.callback_args or ()
80783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            kwargs = self.callback_kwargs or {}
80883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.callback(self, opt, value, parser, *args, **kwargs)
80983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif action == "help":
81083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            parser.print_help()
81183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            parser.exit()
81283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif action == "version":
81383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            parser.print_version()
81483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            parser.exit()
81583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
81683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("unknown action %r" % self.action)
81783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
81883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return 1
81983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
82083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# class Option
82183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
82283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
82383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehSUPPRESS_HELP = "SUPPRESS"+"HELP"
82483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehSUPPRESS_USAGE = "SUPPRESS"+"USAGE"
82583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
82683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehtry:
82783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    basestring
82883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehexcept NameError:
82983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def isbasestring(x):
83083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return isinstance(x, (types.StringType, types.UnicodeType))
83183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehelse:
83283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def isbasestring(x):
83383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return isinstance(x, basestring)
83483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
83583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass Values:
83683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
83783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, defaults=None):
83883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if defaults:
83983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for (attr, val) in defaults.items():
84083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                setattr(self, attr, val)
84183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
84283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __str__(self):
84383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return str(self.__dict__)
84483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
84583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    __repr__ = _repr
84683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
84783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __cmp__(self, other):
84883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if isinstance(other, Values):
84983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return cmp(self.__dict__, other.__dict__)
85083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif isinstance(other, types.DictType):
85183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return cmp(self.__dict__, other)
85283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
85383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return -1
85483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
85583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _update_careful(self, dict):
85683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
85783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Update the option values from an arbitrary dictionary, but only
85883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        use keys from dict that already have a corresponding attribute
85983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        in self.  Any keys in dict without a corresponding attribute
86083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        are silently ignored.
86183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
86283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for attr in dir(self):
86383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if attr in dict:
86483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                dval = dict[attr]
86583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if dval is not None:
86683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    setattr(self, attr, dval)
86783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
86883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _update_loose(self, dict):
86983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
87083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Update the option values from an arbitrary dictionary,
87183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        using all keys from the dictionary regardless of whether
87283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        they have a corresponding attribute in self or not.
87383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
87483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.__dict__.update(dict)
87583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
87683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _update(self, dict, mode):
87783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if mode == "careful":
87883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._update_careful(dict)
87983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif mode == "loose":
88083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._update_loose(dict)
88183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
88283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError, "invalid update mode: %r" % mode
88383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
88483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def read_module(self, modname, mode="careful"):
88583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        __import__(modname)
88683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        mod = sys.modules[modname]
88783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._update(vars(mod), mode)
88883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
88983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def read_file(self, filename, mode="careful"):
89083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        vars = {}
89183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        execfile(filename, vars)
89283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._update(vars, mode)
89383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
89483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def ensure_value(self, attr, value):
89583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not hasattr(self, attr) or getattr(self, attr) is None:
89683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            setattr(self, attr, value)
89783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return getattr(self, attr)
89883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
89983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
90083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass OptionContainer:
90183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
90283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
90383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Abstract base class.
90483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
90583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Class attributes:
90683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      standard_option_list : [Option]
90783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        list of standard options that will be accepted by all instances
90883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        of this parser class (intended to be overridden by subclasses).
90983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
91083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Instance attributes:
91183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      option_list : [Option]
91283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        the list of Option objects contained by this OptionContainer
91383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      _short_opt : { string : Option }
91483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        dictionary mapping short option strings, eg. "-f" or "-X",
91583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        to the Option instances that implement them.  If an Option
91683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        has multiple short option strings, it will appears in this
91783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        dictionary multiple times. [1]
91883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      _long_opt : { string : Option }
91983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        dictionary mapping long option strings, eg. "--file" or
92083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        "--exclude", to the Option instances that implement them.
92183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Again, a given Option can occur multiple times in this
92283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        dictionary. [1]
92383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      defaults : { string : any }
92483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        dictionary mapping option destination names to default
92583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        values for each destination [1]
92683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
92783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    [1] These mappings are common to (shared by) all components of the
92883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        controlling OptionParser, where they are initially created.
92983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
93083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
93183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
93283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, option_class, conflict_handler, description):
93383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Initialize the option list and related data structures.
93483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # This method must be provided by subclasses, and it must
93583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # initialize at least the following instance attributes:
93683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # option_list, _short_opt, _long_opt, defaults.
93783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._create_option_list()
93883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
93983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.option_class = option_class
94083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.set_conflict_handler(conflict_handler)
94183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.set_description(description)
94283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
94383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _create_option_mappings(self):
94483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # For use by OptionParser constructor -- create the master
94583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # option mappings used by this OptionParser and all
94683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # OptionGroups that it owns.
94783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._short_opt = {}            # single letter -> Option instance
94883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._long_opt = {}             # long option -> Option instance
94983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.defaults = {}              # maps option dest -> default value
95083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
95183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
95283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _share_option_mappings(self, parser):
95383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # For use by OptionGroup constructor -- use shared option
95483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # mappings from the OptionParser that owns this OptionGroup.
95583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._short_opt = parser._short_opt
95683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._long_opt = parser._long_opt
95783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.defaults = parser.defaults
95883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
95983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def set_conflict_handler(self, handler):
96083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if handler not in ("error", "resolve"):
96183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError, "invalid conflict_resolution value %r" % handler
96283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.conflict_handler = handler
96383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
96483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def set_description(self, description):
96583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.description = description
96683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
96783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def get_description(self):
96883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.description
96983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
97083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
97183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def destroy(self):
97283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """see OptionParser.destroy()."""
97383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        del self._short_opt
97483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        del self._long_opt
97583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        del self.defaults
97683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
97783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
97883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # -- Option-adding methods -----------------------------------------
97983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
98083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _check_conflict(self, option):
98183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        conflict_opts = []
98283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for opt in option._short_opts:
98383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if opt in self._short_opt:
98483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                conflict_opts.append((opt, self._short_opt[opt]))
98583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for opt in option._long_opts:
98683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if opt in self._long_opt:
98783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                conflict_opts.append((opt, self._long_opt[opt]))
98883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
98983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if conflict_opts:
99083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            handler = self.conflict_handler
99183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if handler == "error":
99283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise OptionConflictError(
99383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    "conflicting option string(s): %s"
99483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    % ", ".join([co[0] for co in conflict_opts]),
99583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    option)
99683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            elif handler == "resolve":
99783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                for (opt, c_option) in conflict_opts:
99883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    if opt.startswith("--"):
99983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        c_option._long_opts.remove(opt)
100083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        del self._long_opt[opt]
100183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    else:
100283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        c_option._short_opts.remove(opt)
100383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        del self._short_opt[opt]
100483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    if not (c_option._short_opts or c_option._long_opts):
100583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        c_option.container.option_list.remove(c_option)
100683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
100783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def add_option(self, *args, **kwargs):
100883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """add_option(Option)
100983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh           add_option(opt_str, ..., kwarg=val, ...)
101083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
101183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if type(args[0]) in types.StringTypes:
101283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            option = self.option_class(*args, **kwargs)
101383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif len(args) == 1 and not kwargs:
101483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            option = args[0]
101583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if not isinstance(option, Option):
101683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise TypeError, "not an Option instance: %r" % option
101783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
101883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise TypeError, "invalid arguments"
101983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
102083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._check_conflict(option)
102183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
102283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.option_list.append(option)
102383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        option.container = self
102483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for opt in option._short_opts:
102583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._short_opt[opt] = option
102683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for opt in option._long_opts:
102783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._long_opt[opt] = option
102883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
102983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if option.dest is not None:     # option has a dest, we need a default
103083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if option.default is not NO_DEFAULT:
103183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.defaults[option.dest] = option.default
103283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            elif option.dest not in self.defaults:
103383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.defaults[option.dest] = None
103483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
103583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return option
103683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
103783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def add_options(self, option_list):
103883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for option in option_list:
103983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.add_option(option)
104083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
104183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # -- Option query/removal methods ----------------------------------
104283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
104383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def get_option(self, opt_str):
104483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return (self._short_opt.get(opt_str) or
104583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self._long_opt.get(opt_str))
104683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
104783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def has_option(self, opt_str):
104883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return (opt_str in self._short_opt or
104983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                opt_str in self._long_opt)
105083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
105183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def remove_option(self, opt_str):
105283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        option = self._short_opt.get(opt_str)
105383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if option is None:
105483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            option = self._long_opt.get(opt_str)
105583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if option is None:
105683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise ValueError("no such option %r" % opt_str)
105783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
105883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for opt in option._short_opts:
105983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            del self._short_opt[opt]
106083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for opt in option._long_opts:
106183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            del self._long_opt[opt]
106283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        option.container.option_list.remove(option)
106383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
106483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
106583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # -- Help-formatting methods ---------------------------------------
106683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
106783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_option_help(self, formatter):
106883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not self.option_list:
106983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return ""
107083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        result = []
107183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for option in self.option_list:
107283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if not option.help is SUPPRESS_HELP:
107383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                result.append(formatter.format_option(option))
107483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return "".join(result)
107583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
107683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_description(self, formatter):
107783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return formatter.format_description(self.get_description())
107883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
107983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_help(self, formatter):
108083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        result = []
108183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.description:
108283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            result.append(self.format_description(formatter))
108383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.option_list:
108483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            result.append(self.format_option_help(formatter))
108583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return "\n".join(result)
108683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
108783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
108883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass OptionGroup (OptionContainer):
108983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
109083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, parser, title, description=None):
109183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.parser = parser
109283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        OptionContainer.__init__(
109383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self, parser.option_class, parser.conflict_handler, description)
109483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.title = title
109583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
109683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _create_option_list(self):
109783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.option_list = []
109883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._share_option_mappings(self.parser)
109983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
110083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def set_title(self, title):
110183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.title = title
110283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
110383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def destroy(self):
110483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """see OptionParser.destroy()."""
110583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        OptionContainer.destroy(self)
110683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        del self.option_list
110783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
110883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # -- Help-formatting methods ---------------------------------------
110983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
111083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_help(self, formatter):
111183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        result = formatter.format_heading(self.title)
111283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        formatter.indent()
111383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        result += OptionContainer.format_help(self, formatter)
111483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        formatter.dedent()
111583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return result
111683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
111783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
111883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass OptionParser (OptionContainer):
111983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
112083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
112183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Class attributes:
112283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      standard_option_list : [Option]
112383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        list of standard options that will be accepted by all instances
112483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        of this parser class (intended to be overridden by subclasses).
112583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
112683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Instance attributes:
112783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      usage : string
112883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        a usage string for your program.  Before it is displayed
112983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        to the user, "%prog" will be expanded to the name of
113083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        your program (self.prog or os.path.basename(sys.argv[0])).
113183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      prog : string
113283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        the name of the current program (to override
113383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        os.path.basename(sys.argv[0])).
113483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      description : string
113583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        A paragraph of text giving a brief overview of your program.
113683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        optparse reformats this paragraph to fit the current terminal
113783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        width and prints it when the user requests help (after usage,
113883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        but before the list of options).
113983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      epilog : string
114083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        paragraph of help text to print after option help
114183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
114283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      option_groups : [OptionGroup]
114383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        list of option groups in this parser (option groups are
114483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        irrelevant for parsing the command-line, but very useful
114583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for generating help)
114683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
114783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      allow_interspersed_args : bool = true
114883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if true, positional arguments may be interspersed with options.
114983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Assuming -a and -b each take a single argument, the command-line
115083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh          -ablah foo bar -bboo baz
115183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        will be interpreted the same as
115283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh          -ablah -bboo -- foo bar baz
115383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        If this flag were false, that command line would be interpreted as
115483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh          -ablah -- foo bar -bboo baz
115583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        -- ie. we stop processing options as soon as we see the first
115683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        non-option argument.  (This is the tradition followed by
115783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Python's getopt module, Perl's Getopt::Std, and other argument-
115883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        parsing libraries, but it is generally annoying to users.)
115983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
116083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      process_default_values : bool = true
116183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if true, option default values are processed similarly to option
116283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        values from the command line: that is, they are passed to the
116383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        type-checking function for the option's type (as long as the
116483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        default value is a string).  (This really only matters if you
116583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        have defined custom types; see SF bug #955889.)  Set it to false
116683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        to restore the behaviour of Optik 1.4.1 and earlier.
116783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
116883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      rargs : [string]
116983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        the argument list currently being parsed.  Only set when
117083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        parse_args() is active, and continually trimmed down as
117183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        we consume arguments.  Mainly there for the benefit of
117283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        callback options.
117383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      largs : [string]
117483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        the list of leftover arguments that we have skipped while
117583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        parsing options.  If allow_interspersed_args is false, this
117683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        list is always empty.
117783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh      values : Values
117883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        the set of option values currently being accumulated.  Only
117983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        set when parse_args() is active.  Also mainly for callbacks.
118083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
118183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Because of the 'rargs', 'largs', and 'values' attributes,
118283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    OptionParser is not thread-safe.  If, for some perverse reason, you
118383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    need to parse command-line arguments simultaneously in different
118483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    threads, use different OptionParser instances.
118583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
118683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
118783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
118883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    standard_option_list = []
118983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
119083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self,
119183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 usage=None,
119283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 option_list=None,
119383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 option_class=Option,
119483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 version=None,
119583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 conflict_handler="error",
119683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 description=None,
119783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 formatter=None,
119883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 add_help_option=True,
119983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 prog=None,
120083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                 epilog=None):
120183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        OptionContainer.__init__(
120283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self, option_class, conflict_handler, description)
120383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.set_usage(usage)
120483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.prog = prog
120583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.version = version
120683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.allow_interspersed_args = True
120783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.process_default_values = True
120883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if formatter is None:
120983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            formatter = IndentedHelpFormatter()
121083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.formatter = formatter
121183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.formatter.set_parser(self)
121283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.epilog = epilog
121383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
121483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Populate the option list; initial sources are the
121583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # standard_option_list class attribute, the 'option_list'
121683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # argument, and (if applicable) the _add_version_option() and
121783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # _add_help_option() methods.
121883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._populate_option_list(option_list,
121983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                   add_help=add_help_option)
122083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
122183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._init_parsing_state()
122283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
122383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
122483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def destroy(self):
122583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
122683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Declare that you are done with this OptionParser.  This cleans up
122783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        reference cycles so the OptionParser (and all objects referenced by
122883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        it) can be garbage-collected promptly.  After calling destroy(), the
122983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        OptionParser is unusable.
123083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
123183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        OptionContainer.destroy(self)
123283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for group in self.option_groups:
123383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            group.destroy()
123483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        del self.option_list
123583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        del self.option_groups
123683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        del self.formatter
123783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
123883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
123983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # -- Private methods -----------------------------------------------
124083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # (used by our or OptionContainer's constructor)
124183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
124283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _create_option_list(self):
124383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.option_list = []
124483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.option_groups = []
124583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self._create_option_mappings()
124683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
124783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _add_help_option(self):
124883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.add_option("-h", "--help",
124983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        action="help",
125083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        help=_("show this help message and exit"))
125183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
125283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _add_version_option(self):
125383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.add_option("--version",
125483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        action="version",
125583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        help=_("show program's version number and exit"))
125683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
125783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _populate_option_list(self, option_list, add_help=True):
125883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.standard_option_list:
125983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.add_options(self.standard_option_list)
126083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if option_list:
126183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.add_options(option_list)
126283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.version:
126383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._add_version_option()
126483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if add_help:
126583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self._add_help_option()
126683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
126783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _init_parsing_state(self):
126883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # These are set in parse_args() for the convenience of callbacks.
126983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.rargs = None
127083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.largs = None
127183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.values = None
127283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
127383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
127483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # -- Simple modifier methods ---------------------------------------
127583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
127683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def set_usage(self, usage):
127783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if usage is None:
127883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.usage = _("%prog [options]")
127983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif usage is SUPPRESS_USAGE:
128083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.usage = None
128183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # For backwards compatibility with Optik 1.3 and earlier.
128283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif usage.lower().startswith("usage: "):
128383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.usage = usage[7:]
128483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
128583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.usage = usage
128683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
128783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def enable_interspersed_args(self):
128883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Set parsing to not stop on the first non-option, allowing
128983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        interspersing switches with command arguments. This is the
129083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        default behavior. See also disable_interspersed_args() and the
129183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        class documentation description of the attribute
129283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        allow_interspersed_args."""
129383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.allow_interspersed_args = True
129483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
129583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def disable_interspersed_args(self):
129683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Set parsing to stop on the first non-option. Use this if
129783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        you have a command processor which runs another command that
129883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        has options of its own and you want to make sure these options
129983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        don't get confused.
130083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
130183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.allow_interspersed_args = False
130283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
130383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def set_process_default_values(self, process):
130483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.process_default_values = process
130583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
130683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def set_default(self, dest, value):
130783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.defaults[dest] = value
130883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
130983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def set_defaults(self, **kwargs):
131083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.defaults.update(kwargs)
131183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
131283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _get_all_options(self):
131383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        options = self.option_list[:]
131483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for group in self.option_groups:
131583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            options.extend(group.option_list)
131683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return options
131783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
131883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def get_default_values(self):
131983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not self.process_default_values:
132083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Old, pre-Optik 1.5 behaviour.
132183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return Values(self.defaults)
132283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
132383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        defaults = self.defaults.copy()
132483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for option in self._get_all_options():
132583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            default = defaults.get(option.dest)
132683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if isbasestring(default):
132783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                opt_str = option.get_opt_string()
132883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                defaults[option.dest] = option.check_value(opt_str, default)
132983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
133083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return Values(defaults)
133183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
133283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
133383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # -- OptionGroup methods -------------------------------------------
133483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
133583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def add_option_group(self, *args, **kwargs):
133683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # XXX lots of overlap with OptionContainer.add_option()
133783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if type(args[0]) is types.StringType:
133883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            group = OptionGroup(self, *args, **kwargs)
133983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif len(args) == 1 and not kwargs:
134083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            group = args[0]
134183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if not isinstance(group, OptionGroup):
134283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise TypeError, "not an OptionGroup instance: %r" % group
134383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if group.parser is not self:
134483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise ValueError, "invalid OptionGroup (wrong parser)"
134583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
134683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise TypeError, "invalid arguments"
134783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
134883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.option_groups.append(group)
134983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return group
135083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
135183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def get_option_group(self, opt_str):
135283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        option = (self._short_opt.get(opt_str) or
135383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                  self._long_opt.get(opt_str))
135483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if option and option.container is not self:
135583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return option.container
135683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return None
135783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
135883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
135983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # -- Option-parsing methods ----------------------------------------
136083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
136183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _get_args(self, args):
136283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if args is None:
136383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return sys.argv[1:]
136483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
136583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return args[:]              # don't modify caller's list
136683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
136783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def parse_args(self, args=None, values=None):
136883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
136983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        parse_args(args : [string] = sys.argv[1:],
137083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                   values : Values = None)
137183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        -> (values : Values, args : [string])
137283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
137383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Parse the command-line options found in 'args' (default:
137483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        sys.argv[1:]).  Any errors result in a call to 'error()', which
137583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        by default prints the usage message to stderr and calls
137683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        sys.exit() with an error message.  On success returns a pair
137783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (values, args) where 'values' is an Values instance (with all
137883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        your option values) and 'args' is the list of arguments left
137983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        over after parsing options.
138083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
138183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        rargs = self._get_args(args)
138283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if values is None:
138383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            values = self.get_default_values()
138483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
138583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Store the halves of the argument list as attributes for the
138683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # convenience of callbacks:
138783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #   rargs
138883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #     the rest of the command-line (the "r" stands for
138983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #     "remaining" or "right-hand")
139083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #   largs
139183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #     the leftover arguments -- ie. what's left after removing
139283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #     options and their arguments (the "l" stands for "leftover"
139383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #     or "left-hand")
139483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.rargs = rargs
139583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.largs = largs = []
139683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.values = values
139783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
139883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
139983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            stop = self._process_args(largs, rargs, values)
140083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except (BadOptionError, OptionValueError), err:
140183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.error(str(err))
140283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
140383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        args = largs + rargs
140483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.check_values(values, args)
140583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
140683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def check_values(self, values, args):
140783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
140883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        check_values(values : Values, args : [string])
140983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        -> (values : Values, args : [string])
141083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
141183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Check that the supplied option values and leftover arguments are
141283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        valid.  Returns the option values and leftover arguments
141383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (possibly adjusted, possibly completely new -- whatever you
141483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        like).  Default implementation just returns the passed-in
141583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        values; subclasses may override as desired.
141683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
141783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return (values, args)
141883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
141983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _process_args(self, largs, rargs, values):
142083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """_process_args(largs : [string],
142183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         rargs : [string],
142283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         values : Values)
142383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
142483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Process command-line arguments and populate 'values', consuming
142583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        options and arguments from 'rargs'.  If 'allow_interspersed_args' is
142683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        false, stop at the first non-option argument.  If true, accumulate any
142783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        interspersed non-option arguments in 'largs'.
142883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
142983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        while rargs:
143083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            arg = rargs[0]
143183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # We handle bare "--" explicitly, and bare "-" is handled by the
143283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # standard arg handler since the short arg case ensures that the
143383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # len of the opt string is greater than 1.
143483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if arg == "--":
143583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                del rargs[0]
143683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return
143783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            elif arg[0:2] == "--":
143883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # process a single long option (possibly with value(s))
143983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self._process_long_opt(rargs, values)
144083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            elif arg[:1] == "-" and len(arg) > 1:
144183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # process a cluster of short options (possibly with
144283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # value(s) for the last one only)
144383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self._process_short_opts(rargs, values)
144483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            elif self.allow_interspersed_args:
144583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                largs.append(arg)
144683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                del rargs[0]
144783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else:
144883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return                  # stop now, leave this arg in rargs
144983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
145083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Say this is the original argument list:
145183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)]
145283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #                            ^
145383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # (we are about to process arg(i)).
145483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #
145583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of
145683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # [arg0, ..., arg(i-1)] (any options and their arguments will have
145783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # been removed from largs).
145883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #
145983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # The while loop will usually consume 1 or more arguments per pass.
146083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # If it consumes 1 (eg. arg is an option that takes no arguments),
146183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # then after _process_arg() is done the situation is:
146283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #
146383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #   largs = subset of [arg0, ..., arg(i)]
146483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #   rargs = [arg(i+1), ..., arg(N-1)]
146583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #
146683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # If allow_interspersed_args is false, largs will always be
146783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # *empty* -- still a subset of [arg0, ..., arg(i-1)], but
146883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # not a very interesting subset!
146983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
147083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _match_long_opt(self, opt):
147183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """_match_long_opt(opt : string) -> string
147283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
147383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Determine which long option string 'opt' matches, ie. which one
147483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        it is an unambiguous abbrevation for.  Raises BadOptionError if
147583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        'opt' doesn't unambiguously match any long option string.
147683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
147783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return _match_abbrev(opt, self._long_opt)
147883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
147983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _process_long_opt(self, rargs, values):
148083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        arg = rargs.pop(0)
148183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
148283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Value explicitly attached to arg?  Pretend it's the next
148383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # argument.
148483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if "=" in arg:
148583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            (opt, next_arg) = arg.split("=", 1)
148683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            rargs.insert(0, next_arg)
148783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            had_explicit_value = True
148883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
148983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            opt = arg
149083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            had_explicit_value = False
149183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
149283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        opt = self._match_long_opt(opt)
149383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        option = self._long_opt[opt]
149483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if option.takes_value():
149583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            nargs = option.nargs
149683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if len(rargs) < nargs:
149783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if nargs == 1:
149883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.error(_("%s option requires an argument") % opt)
149983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                else:
150083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.error(_("%s option requires %d arguments")
150183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                               % (opt, nargs))
150283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            elif nargs == 1:
150383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                value = rargs.pop(0)
150483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else:
150583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                value = tuple(rargs[0:nargs])
150683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                del rargs[0:nargs]
150783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
150883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif had_explicit_value:
150983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.error(_("%s option does not take a value") % opt)
151083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
151183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
151283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            value = None
151383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
151483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        option.process(opt, value, values, self)
151583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
151683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _process_short_opts(self, rargs, values):
151783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        arg = rargs.pop(0)
151883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        stop = False
151983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        i = 1
152083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for ch in arg[1:]:
152183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            opt = "-" + ch
152283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            option = self._short_opt.get(opt)
152383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            i += 1                      # we have consumed a character
152483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
152583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if not option:
152683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                raise BadOptionError(opt)
152783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if option.takes_value():
152883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # Any characters left in arg?  Pretend they're the
152983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                # next arg, and stop consuming characters of arg.
153083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if i < len(arg):
153183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    rargs.insert(0, arg[i:])
153283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    stop = True
153383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
153483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                nargs = option.nargs
153583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if len(rargs) < nargs:
153683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    if nargs == 1:
153783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        self.error(_("%s option requires an argument") % opt)
153883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    else:
153983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        self.error(_("%s option requires %d arguments")
154083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                   % (opt, nargs))
154183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                elif nargs == 1:
154283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    value = rargs.pop(0)
154383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                else:
154483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    value = tuple(rargs[0:nargs])
154583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    del rargs[0:nargs]
154683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
154783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else:                       # option doesn't take a value
154883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                value = None
154983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
155083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            option.process(opt, value, values, self)
155183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
155283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if stop:
155383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                break
155483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
155583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
155683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # -- Feedback methods ----------------------------------------------
155783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
155883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def get_prog_name(self):
155983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.prog is None:
156083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return os.path.basename(sys.argv[0])
156183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
156283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return self.prog
156383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
156483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def expand_prog_name(self, s):
156583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return s.replace("%prog", self.get_prog_name())
156683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
156783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def get_description(self):
156883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.expand_prog_name(self.description)
156983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
157083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def exit(self, status=0, msg=None):
157183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if msg:
157283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            sys.stderr.write(msg)
157383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        sys.exit(status)
157483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
157583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def error(self, msg):
157683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """error(msg : string)
157783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
157883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Print a usage message incorporating 'msg' to stderr and exit.
157983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        If you override this in a subclass, it should not return -- it
158083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        should either exit or raise an exception.
158183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
158283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.print_usage(sys.stderr)
158383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.exit(2, "%s: error: %s\n" % (self.get_prog_name(), msg))
158483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
158583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def get_usage(self):
158683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.usage:
158783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return self.formatter.format_usage(
158883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.expand_prog_name(self.usage))
158983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
159083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return ""
159183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
159283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def print_usage(self, file=None):
159383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """print_usage(file : file = stdout)
159483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
159583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Print the usage message for the current program (self.usage) to
159683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        'file' (default stdout).  Any occurrence of the string "%prog" in
159783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.usage is replaced with the name of the current program
159883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        (basename of sys.argv[0]).  Does nothing if self.usage is empty
159983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        or not defined.
160083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
160183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.usage:
160283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            print >>file, self.get_usage()
160383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
160483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def get_version(self):
160583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.version:
160683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return self.expand_prog_name(self.version)
160783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
160883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return ""
160983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
161083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def print_version(self, file=None):
161183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """print_version(file : file = stdout)
161283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
161383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Print the version message for this program (self.version) to
161483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        'file' (default stdout).  As with print_usage(), any occurrence
161583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        of "%prog" in self.version is replaced by the current program's
161683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        name.  Does nothing if self.version is empty or undefined.
161783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
161883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.version:
161983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            print >>file, self.get_version()
162083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
162183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_option_help(self, formatter=None):
162283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if formatter is None:
162383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            formatter = self.formatter
162483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        formatter.store_option_strings(self)
162583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        result = []
162683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        result.append(formatter.format_heading(_("Options")))
162783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        formatter.indent()
162883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.option_list:
162983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            result.append(OptionContainer.format_option_help(self, formatter))
163083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            result.append("\n")
163183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for group in self.option_groups:
163283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            result.append(group.format_help(formatter))
163383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            result.append("\n")
163483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        formatter.dedent()
163583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Drop the last "\n", or the header if no options or option groups:
163683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return "".join(result[:-1])
163783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
163883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_epilog(self, formatter):
163983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return formatter.format_epilog(self.epilog)
164083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
164183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def format_help(self, formatter=None):
164283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if formatter is None:
164383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            formatter = self.formatter
164483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        result = []
164583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.usage:
164683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            result.append(self.get_usage() + "\n")
164783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.description:
164883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            result.append(self.format_description(formatter) + "\n")
164983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        result.append(self.format_option_help(formatter))
165083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        result.append(self.format_epilog(formatter))
165183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return "".join(result)
165283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
165383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # used by test suite
165483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _get_encoding(self, file):
165583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        encoding = getattr(file, "encoding", None)
165683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not encoding:
165783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            encoding = sys.getdefaultencoding()
165883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return encoding
165983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
166083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def print_help(self, file=None):
166183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """print_help(file : file = stdout)
166283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
166383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Print an extended help message, listing all options and any
166483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        help text provided with them, to 'file' (default stdout).
166583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
166683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if file is None:
166783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            file = sys.stdout
166883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        encoding = self._get_encoding(file)
166983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        file.write(self.format_help().encode(encoding, "replace"))
167083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
167183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# class OptionParser
167283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
167383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
167483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef _match_abbrev(s, wordmap):
167583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """_match_abbrev(s : string, wordmap : {string : Option}) -> string
167683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
167783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Return the string key in 'wordmap' for which 's' is an unambiguous
167883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    abbreviation.  If 's' is found to be ambiguous or doesn't match any of
167983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    'words', raise BadOptionError.
168083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
168183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Is there an exact match?
168283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    if s in wordmap:
168383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return s
168483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    else:
168583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Isolate all words with s as a prefix.
168683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        possibilities = [word for word in wordmap.keys()
168783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         if word.startswith(s)]
168883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # No exact match, so there had better be just one possibility.
168983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if len(possibilities) == 1:
169083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return possibilities[0]
169183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif not possibilities:
169283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise BadOptionError(s)
169383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
169483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # More than one possible completion: ambiguous prefix.
169583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            possibilities.sort()
169683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise AmbiguousOptionError(s, possibilities)
169783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
169883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
169983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Some day, there might be many Option classes.  As of Optik 1.3, the
170083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# preferred way to instantiate Options is indirectly, via make_option(),
170183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# which will become a factory function when there are many Option
170283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# classes.
170383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehmake_option = Option
1704