Skip to content

Commit 474100b

Browse files
committed
Make summary table vertical
1 parent 87d51ce commit 474100b

File tree

1 file changed

+119
-94
lines changed

1 file changed

+119
-94
lines changed

β€Žsite/src/comparison.rs

Lines changed: 119 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -479,52 +479,20 @@ pub fn write_summary_table(
479479
.unwrap_or_else(|| "N/A".to_string())
480480
}
481481

482-
let columns = [
483-
" ", // we want at least 10 spaces to accommodate "count[^1]"
484-
"Regressions 😿 <br />(primary)",
485-
"Regressions 😿 <br />(secondary)",
486-
"Improvements πŸŽ‰ <br />(primary)",
487-
"Improvements πŸŽ‰ <br />(secondary)",
488-
"All 😿 πŸŽ‰ <br />(primary)",
489-
];
490-
let counts: Vec<usize> = columns
491-
.iter()
492-
.map(|s| {
493-
// Unicode emojis usually have width equal to ~2 chars (maybe? :) ).
494-
let count = s.chars().count();
495-
if s.chars().any(|c| !c.is_whitespace()) {
496-
count + 1
497-
} else {
498-
count
499-
}
500-
})
501-
.collect();
502-
for column in &columns {
503-
write!(result, "| {} ", column).unwrap();
504-
}
505-
result.push_str("|\n");
506-
for &count in &counts {
507-
write!(result, "|:{}:", "-".repeat(count)).unwrap();
508-
}
509-
result.push_str("|\n");
510-
511-
let mut render_row = |row: Vec<String>| {
512-
debug_assert_eq!(row.len(), columns.len());
513-
for (column, &count) in row.into_iter().zip(&counts) {
514-
write!(result, "| {:<1$} ", column, count).unwrap();
515-
}
516-
result.push_str("|\n");
517-
};
518-
render_row(vec![
519-
format!("count{}", if with_footnotes { "[^1]" } else { "" }),
520-
primary.num_regressions.to_string(),
521-
secondary.num_regressions.to_string(),
522-
primary.num_improvements.to_string(),
523-
secondary.num_improvements.to_string(),
524-
(primary.num_regressions + primary.num_improvements).to_string(),
482+
// (label, mean, max, count)
483+
let mut column_data = vec![];
484+
485+
// label
486+
column_data.push(vec![
487+
"Regressions 😿 <br /> (primary)".to_string(),
488+
"Regressions 😿 <br /> (secondary)".to_string(),
489+
"Improvements πŸŽ‰ <br /> (primary)".to_string(),
490+
"Improvements πŸŽ‰ <br /> (secondary)".to_string(),
491+
"All πŸ˜ΏπŸŽ‰ (primary)".to_string(),
525492
]);
526-
render_row(vec![
527-
format!("mean{}", if with_footnotes { "[^2]" } else { "" }),
493+
494+
// mean
495+
column_data.push(vec![
528496
render_stat(primary.num_regressions, || {
529497
Some(primary.arithmetic_mean_of_regressions())
530498
}),
@@ -569,8 +537,8 @@ pub fn write_summary_table(
569537
format!("{:.1}%", change * 100.0)
570538
};
571539

572-
render_row(vec![
573-
"max".to_string(),
540+
// max
541+
column_data.push(vec![
574542
render_stat(primary.num_regressions, || {
575543
primary
576544
.largest_regression()
@@ -593,14 +561,55 @@ pub fn write_summary_table(
593561
}),
594562
largest_change,
595563
]);
564+
565+
// count
566+
column_data.push(vec![
567+
primary.num_regressions.to_string(),
568+
secondary.num_regressions.to_string(),
569+
primary.num_improvements.to_string(),
570+
secondary.num_improvements.to_string(),
571+
(primary.num_regressions + primary.num_improvements).to_string(),
572+
]);
573+
574+
let column_labels = [
575+
" ".to_string(), // we want at least 10 spaces to accommodate "count[^2]"
576+
format!("mean{}", if with_footnotes { "[^1]" } else { "" }),
577+
"max".to_string(),
578+
format!("count{}", if with_footnotes { "[^2]" } else { "" }),
579+
];
580+
let counts: Vec<usize> = column_labels.iter().map(|s| s.chars().count()).collect();
581+
for column in &column_labels {
582+
write!(result, "| {} ", column).unwrap();
583+
}
584+
result.push_str("|\n");
585+
for &count in &counts {
586+
write!(result, "|:{}:", "-".repeat(count)).unwrap();
587+
}
588+
result.push_str("|\n");
589+
590+
let mut render_row = |row: Vec<String>| {
591+
debug_assert_eq!(row.len(), column_labels.len());
592+
for (column, &count) in row.into_iter().zip(&counts) {
593+
write!(result, "| {:<1$} ", column, count).unwrap();
594+
}
595+
result.push_str("|\n");
596+
};
597+
598+
for row in 0..5 {
599+
let row_data = column_data
600+
.iter()
601+
.map(|rows| rows[row].clone())
602+
.collect::<Vec<_>>();
603+
render_row(row_data);
604+
}
596605
}
597606

598607
pub fn write_summary_table_footer(result: &mut String) {
599608
writeln!(
600609
result,
601610
r#"
602-
[^1]: *number of relevant changes*
603-
[^2]: *the arithmetic mean of the percent change*"#
611+
[^1]: *the arithmetic mean of the percent change*
612+
[^2]: *number of relevant changes*"#
604613
)
605614
.unwrap();
606615
}
@@ -1314,11 +1323,13 @@ mod tests {
13141323
(Category::Primary, 1.0, 3.0),
13151324
],
13161325
r#"
1317-
| | Regressions 😿 <br />(primary) | Regressions 😿 <br />(secondary) | Improvements πŸŽ‰ <br />(primary) | Improvements πŸŽ‰ <br />(secondary) | All 😿 πŸŽ‰ <br />(primary) |
1318-
|:----------:|:------------------------------:|:--------------------------------:|:-------------------------------:|:---------------------------------:|:------------------------:|
1319-
| count[^1] | 3 | 0 | 0 | 0 | 3 |
1320-
| mean[^2] | 146.7% | N/A | N/A | N/A | 146.7% |
1321-
| max | 200.0% | N/A | N/A | N/A | 200.0% |
1326+
| | mean[^1] | max | count[^2] |
1327+
|:----------:|:--------:|:---:|:---------:|
1328+
| Regressions 😿 <br /> (primary) | 146.7% | 200.0% | 3 |
1329+
| Regressions 😿 <br /> (secondary) | N/A | N/A | 0 |
1330+
| Improvements πŸŽ‰ <br /> (primary) | N/A | N/A | 0 |
1331+
| Improvements πŸŽ‰ <br /> (secondary) | N/A | N/A | 0 |
1332+
| All πŸ˜ΏπŸŽ‰ (primary) | 146.7% | 200.0% | 3 |
13221333
"#
13231334
.trim_start(),
13241335
);
@@ -1333,11 +1344,13 @@ mod tests {
13331344
(Category::Primary, 4.0, 1.0),
13341345
],
13351346
r#"
1336-
| | Regressions 😿 <br />(primary) | Regressions 😿 <br />(secondary) | Improvements πŸŽ‰ <br />(primary) | Improvements πŸŽ‰ <br />(secondary) | All 😿 πŸŽ‰ <br />(primary) |
1337-
|:----------:|:------------------------------:|:--------------------------------:|:-------------------------------:|:---------------------------------:|:------------------------:|
1338-
| count[^1] | 0 | 0 | 3 | 0 | 3 |
1339-
| mean[^2] | N/A | N/A | -71.7% | N/A | -71.7% |
1340-
| max | N/A | N/A | -80.0% | N/A | -80.0% |
1347+
| | mean[^1] | max | count[^2] |
1348+
|:----------:|:--------:|:---:|:---------:|
1349+
| Regressions 😿 <br /> (primary) | N/A | N/A | 0 |
1350+
| Regressions 😿 <br /> (secondary) | N/A | N/A | 0 |
1351+
| Improvements πŸŽ‰ <br /> (primary) | -71.7% | -80.0% | 3 |
1352+
| Improvements πŸŽ‰ <br /> (secondary) | N/A | N/A | 0 |
1353+
| All πŸ˜ΏπŸŽ‰ (primary) | -71.7% | -80.0% | 3 |
13411354
"#
13421355
.trim_start(),
13431356
);
@@ -1352,13 +1365,15 @@ mod tests {
13521365
(Category::Secondary, 4.0, 1.0),
13531366
],
13541367
r#"
1355-
| | Regressions 😿 <br />(primary) | Regressions 😿 <br />(secondary) | Improvements πŸŽ‰ <br />(primary) | Improvements πŸŽ‰ <br />(secondary) | All 😿 πŸŽ‰ <br />(primary) |
1356-
|:----------:|:------------------------------:|:--------------------------------:|:-------------------------------:|:---------------------------------:|:------------------------:|
1357-
| count[^1] | 0 | 0 | 0 | 3 | 0 |
1358-
| mean[^2] | N/A | N/A | N/A | -71.7% | N/A |
1359-
| max | N/A | N/A | N/A | -80.0% | N/A |
1368+
| | mean[^1] | max | count[^2] |
1369+
|:----------:|:--------:|:---:|:---------:|
1370+
| Regressions 😿 <br /> (primary) | N/A | N/A | 0 |
1371+
| Regressions 😿 <br /> (secondary) | N/A | N/A | 0 |
1372+
| Improvements πŸŽ‰ <br /> (primary) | N/A | N/A | 0 |
1373+
| Improvements πŸŽ‰ <br /> (secondary) | -71.7% | -80.0% | 3 |
1374+
| All πŸ˜ΏπŸŽ‰ (primary) | N/A | N/A | 0 |
13601375
"#
1361-
.trim_start(),
1376+
.trim_start(),
13621377
);
13631378
}
13641379

@@ -1371,13 +1386,15 @@ mod tests {
13711386
(Category::Secondary, 1.0, 3.0),
13721387
],
13731388
r#"
1374-
| | Regressions 😿 <br />(primary) | Regressions 😿 <br />(secondary) | Improvements πŸŽ‰ <br />(primary) | Improvements πŸŽ‰ <br />(secondary) | All 😿 πŸŽ‰ <br />(primary) |
1375-
|:----------:|:------------------------------:|:--------------------------------:|:-------------------------------:|:---------------------------------:|:------------------------:|
1376-
| count[^1] | 0 | 3 | 0 | 0 | 0 |
1377-
| mean[^2] | N/A | 146.7% | N/A | N/A | N/A |
1378-
| max | N/A | 200.0% | N/A | N/A | N/A |
1389+
| | mean[^1] | max | count[^2] |
1390+
|:----------:|:--------:|:---:|:---------:|
1391+
| Regressions 😿 <br /> (primary) | N/A | N/A | 0 |
1392+
| Regressions 😿 <br /> (secondary) | 146.7% | 200.0% | 3 |
1393+
| Improvements πŸŽ‰ <br /> (primary) | N/A | N/A | 0 |
1394+
| Improvements πŸŽ‰ <br /> (secondary) | N/A | N/A | 0 |
1395+
| All πŸ˜ΏπŸŽ‰ (primary) | N/A | N/A | 0 |
13791396
"#
1380-
.trim_start(),
1397+
.trim_start(),
13811398
);
13821399
}
13831400

@@ -1391,11 +1408,13 @@ mod tests {
13911408
(Category::Primary, 4.0, 1.0),
13921409
],
13931410
r#"
1394-
| | Regressions 😿 <br />(primary) | Regressions 😿 <br />(secondary) | Improvements πŸŽ‰ <br />(primary) | Improvements πŸŽ‰ <br />(secondary) | All 😿 πŸŽ‰ <br />(primary) |
1395-
|:----------:|:------------------------------:|:--------------------------------:|:-------------------------------:|:---------------------------------:|:------------------------:|
1396-
| count[^1] | 2 | 0 | 2 | 0 | 4 |
1397-
| mean[^2] | 150.0% | N/A | -62.5% | N/A | 43.8% |
1398-
| max | 200.0% | N/A | -75.0% | N/A | 200.0% |
1411+
| | mean[^1] | max | count[^2] |
1412+
|:----------:|:--------:|:---:|:---------:|
1413+
| Regressions 😿 <br /> (primary) | 150.0% | 200.0% | 2 |
1414+
| Regressions 😿 <br /> (secondary) | N/A | N/A | 0 |
1415+
| Improvements πŸŽ‰ <br /> (primary) | -62.5% | -75.0% | 2 |
1416+
| Improvements πŸŽ‰ <br /> (secondary) | N/A | N/A | 0 |
1417+
| All πŸ˜ΏπŸŽ‰ (primary) | 43.8% | 200.0% | 4 |
13991418
"#
14001419
.trim_start(),
14011420
);
@@ -1413,13 +1432,15 @@ mod tests {
14131432
(Category::Primary, 4.0, 1.0),
14141433
],
14151434
r#"
1416-
| | Regressions 😿 <br />(primary) | Regressions 😿 <br />(secondary) | Improvements πŸŽ‰ <br />(primary) | Improvements πŸŽ‰ <br />(secondary) | All 😿 πŸŽ‰ <br />(primary) |
1417-
|:----------:|:------------------------------:|:--------------------------------:|:-------------------------------:|:---------------------------------:|:------------------------:|
1418-
| count[^1] | 2 | 1 | 2 | 1 | 4 |
1419-
| mean[^2] | 150.0% | 100.0% | -62.5% | -66.7% | 43.8% |
1420-
| max | 200.0% | 100.0% | -75.0% | -66.7% | 200.0% |
1435+
| | mean[^1] | max | count[^2] |
1436+
|:----------:|:--------:|:---:|:---------:|
1437+
| Regressions 😿 <br /> (primary) | 150.0% | 200.0% | 2 |
1438+
| Regressions 😿 <br /> (secondary) | 100.0% | 100.0% | 1 |
1439+
| Improvements πŸŽ‰ <br /> (primary) | -62.5% | -75.0% | 2 |
1440+
| Improvements πŸŽ‰ <br /> (secondary) | -66.7% | -66.7% | 1 |
1441+
| All πŸ˜ΏπŸŽ‰ (primary) | 43.8% | 200.0% | 4 |
14211442
"#
1422-
.trim_start(),
1443+
.trim_start(),
14231444
);
14241445
}
14251446

