def __init__(self, raw_email, debug=False): ''' Setup the base options of the copy/convert setup ''' self.raw_email = raw_email self.log_processing = StringIO() self.log_content = StringIO() self.tree(self.raw_email) twiggy_out = outputs.StreamOutput(formats.shell_format, stream=self.log_processing) emitters['*'] = filters.Emitter(levels.DEBUG, True, twiggy_out) self.log_name = log.name('files') self.cur_attachment = None self.debug = debug if self.debug: if not os.path.exists('debug_logs'): os.makedirs('debug_logs') self.log_debug_err = os.path.join('debug_logs', 'debug_stderr.log') self.log_debug_out = os.path.join('debug_logs', 'debug_stdout.log') else: self.log_debug_err = os.devnull self.log_debug_out = os.devnull
def test_trap_output(self): class BorkedOutput(outputs.ListOutput): def _write(self, x): raise RuntimeError("BORK") out = BorkedOutput(close_atexit=False) def cleanup(output): try: del self.emitters['before'] except KeyError: pass out.close() self.addCleanup(cleanup, out) self.emitters['before'] = filters.Emitter(levels.DEBUG, None, out) self.log.fields().info('hi') assert len(self.messages) == 1 m = self.messages.pop() assert m.text == "hi" assert len(self.internal_messages) == 1 m = self.internal_messages.pop() print m.text print m.traceback assert m.level == levels.WARNING assert "Error outputting with <tests.test_logger.BorkedOutput" in m.text assert "Traceback" in m.traceback assert "BORK" in m.traceback
def test_logger(request): output = outputs.ListOutput(close_atexit=False) if issubclass(request.param, logger.InternalLogger): yield request.param(output=output) else: log = request.param() emitters = log._emitters emitters['*'] = filters.Emitter(levels.DEBUG, None, output) yield log output.close()
def setUp(self): self.internal_output = outputs.ListOutput(close_atexit=False) self.internal_messages = self.internal_output.messages _twiggy._populate_globals() _twiggy.internal_log.output = self.internal_output self.log = logger.Logger() self.emitters = self.log._emitters self.output = outputs.ListOutput(close_atexit=False) self.emitters['everything'] = filters.Emitter(levels.DEBUG, None, self.output) self.messages = self.output.messages
def test_filter_property(self): # XXX we really should mock & test that msg_filter is being called. eh. e = filters.Emitter(levels.INFO, "^Hello.*$", 'output-unused') f = e.filter assert callable(f) assert f(m) e.filter = "^Goodbye.*$" f = e.filter assert callable(f) assert not f(m)
def test_trap_filter(self): out = outputs.ListOutput(close_atexit=False) def cleanup(output): try: del self.emitters['before'] except KeyError: pass out.close() self.addCleanup(cleanup, out) def go_boom(msg): raise RuntimeError("BOOM") self.emitters['before'] = filters.Emitter(levels.DEBUG, go_boom, out) self.log.fields().info('hi') # errors in filtering cause messages to be output anyway assert len(out.messages) == 1 m1 = out.messages.pop() assert m1.text == "hi" assert len(self.messages) == 1 m2 = self.messages.pop() assert m2.text == "hi" assert m1 is m2 assert len(self.internal_messages) == 1 m = self.internal_messages.pop() print m.text print m.traceback assert m.level == levels.INFO assert "Error filtering with emitter before" in m.text assert "<function go_boom" in m.text assert "Traceback" in m.traceback assert "BOOM" in m.traceback
def setUp(self): self.log = logger.Logger() self.emitters = self.log._emitters self.output = outputs.ListOutput(close_atexit=False) self.emitters['*'] = filters.Emitter(levels.DEBUG, None, self.output) self.messages = self.output.messages
def test_bad_min_level(self): with self.assertRaises(ValueError): filters.Emitter(42, None, None)