@@ -479,52 +479,20 @@ pub fn write_summary_table(
479
479
. unwrap_or_else ( || "N/A" . to_string ( ) )
480
480
}
481
481
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( ) ,
525
492
] ) ;
526
- render_row ( vec ! [
527
- format!( "mean{}" , if with_footnotes { "[^2]" } else { "" } ) ,
493
+
494
+ // mean
495
+ column_data. push ( vec ! [
528
496
render_stat( primary. num_regressions, || {
529
497
Some ( primary. arithmetic_mean_of_regressions( ) )
530
498
} ) ,
@@ -569,8 +537,8 @@ pub fn write_summary_table(
569
537
format ! ( "{:.1}%" , change * 100.0 )
570
538
} ;
571
539
572
- render_row ( vec ! [
573
- "max" . to_string ( ) ,
540
+ // max
541
+ column_data . push ( vec ! [
574
542
render_stat( primary. num_regressions, || {
575
543
primary
576
544
. largest_regression( )
@@ -593,14 +561,55 @@ pub fn write_summary_table(
593
561
} ) ,
594
562
largest_change,
595
563
] ) ;
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
+ }
596
605
}
597
606
598
607
pub fn write_summary_table_footer ( result : & mut String ) {
599
608
writeln ! (
600
609
result,
601
610
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 *"#
604
613
)
605
614
. unwrap ( ) ;
606
615
}
@@ -1314,11 +1323,13 @@ mod tests {
1314
1323
( Category :: Primary , 1.0 , 3.0 ) ,
1315
1324
] ,
1316
1325
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 |
1322
1333
"#
1323
1334
. trim_start ( ) ,
1324
1335
) ;
@@ -1333,11 +1344,13 @@ mod tests {
1333
1344
( Category :: Primary , 4.0 , 1.0 ) ,
1334
1345
] ,
1335
1346
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 |
1341
1354
"#
1342
1355
. trim_start ( ) ,
1343
1356
) ;
@@ -1352,13 +1365,15 @@ mod tests {
1352
1365
( Category :: Secondary , 4.0 , 1.0 ) ,
1353
1366
] ,
1354
1367
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 |
1360
1375
"#
1361
- . trim_start ( ) ,
1376
+ . trim_start ( ) ,
1362
1377
) ;
1363
1378
}
1364
1379
@@ -1371,13 +1386,15 @@ mod tests {
1371
1386
( Category :: Secondary , 1.0 , 3.0 ) ,
1372
1387
] ,
1373
1388
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 |
1379
1396
"#
1380
- . trim_start ( ) ,
1397
+ . trim_start ( ) ,
1381
1398
) ;
1382
1399
}
1383
1400
@@ -1391,11 +1408,13 @@ mod tests {
1391
1408
( Category :: Primary , 4.0 , 1.0 ) ,
1392
1409
] ,
1393
1410
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 |
1399
1418
"#
1400
1419
. trim_start ( ) ,
1401
1420
) ;
@@ -1413,13 +1432,15 @@ mod tests {
1413
1432
( Category :: Primary , 4.0 , 1.0 ) ,
1414
1433
] ,
1415
1434
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 |
1421
1442
"#
1422
- . trim_start ( ) ,
1443
+ . trim_start ( ) ,
1423
1444
) ;
1424
1445
}
1425
1446
@@ -1431,13 +1452,15 @@ mod tests {
1431
1452
( Category :: Primary , 5.0 , 6.0 ) ,
1432
1453
] ,
1433
1454
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 |
1439
1462
"#
1440
- . trim_start ( ) ,
1463
+ . trim_start ( ) ,
1441
1464
) ;
1442
1465
}
1443
1466
@@ -1449,13 +1472,15 @@ mod tests {
1449
1472
( Category :: Primary , 6.0 , 5.0 ) ,
1450
1473
] ,
1451
1474
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 |
1457
1482
"#
1458
- . trim_start ( ) ,
1483
+ . trim_start ( ) ,
1459
1484
) ;
1460
1485
}
1461
1486
0 commit comments