Skip to content

Commit f420da4

Browse files
committed
Update templates to a new theme using bootstrap
Adds Bootstrap 3 Adds jQuery Update sample template partial commit partial commit 2 partial commit 3 partial commit 4 partial commit 5
1 parent e7d104b commit f420da4

36 files changed

+20910
-346
lines changed

HTMLTestRunner.py

+54-33
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010

1111
# TODO: color stderr
12-
# TODO: simplify javascript using ,ore than 1 class in the class attribute?
12+
# TODO: simplify javascript using , more than 1 class in the class attribute?
1313

1414

1515
# ------------------------------------------------------------------- #
@@ -102,7 +102,7 @@ class TemplateMixin(object):
102102
}
103103

104104
DEFAULT_TITLE = 'Test Report'
105-
DEFAULT_DESCRIPTION = ''
105+
DEFAULT_DESCRIPTION = 'This is a simple description. And it has two phrases.'
106106

107107
# ------------------------------------------------------------------- #
108108
# HTML Template
@@ -116,29 +116,29 @@ class TemplateMixin(object):
116116
# ------------------------------------------------------------------- #
117117
# alternatively use a <link> for external style sheet, e.g.
118118
# <link rel="stylesheet" href="$url" type="text/css">
119-
STYLESHEET_TEMPLATE = open('templates/stylesheet.html', 'r').read() \
119+
STYLESHEET_TEMPLATE = open('templates/head_inserts.html', 'r').read() \
120120
.encode('utf-8')
121121

122122
# ------------------------------------------------------------------- #
123123
# Heading
124124
# ------------------------------------------------------------------- #
125125
# variables: (title, parameters, description)
126-
HEADING_TEMPLATE = open('templates/heading.html', 'r').read() \
126+
HEADING_TEMPLATE = open('templates/header.html', 'r').read() \
127127
.encode('utf-8')
128128

129129
# variables: (name, value)
130-
HEADING_ATTRIBUTE_TEMPLATE = open('templates/heading_attribute.html', 'r')\
130+
HEADING_ATTRIBUTE_TEMPLATE = open('templates/header_parameters.html', 'r')\
131131
.read().encode('utf-8')
132132

133133
# ------------------------------------------------------------------- #
134134
# Report
135135
# ------------------------------------------------------------------- #
136136
# variables: (test_list, count, Pass, fail, error, skip)
137-
REPORT__TABLE_TEMPLATE = open('templates/report_table.html', 'r') \
137+
REPORT__TABLE_TEMPLATE = open('templates/result_table.html', 'r') \
138138
.read().encode('utf-8')
139139

140140
# variables: (style, desc, count, Pass, fail, error, cid)
141-
REPORT_CLASS_TEMPLATE = open('templates/report_class.html', 'r').read()\
141+
REPORT_CLASS_TEMPLATE = open('templates/test_class.html', 'r').read()\
142142
.encode('utf-8')
143143

144144
# variables: (tid, Class, style, desc, status)
@@ -157,7 +157,8 @@ class TemplateMixin(object):
157157
# ------------------------------------------------------------------- #
158158
# ENDING
159159
# ------------------------------------------------------------------- #
160-
ENDING_TEMPLATE = r"""<div id='ending'>&nbsp;</div>"""
160+
ENDING_TEMPLATE = open('templates/footer.html', 'r').read()\
161+
.encode('utf-8')
161162

162163

163164
# -------------------- The end of the Template class -------------------
@@ -291,18 +292,22 @@ def sort_result(result_list):
291292

292293
class HTMLTestRunner(TemplateMixin):
293294
def __init__(self, stream=sys.stdout, verbosity=1, title=None,
294-
description=None):
295+
description=None, attrs=None):
295296
self.stream = stream
296297
self.verbosity = verbosity
298+
297299
if title is None:
298300
self.title = self.DEFAULT_TITLE
299301
else:
300302
self.title = title
303+
301304
if description is None:
302305
self.description = self.DEFAULT_DESCRIPTION
303306
else:
304307
self.description = description
305308

309+
self.attributes = attrs
310+
306311
self.startTime = datetime.datetime.now()
307312
self.stopTime = None
308313

@@ -318,61 +323,77 @@ def run(self, test):
318323

