3 new revisions:

Revision: 0a66368859aa
Author:   Robot Framework Developers <[email protected]>
Date:     Mon Jan 30 01:35:55 2012
Log:      hgignore: Added .DS_Store
http://code.google.com/p/robotframework/source/detail?r=0a66368859aa

Revision: 7e719851b96d
Author:   Robot Framework Developers <[email protected]>
Date:     Mon Jan 30 01:36:32 2012
Log:      parsing: added len() to model tables
http://code.google.com/p/robotframework/source/detail?r=7e719851b96d

Revision: 123f04aeb11e
Author:   Robot Framework Developers <[email protected]>
Date:     Mon Jan 30 01:38:08 2012
Log:      writers: clean-up based in cide review
http://code.google.com/p/robotframework/source/detail?r=123f04aeb11e

==============================================================================
Revision: 0a66368859aa
Author:   Robot Framework Developers <[email protected]>
Date:     Mon Jan 30 01:35:55 2012
Log:      hgignore: Added .DS_Store
http://code.google.com/p/robotframework/source/detail?r=0a66368859aa

Modified:
 /.hgignore

=======================================
--- /.hgignore  Thu Jan 12 04:39:23 2012
+++ /.hgignore  Mon Jan 30 01:35:55 2012
@@ -11,3 +11,4 @@
 *$py.class
 ext-lib
 *.iml
+.DS_Store

==============================================================================
Revision: 7e719851b96d
Author:   Robot Framework Developers <[email protected]>
Date:     Mon Jan 30 01:36:32 2012
Log:      parsing: added len() to model tables
http://code.google.com/p/robotframework/source/detail?r=7e719851b96d

Modified:
 /src/robot/parsing/model.py
 /utest/parsing/test_model.py

=======================================
--- /src/robot/parsing/model.py Wed Jan 25 02:06:20 2012
+++ /src/robot/parsing/model.py Mon Jan 30 01:36:32 2012
@@ -249,6 +249,9 @@
     def report_invalid_syntax(self, message, level='ERROR'):
         self.parent.report_invalid_syntax(self.name, message, level)

+    def __len__(self):
+        return len(list(self))
+

 class _WithSettings(object):

@@ -309,8 +312,8 @@
         self.imports.append(Variables(self, name, args, comment=comment))
         return self.imports[-1]

-    def __nonzero__(self):
-        return any(setting.is_set() for setting in self)
+    def __len__(self):
+        return sum(1 for setting in self if setting.is_set())


 class TestCaseFileSettingTable(_SettingTable):
@@ -398,9 +401,6 @@
     def __iter__(self):
         return iter(self.variables)

-    def __nonzero__(self):
-        return bool(self.variables)
-

 class TestCaseTable(_Table):
     type = 'test case'
@@ -420,9 +420,6 @@
     def __iter__(self):
         return iter(self.tests)

-    def __nonzero__(self):
-        return bool(self.tests)
-
     def is_started(self):
         return bool(self._header)

@@ -445,9 +442,6 @@
     def __iter__(self):
         return iter(self.keywords)

-    def __nonzero__(self):
-        return bool(self.keywords)
-

 class Variable(object):

=======================================
--- /utest/parsing/test_model.py        Tue Jan 17 00:34:57 2012
+++ /utest/parsing/test_model.py        Mon Jan 30 01:36:32 2012
@@ -133,6 +133,14 @@
         self.table.set_header(['Settings', 'Value', 'value', 'Value'])
         assert_equals(self.table.header, ['Settings'])

+    def test_len(self):
+        assert_equals(len(self.table), 0)
+        self.table.add_library('SomeLib')
+        assert_equals(len(self.table), 1)
+        self.table.doc.value = 'Some doc'
+        self.table.add_metadata('meta name', 'content')
+        assert_equals(len(self.table), 3)
+

 class TestVariableTable(unittest.TestCase):

@@ -169,6 +177,13 @@
         self.table.set_header(['Variable', 'value', 'Value'])
         assert_equals(self.table.header, ['Variable'])

