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):