Revision: 3369
Author: KariHusa
Date: Fri May 21 01:31:42 2010
Log: Setting name validation in model
http://code.google.com/p/robotframework/source/detail?r=3369

Modified:
 /trunk/src/robot/parsing/datareader.py
 /trunk/src/robot/parsing/newmodel.py
 /trunk/src/robot/parsing/populator.py

=======================================
--- /trunk/src/robot/parsing/datareader.py      Fri May 21 00:09:28 2010
+++ /trunk/src/robot/parsing/datareader.py      Fri May 21 01:31:42 2010
@@ -107,21 +107,41 @@
 class DataRow(object):
     _row_continuation_marker = '...'
     _whitespace_regexp = re.compile('\s+')
+    _ye_olde_metadata_prefix = 'meta:'

     def __init__(self, cells):
         self.cells, self.comments = self._parse(cells)
-        self.head = self.cells[0] if self.cells else None
-        self.tail = self.cells[1:] if self.cells else None
-        self.all = self.cells
+
+    @property
+    def head(self):
+        return self.cells[0] if self.cells else None
+
+    @property
+    def tail(self):
+        return self.cells[1:] if self.cells else None
+
+    @property
+    def all(self):
+        return self.cells

     def dedent(self):
-        dedented = DataRow(self.tail)
-        dedented.comments = self.comments
-        return dedented
+        row = DataRow(self.tail)
+        row.comments = self.comments
+        return row

     def startswith(self, value):
         return self.head() == value

+    def handle_old_style_metadata(self):
+        if self._is_metadata_with_olde_prefix(self.head):
+            self.cells = self._convert_to_new_style_metadata()
+
+    def _is_metadata_with_olde_prefix(self, value):
+        return value.lower().startswith(self._ye_olde_metadata_prefix)
+
+    def _convert_to_new_style_metadata(self):
+ return ['Metadata'] + [self.head.split(':', 1)[1].strip()] + self.tail
+
     def starts_for_loop(self):
         if self.head and self.head.startswith(':'):
             return self.head.replace(':', '').upper().strip() == 'FOR'
=======================================
--- /trunk/src/robot/parsing/newmodel.py        Fri May 21 01:07:02 2010
+++ /trunk/src/robot/parsing/newmodel.py        Fri May 21 01:31:42 2010
@@ -17,6 +17,7 @@
 from robot.errors import DataError
 from robot.variables import is_var
 from robot.output import LOGGER
+from robot import utils

 from settings import (Documentation, Fixture, Timeout, Tags, Metadata,
                       Library, Resource, Variables, Arguments, Return)
@@ -56,7 +57,7 @@
     def __init__(self, parent=None, source=None):
         _TestData.__init__(self, source)
self.directory = os.path.dirname(self.source) if self.source else None
-        self.setting_table = SettingTable(self)
+        self.setting_table = TestCaseFileSettingTable(self)
         self.variable_table = VariableTable(self)
         self.testcase_table = TestCaseTable(self)
         self.keyword_table = KeywordTable(self)
@@ -74,7 +75,7 @@
     def __init__(self, source=None):
         _TestData.__init__(self, source=source)
self.directory = os.path.dirname(self.source) if self.source else None
-        self.setting_table = SettingTable(self)
+        self.setting_table = ResourceFileSettingTable(self)
         self.variable_table = VariableTable(self)
         self.testcase_table = TestCaseTableNotAllowed('resource file')
         self.keyword_table = KeywordTable(self)
@@ -93,7 +94,7 @@
         _TestData.__init__(self, parent, source)
         self.directory = self.source
         self.initfile = None
-        self.setting_table = SettingTable(self)
+        self.setting_table = InitFileSettingTable(self)
         self.variable_table = VariableTable(self)
self.testcase_table = TestCaseTableNotAllowed('test suite init file')
         self.keyword_table = KeywordTable(self)
@@ -128,7 +129,7 @@
         self.parent.report_invalid_syntax(table, message, level)


-class SettingTable(_Table):
+class _SettingTable(_Table):

     def __init__(self, parent):
         _Table.__init__(self, parent)
@@ -142,6 +143,7 @@
         self.default_tags = Tags()
         self.metadata = []
         self.imports = []
+        self._setting_setters = self._get_setting_setters()

     def add_metadata(self, name, value, comment=None):
         self.metadata.append(Metadata(self, name, value, comment))
@@ -166,6 +168,69 @@
                         + self.metadata + self.imports:
             yield setting

