Class: Codepulse::MetricsCalculator

Inherits:
Object
  • Object
show all
Includes:
TimeHelpers
Defined in:
lib/codepulse/metrics_calculator.rb

Overview

Calculates pickup time, merge time, and size metrics for pull requests.

Constant Summary collapse

IGNORED_ACTORS =

Bot accounts to ignore when calculating pickup time.

[
  # GitHub Copilot
  "copilot-pull-request-reviewer",
  "copilot-pull-request-reviewer[bot]",
  "copilot",
  "copilot[bot]",
  "copilot-bot",
  "github-copilot",
  "github-copilot[bot]",

  # GitHub Actions
  "github-actions",
  "github-actions[bot]",

  # AI Coding Assistants
  "cursor[bot]",
  "cursor-bot",
  "codex[bot]",
  "openai-codex",
  "coderabbitai[bot]",
  "coderabbit",
  "sourcery-ai[bot]",
  "sourcery[bot]",
  "codeium[bot]",
  "tabnine[bot]",
  "sweep[bot]",
  "sweepai[bot]",
  "qodo-merge-pro[bot]",
  "codiumai[bot]",
  "amazon-q[bot]",
  "codewhisperer[bot]",
  "aider[bot]",
  "devin[bot]",
  "devin-ai[bot]",

  # Dependency Management
  "dependabot[bot]",
  "dependabot",
  "renovate[bot]",
  "renovate",

  # Security & Code Quality
  "snyk-bot",
  "snyk[bot]",
  "sonarcloud[bot]",
  "sonarqube[bot]",
  "codecov[bot]",
  "codecov",
  "coveralls[bot]",
  "deepsource-autofix[bot]",
  "deepsource[bot]",
  "codefactor[bot]",
  "lgtm-com[bot]",

  # Deployment & Merge Bots
  "vercel[bot]",
  "netlify[bot]",
  "mergify[bot]",
  "kodiakhq[bot]",
  "imgbot[bot]",
  "allstar[bot]"
].freeze

Constants included from TimeHelpers

TimeHelpers::SECONDS_PER_DAY

Instance Method Summary collapse

Methods included from TimeHelpers

#build_us_holidays, #business_day?, #business_days_cutoff, #business_seconds_between, #date_key, #end_of_day, #last_weekday, #nth_weekday, #parse_time, #start_of_day, #us_holiday?, #us_holidays, #weekday?

Constructor Details

#initialize ⇒ MetricsCalculator

Returns a new instance of MetricsCalculator.



72
73
74
# File 'lib/codepulse/metrics_calculator.rb', line 72

def initialize
  # No client needed - data is pre-fetched via GraphQL
end

Instance Method Details

#metrics_for_pull_request(pull_request) ⇒ Object

Returns a hash of metrics for a single PR. Expects pull_request to include :reviews, :review_comments, :issue_comments from GraphQL.



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/codepulse/metrics_calculator.rb', line 78

def metrics_for_pull_request(pull_request)
  created_at = parse_time(pull_request["created_at"])
  merged_at = parse_time(pull_request["merged_at"])
  pickup_event = find_pickup_event(pull_request, created_at)
  pickup_seconds = pickup_event ? business_seconds_between(created_at, pickup_event.fetch(:timestamp)) : nil
  merge_seconds = merged_at && created_at ? business_seconds_between(created_at, merged_at) : nil

  {
    number: pull_request["number"],
    title: pull_request["title"],
    author: pull_request.dig("user", "login"),
    created_at: created_at,
    merged_at: merged_at,
    additions: pull_request["additions"].to_i,
    deletions: pull_request["deletions"].to_i,
    changed_files: pull_request["changed_files"].to_i,
    pickup_time_seconds: pickup_seconds,
    merge_time_seconds: merge_seconds,
    pickup_actor: pickup_event&.fetch(:actor, nil),
    pickup_at: pickup_event&.fetch(:timestamp, nil),
    pickup_source: pickup_event&.fetch(:source, nil)
  }
end