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'])

Reply via email to