Revision: 3300
Author: janne.t.harkonen
Date: Mon May 17 23:24:38 2010
Log: introduced DataRow object to handle single row of parsed data
http://code.google.com/p/robotframework/source/detail?r=3300
Modified:
/trunk/src/robot/parsing/populator.py
/trunk/utest/parsing/test_populator.py
=======================================
--- /trunk/src/robot/parsing/populator.py Mon May 17 22:31:57 2010
+++ /trunk/src/robot/parsing/populator.py Mon May 17 23:24:38 2010
@@ -30,14 +30,11 @@
self._populator = None
def add(self, row):
- if not self._is_continuing(row):
+ if not row.startswith(self.row_continuation_marker):
self.populate()
self._populator = self._get_populator(row)
self._populator.add(row)
- def _is_continuing(self, row):
- return row[0].strip() == self.row_continuation_marker
-
def populate(self):
if self._populator:
self._populator.populate()
@@ -68,7 +65,7 @@
return datafile.setting_table
def _get_populator(self, row):
- first_cell = row[0]
+ 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):
@@ -121,37 +118,32 @@
class _TestCaseUserKeywordPopulator(Populator):
- row_continuation_marker = ('', '...')
+ row_continuation_marker = '...'
def __init__(self, test_or_uk_creator):
self._test_or_uk_creator = test_or_uk_creator
self._test_or_uk = None
+ self._populator = NullPopulator()
def add(self, row):
+ dedented_row = row.dedent()
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._test_or_uk = self._test_or_uk_creator(row.head())
+ if not dedented_row.startswith(self.row_continuation_marker):
self._populator.populate()
- self._populator = self._get_populator(row)
- self._populator.add(row[1:])
+ self._populator = self._get_populator(dedented_row)
+ self._populator.add(dedented_row)
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)
+ first_cell = row.head()
if self._is_setting(first_cell):
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 ''
-
def _is_setting(self, cell):
return cell and cell[0] == '[' and cell[-1] == ']'
@@ -193,7 +185,7 @@
class NameAndValuePropertyPopulator(_PropertyPopulator):
def add(self, row):
- self._value.extend(row)
+ self._value.extend(row.all())
def populate(self):
name, value = self._value[0], self._value[1:]
@@ -203,7 +195,7 @@
class SettingPopulator(_PropertyPopulator):
def add(self, row):
- self._value.extend(row[1:])
+ self._value.extend(row.tail())
def populate(self):
self._setter(self._value)
@@ -212,17 +204,17 @@
class SettingTableNameValuePopulator(NameAndValuePropertyPopulator):
def add(self, row):
- self._value.extend(row[1:])
+ self._value.extend(row.tail())
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:]
+ 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[1:]
+ values = row.tail()
self._value.extend(values)
def _extract_name_from_olde_style_meta_cell(self, first_cell):
@@ -235,18 +227,20 @@
class StepPopulator(_PropertyPopulator):
def add(self, row):
- self._value.extend(row)
+ self._value.extend(row.all())
def populate(self):
if self._value:
self._setter(self._value)
+class NullPopulator(Populator):
+ add = lambda self, row: None
+ populate = lambda self: None
+
+
class TestCaseFilePopulator(Populator):
- _whitespace_regexp = re.compile('\s+')
- _null_populator = type('NullTablePopulator', (Populator, ),
- {'add': lambda self, row: None,
- 'populate': lambda self: None})()
+ _null_populator = NullPopulator()
populators = utils.NormalizedDict({'Setting':
SettingTablePopulator,
'Settings':
SettingTablePopulator,
'Metadata':
SettingTablePopulator,
@@ -275,9 +269,31 @@
self._current_populator.populate()
def add(self, row):
- cells = self._data_cells(row)
- if cells:
- self._current_populator.add(cells)
+ data = DataRow(row)
+ if data:
+ self._current_populator.add(data)
+
+
+class DataRow(object):
+ _whitespace_regexp = re.compile('\s+')
+
+ def __init__(self, cells):
+ self.cells = self._data_cells(cells)
+
+ def head(self):
+ return self.cells[0] if len(self.cells) else ''
+
+ def tail(self):
+ return self.cells[1:]
+
+ def all(self):
+ return self.cells
+
+ def dedent(self):
+ return DataRow(self.tail())
+
+ def startswith(self, value):
+ return self.head() == value
def _data_cells(self, row):
cells = [ self._collapse_whitespace(cell)
@@ -296,3 +312,6 @@
return filtered
filtered.append(c)
return filtered
+
+ def __nonzero__(self):
+ return self.cells != []
=======================================
--- /trunk/utest/parsing/test_populator.py Mon May 17 22:31:57 2010
+++ /trunk/utest/parsing/test_populator.py Mon May 17 23:24:38 2010
@@ -134,8 +134,8 @@
['', 'Log Many', '', 'argh']])
test = self._first_test()
assert_equals(test.name, 'My test')
- assert_equals(test.tags.value, ['foo'])
self._number_of_steps_should_be(test, 1)
+ assert_equals(test.tags.value, ['foo'])
def _assert_setting(self, setting_name, exp_value):
assert_equals(self._setting_with(setting_name).value, exp_value)