Revision: 3856
Author: jprantan
Date: Fri Aug 20 06:02:44 2010
Log: Run run keyword variants with dry run. Issue 610.
http://code.google.com/p/robotframework/source/detail?r=3856
Modified:
/trunk/src/robot/running/handlers.py
/trunk/src/robot/running/keywords.py
=======================================
--- /trunk/src/robot/running/handlers.py Mon May 31 05:21:54 2010
+++ /trunk/src/robot/running/handlers.py Fri Aug 20 06:02:44 2010
@@ -16,9 +16,11 @@
import sys
from robot import utils
+from robot.errors import DataError
from outputcapture import OutputCapturer
from runkwregister import RUN_KW_REGISTER
+from keywords import Keywords, Keyword
from arguments import (PythonKeywordArguments, JavaKeywordArguments,
DynamicKeywordArguments, RunKeywordArguments,
PythonInitArguments, JavaInitArguments)
@@ -92,10 +94,10 @@
def run(self, context, args):
if context.dry_run:
- return self._dry_run(args)
+ return self._dry_run(context, args)
return self._run(context, args)
- def _dry_run(self, args):
+ def _dry_run(self, context, args):
self.arguments.check_arg_limits_for_dry_run(args)
return None
@@ -198,6 +200,10 @@
class _RunKeywordHandler(_PythonHandler):
+ def __init__(self, library, handler_name, handler_method):
+ _PythonHandler.__init__(self, library, handler_name,
handler_method)
+ self._handler_method = handler_method
+
def _run_with_signal_monitoring(self, runner):
# With run keyword variants, only the keyword to be run can fail
# and therefore monitoring should not raise exception yet.
@@ -211,6 +217,43 @@
def _get_timeout(self, namespace):
return None
+ def _dry_run(self, context, args):
+ _RunnableHandler._dry_run(self, context, args)
+ keywords = self._get_runnable_keywords(context, args)
+ keywords.run(context)
+
+ def _get_runnable_keywords(self, context, args):
+ keywords = Keywords([])
+ for keyword in self._get_keywords(args):
+ if self._variable_syntax_in(keyword.name, context):
+ continue
+ keywords.add_keyword(keyword)
+ return keywords
+
+ def _get_keywords(self, args):
+ arg_names, varargs = self._get_handler_arg_names_and_varargs()
+ if 'name' in arg_names:
+ name_index = arg_names.index('name')
+ return [ Keyword(args[name_index], args[name_index+1:]) ]
+ elif varargs == 'names':
+ return [ Keyword(name, []) for name in args[len(arg_names):] ]
+ return []
+
+ def _get_handler_arg_names_and_varargs(self):
+ args, varargs, _, _ = inspect.getargspec(self._handler_method)
+ if inspect.ismethod(self._handler_method):
+ args = args[1:]
+ return args, varargs
+
+ def _variable_syntax_in(self, kw_name, context):
+ try:
+ resolved = context.namespace.variables.replace_string(kw_name)
+ #Variable can contain value, but it might be wrong,
+ #therefore it cannot be returned
+ return resolved != kw_name
+ except DataError:
+ return True
+
class _DynamicRunKeywordHandler(_DynamicHandler, _RunKeywordHandler):
_parse_arguments = _RunKeywordHandler._parse_arguments
=======================================
--- /trunk/src/robot/running/keywords.py Wed Aug 18 04:02:26 2010
+++ /trunk/src/robot/running/keywords.py Fri Aug 20 06:02:44 2010
@@ -27,15 +27,18 @@
if template:
steps = [s.apply_template(template) for s in steps]
for s in steps:
- self._add_keyword(s, template)
-
- def _add_keyword(self, step, template):
+ self._add_step(s, template)
+
+ def _add_step(self, step, template):
if step.is_comment():
return
if step.is_for_loop():
keyword = ForLoop(step, template)
else:
keyword = Keyword(step.keyword, step.args, step.assign)
+ self.add_keyword(keyword)
+
+ def add_keyword(self, keyword):
self._keywords.append(keyword)
def run(self, context):