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()
-