319324
def get_report_attributes(self, result):
320325
"""
321-
Return report attributes as a list of (name, value).
326+
Return report attributes as a list of tuples with (name, value).
322327
Override this to add custom attributes.
323328
"""
324-
start_time = str(self.startTime)[:19]
329+
start_time = str(self.startTime)
325330
duration = str(self.stopTime - self.startTime)
326-
status = []
331+
statuses = []
327332
if result.success_count:
328-
status.append('Pass %s' % result.success_count)
333+
statuses.append('Passed %s' % result.success_count)
329334
if result.skip_count:
330-
status.append('Skip %s' % result.skip_count)
335+
statuses.append('Skipped %s' % result.skip_count)
331336
if result.failure_count:
332-
status.append('Failure %s' % result.failure_count)
337+
statuses.append('Failed %s' % result.failure_count)
333338
if result.error_count:
334-
status.append('Error %s' % result.error_count)
335-
if status:
336-
status = ', '.join(status)
339+
statuses.append('Errors %s' % result.error_count)
340+
if statuses:
341+
statuses = ', '.join(statuses)
337342
else:
338-
status = 'none'
339-
return [
343+
statuses = 'None'
344+
group1 = [
340345
('Start Time', start_time),
346+
('Stop Time', str(self.stopTime)),
341347
('Duration', duration),
342-
('Status', status),
348+
('Status', statuses),
343349
]
344350

351+
return group1
352+
345353
def generate_report(self, result):
346-
report_attrs = self.get_report_attributes(result)
347354
generator = 'HTMLTestRunner %s' % __version__
348355
stylesheet = self._generate_stylesheet()
349-
heading = self._generate_heading(report_attrs)
356+
heading = self._generate_heading(result)
350357
report = self._generate_report(result)
351358
ending = self._generate_ending()
352359
output = self.HTML_TEMPLATE % dict(
353360
title=saxutils.escape(self.title),
354361
generator=generator,
355-
stylesheet=stylesheet,
356-
heading=heading,
357-
report=report,
358-
ending=ending,
362+
version=__version__,
363+
head_inserts=stylesheet,
364+
header=heading,
365+
result_table=report,
366+
footer=ending,
359367
)
360368
self.stream.write(output.encode('utf8'))
361369

362370
def _generate_stylesheet(self):
363371
return self.STYLESHEET_TEMPLATE
364372

365-
def _generate_heading(self, report_attrs):
373+
def _parse_attributes_group(self, group):
366374
attrs_list = []
367-
for attr_name, attr_value in report_attrs:
375+
for attr_name, attr_value in group:
368376
attr_line = self.HEADING_ATTRIBUTE_TEMPLATE % dict(
369377
name=saxutils.escape(attr_name),
370378
value=saxutils.escape(attr_value),
371379
)
372380
attrs_list.append(attr_line)
381+
return attrs_list
382+
383+
def _generate_heading(self, result):
384+
g1 = self.get_report_attributes(result)
385+
g2 = self.attributes['group2']
386+
g3 = self.attributes['group3']
387+
388+
pg1 = self._parse_attributes_group(g1)
389+
pg2 = self._parse_attributes_group(g2)
390+
pg3 = self._parse_attributes_group(g3)
391+
373392
heading = self.HEADING_TEMPLATE % dict(
374393
title=saxutils.escape(self.title),
375-
parameters=''.join(attrs_list),
394+
parameters_1=''.join(pg1),
395+
parameters_2=''.join(pg2),
396+
parameters_3=''.join(pg3),
376397
description=saxutils.escape(self.description),
377398
)
378399
return heading
@@ -470,13 +491,13 @@ def _generate_report_test(self, rows, class_id, test_id, n, t, output, e):
470491

471492
script = self.REPORT_TEST_OUTPUT_TEMPLATE % dict(
472493
id=test_id,
473-
output=saxutils.escape(uo + ue),
494+
output=saxutils.escape(uo.strip() + ue.strip()),
474495
)
475496
row = tmpl % dict(
476497
tid=test_id,
477498
Class=(n == 0 and 'hiddenRow' or 'none'),
478-
style=n == 2 and 'errorCase' or (
479-
n == 1 and 'failCase' or n == 3 and 'skipCase' or 'passCase'),
499+
style=n == 2 and 'bg-info' or (
500+
n == 1 and 'bg-danger' or n == 3 and 'bg-warning' or 'bg-success'),
480501
desc=desc,
481502
script=script,
482503
status=self.STATUS[n],

0 commit comments

Comments
 (0)