import sys import py from py.__.test.session import Session from py.__.test.reporter import AbstractReporter from twisted.spread.banana import encode from twisted.spread.jelly import jelly import cPickle from netstring import netstring from StringIO import StringIO def itemrepr(item): return (item.__class__.__name__, item.listnames()) class MyReporter(AbstractReporter): def __init__(self, *args, **kwds): super(MyReporter, self).__init__(*args, **kwds) # XXXXXXXXXXXXXXx SUPER HACK mostly broken only works if you run # py.test just how I run py.test, sorry. -exarkun #self.name = filter(None, sys.argv[-1].split('/')[:-1]) # Marker so the peer can recognize our newline convention. >< # -exarkun self.out.write('\n') def report(self, event): repfun = getattr(self, "report_" + event.__class__.__name__, self.report_unknown) try: eventname = event.__class__.__name__ res = repfun(event) if res is not None: netstring(self.out, eventname, encode(jelly(res))) except (KeyboardInterrupt, SystemExit): raise except: s = StringIO() s.write("Internal reporting problem\n") excinfo = py.code.ExceptionInfo() for i in excinfo.traceback: s.write(str(i)[2:-1]) s.write(str(excinfo) + "\n") netstring(self.out, "FAILURE", s.getvalue()) raise __call__ = report def report_unknown(self, event): pass def report_TestStarted(self, event): return {} def report_TestFinished(self, event): return {} def report_ReceivedItemOutcome(self, event): # XXX whack, because traceback is a subclass of a list, which # confuses jelly outcome = event.outcome if outcome.excinfo is not None: outcome.excinfo.traceback = [i for i in outcome.excinfo.traceback] return (itemrepr(event.item), outcome) def report_ItemStart(self, event): return itemrepr(event.item) def report_ItemFinish(self, event): return itemrepr(event.item) class MySession(Session): reporterclass = MyReporter