srcanamdw/codescanner/pyinstaller/optik/option_parser.py
author noe\swadi
Thu, 18 Feb 2010 12:29:02 +0530
changeset 1 22878952f6e2
permissions -rw-r--r--
Committing the CodeScanner Core tool This component has been moved from the StaticAnaApps package. BUG : 5889 (http://developer.symbian.org/webbugs/show_bug.cgi?id=5889).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     1
"""optik.option_parser
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     3
Provides the OptionParser and Values classes.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     4
"""
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     5
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     6
# Copyright (c) 2001-2004 Gregory P. Ward.  All rights reserved.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     7
# See the README.txt distributed with Optik for licensing terms.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     8
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     9
import sys, os
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    10
import types, string
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    11
from optik.option import Option, NO_DEFAULT, _repr
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    12
from optik.help import IndentedHelpFormatter
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    13
from optik import errors
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    14
from optik.errors import gettext
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    15
_ = gettext
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    16
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    17
__revision__ = "$Id: option_parser.py,v 1.1 2009/02/05 23:03:30 stechong Exp $"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    18
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    19
__all__ = ['SUPPRESS_HELP', 'SUPPRESS_USAGE',
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    20
           'Values', 'OptionContainer', 'OptionGroup', 'OptionParser']
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    21
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    22
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    23
SUPPRESS_HELP = "SUPPRESS"+"HELP"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    24
SUPPRESS_USAGE = "SUPPRESS"+"USAGE"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    25
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    26
# For compatibility with Python 2.2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    27
try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    28
    True, False
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    29
except NameError:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    30
    (True, False) = (1, 0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    31
def isbasestring(x):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    32
    return isinstance(x, types.StringType) or isinstance(x, types.UnicodeType)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    33
if not hasattr(string, "startswith"):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    34
    def startswith(s, prefix):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    35
        return s[:len(prefix)] == prefix
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    36
    string.startswith = startswith
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    37
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    38
class Values:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    39
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    40
    def __init__(self, defaults=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    41
        if defaults:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    42
            for (attr, val) in defaults.items():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    43
                setattr(self, attr, val)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    44
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    45
    def __str__(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    46
        return str(self.__dict__)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    47
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    48
    __repr__ = _repr
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    49
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    50
    def __cmp__(self, other):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    51
        if isinstance(other, Values):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    52
            return cmp(self.__dict__, other.__dict__)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    53
        elif isinstance(other, types.DictType):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    54
            return cmp(self.__dict__, other)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    55
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    56
            return -1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    57
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    58
    def _update_careful(self, dict):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    59
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    60
        Update the option values from an arbitrary dictionary, but only
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    61
        use keys from dict that already have a corresponding attribute
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    62
        in self.  Any keys in dict without a corresponding attribute
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    63
        are silently ignored.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    64
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    65
        for attr in dir(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    66
            if dict.has_key(attr):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    67
                dval = dict[attr]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    68
                if dval is not None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    69
                    setattr(self, attr, dval)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    70
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    71
    def _update_loose(self, dict):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    72
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    73
        Update the option values from an arbitrary dictionary,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    74
        using all keys from the dictionary regardless of whether
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    75
        they have a corresponding attribute in self or not.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    76
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    77
        self.__dict__.update(dict)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    78
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    79
    def _update(self, dict, mode):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    80
        if mode == "careful":
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    81
            self._update_careful(dict)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    82
        elif mode == "loose":
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    83
            self._update_loose(dict)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    84
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    85
            raise ValueError, "invalid update mode: %s" % repr(mode)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    86
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    87
    def read_module(self, modname, mode="careful"):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    88
        __import__(modname)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    89
        mod = sys.modules[modname]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    90
        self._update(vars(mod), mode)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    91
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    92
    def read_file(self, filename, mode="careful"):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    93
        vars = {}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    94
        execfile(filename, vars)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    95
        self._update(vars, mode)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    96
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    97
    def ensure_value(self, attr, value):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    98
        if not hasattr(self, attr) or getattr(self, attr) is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    99
            setattr(self, attr, value)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   100
        return getattr(self, attr)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   101
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   102
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   103
class OptionContainer:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   104
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   105
    """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   106
    Abstract base class.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   107
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   108
    Class attributes:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   109
      standard_option_list : [Option]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   110
        list of standard options that will be accepted by all instances
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   111
        of this parser class (intended to be overridden by subclasses).
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   112
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   113
    Instance attributes:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   114
      option_list : [Option]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   115
        the list of Option objects contained by this OptionContainer
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   116
      _short_opt : { string : Option }
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   117
        dictionary mapping short option strings, eg. "-f" or "-X",
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   118
        to the Option instances that implement them.  If an Option
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   119
        has multiple short option strings, it will appears in this
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   120
        dictionary multiple times. [1]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   121
      _long_opt : { string : Option }
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   122
        dictionary mapping long option strings, eg. "--file" or
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   123
        "--exclude", to the Option instances that implement them.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   124
        Again, a given Option can occur multiple times in this
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   125
        dictionary. [1]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   126
      defaults : { string : any }
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   127
        dictionary mapping option destination names to default
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   128
        values for each destination [1]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   129
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   130
    [1] These mappings are common to (shared by) all components of the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   131
        controlling OptionParser, where they are initially created.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   132
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   133
    """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   134
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   135
    def __init__(self, option_class, conflict_handler, description):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   136
        # Initialize the option list and related data structures.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   137
        # This method must be provided by subclasses, and it must
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   138
        # initialize at least the following instance attributes:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   139
        # option_list, _short_opt, _long_opt, defaults.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   140
        self._create_option_list()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   141
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   142
        self.option_class = option_class
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   143
        self.set_conflict_handler(conflict_handler)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   144
        self.set_description(description)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   145
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   146
    def _create_option_mappings(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   147
        # For use by OptionParser constructor -- create the master
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   148
        # option mappings used by this OptionParser and all
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   149
        # OptionGroups that it owns.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   150
        self._short_opt = {}            # single letter -> Option instance
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   151
        self._long_opt = {}             # long option -> Option instance
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   152
        self.defaults = {}              # maps option dest -> default value
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   153
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   154
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   155
    def _share_option_mappings(self, parser):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   156
        # For use by OptionGroup constructor -- use shared option
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   157
        # mappings from the OptionParser that owns this OptionGroup.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   158
        self._short_opt = parser._short_opt
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   159
        self._long_opt = parser._long_opt
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   160
        self.defaults = parser.defaults
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   161
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   162
    def set_conflict_handler(self, handler):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   163
        if handler not in ("error", "resolve"):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   164
            raise ValueError, "invalid conflict_resolution value %s" % repr(handler)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   165
        self.conflict_handler = handler
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   166
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   167
    def set_description(self, description):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   168
        self.description = description
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   169
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   170
    def get_description(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   171
        return self.description
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   172
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   173
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   174
    # -- Option-adding methods -----------------------------------------
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   175
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   176
    def _check_conflict(self, option):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   177
        conflict_opts = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   178
        for opt in option._short_opts:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   179
            if self._short_opt.has_key(opt):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   180
                conflict_opts.append((opt, self._short_opt[opt]))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   181
        for opt in option._long_opts:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   182
            if self._long_opt.has_key(opt):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   183
                conflict_opts.append((opt, self._long_opt[opt]))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   184
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   185
        if conflict_opts:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   186
            handler = self.conflict_handler
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   187
            if handler == "error":
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   188
                opts = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   189
                for co in conflict_opts:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   190
                    opts.append(co[0])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   191
                raise errors.OptionConflictError(
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   192
                    "conflicting option string(s): %s"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   193
                    % string.join(opts, ", "),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   194
                    option)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   195
            elif handler == "resolve":
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   196
                for (opt, c_option) in conflict_opts:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   197
                    if string.startswith(opt, "--"):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   198
                        c_option._long_opts.remove(opt)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   199
                        del self._long_opt[opt]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   200
                    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   201
                        c_option._short_opts.remove(opt)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   202
                        del self._short_opt[opt]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   203
                    if not (c_option._short_opts or c_option._long_opts):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   204
                        c_option.container.option_list.remove(c_option)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   205
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   206
    def add_option(self, *args, **kwargs):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   207
        """add_option(Option)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   208
           add_option(opt_str, ..., kwarg=val, ...)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   209
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   210
        if type(args[0]) is types.StringType:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   211
            option = apply(self.option_class, args, kwargs)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   212
        elif len(args) == 1 and not kwargs:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   213
            option = args[0]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   214
            if not isinstance(option, Option):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   215
                raise TypeError, "not an Option instance: %s" % repr(option)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   216
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   217
            raise TypeError, "invalid arguments"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   218
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   219
        self._check_conflict(option)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   220
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   221
        self.option_list.append(option)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   222
        option.container = self
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   223
        for opt in option._short_opts:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   224
            self._short_opt[opt] = option
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   225
        for opt in option._long_opts:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   226
            self._long_opt[opt] = option
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   227
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   228
        if option.dest is not None:     # option has a dest, we need a default
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   229
            if option.default is not NO_DEFAULT:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   230
                self.defaults[option.dest] = option.default
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   231
            elif not self.defaults.has_key(option.dest):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   232
                self.defaults[option.dest] = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   233
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   234
        return option
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   235
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   236
    def add_options(self, option_list):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   237
        for option in option_list:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   238
            self.add_option(option)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   239
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   240
    # -- Option query/removal methods ----------------------------------
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   241
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   242
    def get_option(self, opt_str):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   243
        return (self._short_opt.get(opt_str) or
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   244
                self._long_opt.get(opt_str))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   245
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   246
    def has_option(self, opt_str):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   247
        return (self._short_opt.has_key(opt_str) or
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   248
                self._long_opt.has_key(opt_str))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   249
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   250
    def remove_option(self, opt_str):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   251
        option = self._short_opt.get(opt_str)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   252
        if option is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   253
            option = self._long_opt.get(opt_str)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   254
        if option is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   255
            raise ValueError("no such option %s" % repr(opt_str))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   256
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   257
        for opt in option._short_opts:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   258
            del self._short_opt[opt]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   259
        for opt in option._long_opts:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   260
            del self._long_opt[opt]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   261
        option.container.option_list.remove(option)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   262
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   263
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   264
    # -- Help-formatting methods ---------------------------------------
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   265
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   266
    def format_option_help(self, formatter):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   267
        if not self.option_list:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   268
            return ""
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   269
        result = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   270
        for option in self.option_list:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   271
            if not option.help is SUPPRESS_HELP:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   272
                result.append(formatter.format_option(option))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   273
        return string.join(result, "")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   274
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   275
    def format_description(self, formatter):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   276
        return formatter.format_description(self.get_description())
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   277
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   278
    def format_help(self, formatter):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   279
        result = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   280
        if self.description:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   281
            result.append(self.format_description(formatter))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   282
        if self.option_list:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   283
            result.append(self.format_option_help(formatter))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   284
        return string.join(result, "\n")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   285
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   286
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   287
class OptionGroup (OptionContainer):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   288
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   289
    def __init__(self, parser, title, description=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   290
        self.parser = parser
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   291
        OptionContainer.__init__(
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   292
            self, parser.option_class, parser.conflict_handler, description)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   293
        self.title = title
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   294
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   295
    def _create_option_list(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   296
        self.option_list = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   297
        self._share_option_mappings(self.parser)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   298
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   299
    def set_title(self, title):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   300
        self.title = title
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   301
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   302
    # -- Help-formatting methods ---------------------------------------
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   303
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   304
    def format_help(self, formatter):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   305
        result = formatter.format_heading(self.title)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   306
        formatter.indent()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   307
        result = result + OptionContainer.format_help(self, formatter)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   308
        formatter.dedent()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   309
        return result
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   310
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   311
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   312
class OptionParser (OptionContainer):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   313
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   314
    """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   315
    Class attributes:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   316
      standard_option_list : [Option]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   317
        list of standard options that will be accepted by all instances
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   318
        of this parser class (intended to be overridden by subclasses).
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   319
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   320
    Instance attributes:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   321
      usage : string
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   322
        a usage string for your program.  Before it is displayed
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   323
        to the user, "%prog" will be expanded to the name of
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   324
        your program (self.prog or os.path.basename(sys.argv[0])).
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   325
      prog : string
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   326
        the name of the current program (to override
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   327
        os.path.basename(sys.argv[0])).
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   328
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   329
      option_groups : [OptionGroup]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   330
        list of option groups in this parser (option groups are
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   331
        irrelevant for parsing the command-line, but very useful
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   332
        for generating help)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   333
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   334
      allow_interspersed_args : bool = true
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   335
        if true, positional arguments may be interspersed with options.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   336
        Assuming -a and -b each take a single argument, the command-line
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   337
          -ablah foo bar -bboo baz
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   338
        will be interpreted the same as
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   339
          -ablah -bboo -- foo bar baz
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   340
        If this flag were false, that command line would be interpreted as
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   341
          -ablah -- foo bar -bboo baz
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   342
        -- ie. we stop processing options as soon as we see the first
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   343
        non-option argument.  (This is the tradition followed by
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   344
        Python's getopt module, Perl's Getopt::Std, and other argument-
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   345
        parsing libraries, but it is generally annoying to users.)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   346
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   347
      process_default_values : bool = true
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   348
        if true, option default values are processed similarly to option
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   349
        values from the command line: that is, they are passed to the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   350
        type-checking function for the option's type (as long as the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   351
        default value is a string).  (This really only matters if you
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   352
        have defined custom types; see SF bug #955889.)  Set it to false
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   353
        to restore the behaviour of Optik 1.4.1 and earlier.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   354
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   355
      rargs : [string]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   356
        the argument list currently being parsed.  Only set when
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   357
        parse_args() is active, and continually trimmed down as
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   358
        we consume arguments.  Mainly there for the benefit of
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   359
        callback options.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   360
      largs : [string]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   361
        the list of leftover arguments that we have skipped while
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   362
        parsing options.  If allow_interspersed_args is false, this
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   363
        list is always empty.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   364
      values : Values
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   365
        the set of option values currently being accumulated.  Only
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   366
        set when parse_args() is active.  Also mainly for callbacks.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   367
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   368
    Because of the 'rargs', 'largs', and 'values' attributes,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   369
    OptionParser is not thread-safe.  If, for some perverse reason, you
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   370
    need to parse command-line arguments simultaneously in different
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   371
    threads, use different OptionParser instances.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   372
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   373
    """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   374
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   375
    standard_option_list = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   376
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   377
    def __init__(self,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   378
                 usage=None,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   379
                 option_list=None,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   380
                 option_class=Option,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   381
                 version=None,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   382
                 conflict_handler="error",
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   383
                 description=None,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   384
                 formatter=None,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   385
                 add_help_option=True,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   386
                 prog=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   387
        OptionContainer.__init__(
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   388
            self, option_class, conflict_handler, description)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   389
        self.set_usage(usage)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   390
        self.prog = prog
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   391
        self.version = version
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   392
        self.allow_interspersed_args = True
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   393
        self.process_default_values = True
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   394
        if formatter is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   395
            formatter = IndentedHelpFormatter()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   396
        self.formatter = formatter
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   397
        self.formatter.set_parser(self)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   398
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   399
        # Populate the option list; initial sources are the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   400
        # standard_option_list class attribute, the 'option_list'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   401
        # argument, and (if applicable) the _add_version_option() and
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   402
        # _add_help_option() methods.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   403
        self._populate_option_list(option_list,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   404
                                   add_help=add_help_option)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   405
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   406
        self._init_parsing_state()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   407
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   408
    # -- Private methods -----------------------------------------------
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   409
    # (used by our or OptionContainer's constructor)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   410
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   411
    def _create_option_list(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   412
        self.option_list = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   413
        self.option_groups = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   414
        self._create_option_mappings()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   415
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   416
    def _add_help_option(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   417
        self.add_option("-h", "--help",
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   418
                        action="help",
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   419
                        help=_("show this help message and exit"))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   420
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   421
    def _add_version_option(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   422
        self.add_option("--version",
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   423
                        action="version",
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   424
                        help=_("show program's version number and exit"))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   425
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   426
    def _populate_option_list(self, option_list, add_help=True):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   427
        if self.standard_option_list:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   428
            self.add_options(self.standard_option_list)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   429
        if option_list:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   430
            self.add_options(option_list)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   431
        if self.version:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   432
            self._add_version_option()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   433
        if add_help:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   434
            self._add_help_option()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   435
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   436
    def _init_parsing_state(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   437
        # These are set in parse_args() for the convenience of callbacks.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   438
        self.rargs = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   439
        self.largs = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   440
        self.values = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   441
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   442
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   443
    # -- Simple modifier methods ---------------------------------------
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   444
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   445
    def set_usage(self, usage):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   446
        if usage is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   447
            self.usage = _("%prog [options]")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   448
        elif usage is SUPPRESS_USAGE:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   449
            self.usage = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   450
        # For backwards compatibility with Optik 1.3 and earlier.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   451
        elif string.startswith(usage, "usage:" + " "):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   452
            self.usage = usage[7:]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   453
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   454
            self.usage = usage
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   455
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   456
    def enable_interspersed_args(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   457
        self.allow_interspersed_args = True
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   458
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   459
    def disable_interspersed_args(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   460
        self.allow_interspersed_args = False
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   461
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   462
    def set_process_default_values(self, process):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   463
        self.process_default_values = process
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   464
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   465
    def set_default(self, dest, value):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   466
        self.defaults[dest] = value
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   467
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   468
    def set_defaults(self, **kwargs):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   469
        self.defaults.update(kwargs)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   470
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   471
    def _get_all_options(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   472
        options = self.option_list[:]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   473
        for group in self.option_groups:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   474
            options.extend(group.option_list)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   475
        return options
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   476
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   477
    def get_default_values(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   478
        if not self.process_default_values:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   479
            # Old, pre-Optik 1.5 behaviour.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   480
            return Values(self.defaults)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   481
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   482
        defaults = self.defaults.copy()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   483
        for option in self._get_all_options():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   484
            default = defaults.get(option.dest)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   485
            if isbasestring(default):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   486
                opt_str = option.get_opt_string()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   487
                defaults[option.dest] = option.check_value(opt_str, default)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   488
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   489
        return Values(defaults)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   490
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   491
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   492
    # -- OptionGroup methods -------------------------------------------
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   493
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   494
    def add_option_group(self, *args, **kwargs):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   495
        # XXX lots of overlap with OptionContainer.add_option()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   496
        if type(args[0]) is types.StringType:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   497
            group = apply(OptionGroup, (self,) + args, kwargs)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   498
        elif len(args) == 1 and not kwargs:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   499
            group = args[0]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   500
            if not isinstance(group, OptionGroup):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   501
                raise TypeError, "not an OptionGroup instance: %s" % repr(group)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   502
            if group.parser is not self:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   503
                raise ValueError, "invalid OptionGroup (wrong parser)"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   504
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   505
            raise TypeError, "invalid arguments"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   506
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   507
        self.option_groups.append(group)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   508
        return group
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   509
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   510
    def get_option_group(self, opt_str):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   511
        option = (self._short_opt.get(opt_str) or
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   512
                  self._long_opt.get(opt_str))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   513
        if option and option.container is not self:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   514
            return option.container
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   515
        return None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   516
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   517
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   518
    # -- Option-parsing methods ----------------------------------------
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   519
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   520
    def _get_args(self, args):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   521
        if args is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   522
            return sys.argv[1:]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   523
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   524
            return args[:]              # don't modify caller's list
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   525
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   526
    def parse_args(self, args=None, values=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   527
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   528
        parse_args(args : [string] = sys.argv[1:],
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   529
                   values : Values = None)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   530
        -> (values : Values, args : [string])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   531
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   532
        Parse the command-line options found in 'args' (default:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   533
        sys.argv[1:]).  Any errors result in a call to 'error()', which
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   534
        by default prints the usage message to stderr and calls
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   535
        sys.exit() with an error message.  On success returns a pair
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   536
        (values, args) where 'values' is an Values instance (with all
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   537
        your option values) and 'args' is the list of arguments left
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   538
        over after parsing options.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   539
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   540
        rargs = self._get_args(args)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   541
        if values is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   542
            values = self.get_default_values()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   543
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   544
        # Store the halves of the argument list as attributes for the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   545
        # convenience of callbacks:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   546
        #   rargs
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   547
        #     the rest of the command-line (the "r" stands for
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   548
        #     "remaining" or "right-hand")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   549
        #   largs
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   550
        #     the leftover arguments -- ie. what's left after removing
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   551
        #     options and their arguments (the "l" stands for "leftover"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   552
        #     or "left-hand")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   553
        self.rargs = rargs
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   554
        self.largs = largs = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   555
        self.values = values
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   556
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   557
        try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   558
            stop = self._process_args(largs, rargs, values)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   559
        except (errors.BadOptionError, errors.OptionValueError), err:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   560
            self.error(str(err))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   561
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   562
        args = largs + rargs
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   563
        return self.check_values(values, args)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   564
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   565
    def check_values(self, values, args):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   566
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   567
        check_values(values : Values, args : [string])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   568
        -> (values : Values, args : [string])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   569
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   570
        Check that the supplied option values and leftover arguments are
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   571
        valid.  Returns the option values and leftover arguments
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   572
        (possibly adjusted, possibly completely new -- whatever you
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   573
        like).  Default implementation just returns the passed-in
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   574
        values; subclasses may override as desired.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   575
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   576
        return (values, args)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   577
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   578
    def _process_args(self, largs, rargs, values):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   579
        """_process_args(largs : [string],
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   580
                         rargs : [string],
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   581
                         values : Values)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   582
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   583
        Process command-line arguments and populate 'values', consuming
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   584
        options and arguments from 'rargs'.  If 'allow_interspersed_args' is
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   585
        false, stop at the first non-option argument.  If true, accumulate any
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   586
        interspersed non-option arguments in 'largs'.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   587
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   588
        while rargs:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   589
            arg = rargs[0]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   590
            # We handle bare "--" explicitly, and bare "-" is handled by the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   591
            # standard arg handler since the short arg case ensures that the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   592
            # len of the opt string is greater than 1.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   593
            if arg == "--":
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   594
                del rargs[0]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   595
                return
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   596
            elif arg[0:2] == "--":
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   597
                # process a single long option (possibly with value(s))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   598
                self._process_long_opt(rargs, values)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   599
            elif arg[:1] == "-" and len(arg) > 1:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   600
                # process a cluster of short options (possibly with
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   601
                # value(s) for the last one only)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   602
                self._process_short_opts(rargs, values)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   603
            elif self.allow_interspersed_args:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   604
                largs.append(arg)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   605
                del rargs[0]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   606
            else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   607
                return                  # stop now, leave this arg in rargs
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   608
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   609
        # Say this is the original argument list:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   610
        # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   611
        #                            ^
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   612
        # (we are about to process arg(i)).
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   613
        #
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   614
        # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   615
        # [arg0, ..., arg(i-1)] (any options and their arguments will have
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   616
        # been removed from largs).
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   617
        #
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   618
        # The while loop will usually consume 1 or more arguments per pass.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   619
        # If it consumes 1 (eg. arg is an option that takes no arguments),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   620
        # then after _process_arg() is done the situation is:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   621
        #
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   622
        #   largs = subset of [arg0, ..., arg(i)]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   623
        #   rargs = [arg(i+1), ..., arg(N-1)]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   624
        #
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   625
        # If allow_interspersed_args is false, largs will always be
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   626
        # *empty* -- still a subset of [arg0, ..., arg(i-1)], but
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   627
        # not a very interesting subset!
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   628
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   629
    def _match_long_opt(self, opt):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   630
        """_match_long_opt(opt : string) -> string
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   631
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   632
        Determine which long option string 'opt' matches, ie. which one
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   633
        it is an unambiguous abbrevation for.  Raises BadOptionError if
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   634
        'opt' doesn't unambiguously match any long option string.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   635
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   636
        return _match_abbrev(opt, self._long_opt)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   637
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   638
    def _process_long_opt(self, rargs, values):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   639
        arg = rargs.pop(0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   640
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   641
        # Value explicitly attached to arg?  Pretend it's the next
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   642
        # argument.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   643
        if "=" in arg:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   644
            (opt, next_arg) = string.split(arg, "=", 1)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   645
            rargs.insert(0, next_arg)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   646
            had_explicit_value = True
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   647
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   648
            opt = arg
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   649
            had_explicit_value = False
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   650
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   651
        opt = self._match_long_opt(opt)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   652
        option = self._long_opt[opt]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   653
        if option.takes_value():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   654
            nargs = option.nargs
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   655
            if len(rargs) < nargs:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   656
                if nargs == 1:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   657
                    self.error(_("%s option requires an argument") % opt)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   658
                else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   659
                    self.error(_("%s option requires %d arguments")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   660
                               % (opt, nargs))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   661
            elif nargs == 1:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   662
                value = rargs.pop(0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   663
            else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   664
                value = tuple(rargs[0:nargs])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   665
                del rargs[0:nargs]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   666
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   667
        elif had_explicit_value:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   668
            self.error(_("%s option does not take a value") % opt)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   669
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   670
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   671
            value = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   672
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   673
        option.process(opt, value, values, self)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   674
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   675
    def _process_short_opts(self, rargs, values):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   676
        arg = rargs.pop(0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   677
        stop = False
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   678
        i = 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   679
        for ch in arg[1:]:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   680
            opt = "-" + ch
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   681
            option = self._short_opt.get(opt)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   682
            i = i+1                      # we have consumed a character
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   683
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   684
            if not option:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   685
                raise errors.BadOptionError(opt)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   686
                #self.error(_("no such option: %s") % opt)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   687
            if option.takes_value():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   688
                # Any characters left in arg?  Pretend they're the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   689
                # next arg, and stop consuming characters of arg.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   690
                if i < len(arg):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   691
                    rargs.insert(0, arg[i:])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   692
                    stop = True
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   693
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   694
                nargs = option.nargs
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   695
                if len(rargs) < nargs:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   696
                    if nargs == 1:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   697
                        self.error(_("%s option requires an argument") % opt)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   698
                    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   699
                        self.error(_("%s option requires %d arguments")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   700
                                   % (opt, nargs))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   701
                elif nargs == 1:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   702
                    value = rargs.pop(0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   703
                else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   704
                    value = tuple(rargs[0:nargs])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   705
                    del rargs[0:nargs]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   706
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   707
            else:                       # option doesn't take a value
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   708
                value = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   709
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   710
            option.process(opt, value, values, self)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   711
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   712
            if stop:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   713
                break
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   714
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   715
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   716
    # -- Feedback methods ----------------------------------------------
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   717
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   718
    def get_prog_name(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   719
        if self.prog is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   720
            return os.path.basename(sys.argv[0])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   721
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   722
            return self.prog
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   723
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   724
    def expand_prog_name(self, s):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   725
        return string.replace(s, "%prog", self.get_prog_name())
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   726
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   727
    def get_description(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   728
        return self.expand_prog_name(self.description)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   729
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   730
    def exit(self, status=0, msg=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   731
        if msg:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   732
            sys.stderr.write(msg)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   733
        sys.exit(status)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   734
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   735
    def error(self, msg):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   736
        """error(msg : string)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   737
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   738
        Print a usage message incorporating 'msg' to stderr and exit.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   739
        If you override this in a subclass, it should not return -- it
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   740
        should either exit or raise an exception.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   741
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   742
        self.print_usage(sys.stderr)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   743
        self.exit(2, "%s: error: %s\n" % (self.get_prog_name(), msg))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   744
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   745
    def get_usage(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   746
        if self.usage:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   747
            return self.formatter.format_usage(
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   748
                self.expand_prog_name(self.usage))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   749
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   750
            return ""
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   751
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   752
    def print_usage(self, file=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   753
        """print_usage(file : file = stdout)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   754
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   755
        Print the usage message for the current program (self.usage) to
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   756
        'file' (default stdout).  Any occurence of the string "%prog" in
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   757
        self.usage is replaced with the name of the current program
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   758
        (basename of sys.argv[0]).  Does nothing if self.usage is empty
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   759
        or not defined.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   760
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   761
        if self.usage:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   762
            if file is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   763
                file = sys.stdout
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   764
            file.write(self.get_usage() + "\n")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   765
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   766
    def get_version(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   767
        if self.version:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   768
            return self.expand_prog_name(self.version)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   769
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   770
            return ""
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   771
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   772
    def print_version(self, file=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   773
        """print_version(file : file = stdout)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   774
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   775
        Print the version message for this program (self.version) to
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   776
        'file' (default stdout).  As with print_usage(), any occurence
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   777
        of "%prog" in self.version is replaced by the current program's
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   778
        name.  Does nothing if self.version is empty or undefined.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   779
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   780
        if self.version:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   781
            if file is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   782
                file = sys.stdout
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   783
            file.write(self.get_version() + "\n")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   784
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   785
    def format_option_help(self, formatter=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   786
        if formatter is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   787
            formatter = self.formatter
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   788
        formatter.store_option_strings(self)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   789
        result = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   790
        result.append(formatter.format_heading(_("options")))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   791
        formatter.indent()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   792
        if self.option_list:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   793
            result.append(OptionContainer.format_option_help(self, formatter))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   794
            result.append("\n")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   795
        for group in self.option_groups:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   796
            result.append(group.format_help(formatter))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   797
            result.append("\n")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   798
        formatter.dedent()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   799
        # Drop the last "\n", or the header if no options or option groups:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   800
        return string.join(result[:-1], "")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   801
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   802
    def format_help(self, formatter=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   803
        if formatter is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   804
            formatter = self.formatter
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   805
        result = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   806
        if self.usage:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   807
            result.append(self.get_usage() + "\n")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   808
        if self.description:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   809
            result.append(self.format_description(formatter) + "\n")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   810
        result.append(self.format_option_help(formatter))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   811
        return string.join(result, "")
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   812
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   813
    def print_help(self, file=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   814
        """print_help(file : file = stdout)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   815
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   816
        Print an extended help message, listing all options and any
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   817
        help text provided with them, to 'file' (default stdout).
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   818
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   819
        if file is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   820
            file = sys.stdout
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   821
        file.write(self.format_help())
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   822
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   823
# class OptionParser
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   824
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   825
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   826
def _match_abbrev(s, wordmap):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   827
    """_match_abbrev(s : string, wordmap : {string : Option}) -> string
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   828
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   829
    Return the string key in 'wordmap' for which 's' is an unambiguous
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   830
    abbreviation.  If 's' is found to be ambiguous or doesn't match any of
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   831
    'words', raise BadOptionError.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   832
    """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   833
    # Is there an exact match?
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   834
    if wordmap.has_key(s):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   835
        return s
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   836
    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   837
        # Isolate all words with s as a prefix.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   838
        possibilities = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   839
        for word in wordmap.keys():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   840
            if string.startswith(word, s):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   841
                possibilities.append(word)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   842
        # No exact match, so there had better be just one possibility.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   843
        if len(possibilities) == 1:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   844
            return possibilities[0]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   845
        elif not possibilities:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   846
            raise errors.BadOptionError(s)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   847
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   848
            # More than one possible completion: ambiguous prefix.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   849
            raise errors.AmbiguousOptionError(s, possibilities)