+    def test_len(self):
+        self.table.set_header(['Variable', 'value', 'Value'])
+        assert_equals(len(self.table), 0)
+        self.table.add('${a var}', 'some')
+        self.table.add('@{b var}', 's', 'ome')
+        assert_equals(len(self.table), 2)
+

 class TestTestCaseTable(unittest.TestCase):

@@ -212,6 +227,13 @@
         self.table.set_header(['test case', 'Action', 'Arg', 'Argument'])
         assert_equals(self.table.header, ['test case'])

+    def test_len(self):
+        self.table.set_header(['Test Case'])
+        assert_equals(len(self.table), 0)
+        self.table.add('A test')
+        self.table.add('B test')
+        assert_equals(len(self.table), 2)
+

 class TestKeywordTable(unittest.TestCase):

@@ -255,6 +277,13 @@
         self.table.set_header(['keywords', 'Action', 'Arg', 'Argument'])
         assert_equals(self.table.header, ['keywords'])

+    def test_len(self):
+        self.table.set_header(['Keywords'])
+        assert_equals(len(self.table), 0)
+        self.table.add('A kw')
+        self.table.add('B keyword')
+        assert_equals(len(self.table), 2)
+

 class TestStep(unittest.TestCase):

@@ -342,24 +371,24 @@

 class TestSettings(unittest.TestCase):

-    def test_timeout_patch(self):
+    def test_timeout(self):
         timeout = Timeout('Timeout')
-        assert_equals(timeout.as_list(),['Timeout'])
+        assert_equals(timeout.as_list(), ['Timeout'])
         timeout.message='boo'
-        assert_equals(timeout.as_list(),['Timeout', '', 'boo'])
+        assert_equals(timeout.as_list(), ['Timeout', '', 'boo'])
         timeout.message=''
         timeout.value='1 second'
-        assert_equals(timeout.as_list(),['Timeout', '1 second'])
+        assert_equals(timeout.as_list(), ['Timeout', '1 second'])
         timeout.message='boo'
-        assert_equals(timeout.as_list(),['Timeout', '1 second', 'boo'])
-
-    def test_settings_patch(self):
+        assert_equals(timeout.as_list(), ['Timeout', '1 second', 'boo'])
+
+    def test_tags(self):
         tags = Tags('Tags')
-        assert_equals(tags.as_list(),['Tags'])
+        assert_equals(tags.as_list(), ['Tags'])
         tags.value = ['tag1','tag2']
-        assert_equals(tags.as_list(),['Tags', 'tag1', 'tag2'])
-
-    def test_fixture_patch(self):
+        assert_equals(tags.as_list(), ['Tags', 'tag1', 'tag2'])
+
+    def test_fixtures(self):
         fixture = Fixture('Teardown')
         assert_equals(fixture.as_list(), ['Teardown'])
         fixture.name = 'Keyword'
@@ -369,11 +398,11 @@
         fixture.name = ''
         assert_equals(fixture.as_list(), ['Teardown', '', 'arg1', 'arg2'])

-    def test_template_patch(self):
+    def test_template(self):
         template = Template('Template')
-        assert_equals(template.as_list(),['Template'])
+        assert_equals(template.as_list(), ['Template'])
         template.value = 'value'
-        assert_equals(template.as_list(),['Template', 'value'])
+        assert_equals(template.as_list(), ['Template', 'value'])


 class TestCopy(unittest.TestCase):

==============================================================================
Revision: 123f04aeb11e
Author:   Robot Framework Developers <[email protected]>
Date:     Mon Jan 30 01:38:08 2012
Log:      writers: clean-up based in cide review
http://code.google.com/p/robotframework/source/detail?r=123f04aeb11e

Added:
 /utest/writer/test_rowsplitter.py
