From ac06070147f23909dfb5d3468a17a29e6b0cd447 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 2 Feb 2017 13:10:31 +0100 Subject: Use serializer to group environments into folders --- app/serializers/environment_serializer.rb | 39 +++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/app/serializers/environment_serializer.rb b/app/serializers/environment_serializer.rb index 91955542f25..8624392e07f 100644 --- a/app/serializers/environment_serializer.rb +++ b/app/serializers/environment_serializer.rb @@ -1,3 +1,42 @@ class EnvironmentSerializer < BaseSerializer + Struct.new('Item', :name, :size, :id, :latest) + entity EnvironmentEntity + + def with_folders + tap { @itemize = true } + end + + def itemized? + @itemize + end + + def represent(resource, opts = {}) + # resource = paginate(resource) if paginated? + + if itemized? + itemize(resource).map do |item| + { name: item.name, + size: item.size, + latest: super(item.latest, opts) } + end + else + super(resource, opts) + end + end + + private + + def itemize(resource) + items = resource.group(:item_name).order('item_name ASC') + .pluck('COALESCE(environment_type, name) AS item_name', + 'COUNT(*) AS environments_count', + 'MAX(id) AS last_environment_id') + + environments = resource.where(id: items.map(&:last)) + + items.zip(environments).map do |item| + Struct::Item.new(*item.flatten) + end + end end -- cgit v1.2.1 From 030adf12ce6dc8e10a9f0bbb34ff55aa818d7aed Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 2 Feb 2017 14:37:11 +0100 Subject: Encapsulate reused pagination component in a class --- app/serializers/environment_serializer.rb | 10 ++++++++- app/serializers/paginator.rb | 23 +++++++++++++++++++ app/serializers/pipeline_serializer.rb | 37 +++++++++---------------------- 3 files changed, 42 insertions(+), 28 deletions(-) create mode 100644 app/serializers/paginator.rb diff --git a/app/serializers/environment_serializer.rb b/app/serializers/environment_serializer.rb index 8624392e07f..c556424a414 100644 --- a/app/serializers/environment_serializer.rb +++ b/app/serializers/environment_serializer.rb @@ -7,12 +7,20 @@ class EnvironmentSerializer < BaseSerializer tap { @itemize = true } end + def with_pagination(request, response) + tap { @paginator = Paginator.new(request, response) } + end + def itemized? @itemize end + def paginated? + defined?(@paginator) + end + def represent(resource, opts = {}) - # resource = paginate(resource) if paginated? + resource = @paginator.paginate(resource) if paginated? if itemized? itemize(resource).map do |item| diff --git a/app/serializers/paginator.rb b/app/serializers/paginator.rb new file mode 100644 index 00000000000..c5e38a9c8b5 --- /dev/null +++ b/app/serializers/paginator.rb @@ -0,0 +1,23 @@ +class Paginator + include API::Helpers::Pagination + + def initialize(request, response) + @request = request + @response = response + end + + private + + # Methods needed by `API::Helpers::Pagination` + # + + attr_reader :request + + def params + @request.query_parameters + end + + def header(header, value) + @response.headers[header] = value + end +end diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb index b2de6c5832e..7c8dfad3b4b 100644 --- a/app/serializers/pipeline_serializer.rb +++ b/app/serializers/pipeline_serializer.rb @@ -1,41 +1,24 @@ class PipelineSerializer < BaseSerializer class InvalidResourceError < StandardError; end - include API::Helpers::Pagination - Struct.new('Pagination', :request, :response) entity PipelineEntity + def with_pagination(request, response) + tap { @paginator = Paginator.new(request, response) } + end + + def paginated? + defined?(@paginator) + end + def represent(resource, opts = {}) if paginated? raise InvalidResourceError unless resource.respond_to?(:page) - super(paginate(resource.includes(project: :namespace)), opts) + resource = resource.includes(project: :namespace) + super(@paginator.paginate(resource), opts) else super(resource, opts) end end - - def paginated? - defined?(@pagination) - end - - def with_pagination(request, response) - tap { @pagination = Struct::Pagination.new(request, response) } - end - - private - - # Methods needed by `API::Helpers::Pagination` - # - def params - @pagination.request.query_parameters - end - - def request - @pagination.request - end - - def header(header, value) - @pagination.response.headers[header] = value - end end -- cgit v1.2.1 From 888fba1e0566d83fef8b2504b3d68a19dbc133f7 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Fri, 3 Feb 2017 11:30:22 +0100 Subject: Order environments twice in environments serializer --- app/serializers/environment_serializer.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/serializers/environment_serializer.rb b/app/serializers/environment_serializer.rb index c556424a414..2d8d1f20ddc 100644 --- a/app/serializers/environment_serializer.rb +++ b/app/serializers/environment_serializer.rb @@ -42,6 +42,7 @@ class EnvironmentSerializer < BaseSerializer 'MAX(id) AS last_environment_id') environments = resource.where(id: items.map(&:last)) + .order('COALESCE(environment_type, name) ASC') items.zip(environments).map do |item| Struct::Item.new(*item.flatten) -- cgit v1.2.1 From 2150d98af135e7aeab38c35e9e1cf8939f05d616 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Fri, 3 Feb 2017 11:41:02 +0100 Subject: Add specs for environments serializer pagination --- spec/serializers/environment_serializer_spec.rb | 49 +++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/spec/serializers/environment_serializer_spec.rb b/spec/serializers/environment_serializer_spec.rb index 3c37660885d..0eaf6db4761 100644 --- a/spec/serializers/environment_serializer_spec.rb +++ b/spec/serializers/environment_serializer_spec.rb @@ -52,4 +52,53 @@ describe EnvironmentSerializer do expect(json).to be_an_instance_of Array end end + + context 'when used with pagination' do + let(:request) { spy('request') } + let(:response) { spy('response') } + let(:resource) { Environment.all } + let(:pagination) { { page: 1, per_page: 2 } } + + let(:serializer) do + described_class.new(project: project) + .with_pagination(request, response) + end + + before do + allow(request).to receive(:query_parameters) + .and_return(pagination) + end + + subject { serializer.represent(resource) } + + it 'creates a paginated serializer' do + expect(serializer).to be_paginated + end + + context 'when resource is paginatable relation' do + context 'when there is a single environment object in relation' do + before { create(:environment) } + + it 'serializes environments' do + expect(subject.first).to have_key :id + end + end + + context 'when multiple environment objects are serialized' do + before { create_list(:environment, 3) } + + it 'serializes appropriate number of objects' do + expect(subject.count).to be 2 + end + + it 'appends relevant headers' do + expect(response).to receive(:[]=).with('X-Total', '3') + expect(response).to receive(:[]=).with('X-Total-Pages', '2') + expect(response).to receive(:[]=).with('X-Per-Page', '2') + + subject + end + end + end + end end -- cgit v1.2.1 From a5e5e4ac8a02a6f35745bb1b5b118135f63d4003 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Fri, 3 Feb 2017 11:41:23 +0100 Subject: Fix typo in pipeline serializer specs --- spec/serializers/pipeline_serializer_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/serializers/pipeline_serializer_spec.rb b/spec/serializers/pipeline_serializer_spec.rb index 7cbf131e41e..14553acd00c 100644 --- a/spec/serializers/pipeline_serializer_spec.rb +++ b/spec/serializers/pipeline_serializer_spec.rb @@ -52,7 +52,7 @@ describe PipelineSerializer do expect(serializer).to be_paginated end - context 'when resource does is not paginatable' do + context 'when resource is not paginatable' do context 'when a single pipeline object is being serialized' do let(:resource) { create(:ci_empty_pipeline) } let(:pagination) { { page: 1, per_page: 1 } } -- cgit v1.2.1 From 16a72896a21ef065a0b259d32a43dd6554cee1d2 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Fri, 3 Feb 2017 12:03:57 +0100 Subject: Extend environments folders and pagination API specs --- app/serializers/environment_serializer.rb | 2 +- spec/serializers/environment_serializer_spec.rb | 83 +++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) diff --git a/app/serializers/environment_serializer.rb b/app/serializers/environment_serializer.rb index 2d8d1f20ddc..d1991f0f2f1 100644 --- a/app/serializers/environment_serializer.rb +++ b/app/serializers/environment_serializer.rb @@ -3,7 +3,7 @@ class EnvironmentSerializer < BaseSerializer entity EnvironmentEntity - def with_folders + def within_folders tap { @itemize = true } end diff --git a/spec/serializers/environment_serializer_spec.rb b/spec/serializers/environment_serializer_spec.rb index 0eaf6db4761..1b95f1ff198 100644 --- a/spec/serializers/environment_serializer_spec.rb +++ b/spec/serializers/environment_serializer_spec.rb @@ -53,6 +53,68 @@ describe EnvironmentSerializer do end end + context 'when representing environments within folders' do + let(:serializer) do + described_class.new(project: project).within_folders + end + + let(:resource) { Environment.all } + + subject { serializer.represent(resource) } + + context 'when there is a single environment' do + before { create(:environment, name: 'staging') } + + it 'represents one standalone environment' do + expect(subject.count).to eq 1 + expect(subject.first[:name]).to eq 'staging' + expect(subject.first[:size]).to eq 1 + expect(subject.first[:latest][:name]).to eq 'staging' + end + end + + context 'when there are multiple environments in folder' do + before do + create(:environment, name: 'staging/my-review-1') + create(:environment, name: 'staging/my-review-2') + end + + it 'represents one item that is a folder' do + expect(subject.count).to eq 1 + expect(subject.first[:name]).to eq 'staging' + expect(subject.first[:size]).to eq 2 + expect(subject.first[:latest][:name]).to eq 'staging/my-review-2' + expect(subject.first[:latest][:environment_type]).to eq 'staging' + end + end + + context 'when there are multiple folders and standalone environments' do + before do + create(:environment, name: 'staging/my-review-1') + create(:environment, name: 'staging/my-review-2') + create(:environment, name: 'production/my-review-3') + create(:environment, name: 'testing') + end + + it 'represents multiple items grouped within folders' do + expect(subject.count).to eq 3 + + expect(subject.first[:name]).to eq 'production' + expect(subject.first[:size]).to eq 1 + expect(subject.first[:latest][:name]).to eq 'production/my-review-3' + expect(subject.first[:latest][:environment_type]).to eq 'production' + expect(subject.second[:name]).to eq 'staging' + expect(subject.second[:size]).to eq 2 + expect(subject.second[:latest][:name]).to eq 'staging/my-review-2' + expect(subject.second[:latest][:environment_type]).to eq 'staging' + expect(subject.third[:name]).to eq 'testing' + expect(subject.third[:size]).to eq 1 + expect(subject.third[:latest][:name]).to eq 'testing' + expect(subject.third[:latest][:environment_type]).to be_nil + end + end + end + context 'when used with pagination' do let(:request) { spy('request') } let(:response) { spy('response') } @@ -99,6 +161,27 @@ describe EnvironmentSerializer do subject end end + + context 'when grouping environments within folders' do + let(:serializer) do + described_class.new(project: project) + .with_pagination(request, response) + .within_folders + end + + before do + create(:environment, name: 'staging/review-1') + create(:environment, name: 'staging/review-2') + create(:environment, name: 'production/deploy-3') + create(:environment, name: 'testing') + end + + it 'paginates grouped items including ordering' do + expect(subject.count).to eq 2 + expect(subject.first[:name]).to eq 'production' + expect(subject.second[:name]).to eq 'staging' + end + end end end end -- cgit v1.2.1 From 10c1a4d8e4828992afa56bfca6b61eeb328d851e Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 6 Feb 2017 14:34:10 +0100 Subject: Rename `Gitlab::Serialize` module to reuse it later --- app/models/ci/build.rb | 2 +- lib/gitlab/serialize/ci/variables.rb | 27 ------------------------- lib/gitlab/serializer/ci/variables.rb | 27 +++++++++++++++++++++++++ spec/lib/gitlab/serialize/ci/variables_spec.rb | 18 ----------------- spec/lib/gitlab/serializer/ci/variables_spec.rb | 18 +++++++++++++++++ 5 files changed, 46 insertions(+), 46 deletions(-) delete mode 100644 lib/gitlab/serialize/ci/variables.rb create mode 100644 lib/gitlab/serializer/ci/variables.rb delete mode 100644 spec/lib/gitlab/serialize/ci/variables_spec.rb create mode 100644 spec/lib/gitlab/serializer/ci/variables_spec.rb diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index b1f77bf242c..1c01587dd93 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -19,7 +19,7 @@ module Ci end serialize :options - serialize :yaml_variables, Gitlab::Serialize::Ci::Variables + serialize :yaml_variables, Gitlab::Serializer::Ci::Variables validates :coverage, numericality: true, allow_blank: true validates_presence_of :ref diff --git a/lib/gitlab/serialize/ci/variables.rb b/lib/gitlab/serialize/ci/variables.rb deleted file mode 100644 index 3a9443bfcd9..00000000000 --- a/lib/gitlab/serialize/ci/variables.rb +++ /dev/null @@ -1,27 +0,0 @@ -module Gitlab - module Serialize - module Ci - # This serializer could make sure our YAML variables' keys and values - # are always strings. This is more for legacy build data because - # from now on we convert them into strings before saving to database. - module Variables - extend self - - def load(string) - return unless string - - object = YAML.safe_load(string, [Symbol]) - - object.map do |variable| - variable[:key] = variable[:key].to_s - variable - end - end - - def dump(object) - YAML.dump(object) - end - end - end - end -end diff --git a/lib/gitlab/serializer/ci/variables.rb b/lib/gitlab/serializer/ci/variables.rb new file mode 100644 index 00000000000..c059c454eac --- /dev/null +++ b/lib/gitlab/serializer/ci/variables.rb @@ -0,0 +1,27 @@ +module Gitlab + module Serializer + module Ci + # This serializer could make sure our YAML variables' keys and values + # are always strings. This is more for legacy build data because + # from now on we convert them into strings before saving to database. + module Variables + extend self + + def load(string) + return unless string + + object = YAML.safe_load(string, [Symbol]) + + object.map do |variable| + variable[:key] = variable[:key].to_s + variable + end + end + + def dump(object) + YAML.dump(object) + end + end + end + end +end diff --git a/spec/lib/gitlab/serialize/ci/variables_spec.rb b/spec/lib/gitlab/serialize/ci/variables_spec.rb deleted file mode 100644 index 7ea74da5252..00000000000 --- a/spec/lib/gitlab/serialize/ci/variables_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require 'spec_helper' - -describe Gitlab::Serialize::Ci::Variables do - subject do - described_class.load(described_class.dump(object)) - end - - let(:object) do - [{ key: :key, value: 'value', public: true }, - { key: 'wee', value: 1, public: false }] - end - - it 'converts keys into strings' do - is_expected.to eq([ - { key: 'key', value: 'value', public: true }, - { key: 'wee', value: 1, public: false }]) - end -end diff --git a/spec/lib/gitlab/serializer/ci/variables_spec.rb b/spec/lib/gitlab/serializer/ci/variables_spec.rb new file mode 100644 index 00000000000..b810c68ea03 --- /dev/null +++ b/spec/lib/gitlab/serializer/ci/variables_spec.rb @@ -0,0 +1,18 @@ +require 'spec_helper' + +describe Gitlab::Serializer::Ci::Variables do + subject do + described_class.load(described_class.dump(object)) + end + + let(:object) do + [{ key: :key, value: 'value', public: true }, + { key: 'wee', value: 1, public: false }] + end + + it 'converts keys into strings' do + is_expected.to eq([ + { key: 'key', value: 'value', public: true }, + { key: 'wee', value: 1, public: false }]) + end +end -- cgit v1.2.1 From 81eb5c7fd79897d63e733e99b8fc4424dc8ea38a Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 6 Feb 2017 14:47:56 +0100 Subject: Move serializers pagination class to separate module This helps to avoid conflicts with `Paginator` class that seems to be used by some bundled libs. --- app/serializers/environment_serializer.rb | 2 +- app/serializers/paginator.rb | 23 ----------------------- app/serializers/pipeline_serializer.rb | 2 +- lib/gitlab/serializer/pagination.rb | 27 +++++++++++++++++++++++++++ 4 files changed, 29 insertions(+), 25 deletions(-) delete mode 100644 app/serializers/paginator.rb create mode 100644 lib/gitlab/serializer/pagination.rb diff --git a/app/serializers/environment_serializer.rb b/app/serializers/environment_serializer.rb index d1991f0f2f1..5e8634e05d0 100644 --- a/app/serializers/environment_serializer.rb +++ b/app/serializers/environment_serializer.rb @@ -8,7 +8,7 @@ class EnvironmentSerializer < BaseSerializer end def with_pagination(request, response) - tap { @paginator = Paginator.new(request, response) } + tap { @paginator = Gitlab::Serializer::Pagination.new(request, response) } end def itemized? diff --git a/app/serializers/paginator.rb b/app/serializers/paginator.rb deleted file mode 100644 index c5e38a9c8b5..00000000000 --- a/app/serializers/paginator.rb +++ /dev/null @@ -1,23 +0,0 @@ -class Paginator - include API::Helpers::Pagination - - def initialize(request, response) - @request = request - @response = response - end - - private - - # Methods needed by `API::Helpers::Pagination` - # - - attr_reader :request - - def params - @request.query_parameters - end - - def header(header, value) - @response.headers[header] = value - end -end diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb index 7c8dfad3b4b..731ccfe90b3 100644 --- a/app/serializers/pipeline_serializer.rb +++ b/app/serializers/pipeline_serializer.rb @@ -4,7 +4,7 @@ class PipelineSerializer < BaseSerializer entity PipelineEntity def with_pagination(request, response) - tap { @paginator = Paginator.new(request, response) } + tap { @paginator = Gitlab::Serializer::Pagination.new(request, response) } end def paginated? diff --git a/lib/gitlab/serializer/pagination.rb b/lib/gitlab/serializer/pagination.rb new file mode 100644 index 00000000000..d9372f3dcd6 --- /dev/null +++ b/lib/gitlab/serializer/pagination.rb @@ -0,0 +1,27 @@ +module Gitlab + module Serializer + class Pagination + include ::API::Helpers::Pagination + + def initialize(request, response) + @request = request + @response = response + end + + private + + # Methods needed by `API::Helpers::Pagination` + # + + attr_reader :request + + def params + @request.query_parameters + end + + def header(header, value) + @response.headers[header] = value + end + end + end +end -- cgit v1.2.1 From a7420b77bd9b7038af3702d3665faab317048d3a Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 6 Feb 2017 15:07:13 +0100 Subject: Add specs for standalone pagination for serializers --- app/serializers/pipeline_serializer.rb | 7 ++-- lib/gitlab/serializer/pagination.rb | 9 ++++++ spec/lib/gitlab/serializer/pagination_spec.rb | 46 +++++++++++++++++++++++++++ spec/serializers/pipeline_serializer_spec.rb | 4 +-- 4 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 spec/lib/gitlab/serializer/pagination_spec.rb diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb index 731ccfe90b3..245298db3c3 100644 --- a/app/serializers/pipeline_serializer.rb +++ b/app/serializers/pipeline_serializer.rb @@ -12,10 +12,11 @@ class PipelineSerializer < BaseSerializer end def represent(resource, opts = {}) - if paginated? - raise InvalidResourceError unless resource.respond_to?(:page) - + if resource.is_a?(ActiveRecord::Relation) resource = resource.includes(project: :namespace) + end + + if paginated? super(@paginator.paginate(resource), opts) else super(resource, opts) diff --git a/lib/gitlab/serializer/pagination.rb b/lib/gitlab/serializer/pagination.rb index d9372f3dcd6..bf2c0acc729 100644 --- a/lib/gitlab/serializer/pagination.rb +++ b/lib/gitlab/serializer/pagination.rb @@ -1,6 +1,7 @@ module Gitlab module Serializer class Pagination + class InvalidResourceError < StandardError; end include ::API::Helpers::Pagination def initialize(request, response) @@ -8,6 +9,14 @@ module Gitlab @response = response end + def paginate(resource) + if resource.respond_to?(:page) + super(resource) + else + raise InvalidResourceError + end + end + private # Methods needed by `API::Helpers::Pagination` diff --git a/spec/lib/gitlab/serializer/pagination_spec.rb b/spec/lib/gitlab/serializer/pagination_spec.rb new file mode 100644 index 00000000000..43d9782c3b7 --- /dev/null +++ b/spec/lib/gitlab/serializer/pagination_spec.rb @@ -0,0 +1,46 @@ +require 'spec_helper' + +describe Gitlab::Serializer::Pagination do + let(:request) { spy('request') } + let(:response) { spy('response') } + + before do + allow(request) + .to receive(:query_parameters) + .and_return(params) + end + + let(:pagination) { described_class.new(request, response) } + + describe '#paginate' do + subject { pagination.paginate(resource) } + + let(:resource) { User.all } + let(:params) { { page: 1, per_page: 2 } } + + context 'when a multiple resources are present in relation' do + before { create_list(:user, 3) } + + it 'correctly paginates the resource' do + expect(subject.count).to be 2 + end + + it 'appends relevant headers' do + expect(response).to receive(:[]=).with('X-Total', '3') + expect(response).to receive(:[]=).with('X-Total-Pages', '2') + expect(response).to receive(:[]=).with('X-Per-Page', '2') + + subject + end + end + + context 'when an invalid resource is about to be paginated' do + let(:resource) { create(:user) } + + it 'raises error' do + expect { subject }.to raise_error( + described_class::InvalidResourceError) + end + end + end +end diff --git a/spec/serializers/pipeline_serializer_spec.rb b/spec/serializers/pipeline_serializer_spec.rb index 14553acd00c..2aaef03cb93 100644 --- a/spec/serializers/pipeline_serializer_spec.rb +++ b/spec/serializers/pipeline_serializer_spec.rb @@ -58,8 +58,8 @@ describe PipelineSerializer do let(:pagination) { { page: 1, per_page: 1 } } it 'raises error' do - expect { subject } - .to raise_error(PipelineSerializer::InvalidResourceError) + expect { subject }.to raise_error( + Gitlab::Serializer::Pagination::InvalidResourceError) end end end -- cgit v1.2.1 From e4cb073bc037856b3d31e79c081e7ed0d330bdc2 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 7 Feb 2017 13:11:15 +0100 Subject: Simplify implementation of environments serializer --- app/serializers/environment_serializer.rb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/serializers/environment_serializer.rb b/app/serializers/environment_serializer.rb index 5e8634e05d0..b615d01d4f9 100644 --- a/app/serializers/environment_serializer.rb +++ b/app/serializers/environment_serializer.rb @@ -1,5 +1,5 @@ class EnvironmentSerializer < BaseSerializer - Struct.new('Item', :name, :size, :id, :latest) + Item = Struct.new(:name, :size, :latest) entity EnvironmentEntity @@ -41,11 +41,10 @@ class EnvironmentSerializer < BaseSerializer 'COUNT(*) AS environments_count', 'MAX(id) AS last_environment_id') - environments = resource.where(id: items.map(&:last)) - .order('COALESCE(environment_type, name) ASC') + environments = resource.where(id: items.map(&:last)).index_by(&:id) - items.zip(environments).map do |item| - Struct::Item.new(*item.flatten) + items.map do |name, size, id| + Item.new(name, size, environments[id]) end end end -- cgit v1.2.1 From 8753635c44f53c1b7b0266c66f36bf8134680d1a Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 7 Feb 2017 13:13:33 +0100 Subject: Use `#present?` instead of `defined?` in serializers --- app/serializers/environment_serializer.rb | 2 +- app/serializers/pipeline_serializer.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/serializers/environment_serializer.rb b/app/serializers/environment_serializer.rb index b615d01d4f9..fe16a3784c4 100644 --- a/app/serializers/environment_serializer.rb +++ b/app/serializers/environment_serializer.rb @@ -16,7 +16,7 @@ class EnvironmentSerializer < BaseSerializer end def paginated? - defined?(@paginator) + @paginator.present? end def represent(resource, opts = {}) diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb index 245298db3c3..2bc6cf3266e 100644 --- a/app/serializers/pipeline_serializer.rb +++ b/app/serializers/pipeline_serializer.rb @@ -8,7 +8,7 @@ class PipelineSerializer < BaseSerializer end def paginated? - defined?(@paginator) + @paginator.present? end def represent(resource, opts = {}) -- cgit v1.2.1 From e217bb21a6c87b8599cb0ba1636928c2bd0ca814 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 7 Feb 2017 13:15:58 +0100 Subject: Make headers asserts explicit in pagination specs --- spec/lib/gitlab/serializer/pagination_spec.rb | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/spec/lib/gitlab/serializer/pagination_spec.rb b/spec/lib/gitlab/serializer/pagination_spec.rb index 43d9782c3b7..519eb1b274f 100644 --- a/spec/lib/gitlab/serializer/pagination_spec.rb +++ b/spec/lib/gitlab/serializer/pagination_spec.rb @@ -3,11 +3,14 @@ require 'spec_helper' describe Gitlab::Serializer::Pagination do let(:request) { spy('request') } let(:response) { spy('response') } + let(:headers) { spy('headers') } before do - allow(request) - .to receive(:query_parameters) + allow(request).to receive(:query_parameters) .and_return(params) + + allow(response).to receive(:headers) + .and_return(headers) end let(:pagination) { described_class.new(request, response) } @@ -26,9 +29,9 @@ describe Gitlab::Serializer::Pagination do end it 'appends relevant headers' do - expect(response).to receive(:[]=).with('X-Total', '3') - expect(response).to receive(:[]=).with('X-Total-Pages', '2') - expect(response).to receive(:[]=).with('X-Per-Page', '2') + expect(headers).to receive(:[]=).with('X-Total', '3') + expect(headers).to receive(:[]=).with('X-Total-Pages', '2') + expect(headers).to receive(:[]=).with('X-Per-Page', '2') subject end -- cgit v1.2.1