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