Merge lp:~jcsackett/charmworld/better-review-charting into lp:charmworld

Proposed by j.c.sackett
Status: Merged
Approved by: j.c.sackett
Approved revision: 485
Merged at revision: 486
Proposed branch: lp:~jcsackett/charmworld/better-review-charting
Merge into: lp:charmworld
Diff against target: 124 lines (+12/-33)
4 files modified
charmworld/static/sparklines.js (+1/-1)
charmworld/templates/review.pt (+0/-8)
charmworld/views/tests/test_tools.py (+3/-9)
charmworld/views/tools.py (+8/-15)
To merge this branch: bzr merge lp:~jcsackett/charmworld/better-review-charting
Reviewer Review Type Date Requested Status
Juju Gui Bot continuous-integration Approve
Brad Crittenden (community) code Approve
Review via email: mp+207255@code.launchpad.net

Commit message

Removes the min and max data from review and improves chart display.

Description of the change

This branch removes any display of min and max latency from the review queue.
The data is misleading to users, as they routinely mistake max for average,
causing communication errors between charm reviewers and charm authors.

Since min and max was added as a drive by addition, it's not necessary. The
easiest thing to do is just remove it from display. We continue to store it so
we have the data for analysis should we ever want it.

As a drive by, the d3 code to make the sparkline has been updated to make the
sparkline more legible.

To post a comment you must log in.
Revision history for this message
Brad Crittenden (bac) wrote :

Thanks Jon. Looks good.

