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.
Files changed (220) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE.md +29 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +15 -0
  4. data/.gitignore +35 -0
  5. data/.rubocop.yml +102 -0
  6. data/.simplecov +110 -0
  7. data/.travis.yml +51 -0
  8. data/CHANGELOG.md +612 -0
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/CONTRIBUTING.md +105 -0
  11. data/Gemfile +56 -0
  12. data/MIT-LICENSE +22 -0
  13. data/README.md +307 -0
  14. data/Rakefile +103 -0
  15. data/active_model_serializers.gemspec +63 -0
  16. data/appveyor.yml +24 -0
  17. data/bin/bench +171 -0
  18. data/bin/bench_regression +316 -0
  19. data/bin/serve_benchmark +39 -0
  20. data/docs/README.md +41 -0
  21. data/docs/STYLE.md +58 -0
  22. data/docs/general/adapters.md +247 -0
  23. data/docs/general/caching.md +58 -0
  24. data/docs/general/configuration_options.md +169 -0
  25. data/docs/general/deserialization.md +100 -0
  26. data/docs/general/fields.md +31 -0
  27. data/docs/general/getting_started.md +133 -0
  28. data/docs/general/instrumentation.md +40 -0
  29. data/docs/general/key_transforms.md +40 -0
  30. data/docs/general/logging.md +14 -0
  31. data/docs/general/rendering.md +279 -0
  32. data/docs/general/serializers.md +461 -0
  33. data/docs/how-open-source-maintained.jpg +0 -0
  34. data/docs/howto/add_pagination_links.md +138 -0
  35. data/docs/howto/add_relationship_links.md +137 -0
  36. data/docs/howto/add_root_key.md +55 -0
  37. data/docs/howto/grape_integration.md +42 -0
  38. data/docs/howto/outside_controller_use.md +65 -0
  39. data/docs/howto/passing_arbitrary_options.md +27 -0
  40. data/docs/howto/serialize_poro.md +32 -0
  41. data/docs/howto/test.md +154 -0
  42. data/docs/howto/upgrade_from_0_8_to_0_10.md +265 -0
  43. data/docs/integrations/ember-and-json-api.md +144 -0
  44. data/docs/integrations/grape.md +19 -0
  45. data/docs/jsonapi/errors.md +56 -0
  46. data/docs/jsonapi/schema.md +151 -0
  47. data/docs/jsonapi/schema/schema.json +366 -0
  48. data/docs/rfcs/0000-namespace.md +106 -0
  49. data/docs/rfcs/template.md +15 -0
  50. data/lib/action_controller/serialization.rb +66 -0
  51. data/lib/active_model/serializable_resource.rb +11 -0
  52. data/lib/active_model/serializer.rb +231 -0
  53. data/lib/active_model/serializer/adapter.rb +24 -0
  54. data/lib/active_model/serializer/adapter/attributes.rb +15 -0
  55. data/lib/active_model/serializer/adapter/base.rb +18 -0
  56. data/lib/active_model/serializer/adapter/json.rb +15 -0
  57. data/lib/active_model/serializer/adapter/json_api.rb +15 -0
  58. data/lib/active_model/serializer/adapter/null.rb +15 -0
  59. data/lib/active_model/serializer/array_serializer.rb +12 -0
  60. data/lib/active_model/serializer/association.rb +34 -0
  61. data/lib/active_model/serializer/attribute.rb +25 -0
  62. data/lib/active_model/serializer/belongs_to_reflection.rb +7 -0
  63. data/lib/active_model/serializer/collection_reflection.rb +7 -0
  64. data/lib/active_model/serializer/collection_serializer.rb +87 -0
  65. data/lib/active_model/serializer/concerns/associations.rb +102 -0
  66. data/lib/active_model/serializer/concerns/attributes.rb +82 -0
  67. data/lib/active_model/serializer/concerns/caching.rb +292 -0
  68. data/lib/active_model/serializer/concerns/configuration.rb +59 -0
  69. data/lib/active_model/serializer/concerns/links.rb +35 -0
  70. data/lib/active_model/serializer/concerns/meta.rb +29 -0
  71. data/lib/active_model/serializer/concerns/type.rb +25 -0
  72. data/lib/active_model/serializer/error_serializer.rb +14 -0
  73. data/lib/active_model/serializer/errors_serializer.rb +32 -0
  74. data/lib/active_model/serializer/field.rb +90 -0
  75. data/lib/active_model/serializer/fieldset.rb +31 -0
  76. data/lib/active_model/serializer/has_many_reflection.rb +7 -0
  77. data/lib/active_model/serializer/has_one_reflection.rb +7 -0
  78. data/lib/active_model/serializer/lint.rb +150 -0
  79. data/lib/active_model/serializer/null.rb +17 -0
  80. data/lib/active_model/serializer/reflection.rb +163 -0
  81. data/lib/active_model/serializer/singular_reflection.rb +7 -0
  82. data/lib/active_model/serializer/version.rb +5 -0
  83. data/lib/active_model_serializers.rb +53 -0
  84. data/lib/active_model_serializers/adapter.rb +98 -0
  85. data/lib/active_model_serializers/adapter/attributes.rb +13 -0
  86. data/lib/active_model_serializers/adapter/base.rb +83 -0
  87. data/lib/active_model_serializers/adapter/json.rb +21 -0
  88. data/lib/active_model_serializers/adapter/json_api.rb +517 -0
  89. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +213 -0
  90. data/lib/active_model_serializers/adapter/json_api/error.rb +96 -0
  91. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +49 -0
  92. data/lib/active_model_serializers/adapter/json_api/link.rb +83 -0
  93. data/lib/active_model_serializers/adapter/json_api/meta.rb +37 -0
  94. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +69 -0
  95. data/lib/active_model_serializers/adapter/json_api/relationship.rb +63 -0
  96. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +51 -0
  97. data/lib/active_model_serializers/adapter/null.rb +9 -0
  98. data/lib/active_model_serializers/callbacks.rb +55 -0
  99. data/lib/active_model_serializers/deprecate.rb +54 -0
  100. data/lib/active_model_serializers/deserialization.rb +15 -0
  101. data/lib/active_model_serializers/json_pointer.rb +14 -0
  102. data/lib/active_model_serializers/logging.rb +122 -0
  103. data/lib/active_model_serializers/lookup_chain.rb +80 -0
  104. data/lib/active_model_serializers/model.rb +71 -0
  105. data/lib/active_model_serializers/railtie.rb +48 -0
  106. data/lib/active_model_serializers/register_jsonapi_renderer.rb +78 -0
  107. data/lib/active_model_serializers/serializable_resource.rb +82 -0
  108. data/lib/active_model_serializers/serialization_context.rb +39 -0
  109. data/lib/active_model_serializers/test.rb +7 -0
  110. data/lib/active_model_serializers/test/schema.rb +138 -0
  111. data/lib/active_model_serializers/test/serializer.rb +125 -0
  112. data/lib/generators/rails/USAGE +6 -0
  113. data/lib/generators/rails/resource_override.rb +10 -0
  114. data/lib/generators/rails/serializer_generator.rb +36 -0
  115. data/lib/generators/rails/templates/serializer.rb.erb +15 -0
  116. data/lib/grape/active_model_serializers.rb +16 -0
  117. data/lib/grape/formatters/active_model_serializers.rb +32 -0
  118. data/lib/grape/helpers/active_model_serializers.rb +17 -0
  119. data/test/action_controller/adapter_selector_test.rb +53 -0
  120. data/test/action_controller/explicit_serializer_test.rb +135 -0
  121. data/test/action_controller/json/include_test.rb +246 -0
  122. data/test/action_controller/json_api/deserialization_test.rb +112 -0
  123. data/test/action_controller/json_api/errors_test.rb +40 -0
  124. data/test/action_controller/json_api/fields_test.rb +66 -0
  125. data/test/action_controller/json_api/linked_test.rb +202 -0
  126. data/test/action_controller/json_api/pagination_test.rb +116 -0
  127. data/test/action_controller/json_api/transform_test.rb +189 -0
  128. data/test/action_controller/lookup_proc_test.rb +49 -0
  129. data/test/action_controller/namespace_lookup_test.rb +232 -0
  130. data/test/action_controller/serialization_scope_name_test.rb +229 -0
  131. data/test/action_controller/serialization_test.rb +472 -0
  132. data/test/active_model_serializers/adapter_for_test.rb +208 -0
  133. data/test/active_model_serializers/json_pointer_test.rb +22 -0
  134. data/test/active_model_serializers/logging_test.rb +77 -0
  135. data/test/active_model_serializers/model_test.rb +69 -0
  136. data/test/active_model_serializers/railtie_test_isolated.rb +63 -0
  137. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +161 -0
  138. data/test/active_model_serializers/serialization_context_test_isolated.rb +71 -0
  139. data/test/active_model_serializers/test/schema_test.rb +131 -0
  140. data/test/active_model_serializers/test/serializer_test.rb +62 -0
  141. data/test/active_record_test.rb +9 -0
  142. data/test/adapter/attributes_test.rb +43 -0
  143. data/test/adapter/deprecation_test.rb +100 -0
  144. data/test/adapter/json/belongs_to_test.rb +45 -0
  145. data/test/adapter/json/collection_test.rb +104 -0
  146. data/test/adapter/json/has_many_test.rb +45 -0
  147. data/test/adapter/json/transform_test.rb +93 -0
  148. data/test/adapter/json_api/belongs_to_test.rb +155 -0
  149. data/test/adapter/json_api/collection_test.rb +96 -0
  150. data/test/adapter/json_api/errors_test.rb +76 -0
  151. data/test/adapter/json_api/fields_test.rb +96 -0
  152. data/test/adapter/json_api/has_many_embed_ids_test.rb +43 -0
  153. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +96 -0
  154. data/test/adapter/json_api/has_many_test.rb +165 -0
  155. data/test/adapter/json_api/has_one_test.rb +80 -0
  156. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +168 -0
  157. data/test/adapter/json_api/json_api_test.rb +33 -0
  158. data/test/adapter/json_api/linked_test.rb +413 -0
  159. data/test/adapter/json_api/links_test.rb +95 -0
  160. data/test/adapter/json_api/pagination_links_test.rb +193 -0
  161. data/test/adapter/json_api/parse_test.rb +137 -0
  162. data/test/adapter/json_api/relationship_test.rb +397 -0
  163. data/test/adapter/json_api/resource_identifier_test.rb +110 -0
  164. data/test/adapter/json_api/resource_meta_test.rb +100 -0
  165. data/test/adapter/json_api/toplevel_jsonapi_test.rb +82 -0
  166. data/test/adapter/json_api/transform_test.rb +512 -0
  167. data/test/adapter/json_api/type_test.rb +61 -0
  168. data/test/adapter/json_test.rb +46 -0
  169. data/test/adapter/null_test.rb +22 -0
  170. data/test/adapter/polymorphic_test.rb +171 -0
  171. data/test/adapter_test.rb +67 -0
  172. data/test/array_serializer_test.rb +22 -0
  173. data/test/benchmark/app.rb +65 -0
  174. data/test/benchmark/benchmarking_support.rb +67 -0
  175. data/test/benchmark/bm_active_record.rb +81 -0
  176. data/test/benchmark/bm_adapter.rb +38 -0
  177. data/test/benchmark/bm_caching.rb +119 -0
  178. data/test/benchmark/bm_lookup_chain.rb +83 -0
  179. data/test/benchmark/bm_transform.rb +45 -0
  180. data/test/benchmark/config.ru +3 -0
  181. data/test/benchmark/controllers.rb +83 -0
  182. data/test/benchmark/fixtures.rb +219 -0
  183. data/test/cache_test.rb +595 -0
  184. data/test/collection_serializer_test.rb +123 -0
  185. data/test/fixtures/active_record.rb +113 -0
  186. data/test/fixtures/poro.rb +232 -0
  187. data/test/generators/scaffold_controller_generator_test.rb +24 -0
  188. data/test/generators/serializer_generator_test.rb +74 -0
  189. data/test/grape_test.rb +178 -0
  190. data/test/lint_test.rb +49 -0
  191. data/test/logger_test.rb +20 -0
  192. data/test/poro_test.rb +9 -0
  193. data/test/serializable_resource_test.rb +79 -0
  194. data/test/serializers/association_macros_test.rb +37 -0
  195. data/test/serializers/associations_test.rb +383 -0
  196. data/test/serializers/attribute_test.rb +153 -0
  197. data/test/serializers/attributes_test.rb +52 -0
  198. data/test/serializers/caching_configuration_test_isolated.rb +170 -0
  199. data/test/serializers/configuration_test.rb +32 -0
  200. data/test/serializers/fieldset_test.rb +14 -0
  201. data/test/serializers/meta_test.rb +202 -0
  202. data/test/serializers/options_test.rb +32 -0
  203. data/test/serializers/read_attribute_for_serialization_test.rb +79 -0
  204. data/test/serializers/root_test.rb +21 -0
  205. data/test/serializers/serialization_test.rb +55 -0
  206. data/test/serializers/serializer_for_test.rb +136 -0
  207. data/test/serializers/serializer_for_with_namespace_test.rb +88 -0
  208. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  209. data/test/support/isolated_unit.rb +82 -0
  210. data/test/support/rails5_shims.rb +53 -0
  211. data/test/support/rails_app.rb +36 -0
  212. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  213. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +6 -0
  214. data/test/support/schemas/custom/show.json +7 -0
  215. data/test/support/schemas/hyper_schema.json +93 -0
  216. data/test/support/schemas/render_using_json_api.json +43 -0
  217. data/test/support/schemas/simple_json_pointers.json +10 -0
  218. data/test/support/serialization_testing.rb +71 -0
  219. data/test/test_helper.rb +58 -0
  220. metadata +602 -0
