2 new revisions:

Revision: 47fff1cdb00e
Author:   Janne Härkönen <[email protected]>
Date:     Sat Nov  5 02:52:04 2011
Log:      utils.pyxmlwriter, added TODO
http://code.google.com/p/robotframework/source/detail?r=47fff1cdb00e

Revision: d1ae349bf053
Author:   Janne Härkönen <[email protected]>
Date:     Sat Nov  5 02:54:53 2011
Log:      Changes in visitors...
http://code.google.com/p/robotframework/source/detail?r=d1ae349bf053

==============================================================================
Revision: 47fff1cdb00e
Author:   Janne Härkönen <[email protected]>
Date:     Sat Nov  5 02:52:04 2011
Log:      utils.pyxmlwriter, added TODO
http://code.google.com/p/robotframework/source/detail?r=47fff1cdb00e

Modified:
 /src/robot/utils/pyxmlwriter.py

=======================================
--- /src/robot/utils/pyxmlwriter.py     Thu Oct 27 04:20:39 2011
+++ /src/robot/utils/pyxmlwriter.py     Sat Nov  5 02:52:04 2011
@@ -22,7 +22,7 @@
 class XmlWriter(AbstractXmlWriter):

     def __init__(self, output):
-        self.path = output
+        self.path = output # TODO: is this attribute needed?
         self._output = self._create_output(output)
         self._writer = XMLGenerator(self._output, encoding='UTF-8')
         self._writer.startDocument()

==============================================================================
Revision: d1ae349bf053
Author:   Janne Härkönen <[email protected]>
Date:     Sat Nov  5 02:54:53 2011
Log:      Changes in visitors

Renamed Visitor->SuiteVisitor
Emhanced ResultVisitor with #visit_result
Renamed ResultSerializer -> RebotXMLWriter(ResultVisitor)
http://code.google.com/p/robotframework/source/detail?r=d1ae349bf053

Modified:
 /src/robot/reporting/outputwriter.py
 /src/robot/reporting/resultwriter.py
 /src/robot/reporting/xunitwriter.py
 /src/robot/result/datamodel.py
 /src/robot/result/filter.py
 /src/robot/result/keywordremover.py
 /src/robot/result/model.py
 /src/robot/result/serializer.py
 /src/robot/result/suiteteardownfailed.py
 /src/robot/result/tagsetter.py
 /src/robot/result/visitor.py
 /utest/result/test_resultserializer.py
 /utest/result/test_visitor.py

=======================================
--- /src/robot/reporting/outputwriter.py        Wed Nov  2 07:50:35 2011
+++ /src/robot/reporting/outputwriter.py        Sat Nov  5 02:54:53 2011
@@ -14,10 +14,10 @@

 from robot.output import XmlLogger

-from robot.result.visitor import Visitor
+from robot.result.visitor import SuiteVisitor


-class OutputWriter(XmlLogger, Visitor):
+class OutputWriter(XmlLogger, SuiteVisitor):

     def __init__(self, path):
         XmlLogger.__init__(self, path, generator='Rebot')
=======================================
--- /src/robot/reporting/resultwriter.py        Thu Nov  3 07:30:00 2011
+++ /src/robot/reporting/resultwriter.py        Sat Nov  5 02:54:53 2011
@@ -16,9 +16,9 @@
 from robot.errors import DataError
 from robot.output import LOGGER
 from robot.result.builders import ResultFromXML as RFX
+from robot.result.serializer import RebotXMLWriter
 from robot import utils

-from robot.reporting.outputwriter import OutputWriter
 from robot.reporting.xunitwriter import XUnitWriter
from robot.reporting.builders import LogBuilder, ReportBuilder, XUnitBuilder, OutputBuilder
 from robot.reporting.outputparser import OutputParser
@@ -83,6 +83,7 @@
 class ResultFromXML(object):

     def __init__(self, execution_result, settings=None):
+        self.result = execution_result
         self.suite = execution_result.suite
         self.exec_errors = execution_result.errors
         if settings:
@@ -97,11 +98,8 @@
     def serialize_output(self, path, log=True):
         if path == 'NONE':
             return
-        serializer = OutputWriter(path)
-        self.suite.visit(serializer)
-        self.statistics.visit(serializer)
-        self.exec_errors.visit(serializer)
-        serializer.close()
+        serializer = RebotXMLWriter(path)
+        self.result.visit(serializer)
         if log:
             LOGGER.output_file('Output', path)

