make_graphs.py   [plain text]


#!/usr/bin/python

import sys
import commands
import re
from xml.dom import minidom
from BeautifulSoup import BeautifulSoup
import make_graph

class exception:
	pass
 
res_div_re = re.compile('(.*?)_res_div')
settings_div_re = re.compile('(.*?)_settings_div')	


gray_border_div_str = '<div style = "border-style: dotted; border-width: 1px; border-color: lightgray">'
space_div_str = '<div style = "width: 100%; height: 20px">'



def logical_build_from_build(build):
	if build == 'gcc':
		return 'g++'
	if build == 'msvc':
		return 'msvc++'
	if build == 'local':
		return 'local'
	sys.stderr.write(build)
	raise exception
 
 
def img_title_from_origs(label, title, base_build_ref, build_name, logical_build_name):
	title = title.replace('_tt_', '<tt>')
	title = title.replace('_455tt_', '</tt>')
	title = title.replace('_b_', '<b>')
	title = title.replace('_455b_', '</b>')
	title = title.replace('_456', ',')
	title = title.replace('_457', '[]')
	title = title.replace('_', ' ')
	return '%s: %s - <a href = "%s_performance_tests.html#%s">%s</a>' % (
		label, 
		title, 
		base_build_ref, 
		build_name,
		logical_build_name)


def make_png(src_dir, doc_dir, res_dir, tests_info_xml_f_name, build_name, test_name):
	cmd_str = '%s/scripts/make_graph.py %s %s %s %s %s' % (
		src_dir, doc_dir,
		res_dir, 
		tests_info_xml_f_name, 
		test_name, 
		build_name)
	# Must start a new process for pychart - otherwise pngs overlap.
	so = commands.getstatusoutput(cmd_str)	
	if(so[0] != 0):
		sys.stderr.write(cmd_str + '\n')		
		sys.stderr.write(so[1] + '\n')		
		sys.exit(-1)	


def make_png_str(label, test_name, build):
	ret = '<h6 class="c1">'
	ret += '<a name="%s" id= "%s">' % (label, label)
	ret += '<img src="%s" ' % (test_name + '_' + build + '.png')
	ret += 'alt="no image" />' 
	ret += '</a></h6>'	
	return ret

def process_html(html_f_name, src_dir, build_dir, htmls_xml_f_name, tests_info_xml_f_name, build_name, compiler_name):
	doc_dir = src_dir + "/docs/html/ext/pb_ds"
	res_dir = build_dir 
	html_f = open(doc_dir + '/' + html_f_name)	
	soup = BeautifulSoup(html_f.read())			
	html_f.close()	
	platform_comp_re = re.compile('platform_comp_%s' % build_name)					
	for d in soup('div'):
		try:
			settings_m = settings_div_re.match(d['id']) 
			res_m = res_div_re.match(d['id']) 
		except:
			settings_m = None
			res_m = None
			
		if settings_m:
			build = settings_m.groups()[0]			
			if build == build_name:
				logical_build_name = logical_build_from_build(build)
				info = gray_border_div_str
				info += '<h3><a name = "%s"><u>%s</u></a></h3>' % (build, logical_build_name)
				info += make_graph.comp_platform_info(compiler_name)
				info += '</div>%s</div>' % space_div_str
				d.contents = info
		elif res_m:
			label = res_m.groups()[0]
			d = d.divTag
			
			build = d['id'].replace('%s_' % label, '')
			
			if build == build_name:
				logical_build_name = logical_build_from_build(build)
				d = d.divTag
				test_name = d['id'].replace('%s_' % label, '')
				d = d.divTag
				base_build_ref = d['id'].replace('%s_' % label, '')
				d = d.divTag
				title = d['id'].replace('%s_' % label, '')
				img_title = img_title_from_origs(label, title, base_build_ref, build, logical_build_name)
					
				make_png(src_dir, doc_dir, res_dir, tests_info_xml_f_name, build_name, test_name)
				png_str = make_png_str(label, test_name, build)
				content = gray_border_div_str
				content += png_str
				content += img_title
#				content += make_graph.legend(doc_dir, res_dir, tests_info_xml_f_name, test_name, build_name)
				content += '</div>%s</div>' % space_div_str
				d.contents = content
								
	return soup
			
 
  
if __name__ == "__main__":
	"""
	Doc dir
	This module takes 6 parameters from the command line:
	Source directory
	Build directory
	HTMLs XML file name
	Tests info XML file name
	Build name
	Compiler name
	"""
	
	usg = "make_graph.py <src_dir> <build_dir> <htmls_xml_f_name> <tests_info_xml_f_name> <build_name> <compiler_name>\n"
		
	if len(sys.argv) != 7:
		sys.stderr.write(usg)
		raise exception
	
	src_dir = sys.argv[1]
	build_dir = sys.argv[2]
	htmls_xml_f_name = sys.argv[3]
	tests_info_xml_f_name = sys.argv[4]
	build_name = sys.argv[5]
	compiler_name = sys.argv[6]
	doc_dir = src_dir + "/docs/html/ext/pb_ds"
	htmls_dat = minidom.parse(htmls_xml_f_name)
	for html in htmls_dat.getElementsByTagName('html'):
		html_f_name = html.attributes['name'].value
		
		new_soup = process_html(html_f_name, src_dir, build_dir, htmls_xml_f_name, tests_info_xml_f_name, build_name, compiler_name)
		
		html_f = open(doc_dir + '/' + html_f_name, 'w')
		html_f.write(str(new_soup))
		html_f.close()