Example #1
0
    def option_setup(func):
        optionParser = OptionParser(usage=usage)
        optionParser.disable_interspersed_args()
        for opt in option_list:
            # opt is an optparse Option
            optionParser.add_option(opt)
        optionParser.set_usage("%s [options] %s" % (func.__name__[3:], arg_desc))
        optionParser._func = func

        def oUpdateOptionParser(instance):
            if func.__name__.startswith('do_'):
                sName = func.__name__[3:]
                if hasattr(instance, 'oConfig') and sName in instance.oConfig:
                    oConfigSection = instance.oConfig[sName]
                    # iterate over optionParser
                    for sKey, gVal in oConfigSection.iteritems():
                        sOption = '--' +sKey
                        if optionParser.has_option(sOption):
                            oOption = optionParser.get_option(sOption)
                            # FixMe: only if the default is optparse.NO_DEFAULT?
                            if oOption.default is optparse.NO_DEFAULT:
                                # FixMe: does this set the default?
                                oOption.default = gVal
                                # FixMe: how about this?
                                optionParser.defaults[oOption.dest] = oOption.default
            return optionParser

        def new_func(instance, arg):
            try:
                # makebe return a list and prepend it
                optionParser = oUpdateOptionParser(instance)
                opts, newArgList = optionParser.parse_args(arg.split())
                # Must find the remaining args in the original argument list, but
                # mustn't include the command itself
                #if hasattr(arg, 'parsed') and newArgList[0] == arg.parsed.command:
                #    newArgList = newArgList[1:]
                newArgs = remaining_args(arg, newArgList)
                if isinstance(arg, ParsedString):
                    arg = arg.with_args_replaced(newArgs)
                else:
                    arg = newArgs
            except optparse.OptParseError as e:
                print (e)
                optionParser.print_help()
                return
            if hasattr(opts, '_exit'):
                return None
            result = func(instance, arg, opts)
            return result
        func._optionParser = optionParser
        if func.__doc__ is None and usage is None:
            func.__doc__ = ""
        elif func.__doc__ is None and usage:
            func.__doc__ = usage
        elif usage:
            func.__doc__ = '%s\n%s' % (usage, func.__doc__, )
        new_func.__doc__ = '%s\n%s' % (func.__doc__, optionParser.format_help())
        return new_func