Modified:
 /src/robot/writer/aligners.py
 /src/robot/writer/dataextractor.py
 /src/robot/writer/filewriters.py
 /src/robot/writer/formatters.py
 /src/robot/writer/htmlformatter.py
 /utest/writer/test_extractor.py
 /utest/writer/test_formatters.py

=======================================
--- /dev/null
+++ /utest/writer/test_rowsplitter.py   Mon Jan 30 01:38:08 2012
@@ -0,0 +1,18 @@
+import unittest
+
+from robot.writer.rowsplitter import RowSplitter
+from robot.utils.asserts import assert_equals
+
+
+class TestRowSplitter(unittest.TestCase):
+
+    def test_escaping_empty_cells_at_eol(self):
+        formatter = RowSplitter(cols=3)
+ assert_equals(formatter.split(['Some', 'text', '', 'with empty'], 0),
+            [['Some', 'text', '${EMPTY}'],
+                ['...', 'with empty']])
+
+    def test_splitting_inside_comment(self):
+        formatter = RowSplitter(cols=3)
+ assert_equals(formatter.split(['Kw', 'Arg', '#Comment in', 'many cells'], 0),
+            [['Kw', 'Arg', '#Comment in'], ['...', '#many cells']])
=======================================
--- /src/robot/writer/aligners.py       Fri Jan 20 03:06:10 2012
+++ /src/robot/writer/aligners.py       Mon Jan 30 01:38:08 2012
@@ -25,7 +25,7 @@
     def align_row(self, row):
         for index, col in enumerate(row[:self._last_aligned_column(row)]):
             if len(self._widths) <= index:
-                continue
+                break
             row[index] = row[index].ljust(self._widths[index])
         return row

@@ -35,7 +35,7 @@

 class FirstColumnAligner(_Aligner):

-    def __init__(self, cols, first_column_width):
+    def __init__(self, first_column_width):
         _Aligner.__init__(self, [first_column_width])


@@ -48,11 +48,12 @@

     def _count_justifications(self, table):
result = [self._first_column_width] + [len(h) for h in table.header[1:]]
-        for element in [list(kw) for kw in list(table)]:
+        for element in table:
             for step in element:
                 for index, col in enumerate(step.as_list()):
                     index += 1
                     if len(result) <= index:
-                        result.append(0)
-                    result[index] = max(len(col), result[index])
+                        result.append(len(col))
+                    else:
+                        result[index] = max(len(col), result[index])
         return result
=======================================
--- /src/robot/writer/dataextractor.py  Fri Jan 20 04:29:42 2012
+++ /src/robot/writer/dataextractor.py  Mon Jan 30 01:38:08 2012
@@ -14,23 +14,17 @@


 class DataExtractor(object):
- """The DataExtractor object. Transforms table of a parsed Robot Framework
-    test data file into list of rows."""
+    """Transforms table of a parsed test data file into a list of rows."""

     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)
-
-    def rows_from_indented_table(self, table):
-        """Return list of rows from a test case or user keyword table"""
+            return self._rows_from_item(table)
+        return self._rows_from_indented_table(table)
+
+    def _rows_from_indented_table(self, table):
         items = list(table)
         for index, item in enumerate(items):
             for row in self._rows_from_test_or_keyword(item):
@@ -39,20 +33,20 @@
                 yield []

     def _rows_from_test_or_keyword(self, test_or_keyword):
-        rows = list(self._rows_from_item(test_or_keyword, 1)) or ['']
-        first_row, rest = self._first_row(test_or_keyword.name, rows)
-        yield first_row
-        for r in rest:
+        rows = list(self._rows_from_item(test_or_keyword, 1))
+        for r in self._add_name(test_or_keyword.name, rows):
             yield r

-    def _first_row(self, name, rows):
-        if self._want_names_on_first_content_row:
-            return [name] + rows[0][1:], rows[1:]
-        return [name], rows
+    def _add_name(self, name, rows):
+        if rows and self._want_names_on_first_content_row:
+            rows[0][0] = name
+            return rows
+        return [[name]] + rows

     def _rows_from_item(self, item, indent=0):
