[Piglit] [PATCH 05/12] piglit-summary-py: Use the new summary class to generate HTML

Dylan Baker baker.dylan.c at gmail.com
Thu May 9 23:09:19 PDT 2013


Drops almost all of the code used in this file, all of that
functionality is now handled in the summary class. Instead, the majority
of this file is just the argparse instance, and a few short lines
calling the new summary class.

Signed-off-by: Dylan Baker <baker.dylan.c at gmail.com>
---
 piglit-summary-html.py | 307 +++++++------------------------------------------
 1 file changed, 42 insertions(+), 265 deletions(-)

diff --git a/piglit-summary-html.py b/piglit-summary-html.py
index 24dd302..2e1978c 100755
--- a/piglit-summary-html.py
+++ b/piglit-summary-html.py
@@ -22,277 +22,54 @@
 # DEALINGS IN THE SOFTWARE.
 
 import argparse
-import cgi
-import os, os.path
 import sys
+import shutil
+import os.path as path
 
-sys.path.append(os.path.dirname(os.path.realpath(sys.argv[0])))
-import framework.core as core
-import framework.summary
+import framework.summary as summary
+from framework.core import checkDir
 
+sys.path.append(path.dirname(path.realpath(sys.argv[0])))
 
-#############################################################################
-##### Auxiliary functions
-#############################################################################
-
-def testPathToHtmlFilename(path):
-	return 'test_' + filter(lambda s: s.isalnum() or s == '_', path.replace('/', '__')) + '.html'
-
-
-#############################################################################
-##### HTML output
-#############################################################################
-
-def readfile(filename):
-	f = open(filename, "r")
-	s = f.read()
-	f.close()
-	return s
-
-def writefile(filename, text):
-	f = open(filename, "w")
-	f.write(text.encode('utf-8'))
-	f.close()
-
-templatedir = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'templates')
-Result = readfile(os.path.join(templatedir, 'result.html'))
-ResultDetail = readfile(os.path.join(templatedir, 'result_detail.html'))
-ResultList = readfile(os.path.join(templatedir, 'result_list.html'))
-ResultListItem = readfile(os.path.join(templatedir, 'result_listitem.html'))
-ResultMString = readfile(os.path.join(templatedir, 'result_mstring.html'))
-
-Index = readfile(os.path.join(templatedir, 'index.html'))
-IndexTestrunB = readfile(os.path.join(templatedir, 'index_testrunb.html'))
-IndexTestrunBHref = readfile(os.path.join(templatedir, 'index_testrunb_href.html'))
-IndexGroup = readfile(os.path.join(templatedir, 'index_group.html'))
-IndexGroupTestrun = readfile(os.path.join(templatedir, 'index_group_testrun.html'))
-IndexTest = readfile(os.path.join(templatedir, 'index_test.html'))
-IndexTestTestrun = readfile(os.path.join(templatedir, 'index_test_testrun.html'))
-
-Testrun = readfile(os.path.join(templatedir, 'testrun.html'))
-
-SummaryPages = {
-	'all': 'index.html',
-	'changes': 'changes.html',
-	'problems': 'problems.html',
-	'regressions': 'regressions.html',
-	'fixes': 'fixes.html',
-	'skipped': 'skipped.html'
-}
-
-def buildResultListItem(detail):
-	return ResultListItem % { 'detail': buildDetailValue(detail) }
-
-def buildDetailValue(detail):
-	if type(detail) == list:
-		items = map(buildResultListItem, detail)
-		return ResultList % { 'items': "".join(items) }
-
-	elif isinstance(detail, basestring):
-		return ResultMString % { 'detail': cgi.escape(detail) }
-
-	return cgi.escape(str(detail))
-
-
-def buildDetails(testResult):
-	details = []
-	for name in testResult:
-		assert(isinstance(name, basestring))
-
-		if name == 'result':
-			continue
-
-		value = buildDetailValue(testResult[name])
-		details += [(name, value)]
-
-	details.sort(lambda a, b: len(a[1])-len(b[1]))
-
-	text = ''
-	for name, value in details:
-		text += ResultDetail % locals()
-
-	return text
-
-
-def writeResultHtml(test, testResult, filename):
-	path = test.path
-	name = test.name
-	status = testResult.status
-
-	if 'result' in testResult:
-		result = testResult['result']
-	else:
-		result = '?'
-
-	details = buildDetails(testResult)
-
-	writefile(filename, Result % locals())
-
-def writeTestrunHtml(testrun, filename):
-	detail_keys = [
-		key
-		for key in testrun.__dict__.keys()
-		if key in testrun.serialized_keys
-		if key != 'tests'
-		]
-	detaildict = dict([(k, testrun.__dict__[k]) for k in detail_keys])
-	details = buildDetails(detaildict)
-	name = testrun.name
-	codename = testrun.codename
-
-	writefile(filename, Testrun % locals())
-
-def hrefFromParts(codename, path):
-	outStr = codename + '/' + testPathToHtmlFilename(path)
-	if outStr[0] == '/':
-		outStr = outStr[1:]
-	return outStr
-
-def buildTestSummary(indent, testsummary):
-	path = testsummary.path
-	name = cgi.escape(testsummary.name)
-	testruns = "".join([IndexTestTestrun % {
-		'status': result.status,
-		'link': hrefFromParts(result.testrun.codename, path)
-	} for result in testsummary.results])
-
-	return IndexTest % locals()
-
-
-def buildGroupSummaryTestrun(groupresult):
-	passnr = groupresult.passvector.passnr
-	warnnr = groupresult.passvector.warnnr
-	failnr = groupresult.passvector.failnr
-	skipnr = groupresult.passvector.skipnr
-	crashnr = groupresult.passvector.crashnr
-	totalnr = passnr + warnnr + failnr + crashnr # do not count skips
-
-	if crashnr > 0:
-		status = 'crash'
-	elif failnr > 0:
-		status = 'fail'
-	elif warnnr > 0:
-		status = 'warn'
-	elif passnr > 0:
-		status = 'pass'
-	else:
-		status = 'skip'
-
-	return IndexGroupTestrun % locals()
-
-
-def buildGroupSummary(indent, groupsummary, showcurrent):
-	indent_inc = 1.75 # em
-	items = ''
-	path = groupsummary.path
-	name = groupsummary.name
-	names = groupsummary.children.keys()
-
-	if showcurrent == 'changes':
-		names = filter(lambda n: groupsummary.children[n].changes, names)
-	elif showcurrent == 'problems':
-		names = filter(lambda n: groupsummary.children[n].problems, names)
-	elif showcurrent == 'regressions':
-		names = filter(lambda n: groupsummary.children[n].regressions, names)
-	elif showcurrent == 'fixes':
-		names = filter(lambda n: groupsummary.children[n].fixes, names)
-	elif showcurrent == 'skipped':
-		names = filter(lambda n: groupsummary.children[n].skipped, names)
-
-	names.sort()
-	for n in names:
-		child = groupsummary.children[n]
-		if isinstance(child, framework.summary.GroupSummary):
-			items = items + buildGroupSummary(indent + indent_inc, child, showcurrent)
-		else:
-			items = items + buildTestSummary(indent + indent_inc, child)
-
-	testruns = "".join([buildGroupSummaryTestrun(result)
-			for result in groupsummary.results])
-
-	return IndexGroup % locals()
-
-
-def writeSummaryHtml(summary, summaryDir, showcurrent):
-	"""\
-results is an array containing the top-level results dictionarys.
-"""
-	def link(to):
-		if to == showcurrent:
-			return to
-		else:
-			page = SummaryPages[to]
-			return '<a href="%(page)s">%(to)s</a>' % locals()
-
-	def testrunb(tr):
-		if 'href' in tr.__dict__:
-			return IndexTestrunBHref % tr.__dict__
-		else:
-			return IndexTestrunB % tr.__dict__
-
-	group = buildGroupSummary(0, summary.root, showcurrent)
-	testruns = '<col/>' * len(summary.testruns)
-	testrunsb = "".join([testrunb(tr) for tr in summary.testruns])
-
-	tolist = SummaryPages.keys()
-	tolist.sort()
-	showlinks = " | ".join([link(to) for to in tolist])
-
-	writefile(summaryDir + '/' + SummaryPages[showcurrent], Index % locals())
-
-
-#############################################################################
-##### Main program
-#############################################################################
 def parse_listfile(filename):
