Author: pekka.klarck
Date: Thu Mar 26 14:51:56 2009
New Revision: 1553

Modified:
   trunk/src/robot/output/output.py
   trunk/src/robot/output/xmllogger.py
   trunk/src/robot/utils/jyxmlwriter.py
   trunk/src/robot/utils/pyxmlwriter.py

Log:
now also xmllogger called (mainly) through SYSLOG (which really needs to be renamed to LOGGER after all these refactorings)

Modified: trunk/src/robot/output/output.py
==============================================================================
--- trunk/src/robot/output/output.py    (original)
+++ trunk/src/robot/output/output.py    Thu Mar 26 14:51:56 2009
@@ -31,10 +31,9 @@

     def __init__(self, settings):
         AbstractLogger.__init__(self, settings['LogLevel'])
-        self.logger = None
+ self.xmllogger = XmlLogger(settings['Output'], settings['SplitOutputs'])
         listeners = Listeners(settings['Listeners'])
-        self._execution_errors = _ExecutionErrorLogger()
-        SYSLOG.register_logger(listeners, self._execution_errors)
+        SYSLOG.register_logger(self.xmllogger, listeners)
         SYSLOG.disable_message_cache()
         self._debugfile = DebugFile(settings['DebugFile'])
         self._namegen = self._get_log_name_generator(settings['Log'])
@@ -51,40 +50,35 @@
                            self._settings['TagStatCombine'],
                            self._settings['TagDoc'],
                            self._settings['TagStatLink'])
-        stats.serialize(self.logger)
-        self._execution_errors.serialize(self.logger)
-        self.logger.close()
+        stats.serialize(self.xmllogger)
+        self.xmllogger.close(serialize_errors=True)
         SYSLOG.output_file('Output', self._settings['Output'])
         if self._debugfile is not None:
             SYSLOG.output_file('Debug', self._debugfile.path)
             self._debugfile.close()

     def close2(self):
-        SYSLOG.close()
+        SYSLOG.close()  # TODO: move!

     def start_suite(self, suite):
-        SYSLOG.info("Running test suite '%s'" % suite.longname)
-        if self.logger is None:
-            self.logger = XmlLogger(self._settings['Output'],
-                                    self._settings['SplitOutputs'])
-        outpath = self.logger.start_suite(suite)
-        if outpath is not None:
-            suite.namespace.variables.set_global('${OUTPUT_FILE}', outpath)
-            if self._namegen is not None:
+ SYSLOG.info("Running test suite '%s'" % suite.longname) # TODO: move!
+        SYSLOG.start_suite(suite)
+        if self.xmllogger.started_output:
+            suite.namespace.variables.set_global('${OUTPUT_FILE}',
+ self.xmllogger.started_output)
+            if self._namegen:
                 suite.namespace.variables.set_global('${LOG_FILE}',
self._namegen.get_name())
-        SYSLOG.start_suite(suite)
         if self._debugfile is not None:
             self._debugfile.start_suite(suite)

     def end_suite(self, suite):
-        outpath = self.logger.end_suite(suite)
-        if outpath is not None:
-            SYSLOG.output_file('Output', outpath)
+        SYSLOG.end_suite(suite)
+        if self.xmllogger.ended_output:
+            SYSLOG.output_file('Output', self.xmllogger.ended_output)
             orig_outpath = self._settings['Output']
suite.namespace.variables.set_global('${OUTPUT_FILE}', orig_outpath)
-            self._create_split_log(outpath, suite)
-        SYSLOG.end_suite(suite)
+            self._create_split_log(self.xmllogger.ended_output, suite)
         if self._debugfile is not None:
             self._debugfile.end_suite(suite)

@@ -98,30 +92,27 @@

     def start_test(self, test):
         SYSLOG.info("Running test case '%s'" % test.name)
-        self.logger.start_test(test)
         SYSLOG.start_test(test)
         if self._debugfile is not None:
             self._debugfile.start_test(test)

     def end_test(self, test):
-        self.logger.end_test(test)
         SYSLOG.end_test(test)
         if self._debugfile is not None:
             self._debugfile.end_test(test)

     def start_keyword(self, kw):
-        self.logger.start_keyword(kw)
         SYSLOG.start_keyword(kw)
         if self._debugfile is not None:
             self._debugfile.start_keyword(kw)

     def end_keyword(self, kw):
-        self.logger.end_keyword(kw)
         SYSLOG.end_keyword(kw)
         if self._debugfile is not None:
             self._debugfile.end_keyword(kw)

     def write(self, msg='', level='INFO', html=False):
