Revision: 3299
Author: janne.t.harkonen
Date: Mon May 17 22:31:57 2010
Log: Introduced some classes, cleanup
http://code.google.com/p/robotframework/source/detail?r=3299
Modified:
/trunk/src/robot/parsing/populator.py
/trunk/utest/parsing/test_populator.py
=======================================
--- /trunk/src/robot/parsing/populator.py Mon May 17 05:31:50 2010
+++ /trunk/src/robot/parsing/populator.py Mon May 17 22:31:57 2010
@@ -17,21 +17,23 @@
from robot import utils
-class _TablePopulator(object):
+class Populator(object):
+ """Explicit interface for all populators."""
+ def add(self, row): raise NotImplementedError()
+ def populate(self): raise NotImplementedError()
+
+
+class _TablePopulator(Populator):
def __init__(self, datafile):
self._table = self._get_table(datafile)
self._populator = None
def add(self, row):
- if self._is_continuing(row):
- self._populator.add(self._values_from(row))
- else:
+ if not self._is_continuing(row):
self.populate()
self._populator = self._get_populator(row)
-
- def _values_from(self, row):
- return row
+ self._populator.add(row)
def _is_continuing(self, row):
return row[0].strip() == self.row_continuation_marker
@@ -57,54 +59,35 @@
'Force Tags': 'force_tags',
'Default Tags': 'default_tags',
'Test Timeout': 'test_timeout'})
- import_setters_by_name =
utils.NormalizedDict({'Library': 'add_library',
- 'Resource': 'add_resource',
- 'Variables':
'add_variables'})
+ 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 _values_from(self, row):
- return row[1:]
-
def _get_populator(self, row):
- first_cell, rest = row[0], row[1:]
- if self._is_metadata(first_cell):
- return self._metadata_populator(first_cell, rest)
- if self._is_import(first_cell):
- return self._import_populator(first_cell, rest)
- return self._setting_populator(first_cell, rest)
-
- def _metadata_populator(self, first_cell, rest):
- initial_value = self._initial_metadata_value(first_cell, rest)
- return NameAndValuePropertyPopulator(self._table.add_metadata,
initial_value)
-
- def _import_populator(self, first_cell, rest):
- attr_name = self.import_setters_by_name[first_cell]
- return NameAndValuePropertyPopulator(getattr(self._table,
attr_name), rest)
-
- def _setting_populator(self, first_cell, rest):
- attr_name = self.attrs_by_name[first_cell]
- return ValuePropertyPopulator(getattr(self._table, attr_name).set,
rest)
-
- def _is_metadata(self, setting_name):
- setting_name = setting_name.lower()
- return self._is_metadata_with_olde_prefix(setting_name) \
- or setting_name == 'metadata'
+ first_cell = row[0]
+ 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))
+ return SettingPopulator(self._setting_setter(first_cell))
def _is_metadata_with_olde_prefix(self, setting_name):
return setting_name.lower().startswith(self.olde_metadata_prefix)
- def _initial_metadata_value(self, first_cell, value):
- if self._is_metadata_with_olde_prefix(first_cell):
- return
self._extract_name_from_olde_style_meta_cell(first_cell) + value
- return value
-
- def _extract_name_from_olde_style_meta_cell(self, first_cell):
- return [first_cell.split(':', 1)[1].strip()]
-
- def _is_import(self, setting_name):
- return setting_name in self.import_setters_by_name
+ def _is_import_or_metadata(self, setting_name):
+ return setting_name in self.name_value_setters
+
+ 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):
@@ -114,7 +97,7 @@
return datafile.variable_table
def _get_populator(self, row):
- return NameAndValuePropertyPopulator(self._table.add, row)
+ return NameAndValuePropertyPopulator(self._table.add)
class TestTablePopulator(_TablePopulator):
@@ -124,7 +107,7 @@
return datafile.testcase_table
def _get_populator(self, row):
- return TestCasePopulator(self._table.add, row)
+ return TestCasePopulator(self._table.add)
class KeywordTablePopulator(_TablePopulator):
@@ -134,28 +117,37 @@
return datafile.keyword_table
def _get_populator(self, row):
- return UserKeywordPopulator(self._table.add, row)
+ return UserKeywordPopulator(self._table.add)
-class _TestCaseUserKeywordPopulator(object):
+class _TestCaseUserKeywordPopulator(Populator):
row_continuation_marker = ('', '...')
- def __init__(self, setter, row):
- self._test_or_uk = setter(row[0])
- self._populator = self._get_populator(row)
+ def __init__(self, test_or_uk_creator):
+ self._test_or_uk_creator = test_or_uk_creator
+ self._test_or_uk = None
def add(self, row):
- if self._is_continuing_step(row):
- self._populator.add(row[2:])
- else:
+ if not self._test_or_uk:
+ self._test_or_uk = self._test_or_uk_creator(row[0])
+ self._populator = self._get_populator(row)
+ elif not self._is_continuing_step(row):
self._populator.populate()
self._populator = self._get_populator(row)
+ self._populator.add(row[1:])
+
+ def populate(self):
+ if self._populator:
+ self._populator.populate()
+
+ def _is_continuing_step(self, row):
+ return (row[0].strip(), row[1].strip()) ==
self.row_continuation_marker
def _get_populator(self, row):
first_cell = self._first_cell_value(row)
if self._is_setting(first_cell):
- return
ValuePropertyPopulator(self._setting_setter(first_cell), row[2:])
- return StepPopulator(self._test_or_uk.add_step, row[1:])
+ return SettingPopulator(self._setting_setter(first_cell))
+ return StepPopulator(self._test_or_uk.add_step)
def _first_cell_value(self, row):
return row[1].strip() if len(row) > 1 else ''
@@ -170,13 +162,6 @@
def _setting_name(self, cell):
return cell[1:-1].strip()
- def _is_continuing_step(self, row):
- return (row[0].strip(), row[1].strip()) ==
self.row_continuation_marker
-
- def populate(self):
- if self._populator:
- self._populator.populate()
-
class TestCasePopulator(_TestCaseUserKeywordPopulator):
attrs_by_name = utils.NormalizedDict({'Documentation': 'doc',
@@ -198,47 +183,70 @@
'Timeout': 'timeout'})
-class _PropertyPopulator(object):
-
- def __init__(self, setter, initial_value):
+class _PropertyPopulator(Populator):
+
+ def __init__(self, setter):
self._setter = setter
- self._value = initial_value
+ self._value = []
+
+
+class NameAndValuePropertyPopulator(_PropertyPopulator):
def add(self, row):
self._value.extend(row)
-
-class ValuePropertyPopulator(_PropertyPopulator):
+ def populate(self):
+ name, value = self._value[0], self._value[1:]
+ self._setter(name, value)
+
+
+class SettingPopulator(_PropertyPopulator):
+
+ def add(self, row):
+ self._value.extend(row[1:])
def populate(self):
self._setter(self._value)
-class NameAndValuePropertyPopulator(_PropertyPopulator):
-
- def populate(self):
- self._setter(self._value[0], self._value[1:])
+class SettingTableNameValuePopulator(NameAndValuePropertyPopulator):
+
+ def add(self, row):
+ self._value.extend(row[1:])
-class StepPopulator(object):
-
- def __init__(self, setter, row):
- self._setter = setter
- self._current_row = row
+class OldStyleMetadataPopulator(NameAndValuePropertyPopulator):
+ olde_metadata_prefix = 'meta:'
+
+ def add(self, row):
+ if self._is_metadata_with_olde_prefix(row[0]):
+ values = self._extract_name_from_olde_style_meta_cell(row[0])
+ row[1:]
+ else:
+ values = row[1:]
+ 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):
- self._current_row.extend(row)
+ self._value.extend(row)
def populate(self):
- if self._current_row:
- self._setter(self._current_row)
+ if self._value:
+ self._setter(self._value)
-class Populator(object):
+class TestCaseFilePopulator(Populator):
_whitespace_regexp = re.compile('\s+')
- _null_populator = type('NullTablePopulator', (),
+ _null_populator = type('NullTablePopulator', (Populator, ),
{'add': lambda self, row: None,
- 'eof': lambda self: None})()
+ 'populate': lambda self: None})()
populators = utils.NormalizedDict({'Setting':
SettingTablePopulator,
'Settings':
SettingTablePopulator,
'Metadata':
SettingTablePopulator,
@@ -263,7 +271,7 @@
self._current_populator = self._null_populator
return self._current_populator is not self._null_populator
- def eof(self):
+ def populate(self):
self._current_populator.populate()
def add(self, row):
=======================================
--- /trunk/utest/parsing/test_populator.py Mon May 17 05:31:50 2010
+++ /trunk/utest/parsing/test_populator.py Mon May 17 22:31:57 2010
@@ -1,6 +1,6 @@
import unittest
-from robot.parsing.populator import Populator
+from robot.parsing.populator import TestCaseFilePopulator
from robot.parsing.newmodel import TestCaseFile
from robot.utils.asserts import assert_equals, assert_true, assert_false
@@ -10,7 +10,7 @@
def setUp(self):
self._datafile = TestCaseFile()
self._path = '/path/to/source'
- self._populator = Populator(self._datafile, self._path)
+ self._populator = TestCaseFilePopulator(self._datafile, self._path)
def test_creation(self):
assert_equals(self._datafile.source, self._path)
@@ -167,7 +167,7 @@
self._start_table(name)
for r in rows:
self._populator.add(r)
- self._populator.eof()
+ self._populator.populate()
def _nth_test(self, index):
return self._datafile.testcase_table.tests[index-1]