1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
"""
Formats nose output into format easily parsable by machine.
It is intended to be use to integrate nose with your IDE such as Vim.
"""
import os
import traceback
from nose.plugins import Plugin
class DummyStream:
def write(self, *arg):
pass
def writeln(self, *arg):
pass
def flush(self):
pass
class NoseMachineReadableOutput(Plugin):
"""
Output errors and failures in a machine-readable way.
"""
name = 'machineout'
def __init__(self):
super(NoseMachineReadableOutput, self).__init__()
self.basepath = os.getcwd()
def addError(self, test, err):
self.add_formatted('error', err)
def addFailure(self, test, err):
self.add_formatted('fail', err)
def setOutputStream(self, stream):
self.stream = stream
return DummyStream()
def add_formatted(self, etype, err):
exctype, value, tb = err
fulltb = traceback.extract_tb(tb)
fallback = fulltb[-1]
try:
while True:
fname, lineno, funname, msg = fulltb.pop()
if fname.startswith(self.basepath):
break
except IndexError:
fname, lineno, funname, msg = fallback
lines = traceback.format_exception_only(exctype, value)
lines = [line.strip('\n') for line in lines]
msg = lines[0]
fname = self._format_testfname(fname)
prefix = "%s:%d" % (fname, lineno)
self.stream.writeln("%s: In %s" % (fname, funname))
self.stream.writeln("%s: %s: %s" % (prefix, etype, msg))
if len(lines) > 1:
pad = ' ' * (len(etype) + 1)
for line in lines[1:]:
self.stream.writeln("%s: %s %s" % (prefix, pad, line))
def _format_testfname(self, fname):
if fname.startswith(self.basepath):
return fname[len(self.basepath) + 1:]
return fname
|