Revision: 4124
Author: janne.t.harkonen
Date: Fri Sep 24 00:42:43 2010
Log: Refactored the way loggers are registered and unregistered.
http://code.google.com/p/robotframework/source/detail?r=4124

Modified:
 /trunk/src/robot/output/logger.py
 /trunk/utest/output/test_logger.py

=======================================
--- /trunk/src/robot/output/logger.py   Fri Sep 24 00:42:36 2010
+++ /trunk/src/robot/output/logger.py   Fri Sep 24 00:42:43 2010
@@ -35,8 +35,7 @@
     """

     def __init__(self):
-        self._loggers = []
-        self._context_changing_loggers = []
+        self._loggers = LoggerCollection()
         self._message_cache = []
         self._register_console_logger()
         self._console_logger_disabled = False
@@ -46,34 +45,26 @@

     def disable_automatic_console_logger(self):
         if not self._console_logger_disabled:
-            self._loggers.pop(0)
             self._console_logger_disabled = True
+            self._loggers.remove_first_regular_logger()

     def register_logger(self, *loggers):
         for log in loggers:
-            logger = self._register_logger(log)
+            logger = self._loggers.register_regular_logger(log)
             self._relay_cached_messages_to(logger)

-    def _register_logger(self, log):
-        self._loggers.append(_LoggerProxy(log))
-        return self._loggers[-1]
+    def register_context_changing_logger(self, logger):
+        log = self._loggers.register_context_changing_logger(logger)
+        self._relay_cached_messages_to(log)

     def _relay_cached_messages_to(self, logger):
         if self._message_cache:
             for msg in self._message_cache:
                 logger.message(msg)

-    def register_context_changing_logger(self, log):
-        self._context_changing_loggers.append(_LoggerProxy(log))
-        self._relay_cached_messages_to(self._context_changing_loggers[-1])
-
     def unregister_logger(self, *loggers):
         for log in loggers:
-            self._loggers = [proxy for proxy in self._loggers
-                             if proxy.logger is not log]
- self._context_changing_loggers = [proxy for proxy in self._context_changing_loggers
-                                              if proxy.logger is not log]
-
+            self._loggers.unregister_logger(log)

     def register_console_logger(self, width=78, colors=True):
         self.disable_automatic_console_logger()
@@ -83,7 +74,7 @@
         if colors is None:
             colors = os.sep == '/'
         monitor = CommandLineMonitor(width, colors)
-        self._register_logger(monitor)
+        self._loggers.register_regular_logger(monitor)

     def register_file_logger(self, path=None, level='INFO'):
         if not path:
@@ -101,14 +92,14 @@

     def message(self, msg):
"""Messages about what the framework is doing, warnings, errors, ..."""
-        for logger in self._context_changing_loggers + self._loggers:
+        for logger in self._loggers.get_loggers():
             logger.message(msg)
         if self._message_cache is not None:
             self._message_cache.append(msg)

     def log_message(self, msg):
         """Log messages written (mainly) by libraries"""
-        for logger in self._context_changing_loggers + self._loggers:
+        for logger in self._loggers.get_loggers():
             logger.log_message(msg)
         if msg.level == 'WARN':
             msg.linkable = True
@@ -120,43 +111,75 @@

     def output_file(self, name, path):
"""Finished output, report, log, summary or debug file (incl. split)"""
-        for logger in self._loggers + self._context_changing_loggers:
+        for logger in self._loggers.get_loggers():
             logger.output_file(name, path)

     def close(self):
-        for logger in self._loggers + self._context_changing_loggers:
+        for logger in self._loggers.get_loggers():
             logger.close()
-        self._loggers = []
-        self._context_changing_loggers = []
+        self._loggers = LoggerCollection()
         self._message_cache = []

     def start_suite(self, suite):
-        for logger in self._context_changing_loggers + self._loggers:
+        for logger in self._loggers.get_starting_loggers():
             logger.start_suite(suite)

     def end_suite(self, suite):
-        for logger in self._loggers + self._context_changing_loggers:
+        for logger in self._loggers.get_ending_loggers():
             logger.end_suite(suite)

     def start_test(self, test):
-        for logger in self._context_changing_loggers + self._loggers:
+        for logger in self._loggers.get_starting_loggers():
             logger.start_test(test)

     def end_test(self, test):
-        for logger in self._loggers + self._context_changing_loggers:
+        for logger in self._loggers.get_ending_loggers():
             logger.end_test(test)

     def start_keyword(self, keyword):
-        for logger in self._context_changing_loggers + self._loggers:
+        for logger in self._loggers.get_starting_loggers():
             logger.start_keyword(keyword)

     def end_keyword(self, keyword):
-        for logger in self._loggers + self._context_changing_loggers:
+        for logger in self._loggers.get_ending_loggers():
             logger.end_keyword(keyword)


-class _LoggerProxy(AbstractLoggerProxy):
-
+class LoggerCollection(object):
+
+    def __init__(self):
+        self._regular_loggers = []
+        self._context_changing_loggers = []
+
+    def register_regular_logger(self, logger):
+        self._regular_loggers.append(_LoggerProxy(logger))
+        return self._regular_loggers[-1]
+
+    def register_context_changing_logger(self, logger):
+        self._context_changing_loggers.append(_LoggerProxy(logger))
+        return self._context_changing_loggers[-1]
+
+    def remove_first_regular_logger(self):
+        return self._regular_loggers.pop(0)
+
+    def unregister_logger(self, logger):
+        self._regular_loggers = [proxy for proxy in self._regular_loggers
+                                 if proxy.logger is not logger]
+        self._context_changing_loggers = [proxy for proxy
+                                          in self._context_changing_loggers
+                                          if proxy.logger is not logger]
+
+    def get_starting_loggers(self):
+        return self.get_loggers()
+
+    def get_ending_loggers(self):
+        return self._regular_loggers + self._context_changing_loggers
+
+    def get_loggers(self):
+        return self._context_changing_loggers + self._regular_loggers
+
+
+class _LoggerProxy(AbstractLoggerProxy):
     _methods = ['message', 'log_message', 'output_file', 'close',
                 'start_suite', 'end_suite', 'start_test', 'end_test',
                 'start_keyword', 'end_keyword']
=======================================
--- /trunk/utest/output/test_logger.py  Fri Sep 24 00:42:36 2010
+++ /trunk/utest/output/test_logger.py  Fri Sep 24 00:42:43 2010
@@ -90,11 +90,11 @@
         logger2 = LoggerMock2(('Hello, world!', 'INFO'))
         self.logger.register_logger(logger, logger2)
         self.logger.close()
-        assert_equals(self.logger._loggers, [])
+        assert_equals(self.logger._loggers.get_loggers(), [])

     def test_registering_file_logger_with_none_path_does_nothing(self):
         self.logger.register_file_logger('None')
-        assert_equals(self.logger._loggers, [])
+        assert_equals(self.logger._loggers.get_loggers(), [])

     def test_cached_messages_are_given_to_registered_writers(self):
         self.logger.write('This is a cached message', 'INFO')
@@ -128,45 +128,45 @@

     def test_console_logger_is_automatically_registered(self):
         logger = Logger()
- assert_true(logger._loggers[0].start_suite.im_class is CommandLineMonitor) + assert_true(logger._loggers.get_loggers()[0].start_suite.im_class is CommandLineMonitor)

     def test_automatic_console_logger_can_be_disabled(self):
         logger = Logger()
         logger.disable_automatic_console_logger()
-        assert_equals(logger._loggers, [])
+        assert_equals(logger._loggers.get_loggers(), [])

def test_automatic_console_logger_can_be_disabled_after_registering_logger(self):
         logger = Logger()
         mock = LoggerMock()
         logger.register_logger(mock)
         logger.disable_automatic_console_logger()
-        assert_equals(len(logger._loggers), 1)
-        assert_true(logger._loggers[0].message.im_class is LoggerMock)
+        self._number_of_registered_loggers_should_be(1, logger)
+ assert_true(logger._loggers.get_loggers()[0].message.im_class is LoggerMock)

     def test_disabling_automatic_logger_multiple_times_has_no_effect(self):
         logger = Logger()
         logger.disable_automatic_console_logger()
-        assert_equals(len(logger._loggers), 0)
+        self._number_of_registered_loggers_should_be(0, logger)
         logger.disable_automatic_console_logger()
         logger.disable_automatic_console_logger()
-        assert_equals(len(logger._loggers), 0)
+        self._number_of_registered_loggers_should_be(0, logger)
         logger.register_logger(LoggerMock())
         logger.disable_automatic_console_logger()
-        assert_equals(len(logger._loggers), 1)
+        self._number_of_registered_loggers_should_be(1, logger)

def test_registering_console_logger_disables_automatic_console_logger(self):
         logger = Logger()
         logger.register_console_logger(width=42)
-        assert_equals(len(logger._loggers), 1)
-        assert_equals(logger._loggers[0].start_suite.im_self._width, 42)
+        self._number_of_registered_loggers_should_be(1, logger)
+ assert_equals(logger._loggers.get_loggers()[0].start_suite.im_self._width, 42)

     def test_unregister_logger(self):
logger1, logger2, logger3 = LoggerMock(), LoggerMock(), LoggerMock()
         self.logger.register_logger(logger1, logger2, logger3)
         self.logger.unregister_logger(logger2)
-        assert_equals(len(self.logger._loggers), 2)
+        self._number_of_registered_loggers_should_be(2)
         self.logger.unregister_logger(logger3, logger1)
-        assert_equals(len(self.logger._loggers), 0)
+        self._number_of_registered_loggers_should_be(0)

     def test_unregistering_non_registered_logger_is_ok(self):
         logger1, logger2 = LoggerMock(), LoggerMock()
@@ -176,7 +176,7 @@

     def test_registering_context_changing_logger(self):
         self.logger.register_context_changing_logger(LoggerMock())
-        assert_equals(len(self.logger._context_changing_loggers), 1)
+        self._number_of_registered_loggers_should_be(1)

     def test_messages_to_context_chagning_loggers(self):
         log = LoggerMock(('msg', 'INFO'))
@@ -221,7 +221,10 @@
         self.logger.end_keyword('Keyword')
         assert_true(log2.suite is not None)

+    def _number_of_registered_loggers_should_be(self, number, logger=None):
+        logger = logger or self.logger
+        assert_equals(len(logger._loggers.get_loggers()), number)
+

 if __name__ == "__main__":
     unittest.main()
-

Reply via email to