Revision: 1c2cfb72ef78
Author: Robot Framework Developers <[email protected]>
Date: Fri Jan 20 04:29:42 2012
Log: writer: some more cleanup
http://code.google.com/p/robotframework/source/detail?r=1c2cfb72ef78
Modified:
/src/robot/writer/dataextractor.py
/src/robot/writer/filewriters.py
/src/robot/writer/formatters.py
/src/robot/writer/htmlformatter.py
/src/robot/writer/rowsplitter.py
/utest/writer/test_formatters.py
=======================================
--- /src/robot/writer/dataextractor.py Fri Jan 20 03:06:10 2012
+++ /src/robot/writer/dataextractor.py Fri Jan 20 04:29:42 2012
@@ -20,6 +20,11 @@
def __init__(self, want_name_on_first_content_row=False):
self._want_names_on_first_content_row =
want_name_on_first_content_row
+ def rows_from_table(self, table):
+ if table.type in ['setting', 'variable']:
+ return self.rows_from_simple_table(table)
+ return self.rows_from_indented_table(table)
+
def rows_from_simple_table(self, table):
"""Return list of rows from a setting or variable table"""
return self._rows_from_item(table)
=======================================
--- /src/robot/writer/filewriters.py Fri Jan 20 03:06:10 2012
+++ /src/robot/writer/filewriters.py Fri Jan 20 04:29:42 2012
@@ -85,7 +85,7 @@
class SpaceSeparatedTxtWriter(_DataFileWriter):
_separator = ' '*4
- _formatter = TxtFormatter()
+ _formatter = TxtFormatter(cols=8)
def _write_row(self, row):
line = self._separator.join(row) + self._line_separator
@@ -94,7 +94,7 @@
class PipeSeparatedTxtWriter(_DataFileWriter):
_separator = ' | '
- _formatter = PipeFormatter()
+ _formatter = PipeFormatter(cols=8)
def _write_row(self, row):
row = self._separator.join(row)
@@ -104,7 +104,7 @@
class TsvFileWriter(_DataFileWriter):
- _formatter = TsvFormatter()
+ _formatter = TsvFormatter(cols=8)
def __init__(self, configuration):
if not csv:
@@ -122,7 +122,7 @@
class HtmlFileWriter(_DataFileWriter):
- _formatter = HtmlFormatter()
+ _formatter = HtmlFormatter(cols=5)
def __init__(self, configuration):
_DataFileWriter.__init__(self, configuration)
=======================================
--- /src/robot/writer/formatters.py Fri Jan 20 03:06:10 2012
+++ /src/robot/writer/formatters.py Fri Jan 20 04:29:42 2012
@@ -25,67 +25,59 @@
def __init__(self, cols):
self._splitter = RowSplitter(cols)
self._cols = cols
- self._current_table = None
self._extractor =
DataExtractor(self._want_names_on_first_content_row)
def empty_row(self):
return self._format_row([])
+ def header_row(self, table):
+ return self._format_row(self._header_for(table))
+
def setting_table(self, settings):
- self._current_table = settings
- return self._simple_table()
+ return self._format_table(settings)
def variable_table(self, variables):
- self._current_table = variables
- return self._simple_table()
-
- def _simple_table(self):
- return
self._format_rows(self._extractor.rows_from_simple_table(self._current_table))
+ return self._format_table(variables)
def test_table(self, tests):
- self._current_table = tests
- return self._indented_table()
+ return self._format_table(tests)
def keyword_table(self, keywords):
- self._current_table = keywords
- return self._indented_table()
-
- def _indented_table(self):
- return
self._format_rows(self._extractor.rows_from_indented_table(self._current_table))
-
- def _format_rows(self, rows):
- if self._should_split_rows():
- return self._split_rows(rows)
- return [self._format_row(r) for r in rows]
-
- def _should_split_rows(self):
+ return self._format_table(keywords)
+
+ def _format_table(self, table):
+ rows = self._extractor.rows_from_table(table)
+ if self._should_split_rows(table):
+ return self._split_rows(rows, table)
+ return [self._format_row(r, table) for r in rows]
+
+ def _should_split_rows(self, table):
return True
- def _split_rows(self, rows):
+ def _split_rows(self, rows, table):
for row in rows:
- for r in self._splitter.split(row,
self._is_indented_table(self._current_table)):
- yield self._format_row(r)
+ for r in self._splitter.split(row,
self._is_indented_table(table)):
+ yield self._format_row(r, table)
def _should_align_columns(self, table):
return self._is_indented_table(table) and bool(table.header[1:])
def _is_indented_table(self, table):
- return table.type in ['test case', 'keyword']
-
- def _format_row(self, row):
+ return bool(table is not None and table.type in ['test
case', 'keyword'])
+
+ def _format_row(self, row, table=None):
return row
+ def _header_for(self, table):
+ return table.header
+
class TsvFormatter(_DataFileFormatter):
- def __init__(self, cols=8):
- _DataFileFormatter.__init__(self, cols)
- self._cols = cols
-
- def header_row(self, table):
- return self._format_row(['*%s*' % cell for cell in table.header])
-
- def _format_row(self, row):
+ def _header_for(self, table):
+ return ['*%s*' % cell for cell in table.header]
+
+ def _format_row(self, row, table=None):
return self._pad(row)
def _pad(self, row):
@@ -98,35 +90,27 @@
_setting_and_variable_name_width = 14
_align_last_column = False
- def __init__(self, cols=8):
- _DataFileFormatter.__init__(self, cols)
- self._simple_aligner = FirstColumnAligner(cols,
- self._setting_and_variable_name_width)
- self._aligner = None
-
- def _format_row(self, row):
+ def _format_row(self, row, table=None):
row = self._escape(row)
- if self._aligner:
- return self._aligner.align_row(row)
+ aligner = self._aligner_for(table)
+ if aligner:
+ return aligner.align_row(row)
return row
- def header_row(self, table):
- header = ['*** %s ***' % table.header[0]] + table.header[1:]
+ def _aligner_for(self, table):
+ if table and table.type in ['setting', 'variable']:
+ return FirstColumnAligner(self._cols,
self._setting_and_variable_name_width)
if self._should_align_columns(table):
- aligner = ColumnAligner(self._test_or_keyword_name_width,
table,
- self._align_last_column)
- return aligner.align_row(header)
- return header
-
- def _should_split_rows(self):
- if self._should_align_columns(self._current_table):
- self._aligner = ColumnAligner(self._test_or_keyword_name_width,
- self._current_table,
self._align_last_column)
+ return ColumnAligner(self._test_or_keyword_name_width, table,
+ self._align_last_column)
+ return None
+
+ def _header_for(self, table):
+ return ['*** %s ***' % table.header[0]] + table.header[1:]
+
+ def _should_split_rows(self, table):
+ if self._should_align_columns(table):
return False
- elif self._is_indented_table(self._current_table):
- self._aligner = None
- return True
- self._aligner = self._simple_aligner
return True
def _escape(self, row):
@@ -163,4 +147,3 @@
if cell.endswith(' |'):
cell = cell[:-1] + '\\|'
return cell
-
=======================================
--- /src/robot/writer/htmlformatter.py Fri Jan 20 03:06:10 2012
+++ /src/robot/writer/htmlformatter.py Fri Jan 20 04:29:42 2012
@@ -22,18 +22,12 @@
class HtmlFormatter(_DataFileFormatter):
_want_names_on_first_content_row = True
- def __init__(self):
- _DataFileFormatter.__init__(self, 5)
-
- def empty_row(self):
- return [NameCell('')] + [HtmlCell('') for _ in range(self._cols-1)]
-
- def _format_row(self, row):
- row = self._pad(row)
+ def _format_row(self, row, table=None):
+ row = self._pad(row, table)
if self._is_documentation_row(row):
return self._create_documentation_row(row)
- first_cell = self._create_first_cell(row[0])
- if self._is_indented_documentation_row(row[1:]):
+ first_cell = self._create_first_cell(row[0], table)
+ if self._is_indented_documentation_row(row[1:], table):
return self._create_indented_documentation_row(first_cell,
row[1:])
return [first_cell] + [HtmlCell(c) for c in row[1:]]
@@ -43,8 +37,8 @@
def _create_documentation_row(self, row):
return [NameCell(row[0]), DocumentationCell(row[1],
span=self._cols-1)]
- def _is_indented_documentation_row(self, cells):
- return self._is_indented_table(self._current_table) and cells and \
+ def _is_indented_documentation_row(self, cells, table):
+ return self._is_indented_table(table) and cells and \
cells[0] == '[Documentation]'
def _create_indented_documentation_row(self, first_cell, cells):
@@ -53,9 +47,10 @@
return start + [HtmlCell(c) for c in cells[1:]]
return start + [DocumentationCell(cells[1], self._cols-2)]
- def _create_first_cell(self, cell):
- if self._is_indented_table(self._current_table) and cell:
- return AnchorNameCell(cell, 'keyword' if
self._current_table.type == 'keyword' else 'test')
+ def _create_first_cell(self, cell, table):
+ if self._is_indented_table(table) and cell:
+ return AnchorNameCell(cell, 'keyword' if table.type
== 'keyword'
+ else 'test')
return NameCell(cell)
def header_row(self, table):
@@ -65,7 +60,17 @@
return [HeaderCell(hdr) for hdr in headers]
def _pad_header(self, table):
- return table.header + [''] * (self._max_column_count(table) -
len(table.header))
+ header = table.header
+ return header + [''] * (self._column_count(table) - len(header))
+
+ def _pad(self, row, table):
+ return row + [''] * (self._column_count(table) - len(row))
+
+ def _column_count(self, table):
+ if table is None or len(table.header) == 1 \
+ or not self._is_indented_table(table):
+ return self._cols
+ return max(self._max_column_count(table), len(table.header))
def _max_column_count(self, table):
count = 0
@@ -74,13 +79,7 @@
count = max(count, len(child.as_list()) + 1)
return count
- def _pad(self, row):
- if len(self._current_table.header) == 1 or not
self._is_indented_table(self._current_table):
- cols = self._cols
- else:
- cols = max(self._max_column_count(self._current_table),
- len(self._current_table.header))
- return row + [''] * (cols - len(row))
+
class HtmlCell(object):
_backslash_matcher = re.compile(r'(\\+)n ')
@@ -103,15 +102,14 @@
class NameCell(HtmlCell):
def __init__(self, name='', attributes=None):
- HtmlCell.__init__(self, name, attributes)
- self.attributes.update({'class': 'name'})
+ HtmlCell.__init__(self, name, {'class': 'name'})
class AnchorNameCell(HtmlCell):
def __init__(self, name, type_):
HtmlCell.__init__(self, self._link_from_name(name, type_),
- {'class': 'name'}, escape=False)
+ {'class': 'name'}, escape=False)
def _link_from_name(self, name, type_):
return '<a name="%s_%s">%s</a>' % (type_,
utils.html_attr_escape(name),
@@ -130,5 +128,3 @@
def __init__(self, name, span=1):
HtmlCell.__init__(self, name, {'class': 'name', 'colspan': '%d' %
span},
tag='th')
-
-
=======================================
--- /src/robot/writer/rowsplitter.py Fri Jan 20 03:06:10 2012
+++ /src/robot/writer/rowsplitter.py Fri Jan 20 04:29:42 2012
@@ -12,9 +12,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-
import itertools
+
class RowSplitter(object):
_comment_mark = '#'
_empty_cell_escape = '${EMPTY}'
=======================================
--- /utest/writer/test_formatters.py Fri Jan 20 03:06:10 2012
+++ /utest/writer/test_formatters.py Fri Jan 20 04:29:42 2012
@@ -22,38 +22,42 @@
class TestTxtFormatter(unittest.TestCase):
+ def setUp(self):
+ self._formatter = TxtFormatter(6)
+
def test_escaping_whitespace(self):
- assert_equals(TxtFormatter()._escape(['so me']), ['so \ me'])
+ assert_equals(self._formatter._escape(['so me']), ['so \ me'])
def test_replacing_newlines(self):
- assert_equals(TxtFormatter()._escape(['so\nme']), ['so me'])
+ assert_equals(self._formatter._escape(['so\nme']), ['so me'])
class TestPipeFormatter(unittest.TestCase):
def test_escaping_pipes(self):
- assert_equals(PipeFormatter()._escape(['so | me']), ['so \\| me'])
- assert_equals(PipeFormatter()._escape(['|so|me|']), ['|so|me|'])
- assert_equals(PipeFormatter()._escape(['so |']), ['so \\|'])
- assert_equals(PipeFormatter()._escape(['| so']), ['\\| so'])
+ formatter = PipeFormatter(7)
+ assert_equals(formatter._escape(['so | me']), ['so \\| me'])
+ assert_equals(formatter._escape(['|so|me|']), ['|so|me|'])
+ assert_equals(formatter._escape(['so |']), ['so \\|'])
+ assert_equals(formatter._escape(['| so']), ['\\| so'])
def test_empty_cell(self):
settings = TestCaseFileSettingTable(None)
settings.force_tags.value = ['f1', '', 'f3']
- assert_equals(list(PipeFormatter().setting_table(settings))[0],
+ assert_equals(list(PipeFormatter(4).setting_table(settings))[0],
['Force Tags ', 'f1', ' ', 'f3'])
class TestTsvFormatter(unittest.TestCase):
def test_replacing_newlines(self):
- assert_equals(TsvFormatter()._format_row(['so\nme'])[0], 'so me')
+ assert_equals(TsvFormatter(6)._format_row(['so\nme'])[0], 'so me')
class TestHtmlFormatter(unittest.TestCase):
def setUp(self):
- self._formatter = HtmlFormatter()
+ self._formatter = HtmlFormatter(5)
def test_setting_table_doc(self):
table = TestCaseFileSettingTable(None)
@@ -114,8 +118,8 @@
def _assert_header_colspan(self, header, expected_colspan):
table = self._create_test_table(header)
-
assert_equals(self._formatter.header_row(table)[0].attributes['colspan'],
- str(expected_colspan))
+ row = self._formatter.header_row(table)
+ assert_equals(row[0].attributes['colspan'], str(expected_colspan))
def test_number_of_columns_is_max_of_header_and_row_widths(self):
table = self._create_test_table(['a', 'b'])