Revision: 2992
Author: janne.t.harkonen
Date: Thu Apr 15 04:38:34 2010
Log: cleanup
http://code.google.com/p/robotframework/source/detail?r=2992
Modified:
/trunk/src/robot/running/arguments.py
/trunk/src/robot/running/userkeyword.py
=======================================
--- /trunk/src/robot/running/arguments.py Thu Apr 15 03:19:44 2010
+++ /trunk/src/robot/running/arguments.py Thu Apr 15 04:38:34 2010
@@ -26,9 +26,10 @@
_type = 'Keyword'
def __init__(self, argument_source, kw_or_lib_name):
- self.names, self.defaults, self.varargs, self.minargs,
self.maxargs \
+ self.names, self.defaults, self.varargs, minargs, maxargs \
= self._determine_args(argument_source)
- self._name = kw_or_lib_name
+ self._arg_limit_checker = _ArgLimitChecker(minargs, maxargs,
+ kw_or_lib_name,
self._type)
def resolve(self, args, variables, output=None):
posargs, namedargs = self._get_argument_resolver().resolve(args,
variables)
@@ -37,21 +38,7 @@
return posargs, namedargs
def check_arg_limits(self, args, namedargs={}):
- arg_count = len(args) + len(namedargs)
- if not self.minargs <= arg_count <= self.maxargs:
- self._raise_inv_args(arg_count)
- return args
-
- def _raise_inv_args(self, arg_count):
- minend = utils.plural_or_not(self.minargs)
- if self.minargs == self.maxargs:
- exptxt = "%d argument%s" % (self.minargs, minend)
- elif self.maxargs != sys.maxint:
- exptxt = "%d to %d arguments" % (self.minargs, self.maxargs)
- else:
- exptxt = "at least %d argument%s" % (self.minargs, minend)
- raise DataError("%s '%s' expected %s, got %d."
- % (self._type, self._name, exptxt, arg_count))
+ self._arg_limit_checker.check_arg_limits(args, namedargs)
def _tracelog_args(self, logger, posargs, namedargs={}):
if not logger:
@@ -209,56 +196,67 @@
return args, {}
-class UserKeywordArguments(_KeywordArguments):
+class PythonInitArguments(PythonKeywordArguments):
+ _type = 'Test Library'
+
+
+class JavaInitArguments(JavaKeywordArguments):
+ _type = 'Test Library'
+
+ def resolve(self, args, variables):
+ self.check_arg_limits(args)
+ return args, {}
+
+
+class UserKeywordArguments(object):
def __init__(self, argnames, defaults, vararg, minargs, maxargs, name):
self.names = list(argnames) # Python 2.5 does not support indexing
tuples
self.defaults = defaults
self._vararg = vararg
self.minargs = minargs
- self.maxargs = maxargs
- self._name = name
-
- def set_to(self, output, variables, arguments):
- template_with_defaults = self._template_for(variables)
- argument_values = self._fill(template_with_defaults, arguments,
variables)
- self._check_arg_limits(argument_values, len(arguments))
- self._set_variables(variables, argument_values)
- self._tracelog_args(output, variables)
+ self._arg_limit_checker = _ArgLimitChecker(minargs, maxargs,
+ name , 'Keyword')
+
+ def resolve(self, arguments, variables):
+ positional, varargs, named = self._resolve_arg_usage(arguments,
+ variables)
+ self._arg_limit_checker.check_arg_limits(positional+varargs, named)
+ argument_values = self._resolve_arg_values(variables, named,
positional)
+ argument_values += varargs
+ self._arg_limit_checker.check_missing_args(argument_values,
len(arguments))
+ return argument_values
def _template_for(self, variables):
return [ _MissingArg() for _ in range(self.minargs) ] \
+ variables.replace_list(list(self.defaults))
- def _fill(self, template, arguments, variables):
- arg_resolver = UserKeywordArgumentResolver(self)
- positional, named = arg_resolver.resolve(arguments)
- positional = variables.replace_list(positional)
- varargs = positional[len(self.names):]
- positional = positional[:len(self.names)]
+ def _resolve_arg_values(self, variables, named, positional):
+ template = self._template_for(variables)
for name, value in named.items():
- replaced = variables.replace_scalar(value)
- template[self.names.index(name)] = replaced
- named[name] = replaced
+ template[self.names.index(name)] = value
for index, value in enumerate(positional):
template[index] = value
- return template + varargs
-
- def _check_arg_limits(self, argument_values, orig_arg_count):
- self._check_missing_args(argument_values, orig_arg_count)
- self.check_arg_limits(argument_values)
-
- def _check_missing_args(self, template, arg_count):
- for a in template:
- if isinstance(a, _MissingArg):
- self._raise_inv_args(arg_count)
-
- def _set_variables(self, variables, arg_values):
+ return template
+
+ def _resolve_arg_usage(self, arguments, variables):
+ resolver = UserKeywordArgumentResolver(self)
+ positional, named = self._replace_variables(variables,
+
*resolver.resolve(arguments))
+ return self._split_args_and_varargs(positional) + (named, )
+
+ def _replace_variables(self, variables, positional, named):
+ for name in named:
+ named[name] = variables.replace_scalar(named[name])
+ return variables.replace_list(positional), named
+
+ def set_variables(self, arg_values, variables, output):
before_varargs, varargs = self._split_args_and_varargs(arg_values)
for name, value in zip(self.names, before_varargs):
variables[name] = value
if self._vararg:
variables[self._vararg] = varargs
+ self._tracelog_args(output, variables)
def _split_args_and_varargs(self, args):
if not self._vararg:
@@ -275,18 +273,6 @@
args.append('%s=%s' % (name, utils.safe_repr(variables[name])))
return ' | '.join(args)
-
-
-class PythonInitArguments(PythonKeywordArguments):
- _type = 'Test Library'
-
-
-class JavaInitArguments(JavaKeywordArguments):
- _type = 'Test Library'
-
- def resolve(self, args, variables):
- self.check_arg_limits(args)
- return args, {}
class _MissingArg(object):
@@ -413,3 +399,34 @@
args = args[:self._minargs]
args.append(varargs)
return args
+
+
+class _ArgLimitChecker(object):
+
+ def __init__(self, minargs, maxargs, name, type_):
+ self.minargs = minargs
+ self.maxargs = maxargs
+ self._name = name
+ self._type = type_
+
+ def check_arg_limits(self, args, namedargs={}):
+ arg_count = len(args) + len(namedargs)
+ if not self.minargs <= arg_count <= self.maxargs:
+ self._raise_inv_args(arg_count)
+ return args
+
+ def check_missing_args(self, args, arg_count):
+ for a in args:
+ if isinstance(a, _MissingArg):
+ self._raise_inv_args(arg_count)
+
+ def _raise_inv_args(self, arg_count):
+ minend = utils.plural_or_not(self.minargs)
+ if self.minargs == self.maxargs:
+ exptxt = "%d argument%s" % (self.minargs, minend)
+ elif self.maxargs != sys.maxint:
+ exptxt = "%d to %d arguments" % (self.minargs, self.maxargs)
+ else:
+ exptxt = "at least %d argument%s" % (self.minargs, minend)
+ raise DataError("%s '%s' expected %s, got %d."
+ % (self._type, self._name, exptxt, arg_count))
=======================================
--- /trunk/src/robot/running/userkeyword.py Thu Apr 15 00:44:41 2010
+++ /trunk/src/robot/running/userkeyword.py Thu Apr 15 04:38:34 2010
@@ -139,7 +139,9 @@
namespace.end_user_keyword()
def _run(self, output, namespace, arguments):
- self._arguments.set_to(output, namespace.variables, arguments)
+ argument_values = self._arguments.resolve(arguments,
namespace.variables)
+ self._arguments.set_variables(argument_values, namespace.variables,
+ output)
self._verify_keyword_is_valid()
self.timeout.start()
for kw in self.keywords:
--
To unsubscribe, reply using "remove me" as the subject.