agi_active_model_serializers 0.10.7
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 +7 -0
- data/.github/ISSUE_TEMPLATE.md +29 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +15 -0
- data/.gitignore +35 -0
- data/.rubocop.yml +102 -0
- data/.simplecov +110 -0
- data/.travis.yml +51 -0
- data/CHANGELOG.md +612 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/CONTRIBUTING.md +105 -0
- data/Gemfile +56 -0
- data/MIT-LICENSE +22 -0
- data/README.md +307 -0
- data/Rakefile +103 -0
- data/active_model_serializers.gemspec +63 -0
- data/appveyor.yml +24 -0
- data/bin/bench +171 -0
- data/bin/bench_regression +316 -0
- data/bin/serve_benchmark +39 -0
- data/docs/README.md +41 -0
- data/docs/STYLE.md +58 -0
- data/docs/general/adapters.md +247 -0
- data/docs/general/caching.md +58 -0
- data/docs/general/configuration_options.md +169 -0
- data/docs/general/deserialization.md +100 -0
- data/docs/general/fields.md +31 -0
- data/docs/general/getting_started.md +133 -0
- data/docs/general/instrumentation.md +40 -0
- data/docs/general/key_transforms.md +40 -0
- data/docs/general/logging.md +14 -0
- data/docs/general/rendering.md +279 -0
- data/docs/general/serializers.md +461 -0
- data/docs/how-open-source-maintained.jpg +0 -0
- data/docs/howto/add_pagination_links.md +138 -0
- data/docs/howto/add_relationship_links.md +137 -0
- data/docs/howto/add_root_key.md +55 -0
- data/docs/howto/grape_integration.md +42 -0
- data/docs/howto/outside_controller_use.md +65 -0
- data/docs/howto/passing_arbitrary_options.md +27 -0
- data/docs/howto/serialize_poro.md +32 -0
- data/docs/howto/test.md +154 -0
- data/docs/howto/upgrade_from_0_8_to_0_10.md +265 -0
- data/docs/integrations/ember-and-json-api.md +144 -0
- data/docs/integrations/grape.md +19 -0
- data/docs/jsonapi/errors.md +56 -0
- data/docs/jsonapi/schema.md +151 -0
- data/docs/jsonapi/schema/schema.json +366 -0
- data/docs/rfcs/0000-namespace.md +106 -0
- data/docs/rfcs/template.md +15 -0
- data/lib/action_controller/serialization.rb +66 -0
- data/lib/active_model/serializable_resource.rb +11 -0
- data/lib/active_model/serializer.rb +231 -0
- data/lib/active_model/serializer/adapter.rb +24 -0
- data/lib/active_model/serializer/adapter/attributes.rb +15 -0
- data/lib/active_model/serializer/adapter/base.rb +18 -0
- data/lib/active_model/serializer/adapter/json.rb +15 -0
- data/lib/active_model/serializer/adapter/json_api.rb +15 -0
- data/lib/active_model/serializer/adapter/null.rb +15 -0
- data/lib/active_model/serializer/array_serializer.rb +12 -0
- data/lib/active_model/serializer/association.rb +34 -0
- data/lib/active_model/serializer/attribute.rb +25 -0
- data/lib/active_model/serializer/belongs_to_reflection.rb +7 -0
- data/lib/active_model/serializer/collection_reflection.rb +7 -0
- data/lib/active_model/serializer/collection_serializer.rb +87 -0
- data/lib/active_model/serializer/concerns/associations.rb +102 -0
- data/lib/active_model/serializer/concerns/attributes.rb +82 -0
- data/lib/active_model/serializer/concerns/caching.rb +292 -0
- data/lib/active_model/serializer/concerns/configuration.rb +59 -0
- data/lib/active_model/serializer/concerns/links.rb +35 -0
- data/lib/active_model/serializer/concerns/meta.rb +29 -0
- data/lib/active_model/serializer/concerns/type.rb +25 -0
- data/lib/active_model/serializer/error_serializer.rb +14 -0
- data/lib/active_model/serializer/errors_serializer.rb +32 -0
- data/lib/active_model/serializer/field.rb +90 -0
- data/lib/active_model/serializer/fieldset.rb +31 -0
- data/lib/active_model/serializer/has_many_reflection.rb +7 -0
- data/lib/active_model/serializer/has_one_reflection.rb +7 -0
- data/lib/active_model/serializer/lint.rb +150 -0
- data/lib/active_model/serializer/null.rb +17 -0
- data/lib/active_model/serializer/reflection.rb +163 -0
- data/lib/active_model/serializer/singular_reflection.rb +7 -0
- data/lib/active_model/serializer/version.rb +5 -0
- data/lib/active_model_serializers.rb +53 -0
- data/lib/active_model_serializers/adapter.rb +98 -0
- data/lib/active_model_serializers/adapter/attributes.rb +13 -0
- data/lib/active_model_serializers/adapter/base.rb +83 -0
- data/lib/active_model_serializers/adapter/json.rb +21 -0
- data/lib/active_model_serializers/adapter/json_api.rb +517 -0
- data/lib/active_model_serializers/adapter/json_api/deserialization.rb +213 -0
- data/lib/active_model_serializers/adapter/json_api/error.rb +96 -0
- data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +49 -0
- data/lib/active_model_serializers/adapter/json_api/link.rb +83 -0
- data/lib/active_model_serializers/adapter/json_api/meta.rb +37 -0
- data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +69 -0
- data/lib/active_model_serializers/adapter/json_api/relationship.rb +63 -0
- data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +51 -0
- data/lib/active_model_serializers/adapter/null.rb +9 -0
- data/lib/active_model_serializers/callbacks.rb +55 -0
- data/lib/active_model_serializers/deprecate.rb +54 -0
- data/lib/active_model_serializers/deserialization.rb +15 -0
- data/lib/active_model_serializers/json_pointer.rb +14 -0
- data/lib/active_model_serializers/logging.rb +122 -0
- data/lib/active_model_serializers/lookup_chain.rb +80 -0
- data/lib/active_model_serializers/model.rb +71 -0
- data/lib/active_model_serializers/railtie.rb +48 -0
- data/lib/active_model_serializers/register_jsonapi_renderer.rb +78 -0
- data/lib/active_model_serializers/serializable_resource.rb +82 -0
- data/lib/active_model_serializers/serialization_context.rb +39 -0
- data/lib/active_model_serializers/test.rb +7 -0
- data/lib/active_model_serializers/test/schema.rb +138 -0
- data/lib/active_model_serializers/test/serializer.rb +125 -0
- data/lib/generators/rails/USAGE +6 -0
- data/lib/generators/rails/resource_override.rb +10 -0
- data/lib/generators/rails/serializer_generator.rb +36 -0
- data/lib/generators/rails/templates/serializer.rb.erb +15 -0
- data/lib/grape/active_model_serializers.rb +16 -0
- data/lib/grape/formatters/active_model_serializers.rb +32 -0
- data/lib/grape/helpers/active_model_serializers.rb +17 -0
- data/test/action_controller/adapter_selector_test.rb +53 -0
- data/test/action_controller/explicit_serializer_test.rb +135 -0
- data/test/action_controller/json/include_test.rb +246 -0
- data/test/action_controller/json_api/deserialization_test.rb +112 -0
- data/test/action_controller/json_api/errors_test.rb +40 -0
- data/test/action_controller/json_api/fields_test.rb +66 -0
- data/test/action_controller/json_api/linked_test.rb +202 -0
- data/test/action_controller/json_api/pagination_test.rb +116 -0
- data/test/action_controller/json_api/transform_test.rb +189 -0
- data/test/action_controller/lookup_proc_test.rb +49 -0
- data/test/action_controller/namespace_lookup_test.rb +232 -0
- data/test/action_controller/serialization_scope_name_test.rb +229 -0
- data/test/action_controller/serialization_test.rb +472 -0
- data/test/active_model_serializers/adapter_for_test.rb +208 -0
- data/test/active_model_serializers/json_pointer_test.rb +22 -0
- data/test/active_model_serializers/logging_test.rb +77 -0
- data/test/active_model_serializers/model_test.rb +69 -0
- data/test/active_model_serializers/railtie_test_isolated.rb +63 -0
- data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +161 -0
- data/test/active_model_serializers/serialization_context_test_isolated.rb +71 -0
- data/test/active_model_serializers/test/schema_test.rb +131 -0
- data/test/active_model_serializers/test/serializer_test.rb +62 -0
- data/test/active_record_test.rb +9 -0
- data/test/adapter/attributes_test.rb +43 -0
- data/test/adapter/deprecation_test.rb +100 -0
- data/test/adapter/json/belongs_to_test.rb +45 -0
- data/test/adapter/json/collection_test.rb +104 -0
- data/test/adapter/json/has_many_test.rb +45 -0
- data/test/adapter/json/transform_test.rb +93 -0
- data/test/adapter/json_api/belongs_to_test.rb +155 -0
- data/test/adapter/json_api/collection_test.rb +96 -0
- data/test/adapter/json_api/errors_test.rb +76 -0
- data/test/adapter/json_api/fields_test.rb +96 -0
- data/test/adapter/json_api/has_many_embed_ids_test.rb +43 -0
- data/test/adapter/json_api/has_many_explicit_serializer_test.rb +96 -0
- data/test/adapter/json_api/has_many_test.rb +165 -0
- data/test/adapter/json_api/has_one_test.rb +80 -0
- data/test/adapter/json_api/include_data_if_sideloaded_test.rb +168 -0
- data/test/adapter/json_api/json_api_test.rb +33 -0
- data/test/adapter/json_api/linked_test.rb +413 -0
- data/test/adapter/json_api/links_test.rb +95 -0
- data/test/adapter/json_api/pagination_links_test.rb +193 -0
- data/test/adapter/json_api/parse_test.rb +137 -0
- data/test/adapter/json_api/relationship_test.rb +397 -0
- data/test/adapter/json_api/resource_identifier_test.rb +110 -0
- data/test/adapter/json_api/resource_meta_test.rb +100 -0
- data/test/adapter/json_api/toplevel_jsonapi_test.rb +82 -0
- data/test/adapter/json_api/transform_test.rb +512 -0
- data/test/adapter/json_api/type_test.rb +61 -0
- data/test/adapter/json_test.rb +46 -0
- data/test/adapter/null_test.rb +22 -0
- data/test/adapter/polymorphic_test.rb +171 -0
- data/test/adapter_test.rb +67 -0
- data/test/array_serializer_test.rb +22 -0
- data/test/benchmark/app.rb +65 -0
- data/test/benchmark/benchmarking_support.rb +67 -0
- data/test/benchmark/bm_active_record.rb +81 -0
- data/test/benchmark/bm_adapter.rb +38 -0
- data/test/benchmark/bm_caching.rb +119 -0
- data/test/benchmark/bm_lookup_chain.rb +83 -0
- data/test/benchmark/bm_transform.rb +45 -0
- data/test/benchmark/config.ru +3 -0
- data/test/benchmark/controllers.rb +83 -0
- data/test/benchmark/fixtures.rb +219 -0
- data/test/cache_test.rb +595 -0
- data/test/collection_serializer_test.rb +123 -0
- data/test/fixtures/active_record.rb +113 -0
- data/test/fixtures/poro.rb +232 -0
- data/test/generators/scaffold_controller_generator_test.rb +24 -0
- data/test/generators/serializer_generator_test.rb +74 -0
- data/test/grape_test.rb +178 -0
- data/test/lint_test.rb +49 -0
- data/test/logger_test.rb +20 -0
- data/test/poro_test.rb +9 -0
- data/test/serializable_resource_test.rb +79 -0
- data/test/serializers/association_macros_test.rb +37 -0
- data/test/serializers/associations_test.rb +383 -0
- data/test/serializers/attribute_test.rb +153 -0
- data/test/serializers/attributes_test.rb +52 -0
- data/test/serializers/caching_configuration_test_isolated.rb +170 -0
- data/test/serializers/configuration_test.rb +32 -0
- data/test/serializers/fieldset_test.rb +14 -0
- data/test/serializers/meta_test.rb +202 -0
- data/test/serializers/options_test.rb +32 -0
- data/test/serializers/read_attribute_for_serialization_test.rb +79 -0
- data/test/serializers/root_test.rb +21 -0
- data/test/serializers/serialization_test.rb +55 -0
- data/test/serializers/serializer_for_test.rb +136 -0
- data/test/serializers/serializer_for_with_namespace_test.rb +88 -0
- data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
- data/test/support/isolated_unit.rb +82 -0
- data/test/support/rails5_shims.rb +53 -0
- data/test/support/rails_app.rb +36 -0
- data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
- data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +6 -0
- data/test/support/schemas/custom/show.json +7 -0
- data/test/support/schemas/hyper_schema.json +93 -0
- data/test/support/schemas/render_using_json_api.json +43 -0
- data/test/support/schemas/simple_json_pointers.json +10 -0
- data/test/support/serialization_testing.rb +71 -0
- data/test/test_helper.rb +58 -0
- metadata +602 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
require 'set'
|
|
2
|
+
module ActiveModelSerializers
|
|
3
|
+
module Test
|
|
4
|
+
module Serializer
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
included do
|
|
8
|
+
setup :setup_serialization_subscriptions
|
|
9
|
+
teardown :teardown_serialization_subscriptions
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Asserts that the request was rendered with the appropriate serializers.
|
|
13
|
+
#
|
|
14
|
+
# # assert that the "PostSerializer" serializer was rendered
|
|
15
|
+
# assert_serializer "PostSerializer"
|
|
16
|
+
#
|
|
17
|
+
# # return a custom error message
|
|
18
|
+
# assert_serializer "PostSerializer", "PostSerializer not rendered"
|
|
19
|
+
#
|
|
20
|
+
# # assert that the instance of PostSerializer was rendered
|
|
21
|
+
# assert_serializer PostSerializer
|
|
22
|
+
#
|
|
23
|
+
# # assert that the "PostSerializer" serializer was rendered
|
|
24
|
+
# assert_serializer :post_serializer
|
|
25
|
+
#
|
|
26
|
+
# # assert that the rendered serializer starts with "Post"
|
|
27
|
+
# assert_serializer %r{\APost.+\Z}
|
|
28
|
+
#
|
|
29
|
+
# # assert that no serializer was rendered
|
|
30
|
+
# assert_serializer nil
|
|
31
|
+
#
|
|
32
|
+
def assert_serializer(expectation, message = nil)
|
|
33
|
+
@assert_serializer.expectation = expectation
|
|
34
|
+
@assert_serializer.message = message
|
|
35
|
+
@assert_serializer.response = response
|
|
36
|
+
assert(@assert_serializer.matches?, @assert_serializer.message)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class AssertSerializer
|
|
40
|
+
attr_reader :serializers, :message
|
|
41
|
+
attr_accessor :response, :expectation
|
|
42
|
+
|
|
43
|
+
def initialize
|
|
44
|
+
@serializers = Set.new
|
|
45
|
+
@_subscribers = []
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def message=(message)
|
|
49
|
+
@message = message || "expecting <#{expectation.inspect}> but rendering with <#{serializers.to_a}>"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def matches?
|
|
53
|
+
# Force body to be read in case the template is being streamed.
|
|
54
|
+
response.body
|
|
55
|
+
|
|
56
|
+
case expectation
|
|
57
|
+
when a_serializer? then matches_class?
|
|
58
|
+
when Symbol then matches_symbol?
|
|
59
|
+
when String then matches_string?
|
|
60
|
+
when Regexp then matches_regexp?
|
|
61
|
+
when NilClass then matches_nil?
|
|
62
|
+
else fail ArgumentError, 'assert_serializer only accepts a String, Symbol, Regexp, ActiveModel::Serializer, or nil'
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def subscribe
|
|
67
|
+
@_subscribers << ActiveSupport::Notifications.subscribe(event_name) do |_name, _start, _finish, _id, payload|
|
|
68
|
+
serializer = payload[:serializer].name
|
|
69
|
+
serializers << serializer
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def unsubscribe
|
|
74
|
+
@_subscribers.each do |subscriber|
|
|
75
|
+
ActiveSupport::Notifications.unsubscribe(subscriber)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
private
|
|
80
|
+
|
|
81
|
+
def matches_class?
|
|
82
|
+
serializers.include?(expectation.name)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def matches_symbol?
|
|
86
|
+
camelize_expectation = expectation.to_s.camelize
|
|
87
|
+
serializers.include?(camelize_expectation)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def matches_string?
|
|
91
|
+
!expectation.empty? && serializers.include?(expectation)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def matches_regexp?
|
|
95
|
+
serializers.any? do |serializer|
|
|
96
|
+
serializer.match(expectation)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def matches_nil?
|
|
101
|
+
serializers.empty?
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def a_serializer?
|
|
105
|
+
->(exp) { exp.is_a?(Class) && exp < ActiveModel::Serializer }
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def event_name
|
|
109
|
+
::ActiveModelSerializers::Logging::RENDER_EVENT
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
private
|
|
114
|
+
|
|
115
|
+
def setup_serialization_subscriptions
|
|
116
|
+
@assert_serializer = AssertSerializer.new
|
|
117
|
+
@assert_serializer.subscribe
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def teardown_serialization_subscriptions
|
|
121
|
+
@assert_serializer.unsubscribe
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module Rails
|
|
2
|
+
module Generators
|
|
3
|
+
class SerializerGenerator < NamedBase
|
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
|
5
|
+
check_class_collision suffix: 'Serializer'
|
|
6
|
+
|
|
7
|
+
argument :attributes, type: :array, default: [], banner: 'field:type field:type'
|
|
8
|
+
|
|
9
|
+
class_option :parent, type: :string, desc: 'The parent class for the generated serializer'
|
|
10
|
+
|
|
11
|
+
def create_serializer_file
|
|
12
|
+
template 'serializer.rb.erb', File.join('app/serializers', class_path, "#{file_name}_serializer.rb")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def attributes_names
|
|
18
|
+
[:id] + attributes.reject(&:reference?).map! { |a| a.name.to_sym }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def association_names
|
|
22
|
+
attributes.select(&:reference?).map! { |a| a.name.to_sym }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def parent_class_name
|
|
26
|
+
if options[:parent]
|
|
27
|
+
options[:parent]
|
|
28
|
+
elsif 'ApplicationSerializer'.safe_constantize
|
|
29
|
+
'ApplicationSerializer'
|
|
30
|
+
else
|
|
31
|
+
'ActiveModel::Serializer'
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<%- module_namespacing do -%>
|
|
2
|
+
<%- module_name = class_name.split('::')[0..-2] -%>
|
|
3
|
+
<%- if module_name.any? -%>
|
|
4
|
+
module <%= class_name.split('::')[0..-2].join('::') %>
|
|
5
|
+
<%- end -%>
|
|
6
|
+
class <%= class_name.split('::').last %>Serializer < BaseSerializer
|
|
7
|
+
attributes <%= attributes_names.map(&:inspect).join(", ") %>
|
|
8
|
+
<%- association_names.each do |attribute| -%>
|
|
9
|
+
has_one :<%= attribute %>
|
|
10
|
+
<%- end -%>
|
|
11
|
+
end
|
|
12
|
+
<%- if module_name.any? -%>
|
|
13
|
+
end
|
|
14
|
+
<%- end -%>
|
|
15
|
+
<%- end -%>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# To add Grape support, require 'grape/active_model_serializers' in the base of your Grape endpoints
|
|
2
|
+
# Then add 'include Grape::ActiveModelSerializers' to enable the formatter and helpers
|
|
3
|
+
require 'active_model_serializers'
|
|
4
|
+
require 'grape/formatters/active_model_serializers'
|
|
5
|
+
require 'grape/helpers/active_model_serializers'
|
|
6
|
+
|
|
7
|
+
module Grape
|
|
8
|
+
module ActiveModelSerializers
|
|
9
|
+
extend ActiveSupport::Concern
|
|
10
|
+
|
|
11
|
+
included do
|
|
12
|
+
formatter :json, Grape::Formatters::ActiveModelSerializers
|
|
13
|
+
helpers Grape::Helpers::ActiveModelSerializers
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# A Grape response formatter that can be used as 'formatter :json, Grape::Formatters::ActiveModelSerializers'
|
|
2
|
+
#
|
|
3
|
+
# Serializer options can be passed as a hash from your Grape endpoint using env[:active_model_serializer_options],
|
|
4
|
+
# or better yet user the render helper in Grape::Helpers::ActiveModelSerializers
|
|
5
|
+
|
|
6
|
+
require 'active_model_serializers/serialization_context'
|
|
7
|
+
|
|
8
|
+
module Grape
|
|
9
|
+
module Formatters
|
|
10
|
+
module ActiveModelSerializers
|
|
11
|
+
def self.call(resource, env)
|
|
12
|
+
serializer_options = build_serializer_options(env)
|
|
13
|
+
::ActiveModelSerializers::SerializableResource.new(resource, serializer_options).to_json
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.build_serializer_options(env)
|
|
17
|
+
ams_options = env[:active_model_serializer_options] || {}
|
|
18
|
+
|
|
19
|
+
# Add serialization context
|
|
20
|
+
ams_options.fetch(:serialization_context) do
|
|
21
|
+
request = env['grape.request']
|
|
22
|
+
ams_options[:serialization_context] = ::ActiveModelSerializers::SerializationContext.new(
|
|
23
|
+
request_url: request.url[/\A[^?]+/],
|
|
24
|
+
query_parameters: request.params
|
|
25
|
+
)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
ams_options
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Helpers can be included in your Grape endpoint as: helpers Grape::Helpers::ActiveModelSerializers
|
|
2
|
+
|
|
3
|
+
module Grape
|
|
4
|
+
module Helpers
|
|
5
|
+
module ActiveModelSerializers
|
|
6
|
+
# A convenience method for passing ActiveModelSerializers serializer options
|
|
7
|
+
#
|
|
8
|
+
# Example: To include relationships in the response: render(post, include: ['comments'])
|
|
9
|
+
#
|
|
10
|
+
# Example: To include pagination meta data: render(posts, meta: { page: posts.page, total_pages: posts.total_pages })
|
|
11
|
+
def render(resource, active_model_serializer_options = {})
|
|
12
|
+
env[:active_model_serializer_options] = active_model_serializer_options
|
|
13
|
+
resource
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module ActionController
|
|
4
|
+
module Serialization
|
|
5
|
+
class AdapterSelectorTest < ActionController::TestCase
|
|
6
|
+
class AdapterSelectorTestController < ActionController::Base
|
|
7
|
+
def render_using_default_adapter
|
|
8
|
+
@profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
|
|
9
|
+
render json: @profile
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def render_using_adapter_override
|
|
13
|
+
@profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
|
|
14
|
+
render json: @profile, adapter: :json_api
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def render_skipping_adapter
|
|
18
|
+
@profile = Profile.new(id: 'render_skipping_adapter_id', name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
|
|
19
|
+
render json: @profile, adapter: false
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
tests AdapterSelectorTestController
|
|
24
|
+
|
|
25
|
+
def test_render_using_default_adapter
|
|
26
|
+
get :render_using_default_adapter
|
|
27
|
+
assert_equal '{"name":"Name 1","description":"Description 1"}', response.body
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_render_using_adapter_override
|
|
31
|
+
get :render_using_adapter_override
|
|
32
|
+
|
|
33
|
+
expected = {
|
|
34
|
+
data: {
|
|
35
|
+
id: @controller.instance_variable_get(:@profile).id.to_s,
|
|
36
|
+
type: 'profiles',
|
|
37
|
+
attributes: {
|
|
38
|
+
name: 'Name 1',
|
|
39
|
+
description: 'Description 1'
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
assert_equal expected.to_json, response.body
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_render_skipping_adapter
|
|
48
|
+
get :render_skipping_adapter
|
|
49
|
+
assert_equal '{"id":"render_skipping_adapter_id","name":"Name 1","description":"Description 1"}', response.body
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module ActionController
|
|
4
|
+
module Serialization
|
|
5
|
+
class ExplicitSerializerTest < ActionController::TestCase
|
|
6
|
+
class ExplicitSerializerTestController < ActionController::Base
|
|
7
|
+
def render_using_explicit_serializer
|
|
8
|
+
@profile = Profile.new(name: 'Name 1',
|
|
9
|
+
description: 'Description 1',
|
|
10
|
+
comments: 'Comments 1')
|
|
11
|
+
render json: @profile, serializer: ProfilePreviewSerializer
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def render_array_using_explicit_serializer
|
|
15
|
+
array = [
|
|
16
|
+
Profile.new(name: 'Name 1',
|
|
17
|
+
description: 'Description 1',
|
|
18
|
+
comments: 'Comments 1'),
|
|
19
|
+
Profile.new(name: 'Name 2',
|
|
20
|
+
description: 'Description 2',
|
|
21
|
+
comments: 'Comments 2')
|
|
22
|
+
]
|
|
23
|
+
render json: array,
|
|
24
|
+
serializer: PaginatedSerializer,
|
|
25
|
+
each_serializer: ProfilePreviewSerializer
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def render_array_using_implicit_serializer
|
|
29
|
+
array = [
|
|
30
|
+
Profile.new(name: 'Name 1',
|
|
31
|
+
description: 'Description 1',
|
|
32
|
+
comments: 'Comments 1'),
|
|
33
|
+
Profile.new(name: 'Name 2',
|
|
34
|
+
description: 'Description 2',
|
|
35
|
+
comments: 'Comments 2')
|
|
36
|
+
]
|
|
37
|
+
render json: array,
|
|
38
|
+
each_serializer: ProfilePreviewSerializer
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def render_array_using_explicit_serializer_and_custom_serializers
|
|
42
|
+
@post = Post.new(title: 'New Post', body: 'Body')
|
|
43
|
+
@author = Author.new(name: 'Jane Blogger')
|
|
44
|
+
@author.posts = [@post]
|
|
45
|
+
@post.author = @author
|
|
46
|
+
@first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
|
|
47
|
+
@second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
|
|
48
|
+
@post.comments = [@first_comment, @second_comment]
|
|
49
|
+
@first_comment.post = @post
|
|
50
|
+
@first_comment.author = nil
|
|
51
|
+
@second_comment.post = @post
|
|
52
|
+
@second_comment.author = nil
|
|
53
|
+
@blog = Blog.new(id: 23, name: 'AMS Blog')
|
|
54
|
+
@post.blog = @blog
|
|
55
|
+
|
|
56
|
+
render json: [@post], each_serializer: PostPreviewSerializer
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def render_using_explicit_each_serializer
|
|
60
|
+
location = Location.new(id: 42, lat: '-23.550520', lng: '-46.633309')
|
|
61
|
+
place = Place.new(id: 1337, name: 'Amazing Place', locations: [location])
|
|
62
|
+
|
|
63
|
+
render json: place, each_serializer: PlaceSerializer
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
tests ExplicitSerializerTestController
|
|
68
|
+
|
|
69
|
+
def test_render_using_explicit_serializer
|
|
70
|
+
get :render_using_explicit_serializer
|
|
71
|
+
|
|
72
|
+
assert_equal 'application/json', @response.content_type
|
|
73
|
+
assert_equal '{"name":"Name 1"}', @response.body
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def test_render_array_using_explicit_serializer
|
|
77
|
+
get :render_array_using_explicit_serializer
|
|
78
|
+
assert_equal 'application/json', @response.content_type
|
|
79
|
+
|
|
80
|
+
expected = [
|
|
81
|
+
{ 'name' => 'Name 1' },
|
|
82
|
+
{ 'name' => 'Name 2' }
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
assert_equal expected.to_json, @response.body
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def test_render_array_using_implicit_serializer
|
|
89
|
+
get :render_array_using_implicit_serializer
|
|
90
|
+
assert_equal 'application/json', @response.content_type
|
|
91
|
+
|
|
92
|
+
expected = [
|
|
93
|
+
{ 'name' => 'Name 1' },
|
|
94
|
+
{ 'name' => 'Name 2' }
|
|
95
|
+
]
|
|
96
|
+
assert_equal expected.to_json, @response.body
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def test_render_array_using_explicit_serializer_and_custom_serializers
|
|
100
|
+
get :render_array_using_explicit_serializer_and_custom_serializers
|
|
101
|
+
|
|
102
|
+
expected = [
|
|
103
|
+
{
|
|
104
|
+
'title' => 'New Post',
|
|
105
|
+
'body' => 'Body',
|
|
106
|
+
'id' => @controller.instance_variable_get(:@post).id,
|
|
107
|
+
'comments' => [{ 'id' => 1 }, { 'id' => 2 }],
|
|
108
|
+
'author' => { 'id' => @controller.instance_variable_get(:@author).id }
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
|
|
112
|
+
assert_equal expected.to_json, @response.body
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def test_render_using_explicit_each_serializer
|
|
116
|
+
get :render_using_explicit_each_serializer
|
|
117
|
+
|
|
118
|
+
expected = {
|
|
119
|
+
id: 1337,
|
|
120
|
+
name: 'Amazing Place',
|
|
121
|
+
locations: [
|
|
122
|
+
{
|
|
123
|
+
id: 42,
|
|
124
|
+
lat: '-23.550520',
|
|
125
|
+
lng: '-46.633309',
|
|
126
|
+
address: 'Nowhere' # is a virtual attribute on LocationSerializer
|
|
127
|
+
}
|
|
128
|
+
]
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
assert_equal expected.to_json, response.body
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|