diff options
author | Kamil Trzcinski <ayufan@ayufan.eu> | 2017-04-26 17:39:43 +0200 |
---|---|---|
committer | Z.J. van de Weg <git@zjvandeweg.nl> | 2017-05-05 20:35:48 +0200 |
commit | 33156c9367e92cc33fc3672aff0f36e864a1cfc8 (patch) | |
tree | e1cf110cc94d6e87d9b104b5b2224b5f1f1e8b9f | |
parent | 83ab435cc30e07175aecb47231debeb49cb245b7 (diff) | |
download | gitlab-ce-33156c9367e92cc33fc3672aff0f36e864a1cfc8.tar.gz |
Minimal change to represent groups for Pipeline Graph
We already preload all objects so this doesn't make a lot of difference in terms of performance
-rw-r--r-- | app/serializers/base_serializer.rb | 4 | ||||
-rw-r--r-- | app/serializers/jobs_serializer.rb | 53 | ||||
-rw-r--r-- | app/serializers/stage_entity.rb | 5 | ||||
-rw-r--r-- | lib/gitlab/ci/status/group/common.rb | 21 | ||||
-rw-r--r-- | lib/gitlab/ci/status/group/factory.rb | 13 |
5 files changed, 94 insertions, 2 deletions
diff --git a/app/serializers/base_serializer.rb b/app/serializers/base_serializer.rb index 311ee9c96be..37e5a7bf168 100644 --- a/app/serializers/base_serializer.rb +++ b/app/serializers/base_serializer.rb @@ -1,4 +1,6 @@ -class BaseSerializer +class BaseSerializer + attr_reader :request + def initialize(parameters = {}) @request = EntityRequest.new(parameters) end diff --git a/app/serializers/jobs_serializer.rb b/app/serializers/jobs_serializer.rb new file mode 100644 index 00000000000..efb7d82206a --- /dev/null +++ b/app/serializers/jobs_serializer.rb @@ -0,0 +1,53 @@ +class JobsSerializer < BaseSerializer + Item = Struct.new(:name, :size, :list) + + entity BuildEntity + + def with_groups + tap { @groups = true } + end + + def groups? + @groups + end + + def represent(resource, opts = {}) + if groups? + groups(resource).map do |item| + { name: item.name, + size: item.size, + list: super(item.list, opts), + status: represent_status(item.status) } + end + else + super(resource, opts) + end + end + + private + + def represent_status(list, opts = {}) + # TODO: We don't really have a first class concept + # for JobsGroup that would make it possible to have status for that + detailed_status = + if group_jobs.one? + group_jobs.first.detailed_status(request.user) + else + Gitlab::Ci::Status::Group::Factory + .new(CommitStatus.where(id: group_jobs), request.user) + .fabricate! + end + + StatusEntity + .represent(resource, opts.merge(request: @request)) + .as_json + end + + def groups(resource) + items = resource.sort_by(&:sortable_name).group_by(&:group_name) + + items.map do |group_name, group_jobs| + Item.new(group_name, group_jobs.size, group_jobs) + end + end +end diff --git a/app/serializers/stage_entity.rb b/app/serializers/stage_entity.rb index 5018966b248..35245ae978e 100644 --- a/app/serializers/stage_entity.rb +++ b/app/serializers/stage_entity.rb @@ -26,7 +26,10 @@ class StageEntity < Grape::Entity format: :json) end - expose :builds, as: :jobs, using: BuildEntity + expose :jobs do |stage| + JobsSerializer.new(project: request.project, user: request.user) + .with_groups.represent(stage.statuses) + end private diff --git a/lib/gitlab/ci/status/group/common.rb b/lib/gitlab/ci/status/group/common.rb new file mode 100644 index 00000000000..cfd4329a923 --- /dev/null +++ b/lib/gitlab/ci/status/group/common.rb @@ -0,0 +1,21 @@ +module Gitlab + module Ci + module Status + module Group + module Common + def has_details? + false + end + + def details_path + nil + end + + def has_action? + false + end + end + end + end + end +end diff --git a/lib/gitlab/ci/status/group/factory.rb b/lib/gitlab/ci/status/group/factory.rb new file mode 100644 index 00000000000..d118116cfc3 --- /dev/null +++ b/lib/gitlab/ci/status/group/factory.rb @@ -0,0 +1,13 @@ +module Gitlab + module Ci + module Status + module Group + class Factory < Status::Factory + def self.common_helpers + Status::Group::Common + end + end + end + end + end +end |