@@ -1431,13 +1452,15 @@ mod tests {
14311452
(Category::Primary, 5.0, 6.0),
14321453
],
14331454
r#"
1434-
| | Regressions 😿 <br />(primary) | Regressions 😿 <br />(secondary) | Improvements πŸŽ‰ <br />(primary) | Improvements πŸŽ‰ <br />(secondary) | All 😿 πŸŽ‰ <br />(primary) |
1435-
|:----------:|:------------------------------:|:--------------------------------:|:-------------------------------:|:---------------------------------:|:------------------------:|
1436-
| count[^1] | 1 | 0 | 1 | 0 | 2 |
1437-
| mean[^2] | 20.0% | N/A | -50.0% | N/A | -15.0% |
1438-
| max | 20.0% | N/A | -50.0% | N/A | -50.0% |
1455+
| | mean[^1] | max | count[^2] |
1456+
|:----------:|:--------:|:---:|:---------:|
1457+
| Regressions 😿 <br /> (primary) | 20.0% | 20.0% | 1 |
1458+
| Regressions 😿 <br /> (secondary) | N/A | N/A | 0 |
1459+
| Improvements πŸŽ‰ <br /> (primary) | -50.0% | -50.0% | 1 |
1460+
| Improvements πŸŽ‰ <br /> (secondary) | N/A | N/A | 0 |
1461+
| All πŸ˜ΏπŸŽ‰ (primary) | -15.0% | -50.0% | 2 |
14391462
"#
1440-
.trim_start(),
1463+
.trim_start(),
14411464
);
14421465
}
14431466

