@@ -411,47 +411,70 @@ pub fn write_summary_table(
411
411
. unwrap_or_else ( || "N/A" . to_string ( ) )
412
412
}
413
413
414
- writeln ! (
415
- result,
416
- r#"| | Regressions πΏ <br />(primary) | Regressions πΏ <br />(secondary) | Improvements π <br />(primary) | Improvements π <br />(secondary) | All πΏ π <br />(primary) |
417
- |:---:|:---:|:---:|:---:|:---:|:---:|"#
418
- )
419
- . unwrap ( ) ;
420
- writeln ! (
421
- result,
422
- "| count{} | {} | {} | {} | {} | {} |" ,
423
- if with_footnotes { "[^1]" } else { "" } ,
424
- primary. num_regressions,
425
- secondary. num_regressions,
426
- primary. num_improvements,
427
- secondary. num_improvements,
428
- primary. num_regressions + primary. num_improvements
429
- )
430
- . unwrap ( ) ;
431
-
432
- writeln ! (
433
- result,
434
- "| mean{} | {} | {} | {} | {} | {} |" ,
435
- if with_footnotes { "[^2]" } else { "" } ,
436
- render_stat( primary. num_regressions, || Some (
437
- primary. arithmetic_mean_of_regressions( )
438
- ) ) ,
439
- render_stat( secondary. num_regressions, || Some (
440
- secondary. arithmetic_mean_of_regressions( )
441
- ) ) ,
442
- render_stat( primary. num_improvements, || Some (
443
- primary. arithmetic_mean_of_improvements( )
444
- ) ) ,
445
- render_stat( secondary. num_improvements, || Some (
446
- secondary. arithmetic_mean_of_improvements( )
447
- ) ) ,
414
+ let columns = [
415
+ " " , // we want at least 10 spaces to accommodate "count[^1]"
416
+ "Regressions πΏ <br />(primary)" ,
417
+ "Regressions πΏ <br />(secondary)" ,
418
+ "Improvements π <br />(primary)" ,
419
+ "Improvements π <br />(secondary)" ,
420
+ "All πΏ π <br />(primary)" ,
421
+ ] ;
422
+ let counts: Vec < usize > = columns
423
+ . iter ( )
424
+ . map ( |s| {
425
+ // Unicode emojis usually have width equal to ~2 chars (maybe? :) ).
426
+ let count = s. chars ( ) . count ( ) ;
427
+ if s. chars ( ) . any ( |c| !c. is_whitespace ( ) ) {
428
+ count + 1
429
+ } else {
430
+ count
431
+ }
432
+ } )
433
+ . collect ( ) ;
434
+ for column in & columns {
435
+ write ! ( result, "| {} " , column) . unwrap ( ) ;
436
+ }
437
+ result. push_str ( "|\n " ) ;
438
+ for & count in & counts {
439
+ write ! ( result, "|:{}:" , "-" . repeat( count) ) . unwrap ( ) ;
440
+ }
441
+ result. push_str ( "|\n " ) ;
442
+
443
+ let mut render_row = |row : Vec < String > | {
444
+ assert_eq ! ( row. len( ) , columns. len( ) ) ;
445
+ for ( column, & count) in row. into_iter ( ) . zip ( & counts) {
446
+ write ! ( result, "| {:<1$} " , column, count) . unwrap ( ) ;
447
+ }
448
+ result. push_str ( "|\n " ) ;
449
+ } ;
450
+ render_row ( vec ! [
451
+ format!( "count{}" , if with_footnotes { "[^1]" } else { "" } ) ,
452
+ primary. num_regressions. to_string( ) ,
453
+ secondary. num_regressions. to_string( ) ,
454
+ primary. num_improvements. to_string( ) ,
455
+ secondary. num_improvements. to_string( ) ,
456
+ ( primary. num_regressions + primary. num_improvements) . to_string( ) ,
457
+ ] ) ;
458
+ render_row ( vec ! [
459
+ format!( "mean{}" , if with_footnotes { "[^2]" } else { "" } ) ,
460
+ render_stat( primary. num_regressions, || {
461
+ Some ( primary. arithmetic_mean_of_regressions( ) )
462
+ } ) ,
463
+ render_stat( secondary. num_regressions, || {
464
+ Some ( secondary. arithmetic_mean_of_regressions( ) )
465
+ } ) ,
466
+ render_stat( primary. num_improvements, || {
467
+ Some ( primary. arithmetic_mean_of_improvements( ) )
468
+ } ) ,
469
+ render_stat( secondary. num_improvements, || {
470
+ Some ( secondary. arithmetic_mean_of_improvements( ) )
471
+ } ) ,
448
472
if primary. is_empty( ) {
449
473
"N/A" . to_string( )
450
474
} else {
451
475
format!( "{:.1}%" , primary. arithmetic_mean_of_changes( ) )
452
- }
453
- )
454
- . unwrap ( ) ;
476
+ } ,
477
+ ] ) ;
455
478
456
479
let largest_change = if primary. is_empty ( ) {
457
480
"N/A" . to_string ( )
@@ -478,24 +501,30 @@ pub fn write_summary_table(
478
501
format ! ( "{:.1}%" , change * 100.0 )
479
502
} ;
480
503
481
- writeln ! (
482
- result,
483
- "| max | {} | {} | {} | {} | {} |" ,
484
- render_stat( primary. num_regressions, || primary
485
- . largest_regression( )
486
- . map( |r| r. relative_change( ) * 100.0 ) ) ,
487
- render_stat( secondary. num_regressions, || secondary
488
- . largest_regression( )
489
- . map( |r| r. relative_change( ) * 100.0 ) ) ,
490
- render_stat( primary. num_improvements, || primary
491
- . largest_improvement( )
492
- . map( |r| r. relative_change( ) * 100.0 ) ) ,
493
- render_stat( secondary. num_improvements, || secondary
494
- . largest_improvement( )
495
- . map( |r| r. relative_change( ) * 100.0 ) ) ,
496
- largest_change
497
- )
498
- . unwrap ( ) ;
504
+ render_row ( vec ! [
505
+ "max" . to_string( ) ,
506
+ render_stat( primary. num_regressions, || {
507
+ primary
508
+ . largest_regression( )
509
+ . map( |r| r. relative_change( ) * 100.0 )
510
+ } ) ,
511
+ render_stat( secondary. num_regressions, || {
512
+ secondary
513
+ . largest_regression( )
514
+ . map( |r| r. relative_change( ) * 100.0 )
515
+ } ) ,
516
+ render_stat( primary. num_improvements, || {
517
+ primary
518
+ . largest_improvement( )
519
+ . map( |r| r. relative_change( ) * 100.0 )
520
+ } ) ,
521
+ render_stat( secondary. num_improvements, || {
522
+ secondary
523
+ . largest_improvement( )
524
+ . map( |r| r. relative_change( ) * 100.0 )
525
+ } ) ,
526
+ largest_change,
527
+ ] ) ;
499
528
500
529
if with_footnotes {
501
530
writeln ! (
@@ -1357,15 +1386,14 @@ mod tests {
1357
1386
( Category :: Primary , 5.0 , 6.0 ) ,
1358
1387
] ,
1359
1388
r#"
1360
- | | Regressions πΏ <br />(primary) | Regressions πΏ <br />(secondary) | Improvements π <br />(primary) | Improvements π <br />(secondary) | All πΏ π <br />(primary) |
1361
- |:---:|:---:|:---:|:---:|:---:|:---:|
1362
- | count[^1] | 1 | 0 | 1 | 0 | 2 |
1363
- | mean[^2] | 20.0% | N/A | -50.0% | N/A | -15.0% |
1364
- | max | 20.0% | N/A | -50.0% | N/A | -50.0% |
1389
+ | | Regressions πΏ <br />(primary) | Regressions πΏ <br />(secondary) | Improvements π <br />(primary) | Improvements π <br />(secondary) | All πΏ π <br />(primary) |
1390
+ |:---------- :|:----------------------------- :|:------------------------------- :|:------------------------------ :|:-------------------------------- :|:-------------------- ---:|
1391
+ | count[^1] | 1 | 0 | 1 | 0 | 2 |
1392
+ | mean[^2] | 20.0% | N/A | -50.0% | N/A | -15.0% |
1393
+ | max | 20.0% | N/A | -50.0% | N/A | -50.0% |
1365
1394
1366
1395
[^1]: *number of relevant changes*
1367
1396
[^2]: *the arithmetic mean of the percent change*
1368
- "#
1369
1397
.trim_start(),
1370
1398
);
1371
1399
}
0 commit comments