diff --git a/app/models/cycle_analytics.rb b/app/models/cycle_analytics.rb index 16072c35b64ec3d4b2c94eb96eb589c7199d1644..8ba275dd13a02c4374d75174bbe816019ba62ae9 100644 --- a/app/models/cycle_analytics.rb +++ b/app/models/cycle_analytics.rb @@ -15,18 +15,25 @@ class CycleAnalytics def code issues = Issue.all.to_a start_time_fn = -> (merge_request) { merge_request.created_at } - calculate_metric(issues.map { |issue| issue.closed_by_merge_requests(nil, check_if_open: false) }.flatten, + calculate_metric(Queries::merge_requests_closing_issues(issues), start_time_fn, Queries::mr_wip_flag_removed_or_assigned_to_user_other_than_author_time) end def review issues = Issue.all.to_a - calculate_metric(issues.map { |issue| issue.closed_by_merge_requests(nil, check_if_open: false) }.flatten, + calculate_metric(Queries::merge_requests_closing_issues(issues), Queries::mr_wip_flag_removed_or_assigned_to_user_other_than_author_time, Queries::mr_first_closed_or_merged_at) end + def staging + issues = Issue.all.to_a + calculate_metric(Queries::merge_requests_closing_issues(issues), + Queries::mr_merged_at, + Queries::mr_deployed_to_any_environment_at) + end + private def calculate_metric(data, start_time_fn, end_time_fn) diff --git a/app/models/cycle_analytics/queries.rb b/app/models/cycle_analytics/queries.rb index 41081a4e08c77d3ab4f1b4462bb1ea5429a86d7f..9970941837d935ac9e34f1384509e63065780b20 100644 --- a/app/models/cycle_analytics/queries.rb +++ b/app/models/cycle_analytics/queries.rb @@ -1,6 +1,10 @@ class CycleAnalytics module Queries class << self + def merge_requests_closing_issues(issues) + issues.map { |issue| issue.closed_by_merge_requests(nil, check_if_open: false) }.flatten + end + def issue_first_associated_with_milestone_or_first_added_to_list_label_time lambda do |issue| if issue.metrics.present? @@ -18,6 +22,24 @@ class CycleAnalytics end end + def mr_merged_at + lambda do |merge_request| + if merge_request.metrics.present? + merge_request.metrics.merged_at + end + end + end + + def mr_deployed_to_any_environment_at + lambda do |merge_request| + if merge_request.metrics.present? + deployments = Deployment.where(ref: merge_request.target_branch).where("created_at > ?", merge_request.metrics.merged_at) + deployment = deployments.order(:created_at).first + deployment.created_at if deployment + end + end + end + def issue_closing_merge_request_opened_time lambda do |issue| merge_requests = issue.closed_by_merge_requests(nil, check_if_open: false) diff --git a/app/views/projects/cycle_analytics/show.html.haml b/app/views/projects/cycle_analytics/show.html.haml index 271aae5d5fd50f6a47af52061b5ece845963e564..e1c13b3c7a5abd233f75bf50c21def5969cf48dd 100644 --- a/app/views/projects/cycle_analytics/show.html.haml +++ b/app/views/projects/cycle_analytics/show.html.haml @@ -26,3 +26,10 @@ = distance_of_time_in_words review - else = "<Not enough data>" + + %li.list-group-item + Staging: + - if staging = @cycle_analytics.staging.presence + = distance_of_time_in_words staging + - else + = "<Not enough data>"