Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Document 0.9 rewrite and unreleased changes [ci skip]
Demonstrates that there was unreleased code in 0-8 that does not exist on 0-8-stable https://github.com/rails-api/active_model_serializers/blob/919bb3840107e8176a65d90c0af8ec1e02cef683/CHANGELOG.md specifically: https://github.com/rails-api/active_model_serializers/compare/731528e1f6ac91081f94e25f71ab5ef07cd8c698...919bb3840107e8176a65d90c0af8ec1e02cef683 ``` git branch --contains 919bb3840107e8176a65d90c0af8ec1e02cef683 0-9-stable fractaloop-merge-multiple-nested-associations ``` https://gist.github.com/bf4/c8eb0475a39700794b36 ```patch From 64ed05c484dc0add53183579a347b13d138ee944 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Tue, 7 May 2013 17:51:56 -0700 Subject: [PATCH 01/66] Define serializer as DefaultSerializer if not set --- lib/active_model/array_serializer.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index 518323c..30e7f29 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -81,9 +81,11 @@ def _serializable_array serializer = @options[:each_serializer] elsif item.respond_to?(:active_model_serializer) serializer = item.active_model_serializer + else + serializer = DefaultSerializer end - serializable = serializer ? serializer.new(item, @options) : DefaultSerializer.new(item, @options) + serializable = serializer.new(item, @options) if serializable.respond_to?(:serializable_hash) serializable.serializable_hash From 0e876624ec84651cc473fdb691438c099dc1f3c7 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Wed, 8 May 2013 12:57:07 -0700 Subject: [PATCH 02/66] Move reusable code to a module --- lib/active_model/array_serializer.rb | 34 +++++----------------------------- lib/active_model/serializable.rb | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 29 deletions(-) create mode 100644 lib/active_model/serializable.rb diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index 30e7f29..7442390 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -1,3 +1,4 @@ +require 'active_model/serializable' require "active_support/core_ext/class/attribute" require 'active_support/dependencies' require 'active_support/descendants_tracker' @@ -15,6 +16,8 @@ module ActiveModel class ArraySerializer extend ActiveSupport::DescendantsTracker + include ActiveModel::Serializable + attr_reader :object, :options class_attribute :root @@ -33,35 +36,8 @@ def initialize(object, options={}) @object, @options = object, options end - def meta_key - @options[:meta_key].try(:to_sym) || :meta - end - - def include_meta(hash) - hash[meta_key] = @options[:meta] if @options.has_key?(:meta) - end - - def as_json(*args) - @options[:hash] = hash = {} - @options[:unique_values] = {} - - if root = @options[:root] - hash.merge!(root => serializable_array) - include_meta hash - hash - else - serializable_array - end - end - - def to_json(*args) - if perform_caching? - cache.fetch expand_cache_key([self.class.to_s.underscore, cache_key, 'to-json']) do - super - end - else - super - end + def serialize + serializable_array end def serializable_array diff --git a/lib/active_model/serializable.rb b/lib/active_model/serializable.rb new file mode 100644 index 0000000..d288df4 --- /dev/null +++ b/lib/active_model/serializable.rb @@ -0,0 +1,34 @@ +module ActiveModel + module Serializable + def meta_key + options[:meta_key].try(:to_sym) || :meta + end + + def include_meta(hash) + hash[meta_key] = options[:meta] if options.has_key?(:meta) + end + + def as_json(*args) + options[:hash] = hash = {} + options[:unique_values] = {} + + if root = options[:root] + hash.merge!(root => serialize) + include_meta hash + hash + else + serialize + end + end + + def to_json(*args) + if perform_caching? + cache.fetch expand_cache_key([self.class.to_s.underscore, cache_key, 'to-json']) do + super + end + else + super + end + end + end +end From 76fead041f99f712b515f36cb9a7912abe184205 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Wed, 8 May 2013 13:02:03 -0700 Subject: [PATCH 03/66] Make Serializer reuse Serializable --- lib/active_model/serializable.rb | 8 ++++---- lib/active_model/serializer.rb | 38 +++++++++----------------------------- 2 files changed, 13 insertions(+), 33 deletions(-) diff --git a/lib/active_model/serializable.rb b/lib/active_model/serializable.rb index d288df4..07f53ff 100644 --- a/lib/active_model/serializable.rb +++ b/lib/active_model/serializable.rb @@ -8,11 +8,11 @@ def include_meta(hash) hash[meta_key] = options[:meta] if options.has_key?(:meta) end - def as_json(*args) - options[:hash] = hash = {} - options[:unique_values] = {} + def as_json(args={}) + if root = args[:root] || options[:root] + options[:hash] = hash = {} + options[:unique_values] = {} - if root = options[:root] hash.merge!(root => serialize) include_meta hash hash diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 281af42..a085775 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -1,3 +1,4 @@ +require 'active_model/serializable' require "active_support/core_ext/class/attribute" require "active_support/core_ext/module/anonymous" require 'active_support/dependencies' @@ -40,6 +41,8 @@ module ActiveModel class Serializer extend ActiveSupport::DescendantsTracker + include ActiveModel::Serializable + INCLUDE_METHODS = {} INSTRUMENT = { :serialize => :"serialize.serializer", :associations => :"associations.serializer" } @@ -316,37 +319,14 @@ def url_options @options[:url_options] || {} end - def meta_key - @options[:meta_key].try(:to_sym) || :meta - end - - def include_meta(hash) - hash[meta_key] = @options[:meta] if @options.has_key?(:meta) - end - - def to_json(*args) - if perform_caching? - cache.fetch expand_cache_key([self.class.to_s.underscore, cache_key, 'to-json']) do - super - end - else - super - end - end - # Returns a json representation of the serializable # object including the root. - def as_json(options={}) - if root = options.fetch(:root, @options.fetch(:root, root_name)) - @options[:hash] = hash = {} - @options[:unique_values] = {} - - hash.merge!(root => serializable_hash) - include_meta hash - hash - else - serializable_hash - end + def as_json(args={}) + super(root: args.fetch(:root, options.fetch(:root, root_name))) + end + + def serialize + serializable_hash end # Returns a hash representation of the serializable From aaa08c25ef7cb38053f11ec1b3b892e17b6f385b Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Wed, 8 May 2013 17:49:30 -0700 Subject: [PATCH 04/66] Make include_meta and meta_key private --- lib/active_model/serializable.rb | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/active_model/serializable.rb b/lib/active_model/serializable.rb index 07f53ff..4730053 100644 --- a/lib/active_model/serializable.rb +++ b/lib/active_model/serializable.rb @@ -1,13 +1,5 @@ module ActiveModel module Serializable - def meta_key - options[:meta_key].try(:to_sym) || :meta - end - - def include_meta(hash) - hash[meta_key] = options[:meta] if options.has_key?(:meta) - end - def as_json(args={}) if root = args[:root] || options[:root] options[:hash] = hash = {} @@ -30,5 +22,15 @@ def to_json(*args) super end end + + private + + def include_meta(hash) + hash[meta_key] = options[:meta] if options.has_key?(:meta) + end + + def meta_key + options[:meta_key].try(:to_sym) || :meta + end end end From f179a27ed793aa3b9a93dd666364134a18f43edf Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Thu, 16 May 2013 15:53:39 -0700 Subject: [PATCH 05/66] Add docs to serializable --- lib/active_model/serializable.rb | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/lib/active_model/serializable.rb b/lib/active_model/serializable.rb index 4730053..cf1cbaa 100644 --- a/lib/active_model/serializable.rb +++ b/lib/active_model/serializable.rb @@ -1,4 +1,27 @@ +require 'active_support/core_ext/object/to_json' + module ActiveModel + # Enable classes to Classes including this module to serialize themselves by implementing a serialize method and an options method. + # + # Example: + # + # require 'active_model_serializers' + # + # class MySerializer + # include ActiveModel::Serializable + # + # def initialize + # @options = {} + # end + # + # attr_reader :options + # + # def serialize + # { a: 1 } + # end + # end + # + # puts MySerializer.new.to_json module Serializable def as_json(args={}) if root = args[:root] || options[:root] From 1a8709d71c8e26caf26d0f28d8f3afa93a1cade2 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Wed, 8 May 2013 15:08:58 -0700 Subject: [PATCH 06/66] Move caching to a new module --- lib/active_model/array_serializer.rb | 23 +++------------------ lib/active_model/serializable.rb | 10 --------- lib/active_model/serializer.rb | 31 +++++++--------------------- lib/active_model/serializer/caching.rb | 37 ++++++++++++++++++++++++++++++++++ test/caching_test.rb | 4 ++-- 5 files changed, 49 insertions(+), 56 deletions(-) create mode 100644 lib/active_model/serializer/caching.rb diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index 7442390..5f0df67 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -1,4 +1,5 @@ require 'active_model/serializable' +require 'active_model/serializer/caching' require "active_support/core_ext/class/attribute" require 'active_support/dependencies' require 'active_support/descendants_tracker' @@ -17,6 +18,7 @@ class ArraySerializer extend ActiveSupport::DescendantsTracker include ActiveModel::Serializable + include ActiveModel::Serializer::Caching attr_reader :object, :options @@ -36,22 +38,11 @@ def initialize(object, options={}) @object, @options = object, options end - def serialize + def serialize_object serializable_array end def serializable_array - if perform_caching? - cache.fetch expand_cache_key([self.class.to_s.underscore, cache_key, 'serializable-array']) do - _serializable_array - end - else - _serializable_array - end - end - - private - def _serializable_array @object.map do |item| if @options.has_key? :each_serializer serializer = @options[:each_serializer] @@ -70,13 +61,5 @@ def _serializable_array end end end - - def expand_cache_key(*args) - ActiveSupport::Cache.expand_cache_key(args) - end - - def perform_caching? - perform_caching && cache && respond_to?(:cache_key) - end end end diff --git a/lib/active_model/serializable.rb b/lib/active_model/serializable.rb index cf1cbaa..7122ae2 100644 --- a/lib/active_model/serializable.rb +++ b/lib/active_model/serializable.rb @@ -36,16 +36,6 @@ def as_json(args={}) end end - def to_json(*args) - if perform_caching? - cache.fetch expand_cache_key([self.class.to_s.underscore, cache_key, 'to-json']) do - super - end - else - super - end - end - private def include_meta(hash) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index a085775..2dc8d84 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -1,4 +1,5 @@ require 'active_model/serializable' +require 'active_model/serializer/caching' require "active_support/core_ext/class/attribute" require "active_support/core_ext/module/anonymous" require 'active_support/dependencies' @@ -42,6 +43,7 @@ class Serializer extend ActiveSupport::DescendantsTracker include ActiveModel::Serializable + include ActiveModel::Serializer::Caching INCLUDE_METHODS = {} INSTRUMENT = { :serialize => :"serialize.serializer", :associations => :"associations.serializer" } @@ -73,7 +75,6 @@ def to_s class_attribute :perform_caching class << self - # set perform caching like root def cached(value = true) self.perform_caching = value end @@ -325,20 +326,17 @@ def as_json(args={}) super(root: args.fetch(:root, options.fetch(:root, root_name))) end - def serialize + def serialize_object serializable_hash end # Returns a hash representation of the serializable # object without the root. def serializable_hash - if perform_caching? - cache.fetch expand_cache_key([self.class.to_s.underscore, cache_key, 'serializable-hash']) do - _serializable_hash - end - else - _serializable_hash - end + return nil if @object.nil? + @node = attributes + include_associations! if _embed + @node end def include_associations! @@ -453,21 +451,6 @@ def scope alias :read_attribute_for_serialization :send - def _serializable_hash - return nil if @object.nil? - @node = attributes - include_associations! if _embed - @node - end - - def perform_caching? - perform_caching && cache && respond_to?(:cache_key) - end - - def expand_cache_key(*args) - ActiveSupport::Cache.expand_cache_key(args) - end - # Use ActiveSupport::Notifications to send events to external systems. # The event name is: name.class_name.serializer def instrument(name, payload = {}, &block) diff --git a/lib/active_model/serializer/caching.rb b/lib/active_model/serializer/caching.rb new file mode 100644 index 0000000..50fcf7b --- /dev/null +++ b/lib/active_model/serializer/caching.rb @@ -0,0 +1,37 @@ +module ActiveModel + class Serializer + module Caching + def to_json(*args) + if caching_enabled? + key = expand_cache_key([self.class.to_s.underscore, cache_key, 'to-json']) + cache.fetch key do + super + end + else + super + end + end + + def serialize(*args) + if caching_enabled? + key = expand_cache_key([self.class.to_s.underscore, cache_key, 'serialize']) + cache.fetch key do + serialize_object + end + else + serialize_object + end + end + + private + + def caching_enabled? + perform_caching && cache && respond_to?(:cache_key) + end + + def expand_cache_key(*args) + ActiveSupport::Cache.expand_cache_key(args) + end + end + end +end diff --git a/test/caching_test.rb b/test/caching_test.rb index 869f0f9..ee1dd26 100644 --- a/test/caching_test.rb +++ b/test/caching_test.rb @@ -68,7 +68,7 @@ def cache_key instance.to_json - assert_equal(instance.serializable_hash, serializer.cache.read('serializer/Adam/serializable-hash')) + assert_equal(instance.serializable_hash, serializer.cache.read('serializer/Adam/serialize')) assert_equal(instance.to_json, serializer.cache.read('serializer/Adam/to-json')) end @@ -90,7 +90,7 @@ def cache_key instance.to_json - assert_equal instance.serializable_array, serializer.cache.read('array_serializer/cache-key/serializable-array') + assert_equal instance.serializable_array, serializer.cache.read('array_serializer/cache-key/serialize') assert_equal instance.to_json, serializer.cache.read('array_serializer/cache-key/to-json') end end From 460a2509843d0025ba459c633efda03b2c6bdbea Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Mon, 13 May 2013 11:50:54 -0700 Subject: [PATCH 07/66] Get rid of refine --- lib/active_model/serializer.rb | 10 ++++++---- lib/active_model/serializer/associations.rb | 30 ----------------------------- 2 files changed, 6 insertions(+), 34 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 2dc8d84..855e020 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -129,7 +129,7 @@ def associate(klass, attrs) #:nodoc: define_include_method attr - self._associations[attr] = klass.refine(attr, options) + self._associations[attr] = [klass, options] end end @@ -217,8 +217,8 @@ def schema end associations = {} - _associations.each do |attr, association_class| - association = association_class.new(attr, self) + _associations.each do |attr, (association_class, options)| + association = association_class.new(attr, self, options) if model_association = klass.reflect_on_association(association.name) # Real association. @@ -381,8 +381,10 @@ def include!(name, options={}) end end + klass, opts = _associations[name] association_class = - if klass = _associations[name] + if klass + options = opts.merge options klass elsif value.respond_to?(:to_ary) Associations::HasMany diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 8606b93..35c0dc0 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -2,34 +2,6 @@ module ActiveModel class Serializer module Associations #:nodoc: class Config #:nodoc: - class_attribute :options - - def self.refine(name, class_options) - current_class = self - - Class.new(self) do - singleton_class.class_eval do - define_method(:to_s) do - "(subclass of #{current_class.name})" - end - - alias inspect to_s - end - - self.options = class_options - - # cache the root so we can reuse it without falling back on a per-instance basis - begin - self.options[:root] ||= self.new(name, nil).root - rescue - # this could fail if it needs a valid source, for example a polymorphic association - end - - end - end - - self.options = {} - def initialize(name, source, options={}) @name = name @source = source @@ -39,8 +11,6 @@ def initialize(name, source, options={}) def option(key, default=nil) if @options.key?(key) @options[key] - elsif self.class.options.key?(key) - self.class.options[key] else default end From 5017fb686a1a2b7190ce920cb15ddf537ead83bb Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Mon, 13 May 2013 16:00:16 -0700 Subject: [PATCH 08/66] Associations doesn't depend on source serializer anymore --- lib/active_model/serializer.rb | 4 ++++ lib/active_model/serializer/associations.rb | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 855e020..1e9787b 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -392,6 +392,10 @@ def include!(name, options={}) Associations::HasOne end + options[:value] ||= send(name) + options[:embed] = _embed unless options.key?(:embed) + options[:include] = _root_embed unless options.key?(:include) + options[:serializer_options] = self.options association = association_class.new(name, self, options) if association.embed_ids? diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 35c0dc0..ae88024 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -38,19 +38,19 @@ def name end def associated_object - option(:value) || source_serializer.send(name) + option(:value) end def embed_ids? - [:id, :ids].include? option(:embed, source_serializer._embed) + [:id, :ids].include? option(:embed) end def embed_objects? - [:object, :objects].include? option(:embed, source_serializer._embed) + [:object, :objects].include? option(:embed) end def embed_in_root? - option(:include, source_serializer._root_embed) + option(:include) end def embeddable? @@ -61,9 +61,9 @@ def embeddable? def find_serializable(object) if target_serializer - target_serializer.new(object, source_serializer.options) + target_serializer.new(object, option(:serializer_options)) elsif object.respond_to?(:active_model_serializer) && (ams = object.active_model_serializer) - ams.new(object, source_serializer.options) + ams.new(object, option(:serializer_options)) else object end From ea3566955c59acaf2f2a0f8cecee1bd930d26fbd Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Thu, 16 May 2013 16:30:41 -0700 Subject: [PATCH 09/66] Remove option method just use the reader --- lib/active_model/serializer/associations.rb | 46 +++++++++++++---------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index ae88024..3165258 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -8,16 +8,8 @@ def initialize(name, source, options={}) @options = options end - def option(key, default=nil) - if @options.key?(key) - @options[key] - else - default - end - end - def target_serializer - serializer = option(:serializer) + serializer = options[:serializer] serializer.is_a?(String) ? serializer.constantize : serializer end @@ -26,31 +18,31 @@ def source_serializer end def key - option(:key) || @name + options[:key] || @name end def root - option(:root) || @name + options[:root] || @name end def name - option(:name) || @name + options[:name] || @name end def associated_object - option(:value) + options[:value] end def embed_ids? - [:id, :ids].include? option(:embed) + [:id, :ids].include? options[:embed] end def embed_objects? - [:object, :objects].include? option(:embed) + [:object, :objects].include? options[:embed] end def embed_in_root? - option(:include) + options[:include] end def embeddable? @@ -61,18 +53,20 @@ def embeddable? def find_serializable(object) if target_serializer - target_serializer.new(object, option(:serializer_options)) + target_serializer.new(object, options[:serializer_options]) elsif object.respond_to?(:active_model_serializer) && (ams = object.active_model_serializer) - ams.new(object, option(:serializer_options)) + ams.new(object, options[:serializer_options]) else object end end + + attr_reader :options end class HasMany < Config #:nodoc: def key - if key = option(:key) + if key = options[:key] key elsif embed_ids? "#{@name.to_s.singularize}_ids".to_sym @@ -82,7 +76,7 @@ def key end def embed_key - if key = option(:embed_key) + if key = options[:embed_key] key else :id @@ -103,7 +97,7 @@ def serializables def serialize_ids ids_key = "#{@name.to_s.singularize}_ids".to_sym - if !option(:embed_key) && !source_serializer.respond_to?(@name.to_s) && source_serializer.object.respond_to?(ids_key) + if !options[:embed_key] && !source_serializer.respond_to?(@name.to_s) && source_serializer.object.respond_to?(ids_key) source_serializer.object.read_attribute_for_serialization(ids_key) else associated_object.map do |item| @@ -123,11 +117,11 @@ def embeddable? end def polymorphic? - option :polymorphic + options[:polymorphic] end def root - if root = option(:root) + if root = options[:root] root elsif polymorphic? associated_object.class.to_s.pluralize.demodulize.underscore.to_sym @@ -137,7 +131,7 @@ def root end def key - if key = option(:key) + if key = options[:key] key elsif embed_ids? && !polymorphic? "#{@name}_id".to_sym @@ -147,7 +141,7 @@ def key end def embed_key - if key = option(:embed_key) + if key = options[:embed_key] key else :id @@ -189,7 +183,7 @@ def serialize_ids else nil end - elsif !option(:embed_key) && !source_serializer.respond_to?(@name.to_s) && source_serializer.object.respond_to?(id_key) + elsif !options[:embed_key] && !source_serializer.respond_to?(@name.to_s) && source_serializer.object.respond_to?(id_key) source_serializer.object.read_attribute_for_serialization(id_key) elsif associated_object associated_object.read_attribute_for_serialization(embed_key) From a41de0286ff0890596fe0e8d37912db96edd9453 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Mon, 13 May 2013 17:37:36 -0700 Subject: [PATCH 10/66] Passing options[:hash] is not public API of include! --- lib/active_model/serializer.rb | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 1e9787b..c1cd499 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -352,23 +352,8 @@ def include?(name) end def include!(name, options={}) - # Make sure that if a special options[:hash] was passed in, we generate - # a new unique values hash and don't clobber the original. If the hash - # passed in is the same as the current options hash, use the current - # unique values. - # - # TODO: Should passing in a Hash even be public API here? - unique_values = - if hash = options[:hash] - if @options[:hash] == hash - @options[:unique_values] ||= {} - else - {} - end - else - hash = @options[:hash] - @options[:unique_values] ||= {} - end + hash = @options[:hash] + unique_values = @options[:unique_values] ||= {} node = options[:node] ||= @node value = options[:value] From 9f5e872621758f58b2d88cd6dc148c17add0250a Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Tue, 14 May 2013 15:50:40 -0700 Subject: [PATCH 11/66] Extract id_key to a method --- lib/active_model/serializer/associations.rb | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 3165258..6b4460e 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -69,7 +69,7 @@ def key if key = options[:key] key elsif embed_ids? - "#{@name.to_s.singularize}_ids".to_sym + id_key else @name end @@ -83,6 +83,10 @@ def embed_key end end + def id_key + "#{@name.to_s.singularize}_ids".to_sym + end + def serialize associated_object.map do |item| find_serializable(item).serializable_hash @@ -96,9 +100,8 @@ def serializables end def serialize_ids - ids_key = "#{@name.to_s.singularize}_ids".to_sym - if !options[:embed_key] && !source_serializer.respond_to?(@name.to_s) && source_serializer.object.respond_to?(ids_key) - source_serializer.object.read_attribute_for_serialization(ids_key) + if !options[:embed_key] && !source_serializer.respond_to?(@name.to_s) && source_serializer.object.respond_to?(id_key) + source_serializer.object.read_attribute_for_serialization(id_key) else associated_object.map do |item| item.read_attribute_for_serialization(embed_key) @@ -134,7 +137,7 @@ def key if key = options[:key] key elsif embed_ids? && !polymorphic? - "#{@name}_id".to_sym + id_key else @name end @@ -148,6 +151,10 @@ def embed_key end end + def id_key + "#{@name}_id".to_sym + end + def polymorphic_key associated_object.class.to_s.demodulize.underscore.to_sym end @@ -172,8 +179,6 @@ def serializables end def serialize_ids - id_key = "#{@name}_id".to_sym - if polymorphic? if associated_object { From 0917148617707163b7fb7700dad56863bcc9c94d Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Tue, 14 May 2013 16:20:51 -0700 Subject: [PATCH 12/66] serialize_ids doesn't use source serializer and it's object --- lib/active_model/serializer.rb | 7 ++++++- lib/active_model/serializer/associations.rb | 23 +++++++---------------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index c1cd499..8aa8b71 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -384,7 +384,12 @@ def include!(name, options={}) association = association_class.new(name, self, options) if association.embed_ids? - node[association.key] = association.serialize_ids + node[association.key] = + if options[:embed_key] || self.respond_to?(name) || !self.object.respond_to?(association.id_key) + association.serialize_ids + else + self.object.read_attribute_for_serialization(association.id_key) + end if association.embed_in_root? && hash.nil? raise IncludeError.new(self.class, association.name) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 6b4460e..667774f 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -100,12 +100,8 @@ def serializables end def serialize_ids - if !options[:embed_key] && !source_serializer.respond_to?(@name.to_s) && source_serializer.object.respond_to?(id_key) - source_serializer.object.read_attribute_for_serialization(id_key) - else - associated_object.map do |item| - item.read_attribute_for_serialization(embed_key) - end + associated_object.map do |item| + item.read_attribute_for_serialization(embed_key) end end end @@ -179,21 +175,16 @@ def serializables end def serialize_ids - if polymorphic? - if associated_object + if associated_object + id = associated_object.read_attribute_for_serialization(embed_key) + if polymorphic? { :type => polymorphic_key, - :id => associated_object.read_attribute_for_serialization(embed_key) + :id => id } else - nil + id end - elsif !options[:embed_key] && !source_serializer.respond_to?(@name.to_s) && source_serializer.object.respond_to?(id_key) - source_serializer.object.read_attribute_for_serialization(id_key) - elsif associated_object - associated_object.read_attribute_for_serialization(embed_key) - else - nil end end end From baa690a01a667720c8af4e0a125be2e7e2966026 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Tue, 14 May 2013 16:24:03 -0700 Subject: [PATCH 13/66] Move if object to the top --- lib/active_model/serializer/associations.rb | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 667774f..2ee98f6 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -158,13 +158,15 @@ def polymorphic_key def serialize object = associated_object - if object && polymorphic? - { - :type => polymorphic_key, - polymorphic_key => find_serializable(object).serializable_hash - } - elsif object - find_serializable(object).serializable_hash + if object + if polymorphic? + { + :type => polymorphic_key, + polymorphic_key => find_serializable(object).serializable_hash + } + else + find_serializable(object).serializable_hash + end end end From c1e710aae130d6f99840ad7734b01d58afb31ad1 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Tue, 14 May 2013 16:24:59 -0700 Subject: [PATCH 14/66] Save result of calling associated_object in a local var --- lib/active_model/serializer/associations.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 2ee98f6..30ca5f4 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -177,8 +177,10 @@ def serializables end def serialize_ids - if associated_object - id = associated_object.read_attribute_for_serialization(embed_key) + object = associated_object + + if object + id = object.read_attribute_for_serialization(embed_key) if polymorphic? { :type => polymorphic_key, From c04d452823be8981d5e67967654d66e072383558 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Thu, 16 May 2013 16:31:33 -0700 Subject: [PATCH 15/66] Associations doesn't depend on the source serializer anymore :) --- lib/active_model/serializer.rb | 4 ++-- lib/active_model/serializer/associations.rb | 7 +------ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 8aa8b71..b9a892b 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -218,7 +218,7 @@ def schema associations = {} _associations.each do |attr, (association_class, options)| - association = association_class.new(attr, self, options) + association = association_class.new(attr, options) if model_association = klass.reflect_on_association(association.name) # Real association. @@ -381,7 +381,7 @@ def include!(name, options={}) options[:embed] = _embed unless options.key?(:embed) options[:include] = _root_embed unless options.key?(:include) options[:serializer_options] = self.options - association = association_class.new(name, self, options) + association = association_class.new(name, options) if association.embed_ids? node[association.key] = diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 30ca5f4..140c056 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -2,9 +2,8 @@ module ActiveModel class Serializer module Associations #:nodoc: class Config #:nodoc: - def initialize(name, source, options={}) + def initialize(name, options={}) @name = name - @source = source @options = options end @@ -13,10 +12,6 @@ def target_serializer serializer.is_a?(String) ? serializer.constantize : serializer end - def source_serializer - @source - end - def key options[:key] || @name end From e273a2fb37f508919765a16b2396eab4524993e1 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Tue, 14 May 2013 17:03:59 -0700 Subject: [PATCH 16/66] Use a third argument to pass serializer_options --- lib/active_model/serializer.rb | 3 +-- lib/active_model/serializer/associations.rb | 9 +++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index b9a892b..02a25c5 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -380,8 +380,7 @@ def include!(name, options={}) options[:value] ||= send(name) options[:embed] = _embed unless options.key?(:embed) options[:include] = _root_embed unless options.key?(:include) - options[:serializer_options] = self.options - association = association_class.new(name, options) + association = association_class.new(name, options, self.options) if association.embed_ids? node[association.key] = diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 140c056..c651417 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -2,9 +2,10 @@ module ActiveModel class Serializer module Associations #:nodoc: class Config #:nodoc: - def initialize(name, options={}) + def initialize(name, options={}, serializer_options={}) @name = name @options = options + @serializer_options = serializer_options end def target_serializer @@ -48,15 +49,15 @@ def embeddable? def find_serializable(object) if target_serializer - target_serializer.new(object, options[:serializer_options]) + target_serializer.new(object, serializer_options) elsif object.respond_to?(:active_model_serializer) && (ams = object.active_model_serializer) - ams.new(object, options[:serializer_options]) + ams.new(object, serializer_options) else object end end - attr_reader :options + attr_reader :options, :serializer_options end class HasMany < Config #:nodoc: From 0b9f69529f65bef0662502a96de7a19cc221fe06 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Tue, 14 May 2013 17:05:41 -0700 Subject: [PATCH 17/66] Add default_embed_options --- lib/active_model/serializer.rb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 02a25c5..4fec41a 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -377,9 +377,8 @@ def include!(name, options={}) Associations::HasOne end + options = default_embed_options.merge!(options) options[:value] ||= send(name) - options[:embed] = _embed unless options.key?(:embed) - options[:include] = _root_embed unless options.key?(:include) association = association_class.new(name, options, self.options) if association.embed_ids? @@ -452,6 +451,15 @@ def instrument(name, payload = {}, &block) event_name = INSTRUMENT[name] ActiveSupport::Notifications.instrument(event_name, payload, &block) end + + private + + def default_embed_options + { + :embed => _embed, + :include => _root_embed + } + end end # DefaultSerializer From 251fdc7ba46776f9ac01b281844eddc1e2f6df33 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Tue, 14 May 2013 17:26:38 -0700 Subject: [PATCH 18/66] Rename opts to klass_options --- lib/active_model/serializer.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 4fec41a..3468a09 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -366,10 +366,10 @@ def include!(name, options={}) end end - klass, opts = _associations[name] + klass, klass_options = _associations[name] association_class = if klass - options = opts.merge options + options = klass_options.merge options klass elsif value.respond_to?(:to_ary) Associations::HasMany From 2b22acff53587710594cf56846eeda82579799d8 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Wed, 15 May 2013 12:57:30 -0700 Subject: [PATCH 19/66] Use the readers instead of accessing the ivar directly --- lib/active_model/array_serializer.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index 5f0df67..f647432 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -35,7 +35,8 @@ def cached(value = true) end def initialize(object, options={}) - @object, @options = object, options + @object = object + @options = options end def serialize_object @@ -43,16 +44,16 @@ def serialize_object end def serializable_array - @object.map do |item| - if @options.has_key? :each_serializer - serializer = @options[:each_serializer] + object.map do |item| + if options.has_key? :each_serializer + serializer = options[:each_serializer] elsif item.respond_to?(:active_model_serializer) serializer = item.active_model_serializer else serializer = DefaultSerializer end - serializable = serializer.new(item, @options) + serializable = serializer.new(item, options) if serializable.respond_to?(:serializable_hash) serializable.serializable_hash From 03669a74bcb854352a795ac188a4f25b193a15b3 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Wed, 15 May 2013 14:23:09 -0700 Subject: [PATCH 20/66] Associations::Config is now Associations::Base --- lib/active_model/serializer/associations.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index c651417..42bc754 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -1,7 +1,7 @@ module ActiveModel class Serializer module Associations #:nodoc: - class Config #:nodoc: + class Base #:nodoc: def initialize(name, options={}, serializer_options={}) @name = name @options = options @@ -60,7 +60,7 @@ def find_serializable(object) attr_reader :options, :serializer_options end - class HasMany < Config #:nodoc: + class HasMany < Base #:nodoc: def key if key = options[:key] key @@ -102,7 +102,7 @@ def serialize_ids end end - class HasOne < Config #:nodoc: + class HasOne < Base #:nodoc: def embeddable? if polymorphic? && associated_object.nil? false From 85bf3d2f3d36736f22e2829a64e637bac2e956f9 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Wed, 15 May 2013 15:43:37 -0700 Subject: [PATCH 21/66] Move duplicated code to the Base class --- lib/active_model/serializer/associations.rb | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 42bc754..1a04eda 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -45,6 +45,14 @@ def embeddable? !associated_object.nil? end + def embed_key + if key = options[:embed_key] + key + else + :id + end + end + protected def find_serializable(object) @@ -71,14 +79,6 @@ def key end end - def embed_key - if key = options[:embed_key] - key - else - :id - end - end - def id_key "#{@name.to_s.singularize}_ids".to_sym end @@ -135,14 +135,6 @@ def key end end - def embed_key - if key = options[:embed_key] - key - else - :id - end - end - def id_key "#{@name}_id".to_sym end From f9e189e9d71d86b64e00901769a0ad92b33e9624 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Wed, 15 May 2013 15:50:23 -0700 Subject: [PATCH 22/66] Rename associated_object to object --- lib/active_model/serializer/associations.rb | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 1a04eda..ce6c87c 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -25,7 +25,7 @@ def name options[:name] || @name end - def associated_object + def object options[:value] end @@ -42,7 +42,7 @@ def embed_in_root? end def embeddable? - !associated_object.nil? + !object.nil? end def embed_key @@ -84,19 +84,19 @@ def id_key end def serialize - associated_object.map do |item| + object.map do |item| find_serializable(item).serializable_hash end end def serializables - associated_object.map do |item| + object.map do |item| find_serializable(item) end end def serialize_ids - associated_object.map do |item| + object.map do |item| item.read_attribute_for_serialization(embed_key) end end @@ -104,7 +104,7 @@ def serialize_ids class HasOne < Base #:nodoc: def embeddable? - if polymorphic? && associated_object.nil? + if polymorphic? && object.nil? false else true @@ -119,7 +119,7 @@ def root if root = options[:root] root elsif polymorphic? - associated_object.class.to_s.pluralize.demodulize.underscore.to_sym + object.class.to_s.pluralize.demodulize.underscore.to_sym else @name.to_s.pluralize.to_sym end @@ -140,12 +140,10 @@ def id_key end def polymorphic_key - associated_object.class.to_s.demodulize.underscore.to_sym + object.class.to_s.demodulize.underscore.to_sym end def serialize - object = associated_object - if object if polymorphic? { @@ -159,14 +157,11 @@ def serialize end def serializables - object = associated_object value = object && find_serializable(object) value ? [value] : [] end def serialize_ids - object = associated_object - if object id = object.read_attribute_for_serialization(embed_key) if polymorphic? From 0b648fceac183b8980c97a77113b91d5b11f7fda Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Wed, 15 May 2013 15:51:55 -0700 Subject: [PATCH 23/66] Use private instead of protected, we don't use explicit receivers --- lib/active_model/serializer/associations.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index ce6c87c..f1f7a5b 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -53,7 +53,7 @@ def embed_key end end - protected + private def find_serializable(object) if target_serializer From 2dd0090f13268e0470d0368a9f3776ea8fc8d572 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Wed, 15 May 2013 16:02:03 -0700 Subject: [PATCH 24/66] Reorder methods --- lib/active_model/serializer/associations.rb | 84 +++++++++++++++-------------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index f1f7a5b..711eac4 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -8,9 +8,8 @@ def initialize(name, options={}, serializer_options={}) @serializer_options = serializer_options end - def target_serializer - serializer = options[:serializer] - serializer.is_a?(String) ? serializer.constantize : serializer + def name + options[:name] || @name end def key @@ -21,14 +20,6 @@ def root options[:root] || @name end - def name - options[:name] || @name - end - - def object - options[:value] - end - def embed_ids? [:id, :ids].include? options[:embed] end @@ -45,6 +36,12 @@ def embeddable? !object.nil? end + private + + def object + options[:value] + end + def embed_key if key = options[:embed_key] key @@ -53,7 +50,10 @@ def embed_key end end - private + def target_serializer + serializer = options[:serializer] + serializer.is_a?(String) ? serializer.constantize : serializer + end def find_serializable(object) if target_serializer @@ -83,15 +83,15 @@ def id_key "#{@name.to_s.singularize}_ids".to_sym end - def serialize + def serializables object.map do |item| - find_serializable(item).serializable_hash + find_serializable(item) end end - def serializables + def serialize object.map do |item| - find_serializable(item) + find_serializable(item).serializable_hash end end @@ -103,18 +103,16 @@ def serialize_ids end class HasOne < Base #:nodoc: - def embeddable? - if polymorphic? && object.nil? - false + def key + if key = options[:key] + key + elsif embed_ids? && !polymorphic? + id_key else - true + @name end end - def polymorphic? - options[:polymorphic] - end - def root if root = options[:root] root @@ -125,22 +123,21 @@ def root end end - def key - if key = options[:key] - key - elsif embed_ids? && !polymorphic? - id_key - else - @name - end - end - def id_key "#{@name}_id".to_sym end - def polymorphic_key - object.class.to_s.demodulize.underscore.to_sym + def embeddable? + if polymorphic? && object.nil? + false + else + true + end + end + + def serializables + value = object && find_serializable(object) + value ? [value] : [] end def serialize @@ -156,11 +153,6 @@ def serialize end end - def serializables - value = object && find_serializable(object) - value ? [value] : [] - end - def serialize_ids if object id = object.read_attribute_for_serialization(embed_key) @@ -174,6 +166,16 @@ def serialize_ids end end end + + private + + def polymorphic? + options[:polymorphic] + end + + def polymorphic_key + object.class.to_s.demodulize.underscore.to_sym + end end end end From ea6d712cc85fdabccca6e0631baf9562afc0a484 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Wed, 15 May 2013 16:04:29 -0700 Subject: [PATCH 25/66] key method is defined on subclasses --- lib/active_model/serializer/associations.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 711eac4..5496740 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -12,10 +12,6 @@ def name options[:name] || @name end - def key - options[:key] || @name - end - def root options[:root] || @name end From eb5b27de695407e23e7fd33fb6785b395c5f9de1 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Wed, 15 May 2013 16:13:26 -0700 Subject: [PATCH 26/66] Initialize things in the initialize method and define readers --- lib/active_model/serializer/associations.rb | 41 +++++++++++------------------ 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 5496740..0583d0c 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -3,29 +3,26 @@ class Serializer module Associations #:nodoc: class Base #:nodoc: def initialize(name, options={}, serializer_options={}) - @name = name + @name = name + @object = options[:value] + + @embed = options[:embed] + @embed_key = options[:embed_key] || :id + @embed_in_root = options[:include] + @options = options @serializer_options = serializer_options end - def name - options[:name] || @name - end - - def root - options[:root] || @name - end + attr_reader :root, :name, :embed_in_root + alias :embed_in_root? :embed_in_root def embed_ids? - [:id, :ids].include? options[:embed] + [:id, :ids].include? embed end def embed_objects? - [:object, :objects].include? options[:embed] - end - - def embed_in_root? - options[:include] + [:object, :objects].include? embed end def embeddable? @@ -34,17 +31,7 @@ def embeddable? private - def object - options[:value] - end - - def embed_key - if key = options[:embed_key] - key - else - :id - end - end + attr_reader :object, :embed, :embed_key def target_serializer serializer = options[:serializer] @@ -75,6 +62,10 @@ def key end end + def root + options[:root] || name + end + def id_key "#{@name.to_s.singularize}_ids".to_sym end From ecbb8bf6a663c7dcae2d1e8105fc8663c272054b Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Wed, 15 May 2013 16:14:27 -0700 Subject: [PATCH 27/66] Use == || == instead of include? --- lib/active_model/serializer/associations.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 0583d0c..cacf7db 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -18,11 +18,11 @@ def initialize(name, options={}, serializer_options={}) alias :embed_in_root? :embed_in_root def embed_ids? - [:id, :ids].include? embed + embed == :id || embed == :ids end def embed_objects? - [:object, :objects].include? embed + embed == :object || embed == :objects end def embeddable? From 296970415a88476ed3a7db8e6c4306b9209a2bf7 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Thu, 16 May 2013 17:12:02 -0700 Subject: [PATCH 28/66] Move key method to the base class --- lib/active_model/serializer/associations.rb | 35 +++++++++++++---------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index cacf7db..4ef0417 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -17,9 +17,20 @@ def initialize(name, options={}, serializer_options={}) attr_reader :root, :name, :embed_in_root alias :embed_in_root? :embed_in_root + def key + if key = options[:key] + key + elsif use_id_key? + id_key + else + @name + end + end + def embed_ids? embed == :id || embed == :ids end + alias use_id_key? embed_ids? def embed_objects? embed == :object || embed == :objects @@ -52,16 +63,6 @@ def find_serializable(object) end class HasMany < Base #:nodoc: - def key - if key = options[:key] - key - elsif embed_ids? - id_key - else - @name - end - end - def root options[:root] || name end @@ -90,16 +91,6 @@ def serialize_ids end class HasOne < Base #:nodoc: - def key - if key = options[:key] - key - elsif embed_ids? && !polymorphic? - id_key - else - @name - end - end - def root if root = options[:root] root @@ -156,6 +147,10 @@ def serialize_ids private + def use_id_key? + embed_ids? && !polymorphic? + end + def polymorphic? options[:polymorphic] end From feaefeeef391be98d31005201976bcec5e597189 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Wed, 15 May 2013 16:26:55 -0700 Subject: [PATCH 29/66] Use name reader --- lib/active_model/serializer/associations.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 4ef0417..6a73b38 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -23,7 +23,7 @@ def key elsif use_id_key? id_key else - @name + name end end @@ -68,7 +68,7 @@ def root end def id_key - "#{@name.to_s.singularize}_ids".to_sym + "#{name.to_s.singularize}_ids".to_sym end def serializables @@ -97,12 +97,12 @@ def root elsif polymorphic? object.class.to_s.pluralize.demodulize.underscore.to_sym else - @name.to_s.pluralize.to_sym + name.to_s.pluralize.to_sym end end def id_key - "#{@name}_id".to_sym + "#{name}_id".to_sym end def embeddable? From 1c3f14407c5a670a8bc4bde5b30c6a8492654385 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Wed, 15 May 2013 16:33:12 -0700 Subject: [PATCH 30/66] There's no need for target_serializer method --- lib/active_model/serializer/associations.rb | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 6a73b38..cb65249 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -10,6 +10,9 @@ def initialize(name, options={}, serializer_options={}) @embed_key = options[:embed_key] || :id @embed_in_root = options[:include] + serializer = options[:serializer] + @serializer = serializer.is_a?(String) ? serializer.constantize : serializer + @options = options @serializer_options = serializer_options end @@ -42,16 +45,11 @@ def embeddable? private - attr_reader :object, :embed, :embed_key - - def target_serializer - serializer = options[:serializer] - serializer.is_a?(String) ? serializer.constantize : serializer - end + attr_reader :object, :embed, :embed_key, :serializer def find_serializable(object) - if target_serializer - target_serializer.new(object, serializer_options) + if serializer + serializer.new(object, serializer_options) elsif object.respond_to?(:active_model_serializer) && (ams = object.active_model_serializer) ams.new(object, serializer_options) else From cd9e1066404e4be2e93fb896c33a03326a7b4ff4 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Thu, 16 May 2013 17:26:38 -0700 Subject: [PATCH 31/66] All the attr_readers together --- lib/active_model/serializer/associations.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index cb65249..4b5324c 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -45,7 +45,7 @@ def embeddable? private - attr_reader :object, :embed, :embed_key, :serializer + attr_reader :object, :embed, :embed_key, :serializer, :options, :serializer_options def find_serializable(object) if serializer @@ -56,8 +56,6 @@ def find_serializable(object) object end end - - attr_reader :options, :serializer_options end class HasMany < Base #:nodoc: From e295af2e2b31e03f226a0968693881267a4f5ab6 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino <santiago@wyeworks.com> Date: Thu, 16 May 2013 17:27:25 -0700 Subject: [PATCH 32/66] Move embed methods to initialize and define readers --- lib/active_model/serializer/associations.rb | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 4b5324c..7cfa385 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -6,7 +6,9 @@ def initialize(name, options={}, serializer_options={}) @name = name @object = options[:value] - @embed = options[:embed] + embed = options[:embed] + @embed_ids…
- Loading branch information