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 = []

Reply via email to