+    def setter_for(self, setting_name):
+        return self._setting_setters[setting_name]
+
+    def is_setting(self, setting_name):
+        return setting_name in self._setting_setters
+
+
+class TestCaseFileSettingTable(_SettingTable):
+
+    def _get_setting_setters(self):
+        return utils.NormalizedDict({'Documentation': self.doc.set,
+                                     'Document': self.doc.set,
+                                     'Suite Setup': self.suite_setup.set,
+ 'Suite Precondition': self.suite_setup.set, + 'Suite Teardown': self.suite_teardown.set, + 'Suite Postcondition': self.suite_teardown.set,
+                                     'Test Setup': self.test_setup.set,
+ 'Test Precondition': self.test_setup.set, + 'Test Teardown': self.test_teardown.set, + 'Test Postcondition': self.test_teardown.set,
+                                     'Force Tags': self.force_tags.set,
+                                     'Default Tags': self.default_tags.set,
+                                     'Test Timeout': self.test_timeout.set,
+ 'Library': ImportSetter(self.add_library), + 'Resource': ImportSetter(self.add_resource), + 'Variables': ImportSetter(self.add_variables), + 'Metadata': ImportSetter(self.add_metadata)})
+
+
+class ImportSetter(object):
+    def __init__(self, setter):
+        self._setter = setter
+    def __call__(self, datacells, comment):
+        self._setter(datacells[0], datacells[1:], comment)
+
+
+class ResourceFileSettingTable(_SettingTable):
+    def _get_setting_setters(self):
+        return utils.NormalizedDict({'Documentation': self.doc.set,
+                                     'Document': self.doc.set,
+ 'Library': ImportSetter(self.add_library), + 'Resource': ImportSetter(self.add_resource), + 'Variables': ImportSetter(self.add_variables)})
+
+
+class InitFileSettingTable(_SettingTable):
+    def _get_setting_setters(self):
+        return utils.NormalizedDict({'Documentation': self.doc.set,
+                                     'Document': self.doc.set,
+                                     'Suite Setup': self.suite_setup.set,
+ 'Suite Precondition': self.suite_setup.set, + 'Suite Teardown': self.suite_teardown.set, + 'Suite Postcondition': self.suite_teardown.set,
+                                     'Test Setup': self.test_setup.set,
+ 'Test Precondition': self.test_setup.set, + 'Test Teardown': self.test_teardown.set, + 'Test Postcondition': self.test_teardown.set,
+                                     'Force Tags': self.force_tags.set,
+ 'Library': ImportSetter(self.add_library), + 'Resource': ImportSetter(self.add_resource), + 'Variables': ImportSetter(self.add_variables), + 'Metadata': ImportSetter(self.add_metadata)})
+

 class VariableTable(_Table):

=======================================
--- /trunk/src/robot/parsing/populator.py       Thu May 20 06:17:47 2010
+++ /trunk/src/robot/parsing/populator.py       Fri May 21 01:31:42 2010
@@ -72,55 +72,18 @@


 class SettingTablePopulator(_TablePopulator):
-    olde_metadata_prefix = 'meta:'
-    attrs_by_name = utils.NormalizedDict({'Documentation': 'doc',
-                                          'Document': 'doc',
-                                          'Suite Setup': 'suite_setup',
- 'Suite Precondition': 'suite_setup', - 'Suite Teardown': 'suite_teardown', - 'Suite Postcondition': 'suite_teardown',
-                                          'Test Setup': 'test_setup',
- 'Test Precondition': 'test_setup',
-                                          'Test Teardown': 'test_teardown',
- 'Test Postcondition': 'test_teardown',
-                                          'Force Tags': 'force_tags',
-                                          'Default Tags': 'default_tags',
-                                          'Test Timeout': 'test_timeout'})
-    name_value_setters = utils.NormalizedDict({'Library': 'add_library',
-                                               'Resource': 'add_resource',
-                                               'Variables': 'add_variables',
-                                               'Metadata': 'add_metadata'})

     def _get_table(self, datafile):
         return datafile.setting_table

     def _get_populator(self, row):
+        row.handle_old_style_metadata()
         first_cell = row.head
-        if self._is_metadata_with_olde_prefix(first_cell):
-            return OldStyleMetadataPopulator(self._table.add_metadata)
-        if self._is_import_or_metadata(first_cell):
- return SettingTableNameValuePopulator(self._table_attr_setter(first_cell))
-        if self._is_setting(first_cell):
-            return SettingPopulator(self._setting_setter(first_cell))
+        if self._table.is_setting(first_cell):
+            return SettingPopulator(self._table.setter_for(first_cell))
         report_invalid_setting("'%s' in setting table" % (first_cell))
         return NullPopulator()

-    def _is_metadata_with_olde_prefix(self, value):
-        return value.lower().startswith(self.olde_metadata_prefix)
-
-    def _is_import_or_metadata(self, value):
-        return value in self.name_value_setters
-
-    def _is_setting(self, value):
-        return value in self.attrs_by_name
-
-    def _table_attr_setter(self, first_cell):
-        attr_name = self.name_value_setters[first_cell]
-        return getattr(self._table, attr_name)
-
-    def _setting_setter(self, first_cell):
-        attr_name = self.attrs_by_name[first_cell]
-        return getattr(self._table, attr_name).set


 class VariableTablePopulator(_TablePopulator):
@@ -302,9 +265,11 @@
         self._comments.add(row)


-class NameAndValuePropertyPopulator(_PropertyPopulator):
+class VariablePopulator(_PropertyPopulator):

     def _add(self, row):
+        if row.is_continuing():
+            row = row.dedent()
         self._value.extend(row.all)

     def populate(self):
@@ -312,14 +277,6 @@
         self._setter(name, value, self._comments.formatted_value())


-class VariablePopulator(NameAndValuePropertyPopulator):
-
-    def _add(self, row):
-        if row.is_continuing():
-            row = row.dedent()
-        self._value.extend(row.all)
-
-
 class SettingPopulator(_PropertyPopulator):

     def _add(self, row):
@@ -329,29 +286,6 @@
         self._setter(self._value, self._comments.formatted_value())


-class SettingTableNameValuePopulator(NameAndValuePropertyPopulator):
-
-    def _add(self, row):
-        self._value.extend(row.tail)
-
-
-class OldStyleMetadataPopulator(NameAndValuePropertyPopulator):
-    olde_metadata_prefix = 'meta:'
-
-    def _add(self, row):
-        if self._is_metadata_with_olde_prefix(row.head):
- values = self._extract_name_from_olde_style_meta_cell(row.head) + row.tail
-        else:
-            values = row.tail
-        self._value.extend(values)
-
-    def _extract_name_from_olde_style_meta_cell(self, first_cell):
-        return [first_cell.split(':', 1)[1].strip()]
-
-    def _is_metadata_with_olde_prefix(self, first_cell):
-        return first_cell.lower().startswith(self.olde_metadata_prefix)
-
-
 class StepPopulator(_PropertyPopulator):

     def _add(self, row):

Reply via email to