Scope Cycle Analytics queries to a project
This commit is contained in:
parent
a81de9ab4f
commit
df6c9c33b6
|
|
@ -1,5 +1,5 @@
|
|||
class Projects::CycleAnalyticsController < Projects::ApplicationController
|
||||
def show
|
||||
@cycle_analytics = CycleAnalytics.new
|
||||
@cycle_analytics = CycleAnalytics.new(@project)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,42 +1,46 @@
|
|||
class CycleAnalytics
|
||||
def initialize(project)
|
||||
@project = project
|
||||
end
|
||||
|
||||
def issue
|
||||
calculate_metric(Queries::issues,
|
||||
calculate_metric(Queries::issues(@project),
|
||||
-> (data_point) { data_point[:issue].created_at },
|
||||
[Queries::issue_first_associated_with_milestone_at, Queries::issue_first_added_to_list_label_at])
|
||||
end
|
||||
|
||||
def plan
|
||||
calculate_metric(Queries::issues,
|
||||
calculate_metric(Queries::issues(@project),
|
||||
[Queries::issue_first_associated_with_milestone_at, Queries::issue_first_added_to_list_label_at],
|
||||
Queries::issue_closing_merge_request_opened_at)
|
||||
end
|
||||
|
||||
def code
|
||||
calculate_metric(Queries::merge_requests_closing_issues,
|
||||
calculate_metric(Queries::merge_requests_closing_issues(@project),
|
||||
-> (data_point) { data_point[:merge_request].created_at },
|
||||
[Queries::merge_request_first_assigned_to_user_other_than_author_at, Queries::merge_request_wip_flag_first_removed_at])
|
||||
end
|
||||
|
||||
def test
|
||||
calculate_metric(Queries::merge_requests_closing_issues,
|
||||
calculate_metric(Queries::merge_requests_closing_issues(@project),
|
||||
Queries::merge_request_build_started_at,
|
||||
Queries::merge_request_build_finished_at)
|
||||
end
|
||||
|
||||
def review
|
||||
calculate_metric(Queries::merge_requests_closing_issues,
|
||||
calculate_metric(Queries::merge_requests_closing_issues(@project),
|
||||
[Queries::merge_request_first_assigned_to_user_other_than_author_at, Queries::merge_request_wip_flag_first_removed_at],
|
||||
[Queries::merge_request_first_closed_at, Queries::merge_request_merged_at])
|
||||
end
|
||||
|
||||
def staging
|
||||
calculate_metric(Queries::merge_requests_closing_issues,
|
||||
calculate_metric(Queries::merge_requests_closing_issues(@project),
|
||||
Queries::merge_request_merged_at,
|
||||
Queries::merge_request_deployed_to_any_environment_at)
|
||||
end
|
||||
|
||||
def production
|
||||
calculate_metric(Queries::merge_requests_closing_issues,
|
||||
calculate_metric(Queries::merge_requests_closing_issues(@project),
|
||||
-> (data_point) { data_point[:issue].created_at },
|
||||
Queries::merge_request_deployed_to_production_at)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
class CycleAnalytics
|
||||
module Queries
|
||||
class << self
|
||||
def issues
|
||||
Issue.all.to_a.map { |issue| { issue: issue } }
|
||||
def issues(project)
|
||||
project.issues.map { |issue| { issue: issue } }
|
||||
end
|
||||
|
||||
def merge_requests_closing_issues
|
||||
issues.map do |data_point|
|
||||
def merge_requests_closing_issues(project)
|
||||
issues(project).map do |data_point|
|
||||
merge_requests = data_point[:issue].closed_by_merge_requests(nil, check_if_open: false)
|
||||
merge_requests.map { |merge_request| { issue: data_point[:issue], merge_request: merge_request } }
|
||||
end.flatten
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ require 'spec_helper'
|
|||
|
||||
describe 'CycleAnalytics#issue', models: true do
|
||||
let(:project) { create(:project) }
|
||||
subject { CycleAnalytics.new }
|
||||
subject { CycleAnalytics.new(project) }
|
||||
|
||||
context "when calculating the median of times between:
|
||||
start: issue created_at
|
||||
|
|
@ -26,6 +26,16 @@ describe 'CycleAnalytics#issue', models: true do
|
|||
median_start_time, median_end_time = start_and_end_times[2]
|
||||
expect(subject.issue).to eq(median_end_time - median_start_time)
|
||||
end
|
||||
|
||||
it "does not include issues from other projects" do
|
||||
5.times do
|
||||
milestone = create(:milestone, project: project)
|
||||
issue = create(:issue)
|
||||
issue.update(milestone: milestone)
|
||||
end
|
||||
|
||||
expect(subject.issue).to be_nil
|
||||
end
|
||||
end
|
||||
|
||||
context "when a label is added to the issue" do
|
||||
|
|
@ -47,14 +57,9 @@ describe 'CycleAnalytics#issue', models: true do
|
|||
|
||||
it "does not make a calculation for regular labels" do
|
||||
5.times do
|
||||
start_time = Time.now
|
||||
end_time = rand(1..10).days.from_now
|
||||
|
||||
regular_label = create(:label)
|
||||
issue = Timecop.freeze(start_time) { create(:issue, project: project) }
|
||||
Timecop.freeze(end_time) { issue.update(label_ids: [regular_label.id]) }
|
||||
|
||||
[start_time, end_time]
|
||||
issue = create(:issue, project: project)
|
||||
issue.update(label_ids: [regular_label.id])
|
||||
end
|
||||
|
||||
expect(subject.issue).to be_nil
|
||||
|
|
|
|||
Loading…
Reference in New Issue