Author: pekka.klarck
Date: Thu Mar 26 13:50:59 2009
New Revision: 1551

Modified:
   trunk/src/robot/__init__.py
   trunk/src/robot/output/systemlogger.py
   trunk/utest/output/test_systemlogger.py

Log:
Added start/end_suite/test/kw methods to SYSLOG -- first step to make SYSLOG the one-and-only logger. This new functionality is not in use yet but I want to submit this as a separate commit since it also takes into use new way to register loggers. Commit also includes adding more doc to SystemLogger and renaming register_command_line_monitor to register_console_logger (which should've been submitted separately).

Modified: trunk/src/robot/__init__.py
==============================================================================
--- trunk/src/robot/__init__.py (original)
+++ trunk/src/robot/__init__.py Thu Mar 26 13:50:59 2009
@@ -50,7 +50,7 @@
     except Information, msg:
         _exit(INFO_PRINTED, str(msg))
     except DataError, err:
-        SYSLOG.register_command_line_monitor()
+        SYSLOG.register_console_logger()
         _exit(DATA_ERROR, str(err))

     try:
@@ -82,8 +82,8 @@
     pybot --log mylog.html /path/to/tests.html /path/to/tests2.html
     """
     settings = RobotSettings(options)
-    SYSLOG.register_command_line_monitor(settings['MonitorWidth'],
-                                         settings['MonitorColors'])
+    SYSLOG.register_console_logger(settings['MonitorWidth'],
+                                   settings['MonitorColors'])
     output = Output(settings)
     init_global_variables(settings)
     _syslog_start_info('Robot', datasources, settings)
@@ -120,7 +120,7 @@
     rebot --report myrep.html --log NONE /path/out1.xml /path/out2.xml
     """
     settings = RebotSettings(options)
-    SYSLOG.register_command_line_monitor(colors=settings['MonitorColors'])
+    SYSLOG.register_console_logger(colors=settings['MonitorColors'])
     SYSLOG.disable_message_cache()
     _syslog_start_info('Rebot', datasources, settings)
     testoutput = RebotTestOutput(datasources, settings)

Modified: trunk/src/robot/output/systemlogger.py
==============================================================================
--- trunk/src/robot/output/systemlogger.py      (original)
+++ trunk/src/robot/output/systemlogger.py      Thu Mar 26 13:50:59 2009
@@ -27,12 +27,14 @@
Whenever something is written to SYSLOG in code, all registered loggers are
     notified.  Messages are also cached and cached messasges written to new
     loggers when they are registered.
+
+ Tools using Robot Framework's internal modules should register their own + loggers at least to get notifications about errors and warnings. A shortcut
+    to get errors/warnings into console is using 'register_console_logger'.
     """

     def __init__(self):
-        self._writers = []
-        self._output_filers = []
-        self._closers = []
+        self._loggers = []
         self._message_cache = []
         self.monitor = None

@@ -40,18 +42,14 @@
         self._message_cache = None

     def register_logger(self, *loggers):
-        for logger in loggers:
-            if hasattr(logger, 'write'):
-                self._writers.append(logger.write)
-                if self._message_cache:
-                    for msg in self._message_cache:
-                        logger.write(msg, msg.level)
-            if hasattr(logger, 'output_file'):
-                self._output_filers.append(logger.output_file)
-            if hasattr(logger, 'close'):
-                self._closers.append(logger.close)
+        for log in loggers:
+            logger = _Logger(log)
+            self._loggers.append(logger)
+            if self._message_cache:
+                for msg in self._message_cache:
+                    logger.write(msg, msg.level)

-    def register_command_line_monitor(self, width=78, colors=True):
+    def register_console_logger(self, width=78, colors=True):
         self.monitor = CommandLineMonitor(width, colors)
         self.register_logger(self.monitor)

@@ -71,19 +69,53 @@

     def write(self, message, level='INFO'):
         msg = Message(message, level)
-        for write in self._writers:
-            write(msg, level)
+        for logger in self._loggers:
+            logger.write(msg, level)
         if self._message_cache is not None:
             self._message_cache.append(msg)

+    def start_suite(self, suite):
+        for logger in self._loggers:
+            logger.start_suite(suite)
+
+    def end_suite(self, suite):
+        for logger in self._loggers:
+            logger.end_suite(suite)
+
+    def start_test(self, test):
+        for logger in self._loggers:
+            logger.start_test(test)
+
+    def end_test(self, test):
+        for logger in self._loggers:
+            logger.end_test(test)
+
+    def start_keyword(self, keyword):
+        for logger in self._loggers:
+            logger.start_keyword(keyword)
+
+    def end_keyword(self, keyword):
+        for logger in self._loggers:
+            logger.end_keyword(keyword)
+
     def output_file(self, name, path):
-        for output_file in self._output_filers:
-            output_file(name, path)
+        for logger in self._loggers:
+            logger.output_file(name, path)

     def close(self):
-        for close in self._closers:
-            close()
+        for logger in self._loggers:
+            logger.close()
         self.__init__()
+
+
+class _Logger:
+
+    def __init__(self, logger):
+        for name in ['write', 'output_file', 'close',
+                     'start_suite', 'end_suite', 'start_test', 'end_test',
+                     'start_keyword', 'end_keyword']:
+            method = getattr(logger, name, lambda *args: None)
+            setattr(self, name, method)


 class _FileLogger(AbstractLogger):

Modified: trunk/utest/output/test_systemlogger.py
==============================================================================
--- trunk/utest/output/test_systemlogger.py     (original)
+++ trunk/utest/output/test_systemlogger.py     Thu Mar 26 13:50:59 2009
@@ -126,13 +126,11 @@
         logger2 = LoggerMock2(('Hello, world!', 'INFO'))
         self.syslog.register_logger(logger, logger2)
         self.syslog.close()
-        assert_true(self.syslog._writers ==
-                    self.syslog._output_filers ==
-                    self.syslog._closers == [])
+        assert_equals(self.syslog._loggers, [])

     def test_registering_file_logger_with_none_path_does_nothing(self):
         self.syslog.register_file_logger('None')
-        assert_equals(len(self.syslog._writers), 0)
+        assert_equals(self.syslog._loggers, [])

     def test_cached_messages_are_given_to_registered_writers(self):
         self.syslog.write('This is a cached message', 'INFO')
@@ -148,6 +146,21 @@
         logger = LoggerMock(('', ''))
         self.syslog.register_logger(logger)
         assert_false(hasattr(logger, 'msg'))
+
+    def test_start_and_end_suite_test_and_keyword(self):
+        class Logger:
+            def start_suite(self, suite): self.started_suite = suite
+            def end_suite(self, suite): self.ended_suite = suite
+            def start_test(self, test): self.started_test = test
+            def end_test(self, test): self.ended_test = test
+ def start_keyword(self, keyword): self.started_keyword = keyword
+            def end_keyword(self, keyword): self.ended_keyword = keyword
+        logger = Logger()
+        self.syslog.register_logger(logger)
+        for name in 'suite', 'test', 'keyword':
+            for stend in 'start', 'end':
+                getattr(self.syslog, stend+'_'+name)(name)
+                assert_equals(getattr(logger, stend+'ed_'+name), name)


 if __name__ == "__main__":

Reply via email to