review: Approve (code)
Revision history for this message
Juju Gui Bot (juju-gui-bot) :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'charmworld/static/sparklines.js'
--- charmworld/static/sparklines.js 2013-11-20 14:28:24 +0000
+++ charmworld/static/sparklines.js 2014-02-19 17:16:14 +0000
@@ -6,7 +6,7 @@
6 var xlimit = data.length - 1;6 var xlimit = data.length - 1;
7 var ylimit = Math.max.apply(Math, data);7 var ylimit = Math.max.apply(Math, data);
88
9 var x = d3.scale.linear().domain([0, xlimit]).range([0, 20]);9 var x = d3.scale.linear().domain([0, xlimit]).range([0, 50]);
10 var y = d3.scale.linear().domain([0, ylimit]).range([0, 10]);10 var y = d3.scale.linear().domain([0, ylimit]).range([0, 10]);
1111
12 var line = d3.svg.line().x(function(d,i) { 12 var line = d3.svg.line().x(function(d,i) {
1313
=== modified file 'charmworld/templates/review.pt'
--- charmworld/templates/review.pt 2013-11-20 14:29:00 +0000
+++ charmworld/templates/review.pt 2014-02-19 17:16:14 +0000
@@ -23,17 +23,9 @@
23 <ul class="note">23 <ul class="note">
24 <li><strong>Items:</strong> ${len(queue)}</li>24 <li><strong>Items:</strong> ${len(queue)}</li>
25 <li>25 <li>
26 <strong>Max wait time:</strong> ${max}
27 <span class="sparkline" data-values="[${sparklines['maxes']}]"></span>
28 </li>
29 <li>
30 <strong>Average wait time:</strong> ${mean}26 <strong>Average wait time:</strong> ${mean}
31 <span class="sparkline" data-values="[${sparklines['means']}]"></span>27 <span class="sparkline" data-values="[${sparklines['means']}]"></span>
32 </li>28 </li>
33 <li>
34 <strong>Min wait time:</strong> ${min}
35 <span class="sparkline" data-values="[${sparklines['mins']}]"></span>
36 </li>
37 </ul>29 </ul>
38 <p class="note">30 <p class="note">
39 <strong>Reviewers</strong>: Please read the "Reviewer Tips and Criteria"31 <strong>Reviewers</strong>: Please read the "Reviewer Tips and Criteria"
4032
=== modified file 'charmworld/views/tests/test_tools.py'
--- charmworld/views/tests/test_tools.py 2013-11-08 22:03:03 +0000
+++ charmworld/views/tests/test_tools.py 2014-02-19 17:16:14 +0000
@@ -60,22 +60,16 @@
6060
61 def test_empty_sparklines(self):61 def test_empty_sparklines(self):
62 sparklines = get_sparklines([])62 sparklines = get_sparklines([])
63 self.assertEqual('', sparklines['maxes'])
64 self.assertEqual('', sparklines['mins'])
65 self.assertEqual('', sparklines['means'])63 self.assertEqual('', sparklines['means'])
6664
67 def test_single_sparklines(self):65 def test_single_sparklines(self):
68 sparklines = get_sparklines([{'max': 1, 'min': 2, 'mean': 3}])66 sparklines = get_sparklines([{'mean': 3}])
69 self.assertEqual('1', sparklines['maxes'])
70 self.assertEqual('2', sparklines['mins'])
71 self.assertEqual('3', sparklines['means'])67 self.assertEqual('3', sparklines['means'])
7268
73 def test_sparklines(self):69 def test_sparklines(self):
74 sparklines = get_sparklines([70 sparklines = get_sparklines([
75 {'max': 1, 'min': 1, 'mean': 1},71 {'mean': 1},
76 {'max': 1, 'min': 2, 'mean': 3}])72 {'mean': 3}])
77 self.assertEqual('1,1', sparklines['maxes'])
78 self.assertEqual('1,2', sparklines['mins'])
79 self.assertEqual('1,3', sparklines['means'])73 self.assertEqual('1,3', sparklines['means'])
8074
8175
8276
=== modified file 'charmworld/views/tools.py'
--- charmworld/views/tools.py 2013-11-08 19:27:59 +0000
+++ charmworld/views/tools.py 2014-02-19 17:16:14 +0000
@@ -6,7 +6,10 @@
6import pymongo6import pymongo
7from pyramid.view import view_config7from pyramid.view import view_config
88
9from charmworld import cached_view_config, utils9from charmworld import (
10 cached_view_config,
11 utils,
12)
10from charmworld.models import (13from charmworld.models import (
11 CharmSource,14 CharmSource,
12 QADataSource,15 QADataSource,
@@ -91,18 +94,13 @@
9194
9295
93def get_sparklines(stats):96def get_sparklines(stats):
94 mins = []
95 maxes = []
96 means = []97 means = []
97 for s in stats:98 for s in stats:
98 mins.append(str(s['min']))
99 means.append(str(s['mean']))99 means.append(str(s['mean']))
100 maxes.append(str(s['max']))
101100
102 return {101 return {
103 'mins': ','.join(mins),
104 'means': ','.join(means),102 'means': ','.join(means),
105 'maxes': ','.join(maxes)}103 }
106104
107105
108@cached_view_config(106@cached_view_config(
@@ -125,20 +123,15 @@
125 sparklines = get_sparklines(stats)123 sparklines = get_sparklines(stats)
126 if stats:124 if stats:
127 current_stats = stats[0]125 current_stats = stats[0]
128 max_latency = utils.prettify_timedelta(
129 datetime.timedelta(seconds=current_stats['max']))
130 min_latency = utils.prettify_timedelta(
131 datetime.timedelta(seconds=current_stats['min']))
132 mean_latency = utils.prettify_timedelta(126 mean_latency = utils.prettify_timedelta(
133 datetime.timedelta(seconds=current_stats['mean']))127 datetime.timedelta(seconds=current_stats['mean']))
134 else:128 else:
135 max_latency = min_latency = mean_latency = 'N/A'129 mean_latency = 'N/A'
136130
137 return {131 return {
138 'queue': review_queue,132 'queue': review_queue,
139 'TYPES_WITH_DATES': TYPES_WITH_DATES,133 'TYPES_WITH_DATES': TYPES_WITH_DATES,
140 'age_format': utils.pretty_timedelta,134 'age_format': utils.pretty_timedelta,
141 'max': max_latency,
142 'mean': mean_latency,135 'mean': mean_latency,
143 'min': min_latency,136 'sparklines': sparklines,
144 'sparklines': sparklines}137 }

Subscribers

People subscribed via source and target branches

to all changes: