active_model_serializers 0.8.3 → 0.10.0.rc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.travis.yml +18 -20
- data/CHANGELOG.md +8 -67
- data/CONTRIBUTING.md +31 -0
- data/Gemfile +14 -1
- data/{MIT-LICENSE.txt → LICENSE.txt} +3 -2
- data/README.md +169 -495
- data/Rakefile +6 -12
- data/active_model_serializers.gemspec +21 -19
- data/lib/action_controller/serialization.rb +36 -27
- data/lib/active_model/serializer/adapter/flatten_json.rb +12 -0
- data/lib/active_model/serializer/adapter/fragment_cache.rb +78 -0
- data/lib/active_model/serializer/adapter/json/fragment_cache.rb +15 -0
- data/lib/active_model/serializer/adapter/json.rb +50 -0
- data/lib/active_model/serializer/adapter/json_api/fragment_cache.rb +23 -0
- data/lib/active_model/serializer/adapter/json_api.rb +156 -0
- data/lib/active_model/serializer/adapter/null.rb +11 -0
- data/lib/active_model/serializer/adapter.rb +96 -0
- data/lib/active_model/serializer/array_serializer.rb +35 -0
- data/lib/active_model/serializer/configuration.rb +13 -0
- data/lib/active_model/serializer/fieldset.rb +40 -0
- data/lib/active_model/serializer/railtie.rb +8 -0
- data/lib/active_model/{serializers → serializer}/version.rb +1 -1
- data/lib/active_model/serializer.rb +177 -440
- data/lib/active_model_serializers.rb +10 -86
- data/lib/generators/serializer/USAGE +0 -3
- data/lib/generators/serializer/resource_override.rb +12 -0
- data/lib/generators/serializer/serializer_generator.rb +1 -6
- data/lib/generators/serializer/templates/serializer.rb +2 -13
- data/test/action_controller/adapter_selector_test.rb +53 -0
- data/test/action_controller/explicit_serializer_test.rb +134 -0
- data/test/action_controller/json_api_linked_test.rb +179 -0
- data/test/action_controller/rescue_from_test.rb +32 -0
- data/test/{serialization_scope_name_test.rb → action_controller/serialization_scope_name_test.rb} +7 -11
- data/test/action_controller/serialization_test.rb +383 -0
- data/test/adapter/fragment_cache_test.rb +27 -0
- data/test/adapter/json/belongs_to_test.rb +48 -0
- data/test/adapter/json/collection_test.rb +73 -0
- data/test/adapter/json/has_many_test.rb +36 -0
- data/test/adapter/json_api/belongs_to_test.rb +157 -0
- data/test/adapter/json_api/collection_test.rb +96 -0
- data/test/adapter/json_api/has_many_embed_ids_test.rb +45 -0
- data/test/adapter/json_api/has_many_explicit_serializer_test.rb +98 -0
- data/test/adapter/json_api/has_many_test.rb +110 -0
- data/test/adapter/json_api/has_one_test.rb +61 -0
- data/test/adapter/json_api/linked_test.rb +283 -0
- data/test/adapter/json_test.rb +34 -0
- data/test/adapter/null_test.rb +25 -0
- data/test/adapter_test.rb +43 -0
- data/test/array_serializer_test.rb +31 -63
- data/test/fixtures/poro.rb +230 -0
- data/test/generators/scaffold_controller_generator_test.rb +24 -0
- data/test/{generators_test.rb → generators/serializer_generator_test.rb} +2 -36
- data/test/serializers/adapter_for_test.rb +50 -0
- data/test/serializers/associations_test.rb +127 -0
- data/test/serializers/attribute_test.rb +38 -0
- data/test/serializers/attributes_test.rb +63 -0
- data/test/serializers/cache_test.rb +138 -0
- data/test/serializers/configuration_test.rb +15 -0
- data/test/serializers/fieldset_test.rb +26 -0
- data/test/serializers/meta_test.rb +107 -0
- data/test/serializers/options_test.rb +21 -0
- data/test/serializers/serializer_for_test.rb +65 -0
- data/test/serializers/urls_test.rb +26 -0
- data/test/test_helper.rb +28 -16
- metadata +109 -43
- data/DESIGN.textile +0 -586
- data/Gemfile.edge +0 -9
- data/bench/perf.rb +0 -43
- data/cruft.md +0 -19
- data/lib/active_model/array_serializer.rb +0 -104
- data/lib/active_model/serializer/associations.rb +0 -233
- data/lib/active_record/serializer_override.rb +0 -16
- data/lib/generators/resource_override.rb +0 -13
- data/test/association_test.rb +0 -592
- data/test/caching_test.rb +0 -96
- data/test/no_serialization_scope_test.rb +0 -34
- data/test/serialization_test.rb +0 -392
- data/test/serializer_support_test.rb +0 -51
- data/test/serializer_test.rb +0 -1465
- data/test/test_fakes.rb +0 -217
| @@ -1,104 +0,0 @@ | |
| 1 | 
            -
            require "active_support/core_ext/class/attribute"
         | 