-        for child in (c for c in item if c.is_set()):
-            yield [''] * indent + child.as_list()
+        for child in item:
+            if child.is_set():
+                yield [''] * indent + child.as_list()
             if child.is_for_loop():
                 for row in self._rows_from_item(child, indent+1):
                     yield row
=======================================
--- /src/robot/writer/filewriters.py    Tue Jan 24 20:55:42 2012
+++ /src/robot/writer/filewriters.py    Mon Jan 30 01:38:08 2012
@@ -43,7 +43,6 @@

 class _DataFileWriter(object):
     _formatter = None
-    _write_row = NotImplemented

     def __init__(self, configuration):
         self._output = configuration.output
@@ -57,33 +56,29 @@

     def _write_table(self, table):
         self._write_header(table)
-        self._write_rows(self._formatted_table(table))
+        self._write_rows(self._formatter.format_table(table))
         self._write_empty_row()

     def _write_header(self, table):
-        self._write_row(self._formatter.header_row(table))
-
-    def _formatted_table(self, table):
-        formatter = {'setting': self._formatter.setting_table,
-                     'variable': self._formatter.variable_table,
-                     'test case': self._formatter.test_table,
-                     'keyword': self._formatter.keyword_table}[table.type]
-        return formatter(table)
-
-    def _write_empty_row(self):
-        self._write_row(self._formatter.empty_row())
+        self._write_row(self._formatter.format_header(table))

     def _write_rows(self, rows):
         for row in rows:
             self._write_row(row)

+    def _write_empty_row(self):
+        self._write_row(self._formatter.empty_row())
+
     def _encode(self, row):
         return row.encode(self._encoding)

+    def _write_row(self):
+        raise NotImplementedError
+

 class SpaceSeparatedTxtWriter(_DataFileWriter):
     _separator = ' '*4
-    _formatter = TxtFormatter(cols=8)
+    _formatter = TxtFormatter(column_count=8)

     def _write_row(self, row):
         line = self._separator.join(row) + self._line_separator
@@ -92,7 +87,7 @@

 class PipeSeparatedTxtWriter(_DataFileWriter):
     _separator = ' | '
-    _formatter = PipeFormatter(cols=8)
+    _formatter = PipeFormatter(column_count=8)

     def _write_row(self, row):
         row = self._separator.join(row)
@@ -102,7 +97,7 @@


 class TsvFileWriter(_DataFileWriter):
-    _formatter = TsvFormatter(cols=8)
+    _formatter = TsvFormatter(column_count=8)

     def __init__(self, configuration):
         if not csv:
@@ -117,7 +112,7 @@


 class HtmlFileWriter(_DataFileWriter):
-    _formatter = HtmlFormatter(cols=5)
+    _formatter = HtmlFormatter(column_count=5)

     def __init__(self, configuration):
         _DataFileWriter.__init__(self, configuration)
=======================================
--- /src/robot/writer/formatters.py     Fri Jan 20 04:29:42 2012
+++ /src/robot/writer/formatters.py     Mon Jan 30 01:38:08 2012
@@ -22,30 +22,18 @@
 class _DataFileFormatter(object):
     _want_names_on_first_content_row = False

-    def __init__(self, cols):
-        self._splitter = RowSplitter(cols)
-        self._cols = cols
+    def __init__(self, column_count):
+        self._splitter = RowSplitter(column_count)
+        self._column_count = column_count
self._extractor = DataExtractor(self._want_names_on_first_content_row)

     def empty_row(self):
         return self._format_row([])

-    def header_row(self, table):
+    def format_header(self, table):
         return self._format_row(self._header_for(table))

-    def setting_table(self, settings):
-        return self._format_table(settings)
-
-    def variable_table(self, variables):
-        return self._format_table(variables)
-
-    def test_table(self, tests):
-        return self._format_table(tests)
-
-    def keyword_table(self, keywords):
-        return self._format_table(keywords)
-
-    def _format_table(self, table):
+    def format_table(self, table):
         rows = self._extractor.rows_from_table(table)
         if self._should_split_rows(table):
             return self._split_rows(rows, table)
