Revision: 2837
Author: KariHusa
Date: Tue Apr  6 03:35:01 2010
Log: Initial implementation for kwarg support, issue 215.
http://code.google.com/p/robotframework/source/detail?r=2837

Modified:
 /trunk/src/robot/running/handlers.py

=======================================
--- /trunk/src/robot/running/handlers.py        Tue Apr  6 00:14:15 2010
+++ /trunk/src/robot/running/handlers.py        Tue Apr  6 03:35:01 2010
@@ -125,9 +125,52 @@
         return self.check_arg_limits(args)

     def _run_handler(self, handler, args, output, timeout):
+        posargs, kwargs = self._resolve_kwargs(args)
         if timeout is not None and timeout.active():
-            return timeout.run(handler, args=args, logger=output)
-        return handler(*args)
+            return timeout.run(handler, args=posargs, logger=output)
+        return handler(*posargs, **kwargs)
+
+    def _resolve_kwargs(self, arguments):
+        posargs = []
+        kwargs = {}
+        kwargs_allowed = True
+        for arg in reversed(arguments):
+            if kwargs_allowed and self._is_kwarg(arg):
+                kwargs.update(self._parse_kwarg(arg))
+            else:
+                posargs.append(self._parse_posarg(arg))
+                kwargs_allowed = False
+        return reversed(posargs), kwargs
+
+    def _is_kwarg(self, arg):
+        if self._is_str_with_kwarg_sep(arg):
+            name, _ = self._split_from_kwarg_sep(arg)
+            return self._is_arg_name(name)
+        return False
+
+    def _is_arg_name(self, name):
+        return name in self.args
+
+    def _is_str_with_kwarg_sep(self, arg):
+        if not isinstance(arg, basestring):
+            return False
+        if not '=' in arg:
+            return False
+        return True
+
+    def _parse_kwarg(self, arg):
+        return dict([self._split_from_kwarg_sep(arg)])
+
+    def _split_from_kwarg_sep(self, arg):
+        name, value = arg.split('=', 1)
+        return str(name), value
+
+    def _parse_posarg(self, argstr):
+        if self._is_str_with_kwarg_sep(argstr):
+            name, _ = self._split_from_kwarg_sep(argstr)
+            if self._is_arg_name(name[:-1]):
+                return argstr.replace('\\=', '=')
+        return argstr

     def _get_timeout(self, namespace):
         # Timeouts must not be active for run keyword variants, only for


--
To unsubscribe, reply using "remove me" as the subject.

Reply via email to