=======================================
--- /src/robot/reporting/xunitwriter.py Thu Nov  3 07:30:00 2011
+++ /src/robot/reporting/xunitwriter.py Sat Nov  5 02:54:53 2011
@@ -12,11 +12,11 @@
 #  See the License for the specific language governing permissions and
 #  limitations under the License.

-from robot.result.visitor import Visitor
+from robot.result.visitor import SuiteVisitor
 from robot import utils


-class XUnitWriter(Visitor):
+class XUnitWriter(SuiteVisitor):
     """Provides an xUnit-compatible result file.

     Attempts to adhere to the de facto schema guessed by Peter Reilly, see:
=======================================
--- /src/robot/result/datamodel.py      Fri Nov  4 06:55:32 2011
+++ /src/robot/result/datamodel.py      Sat Nov  5 02:54:53 2011
@@ -11,51 +11,11 @@
 #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 #  See the License for the specific language governing permissions and
 #  limitations under the License.
+
 from robot.reporting.parsingcontext import Context
from robot.result.jsondatamodelhandlers import ExecutionResultHandler, SuiteHandler, KeywordHandler

-from robot.result.visitor import Visitor
-
-class ResultVisitor(Visitor):
-
-    def start_statistics(self, statistics):
-        pass
-
-    def start_total_stats(self, total_stats):
-        pass
-
-    def total_stat(self, total_stat):
-        pass
-
-    def end_total_stats(self, total_stats):
-        pass
-
-    def start_tag_stats(self, tag_stats):
-        pass
-
-    def tag_stat(self, tag_stat):
-        pass
-
-    def end_tag_stats(self, tag_stats):
-        pass
-
-    def start_suite_stats(self, suite_stats):
-        pass
-
-    def suite_stat(self, suite_stat):
-        pass
-
-    def end_suite_stats(self, suite_stats):
-        pass
-
-    def end_statistics(self, statistics):
-        pass
-
-    def start_errors(self):
-        pass
-
-    def end_errors(self):
-        pass
+from robot.result.visitor import ResultVisitor


 class DatamodelVisitor(ResultVisitor):
=======================================
--- /src/robot/result/filter.py Fri Nov  4 22:14:26 2011
+++ /src/robot/result/filter.py Sat Nov  5 02:54:53 2011
@@ -16,10 +16,10 @@
 from robot.output.loggerhelper import IsLogged
 from robot.model import TagPatterns

-from visitor import Visitor
+from visitor import SuiteVisitor


-class Filter(Visitor):
+class Filter(SuiteVisitor):

     def __init__(self, include_suites=None, include_tests=None,
                  include_tags=None, exclude_tags=None):
@@ -137,7 +137,7 @@
         return self._match(name)


-class MessageFilter(Visitor):
+class MessageFilter(SuiteVisitor):

     def __init__(self, loglevel):
         loglevel = loglevel or 'trace' #TODO: is this the correct default?
=======================================
--- /src/robot/result/keywordremover.py Thu Nov  3 06:34:47 2011
+++ /src/robot/result/keywordremover.py Sat Nov  5 02:54:53 2011
@@ -12,7 +12,7 @@
 #  See the License for the specific language governing permissions and
 #  limitations under the License.

-from robot.result.visitor import Visitor, SkipAllVisitor
+from robot.result.visitor import SuiteVisitor, SkipAllVisitor


 def KeywordRemover(how):
@@ -26,7 +26,7 @@
     return SkipAllVisitor()


-class _KeywordRemover(Visitor):
+class _KeywordRemover(SuiteVisitor):

     def _clear_content(self, keyword):
         keyword.messages = []
@@ -85,7 +85,7 @@
     return wrapped


-class ContainsWarningVisitor(Visitor):
+class ContainsWarningVisitor(SuiteVisitor):

     def __init__(self):
         self.result = False
@@ -93,7 +93,7 @@
     def visit_message(self, msg):
         self.result |= msg.level == 'WARN'

-    visit_keyword = _stop_if_result(Visitor.visit_keyword)
-    visit_suite = _stop_if_result(Visitor.visit_suite)
-    visit_test = _stop_if_result(Visitor.visit_test)
-
+    visit_keyword = _stop_if_result(SuiteVisitor.visit_keyword)
+    visit_suite = _stop_if_result(SuiteVisitor.visit_suite)
+    visit_test = _stop_if_result(SuiteVisitor.visit_test)
+
=======================================
--- /src/robot/result/model.py  Fri Nov  4 07:15:54 2011
+++ /src/robot/result/model.py  Sat Nov  5 02:54:53 2011
@@ -46,9 +46,7 @@
         SuiteConfigurer(**suite_opts).configure(self.suite)

     def visit(self, visitor):
-        self.suite.visit(visitor)
-        self.statistics.visit(visitor)
-        self.errors.visit(visitor)
+        visitor.visit_result(self)


 class CombinedExecutionResult(ExecutionResult):
=======================================
--- /src/robot/result/serializer.py     Mon Oct 31 07:03:52 2011
+++ /src/robot/result/serializer.py     Sat Nov  5 02:54:53 2011
@@ -13,25 +13,25 @@
 #  limitations under the License.

 from robot.output.xmllogger import XmlLogger
-
-from visitor import Visitor
-
-
-class ResultWriter(XmlLogger, Visitor):
-
-    def visit_message(self, msg):
-        self.log_message(msg)
+from robot.result.visitor import ResultVisitor
+
+
+class RebotXMLWriter(XmlLogger, ResultVisitor):
+
+    def __init__(self, output):
+        XmlLogger.__init__(self, output, generator='Rebot')
+
+    def start_message(self, msg):
+        self._write_message(msg)

     def close(self):
         self._writer.end('robot')

-
-class ResultSerializer(object):
-
-    def __init__(self, output):
-        self._output = output
-
-    def to_xml(self, suite):
-        logger = ResultWriter(self._output)
-        suite.visit(logger)
-        logger.close()
+    def start_errors(self, errors):
+        XmlLogger.start_errors(self)
+
+    def end_errors(self, errors):
+        XmlLogger.end_errors(self)
+
+    def end_result(self, result):
+        self.close()
=======================================
--- /src/robot/result/suiteteardownfailed.py    Tue Nov  1 05:48:43 2011
+++ /src/robot/result/suiteteardownfailed.py    Sat Nov  5 02:54:53 2011
@@ -12,10 +12,10 @@
 #  See the License for the specific language governing permissions and
 #  limitations under the License.

-from visitor import Visitor
+from visitor import SuiteVisitor


-class SuiteTeardownFailureHandler(Visitor):
+class SuiteTeardownFailureHandler(SuiteVisitor):

     def __init__(self, suite_generator):
         self._should_handle = suite_generator == 'ROBOT'
@@ -36,7 +36,7 @@
         return False


-class SuiteTeardownFailed(Visitor):
+class SuiteTeardownFailed(SuiteVisitor):
     _normal_msg = 'Teardown of the parent suite failed.'
     _also_msg = '\n\nAlso teardown of the parent suite failed.'

=======================================
--- /src/robot/result/tagsetter.py      Mon Oct 31 07:23:08 2011
+++ /src/robot/result/tagsetter.py      Sat Nov  5 02:54:53 2011
@@ -12,10 +12,10 @@
 #  See the License for the specific language governing permissions and
 #  limitations under the License.

-from visitor import Visitor
+from visitor import SuiteVisitor


-class TagSetter(Visitor):
+class TagSetter(SuiteVisitor):

     def __init__(self, add=None, remove=None):
         self.add = add
=======================================
--- /src/robot/result/visitor.py        Tue Nov  1 00:32:48 2011
+++ /src/robot/result/visitor.py        Sat Nov  5 02:54:53 2011
@@ -12,7 +12,7 @@
 #  See the License for the specific language governing permissions and
 #  limitations under the License.

-class Visitor(object):
+class SuiteVisitor(object):

     def visit_suite(self, suite):
         if self.start_suite(suite) is not False:
@@ -60,10 +60,8 @@
     def end_message(self, msg):
         pass

-    # TODO: Stats and errors related methods missing.
-    # But do we actually need stat methods?
-
-class SkipAllVisitor(Visitor):
+
+class SkipAllVisitor(SuiteVisitor):

     def visit_suite(self, suite):
         pass
@@ -76,3 +74,72 @@

     def visit_message(self, msg):
         pass
+
+
+class ResultVisitor(SuiteVisitor):
+
+    def visit_result(self, result):
+        self.start_result(result)
+        self.visit_suite(result.suite)
+        self.visit_statistics(result.statistics)
+        self.visit_errors(result.errors)
+        self.end_result(result)
+
+    def start_result(self, result):
+        pass
+
+    def end_result(self, result):
+        pass
+
+    def visit_statistics(self, stats):
+        # TODO: Fix once statistics are rewritten
+        self.start_statistics(stats)
+        stats.total.serialize(self)
+        stats.tags.serialize(self)
+        stats.suite.serialize(self)
+        self.end_statistics(stats)
+
+    def start_statistics(self, stats):
+        pass
+
+    def start_total_stats(self, total_stats):
+        pass
+
+    def total_stat(self, total_stat):
+        pass
+
+    def end_total_stats(self, total_stats):
+        pass
+
+    def start_tag_stats(self, tag_stats):
+        pass
+
+    def tag_stat(self, tag_stat):
+        pass
+
+    def end_tag_stats(self, tag_stats):
+        pass
+
+    def start_suite_stats(self, suite_stats):
+        pass
+
+    def suite_stat(self, suite_stat):
+        pass
+
+    def end_suite_stats(self, suite_stats):
+        pass
+
+    def end_statistics(self, stats):
+        pass
+
+    def visit_errors(self, errors):
+        self.start_errors(errors)
+ for msg in errors.messages: # TODO: should errors itself be iterable?
+            self.visit_message(msg)
+        self.end_errors(errors)
+
+    def start_errors(self, errors):
+        pass
+
+    def end_errors(self, errors):
+        pass
=======================================
--- /utest/result/test_resultserializer.py      Fri Nov  4 06:55:32 2011
+++ /utest/result/test_resultserializer.py      Sat Nov  5 02:54:53 2011
@@ -6,8 +6,8 @@
 from robot.reporting.outputparser import OutputParser

 from robot.result.builders import ResultFromXML
+from robot.result.serializer import RebotXMLWriter
 from robot.result.datamodel import DatamodelVisitor
-from robot.result.serializer import ResultSerializer
 from robot.utils.asserts import assert_equals

 from test_resultbuilder import GOLDEN_XML, GOLDEN_XML_TWICE
@@ -17,7 +17,7 @@

     def test_single_result_serialization(self):
         output = StringIO()
- ResultSerializer(output).to_xml(ResultFromXML(StringIO(GOLDEN_XML)))
+        ResultFromXML(StringIO(GOLDEN_XML)).visit(RebotXMLWriter(output))
         self._assert_xml_content(self._xml_lines(output.getvalue()),
                                  self._xml_lines(GOLDEN_XML))

@@ -32,7 +32,7 @@
     def test_combining_results(self):
         output = StringIO()
         result = ResultFromXML(StringIO(GOLDEN_XML), StringIO(GOLDEN_XML))
-        ResultSerializer(output).to_xml(result)
+        result.visit(RebotXMLWriter(output))
         self._assert_xml_content(self._xml_lines(output.getvalue()),
                                  self._xml_lines(GOLDEN_XML_TWICE))

=======================================
--- /utest/result/test_visitor.py       Sun Oct 30 15:07:44 2011
+++ /utest/result/test_visitor.py       Sat Nov  5 02:54:53 2011
@@ -2,7 +2,7 @@
 from os.path import dirname, join

 from robot.result.builders import ResultFromXML
-from robot.result.visitor import Visitor
+from robot.result.visitor import SuiteVisitor


 RESULT = ResultFromXML(join(dirname(__file__), 'golden.xml'))
@@ -11,8 +11,8 @@
 class TestVisitingSuite(unittest.TestCase):

     def test_abstract_visitor(self):
-        RESULT.suite.visit(Visitor())
-        RESULT.suite.visit(Visitor())
+        RESULT.suite.visit(SuiteVisitor())
+        RESULT.suite.visit(SuiteVisitor())

     def test_start_suite_can_stop_visiting(self):
         RESULT.suite.visit(StartSuiteStopping())
@@ -24,7 +24,7 @@
         RESULT.suite.visit(StartKeywordStopping())


-class StartSuiteStopping(Visitor):
+class StartSuiteStopping(SuiteVisitor):

     def start_suite(self, suite):
         return False
@@ -39,7 +39,7 @@
         raise AssertionError


-class StartTestStopping(Visitor):
+class StartTestStopping(SuiteVisitor):

     def __init__(self):
         self.test_started = False
@@ -56,7 +56,7 @@
             raise AssertionError


-class StartKeywordStopping(Visitor):
+class StartKeywordStopping(SuiteVisitor):

     def start_keyword(self, test):
         return False

Reply via email to