-	file = open(filename, "r")
-	code = "".join([s for s in file])
-	file.close()
-	return eval(code)
+    file = open(filename, "r")
+    code = "".join([s for s in file])
+    file.close()
+    return eval(code)
 
-def main():
-	parser = argparse.ArgumentParser()
-	parser.add_argument("-o", "--overwrite",
-						action  = "store_true",
-						help    = "Overwrite existing directories")
-	parser.add_argument("-l", "--list",
-						action  = "store",
-						help    = "Use test results from a list file")
-	parser.add_argument("summaryDir",
-						metavar = "<Summary Directory>",
-						help    = "Directory to put HTML files in")
-	parser.add_argument("resultsFiles",
-						metavar = "<Results Files>",
-						nargs   = "+",
-						help    = "Results files to include in HTML")
-	args = parser.parse_args()
-
-	core.checkDir(args.summaryDir, not args.overwrite)
-
-	results = []
-	for result_dir in args.resultsFiles:
-		results.append(core.loadTestResults(result_dir))
-
-	summary = framework.summary.Summary(results)
-	for j in range(len(summary.testruns)):
-		tr = summary.testruns[j]
-		tr.codename = filter(lambda s: s.isalnum(), tr.name)
-		dirname = args.summaryDir + '/' + tr.codename
-		core.checkDir(dirname, False)
-		writeTestrunHtml(tr, dirname + '/index.html')
-		for test in summary.allTests():
-			filename = dirname + '/' + testPathToHtmlFilename(test.path)
-			writeResultHtml(test, test.results[j], filename)
-
-	writefile(os.path.join(args.summaryDir, 'result.css'), readfile(os.path.join(templatedir, 'result.css')))
-	writefile(os.path.join(args.summaryDir, 'index.css'), readfile(os.path.join(templatedir, 'index.css')))
-	writeSummaryHtml(summary, args.summaryDir, 'all')
-	writeSummaryHtml(summary, args.summaryDir, 'problems')
-	writeSummaryHtml(summary, args.summaryDir, 'changes')
-	writeSummaryHtml(summary, args.summaryDir, 'regressions')
-	writeSummaryHtml(summary, args.summaryDir, 'fixes')
-	writeSummaryHtml(summary, args.summaryDir, 'skipped')
 
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument("-o", "--overwrite",
+                        action  = "store_true",
+                        help    = "Overwrite existing directories")
+    parser.add_argument("-l", "--list",
+                        action  = "store",
+                        help    = "Use test results from a list file")
+    parser.add_argument("summaryDir",
+                        metavar = "<Summary Directory>",
+                        help    = "Directory to put HTML files in")
+    parser.add_argument("resultsFiles",
+                        metavar = "<Results Files>",
+                        nargs   = "+",
+                        help    = "Results files to include in HTML")
+    args = parser.parse_args()
+
+
+    # if overwrite is requested delete the output directory
+    if path.exists(args.summaryDir) and args.overwrite:
+        shutil.rmtree(args.summaryDir)
+
+    # If the requested directory doesn't exist, create it or throw an error
+    checkDir(args.summaryDir, not args.overwrite)
+
+    # Add the the contents of the list files to the hand assigned results
+    if args.list:
+        args.resultsFiles.extend(args.list)
+
+    # Create the HTML output
+    output = summary.NewSummary(args.resultsFiles)
+    output.generateHTML(args.summaryDir)
 
 if __name__ == "__main__":
-	main()
+    main()
-- 
1.8.1.4



More information about the Piglit mailing list