Revision: 3374
Author: pekka.klarck
Date: Fri May 21 02:03:30 2010
Log: refactor creating keywords
http://code.google.com/p/robotframework/source/detail?r=3374

Modified:
 /trunk/src/robot/parsing/newmodel.py
 /trunk/src/robot/running/keywords.py

=======================================
--- /trunk/src/robot/parsing/newmodel.py        Fri May 21 01:58:56 2010
+++ /trunk/src/robot/parsing/newmodel.py        Fri May 21 02:03:30 2010
@@ -339,11 +339,8 @@
     def __init__(self, content):
         self.range, index = self._get_range_and_index(content)
         self.vars = content[:index]
-        self.values = content[index+1:]
+        self.items = content[index+1:]
         self.steps = []
-        self.name = '%s %s [ %s ]' % (' | '.join(self.vars),
-                                      self.range and 'IN RANGE' or 'IN',
-                                      ' | '.join(self.values))

     def _get_range_and_index(self, content):
         for index, item in enumerate(content):
=======================================
--- /trunk/src/robot/running/keywords.py        Thu May 20 23:44:56 2010
+++ /trunk/src/robot/running/keywords.py        Fri May 21 02:03:30 2010
@@ -16,7 +16,7 @@
 from robot.errors import (DataError, ExecutionFailed, ExecutionFailures,
                           HandlerExecutionFailed)
 from robot.common import BaseKeyword
-from robot.variables import is_var, is_list_var
+from robot.variables import is_var, is_list_var, is_scalar_var


 class Keywords(object):
@@ -44,13 +44,9 @@


 def _KeywordFactory(step):
-    # TODO: Support for FOR
-    try:
+    if not hasattr(step, 'steps'):
         return Keyword(step.keyword, step.args, step.assign)
-    except AttributeError:
-        return ForKeyword(step)
-    except DataError, err:
-        return SyntaxErrorKeyword(step.keyword, unicode(err))
+    return ForKeyword(step)


 class Keyword(BaseKeyword):
@@ -95,10 +91,12 @@
     def _end(self, context, return_value=None, error=None):
         self.endtime = utils.get_timestamp()
self.elapsedtime = utils.get_elapsed_time(self.starttime, self.endtime)
-        if not error or error.cont:
-            self._set_variables(context, return_value)
-            context.trace('Return: %s' % utils.safe_repr(return_value))
-        context.end_keyword(self)
+        try:
+            if not error or error.cont:
+                self._set_variables(context, return_value)
+                context.trace('Return: %s' % utils.safe_repr(return_value))
+        finally:
+            context.end_keyword(self)

     def _run(self, handler, context):
         try:
@@ -133,7 +131,13 @@

     def __init__(self, keyword, assign):
         self.keyword = keyword
-        self.scalar_vars, self.list_var = self._split_assing(assign)
+        # TODO: Cleanup handling errors
+        try:
+            self.scalar_vars, self.list_var = self._split_assing(assign)
+            self._error = None
+        except DataError, err:
+            self.scalar_vars, self.list_var = [], None
+            self._error = err

     def _split_assing(self, assign):
         scalar_vars = []
@@ -160,6 +164,8 @@
             yield self.list_var

     def set_variables(self, context, return_value):
+        if self._error:
+            raise self._error
         for name, value in self._get_vars_to_set(return_value):
             context.get_current_vars()[name] = value
             if is_list_var(name) or utils.is_list(value):
@@ -229,16 +235,22 @@
 class ForKeyword(BaseKeyword):

     def __init__(self, forstep):
+        BaseKeyword.__init__(self, self._get_name(forstep), type='for')
         self.vars = forstep.vars
-        self.items = forstep.values
+        self.items = forstep.items
         self.range = forstep.range
-        BaseKeyword.__init__(self, forstep.name, type='for')
         self.keywords = Keywords(forstep.steps)

+    def _get_name(self, data):
+        return '%s %s [ %s ]' % (' | '.join(data.vars),
+                                 'IN' if not data.range else 'IN RANGE',
+                                 ' | '.join(data.items))
+
     def run(self, context):
         self.starttime = utils.get_timestamp()
         context.output.start_keyword(self)
         try:
+            self._validate_vars()
             self._run(context)
         except ExecutionFailed, err:
             error = err
@@ -255,6 +267,13 @@
         if error:
             raise error

+    def _validate_vars(self):
+        if not self.vars:
+            raise DataError('FOR loop variables missing.')
+        for var in self.vars:
+            if not is_scalar_var(var):
+                raise DataError("Invalid FOR loop variable '%s'." % var)
+
     def _run(self, context):
         errors = []
items, iteration_steps = self._get_items_and_iteration_steps(context)
@@ -290,8 +309,6 @@
         return error

     def _replace_vars_from_items(self, variables):
-        if not self.vars:
-            self._raise_invalid_syntax()
         items = variables.replace_list(self.items)
         if self.range:
             items = self._get_range_items(items)
@@ -302,10 +319,6 @@
                         % (len(self.vars), utils.seq2str(self.vars),
                            len(items), utils.plural_or_not(items)))

-    def _raise_invalid_syntax(self):
-        raise DataError('Invalid syntax in FOR loop. Expected format:\n'
-                        '| : FOR | ${var} | IN | item1 | item2 |')
-
     def _get_range_items(self, items):
         try:
             items = [ int(item) for item in items ]
@@ -330,20 +343,3 @@
         self.status = status
         self.endtime = utils.get_timestamp()
self.elapsedtime = utils.get_elapsed_time(self.starttime, self.endtime)
-
-
-class SyntaxErrorKeyword(BaseKeyword):
-
-    def __init__(self, name, error):
-        BaseKeyword.__init__(self, name, type='error')
-        self._error = error
-
-    def run(self, context):
-        self.starttime = utils.get_timestamp()
-        self.status = 'FAIL'
-        context.output.start_keyword(self)
-        context.output.fail(self._error)
-        self.endtime = utils.get_timestamp()
- self.elapsedtime = utils.get_elapsed_time(self.starttime, self.endtime)
-        context.output.end_keyword(self)
-        raise ExecutionFailed(self._error, syntax=True)

Reply via email to