active_model_serializers 0.10.6 → 0.10.13

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 (215) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +114 -1
  3. data/README.md +21 -24
  4. data/lib/action_controller/serialization.rb +11 -1
  5. data/lib/active_model/serializable_resource.rb +2 -0
  6. data/lib/active_model/serializer/adapter/attributes.rb +2 -0
  7. data/lib/active_model/serializer/adapter/base.rb +2 -0
  8. data/lib/active_model/serializer/adapter/json.rb +2 -0
  9. data/lib/active_model/serializer/adapter/json_api.rb +2 -0
  10. data/lib/active_model/serializer/adapter/null.rb +2 -0
  11. data/lib/active_model/serializer/adapter.rb +2 -0
  12. data/lib/active_model/serializer/array_serializer.rb +2 -0
  13. data/lib/active_model/serializer/association.rb +2 -0
  14. data/lib/active_model/serializer/attribute.rb +2 -0
  15. data/lib/active_model/serializer/belongs_to_reflection.rb +2 -0
  16. data/lib/active_model/serializer/collection_serializer.rb +17 -5
  17. data/lib/active_model/serializer/concerns/caching.rb +7 -2
  18. data/lib/active_model/serializer/error_serializer.rb +2 -0
  19. data/lib/active_model/serializer/errors_serializer.rb +2 -0
  20. data/lib/active_model/serializer/field.rb +2 -0
  21. data/lib/active_model/serializer/fieldset.rb +3 -1
  22. data/lib/active_model/serializer/has_many_reflection.rb +2 -0
  23. data/lib/active_model/serializer/has_one_reflection.rb +2 -0
  24. data/lib/active_model/serializer/lazy_association.rb +6 -2
  25. data/lib/active_model/serializer/link.rb +23 -0
  26. data/lib/active_model/serializer/lint.rb +2 -0
  27. data/lib/active_model/serializer/null.rb +2 -0
  28. data/lib/active_model/serializer/reflection.rb +10 -5
  29. data/lib/active_model/serializer/version.rb +3 -1
  30. data/lib/active_model/serializer.rb +37 -19
  31. data/lib/active_model_serializers/adapter/attributes.rb +23 -0
  32. data/lib/active_model_serializers/adapter/base.rb +2 -0
  33. data/lib/active_model_serializers/adapter/json.rb +2 -0
  34. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +3 -1
  35. data/lib/active_model_serializers/adapter/json_api/error.rb +2 -0
  36. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +2 -0
  37. data/lib/active_model_serializers/adapter/json_api/link.rb +2 -0
  38. data/lib/active_model_serializers/adapter/json_api/meta.rb +2 -0
  39. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +45 -20
  40. data/lib/active_model_serializers/adapter/json_api/relationship.rb +18 -4
  41. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +33 -25
  42. data/lib/active_model_serializers/adapter/json_api.rb +14 -9
  43. data/lib/active_model_serializers/adapter/null.rb +2 -0
  44. data/lib/active_model_serializers/adapter.rb +3 -1
  45. data/lib/active_model_serializers/callbacks.rb +2 -0
  46. data/lib/active_model_serializers/deprecate.rb +2 -0
  47. data/lib/active_model_serializers/deserialization.rb +2 -0
  48. data/lib/active_model_serializers/json_pointer.rb +2 -0
  49. data/lib/active_model_serializers/logging.rb +2 -0
  50. data/lib/active_model_serializers/lookup_chain.rb +2 -0
  51. data/lib/active_model_serializers/model/caching.rb +26 -0
  52. data/lib/active_model_serializers/model.rb +2 -0
  53. data/lib/active_model_serializers/railtie.rb +4 -0
  54. data/lib/active_model_serializers/register_jsonapi_renderer.rb +2 -0
  55. data/lib/active_model_serializers/serializable_resource.rb +4 -2
  56. data/lib/active_model_serializers/serialization_context.rb +2 -0
  57. data/lib/active_model_serializers/test/schema.rb +2 -0
  58. data/lib/active_model_serializers/test/serializer.rb +2 -0
  59. data/lib/active_model_serializers/test.rb +2 -0
  60. data/lib/active_model_serializers.rb +21 -11
  61. data/lib/generators/rails/resource_override.rb +2 -0
  62. data/lib/generators/rails/serializer_generator.rb +2 -0
  63. data/lib/grape/active_model_serializers.rb +2 -0
  64. data/lib/grape/formatters/active_model_serializers.rb +2 -0
  65. data/lib/grape/helpers/active_model_serializers.rb +2 -0
  66. data/lib/tasks/rubocop.rake +2 -0
  67. metadata +43 -298
  68. data/.github/ISSUE_TEMPLATE.md +0 -29
  69. data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
  70. data/.gitignore +0 -35
  71. data/.rubocop.yml +0 -105
  72. data/.simplecov +0 -110
  73. data/.travis.yml +0 -55
  74. data/CODE_OF_CONDUCT.md +0 -74
  75. data/CONTRIBUTING.md +0 -105
  76. data/Gemfile +0 -56
  77. data/Rakefile +0 -74
  78. data/active_model_serializers.gemspec +0 -63
  79. data/appveyor.yml +0 -30
  80. data/bin/bench +0 -171
  81. data/bin/bench_regression +0 -316
  82. data/bin/rubocop +0 -38
  83. data/bin/serve_benchmark +0 -39
  84. data/docs/README.md +0 -41
  85. data/docs/STYLE.md +0 -58
  86. data/docs/general/adapters.md +0 -263
  87. data/docs/general/caching.md +0 -58
  88. data/docs/general/configuration_options.md +0 -169
  89. data/docs/general/deserialization.md +0 -100
  90. data/docs/general/fields.md +0 -31
  91. data/docs/general/getting_started.md +0 -133
  92. data/docs/general/instrumentation.md +0 -40
  93. data/docs/general/key_transforms.md +0 -40
  94. data/docs/general/logging.md +0 -21
  95. data/docs/general/rendering.md +0 -293
  96. data/docs/general/serializers.md +0 -480
  97. data/docs/how-open-source-maintained.jpg +0 -0
  98. data/docs/howto/add_pagination_links.md +0 -138
  99. data/docs/howto/add_relationship_links.md +0 -140
  100. data/docs/howto/add_root_key.md +0 -55
  101. data/docs/howto/grape_integration.md +0 -42
  102. data/docs/howto/outside_controller_use.md +0 -66
  103. data/docs/howto/passing_arbitrary_options.md +0 -27
  104. data/docs/howto/serialize_poro.md +0 -73
  105. data/docs/howto/test.md +0 -154
  106. data/docs/howto/upgrade_from_0_8_to_0_10.md +0 -265
  107. data/docs/integrations/ember-and-json-api.md +0 -147
  108. data/docs/integrations/grape.md +0 -19
  109. data/docs/jsonapi/errors.md +0 -56
  110. data/docs/jsonapi/schema/schema.json +0 -366
  111. data/docs/jsonapi/schema.md +0 -151
  112. data/docs/rfcs/0000-namespace.md +0 -106
  113. data/docs/rfcs/template.md +0 -15
  114. data/test/action_controller/adapter_selector_test.rb +0 -62
  115. data/test/action_controller/explicit_serializer_test.rb +0 -135
  116. data/test/action_controller/json/include_test.rb +0 -246
  117. data/test/action_controller/json_api/deserialization_test.rb +0 -112
  118. data/test/action_controller/json_api/errors_test.rb +0 -40
  119. data/test/action_controller/json_api/fields_test.rb +0 -66
  120. data/test/action_controller/json_api/linked_test.rb +0 -202
  121. data/test/action_controller/json_api/pagination_test.rb +0 -116
  122. data/test/action_controller/json_api/transform_test.rb +0 -189
  123. data/test/action_controller/lookup_proc_test.rb +0 -49
  124. data/test/action_controller/namespace_lookup_test.rb +0 -232
  125. data/test/action_controller/serialization_scope_name_test.rb +0 -235
  126. data/test/action_controller/serialization_test.rb +0 -472
  127. data/test/active_model_serializers/adapter_for_test.rb +0 -208
  128. data/test/active_model_serializers/json_pointer_test.rb +0 -22
  129. data/test/active_model_serializers/logging_test.rb +0 -77
  130. data/test/active_model_serializers/model_test.rb +0 -142
  131. data/test/active_model_serializers/railtie_test_isolated.rb +0 -68
  132. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -161
  133. data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -71
  134. data/test/active_model_serializers/test/schema_test.rb +0 -131
  135. data/test/active_model_serializers/test/serializer_test.rb +0 -62
  136. data/test/active_record_test.rb +0 -9
  137. data/test/adapter/attributes_test.rb +0 -40
  138. data/test/adapter/deprecation_test.rb +0 -100
  139. data/test/adapter/json/belongs_to_test.rb +0 -45
  140. data/test/adapter/json/collection_test.rb +0 -104
  141. data/test/adapter/json/has_many_test.rb +0 -53
  142. data/test/adapter/json/transform_test.rb +0 -93
  143. data/test/adapter/json_api/belongs_to_test.rb +0 -155
  144. data/test/adapter/json_api/collection_test.rb +0 -96
  145. data/test/adapter/json_api/errors_test.rb +0 -76
  146. data/test/adapter/json_api/fields_test.rb +0 -96
  147. data/test/adapter/json_api/has_many_embed_ids_test.rb +0 -43
  148. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -96
  149. data/test/adapter/json_api/has_many_test.rb +0 -173
  150. data/test/adapter/json_api/has_one_test.rb +0 -80
  151. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -183
  152. data/test/adapter/json_api/json_api_test.rb +0 -33
  153. data/test/adapter/json_api/linked_test.rb +0 -413
  154. data/test/adapter/json_api/links_test.rb +0 -95
  155. data/test/adapter/json_api/pagination_links_test.rb +0 -193
  156. data/test/adapter/json_api/parse_test.rb +0 -137
  157. data/test/adapter/json_api/relationship_test.rb +0 -397
  158. data/test/adapter/json_api/resource_identifier_test.rb +0 -110
  159. data/test/adapter/json_api/resource_meta_test.rb +0 -100
  160. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -82
  161. data/test/adapter/json_api/transform_test.rb +0 -512
  162. data/test/adapter/json_api/type_test.rb +0 -61
  163. data/test/adapter/json_test.rb +0 -46
  164. data/test/adapter/null_test.rb +0 -22
  165. data/test/adapter/polymorphic_test.rb +0 -171
  166. data/test/adapter_test.rb +0 -67
  167. data/test/array_serializer_test.rb +0 -22
  168. data/test/benchmark/app.rb +0 -65
  169. data/test/benchmark/benchmarking_support.rb +0 -67
  170. data/test/benchmark/bm_active_record.rb +0 -81
  171. data/test/benchmark/bm_adapter.rb +0 -38
  172. data/test/benchmark/bm_caching.rb +0 -119
  173. data/test/benchmark/bm_lookup_chain.rb +0 -83
  174. data/test/benchmark/bm_transform.rb +0 -45
  175. data/test/benchmark/config.ru +0 -3
  176. data/test/benchmark/controllers.rb +0 -83
  177. data/test/benchmark/fixtures.rb +0 -219
  178. data/test/cache_test.rb +0 -651
  179. data/test/collection_serializer_test.rb +0 -123
  180. data/test/fixtures/active_record.rb +0 -113
  181. data/test/fixtures/poro.rb +0 -225
  182. data/test/generators/scaffold_controller_generator_test.rb +0 -24
  183. data/test/generators/serializer_generator_test.rb +0 -75
  184. data/test/grape_test.rb +0 -196
  185. data/test/lint_test.rb +0 -49
  186. data/test/logger_test.rb +0 -20
  187. data/test/poro_test.rb +0 -9
  188. data/test/serializable_resource_test.rb +0 -79
  189. data/test/serializers/association_macros_test.rb +0 -37
  190. data/test/serializers/associations_test.rb +0 -424
  191. data/test/serializers/attribute_test.rb +0 -153
  192. data/test/serializers/attributes_test.rb +0 -52
  193. data/test/serializers/caching_configuration_test_isolated.rb +0 -170
  194. data/test/serializers/configuration_test.rb +0 -32
  195. data/test/serializers/fieldset_test.rb +0 -14
  196. data/test/serializers/meta_test.rb +0 -202
  197. data/test/serializers/options_test.rb +0 -32
  198. data/test/serializers/read_attribute_for_serialization_test.rb +0 -79
  199. data/test/serializers/reflection_test.rb +0 -427
  200. data/test/serializers/root_test.rb +0 -21
  201. data/test/serializers/serialization_test.rb +0 -55
  202. data/test/serializers/serializer_for_test.rb +0 -136
  203. data/test/serializers/serializer_for_with_namespace_test.rb +0 -88
  204. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  205. data/test/support/isolated_unit.rb +0 -82
  206. data/test/support/rails5_shims.rb +0 -53
  207. data/test/support/rails_app.rb +0 -38
  208. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  209. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
  210. data/test/support/schemas/custom/show.json +0 -7
  211. data/test/support/schemas/hyper_schema.json +0 -93
  212. data/test/support/schemas/render_using_json_api.json +0 -43
  213. data/test/support/schemas/simple_json_pointers.json +0 -10
  214. data/test/support/serialization_testing.rb +0 -71
  215. data/test/test_helper.rb +0 -70