| 2 | 
            -
            require 'active_support/dependencies'
         | 
| 3 | 
            -
            require 'active_support/descendants_tracker'
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            module ActiveModel
         | 
| 6 | 
            -
              # Active Model Array Serializer
         | 
| 7 | 
            -
              #
         | 
| 8 | 
            -
              # Serializes an Array, checking if each element implements
         | 
| 9 | 
            -
              # the +active_model_serializer+ method.
         | 
| 10 | 
            -
              #
         | 
| 11 | 
            -
              # To disable serialization of root elements:
         | 
| 12 | 
            -
              #
         | 
| 13 | 
            -
              #     ActiveModel::ArraySerializer.root = false
         | 
| 14 | 
            -
              #
         | 
| 15 | 
            -
              class ArraySerializer
         | 
| 16 | 
            -
                extend ActiveSupport::DescendantsTracker
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                attr_reader :object, :options
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                class_attribute :root
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                class_attribute :cache
         | 
| 23 | 
            -
                class_attribute :perform_caching
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                class << self
         | 
| 26 | 
            -
                  # set perform caching like root
         | 
| 27 | 
            -
                  def cached(value = true)
         | 
| 28 | 
            -
                    self.perform_caching = value
         | 
| 29 | 
            -
                  end
         | 
| 30 | 
            -
                end
         | 
| 31 | 
            -
             | 
| 32 | 
            -
                def initialize(object, options={})
         | 
| 33 | 
            -
                  @object, @options = object, options
         | 
| 34 | 
            -
                end
         | 
| 35 | 
            -
             | 
| 36 | 
            -
                def meta_key
         | 
| 37 | 
            -
                  @options[:meta_key].try(:to_sym) || :meta
         | 
| 38 | 
            -
                end
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                def include_meta(hash)
         | 
| 41 | 
            -
                  hash[meta_key] = @options[:meta] if @options.has_key?(:meta)
         | 
| 42 | 
            -
                end
         | 
| 43 | 
            -
             | 
| 44 | 
            -
                def as_json(*args)
         | 
| 45 | 
            -
                  @options[:hash] = hash = {}
         | 
| 46 | 
            -
                  @options[:unique_values] = {}
         | 
| 47 | 
            -
             | 
| 48 | 
            -
                  if root = @options[:root]
         | 
| 49 | 
            -
                    hash.merge!(root => serializable_array)
         | 
| 50 | 
            -
                    include_meta hash
         | 
| 51 | 
            -
                    hash
         | 
| 52 | 
            -
                  else
         | 
| 53 | 
            -
                    serializable_array
         | 
| 54 | 
            -
                  end
         | 
| 55 | 
            -
                end
         | 
| 56 | 
            -
             | 
| 57 | 
            -
                def to_json(*args)
         | 
| 58 | 
            -
                  if perform_caching?
         | 
| 59 | 
            -
                    cache.fetch expand_cache_key([self.class.to_s.underscore, cache_key, 'to-json']) do
         | 
| 60 | 
            -
                      super
         | 
| 61 | 
            -
                    end
         | 
