fixed charts
diff --git a/charts.py b/charts.py
index d8fb73d..000a561 100644
--- a/charts.py
+++ b/charts.py
@@ -3,7 +3,7 @@
from GChartWrapper import constants
-COLORS = ["red", "orange", "yellow", "green", "blue", "indigo", "violet"]
+COLORS = ["1569C7", "81D8D0", "307D7E", "5CB3FF", "blue", "indigo"]
constants.MARKERS += 'E' # append E marker to available markers
@@ -61,9 +61,10 @@
bar.axes.type('xy')
if scale_x:
bar.axes.label(0, *scale_x)
- scale_y = scale_y or range(int(max([max(l) for l in values]) + 2))
- bar.axes.range(1, *scale_y)
+ max_value = (max([max(l) for l in values + deviations]))
+ bar.axes.range(1, 0, max_value)
+ bar.scale(0, max_value)
bar.bar('r', '.1', '1')
for i in range(len(legend)):
bar.marker('E', '000000', '%s:%s' % ((len(values) + i*2), i),
@@ -72,14 +73,20 @@
bar.color(*COLORS[:len(values)])
bar.size(width, height)
- return str(bar)
+ return bar
-def render_lines():
- line = Line([])
- line.dataset([[1,2,3], [3,2,1], [5,6,7]])
- scale_y = range(int(max([max(l) for l in
- [[1,2,3], [3,2,1], [5,6,7]]]) + 2))
- line.axes.range(1, *scale_y)
- # G.legend('Animals','Vegetables','Minerals')
- # G.axes('y')
+def render_lines(title, legend, dataset, scale_x, width=700, height=400):
+ line = Line([], encoding="text")
+ line.title(title)
+ line.dataset(dataset)
+
+ line.axes('xy')
+ max_value = (max([max(l) for l in dataset]))
+ line.axes.range(1, 0, max_value)
+ line.scale(0, max_value)
+ line.axes.label(0, *scale_x)
+ line.legend(*legend)
+ line.color(*COLORS[:len(legend)])
+ line.size(width, height)
+ return str(line)
diff --git a/report.py b/report.py
index dff1ed1..c36a87e 100644
--- a/report.py
+++ b/report.py
@@ -6,6 +6,23 @@
import storage_api
+def ssize_to_kb(ssize):
+ try:
+ smap = dict(k=1, K=1, M=1024, m=1024, G=1024**2, g=1024**2)
+ for ext, coef in smap.items():
+ if ssize.endswith(ext):
+ return int(ssize[:-1]) * coef
+
+ if int(ssize) % 1024 != 0:
+ raise ValueError()
+
+ return int(ssize) / 1024
+
+ except (ValueError, TypeError, AttributeError):
+ tmpl = "Unknow size format {0!r} (or size not multiples 1024)"
+ raise ValueError(tmpl.format(ssize))
+
+
def parse_args(argv):
parser = argparse.ArgumentParser()
parser.add_argument('-s', '--storage', help='storage location', dest="url")
@@ -16,15 +33,12 @@
return parser.parse_args(argv)
-def report(url, email=None, password=None):
- storage = storage_api.create_storage(url, email, password)
- results = storage.recent_builds()
-
+def build_vertical_bar(results):
data = {}
+ charts_url = []
- # render vertical bar
for build, results in results.items():
- for key, value in results.items():
+ for key, value in results.results.items():
keys = key.split(' ')
if not data.get(keys[2]):
data[keys[2]] = {}
@@ -47,7 +61,60 @@
bar = charts.render_vertical_bar(title, legend, dataset,
scale_x=scale_x)
- print "Vertical bar for %s:\n %s" % (name, str(bar))
+ charts_url.append(str(bar))
+ return charts_url
+
+
+def build_lines_chart(results):
+ data = {}
+ charts_url = []
+
+ for build, results in results.items():
+ for key, value in results.results.items():
+ keys = key.split(' ')
+ if not data.get(' '.join([keys[0], keys[1]])):
+ data[' '.join([keys[0], keys[1]])] = {}
+ if not data[' '.join([keys[0], keys[1]])].get(build):
+ data[' '.join([keys[0], keys[1]])][build] = {}
+ data[' '.join([keys[0], keys[1]])][build][keys[2]] = value
+
+ for name, value in data.items():
+ title = name
+ legend = []
+ dataset = []
+ scale_x = []
+ for build_id, build_results in value.items():
+ legend.append(build_id)
+ ordered_build_results = OrderedDict(sorted(build_results.items(),
+ key=lambda t: ssize_to_kb(t[0])))
+ if not scale_x:
+ scale_x = ordered_build_results.keys()
+ dataset.append(zip(*ordered_build_results.values())[0])
+
+ chart = charts.render_lines(title, legend, dataset, scale_x)
+ charts_url.append(str(chart))
+
+ return charts_url
+
+
+def render_html(charts_urls):
+ templ = open("report.html", 'r').read()
+ body = "<div><ol>%s</ol></div>"
+ li = "<li><img src='%s'></li>"
+ ol = []
+ for chart in charts_urls:
+ ol.append(li % chart)
+ html = templ % {'body': body % '\n'.join(ol)}
+ open('results.html', 'w').write(html)
+
+
+def report(url, email=None, password=None):
+ storage = storage_api.create_storage(url, email, password)
+ results = storage.recent_builds()
+ bars = build_vertical_bar(results)
+ lines = build_lines_chart(results)
+
+ render_html(bars + lines)
def main(argv):