@@ -0,0 +1,123 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class CollectionSerializerTest < ActiveSupport::TestCase
6
+ class SingularModel < ::Model; end
7
+ class SingularModelSerializer < ActiveModel::Serializer
8
+ end
9
+ class HasManyModel < ::Model
10
+ associations :singular_models
11
+ end
12
+ class HasManyModelSerializer < ActiveModel::Serializer
13
+ has_many :singular_models
14
+
15
+ def custom_options
16
+ instance_options
17
+ end
18
+ end
19
+ class MessagesSerializer < ActiveModel::Serializer
20
+ type 'messages'
21
+ end
22
+
23
+ def setup
24
+ @singular_model = SingularModel.new
25
+ @has_many_model = HasManyModel.new
26
+ @resource = build_named_collection @singular_model, @has_many_model
27
+ @serializer = collection_serializer.new(@resource, some: :options)
28
+ end
29
+
30
+ def collection_serializer
31
+ CollectionSerializer
32
+ end
33
+
34
+ def build_named_collection(*resource)
35
+ resource.define_singleton_method(:name) { 'MeResource' }
36
+ resource
37
+ end
38
+
39
+ def test_has_object_reader_serializer_interface
40
+ assert_equal @serializer.object, @resource
41
+ end
42
+
43
+ def test_respond_to_each
44
+ assert_respond_to @serializer, :each
45
+ end
46
+
47
+ def test_each_object_should_be_serialized_with_appropriate_serializer
48
+ serializers = @serializer.to_a
49
+
50
+ assert_kind_of SingularModelSerializer, serializers.first
51
+ assert_kind_of SingularModel, serializers.first.object
52
+
53
+ assert_kind_of HasManyModelSerializer, serializers.last
54
+ assert_kind_of HasManyModel, serializers.last.object
55
+
56
+ assert_equal :options, serializers.last.custom_options[:some]
57
+ end
58
+
59
+ def test_serializer_option_not_passed_to_each_serializer
60
+ serializers = collection_serializer.new([@has_many_model], serializer: HasManyModelSerializer).to_a
61
+
62
+ refute serializers.first.custom_options.key?(:serializer)
63
+ end
64
+
65
+ def test_root_default
66
+ @serializer = collection_serializer.new([@singular_model, @has_many_model])
67
+ assert_nil @serializer.root
68
+ end
69
+
70
+ def test_root
71
+ expected = 'custom_root'
72
+ @serializer = collection_serializer.new([@singular_model, @has_many_model], root: expected)
73
+ assert_equal expected, @serializer.root
74
+ end
75
+
76
+ def test_root_with_no_serializers
77
+ expected = 'custom_root'
78
+ @serializer = collection_serializer.new([], root: expected)
79
+ assert_equal expected, @serializer.root
80
+ end
81
+
82
+ def test_json_key_with_resource_with_serializer
83
+ singular_key = @serializer.send(:serializers).first.json_key
84
+ assert_equal singular_key.pluralize, @serializer.json_key
85
+ end
86
+
87
+ def test_json_key_with_resource_with_name_and_no_serializers
88
+ serializer = collection_serializer.new(build_named_collection)
89
+ assert_equal 'me_resources', serializer.json_key
90
+ end
91
+
92
+ def test_json_key_with_resource_with_nil_name_and_no_serializers
93
+ resource = []
94
+ resource.define_singleton_method(:name) { nil }
95
+ serializer = collection_serializer.new(resource)
96
+ assert_nil serializer.json_key
97
+ end
98
+
99
+ def test_json_key_with_resource_without_name_and_no_serializers
100
+ serializer = collection_serializer.new([])
101
+ assert_nil serializer.json_key
102
+ end
103
+
104
+ def test_json_key_with_empty_resources_with_serializer
105
+ resource = []
106
+ serializer = collection_serializer.new(resource, serializer: MessagesSerializer)
107
+ assert_equal 'messages', serializer.json_key
108
+ end
109
+
110
+ def test_json_key_with_root
111
+ expected = 'custom_root'
112
+ serializer = collection_serializer.new(@resource, root: expected)
113
+ assert_equal expected, serializer.json_key
114
+ end
115
+
116
+ def test_json_key_with_root_and_no_serializers
117
+ expected = 'custom_root'
118
+ serializer = collection_serializer.new(build_named_collection, root: expected)
119
+ assert_equal expected, serializer.json_key
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,113 @@
1
+ require 'active_record'
2
+
3
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
4
+ ActiveRecord::Schema.define do
5
+ self.verbose = false
6
+ create_table :posts, force: true do |t|
7
+ t.string :title
8
+ t.text :body
9
+ t.references :author
10
+ t.timestamps null: false
11
+ end
12
+ create_table :authors, force: true do |t|
13
+ t.string :name
14
+ t.timestamps null: false
15
+ end
16
+ create_table :comments, force: true do |t|
17
+ t.text :contents
18
+ t.references :author
19
+ t.references :post
20
+ t.timestamp null: false
21
+ end
22
+ create_table :employees, force: true do |t|
23
+ t.string :name
24
+ t.string :email
25
+ t.timestamp null: false
26
+ end
27
+ create_table :object_tags, force: true do |t|
28
+ t.string :poly_tag_id
29
+ t.string :taggable_type
30
+ t.string :taggable_id
31
+ t.timestamp null: false
32
+ end
33
+ create_table :poly_tags, force: true do |t|
34
+ t.string :phrase
35
+ t.timestamp null: false
36
+ end
37
+ create_table :pictures, force: true do |t|
38
+ t.string :title
39
+ t.string :imageable_type
40
+ t.string :imageable_id
41
+ t.timestamp null: false
42
+ end
43
+ end
44
+
45
+ module ARModels
46
+ class Post < ActiveRecord::Base
47
+ has_many :comments
48
+ belongs_to :author
49
+ end
50
+ class PostSerializer < ActiveModel::Serializer
51
+ attributes :id, :title, :body
52
+
53
+ has_many :comments
54
+ belongs_to :author
55
+ end
56
+
57
+ class Comment < ActiveRecord::Base
58
+ belongs_to :post
59
+ belongs_to :author
60
+ end
61
+ class CommentSerializer < ActiveModel::Serializer
62
+ attributes :id, :contents
63
+
64
+ belongs_to :author
65
+ end
66
+
67
+ class Author < ActiveRecord::Base
68
+ has_many :posts
69
+ end
70
+ class AuthorSerializer < ActiveModel::Serializer
71
+ attributes :id, :name
72
+
73
+ has_many :posts
74
+ end
75
+ end
76
+
77
+ class Employee < ActiveRecord::Base
78
+ has_many :pictures, as: :imageable
79
+ has_many :object_tags, as: :taggable
80
+ end
81
+
82
+ class PolymorphicSimpleSerializer < ActiveModel::Serializer
83
+ attributes :id
84
+ end
85
+
86
+ class ObjectTag < ActiveRecord::Base
87
+ belongs_to :poly_tag
88
+ belongs_to :taggable, polymorphic: true
89
+ end
90
+ class PolymorphicObjectTagSerializer < ActiveModel::Serializer
91
+ attributes :id
92
+ has_many :taggable, serializer: PolymorphicSimpleSerializer, polymorphic: true
93
+ end
94
+
95
+ class PolyTag < ActiveRecord::Base
96
+ has_many :object_tags
97
+ end
98
+ class PolymorphicTagSerializer < ActiveModel::Serializer
99
+ attributes :id, :phrase
100
+ has_many :object_tags, serializer: PolymorphicObjectTagSerializer
101
+ end
102
+
103
+ class Picture < ActiveRecord::Base
104
+ belongs_to :imageable, polymorphic: true
105
+ has_many :object_tags, as: :taggable
106
+ end
107
+ class PolymorphicHasManySerializer < ActiveModel::Serializer
108
+ attributes :id, :name
109
+ end
110
+ class PolymorphicBelongsToSerializer < ActiveModel::Serializer
111
+ attributes :id, :title
112
+ has_one :imageable, serializer: PolymorphicHasManySerializer, polymorphic: true
113
+ end
@@ -0,0 +1,232 @@
1
+ class Model < ActiveModelSerializers::Model
2
+ FILE_DIGEST = Digest::MD5.hexdigest(File.open(__FILE__).read)
3
+
4
+ # Defaults to the downcased model name.
5
+ def id
6
+ @id ||= self.class.model_name.name.downcase
7
+ end
8
+
9
+ # At this time, just for organization of intent
10
+ class_attribute :association_names
11
+ self.association_names = []
12
+
13
+ def self.associations(*names)
14
+ self.association_names |= names.map(&:to_sym)
15
+ # Silence redefinition of methods warnings
16
+ ActiveModelSerializers.silence_warnings do
17
+ attr_accessor(*names)
18
+ end
19
+ end
20
+
21
+ def associations
22
+ association_names.each_with_object({}) do |association_name, result|
23
+ result[association_name] = public_send(association_name).freeze
24
+ end.with_indifferent_access.freeze
25
+ end
26
+ end
27
+
28
+ # see
29
+ # https://github.com/rails/rails/blob/4-2-stable/activemodel/lib/active_model/errors.rb
30
+ # The below allows you to do:
31
+ #
32
+ # model = ModelWithErrors.new
33
+ # model.validate! # => ["cannot be nil"]
34
+ # model.errors.full_messages # => ["name cannot be nil"]
35
+ class ModelWithErrors < Model
36
+ attributes :name
37
+ end
38
+
39
+ class Profile < Model
40
+ attributes :name, :description
41
+ associations :comments
42
+ end
43
+ class ProfileSerializer < ActiveModel::Serializer
44
+ attributes :name, :description
45
+ end
46
+ class ProfilePreviewSerializer < ActiveModel::Serializer
47
+ attributes :name
48
+ end
49
+
50
+ class Author < Model
51
+ attributes :name
52
+ associations :posts, :bio, :roles, :comments
53
+ end
54
+ class AuthorSerializer < ActiveModel::Serializer
55
+ cache key: 'writer', skip_digest: true
56
+ attribute :id
57
+ attribute :name
58
+
59
+ has_many :posts
60
+ has_many :roles
61
+ has_one :bio
62
+ end
63
+ class AuthorPreviewSerializer < ActiveModel::Serializer
64
+ attributes :id
65
+ has_many :posts
66
+ end
67
+
68
+ class Comment < Model
69
+ attributes :body, :date
70
+ associations :post, :author, :likes
71
+ end
72
+ class CommentSerializer < ActiveModel::Serializer
73
+ cache expires_in: 1.day, skip_digest: true
74
+ attributes :id, :body
75
+ belongs_to :post
76
+ belongs_to :author
77
+ end
78
+ class CommentPreviewSerializer < ActiveModel::Serializer
79
+ attributes :id
80
+
81
+ belongs_to :post
82
+ end
83
+
84
+ class Post < Model
85
+ attributes :title, :body
86
+ associations :author, :comments, :blog, :tags, :related
87
+ end
88
+ class PostSerializer < ActiveModel::Serializer
89
+ cache key: 'post', expires_in: 0.1, skip_digest: true
90
+ attributes :id, :title, :body
91
+
92
+ has_many :comments
93
+ belongs_to :blog
94
+ belongs_to :author
95
+
96
+ def blog
97
+ Blog.new(id: 999, name: 'Custom blog')
98
+ end
99
+ end
100
+ class SpammyPostSerializer < ActiveModel::Serializer
101
+ attributes :id
102
+ has_many :related
103
+ end
104
+ class PostPreviewSerializer < ActiveModel::Serializer
105
+ attributes :title, :body, :id
106
+
107
+ has_many :comments, serializer: ::CommentPreviewSerializer
108
+ belongs_to :author, serializer: ::AuthorPreviewSerializer
109
+ end
110
+ class PostWithTagsSerializer < ActiveModel::Serializer
111
+ attributes :id
112
+ has_many :tags
113
+ end
114
+ class PostWithCustomKeysSerializer < ActiveModel::Serializer
115
+ attributes :id
116
+ has_many :comments, key: :reviews
117
+ belongs_to :author, key: :writer
118
+ has_one :blog, key: :site
119
+ end
120
+
121
+ class Bio < Model
122
+ attributes :content, :rating
123
+ associations :author
124
+ end
125
+ class BioSerializer < ActiveModel::Serializer
126
+ cache except: [:content], skip_digest: true
127
+ attributes :id, :content, :rating
128
+
129
+ belongs_to :author
130
+ end
131
+
132
+ class Blog < Model
133
+ attributes :name, :type, :special_attribute
134
+ associations :writer, :articles
135
+ end
136
+ class BlogSerializer < ActiveModel::Serializer
137
+ cache key: 'blog'
138
+ attributes :id, :name
139
+
140
+ belongs_to :writer
141
+ has_many :articles
142
+ end
143
+ class AlternateBlogSerializer < ActiveModel::Serializer
144
+ attribute :id
145
+ attribute :name, key: :title
146
+ end
147
+ class CustomBlogSerializer < ActiveModel::Serializer
148
+ attribute :id
149
+ attribute :special_attribute
150
+ has_many :articles
151
+ end
152
+
153
+ class Role < Model
154
+ attributes :name, :description, :special_attribute
155
+ associations :author
156
+ end
157
+ class RoleSerializer < ActiveModel::Serializer
158
+ cache only: [:name, :slug], skip_digest: true
159
+ attributes :id, :name, :description
160
+ attribute :friendly_id, key: :slug
161
+ belongs_to :author
162
+
163
+ def friendly_id
164
+ "#{object.name}-#{object.id}"
165
+ end
166
+ end
167
+
168
+ class Location < Model
169
+ attributes :lat, :lng
170
+ associations :place
171
+ end
172
+ class LocationSerializer < ActiveModel::Serializer
173
+ cache only: [:address], skip_digest: true
174
+ attributes :id, :lat, :lng
175
+
176
+ belongs_to :place, key: :address
177
+
178
+ def place
179
+ 'Nowhere'
180
+ end
181
+ end
182
+
183
+ class Place < Model
184
+ attributes :name
185
+ associations :locations
186
+ end
187
+ class PlaceSerializer < ActiveModel::Serializer
188
+ attributes :id, :name
189
+ has_many :locations
190
+ end
191
+
192
+ class Like < Model
193
+ attributes :time
194
+ associations :likeable
195
+ end
196
+ class LikeSerializer < ActiveModel::Serializer
197
+ attributes :id, :time
198
+ belongs_to :likeable
199
+ end
200
+
201
+ module Spam
202
+ class UnrelatedLink < Model
203
+ end
204
+ class UnrelatedLinkSerializer < ActiveModel::Serializer
205
+ cache only: [:id]
206
+ attributes :id
207
+ end
208
+ end
209
+
210
+ class Tag < Model
211
+ attributes :name
212
+ end
213
+
214
+ class VirtualValue < Model; end
215
+ class VirtualValueSerializer < ActiveModel::Serializer
216
+ attributes :id
217
+ has_many :reviews, virtual_value: [{ type: 'reviews', id: '1' },
218
+ { type: 'reviews', id: '2' }]
219
+ has_one :maker, virtual_value: { type: 'makers', id: '1' }
220
+
221
+ def reviews
222
+ end
223
+
224
+ def maker
225
+ end
226
+ end
227
+
228
+ class PaginatedSerializer < ActiveModel::Serializer::CollectionSerializer
229
+ def json_key
230
+ 'paginated'
231
+ end
232
+ end