| 62 | 
            -
                  else
         | 
| 63 | 
            -
                    super
         | 
| 64 | 
            -
                  end
         | 
| 65 | 
            -
                end
         | 
| 66 | 
            -
             | 
| 67 | 
            -
                def serializable_array
         | 
| 68 | 
            -
                  if perform_caching?
         | 
| 69 | 
            -
                    cache.fetch expand_cache_key([self.class.to_s.underscore, cache_key, 'serializable-array']) do
         | 
| 70 | 
            -
                      _serializable_array
         | 
| 71 | 
            -
                    end
         | 
| 72 | 
            -
                  else
         | 
| 73 | 
            -
                    _serializable_array
         | 
| 74 | 
            -
                  end
         | 
| 75 | 
            -
                end
         | 
| 76 | 
            -
             | 
| 77 | 
            -
                private
         | 
| 78 | 
            -
                def _serializable_array
         | 
| 79 | 
            -
                  @object.map do |item|
         | 
| 80 | 
            -
                    if @options.has_key? :each_serializer
         | 
| 81 | 
            -
                      serializer = @options[:each_serializer]
         | 
| 82 | 
            -
                    elsif item.respond_to?(:active_model_serializer)
         | 
| 83 | 
            -
                      serializer = item.active_model_serializer
         | 
| 84 | 
            -
                    end
         | 
| 85 | 
            -
             | 
| 86 | 
            -
                    serializable = serializer ? serializer.new(item, @options) : DefaultSerializer.new(item, @options.merge(:root => false))
         | 
| 87 | 
            -
             | 
| 88 | 
            -
                    if serializable.respond_to?(:serializable_hash)
         | 
| 89 | 
            -
                      serializable.serializable_hash
         | 
| 90 | 
            -
                    else
         | 
| 91 | 
            -
                      serializable.as_json
         | 
| 92 | 
            -
                    end
         | 
| 93 | 
            -
                  end
         | 
| 94 | 
            -
                end
         | 
| 95 | 
            -
             | 
| 96 | 
            -
                def expand_cache_key(*args)
         | 
| 97 | 
            -
                  ActiveSupport::Cache.expand_cache_key(args)
         | 
| 98 | 
            -
                end
         | 
| 99 | 
            -
             | 
| 100 | 
            -
                def perform_caching?
         | 
| 101 | 
            -
                  perform_caching && cache && respond_to?(:cache_key)
         | 
| 102 | 
            -
                end
         | 
| 103 | 
            -
              end
         | 
| 104 | 
            -
            end
         | 
| @@ -1,233 +0,0 @@ | |
| 1 | 
            -
            module ActiveModel
         | 
| 2 | 
            -
              class Serializer
         | 
| 3 | 
            -
                module Associations #:nodoc:
         | 
| 4 | 
            -
                  class Config #:nodoc:
         | 
| 5 | 
            -
                    class_attribute :options
         | 
| 6 | 
            -
             | 
| 7 | 
            -
                    def self.refine(name, class_options)
         | 
| 8 | 
            -
                      current_class = self
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                      Class.new(self) do
         | 
| 11 | 
            -
                        singleton_class.class_eval do
         | 
| 12 | 
            -
                          define_method(:to_s) do
         | 
| 13 | 
            -
                            "(subclass of #{current_class.name})"
         | 
| 14 | 
            -
                          end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                          alias inspect to_s
         | 
| 17 | 
            -
                        end
         | 
| 18 | 
            -
             | 
| 19 | 
            -
                        self.options = class_options
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                        # cache the root so we can reuse it without falling back on a per-instance basis
         | 
| 22 | 
            -
                        begin
         | 
| 23 | 
            -
                          self.options[:root] ||= self.new(name, nil).root
         | 
| 24 | 
            -
                        rescue
         | 
| 25 | 
            -
                          # this could fail if it needs a valid source, for example a polymorphic association
         | 
| 26 | 
            -
                        end
         | 
| 27 | 
            -
             | 
| 28 | 
            -
                      end
         | 
