Revision: 3325
Author: jprantan
Date: Wed May 19 02:58:25 2010
Log: Initial changes towards supporting new parsing model.
http://code.google.com/p/robotframework/source/detail?r=3325
Modified:
/trunk/src/robot/running/arguments.py
/trunk/src/robot/running/keywords.py
=======================================
--- /trunk/src/robot/running/arguments.py Tue May 11 05:53:44 2010
+++ /trunk/src/robot/running/arguments.py Wed May 19 02:58:25 2010
@@ -16,7 +16,7 @@
from types import MethodType, FunctionType
from robot.errors import DataError, FrameworkError
-from robot.variables import is_list_var
+from robot.variables import is_list_var, is_scalar_var
from robot import utils
if utils.is_jython:
@@ -218,14 +218,51 @@
class UserKeywordArguments(object):
- def __init__(self, argnames, defaults, varargs, minargs, maxargs,
name):
+ def __init__(self, args, name):
+ argnames, self.defaults, self.varargs = self._get_arg_spec(args)
self.names = list(argnames) # Python 2.5 does not support indexing
tuples
- self.defaults = defaults
- self.varargs = varargs
- self.minargs = minargs
- self._arg_limit_checker = _ArgLimitChecker(minargs, maxargs,
+ self.minargs = len(argnames) - len(self.defaults)
+ maxargs = self.varargs is not None and sys.maxint or len(argnames)
+ self._arg_limit_checker = _ArgLimitChecker(self.minargs, maxargs,
name, 'Keyword')
+ def _get_arg_spec(self, origargs):
+ """Returns argument spec in a tuple (args, defaults, varargs).
+
+ args - tuple of all accepted arguments
+ defaults - tuple of default values
+ varargs - name of the argument accepting varargs or None
+
+ Examples:
+ ['${arg1}', '${arg2}']
+ => ('${arg1}', '${arg2}'), (), None
+ ['${arg1}', '${arg2}=default', '@{varargs}']
+ => ('${arg1}', '${arg2}'), ('default',), '@{varargs}'
+ """
+ args = []
+ defaults = []
+ varargs = None
+ for arg in origargs:
+ if varargs:
+ raise DataError('Only last argument can be a list')
+ if is_list_var(arg):
+ varargs = arg
+ continue # should be last round (otherwise DataError in
next)
+ arg, default = self._split_default(arg)
+ if defaults and not default:
+ raise DataError('Non default argument after default
arguments')
+ if not is_scalar_var(arg):
+ raise DataError("Invalid argument '%s'" % arg)
+ args.append(arg)
+ if default:
+ defaults.append(default)
+ return tuple(args), tuple(defaults), varargs
+
+ def _split_default(self, arg):
+ if '=' not in arg:
+ return arg, None
+ return arg.split('=', 1)
+
def resolve_arguments_for_dry_run(self, arguments):
self._arg_limit_checker.check_arg_limits_for_dry_run(arguments)
required_number_of_args = self.minargs + len(self.defaults)
=======================================
--- /trunk/src/robot/running/keywords.py Tue May 11 05:53:44 2010
+++ /trunk/src/robot/running/keywords.py Wed May 19 02:58:25 2010
@@ -21,8 +21,9 @@
class Keywords(object):
- def __init__(self, kwdata):
- self._keywords = [ _KeywordFactory(kw) for kw in kwdata ]
+ def __init__(self, steps):
+ #FIXME: Initial hack to support new parsing model
+ self._keywords = [ Keyword(step.keyword, step.args) for step in
steps ]
def run(self, context):
errors = []