Revision: 3262
Author: janne.t.harkonen
Date: Tue May 11 05:53:44 2010
Log: Better handling of UK args with dryrun
http://code.google.com/p/robotframework/source/detail?r=3262

Modified:
 /trunk/src/robot/running/arguments.py
 /trunk/src/robot/running/keywords.py
 /trunk/src/robot/running/userkeyword.py

=======================================
--- /trunk/src/robot/running/arguments.py       Tue May 11 00:22:37 2010
+++ /trunk/src/robot/running/arguments.py       Tue May 11 05:53:44 2010
@@ -216,7 +216,7 @@
         return args, {}


-class UserKeywordArguments(_KeywordArguments):
+class UserKeywordArguments(object):

def __init__(self, argnames, defaults, varargs, minargs, maxargs, name): self.names = list(argnames) # Python 2.5 does not support indexing tuples
@@ -226,6 +226,17 @@
         self._arg_limit_checker = _ArgLimitChecker(minargs, maxargs,
                                                    name, 'Keyword')

+    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)
+        needed_args = required_number_of_args - len(arguments)
+        if needed_args > 0:
+            return self._fill_missing_args(arguments, needed_args)
+        return arguments
+
+    def _fill_missing_args(self, arguments, needed):
+        return arguments + needed * [None]
+
     def resolve(self, arguments, variables):
positional, varargs, named = self._resolve_arg_usage(arguments, variables)
         self._arg_limit_checker.check_arg_limits(positional+varargs, named)
=======================================
--- /trunk/src/robot/running/keywords.py        Tue May 11 05:53:32 2010
+++ /trunk/src/robot/running/keywords.py        Tue May 11 05:53:44 2010
@@ -247,9 +247,9 @@
             raise error

     def _run(self, context):
-        items = self._replace_vars_from_items(context.get_current_vars())
         errors = []
-        for i in self._iteration_steps(items, context):
+ items, iteration_steps = self._get_items_and_iteration_steps(context)
+        for i in iteration_steps:
             values = items[i:i+len(self.vars)]
             err = self._run_one_round(context, self.vars, values)
             if err:
@@ -259,10 +259,11 @@
         if errors:
             raise ExecutionFailures(errors)

-    def _iteration_steps(self, items, context):
+    def _get_items_and_iteration_steps(self, context):
         if context.dry_run:
-            return [0]
-        return range(0, len(items), len(self.vars))
+            return self.vars, [0]
+        items = self._replace_vars_from_items(context.get_current_vars())
+        return items, range(0, len(items), len(self.vars))

     def _run_one_round(self, context, variables, values):
         foritem = ForItemKeyword(variables, values)
=======================================
--- /trunk/src/robot/running/userkeyword.py     Mon May 10 00:49:58 2010
+++ /trunk/src/robot/running/userkeyword.py     Tue May 11 05:53:44 2010
@@ -144,20 +144,21 @@
         return self._variable_resolving_run(context, variables, arguments)

     def _dry_run(self, context, variables, arguments):
-        self.arguments.check_arg_limits_for_dry_run(arguments)
-        return self._execute(context, variables)
+        args = self.arguments.resolve_arguments_for_dry_run(arguments)
+        self._execute(context, variables, args)
+        return None

     def _variable_resolving_run(self, context, variables, arguments):
         argument_values = self.arguments.resolve(arguments, variables)
+        self._execute(context, variables, argument_values)
+        return self._get_return_value(variables)
+
+    def _execute(self, context, variables, argument_values):
         self.arguments.set_variables(argument_values, variables,
                                      context.output)
-        return self._execute(context, variables)
-
-    def _execute(self, context, variables):
         self._verify_keyword_is_valid()
         self.timeout.start()
         self.keywords.run(context)
-        return self._get_return_value(variables)

     def _verify_keyword_is_valid(self):
         if self._errors:

Reply via email to