| 29 | 
            -
                    end
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                    self.options = {}
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                    def initialize(name, source, options={})
         | 
| 34 | 
            -
                      @name = name
         | 
| 35 | 
            -
                      @source = source
         | 
| 36 | 
            -
                      @options = options
         | 
| 37 | 
            -
                    end
         | 
| 38 | 
            -
             | 
| 39 | 
            -
                    def option(key, default=nil)
         | 
| 40 | 
            -
                      if @options.key?(key)
         | 
| 41 | 
            -
                        @options[key]
         | 
| 42 | 
            -
                      elsif self.class.options.key?(key)
         | 
| 43 | 
            -
                        self.class.options[key]
         | 
| 44 | 
            -
                      else
         | 
| 45 | 
            -
                        default
         | 
| 46 | 
            -
                      end
         | 
| 47 | 
            -
                    end
         | 
| 48 | 
            -
             | 
| 49 | 
            -
                    def target_serializer
         | 
| 50 | 
            -
                      serializer = option(:serializer)
         | 
| 51 | 
            -
                      serializer.is_a?(String) ? serializer.constantize : serializer
         | 
| 52 | 
            -
                    end
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                    def source_serializer
         | 
| 55 | 
            -
                      @source
         | 
| 56 | 
            -
                    end
         | 
| 57 | 
            -
             | 
| 58 | 
            -
                    def key
         | 
| 59 | 
            -
                      option(:key) || @name
         | 
| 60 | 
            -
                    end
         | 
| 61 | 
            -
             | 
| 62 | 
            -
                    def root
         | 
| 63 | 
            -
                      option(:root) || @name
         | 
| 64 | 
            -
                    end
         | 
| 65 | 
            -
             | 
| 66 | 
            -
                    def name
         | 
| 67 | 
            -
                      option(:name) || @name
         | 
| 68 | 
            -
                    end
         | 
| 69 | 
            -
             | 
| 70 | 
            -
                    def associated_object
         | 
| 71 | 
            -
                      option(:value) || source_serializer.send(name)
         | 
| 72 | 
            -
                    end
         | 
| 73 | 
            -
             | 
| 74 | 
            -
                    def embed_ids?
         | 
| 75 | 
            -
                      [:id, :ids].include? option(:embed, source_serializer._embed)
         | 
| 76 | 
            -
                    end
         | 
| 77 | 
            -
             | 
| 78 | 
            -
                    def embed_objects?
         | 
| 79 | 
            -
                      [:object, :objects].include? option(:embed, source_serializer._embed)
         | 
| 80 | 
            -
                    end
         | 
| 81 | 
            -
             | 
| 82 | 
            -
                    def embed_in_root?
         | 
| 83 | 
            -
                      option(:include, source_serializer._root_embed)
         | 
| 84 | 
            -
                    end
         | 
| 85 | 
            -
             | 
| 86 | 
            -
                    def embeddable?
         | 
| 87 | 
            -
                      !associated_object.nil?
         | 
| 88 | 
            -
                    end
         | 
| 89 | 
            -
             | 
| 90 | 
            -
                  protected
         | 
| 91 | 
            -
             | 
| 92 | 
            -
                    def find_serializable(object)
         | 
| 93 | 
            -
                      if target_serializer
         | 
| 94 | 
            -
                        target_serializer.new(object, source_serializer.options)
         | 
| 95 | 
            -
                      elsif object.respond_to?(:active_model_serializer) && (ams = object.active_model_serializer)
         | 
| 96 | 
            -
                        ams.new(object, source_serializer.options)
         | 
| 97 | 
            -
                      else
         | 
| 98 | 
            -
                        object
         | 
| 99 | 
            -
                      end
         | 
| 100 | 
            -
                    end
         | 
| 101 | 
            -
                  end
         | 
| 102 | 
            -
             | 
| 103 | 
            -
                  class HasMany < Config #:nodoc:
         | 
| 104 | 
            -
                    def key
         | 
| 105 | 
            -
                      if key = option(:key)
         | 
| 106 | 
            -
                        key
         | 
| 107 | 
            -
                      elsif embed_ids?
         | 
