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