######################################################################## # $Header: /var/local/cvsroot/4Suite/Ft/Lib/CommandLine/Arguments.py,v 1.4 2005/04/13 23:41:04 jkloth Exp $ """ Classes that support advanced arg processing for command-line scripts Copyright 2004 Fourthought, Inc. (USA). Detailed license and copyright information: http://4suite.org/COPYRIGHT Project home, documentation, distributions: http://4suite.org/ """ from CommandLineUtil import ArgumentError REQUIRED = 1 OPTIONAL = 2 ZERO_OR_MORE = 3 ONE_OR_MORE = 4 class Argument: def __init__(self, name, description, validationFunc=None): self.name = name self.description = description self.validationFunc = validationFunc or (lambda x: x) return class RequiredArgument(Argument): requirements = REQUIRED def gen_command_line(self): return self.name def validate(self,cmd,args): #Just the first if not len(args): raise ArgumentError(cmd, "missing required argument '%s'" % self.name) return self.validationFunc(args[0]),args[1:] class OptionalArgument(Argument): requirements = OPTIONAL def gen_command_line(self): return "[%s]" % (self.name) def validate(self,cmd,args): #Just the first, maybe if len(args): return self.validationFunc(args[0]),args[1:] return None,[] class ZeroOrMoreArgument(Argument): requirements = ZERO_OR_MORE def gen_command_line(self): return "[%s]..." % (self.name) def validate(self,cmd,args): #We take the rest eaten = map(lambda x,f=self.validationFunc:f(x),args) return eaten,[] class OneOrMoreArgument(Argument): requirements = ONE_OR_MORE def gen_command_line(self): return "%s [%s]..." % (self.name, self.name) def validate(self,cmd,args): #We take the rest if not len(args): raise ArgumentError(cmd, "missing required argument '%s'" % self.name) eaten = map(lambda x,f=self.validationFunc:f(x),args) return eaten,[] ## for cur_arg in cmd_args: ## if cur_arg[2] == '.': ## #A required arg ## if not len(cl_args): ## resArgs[cur_arg[0]] = self._translate_args(cur_arg[3],cur_arg[0],[cl_args[0]])[0] ## cl_args = cl_args[1:] ## elif cur_arg[2] == '?': ## if len(cl_args): ## resArgs[cur_arg[0]] = self._translate_args(cur_arg[3],cur_arg[0],[cl_args[0]])[0] ## cl_args = cl_args[1:] ## elif cur_arg[2] == '+': ## if not len(cl_args): ## raise ArgumentError("missing required argument '%s'" % cur_arg[0]) ## resArgs[cur_arg[0]] = self._translate_args(cur_arg[3],cur_arg[0],cl_args) ## cl_args = [] ## elif cur_arg[2] == '*': ## resArgs[cur_arg[0]] = self._translate_args(cur_arg[3],cur_arg[0],cl_args) ## cl_args = [] ## command[2] = resArgs ## return 1 ## def _translate_args(self,func,name,args): ## res = [] ## for arg in args: ## try: ## res.append(func(arg)) ## except: ## #import traceback ## #traceback.print_exc() ## raise ArgumentError('failed conversion for %s (%s)' % (arg, name)) ## return res