| 108 | 
            -
                        "#{@name.to_s.singularize}_ids".to_sym
         | 
| 109 | 
            -
                      else
         | 
| 110 | 
            -
                        @name
         | 
| 111 | 
            -
                      end
         | 
| 112 | 
            -
                    end
         | 
| 113 | 
            -
             | 
| 114 | 
            -
                    def embed_key
         | 
| 115 | 
            -
                      if key = option(:embed_key)
         | 
| 116 | 
            -
                        key
         | 
| 117 | 
            -
                      else
         | 
| 118 | 
            -
                        :id
         | 
| 119 | 
            -
                      end
         | 
| 120 | 
            -
                    end
         | 
| 121 | 
            -
             | 
| 122 | 
            -
                    def serialize
         | 
| 123 | 
            -
                      associated_object.map do |item|
         | 
| 124 | 
            -
                        find_serializable(item).serializable_hash
         | 
| 125 | 
            -
                      end
         | 
| 126 | 
            -
                    end
         | 
| 127 | 
            -
             | 
| 128 | 
            -
                    def serializables
         | 
| 129 | 
            -
                      associated_object.map do |item|
         | 
| 130 | 
            -
                        find_serializable(item)
         | 
| 131 | 
            -
                      end
         | 
| 132 | 
            -
                    end
         | 
| 133 | 
            -
             | 
| 134 | 
            -
                    def serialize_ids
         | 
| 135 | 
            -
                      ids_key = "#{@name.to_s.singularize}_ids".to_sym
         | 
| 136 | 
            -
                      if !option(:embed_key) && !source_serializer.respond_to?(@name.to_s) && source_serializer.object.respond_to?(ids_key)
         | 
| 137 | 
            -
                        source_serializer.object.read_attribute_for_serialization(ids_key)
         | 
| 138 | 
            -
                      else
         | 
| 139 | 
            -
                        associated_object.map do |item|
         | 
| 140 | 
            -
                          item.read_attribute_for_serialization(embed_key)
         | 
| 141 | 
            -
                        end
         | 
| 142 | 
            -
                      end
         | 
| 143 | 
            -
                    end
         | 
| 144 | 
            -
                  end
         | 
| 145 | 
            -
             | 
| 146 | 
            -
                  class HasOne < Config #:nodoc:
         | 
| 147 | 
            -
                    def embeddable?
         | 
| 148 | 
            -
                      if polymorphic? && associated_object.nil?
         | 
| 149 | 
            -
                        false
         | 
| 150 | 
            -
                      else
         | 
| 151 | 
            -
                        true
         | 
| 152 | 
            -
                      end
         | 
| 153 | 
            -
                    end
         | 
| 154 | 
            -
             | 
| 155 | 
            -
                    def polymorphic?
         | 
| 156 | 
            -
                      option :polymorphic
         | 
| 157 | 
            -
                    end
         | 
| 158 | 
            -
             | 
| 159 | 
            -
                    def root
         | 
| 160 | 
            -
                      if root = option(:root)
         | 
| 161 | 
            -
                        root
         | 
| 162 | 
            -
                      elsif polymorphic?
         | 
| 163 | 
            -
                        associated_object.class.to_s.pluralize.demodulize.underscore.to_sym
         | 
| 164 | 
            -
                      else
         | 
| 165 | 
            -
                        @name.to_s.pluralize.to_sym
         | 
| 166 | 
            -
                      end
         | 
| 167 | 
            -
                    end
         | 
| 168 | 
            -
             | 
| 169 | 
            -
                    def key
         | 
| 170 | 
            -
                      if key = option(:key)
         | 
| 171 | 
            -
                        key
         | 
| 172 | 
            -
                      elsif embed_ids? && !polymorphic?
         | 
| 173 | 
            -
                        "#{@name}_id".to_sym
         | 
| 174 | 
            -
                      else
         | 
| 175 | 
            -
                        @name
         | 
| 176 | 
            -
                      end
         | 
| 177 | 
            -
                    end
         | 
| 178 | 
            -
             | 
