summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZ.J. van de Weg <git@zjvandeweg.nl>2017-05-05 14:27:42 +0200
committerZ.J. van de Weg <git@zjvandeweg.nl>2017-05-06 09:38:58 +0200
commite9e71a9c9513c449798ba23fc6e159e834ef6f68 (patch)
tree219dada015f66a840d1d2de2dfe7adb692095adf
parent5109ce78027fe64268032d2d20cfc2371da9665a (diff)
downloadgitlab-ce-e9e71a9c9513c449798ba23fc6e159e834ef6f68.tar.gz
Incorporate review
-rw-r--r--app/models/ci/group.rb18
-rw-r--r--app/models/ci/stage.rb6
-rw-r--r--app/serializers/job_group_entity.rb2
-rw-r--r--app/serializers/pipeline_entity.rb2
-rw-r--r--spec/controllers/projects/pipelines_controller_spec.rb3
-rw-r--r--spec/fixtures/api/schemas/pipeline.json355
-rw-r--r--spec/lib/gitlab/ci/status/group/common_spec.rb7
-rw-r--r--spec/lib/gitlab/ci/status/group/factory_spec.rb11
-rw-r--r--spec/models/ci/group_spec.rb10
-rw-r--r--spec/serializers/pipeline_entity_spec.rb4
-rw-r--r--spec/serializers/stage_entity_spec.rb8
11 files changed, 400 insertions, 26 deletions
diff --git a/app/models/ci/group.rb b/app/models/ci/group.rb
index 9d5c55b86c5..a72e58f5a34 100644
--- a/app/models/ci/group.rb
+++ b/app/models/ci/group.rb
@@ -5,12 +5,14 @@ module Ci
class Group
include StaticModel
- attr_reader :stage, :name, :statuses
+ attr_reader :stage, :name, :jobs
- def initialize(stage, name:, statuses:)
+ delegate :size, to: :jobs
+
+ def initialize(stage, name:, jobs:)
@stage = stage
@name = name
- @statuses = statuses
+ @jobs = jobs
end
def status
@@ -18,21 +20,17 @@ module Ci
end
def detailed_status(current_user)
- if size == 1
- statuses[0].detailed_status(current_user)
+ if jobs.one?
+ jobs.first.detailed_status(current_user)
else
Gitlab::Ci::Status::Group::Factory.new(self, current_user).fabricate!
end
end
- def size
- statuses.size
- end
-
private
def commit_statuses
- @commit_statuses ||= CommitStatus.where(id: statuses.map(&:id))
+ @commit_statuses ||= CommitStatus.where(id: jobs.map(&:id))
end
end
end
diff --git a/app/models/ci/stage.rb b/app/models/ci/stage.rb
index 9f4f9f26b1c..79d009688f8 100644
--- a/app/models/ci/stage.rb
+++ b/app/models/ci/stage.rb
@@ -17,10 +17,10 @@ module Ci
def job_groups
@job_groups ||=
- statuses.sort_by(&:sortable_name).group_by(&:group_name)
+ statuses.latest.sort_by(&:sortable_name).group_by(&:group_name)
.map do |group_name, grouped_statuses|
- Ci::Group.new(self, name: group_name, statuses: grouped_statuses)
- end
+ Ci::Group.new(self, name: group_name, jobs: grouped_statuses)
+ end.sort_by(&:name)
end
def to_param
diff --git a/app/serializers/job_group_entity.rb b/app/serializers/job_group_entity.rb
index 6e8102b8b58..eb2ff76ebb8 100644
--- a/app/serializers/job_group_entity.rb
+++ b/app/serializers/job_group_entity.rb
@@ -4,7 +4,7 @@ class JobGroupEntity < Grape::Entity
expose :name
expose :size
expose :detailed_status, as: :status, with: StatusEntity
- expose :statuses, as: :jobs, with: JobEntity
+ expose :jobs, with: JobEntity
private
diff --git a/app/serializers/pipeline_entity.rb b/app/serializers/pipeline_entity.rb
index 9c91ab3e098..ad8b4d43e8f 100644
--- a/app/serializers/pipeline_entity.rb
+++ b/app/serializers/pipeline_entity.rb
@@ -15,7 +15,7 @@ class PipelineEntity < Grape::Entity
expose :detailed_status, as: :status, with: StatusEntity
expose :duration
expose :finished_at
- expose :stages, with: StageEntity
+ expose :stages, using: StageEntity
expose :artifacts, using: BuildArtifactEntity
expose :manual_actions, using: BuildActionEntity
end
diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb
index 94b1a6eb6a9..fb4a4721a58 100644
--- a/spec/controllers/projects/pipelines_controller_spec.rb
+++ b/spec/controllers/projects/pipelines_controller_spec.rb
@@ -55,7 +55,8 @@ describe Projects::PipelinesController do
create(:ci_build, pipeline: pipeline)
- expect { get_pipeline_json }.not_to exceed_query_limit(control_count)
+ # The plus 2 is needed to group and sort
+ expect { get_pipeline_json }.not_to exceed_query_limit(control_count + 2)
end
end
diff --git a/spec/fixtures/api/schemas/pipeline.json b/spec/fixtures/api/schemas/pipeline.json
index f8740f48e2c..55511d17b5e 100644
--- a/spec/fixtures/api/schemas/pipeline.json
+++ b/spec/fixtures/api/schemas/pipeline.json
@@ -1 +1,354 @@
-{"id":3,"user":{"name":"Administrator","username":"root","id":1,"state":"active","avatar_url":"http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon","web_url":"http://localhost:3000/root"},"path":"/gitlab-org/gitlab-ce/pipelines/3","details":{"status":{"icon":"icon_status_failed","text":"failed","label":"failed","group":"failed","has_details":true,"details_path":"/gitlab-org/gitlab-ce/pipelines/3","favicon":"/assets/ci_favicons/favicon_status_failed-c2ff6a07bdec821d1dcae59a245fa3bfb0a5199526796ff8707e14640082a79e.ico"},"duration":0,"finished_at":"2017-05-04T18:00:06.936Z","stages":[{"name":"prepare","title":"prepare: failed","status":{"icon":"icon_status_failed","text":"failed","label":"failed","group":"failed","has_details":true,"details_path":"/gitlab-org/gitlab-ce/pipelines/3#prepare","favicon":"/assets/ci_favicons/favicon_status_failed-c2ff6a07bdec821d1dcae59a245fa3bfb0a5199526796ff8707e14640082a79e.ico"},"path":"/gitlab-org/gitlab-ce/pipelines/3#prepare","dropdown_path":"/gitlab-org/gitlab-ce/pipelines/3/stage.json?stage=prepare","groups":[{"name":"knapsack","size":1,"status":{"icon":"icon_status_failed","text":"failed","label":"failed","group":"failed","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_failed-c2ff6a07bdec821d1dcae59a245fa3bfb0a5199526796ff8707e14640082a79e.ico"}},{"name":"setup-test-env","size":1,"status":{"icon":"icon_status_failed","text":"failed","label":"failed","group":"failed","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_failed-c2ff6a07bdec821d1dcae59a245fa3bfb0a5199526796ff8707e14640082a79e.ico"}}]},{"name":"test","title":"test: skipped","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/pipelines/3#test","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"},"path":"/gitlab-org/gitlab-ce/pipelines/3#test","dropdown_path":"/gitlab-org/gitlab-ce/pipelines/3/stage.json?stage=test","groups":[{"name":"bundler:audit","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"bundler:check","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"license_finder","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"lint-doc","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"lint-javascript","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"migration paths","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rake brakeman","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rake db:migrate:reset","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rake db:seed_fu","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rake downtime_check","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rake flay","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rake haml_lint","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rake scss_lint","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec","size":20,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"},"jobs":[{"name":"rspec 0 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/225","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 1 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/167","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 2 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/168","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 3 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/169","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 4 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/170","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 5 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/171","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 6 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/172","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 7 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/173","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 8 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/174","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 9 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/175","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 10 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/176","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 11 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/177","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 12 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/178","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 13 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/179","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 14 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/180","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 15 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/181","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 16 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/182","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 17 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/183","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 18 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/184","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 19 20","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/185","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}}]},{"name":"rspec ruby21","size":20,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"},"jobs":[{"name":"rspec 0 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/196","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 1 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/197","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 2 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/198","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 3 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/199","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 4 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/200","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 5 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/201","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 6 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/202","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 7 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/203","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 8 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/204","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 9 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/205","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 10 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/206","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 11 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/207","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 12 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/208","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 13 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/209","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 14 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/210","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 15 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/211","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 16 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/212","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 17 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/213","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 18 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/214","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"rspec 19 20 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/215","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}}]},{"name":"rubocop","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach","size":10,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"},"jobs":[{"name":"spinach 0 10","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/186","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 1 10","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/187","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 2 10","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/188","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 3 10","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/189","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 4 10","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/190","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 5 10","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/191","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 6 10","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/192","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 7 10","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/193","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 8 10","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/194","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 9 10","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/195","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}}]},{"name":"spinach ruby21","size":10,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"},"jobs":[{"name":"spinach 0 10 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/216","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 1 10 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/217","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 2 10 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/218","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 3 10 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/219","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 4 10 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/220","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 5 10 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/221","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 6 10 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/222","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 7 10 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/223","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 8 10 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/224","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"spinach 9 10 ruby21","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/builds/231","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}}]},{"name":"teaspoon","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}}]},{"name":"post-test","title":"post-test: failed","status":{"icon":"icon_status_failed","text":"failed","label":"failed","group":"failed","has_details":true,"details_path":"/gitlab-org/gitlab-ce/pipelines/3#post-test","favicon":"/assets/ci_favicons/favicon_status_failed-c2ff6a07bdec821d1dcae59a245fa3bfb0a5199526796ff8707e14640082a79e.ico"},"path":"/gitlab-org/gitlab-ce/pipelines/3#post-test","dropdown_path":"/gitlab-org/gitlab-ce/pipelines/3/stage.json?stage=post-test","groups":[{"name":"coverage","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"notify:slack","size":1,"status":{"icon":"icon_status_failed","text":"failed","label":"failed","group":"failed","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_failed-c2ff6a07bdec821d1dcae59a245fa3bfb0a5199526796ff8707e14640082a79e.ico"}},{"name":"trigger_docs","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}},{"name":"update-knapsack","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}}]},{"name":"pages","title":"pages: skipped","status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":true,"details_path":"/gitlab-org/gitlab-ce/pipelines/3#pages","favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"},"path":"/gitlab-org/gitlab-ce/pipelines/3#pages","dropdown_path":"/gitlab-org/gitlab-ce/pipelines/3/stage.json?stage=pages","groups":[{"name":"pages","size":1,"status":{"icon":"icon_status_skipped","text":"skipped","label":"skipped","group":"skipped","has_details":false,"details_path":null,"favicon":"/assets/ci_favicons/favicon_status_skipped-db7236d8fa67af8d7cdcf4d033d4f1481f814c29a152b184190718cd91e42e94.ico"}}]}],"artifacts":[],"manual_actions":[]},"flags":{"latest":true,"triggered":false,"stuck":false,"yaml_errors":false,"retryable":true,"cancelable":false},"ref":{"name":"master","path":"/gitlab-org/gitlab-ce/tree/master","tag":false,"branch":true},"commit":{"id":"12e4f5bd777adb5cc035c84201ef67ad53e01237","short_id":"12e4f5bd","title":"Merge branch 'docs/cycle-analytics-new-image' into 'master'\r","created_at":"2016-11-22T15:35:59.000+00:00","parent_ids":["79030a0e12bd27e54e713c15e44395a092cabee6","c9084654a134906f2442a505bfdc1c2832cdf05f"],"message":"Merge branch 'docs/cycle-analytics-new-image' into 'master'\r\n\r\nAdd new image for Cycle Analytics\r\n\r\nSee merge request !7666","author_name":"Achilleas Pipinellis","author_email":"axilleas@axilleas.me","authored_date":"2016-11-22T15:35:59.000+00:00","committer_name":"Achilleas Pipinellis","committer_email":"axilleas@axilleas.me","committed_date":"2016-11-22T15:35:59.000+00:00","author":null,"author_gravatar_url":"http://www.gravatar.com/avatar/9df074c5e2441bd51c5ed6d4a9494de7?s=80\u0026d=identicon","commit_url":"http://localhost:3000/gitlab-org/gitlab-ce/commit/12e4f5bd777adb5cc035c84201ef67ad53e01237","commit_path":"/gitlab-org/gitlab-ce/commit/12e4f5bd777adb5cc035c84201ef67ad53e01237"},"retry_path":"/gitlab-org/gitlab-ce/pipelines/3/retry","created_at":"2017-05-04T12:37:51.193Z","updated_at":"2017-05-04T18:00:06.945Z"}
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "definitions": {},
+ "id": "http://example.com/example.json",
+ "properties": {
+ "commit": {
+ "id": "/properties/commit",
+ "properties": {
+ "author": {
+ "id": "/properties/commit/properties/author",
+ "type": "null"
+ },
+ "author_email": {
+ "id": "/properties/commit/properties/author_email",
+ "type": "string"
+ },
+ "author_gravatar_url": {
+ "id": "/properties/commit/properties/author_gravatar_url",
+ "type": "string"
+ },
+ "author_name": {
+ "id": "/properties/commit/properties/author_name",
+ "type": "string"
+ },
+ "authored_date": {
+ "id": "/properties/commit/properties/authored_date",
+ "type": "string"
+ },
+ "commit_path": {
+ "id": "/properties/commit/properties/commit_path",
+ "type": "string"
+ },
+ "commit_url": {
+ "id": "/properties/commit/properties/commit_url",
+ "type": "string"
+ },
+ "committed_date": {
+ "id": "/properties/commit/properties/committed_date",
+ "type": "string"
+ },
+ "committer_email": {
+ "id": "/properties/commit/properties/committer_email",
+ "type": "string"
+ },
+ "committer_name": {
+ "id": "/properties/commit/properties/committer_name",
+ "type": "string"
+ },
+ "created_at": {
+ "id": "/properties/commit/properties/created_at",
+ "type": "string"
+ },
+ "id": {
+ "id": "/properties/commit/properties/id",
+ "type": "string"
+ },
+ "message": {
+ "id": "/properties/commit/properties/message",
+ "type": "string"
+ },
+ "parent_ids": {
+ "id": "/properties/commit/properties/parent_ids",
+ "items": {
+ "id": "/properties/commit/properties/parent_ids/items",
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "short_id": {
+ "id": "/properties/commit/properties/short_id",
+ "type": "string"
+ },
+ "title": {
+ "id": "/properties/commit/properties/title",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "created_at": {
+ "id": "/properties/created_at",
+ "type": "string"
+ },
+ "details": {
+ "id": "/properties/details",
+ "properties": {
+ "artifacts": {
+ "id": "/properties/details/properties/artifacts",
+ "items": {},
+ "type": "array"
+ },
+ "duration": {
+ "id": "/properties/details/properties/duration",
+ "type": "integer"
+ },
+ "finished_at": {
+ "id": "/properties/details/properties/finished_at",
+ "type": "string"
+ },
+ "manual_actions": {
+ "id": "/properties/details/properties/manual_actions",
+ "items": {},
+ "type": "array"
+ },
+ "stages": {
+ "id": "/properties/details/properties/stages",
+ "items": {
+ "id": "/properties/details/properties/stages/items",
+ "properties": {
+ "dropdown_path": {
+ "id": "/properties/details/properties/stages/items/properties/dropdown_path",
+ "type": "string"
+ },
+ "groups": {
+ "id": "/properties/details/properties/stages/items/properties/groups",
+ "items": {
+ "id": "/properties/details/properties/stages/items/properties/groups/items",
+ "properties": {
+ "name": {
+ "id": "/properties/details/properties/stages/items/properties/groups/items/properties/name",
+ "type": "string"
+ },
+ "size": {
+ "id": "/properties/details/properties/stages/items/properties/groups/items/properties/size",
+ "type": "integer"
+ },
+ "status": {
+ "id": "/properties/details/properties/stages/items/properties/groups/items/properties/status",
+ "properties": {
+ "details_path": {
+ "id": "/properties/details/properties/stages/items/properties/groups/items/properties/status/properties/details_path",
+ "type": "null"
+ },
+ "favicon": {
+ "id": "/properties/details/properties/stages/items/properties/groups/items/properties/status/properties/favicon",
+ "type": "string"
+ },
+ "group": {
+ "id": "/properties/details/properties/stages/items/properties/groups/items/properties/status/properties/group",
+ "type": "string"
+ },
+ "has_details": {
+ "id": "/properties/details/properties/stages/items/properties/groups/items/properties/status/properties/has_details",
+ "type": "boolean"
+ },
+ "icon": {
+ "id": "/properties/details/properties/stages/items/properties/groups/items/properties/status/properties/icon",
+ "type": "string"
+ },
+ "label": {
+ "id": "/properties/details/properties/stages/items/properties/groups/items/properties/status/properties/label",
+ "type": "string"
+ },
+ "text": {
+ "id": "/properties/details/properties/stages/items/properties/groups/items/properties/status/properties/text",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "name": {
+ "id": "/properties/details/properties/stages/items/properties/name",
+ "type": "string"
+ },
+ "path": {
+ "id": "/properties/details/properties/stages/items/properties/path",
+ "type": "string"
+ },
+ "status": {
+ "id": "/properties/details/properties/stages/items/properties/status",
+ "properties": {
+ "details_path": {
+ "id": "/properties/details/properties/stages/items/properties/status/properties/details_path",
+ "type": "string"
+ },
+ "favicon": {
+ "id": "/properties/details/properties/stages/items/properties/status/properties/favicon",
+ "type": "string"
+ },
+ "group": {
+ "id": "/properties/details/properties/stages/items/properties/status/properties/group",
+ "type": "string"
+ },
+ "has_details": {
+ "id": "/properties/details/properties/stages/items/properties/status/properties/has_details",
+ "type": "boolean"
+ },
+ "icon": {
+ "id": "/properties/details/properties/stages/items/properties/status/properties/icon",
+ "type": "string"
+ },
+ "label": {
+ "id": "/properties/details/properties/stages/items/properties/status/properties/label",
+ "type": "string"
+ },
+ "text": {
+ "id": "/properties/details/properties/stages/items/properties/status/properties/text",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "title": {
+ "id": "/properties/details/properties/stages/items/properties/title",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "status": {
+ "id": "/properties/details/properties/status",
+ "properties": {
+ "details_path": {
+ "id": "/properties/details/properties/status/properties/details_path",
+ "type": "string"
+ },
+ "favicon": {
+ "id": "/properties/details/properties/status/properties/favicon",
+ "type": "string"
+ },
+ "group": {
+ "id": "/properties/details/properties/status/properties/group",
+ "type": "string"
+ },
+ "has_details": {
+ "id": "/properties/details/properties/status/properties/has_details",
+ "type": "boolean"
+ },
+ "icon": {
+ "id": "/properties/details/properties/status/properties/icon",
+ "type": "string"
+ },
+ "label": {
+ "id": "/properties/details/properties/status/properties/label",
+ "type": "string"
+ },
+ "text": {
+ "id": "/properties/details/properties/status/properties/text",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "flags": {
+ "id": "/properties/flags",
+ "properties": {
+ "cancelable": {
+ "id": "/properties/flags/properties/cancelable",
+ "type": "boolean"
+ },
+ "latest": {
+ "id": "/properties/flags/properties/latest",
+ "type": "boolean"
+ },
+ "retryable": {
+ "id": "/properties/flags/properties/retryable",
+ "type": "boolean"
+ },
+ "stuck": {
+ "id": "/properties/flags/properties/stuck",
+ "type": "boolean"
+ },
+ "triggered": {
+ "id": "/properties/flags/properties/triggered",
+ "type": "boolean"
+ },
+ "yaml_errors": {
+ "id": "/properties/flags/properties/yaml_errors",
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "id": {
+ "id": "/properties/id",
+ "type": "integer"
+ },
+ "path": {
+ "id": "/properties/path",
+ "type": "string"
+ },
+ "ref": {
+ "id": "/properties/ref",
+ "properties": {
+ "branch": {
+ "id": "/properties/ref/properties/branch",
+ "type": "boolean"
+ },
+ "name": {
+ "id": "/properties/ref/properties/name",
+ "type": "string"
+ },
+ "path": {
+ "id": "/properties/ref/properties/path",
+ "type": "string"
+ },
+ "tag": {
+ "id": "/properties/ref/properties/tag",
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "retry_path": {
+ "id": "/properties/retry_path",
+ "type": "string"
+ },
+ "updated_at": {
+ "id": "/properties/updated_at",
+ "type": "string"
+ },
+ "user": {
+ "id": "/properties/user",
+ "properties": {
+ "avatar_url": {
+ "id": "/properties/user/properties/avatar_url",
+ "type": "string"
+ },
+ "id": {
+ "id": "/properties/user/properties/id",
+ "type": "integer"
+ },
+ "name": {
+ "id": "/properties/user/properties/name",
+ "type": "string"
+ },
+ "state": {
+ "id": "/properties/user/properties/state",
+ "type": "string"
+ },
+ "username": {
+ "id": "/properties/user/properties/username",
+ "type": "string"
+ },
+ "web_url": {
+ "id": "/properties/user/properties/web_url",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+}
diff --git a/spec/lib/gitlab/ci/status/group/common_spec.rb b/spec/lib/gitlab/ci/status/group/common_spec.rb
index 8a519e925a1..566bb411e96 100644
--- a/spec/lib/gitlab/ci/status/group/common_spec.rb
+++ b/spec/lib/gitlab/ci/status/group/common_spec.rb
@@ -2,8 +2,7 @@ require 'spec_helper'
describe Gitlab::Ci::Status::Group::Common do
subject do
- Class.new(Gitlab::Ci::Status::Group::Core)
- .new(nil, nil).extend(described_class)
+ Gitlab::Ci::Status::Core.new(nil, nil).extend(described_class)
end
it 'does not have action' do
@@ -13,4 +12,8 @@ describe Gitlab::Ci::Status::Group::Common do
it 'has details' do
expect(subject).not_to have_details
end
+
+ it 'has no details_path' do
+ expect(subject.details_path).to be_falsy
+ end
end
diff --git a/spec/lib/gitlab/ci/status/group/factory_spec.rb b/spec/lib/gitlab/ci/status/group/factory_spec.rb
new file mode 100644
index 00000000000..382436e8c3e
--- /dev/null
+++ b/spec/lib/gitlab/ci/status/group/factory_spec.rb
@@ -0,0 +1,11 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Status::Group::Factory do
+ subject { described_class }
+
+ it { is_expected.to respond_to(:common_helpers) }
+
+ it 'inherrits from Status::Factory' do
+ expect(subject).to be < Gitlab::Ci::Status::Factory
+ end
+end
diff --git a/spec/models/ci/group_spec.rb b/spec/models/ci/group_spec.rb
index 7635995770d..798d1e213ab 100644
--- a/spec/models/ci/group_spec.rb
+++ b/spec/models/ci/group_spec.rb
@@ -1,15 +1,15 @@
require 'spec_helper'
describe Ci::Group, models: true do
- subject { described_class.new('test', name: 'rspec', statuses: statuses) }
- let(:statuses) { [] }
+ subject { described_class.new('test', name: 'rspec', jobs: jobs) }
+ let(:jobs) { [] }
describe 'expectations' do
it { is_expected.to include_module(StaticModel) }
it { is_expected.to respond_to(:stage) }
it { is_expected.to respond_to(:name) }
- it { is_expected.to respond_to(:statuses) }
+ it { is_expected.to respond_to(:jobs) }
it { is_expected.to respond_to(:status) }
end
@@ -21,7 +21,7 @@ describe Ci::Group, models: true do
describe '#detailed_status' do
let(:job) { build(:ci_build, :success) }
- let(:statuses) { [job] }
+ let(:jobs) { [job] }
context 'when there is only one item in the group' do
it 'calls the status from the object itself' do
@@ -33,7 +33,7 @@ describe Ci::Group, models: true do
context 'when there are more than 1 commit statuses' do
let(:job1) { build(:ci_build) }
- let(:statuses) { [job, job1] }
+ let(:jobs) { [job, job1] }
it 'fabricates a new Ci::Status object' do
expect(subject.detailed_status(nil)).to be_a(Gitlab::Ci::Status::Created)
diff --git a/spec/serializers/pipeline_entity_spec.rb b/spec/serializers/pipeline_entity_spec.rb
index 8256224652a..93d5a21419d 100644
--- a/spec/serializers/pipeline_entity_spec.rb
+++ b/spec/serializers/pipeline_entity_spec.rb
@@ -20,7 +20,7 @@ describe PipelineEntity do
it 'contains required fields' do
expect(subject).to include :id, :user, :path
- expect(subject).to include :ref, :commit, :stages
+ expect(subject).to include :ref, :commit
expect(subject).to include :updated_at, :created_at
end
@@ -29,7 +29,7 @@ describe PipelineEntity do
expect(subject[:details])
.to include :duration, :finished_at
expect(subject[:details])
- .to include :artifacts, :manual_actions
+ .to include :stages, :artifacts, :manual_actions
expect(subject[:details][:status]).to include :icon, :favicon, :text, :label
end
diff --git a/spec/serializers/stage_entity_spec.rb b/spec/serializers/stage_entity_spec.rb
index 4ab40d08432..0412b2d7741 100644
--- a/spec/serializers/stage_entity_spec.rb
+++ b/spec/serializers/stage_entity_spec.rb
@@ -47,5 +47,13 @@ describe StageEntity do
it 'contains stage title' do
expect(subject[:title]).to eq 'test: passed'
end
+
+ context 'when the jobs should be grouped' do
+ let(:entity) { described_class.new(stage, request: request, grouped: true) }
+
+ it 'exposes the group key' do
+ expect(subject).to include :groups
+ end
+ end
end
end