import traceback from nose.plugins import Plugin from nose.plugins.errorclass import ErrorClass, ErrorClassPlugin class MarkdownSyntaxError(Exception): pass class Markdown(ErrorClassPlugin): """ Add MarkdownSyntaxError and ensure proper formatting. """ mdsyntax = ErrorClass(MarkdownSyntaxError, label='MarkdownSyntaxError', isfailure=True) enabled = True def configure(self, options, conf): self.conf = conf def addError(self, test, err): """ Ensure other plugins see the error by returning nothing here. """ pass def formatError(self, test, err): """ Remove unnessecary and unhelpful traceback from error report. """ et, ev, tb = err if et.__name__ == 'MarkdownSyntaxError': return et, ev, '' return err def escape(html): """ Escape HTML for display as source within HTML. """ html = html.replace('&', '&') html = html.replace('<', '<') html = html.replace('>', '>') return html class HtmlOutput(Plugin): """Output test results as ugly, unstyled html. """ name = 'html-output' score = 2 # run late enabled = True def __init__(self): super(HtmlOutput, self).__init__() self.html = [ '', 'Test output', '' ] def configure(self, options, conf): self.conf = conf def addSuccess(self, test): self.html.append('ok') def addError(self, test, err): err = self.formatErr(err) self.html.append('ERROR') self.html.append('
%s
' % escape(err)) def addFailure(self, test, err): err = self.formatErr(err) self.html.append('FAIL') self.html.append('
%s
' % escape(err)) def finalize(self, result): self.html.append('
') self.html.append("Ran %d test%s" % (result.testsRun, result.testsRun != 1 and "s" or "")) self.html.append('
') self.html.append('
') if not result.wasSuccessful(): self.html.extend(['FAILED (', 'failures=%d ' % len(result.failures), 'errors=%d' % len(result.errors)]) for cls in list(result.errorClasses.keys()): storage, label, isfail = result.errorClasses[cls] if len(storage): self.html.append(' %ss=%d' % (label, len(storage))) self.html.append(')') else: self.html.append('OK') self.html.append('
') f = open('test-output.html', 'w') for l in self.html: f.write(l) f.close() def formatErr(self, err): exctype, value, tb = err return ''.join(traceback.format_exception(exctype, value, tb)) def startContext(self, ctx): try: n = ctx.__name__ except AttributeError: n = str(ctx).replace('<', '').replace('>', '') self.html.extend(['
', '', n, '']) try: path = ctx.__file__.replace('.pyc', '.py') self.html.extend(['
', path, '
']) except AttributeError: pass def stopContext(self, ctx): self.html.append('
') def startTest(self, test): self.html.extend([ '
', test.shortDescription() or str(test), '' ]) def stopTest(self, test): self.html.append('
')