summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Lopez <james@jameslopez.es>2016-11-18 16:38:02 +0100
committerJames Lopez <james@jameslopez.es>2017-01-17 11:32:54 +0100
commit3268e3779166c7ddf47ecc0d78397cd75cf2f0e8 (patch)
tree44f40dfcdad45c14d154d4019a13d5ccf17f22de
parente7fdb1aae5a61b30f66ea3489d4e0759ed8ea3a1 (diff)
downloadgitlab-ce-3268e3779166c7ddf47ecc0d78397cd75cf2f0e8.tar.gz
WIP - started refactoring cycle analytics median stuff into stages
-rw-r--r--app/models/cycle_analytics.rb47
-rw-r--r--lib/gitlab/cycle_analytics/base_event.rb8
-rw-r--r--lib/gitlab/cycle_analytics/base_stage.rb24
-rw-r--r--lib/gitlab/cycle_analytics/code_event.rb1
-rw-r--r--lib/gitlab/cycle_analytics/code_stage.rb11
-rw-r--r--lib/gitlab/cycle_analytics/events_query.rb9
-rw-r--r--lib/gitlab/cycle_analytics/issue_event.rb1
-rw-r--r--lib/gitlab/cycle_analytics/issue_stage.rb12
-rw-r--r--lib/gitlab/cycle_analytics/metrics_fetcher.rb3
-rw-r--r--lib/gitlab/cycle_analytics/plan_event.rb1
-rw-r--r--lib/gitlab/cycle_analytics/plan_stage.rb12
-rw-r--r--lib/gitlab/cycle_analytics/production_event.rb1
-rw-r--r--lib/gitlab/cycle_analytics/production_stage.rb11
-rw-r--r--lib/gitlab/cycle_analytics/review_event.rb1
-rw-r--r--lib/gitlab/cycle_analytics/review_stage.rb11
-rw-r--r--lib/gitlab/cycle_analytics/staging_event.rb1
-rw-r--r--lib/gitlab/cycle_analytics/staging_stage.rb11
-rw-r--r--lib/gitlab/cycle_analytics/test_event.rb1
-rw-r--r--lib/gitlab/cycle_analytics/test_stage.rb11
19 files changed, 118 insertions, 59 deletions
diff --git a/app/models/cycle_analytics.rb b/app/models/cycle_analytics.rb
index ba4ee6fcf9d..5e33273c9ba 100644
--- a/app/models/cycle_analytics.rb
+++ b/app/models/cycle_analytics.rb
@@ -1,17 +1,17 @@
class CycleAnalytics
STAGES = %i[issue plan code test review staging production].freeze
- def initialize(project, current_user, from:)
+ def initialize(project, from:)
@project = project
- @current_user = current_user
- @from = from
- @fetcher = Gitlab::CycleAnalytics::MetricsFetcher.new(project: project, from: from, branch: nil)
+ @options = options
end
def summary
- @summary ||= Summary.new(@project, @current_user, from: @from)
+ @summary ||= Summary.new(@project, from: @options[:from])
end
+ def method_missing(method_sym, *arguments, &block)
+ classify_stage(method_sym).new(project: @project, options: @options, stage: method_sym)
def permissions(user:)
Gitlab::CycleAnalytics::Permissions.get(user: user, project: @project)
end
@@ -23,40 +23,7 @@ class CycleAnalytics
Issue::Metrics.arel_table[:first_added_to_board_at]])
end
- def plan
- @fetcher.calculate_metric(:plan,
- [Issue::Metrics.arel_table[:first_associated_with_milestone_at],
- Issue::Metrics.arel_table[:first_added_to_board_at]],
- Issue::Metrics.arel_table[:first_mentioned_in_commit_at])
- end
-
- def code
- @fetcher.calculate_metric(:code,
- Issue::Metrics.arel_table[:first_mentioned_in_commit_at],
- MergeRequest.arel_table[:created_at])
- end
-
- def test
- @fetcher.calculate_metric(:test,
- MergeRequest::Metrics.arel_table[:latest_build_started_at],
- MergeRequest::Metrics.arel_table[:latest_build_finished_at])
- end
-
- def review
- @fetcher.calculate_metric(:review,
- MergeRequest.arel_table[:created_at],
- MergeRequest::Metrics.arel_table[:merged_at])
- end
-
- def staging
- @fetcher.calculate_metric(:staging,
- MergeRequest::Metrics.arel_table[:merged_at],
- MergeRequest::Metrics.arel_table[:first_deployed_to_production_at])
- end
-
- def production
- @fetcher.calculate_metric(:production,
- Issue.arel_table[:created_at],
- MergeRequest::Metrics.arel_table[:first_deployed_to_production_at])
+ def classify_stage(method_sym)
+ "Gitlab::CycleAnalytics::#{method_sym.to_s.capitalize}Stage".constantize
end
end
diff --git a/lib/gitlab/cycle_analytics/base_event.rb b/lib/gitlab/cycle_analytics/base_event.rb
index 53a148ad703..c87841c119a 100644
--- a/lib/gitlab/cycle_analytics/base_event.rb
+++ b/lib/gitlab/cycle_analytics/base_event.rb
@@ -5,10 +5,10 @@ module Gitlab
attr_reader :stage, :start_time_attrs, :end_time_attrs, :projections, :query
- def initialize(project:, options:)
- @query = EventsQuery.new(project: project, options: options)
- @project = project
- @options = options
+ def initialize(fetcher:, stage:)
+ @query = EventsQuery.new(fetcher: fetcher)
+ @project = fetcher.project
+ @stage = stage
end
def fetch
diff --git a/lib/gitlab/cycle_analytics/base_stage.rb b/lib/gitlab/cycle_analytics/base_stage.rb
new file mode 100644
index 00000000000..70f1e1018c9
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/base_stage.rb
@@ -0,0 +1,24 @@
+module Gitlab
+ module CycleAnalytics
+ class BaseStage
+ def initialize(project:, options:, stage: stage)
+ @project = project
+ @options = options
+ @fetcher = Gitlab::CycleAnalytics::MetricsFetcher.new(project: project,
+ from: options[:from],
+ branch: options[:branch])
+ @stage = stage
+ end
+
+ def events
+ event_class.new(fetcher: @fetcher, stage: @stage).fetch
+ end
+
+ private
+
+ def event_class
+ "Gitlab::CycleAnalytics::#{@stage.to_s.capitalize}Event".constantize
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/code_event.rb b/lib/gitlab/cycle_analytics/code_event.rb
index 2afdf0b8518..68251630e08 100644
--- a/lib/gitlab/cycle_analytics/code_event.rb
+++ b/lib/gitlab/cycle_analytics/code_event.rb
@@ -4,7 +4,6 @@ module Gitlab
include MergeRequestAllowed
def initialize(*args)
- @stage = :code
@start_time_attrs = issue_metrics_table[:first_mentioned_in_commit_at]
@end_time_attrs = mr_table[:created_at]
@projections = [mr_table[:title],
diff --git a/lib/gitlab/cycle_analytics/code_stage.rb b/lib/gitlab/cycle_analytics/code_stage.rb
new file mode 100644
index 00000000000..9d28393ce53
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/code_stage.rb
@@ -0,0 +1,11 @@
+module Gitlab
+ module CycleAnalytics
+ class CodeStage < BaseStage
+ def median
+ @fetcher.calculate_metric(:code,
+ Issue::Metrics.arel_table[:first_mentioned_in_commit_at],
+ MergeRequest.arel_table[:created_at])
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/events_query.rb b/lib/gitlab/cycle_analytics/events_query.rb
index 2418832ccc2..e2b79384c9b 100644
--- a/lib/gitlab/cycle_analytics/events_query.rb
+++ b/lib/gitlab/cycle_analytics/events_query.rb
@@ -1,13 +1,8 @@
module Gitlab
module CycleAnalytics
class EventsQuery
- attr_reader :project
-
- def initialize(project:, options: {})
- @project = project
- @from = options[:from]
- @branch = options[:branch]
- @fetcher = Gitlab::CycleAnalytics::MetricsFetcher.new(project: project, from: @from, branch: @branch)
+ def initialize(fetcher:)
+ @fetcher = fetcher
end
def execute(stage_class)
diff --git a/lib/gitlab/cycle_analytics/issue_event.rb b/lib/gitlab/cycle_analytics/issue_event.rb
index 705b7e5ce24..76e8decf36e 100644
--- a/lib/gitlab/cycle_analytics/issue_event.rb
+++ b/lib/gitlab/cycle_analytics/issue_event.rb
@@ -4,7 +4,6 @@ module Gitlab
include IssueAllowed
def initialize(*args)
- @stage = :issue
@start_time_attrs = issue_table[:created_at]
@end_time_attrs = [issue_metrics_table[:first_associated_with_milestone_at],
issue_metrics_table[:first_added_to_board_at]]
diff --git a/lib/gitlab/cycle_analytics/issue_stage.rb b/lib/gitlab/cycle_analytics/issue_stage.rb
new file mode 100644
index 00000000000..6793cc77976
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/issue_stage.rb
@@ -0,0 +1,12 @@
+module Gitlab
+ module CycleAnalytics
+ class IssueStage < BaseStage
+ def median
+ @fetcher.calculate_metric(:issue,
+ Issue.arel_table[:created_at],
+ [Issue::Metrics.arel_table[:first_associated_with_milestone_at],
+ Issue::Metrics.arel_table[:first_added_to_board_at]])
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/metrics_fetcher.rb b/lib/gitlab/cycle_analytics/metrics_fetcher.rb
index b71e8735e27..51835bbde24 100644
--- a/lib/gitlab/cycle_analytics/metrics_fetcher.rb
+++ b/lib/gitlab/cycle_analytics/metrics_fetcher.rb
@@ -5,11 +5,12 @@ module Gitlab
include Gitlab::Database::DateTime
include MetricsTables
+ attr_reader :project
+
DEPLOYMENT_METRIC_STAGES = %i[production staging]
def initialize(project:, from:, branch:)
@project = project
- @project = project
@from = from
@branch = branch
end
diff --git a/lib/gitlab/cycle_analytics/plan_event.rb b/lib/gitlab/cycle_analytics/plan_event.rb
index 7c3f0e9989f..4b06143495b 100644
--- a/lib/gitlab/cycle_analytics/plan_event.rb
+++ b/lib/gitlab/cycle_analytics/plan_event.rb
@@ -2,7 +2,6 @@ module Gitlab
module CycleAnalytics
class PlanEvent < BaseEvent
def initialize(*args)
- @stage = :plan
@start_time_attrs = issue_metrics_table[:first_associated_with_milestone_at]
@end_time_attrs = [issue_metrics_table[:first_added_to_board_at],
issue_metrics_table[:first_mentioned_in_commit_at]]
diff --git a/lib/gitlab/cycle_analytics/plan_stage.rb b/lib/gitlab/cycle_analytics/plan_stage.rb
new file mode 100644
index 00000000000..772237087c0
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/plan_stage.rb
@@ -0,0 +1,12 @@
+module Gitlab
+ module CycleAnalytics
+ class PlanStage < BaseStage
+ def median
+ @fetcher.calculate_metric(:plan,
+ [Issue::Metrics.arel_table[:first_associated_with_milestone_at],
+ Issue::Metrics.arel_table[:first_added_to_board_at]],
+ Issue::Metrics.arel_table[:first_mentioned_in_commit_at])
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/production_event.rb b/lib/gitlab/cycle_analytics/production_event.rb
index 4868c3c6237..c03cd4f4909 100644
--- a/lib/gitlab/cycle_analytics/production_event.rb
+++ b/lib/gitlab/cycle_analytics/production_event.rb
@@ -4,7 +4,6 @@ module Gitlab
include IssueAllowed
def initialize(*args)
- @stage = :production
@start_time_attrs = issue_table[:created_at]
@end_time_attrs = mr_metrics_table[:first_deployed_to_production_at]
@projections = [issue_table[:title],
diff --git a/lib/gitlab/cycle_analytics/production_stage.rb b/lib/gitlab/cycle_analytics/production_stage.rb
new file mode 100644
index 00000000000..2fb087a8cac
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/production_stage.rb
@@ -0,0 +1,11 @@
+module Gitlab
+ module CycleAnalytics
+ class ProductionStage < BaseStage
+ def median
+ @fetcher.calculate_metric(:production,
+ Issue.arel_table[:created_at],
+ MergeRequest::Metrics.arel_table[:first_deployed_to_production_at])
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/review_event.rb b/lib/gitlab/cycle_analytics/review_event.rb
index b394a02cc52..3f9ffa9657b 100644
--- a/lib/gitlab/cycle_analytics/review_event.rb
+++ b/lib/gitlab/cycle_analytics/review_event.rb
@@ -4,7 +4,6 @@ module Gitlab
include MergeRequestAllowed
def initialize(*args)
- @stage = :review
@start_time_attrs = mr_table[:created_at]
@end_time_attrs = mr_metrics_table[:merged_at]
@projections = [mr_table[:title],
diff --git a/lib/gitlab/cycle_analytics/review_stage.rb b/lib/gitlab/cycle_analytics/review_stage.rb
new file mode 100644
index 00000000000..ec9f07319e8
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/review_stage.rb
@@ -0,0 +1,11 @@
+module Gitlab
+ module CycleAnalytics
+ class ReviewStage < BaseStage
+ def median
+ @fetcher.calculate_metric(:review,
+ MergeRequest.arel_table[:created_at],
+ MergeRequest::Metrics.arel_table[:merged_at])
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/staging_event.rb b/lib/gitlab/cycle_analytics/staging_event.rb
index a1f30b716f6..eae18b447f0 100644
--- a/lib/gitlab/cycle_analytics/staging_event.rb
+++ b/lib/gitlab/cycle_analytics/staging_event.rb
@@ -2,7 +2,6 @@ module Gitlab
module CycleAnalytics
class StagingEvent < BaseEvent
def initialize(*args)
- @stage = :staging
@start_time_attrs = mr_metrics_table[:merged_at]
@end_time_attrs = mr_metrics_table[:first_deployed_to_production_at]
@projections = [build_table[:id]]
diff --git a/lib/gitlab/cycle_analytics/staging_stage.rb b/lib/gitlab/cycle_analytics/staging_stage.rb
new file mode 100644
index 00000000000..9c67a2aa6fe
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/staging_stage.rb
@@ -0,0 +1,11 @@
+module Gitlab
+ module CycleAnalytics
+ class StagingStage < BaseStage
+ def median
+ @fetcher.calculate_metric(:staging,
+ MergeRequest::Metrics.arel_table[:merged_at],
+ MergeRequest::Metrics.arel_table[:first_deployed_to_production_at])
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/test_event.rb b/lib/gitlab/cycle_analytics/test_event.rb
index d553d0b5aec..d0736672adf 100644
--- a/lib/gitlab/cycle_analytics/test_event.rb
+++ b/lib/gitlab/cycle_analytics/test_event.rb
@@ -4,7 +4,6 @@ module Gitlab
def initialize(*args)
super(*args)
- @stage = :test
@start_time_attrs = mr_metrics_table[:latest_build_started_at]
@end_time_attrs = mr_metrics_table[:latest_build_finished_at]
end
diff --git a/lib/gitlab/cycle_analytics/test_stage.rb b/lib/gitlab/cycle_analytics/test_stage.rb
new file mode 100644
index 00000000000..6bedfdbba61
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/test_stage.rb
@@ -0,0 +1,11 @@
+module Gitlab
+ module CycleAnalytics
+ class TestStage < BaseStage
+ def median
+ @fetcher.calculate_metric(:test,
+ MergeRequest::Metrics.arel_table[:latest_build_started_at],
+ MergeRequest::Metrics.arel_table[:latest_build_finished_at])
+ end
+ end
+ end
+end