def __init__(self, log_level='INFO'): AbstractLogger.__init__(self, level=log_level) self.logging_handler = LoggingHandler() if LibraryListeners is not None: # Robot 3.0 self.library_listeners = LibraryListeners(log_level) # streams to be used internally for writing messages # - see self.__enter__() and self.message() self._out = self._err = None
def test_some_methods_implemented(self): class MyListener(object): ROBOT_LISTENER_API_VERSION = 2 def end_suite(self, suite): pass libs = LibraryListeners() libs.new_suite_scope() libs.register([MyListener()], None) for listeners in [Listeners([MyListener()]), libs]: listeners.start_suite(None) assert_raises(AttributeError, listeners.end_suite, None)
def test_message_methods(self): class Message(object): level = 'INFO' for listeners in [Listeners([]), LibraryListeners()]: listeners.log_message(Message) listeners.message(Message)
def test_start_and_end_methods(self): class ModelStub: IF_ELSE_ROOT = 'IF/ELSE ROOT' type = 'xxx' for listeners in [Listeners([]), LibraryListeners()]: for name in dir(listeners): if name.startswith(('start_', 'end_')): model = ModelStub() if name.endswith('keyword') else None method = getattr(listeners, name) method(model)
def test_start_and_end_methods(self): for listeners in [Listeners([]), LibraryListeners()]: for name in dir(listeners): if name.startswith(('start_', 'end_')): method = getattr(listeners, name) method(None)
class Output(AbstractLogger): def __init__(self, log_level='INFO'): AbstractLogger.__init__(self, level=log_level) self.logging_handler = LoggingHandler() if LibraryListeners is not None: # Robot 3.0 self.library_listeners = LibraryListeners(log_level) # streams to be used internally for writing messages # - see self.__enter__() and self.message() self._out = self._err = None def set_log_level(self, level): if LibraryListeners is not None: # Robot 3.0 self.library_listeners.set_log_level(level) return self.set_level(level) def __enter__(self): # save sys.stdout and sys.stderr for writing self._out = sys.stdout self._err = sys.stderr #HACK: Dynamically (un)register Output: LOGGER.disable_message_cache() LOGGER.unregister_console_logger() LOGGER.register_logger(self) # Catch global logging: self.logging_handler.__enter__() def __exit__(self, *exc): #HACK: self.logging_handler.__exit__(*exc) LOGGER.unregister_logger(self) # unset internal streams self._out = self._err = None _re_log_level = re.compile('|'.join(r % '|'.join(LOG_LEVELS) for r in [r'^\[ ?(%s) ?\] *', r'^\* ?(%s) ?\* *'])) def message(self, message): msg = message.message try: _, brackets, stars, msg = self._re_log_level.split(msg) except ValueError: level = message.level else: level = brackets or stars if not self._is_logged(level): return # select streams to use if level == 'INFO': stream = self._out or sys.__stdout__ else: stream = self._err or sys.__stderr__ #... and finally write the message stream.write("[ ") try: color = LOG_LEVEL_COLORS[level] except KeyError: stream.write(level) else: with Highlighter(color, stream) as hl: hl.write(level) stream.write(" ]%s %s\n" % ( ' ' * (LOG_LEVELS_MAX_WIDTH - len(level)), msg)) def fail(self, message, *args): self._last_fail_exc = sys.exc_info() AbstractLogger.fail(self, message, *args) def register_error_listener(self, listener): pass def start_suite(self, suite): pass def end_suite(self, suite): pass def start_test(self, test): pass def end_test(self, test): pass def start_keyword(self, kw): pass def end_keyword(self, kw): pass
class Output(AbstractLogger): def __init__(self, log_level='INFO'): AbstractLogger.__init__(self, level=log_level) self.logging_handler = LoggingHandler() if LibraryListeners is not None: # Robot 3.0 self.library_listeners = LibraryListeners(log_level) # streams to be used internally for writing messages # - see self.__enter__() and self.message() self._out = self._err = None def set_log_level(self, level): if LibraryListeners is not None: # Robot 3.0 self.library_listeners.set_log_level(level) return self.set_level(level) def __enter__(self): # save sys.stdout and sys.stderr for writing self._out = sys.stdout self._err = sys.stderr #HACK: Dynamically (un)register Output: LOGGER.disable_message_cache() LOGGER.unregister_console_logger() LOGGER.register_logger(self) # Catch global logging: self.logging_handler.__enter__() def __exit__(self, *exc): #HACK: self.logging_handler.__exit__(*exc) LOGGER.unregister_logger(self) # unset internal streams self._out = self._err = None _re_log_level = re.compile('|'.join( r % '|'.join(LOG_LEVELS) for r in [r'^\[ ?(%s) ?\] *', r'^\* ?(%s) ?\* *'])) def message(self, message): msg = message.message try: _, brackets, stars, msg = self._re_log_level.split(msg) except ValueError: level = message.level else: level = brackets or stars if not self._is_logged(level): return # select streams to use if level == 'INFO': stream = self._out or sys.__stdout__ else: stream = self._err or sys.__stderr__ #... and finally write the message stream.write("[ ") try: color = LOG_LEVEL_COLORS[level] except KeyError: stream.write(level) else: with Highlighter(color, stream) as hl: hl.write(level) stream.write(" ]%s %s\n" % (' ' * (LOG_LEVELS_MAX_WIDTH - len(level)), msg)) def fail(self, message, *args): self._last_fail_exc = sys.exc_info() AbstractLogger.fail(self, message, *args) def register_error_listener(self, listener): pass def start_suite(self, suite): pass def end_suite(self, suite): pass def start_test(self, test): pass def end_test(self, test): pass def start_keyword(self, kw): pass def end_keyword(self, kw): pass