@@ -1449,13 +1472,15 @@ mod tests {
14491472
(Category::Primary, 6.0, 5.0),
14501473
],
14511474
r#"
1452-
| | Regressions 😿 <br />(primary) | Regressions 😿 <br />(secondary) | Improvements πŸŽ‰ <br />(primary) | Improvements πŸŽ‰ <br />(secondary) | All 😿 πŸŽ‰ <br />(primary) |
1453-
|:----------:|:------------------------------:|:--------------------------------:|:-------------------------------:|:---------------------------------:|:------------------------:|
1454-
| count[^1] | 1 | 0 | 1 | 0 | 2 |
1455-
| mean[^2] | 100.0% | N/A | -16.7% | N/A | 41.7% |
1456-
| max | 100.0% | N/A | -16.7% | N/A | 100.0% |
1475+
| | mean[^1] | max | count[^2] |
1476+
|:----------:|:--------:|:---:|:---------:|
1477+
| Regressions 😿 <br /> (primary) | 100.0% | 100.0% | 1 |
1478+
| Regressions 😿 <br /> (secondary) | N/A | N/A | 0 |
1479+
| Improvements πŸŽ‰ <br /> (primary) | -16.7% | -16.7% | 1 |
1480+
| Improvements πŸŽ‰ <br /> (secondary) | N/A | N/A | 0 |
1481+
| All πŸ˜ΏπŸŽ‰ (primary) | 41.7% | 100.0% | 2 |
14571482
"#
1458-
.trim_start(),
1483+
.trim_start(),
14591484
);
14601485
}
14611486

0 commit comments

Comments
Β (0)