0001from lxml import etree
0002
0003class DummyLog(object):
0004    def debug(self, msg, *args):
0005        pass
0006    info = warn = warning = error = debug
0007
0008class AbstractLog(object):
0009
0010    def _make_method(level):
0011        def msg(self, msg, *args):
0012            self.message(level, msg, *args)
0013        return msg
0014    debug = _make_method('debug')
0015    info = _make_method('info')
0016    warn = warning = _make_method('warn')
0017    error = _make_method('error')
0018    fatal = _make_method('fatal')
0019    del _make_method
0020
0021class FileLog(AbstractLog):
0022    def __init__(self, file):
0023        self.file = file
0024    def message(self, level, msg, *args):
0025        if args:
0026            msg = msg % args
0027        self.file.write('%s: %s\n' % (level, msg))
0028
0029class InlineLog(AbstractLog):
0030
0031    def __init__(self):
0032        self._messages = []
0033
0034    def message(self, level, msg, *args):
0035        if args:
0036            msg = msg % args
0037        self._messages.append((level, msg))
0038
0039    def add_to_page(self, page):
0040        body = page.html.find('body')
0041        text = ''.join([
0042            '%s: %s\n' % (level, msg)
0043            for level, msg in self._messages])
0044        pre = etree.Element('pre')
0045        pre.attrib['class'] = 'over-log'
0046        pre.text = text
0047        body.append(pre)