From 6a2737e6a82875311f71f451939b2732562533d4 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Tue, 15 Nov 2016 09:39:45 +0100 Subject: [PATCH] WIP - refactor events to use a generic build entity for some of the hybrid events --- app/serializers/analytics_generic_entity.rb | 2 +- lib/gitlab/cycle_analytics/events.rb | 14 ++++---------- lib/gitlab/cycle_analytics/events_fetcher.rb | 10 ---------- lib/gitlab/cycle_analytics/query_config.rb | 16 ++++------------ .../serializers/analytics_build_entity_spec.rb | 6 +++--- .../analytics_build_serializer_spec.rb | 6 ++---- .../analytics_generic_serializer_spec.rb | 18 ++++++++++++++---- 7 files changed, 28 insertions(+), 44 deletions(-) diff --git a/app/serializers/analytics_generic_entity.rb b/app/serializers/analytics_generic_entity.rb index b007d9056d0..2692e9f21f1 100644 --- a/app/serializers/analytics_generic_entity.rb +++ b/app/serializers/analytics_generic_entity.rb @@ -23,7 +23,7 @@ class AnalyticsGenericEntity < Grape::Entity private def url_to(route, id = nil) - public_send("#{route}_url", options[:project].namespace, options[:project], id) + public_send("#{route}_url", request.project.namespace, request.project, id) end def interval_in_words(diff) diff --git a/lib/gitlab/cycle_analytics/events.rb b/lib/gitlab/cycle_analytics/events.rb index f2fa54f208f..8be102c9fa0 100644 --- a/lib/gitlab/cycle_analytics/events.rb +++ b/lib/gitlab/cycle_analytics/events.rb @@ -1,8 +1,6 @@ module Gitlab module CycleAnalytics class Events - include ActionView::Helpers::DateHelper - def initialize(project:, options:) @project = project @fetcher = EventsFetcher.new(project: project, options: options) @@ -51,20 +49,16 @@ module Gitlab private - def parse_event(event, entity: :issue) - event['url'] = Gitlab::LightUrlBuilder.build(entity: entity, project: @project, id: event['iid'].to_s) - event['total_time'] = distance_of_time_in_words(event['total_time'].to_f) - event['created_at'] = interval_in_words(event['created_at']) - event['author_profile_url'] = Gitlab::LightUrlBuilder.build(entity: :user, id: event['author_username']) - event['author_avatar_url'] = Gitlab::LightUrlBuilder.build(entity: :user_avatar, id: event['author_id']) + def parse_event(event) + event['author'] = User.find(event.remove('author_id')) - event.except!('author_id', 'author_username') + AnalyticsGenericSerializer.new(project: @project).represent(event).as_json end def parse_build_event(event) build = ::Ci::Build.find(event['id']) - AnalyticsBuildSerializer.new(project: @project).represent(build).as_json + AnalyticsBuildSerializer.new.represent(build).as_json end def first_time_reference_commit(commits, event) diff --git a/lib/gitlab/cycle_analytics/events_fetcher.rb b/lib/gitlab/cycle_analytics/events_fetcher.rb index 5631867d451..c12fdd58a47 100644 --- a/lib/gitlab/cycle_analytics/events_fetcher.rb +++ b/lib/gitlab/cycle_analytics/events_fetcher.rb @@ -15,24 +15,14 @@ module Gitlab end end - def issue_custom_query(base_query) - base_query.join(user_table).on(issue_table[:author_id].eq(user_table[:id])) - end - def plan_custom_query(base_query) base_query.join(mr_diff_table).on(mr_diff_table[:merge_request_id].eq(mr_table[:id])) end - def review_custom_query(base_query) - base_query.join(user_table).on(mr_table[:author_id].eq(user_table[:id])) - end - def test_custom_query(base_query) base_query.join(build_table).on(mr_metrics_table[:ci_commit_id].eq(build_table[:commit_id])) end - alias_method :code_custom_query, :issue_custom_query - alias_method :production_custom_query, :issue_custom_query alias_method :staging_custom_query, :test_custom_query end end diff --git a/lib/gitlab/cycle_analytics/query_config.rb b/lib/gitlab/cycle_analytics/query_config.rb index 0393567378f..d077a3e1a14 100644 --- a/lib/gitlab/cycle_analytics/query_config.rb +++ b/lib/gitlab/cycle_analytics/query_config.rb @@ -24,9 +24,7 @@ module Gitlab issue_table[:iid], issue_table[:id], issue_table[:created_at], - user_table[:name].as('author_name'), - user_table[:username].as('author_username'), - user_table[:id].as('author_id')] + issue_table[:author_id]] } end @@ -48,9 +46,7 @@ module Gitlab mr_table[:id], mr_table[:created_at], mr_table[:state], - user_table[:name].as('author_name'), - user_table[:username].as('author_username'), - user_table[:id].as('author_id')], + mr_table[:author_id]], order: mr_table[:created_at] } end @@ -73,9 +69,7 @@ module Gitlab mr_table[:id], mr_table[:created_at].as('opened_at'), mr_table[:state], - user_table[:name].as('author_name'), - user_table[:username].as('author_username'), - user_table[:id].as('author_id')] + mr_table[:author_id]] } end @@ -96,9 +90,7 @@ module Gitlab issue_table[:iid], issue_table[:id], issue_table[:created_at], - user_table[:name].as('author_name'), - user_table[:username].as('author_username'), - user_table[:id].as('author_id')] + issue_table[:author_id]] } end end diff --git a/spec/serializers/analytics_build_entity_spec.rb b/spec/serializers/analytics_build_entity_spec.rb index 24040034f68..9ac6f20fd3c 100644 --- a/spec/serializers/analytics_build_entity_spec.rb +++ b/spec/serializers/analytics_build_entity_spec.rb @@ -5,14 +5,14 @@ describe AnalyticsBuildEntity do described_class.new(build, request: double) end - context 'when build is a regular job' do + context 'build with an author' do let(:user) { create(:user) } let(:build) { create(:ci_build, author: user) } subject { entity.as_json } - it 'contains URLs' do - expect(subject).to include(:url, :branch_url, :commit_url) + it 'contains the URL' do + expect(subject).to include(:url) end it 'contains the author' do diff --git a/spec/serializers/analytics_build_serializer_spec.rb b/spec/serializers/analytics_build_serializer_spec.rb index 24fd94810d4..a0a9d9a5f12 100644 --- a/spec/serializers/analytics_build_serializer_spec.rb +++ b/spec/serializers/analytics_build_serializer_spec.rb @@ -3,12 +3,10 @@ require 'spec_helper' describe AnalyticsBuildSerializer do let(:serializer) do described_class - .new(project: project) - .represent(resource) + .new.represent(resource) end let(:json) { serializer.as_json } - let(:project) { create(:project) } let(:resource) { create(:ci_build) } context 'when there is a single object provided' do @@ -18,7 +16,7 @@ describe AnalyticsBuildSerializer do it 'contains important elements of analyticsBuild' do expect(json) - .to include(:name, :branch, :short_sha, :date, :total_time, :url, :branch_url, :commit_url, :author) + .to include(:name, :branch, :short_sha, :date, :total_time, :url, :author) end end end diff --git a/spec/serializers/analytics_generic_serializer_spec.rb b/spec/serializers/analytics_generic_serializer_spec.rb index 24fd94810d4..4d523878015 100644 --- a/spec/serializers/analytics_generic_serializer_spec.rb +++ b/spec/serializers/analytics_generic_serializer_spec.rb @@ -1,15 +1,26 @@ require 'spec_helper' -describe AnalyticsBuildSerializer do +describe AnalyticsGenericSerializer do let(:serializer) do described_class .new(project: project) .represent(resource) end + let(:user) { create(:user) } let(:json) { serializer.as_json } let(:project) { create(:project) } - let(:resource) { create(:ci_build) } + let(:resource) { + { + total_time: "172802.724419", + title: "Eos voluptatem inventore in sed.", + iid: "1", + id: "1", + created_at: "2016-11-12 15:04:02.948604", + author: user, + entity: :merge_request + } + } context 'when there is a single object provided' do it 'it generates payload for single object' do @@ -17,8 +28,7 @@ describe AnalyticsBuildSerializer do end it 'contains important elements of analyticsBuild' do - expect(json) - .to include(:name, :branch, :short_sha, :date, :total_time, :url, :branch_url, :commit_url, :author) + expect(json).to include(:title, :iid, :date, :total_time, :url, :author) end end end