@@ -1,83 +0,0 @@
1
- require_relative './benchmarking_support'
2
- require_relative './app'
3
-
4
- time = 10
5
- disable_gc = true
6
- ActiveModelSerializers.config.key_transform = :unaltered
7
-
8
- module AmsBench
9
- module Api
10
- module V1
11
- class PrimaryResourceSerializer < ActiveModel::Serializer
12
- attributes :title, :body
13
-
14
- has_many :has_many_relationships
15
- end
16
-
17
- class HasManyRelationshipSerializer < ActiveModel::Serializer
18
- attribute :body
19
- end
20
- end
21
- end
22
- class PrimaryResourceSerializer < ActiveModel::Serializer
23
- attributes :title, :body
24
-
25
- has_many :has_many_relationships
26
-
27
- class HasManyRelationshipSerializer < ActiveModel::Serializer
28
- attribute :body
29
- end
30
- end
31
- end
32
-
33
- resource = PrimaryResource.new(
34
- id: 1,
35
- title: 'title',
36
- body: 'body',
37
- has_many_relationships: [
38
- HasManyRelationship.new(id: 1, body: 'body1'),
39
- HasManyRelationship.new(id: 2, body: 'body1')
40
- ]
41
- )
42
-
43
- serialization = lambda do
44
- ActiveModelSerializers::SerializableResource.new(resource, serializer: AmsBench::PrimaryResourceSerializer).as_json
45
- ActiveModelSerializers::SerializableResource.new(resource, namespace: AmsBench::Api::V1).as_json
46
- ActiveModelSerializers::SerializableResource.new(resource).as_json
47
- end
48
-
49
- def clear_cache
50
- AmsBench::PrimaryResourceSerializer.serializers_cache.clear
51
- AmsBench::Api::V1::PrimaryResourceSerializer.serializers_cache.clear
52
- ActiveModel::Serializer.serializers_cache.clear
53
- end
54
-
55
- configurable = lambda do
56
- clear_cache
57
- Benchmark.ams('Configurable Lookup Chain', time: time, disable_gc: disable_gc, &serialization)
58
- end
59
-
60
- old = lambda do
61
- clear_cache
62
- module ActiveModel
63
- class Serializer
64
- def self.serializer_lookup_chain_for(klass, namespace = nil)
65
- chain = []
66
-
67
- resource_class_name = klass.name.demodulize
68
- resource_namespace = klass.name.deconstantize
69
- serializer_class_name = "#{resource_class_name}Serializer"
70
-
71
- chain.push("#{namespace}::#{serializer_class_name}") if namespace
72
- chain.push("#{name}::#{serializer_class_name}") if self != ActiveModel::Serializer
73
- chain.push("#{resource_namespace}::#{serializer_class_name}")
74
- chain
75
- end
76
- end
77
- end
78
-
79
- Benchmark.ams('Old Lookup Chain (v0.10)', time: time, disable_gc: disable_gc, &serialization)
80
- end
81
-
82
- configurable.call
83
- old.call
@@ -1,45 +0,0 @@
1
- require_relative './benchmarking_support'
2
- require_relative './app'
3
-
4
- time = 10
5
- disable_gc = true
6
- ActiveModelSerializers.config.key_transform = :unaltered
7
- has_many_relationships = (0..50).map do |i|
8
- HasManyRelationship.new(id: i, body: 'ZOMG A HAS MANY RELATIONSHIP')
9
- end
10
- has_one_relationship = HasOneRelationship.new(
11
- id: 42,
12
- first_name: 'Joao',
13
- last_name: 'Moura'
14
- )
15
- primary_resource = PrimaryResource.new(
16
- id: 1337,
17
- title: 'New PrimaryResource',
18
- virtual_attribute: nil,
19
- body: 'Body',
20
- has_many_relationships: has_many_relationships,
21
- has_one_relationship: has_one_relationship
22
- )
23
- serializer = PrimaryResourceSerializer.new(primary_resource)
24
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
25
- serialization = adapter.as_json
26
-
27
- Benchmark.ams('camel', time: time, disable_gc: disable_gc) do
28
- CaseTransform.camel(serialization)
29
- end
30
-
31
- Benchmark.ams('camel_lower', time: time, disable_gc: disable_gc) do
32
- CaseTransform.camel_lower(serialization)
33
- end
34
-
35
- Benchmark.ams('dash', time: time, disable_gc: disable_gc) do
36
- CaseTransform.dash(serialization)
37
- end
38
-
39
- Benchmark.ams('unaltered', time: time, disable_gc: disable_gc) do
40
- CaseTransform.unaltered(serialization)
41
- end
42
-
43
- Benchmark.ams('underscore', time: time, disable_gc: disable_gc) do
44
- CaseTransform.underscore(serialization)
45
- end
@@ -1,3 +0,0 @@
1
- require File.expand_path(['..', 'app'].join(File::SEPARATOR), __FILE__)
2
-
3
- run Rails.application
@@ -1,83 +0,0 @@
1
- class PrimaryResourceController < ActionController::Base
2
- PRIMARY_RESOURCE =
3
- begin
4
- if ENV['BENCH_STRESS']
5
- has_many_relationships = (0..50).map do |i|
6
- HasManyRelationship.new(id: i, body: 'ZOMG A HAS MANY RELATIONSHIP')
7
- end
8
- else
9
- has_many_relationships = [HasManyRelationship.new(id: 1, body: 'ZOMG A HAS MANY RELATIONSHIP')]
10
- end
11
- has_one_relationship = HasOneRelationship.new(id: 42, first_name: 'Joao', last_name: 'Moura')
12
- PrimaryResource.new(id: 1337, title: 'New PrimaryResource', virtual_attribute: nil, body: 'Body', has_many_relationships: has_many_relationships, has_one_relationship: has_one_relationship)
13
- end
14
-
15
- def render_with_caching_serializer
16
- toggle_cache_status
17
- render json: PRIMARY_RESOURCE, serializer: CachingPrimaryResourceSerializer, adapter: :json, meta: { caching: perform_caching }
18
- end
19
-
20
- def render_with_fragment_caching_serializer
21
- toggle_cache_status
22
- render json: PRIMARY_RESOURCE, serializer: FragmentCachingPrimaryResourceSerializer, adapter: :json, meta: { caching: perform_caching }
23
- end
24
-
25
- def render_with_non_caching_serializer
26
- toggle_cache_status
27
- render json: PRIMARY_RESOURCE, adapter: :json, meta: { caching: perform_caching }
28
- end
29
-
30
- def render_cache_status
31
- toggle_cache_status
32
- # Uncomment to debug
33
- # STDERR.puts cache_store.class
34
- # STDERR.puts cache_dependencies
35
- # ActiveSupport::Cache::Store.logger.debug [ActiveModelSerializers.config.cache_store, ActiveModelSerializers.config.perform_caching, CachingPrimaryResourceSerializer._cache, perform_caching, params].inspect
36
- render json: { caching: perform_caching, meta: { cache_log: cache_messages, cache_status: cache_status } }.to_json
37
- end
38
-
39
- def clear
40
- ActionController::Base.cache_store.clear
41
- # Test caching is on
42
- # Uncomment to turn on logger; possible performance issue
43
- # logger = BenchmarkLogger.new
44
- # ActiveSupport::Cache::Store.logger = logger # seems to be the best way
45
- #
46
- # the below is used in some rails tests but isn't available/working in all versions, so far as I can tell
47
- # https://github.com/rails/rails/pull/15943
48
- # ActiveSupport::Notifications.subscribe(/^cache_(.*)\.active_support$/) do |*args|
49
- # logger.debug ActiveSupport::Notifications::Event.new(*args)
50
- # end
51
- render json: 'ok'.to_json
52
- end
53
-
54
- private
55
-
56
- def cache_status
57
- {
58
- controller: perform_caching,
59
- app: Rails.configuration.action_controller.perform_caching,
60
- serializers: Rails.configuration.serializers.each_with_object({}) { |serializer, data| data[serializer.name] = serializer._cache.present? }
61
- }
62
- end
63
-
64
- def cache_messages
65
- ActiveSupport::Cache::Store.logger.is_a?(BenchmarkLogger) && ActiveSupport::Cache::Store.logger.messages.split("\n")
66
- end
67
-
68
- def toggle_cache_status
69
- case params[:on]
70
- when 'on'.freeze then self.perform_caching = true
71
- when 'off'.freeze then self.perform_caching = false
72
- else nil # no-op
73
- end
74
- end
75
- end
76
-
77
- Rails.application.routes.draw do
78
- get '/status(/:on)' => 'primary_resource#render_cache_status'
79
- get '/clear' => 'primary_resource#clear'
80
- get '/caching(/:on)' => 'primary_resource#render_with_caching_serializer'
81
- get '/fragment_caching(/:on)' => 'primary_resource#render_with_fragment_caching_serializer'
82
- get '/non_caching(/:on)' => 'primary_resource#render_with_non_caching_serializer'
83
- end
@@ -1,219 +0,0 @@
1
- Rails.configuration.serializers = []
2
- class HasOneRelationshipSerializer < ActiveModel::Serializer
3
- attributes :id, :first_name, :last_name
4
-
5
- has_many :primary_resources, embed: :ids
6
- has_one :bio
7
- end
8
- Rails.configuration.serializers << HasOneRelationshipSerializer
9
-
10
- class VirtualAttributeSerializer < ActiveModel::Serializer
11
- attributes :id, :name
12
- end
13
- Rails.configuration.serializers << VirtualAttributeSerializer
14
-
15
- class HasManyRelationshipSerializer < ActiveModel::Serializer
16
- attributes :id, :body
17
-
18
- belongs_to :primary_resource
19
- belongs_to :has_one_relationship
20
- end
21
- Rails.configuration.serializers << HasManyRelationshipSerializer
22
-
23
- class PrimaryResourceSerializer < ActiveModel::Serializer
24
- attributes :id, :title, :body
25
-
26
- has_many :has_many_relationships, serializer: HasManyRelationshipSerializer
27
- belongs_to :virtual_attribute, serializer: VirtualAttributeSerializer
28
- belongs_to :has_one_relationship, serializer: HasOneRelationshipSerializer
29
-
30
- link(:primary_resource_has_one_relationships) { 'https://example.com/primary_resource_has_one_relationships' }
31
-
32
- meta do
33
- {
34
- rating: 5,
35
- favorite_count: 10
36
- }
37
- end
38
-
39
- def virtual_attribute
40
- VirtualAttribute.new(id: 999, name: 'Free-Range Virtual Attribute')
41
- end
42
- end
43
- Rails.configuration.serializers << PrimaryResourceSerializer
44
-
45
- class CachingHasOneRelationshipSerializer < HasOneRelationshipSerializer
46
- cache key: 'writer', skip_digest: true
47
- end
48
- Rails.configuration.serializers << CachingHasOneRelationshipSerializer
49
-
50
- class CachingHasManyRelationshipSerializer < HasManyRelationshipSerializer
51
- cache expires_in: 1.day, skip_digest: true
52
- end
53
- Rails.configuration.serializers << CachingHasManyRelationshipSerializer
54
-
55
- # see https://github.com/rails-api/active_model_serializers/pull/1690/commits/68715b8f99bc29677e8a47bb3f305f23c077024b#r60344532
56
- class CachingPrimaryResourceSerializer < ActiveModel::Serializer
57
- cache key: 'primary_resource', expires_in: 0.1, skip_digest: true
58
-
59
- attributes :id, :title, :body
60
-
61
- belongs_to :virtual_attribute, serializer: VirtualAttributeSerializer
62
- belongs_to :has_one_relationship, serializer: CachingHasOneRelationshipSerializer
63
- has_many :has_many_relationships, serializer: CachingHasManyRelationshipSerializer
64
-
65
- link(:primary_resource_has_one_relationships) { 'https://example.com/primary_resource_has_one_relationships' }
66
-
67
- meta do
68
- {
69
- rating: 5,
70
- favorite_count: 10
71
- }
72
- end
73
-
74
- def virtual_attribute
75
- VirtualAttribute.new(id: 999, name: 'Free-Range Virtual Attribute')
76
- end
77
- end
78
- Rails.configuration.serializers << CachingPrimaryResourceSerializer
79
-
80
- class FragmentCachingHasOneRelationshipSerializer < HasOneRelationshipSerializer
81
- cache key: 'writer', only: [:first_name, :last_name], skip_digest: true
82
- end
83
- Rails.configuration.serializers << FragmentCachingHasOneRelationshipSerializer
84
-
85
- class FragmentCachingHasManyRelationshipSerializer < HasManyRelationshipSerializer
86
- cache expires_in: 1.day, except: [:body], skip_digest: true
87
- end
88
- Rails.configuration.serializers << CachingHasManyRelationshipSerializer
89
-
90
- # see https://github.com/rails-api/active_model_serializers/pull/1690/commits/68715b8f99bc29677e8a47bb3f305f23c077024b#r60344532
91
- class FragmentCachingPrimaryResourceSerializer < ActiveModel::Serializer
92
- cache key: 'primary_resource', expires_in: 0.1, skip_digest: true
93
-
94
- attributes :id, :title, :body
95
-
96
- belongs_to :virtual_attribute, serializer: VirtualAttributeSerializer
97
- belongs_to :has_one_relationship, serializer: FragmentCachingHasOneRelationshipSerializer
98
- has_many :has_many_relationships, serializer: FragmentCachingHasManyRelationshipSerializer
99
-
100
- link(:primary_resource_has_one_relationships) { 'https://example.com/primary_resource_has_one_relationships' }
101
-
102
- meta do
103
- {
104
- rating: 5,
105
- favorite_count: 10
106
- }
107
- end
108
-
109
- def virtual_attribute
110
- VirtualAttribute.new(id: 999, name: 'Free-Range Virtual Attribute')
111
- end
112
- end
113
- Rails.configuration.serializers << FragmentCachingPrimaryResourceSerializer
114
-
115
- if ENV['ENABLE_ACTIVE_RECORD'] == 'true'
116
- require 'active_record'
117
-
118
- ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
119
- ActiveRecord::Schema.define do
120
- self.verbose = false
121
-
122
- create_table :virtual_attributes, force: true do |t|
123
- t.string :name
124
- t.timestamps null: false
125
- end
126
- create_table :has_one_relationships, force: true do |t|
127
- t.string :first_name
128
- t.string :last_name
129
- t.timestamps null: false
130
- end
131
- create_table :primary_resources, force: true do |t|
132
- t.string :title
133
- t.text :body
134
- t.references :has_one_relationship
135
- t.references :virtual_attribute
136
- t.timestamps null: false
137
- end
138
- create_table :has_many_relationships, force: true do |t|
139
- t.text :body
140
- t.references :has_one_relationship
141
- t.references :primary_resource
142
- t.timestamps null: false
143
- end
144
- end
145
-
146
- class HasManyRelationship < ActiveRecord::Base
147
- belongs_to :has_one_relationship
148
- belongs_to :primary_resource
149
- end
150
-
151
- class HasOneRelationship < ActiveRecord::Base
152
- has_many :primary_resources
153
- has_many :has_many_relationships
154
- end
155
-
156
- class PrimaryResource < ActiveRecord::Base
157
- has_many :has_many_relationships
158
- belongs_to :has_one_relationship
159
- belongs_to :virtual_attribute
160
- end
161
-
162
- class VirtualAttribute < ActiveRecord::Base
163
- has_many :primary_resources
164
- end
165
- else
166
- # ActiveModelSerializers::Model is a convenient
167
- # serializable class to inherit from when making
168
- # serializable non-activerecord objects.
169
- class BenchmarkModel
170
- include ActiveModel::Model
171
- include ActiveModel::Serializers::JSON
172
-
173
- attr_reader :attributes
174
-
175
- def initialize(attributes = {})
176
- @attributes = attributes
177
- super
178
- end
179
-
180
- # Defaults to the downcased model name.
181
- def id
182
- attributes.fetch(:id) { self.class.name.downcase }
183
- end
184
-
185
- # Defaults to the downcased model name and updated_at
186
- def cache_key
187
- attributes.fetch(:cache_key) { "#{self.class.name.downcase}/#{id}" }
188
- end
189
-
190
- # Defaults to the time the serializer file was modified.
191
- def updated_at
192
- @updated_at ||= attributes.fetch(:updated_at) { File.mtime(__FILE__) }
193
- end
194
-
195
- def read_attribute_for_serialization(key)
196
- if key == :id || key == 'id'
197
- attributes.fetch(key) { id }
198
- else
199
- attributes[key]
200
- end
201
- end
202
- end
203
-
204
- class HasManyRelationship < BenchmarkModel
205
- attr_accessor :id, :body
206
- end
207
-
208
- class HasOneRelationship < BenchmarkModel
209
- attr_accessor :id, :first_name, :last_name, :primary_resources
210
- end
211
-
212
- class PrimaryResource < BenchmarkModel
213
- attr_accessor :id, :title, :body, :has_many_relationships, :virtual_attribute, :has_one_relationship
214
- end
215
-
216
- class VirtualAttribute < BenchmarkModel
217
- attr_accessor :id, :name
218
- end
219
- end