Skip to content

Commit b6ccc33

Browse files
authored
Review Metrics: Display improvements (#54)
Also, include iterations
1 parent e2b0d02 commit b6ccc33

2 files changed

Lines changed: 74 additions & 37 deletions

File tree

src/prs.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,8 @@ pub struct AggregatePrMetrics {
251251
pub p50_needs_review_to_complete: Option<TimeDelta>,
252252
pub p90_needs_review_to_complete: Option<TimeDelta>,
253253
pub p100_needs_review_to_complete: Option<TimeDelta>,
254+
255+
pub iteration_counts: BTreeMap<usize, usize>,
254256
}
255257

256258
impl AggregatePrMetrics {
@@ -276,6 +278,13 @@ impl AggregatePrMetrics {
276278
m.needs_review_to_complete()
277279
});
278280

281+
let mut iteration_counts = BTreeMap::new();
282+
for metric in metrics {
283+
if metric.first_complete.is_some() {
284+
*iteration_counts.entry(metric.iterations).or_default() += 1;
285+
}
286+
}
287+
279288
AggregatePrMetrics {
280289
p50_needs_review_to_first_review,
281290
p90_needs_review_to_first_review,
@@ -286,6 +295,7 @@ impl AggregatePrMetrics {
286295
p50_needs_review_to_complete,
287296
p90_needs_review_to_complete,
288297
p100_needs_review_to_complete,
298+
iteration_counts,
289299
}
290300
}
291301

templates/review-metrics.html

Lines changed: 64 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
}
1111
.stats-container {
1212
display: grid;
13-
grid-template-columns: repeat(3, 1fr);
13+
grid-template-columns: repeat(4, 1fr);
1414
gap: 40px;
1515
}
1616
.reviews-container {
@@ -22,6 +22,12 @@
2222
border: 1px black solid;
2323
padding: 5px;
2424
}
25+
.module {
26+
background-color: lightgrey;
27+
border: 1px black solid;
28+
margin-bottom: 10px;
29+
padding: 5px;
30+
}
2531
</style>
2632
</head>
2733
<body>
@@ -51,46 +57,67 @@ <h3>Needs review to complete</h3>
5157
<li>p100: {{format_duration(aggregate_metrics.p100_needs_review_to_complete)}}</li>
5258
</ul>
5359
</div>
60+
<div class="stats-card">
61+
<h3>Iterations</h3>
62+
<ul>
63+
{% for (iteration, count) in aggregate_metrics.iteration_counts %}
64+
<li>{{iteration}}: {{count}} PRs</li>
65+
{% endfor %}
66+
</ul>
67+
</div>
5468
</div>
5569

5670
{% for module in modules %}
57-
<h2>{{module.name}}</h2>
58-
<div class="stats-container">
59-
<div class="stats-card">
60-
<h3>Needs review to first review</h3>
61-
<ul>
62-
<li>p50: {{format_duration(module.aggregate_metrics.p50_needs_review_to_first_review)}}</li>
63-
<li>p90: {{format_duration(module.aggregate_metrics.p90_needs_review_to_first_review)}}</li>
64-
<li>p100: {{format_duration(module.aggregate_metrics.p100_needs_review_to_first_review)}}</li>
65-
</ul>
66-
</div>
67-
<div class="stats-card">
68-
<h3>Created to complete</h3>
69-
<ul>
70-
<li>p50: {{format_duration(module.aggregate_metrics.p50_created_to_complete)}}</li>
71-
<li>p90: {{format_duration(module.aggregate_metrics.p90_created_to_complete)}}</li>
72-
<li>p100: {{format_duration(module.aggregate_metrics.p100_created_to_complete)}}</li>
73-
</ul>
74-
</div>
75-
<div class="stats-card">
76-
<h3>Needs review to complete</h3>
77-
<ul>
78-
<li>p50: {{format_duration(module.aggregate_metrics.p50_needs_review_to_complete)}}</li>
79-
<li>p90: {{format_duration(module.aggregate_metrics.p90_needs_review_to_complete)}}</li>
80-
<li>p100: {{format_duration(module.aggregate_metrics.p100_needs_review_to_complete)}}</li>
81-
</ul>
82-
</div>
83-
</div>
84-
<div class="reviews-container">
85-
{% for pr in module.metrics %}
86-
<div class="review-card">
87-
<div><a href="{{pr.pr.url}}">{{pr.pr.repo_name}} #{{pr.pr.number}}</a></div>
88-
<div>Created to Complete: {{format_duration(&pr.created_to_complete())}}</div>
89-
<div>Needs Review to Complete: {{format_duration(&pr.needs_review_to_complete())}}</div>
90-
<div>{{pr.iterations}} iterations</div>
91-
<div>Time since created: {{format_duration(&Some(pr.time_since_created()))}}</div>
71+
<div class="module">
72+
<h2>{{module.name}}</h2>
73+
<details>
74+
<summary>Expand for details</summary>
75+
<div class="stats-container">
76+
<div class="stats-card">
77+
<h3>Needs review to first review</h3>
78+
<ul>
79+
<li>p50: {{format_duration(module.aggregate_metrics.p50_needs_review_to_first_review)}}</li>
80+
<li>p90: {{format_duration(module.aggregate_metrics.p90_needs_review_to_first_review)}}</li>
81+
<li>p100: {{format_duration(module.aggregate_metrics.p100_needs_review_to_first_review)}}</li>
82+
</ul>
83+
</div>
84+
<div class="stats-card">
85+
<h3>Created to complete</h3>
86+
<ul>
87+
<li>p50: {{format_duration(module.aggregate_metrics.p50_created_to_complete)}}</li>
88+
<li>p90: {{format_duration(module.aggregate_metrics.p90_created_to_complete)}}</li>
89+
<li>p100: {{format_duration(module.aggregate_metrics.p100_created_to_complete)}}</li>
90+
</ul>
91+
</div>
92+
<div class="stats-card">
93+
<h3>Needs review to complete</h3>
94+
<ul>
95+
<li>p50: {{format_duration(module.aggregate_metrics.p50_needs_review_to_complete)}}</li>
96+
<li>p90: {{format_duration(module.aggregate_metrics.p90_needs_review_to_complete)}}</li>
97+
<li>p100: {{format_duration(module.aggregate_metrics.p100_needs_review_to_complete)}}</li>
98+
</ul>
99+
</div>
100+
<div class="stats-card">
101+
<h3>Iterations</h3>
102+
<ul>
103+
{% for (iteration, count) in module.aggregate_metrics.iteration_counts %}
104+
<li>{{iteration}}: {{count}} PRs</li>
105+
{% endfor %}
106+
</ul>
107+
</div>
108+
</div>
109+
<div class="reviews-container">
110+
{% for pr in module.metrics %}
111+
<div class="review-card">
112+
<div><a href="{{pr.pr.url}}">{{pr.pr.repo_name}} #{{pr.pr.number}}</a></div>
113+
<div>Created to Complete: {{format_duration(&pr.created_to_complete())}}</div>
114+
<div>Needs Review to Complete: {{format_duration(&pr.needs_review_to_complete())}}</div>
115+
<div>{{pr.iterations}} iterations</div>
116+
<div>Time since created: {{format_duration(&Some(pr.time_since_created()))}}</div>
117+
</div>
118+
{% endfor %}
92119
</div>
93-
{% endfor %}
120+
</details>
94121
</div>
95122
{% endfor %}
96123
</body>

0 commit comments

Comments
 (0)