From 1f0b9e29b1a4c2dacf9bb2cb8d2fb25f3c6ffc46 Mon Sep 17 00:00:00 2001 From: Daniel Wagner-Hall Date: Wed, 28 Jan 2026 14:05:07 +0000 Subject: [PATCH] Review Metrics: Display improvements Also, include iterations --- src/prs.rs | 10 ++++ templates/review-metrics.html | 101 +++++++++++++++++++++------------- 2 files changed, 74 insertions(+), 37 deletions(-) diff --git a/src/prs.rs b/src/prs.rs index e9dca79..e353914 100644 --- a/src/prs.rs +++ b/src/prs.rs @@ -251,6 +251,8 @@ pub struct AggregatePrMetrics { pub p50_needs_review_to_complete: Option, pub p90_needs_review_to_complete: Option, pub p100_needs_review_to_complete: Option, + + pub iteration_counts: BTreeMap, } impl AggregatePrMetrics { @@ -276,6 +278,13 @@ impl AggregatePrMetrics { m.needs_review_to_complete() }); + let mut iteration_counts = BTreeMap::new(); + for metric in metrics { + if metric.first_complete.is_some() { + *iteration_counts.entry(metric.iterations).or_default() += 1; + } + } + AggregatePrMetrics { p50_needs_review_to_first_review, p90_needs_review_to_first_review, @@ -286,6 +295,7 @@ impl AggregatePrMetrics { p50_needs_review_to_complete, p90_needs_review_to_complete, p100_needs_review_to_complete, + iteration_counts, } } diff --git a/templates/review-metrics.html b/templates/review-metrics.html index 9e86729..98505fb 100644 --- a/templates/review-metrics.html +++ b/templates/review-metrics.html @@ -10,7 +10,7 @@ } .stats-container { display: grid; - grid-template-columns: repeat(3, 1fr); + grid-template-columns: repeat(4, 1fr); gap: 40px; } .reviews-container { @@ -22,6 +22,12 @@ border: 1px black solid; padding: 5px; } + .module { + background-color: lightgrey; + border: 1px black solid; + margin-bottom: 10px; + padding: 5px; + } @@ -51,46 +57,67 @@

Needs review to complete

  • p100: {{format_duration(aggregate_metrics.p100_needs_review_to_complete)}}
  • +
    +

    Iterations

    +
      + {% for (iteration, count) in aggregate_metrics.iteration_counts %} +
    • {{iteration}}: {{count}} PRs
    • + {% endfor %} +
    +
    {% for module in modules %} -

    {{module.name}}

    -
    -
    -

    Needs review to first review

    -
      -
    • p50: {{format_duration(module.aggregate_metrics.p50_needs_review_to_first_review)}}
    • -
    • p90: {{format_duration(module.aggregate_metrics.p90_needs_review_to_first_review)}}
    • -
    • p100: {{format_duration(module.aggregate_metrics.p100_needs_review_to_first_review)}}
    • -
    -
    -
    -

    Created to complete

    -
      -
    • p50: {{format_duration(module.aggregate_metrics.p50_created_to_complete)}}
    • -
    • p90: {{format_duration(module.aggregate_metrics.p90_created_to_complete)}}
    • -
    • p100: {{format_duration(module.aggregate_metrics.p100_created_to_complete)}}
    • -
    -
    -
    -

    Needs review to complete

    -
      -
    • p50: {{format_duration(module.aggregate_metrics.p50_needs_review_to_complete)}}
    • -
    • p90: {{format_duration(module.aggregate_metrics.p90_needs_review_to_complete)}}
    • -
    • p100: {{format_duration(module.aggregate_metrics.p100_needs_review_to_complete)}}
    • -
    -
    -
    -
    - {% for pr in module.metrics %} -
    - -
    Created to Complete: {{format_duration(&pr.created_to_complete())}}
    -
    Needs Review to Complete: {{format_duration(&pr.needs_review_to_complete())}}
    -
    {{pr.iterations}} iterations
    -
    Time since created: {{format_duration(&Some(pr.time_since_created()))}}
    +
    +

    {{module.name}}

    +
    + Expand for details +
    +
    +

    Needs review to first review

    +
      +
    • p50: {{format_duration(module.aggregate_metrics.p50_needs_review_to_first_review)}}
    • +
    • p90: {{format_duration(module.aggregate_metrics.p90_needs_review_to_first_review)}}
    • +
    • p100: {{format_duration(module.aggregate_metrics.p100_needs_review_to_first_review)}}
    • +
    +
    +
    +

    Created to complete

    +
      +
    • p50: {{format_duration(module.aggregate_metrics.p50_created_to_complete)}}
    • +
    • p90: {{format_duration(module.aggregate_metrics.p90_created_to_complete)}}
    • +
    • p100: {{format_duration(module.aggregate_metrics.p100_created_to_complete)}}
    • +
    +
    +
    +

    Needs review to complete

    +
      +
    • p50: {{format_duration(module.aggregate_metrics.p50_needs_review_to_complete)}}
    • +
    • p90: {{format_duration(module.aggregate_metrics.p90_needs_review_to_complete)}}
    • +
    • p100: {{format_duration(module.aggregate_metrics.p100_needs_review_to_complete)}}
    • +
    +
    +
    +

    Iterations

    +
      + {% for (iteration, count) in module.aggregate_metrics.iteration_counts %} +
    • {{iteration}}: {{count}} PRs
    • + {% endfor %} +
    +
    +
    +
    + {% for pr in module.metrics %} +
    + +
    Created to Complete: {{format_duration(&pr.created_to_complete())}}
    +
    Needs Review to Complete: {{format_duration(&pr.needs_review_to_complete())}}
    +
    {{pr.iterations}} iterations
    +
    Time since created: {{format_duration(&Some(pr.time_since_created()))}}
    +
    + {% endfor %}
    - {% endfor %} +
    {% endfor %}