Revision: 2841
Author: KariHusa
Date: Tue Apr 6 22:25:31 2010
Log: Initial implementation of kwarg support in user keywords, issue 215
http://code.google.com/p/robotframework/source/detail?r=2841
Modified:
/trunk/src/robot/running/userkeyword.py
=======================================
--- /trunk/src/robot/running/userkeyword.py Tue Apr 6 04:09:03 2010
+++ /trunk/src/robot/running/userkeyword.py Tue Apr 6 22:25:31 2010
@@ -143,17 +143,44 @@
output.trace('Return: %s' % utils.unic(ret))
return ret
- def _set_defaults_if_needed(self, args, vars):
- if len(args) < len(self.args):
- args += self._get_defaults(args, vars)
- return args
-
def _set_args_to_namespace(self, arguments, vars):
- args = self._set_defaults_if_needed(arguments, vars)
- for name, value in zip(self.args, args):
- vars[name] = value
+ signature = self._get_signature(vars)
+ args = arguments
if self.varargs:
vars[self.varargs] = self._get_varargs(args)
+ args = args[:len(signature)]
+ args = self._replace_kwargs(signature, args)
+ for name, value in zip(self.args, args):
+ vars[name] = value
+
+ def _get_signature(self, variables):
+ return [ MissingArg() for _ in
range(len(self.args)-len(self.defaults)) ] +\
+ list(variables.replace_list(self.defaults))
+
+ def _replace_kwargs(self, signature, arguments):
+ for arg in reversed(arguments):
+ if self._is_str_with_kwarg_sep(arg):
+ name, value = self._split_from_kwarg_sep(arg)
+ name = '${%s}' % name
+ if name in self.args:
+ signature[self.args.index(name)] = value
+ arguments.pop(-1)
+ else:
+ break
+ for index, arg in enumerate(arguments):
+ signature[index] = arg
+ return signature
+
+ def _is_str_with_kwarg_sep(self, arg):
+ if not isinstance(arg, basestring):
+ return False
+ if not '=' in arg:
+ return False
+ return True
+
+ def _split_from_kwarg_sep(self, arg):
+ name, value = arg.split('=', 1)
+ return str(name), value
def _run_kws(self, output, namespace):
for kw in self.keywords:
@@ -179,12 +206,6 @@
return ret
return ret[0]
- def _get_defaults(self, args, variables):
- """Returns as many default values as needed"""
- defaults_needed = len(self.args) - len(args)
- defaults = self.defaults[len(self.defaults)-defaults_needed:]
- return tuple(variables.replace_list(defaults))
-
def _get_varargs(self, args):
"""Returns args leftoever from argspec and thus belonging to
varargs"""
vararg_count = len(args) - len(self.args)
@@ -192,6 +213,10 @@
return varargs # Variables already replaced
+class MissingArg(object):
+ pass
+
+
class EmbeddedArgsTemplate(UserHandler):
def __init__(self, handlerdata, libname):
--
To unsubscribe, reply using "remove me" as the subject.