From e0d050d2afbddbed5f6672c8d53e6e7e380ebb55 Mon Sep 17 00:00:00 2001 From: Bruno Bacarini Date: Tue, 11 Aug 2015 14:10:50 -0300 Subject: [PATCH] remove resource and options attr_reader from array_serialize --- lib/active_model/serializable_resource.rb | 2 +- .../serializer/adapter/json_api.rb | 22 ++++++--------- .../adapter/json_api/pagination_links.rb | 25 ++++++----------- .../serializer/array_serializer.rb | 3 +- .../adapter/json_api/pagination_links_test.rb | 28 ++++++++++--------- test/array_serializer_test.rb | 9 ------ 6 files changed, 35 insertions(+), 54 deletions(-) diff --git a/lib/active_model/serializable_resource.rb b/lib/active_model/serializable_resource.rb index fa3fbe03..9115b396 100644 --- a/lib/active_model/serializable_resource.rb +++ b/lib/active_model/serializable_resource.rb @@ -2,7 +2,7 @@ require "set" module ActiveModel class SerializableResource - ADAPTER_OPTION_KEYS = Set.new([:include, :fields, :adapter]) + ADAPTER_OPTION_KEYS = Set.new([:include, :fields, :adapter, :pagination]) def initialize(resource, options = {}) @resource = resource diff --git a/lib/active_model/serializer/adapter/json_api.rb b/lib/active_model/serializer/adapter/json_api.rb index e30c9bf0..02a0ff8f 100644 --- a/lib/active_model/serializer/adapter/json_api.rb +++ b/lib/active_model/serializer/adapter/json_api.rb @@ -20,7 +20,7 @@ module ActiveModel options ||= {} if serializer.respond_to?(:each) serializer.each do |s| - result = self.class.new(s, @options.merge(fieldset: @fieldset)).serializable_hash(options) + result = self.class.new(s, @options.merge(fieldset: @fieldset)).serializable_hash({}) @hash[:data] << result[:data] if result[:included] @@ -29,9 +29,9 @@ module ActiveModel end end - include_pagination_links if serializer.options[:pagination] + add_links(options) else - @hash[:data] = attributes_for_serializer(serializer, options) + @hash[:data] = attributes_for_serializer(serializer, {}) add_resource_relationships(@hash[:data], serializer) end @hash @@ -161,18 +161,14 @@ module ActiveModel end end - def include_pagination_links - return if page_links.empty? - - links? ? @hash[:links].merge!(page_links) : @hash[:links] = page_links + def add_links(options) + links = @hash.fetch(:links) { {} } + resources = serializer.instance_variable_get(:@resource) + @hash[:links] = add_pagination_links(links, resources, options) if @options[:pagination] end - def page_links - @links ||= JsonApi::PaginationLinks.new(serializer.resource, serializer.options).page_links - end - - def links? - !@hash[:links].nil? + def add_pagination_links(links, resources, options) + links.update(JsonApi::PaginationLinks.new(resources).serializable_hash(options)) end end end diff --git a/lib/active_model/serializer/adapter/json_api/pagination_links.rb b/lib/active_model/serializer/adapter/json_api/pagination_links.rb index bbae19ea..add1a8bd 100644 --- a/lib/active_model/serializer/adapter/json_api/pagination_links.rb +++ b/lib/active_model/serializer/adapter/json_api/pagination_links.rb @@ -5,18 +5,19 @@ module ActiveModel class PaginationLinks FIRST_PAGE = 1 - attr_reader :collection, :options + attr_reader :collection - def initialize(collection, options={}) + def initialize(collection) raise_unless_any_gem_installed @collection = collection - @options = options end - def page_links + def serializable_hash(options = {}) pages_from.each_with_object({}) do |(key, value), hash| + query_parameters = options.fetch(:query_parameters) { {} } params = query_parameters.merge(page: { number: value, size: collection.size }).to_query - hash[key] = "#{url}?#{params}" + + hash[key] = "#{url(options)}?#{params}" end end @@ -44,17 +45,9 @@ module ActiveModel "Please install either dependency by adding one of those to your Gemfile" end - def url - return default_url unless options && options[:links] && options[:links][:self] - options[:links][:self] - end - - def default_url - options[:original_url] - end - - def query_parameters - options[:query_parameters] ? options[:query_parameters] : {} + def url(options) + self_link = options.fetch(:links) {{}} + self_link.fetch(:self) {} ? options[:links][:self] : options[:original_url] end end end diff --git a/lib/active_model/serializer/array_serializer.rb b/lib/active_model/serializer/array_serializer.rb index b97dcd8c..f2f916e5 100644 --- a/lib/active_model/serializer/array_serializer.rb +++ b/lib/active_model/serializer/array_serializer.rb @@ -5,7 +5,7 @@ module ActiveModel include Enumerable delegate :each, to: :@objects - attr_reader :root, :meta, :meta_key, :options, :resource + attr_reader :root, :meta, :meta_key def initialize(objects, options = {}) @root = options[:root] @@ -24,7 +24,6 @@ module ActiveModel end @meta = options[:meta] @meta_key = options[:meta_key] - @options = options end def json_key diff --git a/test/adapter/json_api/pagination_links_test.rb b/test/adapter/json_api/pagination_links_test.rb index 1ccfd8a6..cd394a7a 100644 --- a/test/adapter/json_api/pagination_links_test.rb +++ b/test/adapter/json_api/pagination_links_test.rb @@ -64,31 +64,33 @@ module ActiveModel end def test_pagination_links_using_kaminari - serializer = ArraySerializer.new(using_kaminari, pagination: true, original_url: "http://example.com") - adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer) + serializer = ArraySerializer.new(using_kaminari) + adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer, pagination: true) - assert_equal expected_response_with_pagination_links, adapter.serializable_hash + assert_equal expected_response_with_pagination_links, + adapter.serializable_hash(original_url: "http://example.com") end def test_pagination_links_using_will_paginate - serializer = ArraySerializer.new(using_will_paginate, pagination: true, original_url: "http://example.com") - adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer) + serializer = ArraySerializer.new(using_will_paginate) + adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer, pagination: true) - assert_equal expected_response_with_pagination_links, adapter.serializable_hash + assert_equal expected_response_with_pagination_links, + adapter.serializable_hash(original_url: "http://example.com") end def test_pagination_links_with_additional_params - serializer = ArraySerializer.new(using_will_paginate, pagination: true, - original_url: "http://example.com", - query_parameters: { teste: "teste"}) - adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer) + serializer = ArraySerializer.new(using_will_paginate) + adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer, pagination: true) + assert_equal expected_response_with_pagination_links_and_additional_params, + adapter.serializable_hash(original_url: "http://example.com", + query_parameters: { teste: "teste"}) - assert_equal expected_response_with_pagination_links_and_additional_params, adapter.serializable_hash end def test_not_showing_pagination_links - serializer = ArraySerializer.new(using_will_paginate, pagination: false) - adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer) + serializer = ArraySerializer.new(using_will_paginate) + adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer, pagination: false) assert_equal expected_response_without_pagination_links, adapter.serializable_hash end diff --git a/test/array_serializer_test.rb b/test/array_serializer_test.rb index b5eb9384..3eff3ef8 100644 --- a/test/array_serializer_test.rb +++ b/test/array_serializer_test.rb @@ -92,15 +92,6 @@ module ActiveModel serializer = ArraySerializer.new(build_named_collection, root: 'custom_root') assert_equal serializer.json_key, 'custom_roots' end - - def test_pagination_attr_readers - serializer = ArraySerializer.new(@resource, pagination: true) - assert_equal serializer.options[:pagination], true - end - - def test_resource - assert_equal @serializer.resource, @resource - end end end end