Repository navigation
Expand file tree
/
Copy pathrunner.py
More file actions
89 lines (68 loc) · 2.84 KB
/
Copy pathrunner.py
File metadata and controls
89 lines (68 loc) · 2.84 KB
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# Patchwork - automated patch tracking system
# Copyright (C) 2023 Stephen Finucane <stephen@that.guru>
#
# SPDX-License-Identifier: GPL-2.0-or-later
from unittest import TestResult
from unittest import TextTestRunner
from django.test.runner import DiscoverRunner
from termcolor import colored
# Based on upstream source
# https://github.com/python/cpython/blob/v3.11.4/Lib/unittest/runner.py
class ColourTextTestResult(TestResult):
def __init__(self, stream, descriptions, verbosity, *, durations=None):
super().__init__(stream, descriptions, verbosity)
self.stream = stream
self.descriptions = descriptions
self.verbosity = verbosity
def startTest(self, test):
super().startTest(test)
if self.verbosity > 1:
self.stream.write(colored(str(test), 'white'))
self.stream.write(colored(' ... ', 'white'))
self.stream.flush()
def _reportResult(self, short, long, color):
if self.verbosity == 1:
self.stream.write(short)
else: # > 1
self.stream.writeln(colored(long, color, attrs=['bold']))
self.stream.flush()
def addSuccess(self, test):
super().addSuccess(test)
self._reportResult('.', 'ok', 'green')
def addError(self, test, err):
super().addError(test, err)
self._reportResult('E', 'ERROR', 'red')
def addFailure(self, test, err):
super().addFailure(test, err)
self._reportResult('F', 'FAIL', 'yellow')
def addSkip(self, test, reason):
super().addSkip(test, reason)
self._reportResult('s', f'skipped {reason!r}', 'white')
def addExpectedFailure(self, test, err):
super().addExpectedFailure(test, err)
self._reportResult('s', 'expected failure', 'blue')
def addUnexpectedSuccess(self, test):
super().addUnexpectedSuccess(test)
self._reportResult('s', 'unexpected success', 'red')
def printErrors(self):
self.stream.writeln()
self.stream.flush()
self.printErrorList('ERROR', self.errors)
self.printErrorList('FAIL', self.failures)
unexpectedSuccesses = getattr(self, 'unexpectedSuccesses', ())
if unexpectedSuccesses:
self.stream.writeln('=' * 70)
for test in unexpectedSuccesses:
self.stream.writeln(f'UNEXPECTED SUCCESS: {str(test)}')
self.stream.flush()
def printErrorList(self, flavour, errors):
for test, err in errors:
self.stream.writeln('=' * 70)
self.stream.writeln(f'{flavour}: {str(test)}')
self.stream.writeln('-' * 70)
self.stream.writeln(str(err))
self.stream.flush()
class ColourTextTestRunner(TextTestRunner):
resultclass = ColourTextTestResult
class PatchworkTestRunner(DiscoverRunner):
test_runner = ColourTextTestRunner