@@ -65,11 +53,15 @@
     def _is_indented_table(self, table):
return bool(table is not None and table.type in ['test case', 'keyword'])

+    def _escape_consecutive_whitespace(self, row):
+        return [re.sub('\s\s+(?=[^\s])',
+ lambda match: '\\'.join(match.group(0)), item.replace('\n', ' ')) for item in row]
+
     def _format_row(self, row, table=None):
-        return row
+        raise NotImplementedError

     def _header_for(self, table):
-        return table.header
+        raise NotImplementedError


 class TsvFormatter(_DataFileFormatter):
@@ -78,11 +70,11 @@
         return ['*%s*' % cell for cell in table.header]

     def _format_row(self, row, table=None):
-        return self._pad(row)
+        return self._pad(self._escape_consecutive_whitespace(row))

     def _pad(self, row):
         row = [cell.replace('\n', ' ') for cell in row]
-        return row + [''] * (self._cols - len(row))
+        return row + [''] * (self._column_count - len(row))


 class TxtFormatter(_DataFileFormatter):
@@ -99,7 +91,7 @@

     def _aligner_for(self, table):
         if table and table.type in ['setting', 'variable']:
- return FirstColumnAligner(self._cols, self._setting_and_variable_name_width) + return FirstColumnAligner(self._setting_and_variable_name_width)
         if self._should_align_columns(table):
             return ColumnAligner(self._test_or_keyword_name_width, table,
                                  self._align_last_column)
@@ -118,14 +110,10 @@
             self._escape_empty_cell_from_start(row))

     def _escape_empty_cell_from_start(self, row):
-        if len(row) >= 2 and row[0] == '' and row[1] == '':
+        if len(row) >= 2 and row[0] == row[1] == '':
             row[1] = '\\'
         return row

-    def _escape_consecutive_whitespace(self, row):
-        return [re.sub('\s\s+(?=[^\s])',
- lambda match: '\\'.join(match.group(0)), item.replace('\n', ' ')) for item in row]
-

 class PipeFormatter(TxtFormatter):
     _align_last_column = True
=======================================
--- /src/robot/writer/htmlformatter.py  Fri Jan 20 04:29:42 2012
+++ /src/robot/writer/htmlformatter.py  Mon Jan 30 01:38:08 2012
@@ -23,7 +23,7 @@
     _want_names_on_first_content_row = True

     def _format_row(self, row, table=None):
-        row = self._pad(row, table)
+        row = self._pad(self._escape_consecutive_whitespace(row), table)
         if self._is_documentation_row(row):
             return self._create_documentation_row(row)
         first_cell = self._create_first_cell(row[0], table)
@@ -35,7 +35,7 @@
         return row[0] == 'Documentation'

     def _create_documentation_row(self, row):
- return [NameCell(row[0]), DocumentationCell(row[1], span=self._cols-1)] + return [NameCell(row[0]), DocumentationCell(row[1], span=self._column_count-1)]

     def _is_indented_documentation_row(self, cells, table):
         return self._is_indented_table(table) and cells and \
@@ -45,7 +45,7 @@
         start = [first_cell, HtmlCell(cells[0])]
         if any(c.startswith('#') for c in cells):
             return start + [HtmlCell(c) for c in cells[1:]]
-        return start + [DocumentationCell(cells[1], self._cols-2)]
+        return start + [DocumentationCell(cells[1], self._column_count-2)]

     def _create_first_cell(self, cell, table):
         if self._is_indented_table(table) and cell:
@@ -53,23 +53,23 @@
                                                   else 'test')
         return NameCell(cell)

-    def header_row(self, table):
+    def format_header(self, table):
         if not self._should_align_columns(table) or len(table.header) == 1:
-            return [HeaderCell(table.header[0], self._cols)]
+            return [HeaderCell(table.header[0], self._column_count)]
         headers = self._pad_header(table)
         return [HeaderCell(hdr) for hdr in headers]

     def _pad_header(self, table):
         header = table.header
-        return header + [''] * (self._column_count(table) - len(header))
+ return header + [''] * (self._get_column_count(table) - len(header))

     def _pad(self, row, table):
-        return row + [''] * (self._column_count(table) - len(row))
-
-    def _column_count(self, table):
+        return row + [''] * (self._get_column_count(table) - len(row))
+
+    def _get_column_count(self, table):
         if table is None or len(table.header) == 1 \
                 or not self._is_indented_table(table):
-            return self._cols
+            return self._column_count
         return max(self._max_column_count(table), len(table.header))

     def _max_column_count(self, table):
=======================================
--- /utest/writer/test_extractor.py     Fri Jan 20 03:07:02 2012
+++ /utest/writer/test_extractor.py     Mon Jan 30 01:38:08 2012
@@ -33,11 +33,11 @@
 class DataExtractorTest(unittest.TestCase):

     def test_extracting_from_simple_table(self):
- assert_equals(list(DataExtractor().rows_from_simple_table(var_table)),
+        assert_equals(list(DataExtractor().rows_from_table(var_table)),
                       var_table_rows)

     def test_extracting_from_indented_table(self):
- for idx, row in enumerate(DataExtractor().rows_from_indented_table(test_table)): + for idx, row in enumerate(DataExtractor()._rows_from_indented_table(test_table)):
             assert_equals(row, test_table_rows[idx])

     def test_names_on_first_content_row(self):
@@ -45,5 +45,5 @@
         t = table.add('Test')
         t.add_step(['No op'])
         extractor = DataExtractor(want_name_on_first_content_row=True)
-        assert_equals(list(extractor.rows_from_indented_table(table)),
+        assert_equals(list(extractor._rows_from_indented_table(table)),
                       [['Test', 'No op']])
=======================================
--- /utest/writer/test_formatters.py    Fri Jan 20 04:29:42 2012
+++ /utest/writer/test_formatters.py    Mon Jan 30 01:38:08 2012
@@ -6,20 +6,6 @@
 from robot.utils.asserts import assert_equals, assert_true


-class TestRowSplitter(unittest.TestCase):
-
-    def test_escaping_empty_cells_at_eol(self):
-        formatter = RowSplitter(cols=3)
- assert_equals(formatter.split(['Some', 'text', '', 'with empty'], 0),
-                                       [['Some', 'text', '${EMPTY}'],
-                                        ['...', 'with empty']])
-
-    def test_splitting_inside_comment(self):
-        formatter = RowSplitter(cols=3)
- assert_equals(formatter.split(['Kw', 'Arg', '#Comment in', 'many cells'], 0), - [['Kw', 'Arg', '#Comment in'], ['...', '#many cells']])
-
-
 class TestTxtFormatter(unittest.TestCase):

     def setUp(self):
@@ -31,6 +17,13 @@
     def test_replacing_newlines(self):
         assert_equals(self._formatter._escape(['so\nme']), ['so me'])

+    def test_escaping_consecutive_spaces(self):
+        settings = TestCaseFileSettingTable(None)
+        settings.force_tags.value = ['f  1']
+        assert_equals(list(self._formatter.format_table(settings))[0],
+            ['Force Tags    ', 'f \\ 1'])
+
+

 class TestPipeFormatter(unittest.TestCase):

@@ -44,14 +37,19 @@
     def test_empty_cell(self):
         settings = TestCaseFileSettingTable(None)
         settings.force_tags.value = ['f1', '', 'f3']
-        assert_equals(list(PipeFormatter(4).setting_table(settings))[0],
+        assert_equals(list(PipeFormatter(4).format_table(settings))[0],
                       ['Force Tags    ', 'f1', '  ', 'f3'])


 class TestTsvFormatter(unittest.TestCase):

+    def setUp(self):
+        self._formatter = TsvFormatter(6)
     def test_replacing_newlines(self):
-        assert_equals(TsvFormatter(6)._format_row(['so\nme'])[0], 'so me')
+        assert_equals(self._formatter._format_row(['so\nme'])[0], 'so me')
+
+    def test_escaping_consecutive_spaces(self):
+ assert_equals(self._formatter._format_row(['so me'])[0], 'so \ me')


 class TestHtmlFormatter(unittest.TestCase):
@@ -63,7 +61,7 @@
         table = TestCaseFileSettingTable(None)
         table.set_header('Settings')
         table.doc.value = 'Some documentation'
-        formatted = list(self._formatter.setting_table(table))
+        formatted = list(self._formatter.format_table(table))
         assert_equals(self._rows_to_text(formatted),
                       [['Documentation', 'Some documentation']])
         assert_equals(formatted[0][1].attributes,
@@ -84,7 +82,7 @@
         test.doc.value = 'Some doc'
         assert_equals(self._rows(table)[0],
['<a name="test_Test">Test</a>', '[Documentation]', 'Some doc']) - assert_equals(list(self._formatter.test_table(table))[0][2].attributes, + assert_equals(list(self._formatter.format_table(table))[0][2].attributes,
                       {'colspan': '3', 'class': 'colspan3'})

     def test_test_documentation_with_comment(self):
@@ -94,7 +92,7 @@
         test.doc._set_comment('a comment')
         assert_equals(self._rows(table)[0],
['<a name="test_Test">Test</a>', '[Documentation]', 'Some doc', '# a comment', '']) - assert_equals(list(self._formatter.test_table(table))[0][2].attributes, {}) + assert_equals(list(self._formatter.format_table(table))[0][2].attributes, {})

     def test_testcase_table_custom_headers(self):
         self._check_header_length([], 1)
@@ -106,11 +104,11 @@
         table = self._create_test_table(['h', 'e'])
         test = table.add('Some test')
         test.add_step(['kw', 'arg1', 'arg2', 'arg3'])
-        assert_equals(len(self._formatter.header_row(table)), 5)
+        assert_equals(len(self._formatter.format_header(table)), 5)

     def _check_header_length(self, headers, expected_length):
         table = self._create_test_table(headers)
- assert_equals(len(self._formatter.header_row(table)), expected_length) + assert_equals(len(self._formatter.format_header(table)), expected_length)

     def test_testcase_table_header_colspan(self):
         self._assert_header_colspan([], 5)
@@ -118,9 +116,12 @@

     def _assert_header_colspan(self, header, expected_colspan):
         table = self._create_test_table(header)
-        row = self._formatter.header_row(table)
+        row = self._formatter.format_header(table)
         assert_equals(row[0].attributes['colspan'], str(expected_colspan))

+    def test_escaping_consecutive_spaces(self):
+ assert_equals(self._formatter._format_row(['so me'])[0].content, 'so \ me')
+
     def test_number_of_columns_is_max_of_header_and_row_widths(self):
         table = self._create_test_table(['a', 'b'])
         test = table.add('Test')
@@ -132,20 +133,20 @@
         self._check_row_lengths(table, 4)

     def _check_row_lengths(self, table, expected_length):
-        rows = list(self._formatter.test_table(table))
+        rows = list(self._formatter.format_table(table))
         assert_true(len(rows) > 0)
         for row in rows:
             assert_equals(len(row), expected_length)

     def _rows(self, table):
-        return self._rows_to_text(self._formatter.test_table(table))
+        return self._rows_to_text(self._formatter.format_table(table))

     def _rows_to_text(self, rows):
         return [[cell.content for cell in row] for row in rows]

-    def _create_test_table(self, additional_headers=[]):
+    def _create_test_table(self, additional_headers=()):
         table = TestCaseTable(None)
-        table.set_header(['Test Cases'] + additional_headers)
+        table.set_header(['Test Cases'] + list(additional_headers))
         return table

     def test_add_br_to_newlines(self):

Reply via email to