+        # TODO: remove
         if self._debugfile is not None and self._is_logged(level, 'DEBUG'):
             self._debugfile.message(msg)
         if level.upper() == 'WARN':
@@ -129,7 +120,7 @@
         AbstractLogger.write(self, msg, level, html)

     def _write(self, msg):
-        self.logger.message(msg)
+        self.xmllogger.message(msg)

     def log_output(self, output):
         """Splits given output to levels and messages and logs them"""
@@ -171,20 +162,3 @@
         if token == 'HTML':
             return 'INFO', True
         return token, False
-
-
-class _ExecutionErrorLogger:
-
-    def __init__(self):
-        self._messages = []
-
-    def write(self, msg, level):
-        if level in ['WARN', 'ERROR']:
-            self._messages.append(msg)
-
-    def serialize(self, serializer):
-        serializer.start_syslog(self)
-        for msg in self._messages:
-            serializer.message(msg)
-        serializer.end_syslog(self)
-

Modified: trunk/src/robot/output/xmllogger.py
==============================================================================
--- trunk/src/robot/output/xmllogger.py (original)
+++ trunk/src/robot/output/xmllogger.py Thu Mar 26 14:51:56 2009
@@ -29,6 +29,7 @@
         self._index_writer = None
         self._split_level = split_level
         self._suite_level = 0
+        self._errors = []

     def _get_writer(self, path, attrs={}):
         try:
@@ -40,11 +41,21 @@
         return writer

     def _close_writer(self, writer):
-        writer.end_element('robot')
-        writer.close()
-
-    def close(self):
+        if not writer.closed:
+            writer.end_element('robot')
+            writer.close()
+
+    def close(self, serialize_errors=False):
+        if serialize_errors:
+            self.start_syslog()
+            for msg in self._errors:
+                self.message(msg)
+            self.end_syslog()
         self._close_writer(self._writer)
+
+    def write(self, msg, level):
+        if level in ['WARN', 'ERROR']:
+            self._errors.append(msg)

     def message(self, msg):
         html = msg.html and 'yes' or 'no'
@@ -73,13 +84,13 @@
         self._writer.end_element('test')

     def start_suite(self, suite):
-        outpath = None
         if self._suite_level == self._split_level:
             self._start_split_output(suite)
-            outpath = self._writer.path
+            self.started_output = self._writer.path
+        else:
+            self.started_output = None
         self._start_suite(suite)
         self._suite_level += 1
-        return outpath

     def _start_split_output(self, suite):
         path =  self._namegen.get_name()
@@ -103,7 +114,9 @@
         self._suite_level -= 1
         self._end_suite(suite)
         if self._suite_level == self._split_level:
-            return self._end_split_output(suite)
+            self.ended_output = self._end_split_output(suite)
+        else:
+            self.ended_output = None

     def _end_split_output(self, suite):
         outpath = self._writer.path
@@ -157,11 +170,12 @@
         if stat.combined is True:
             return 'combined'
         return ''
-
-    def start_syslog(self, syslog):
+
+    # TODO: Remove 1) syslog -> errors 2) why arg to this method?
+    def start_syslog(self, syslog=None):
         self._writer.start_element('syslog')

-    def end_syslog(self, syslog):
+    def end_syslog(self, syslog=None):
         self._writer.end_element('syslog')

     def _write_list(self, tag, items, container=None):

Modified: trunk/src/robot/utils/jyxmlwriter.py
==============================================================================
--- trunk/src/robot/utils/jyxmlwriter.py        (original)
+++ trunk/src/robot/utils/jyxmlwriter.py        Thu Mar 26 14:51:56 2009
@@ -30,6 +30,7 @@
         self._writer.setResult(StreamResult(self._output))
         self._writer.startDocument()
         self.content('\n')
+        self.closed = False

     def start_element(self, name, attributes={}, newline=True):
         attrs = AttributesImpl()
@@ -52,3 +53,4 @@
     def close(self):
         self._writer.endDocument()
         self._output.close()
+        self.closed = True

Modified: trunk/src/robot/utils/pyxmlwriter.py
==============================================================================
--- trunk/src/robot/utils/pyxmlwriter.py        (original)
+++ trunk/src/robot/utils/pyxmlwriter.py        Thu Mar 26 14:51:56 2009
@@ -26,6 +26,7 @@
         self._output = open(path, 'wb')
         self._writer = XMLGenerator(self._output, 'UTF-8')
         self._writer.startDocument()
+        self.closed = False

     def start_element(self, name, attributes={}, newline=True):
         attrs = AttributesImpl(attributes)
@@ -45,3 +46,4 @@
     def close(self):
         self._writer.endDocument()
         self._output.close()
+        self.closed = True

Reply via email to