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