| 179 | 
            -
                    def embed_key
         | 
| 180 | 
            -
                      if key = option(:embed_key)
         | 
| 181 | 
            -
                        key
         | 
| 182 | 
            -
                      else
         | 
| 183 | 
            -
                        :id
         | 
| 184 | 
            -
                      end
         | 
| 185 | 
            -
                    end
         | 
| 186 | 
            -
             | 
| 187 | 
            -
                    def polymorphic_key
         | 
| 188 | 
            -
                      associated_object.class.to_s.demodulize.underscore.to_sym
         | 
| 189 | 
            -
                    end
         | 
| 190 | 
            -
             | 
| 191 | 
            -
                    def serialize
         | 
| 192 | 
            -
                      object = associated_object
         | 
| 193 | 
            -
             | 
| 194 | 
            -
                      if object && polymorphic?
         | 
| 195 | 
            -
                        {
         | 
| 196 | 
            -
                          :type => polymorphic_key,
         | 
| 197 | 
            -
                          polymorphic_key => find_serializable(object).serializable_hash
         | 
| 198 | 
            -
                        }
         | 
| 199 | 
            -
                      elsif object
         | 
| 200 | 
            -
                        find_serializable(object).serializable_hash
         | 
| 201 | 
            -
                      end
         | 
| 202 | 
            -
                    end
         | 
| 203 | 
            -
             | 
| 204 | 
            -
                    def serializables
         | 
| 205 | 
            -
                      object = associated_object
         | 
| 206 | 
            -
                      value = object && find_serializable(object)
         | 
| 207 | 
            -
                      value ? [value] : []
         | 
| 208 | 
            -
                    end
         | 
| 209 | 
            -
             | 
| 210 | 
            -
                    def serialize_ids
         | 
| 211 | 
            -
                      id_key = "#{@name}_id".to_sym
         | 
| 212 | 
            -
             | 
| 213 | 
            -
                      if polymorphic?
         | 
| 214 | 
            -
                        if associated_object
         | 
| 215 | 
            -
                          {
         | 
| 216 | 
            -
                            :type => polymorphic_key,
         | 
| 217 | 
            -
                            :id => associated_object.read_attribute_for_serialization(embed_key)
         | 
| 218 | 
            -
                          }
         | 
| 219 | 
            -
                        else
         | 
| 220 | 
            -
                          nil
         | 
| 221 | 
            -
                        end
         | 
| 222 | 
            -
                      elsif !option(:embed_key) && !source_serializer.respond_to?(@name.to_s) && source_serializer.object.respond_to?(id_key)
         | 
| 223 | 
            -
                        source_serializer.object.read_attribute_for_serialization(id_key)
         | 
| 224 | 
            -
                      elsif associated_object
         | 
| 225 | 
            -
                        associated_object.read_attribute_for_serialization(embed_key)
         | 
| 226 | 
            -
                      else
         | 
| 227 | 
            -
                        nil
         | 
| 228 | 
            -
                      end
         | 
| 229 | 
            -
                    end
         | 
| 230 | 
            -
                  end
         | 
| 231 | 
            -
                end
         | 
| 232 | 
            -
              end
         | 
| 233 | 
            -
            end
         | 
| @@ -1,16 +0,0 @@ | |
| 1 | 
            -
            # We do not recommend that you use AM::S in this way, but if you must, here
         | 
| 2 | 
            -
            # is a mixin that overrides ActiveRecord::Base#to_json and #as_json.
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            module ActiveRecord
         | 
| 5 | 
            -
              module SerializerOverride
         | 
| 6 | 
            -
                def to_json options = {}
         | 
| 7 | 
            -
                  active_model_serializer.new(self).to_json options
         | 
| 8 | 
            -
                end
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                def as_json options={}
         | 
| 11 | 
            -
                  active_model_serializer.new(self).as_json options
         | 
| 12 | 
            -
                end
         | 
| 13 | 
            -
              end
         | 
| 14 | 
            -
             | 
| 15 | 
            -
              Base.send(:include, SerializerOverride)
         | 
| 16 | 
            -
            end
         |