Restrict serializable_hash to accepted options (#1647)

Restrict tests/impl from passing AMS options into serializable_hash
This commit is contained in:
Benjamin Fleischer
2016-04-11 13:10:18 -05:00
parent aec284844f
commit aad7779a3f
10 changed files with 109 additions and 108 deletions

View File

@@ -4,7 +4,7 @@ module ActiveModelSerializers
def serializable_hash(options = nil)
options ||= {}
serialized_hash = { root => Attributes.new(serializer, instance_options).serializable_hash(options) }
self.class.transform_key_casing!(serialized_hash, options)
self.class.transform_key_casing!(serialized_hash, instance_options)
end
end
end

View File

@@ -43,14 +43,13 @@ module ActiveModelSerializers
# {http://jsonapi.org/format/#crud Requests are transactional, i.e. success or failure}
# {http://jsonapi.org/format/#document-top-level data and errors MUST NOT coexist in the same document.}
def serializable_hash(options = nil)
options ||= {}
def serializable_hash(*)
document = if serializer.success?
success_document(options)
success_document
else
failure_document(options)
failure_document
end
self.class.transform_key_casing!(document, options)
self.class.transform_key_casing!(document, instance_options)
end
# {http://jsonapi.org/format/#document-top-level Primary data}
@@ -68,10 +67,10 @@ module ActiveModelSerializers
# links: toplevel_links,
# jsonapi: toplevel_jsonapi
# }.reject! {|_,v| v.nil? }
def success_document(options)
def success_document
is_collection = serializer.respond_to?(:each)
serializers = is_collection ? serializer : [serializer]
primary_data, included = resource_objects_for(serializers, options)
primary_data, included = resource_objects_for(serializers)
hash = {}
# toplevel_data
@@ -128,7 +127,7 @@ module ActiveModelSerializers
if is_collection && serializer.paginated?
hash[:links] ||= {}
hash[:links].update(pagination_links_for(serializer, options))
hash[:links].update(pagination_links_for(serializer))
end
hash
@@ -148,7 +147,7 @@ module ActiveModelSerializers
# }.reject! {|_,v| v.nil? }
# prs:
# https://github.com/rails-api/active_model_serializers/pull/1004
def failure_document(options)
def failure_document
hash = {}
# PR Please :)
# Jsonapi.add!(hash)
@@ -163,10 +162,10 @@ module ActiveModelSerializers
# ]
if serializer.respond_to?(:each)
hash[:errors] = serializer.flat_map do |error_serializer|
Error.resource_errors(error_serializer, options)
Error.resource_errors(error_serializer, instance_options)
end
else
hash[:errors] = Error.resource_errors(serializer, options)
hash[:errors] = Error.resource_errors(serializer, instance_options)
end
hash
end
@@ -224,21 +223,21 @@ module ActiveModelSerializers
# [x] url helpers https://github.com/rails-api/active_model_serializers/issues/1269
# meta
# [x] https://github.com/rails-api/active_model_serializers/pull/1340
def resource_objects_for(serializers, options)
def resource_objects_for(serializers)
@primary = []
@included = []
@resource_identifiers = Set.new
serializers.each { |serializer| process_resource(serializer, true, options) }
serializers.each { |serializer| process_relationships(serializer, @include_tree, options) }
serializers.each { |serializer| process_resource(serializer, true) }
serializers.each { |serializer| process_relationships(serializer, @include_tree) }
[@primary, @included]
end
def process_resource(serializer, primary, options)
resource_identifier = ResourceIdentifier.new(serializer, options).as_json
def process_resource(serializer, primary)
resource_identifier = ResourceIdentifier.new(serializer, instance_options).as_json
return false unless @resource_identifiers.add?(resource_identifier)
resource_object = resource_object_for(serializer, options)
resource_object = resource_object_for(serializer)
if primary
@primary << resource_object
else
@@ -248,21 +247,21 @@ module ActiveModelSerializers
true
end
def process_relationships(serializer, include_tree, options)
def process_relationships(serializer, include_tree)
serializer.associations(include_tree).each do |association|
process_relationship(association.serializer, include_tree[association.key], options)
process_relationship(association.serializer, include_tree[association.key])
end
end
def process_relationship(serializer, include_tree, options)
def process_relationship(serializer, include_tree)
if serializer.respond_to?(:each)
serializer.each { |s| process_relationship(s, include_tree, options) }
serializer.each { |s| process_relationship(s, include_tree) }
return
end
return unless serializer && serializer.object
return unless process_resource(serializer, false, options)
return unless process_resource(serializer, false)
process_relationships(serializer, include_tree, options)
process_relationships(serializer, include_tree)
end
# {http://jsonapi.org/format/#document-resource-object-attributes Document Resource Object Attributes}
@@ -286,9 +285,9 @@ module ActiveModelSerializers
end
# {http://jsonapi.org/format/#document-resource-objects Document Resource Objects}
def resource_object_for(serializer, options)
def resource_object_for(serializer)
resource_object = cache_check(serializer) do
resource_object = ResourceIdentifier.new(serializer, options).as_json
resource_object = ResourceIdentifier.new(serializer, instance_options).as_json
requested_fields = fieldset && fieldset.fields_for(resource_object[:type])
attributes = attributes_for(serializer, requested_fields)
@@ -297,7 +296,7 @@ module ActiveModelSerializers
end
requested_associations = fieldset.fields_for(resource_object[:type]) || '*'
relationships = relationships_for(serializer, requested_associations, options)
relationships = relationships_for(serializer, requested_associations)
resource_object[:relationships] = relationships if relationships.any?
links = links_for(serializer)
@@ -425,13 +424,13 @@ module ActiveModelSerializers
# id: 'required-id',
# meta: meta
# }.reject! {|_,v| v.nil? }
def relationships_for(serializer, requested_associations, options)
def relationships_for(serializer, requested_associations)
include_tree = ActiveModel::Serializer::IncludeTree.from_include_args(requested_associations)
serializer.associations(include_tree).each_with_object({}) do |association, hash|
hash[association.key] = Relationship.new(
serializer,
association.serializer,
options,
instance_options,
options: association.options,
links: association.links,
meta: association.meta
@@ -499,8 +498,8 @@ module ActiveModelSerializers
# end
# prs:
# https://github.com/rails-api/active_model_serializers/pull/1041
def pagination_links_for(serializer, options)
PaginationLinks.new(serializer.object, options[:serialization_context]).serializable_hash(options)
def pagination_links_for(serializer)
PaginationLinks.new(serializer.object, instance_options).as_json
end
# {http://jsonapi.org/format/#document-meta Docment Meta}

View File

@@ -6,20 +6,25 @@ module ActiveModelSerializers
attr_reader :collection, :context
def initialize(collection, context)
def initialize(collection, adapter_options)
@collection = collection
@context = context
@adapter_options = adapter_options
@context = adapter_options.fetch(:serialization_context)
end
def serializable_hash(options = {})
def as_json
per_page = collection.try(:per_page) || collection.try(:limit_value) || collection.size
pages_from.each_with_object({}) do |(key, value), hash|
params = query_parameters.merge(page: { number: value, size: per_page }).to_query
hash[key] = "#{url(options)}?#{params}"
hash[key] = "#{url(adapter_options)}?#{params}"
end
end
protected
attr_reader :adapter_options
private
def pages_from

View File

@@ -1,8 +1,7 @@
module ActiveModelSerializers
module Adapter
class Null < Base
# Since options param is not being used, underscored naming of the param
def serializable_hash(_options = nil)
def serializable_hash(*)
{}
end
end

View File

@@ -2,7 +2,7 @@ require 'set'
module ActiveModelSerializers
class SerializableResource
ADAPTER_OPTION_KEYS = Set.new([:include, :fields, :adapter, :meta, :meta_key, :links])
ADAPTER_OPTION_KEYS = Set.new([:include, :fields, :adapter, :meta, :meta_key, :links, :serialization_context, :key_transform])
include ActiveModelSerializers::Logging
delegate :serializable_hash, :as_json, :to_json, to: :adapter