active_model_serializers 0.10.9 → 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 (161) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +41 -2
  3. data/README.md +18 -19
  4. data/lib/action_controller/serialization.rb +9 -1
  5. data/lib/active_model/serializer/collection_serializer.rb +11 -2
  6. data/lib/active_model/serializer/concerns/caching.rb +2 -1
  7. data/lib/active_model/serializer/fieldset.rb +1 -1
  8. data/lib/active_model/serializer/reflection.rb +4 -4
  9. data/lib/active_model/serializer/version.rb +1 -1
  10. data/lib/active_model/serializer.rb +13 -4
  11. data/lib/active_model_serializers/adapter/attributes.rb +21 -0
  12. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +5 -1
  13. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +1 -1
  14. data/lib/active_model_serializers/model/caching.rb +26 -0
  15. metadata +20 -292
  16. data/.github/ISSUE_TEMPLATE.md +0 -29
  17. data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
  18. data/.gitignore +0 -35
  19. data/.rubocop.yml +0 -109
  20. data/.simplecov +0 -110
  21. data/.travis.yml +0 -63
  22. data/CODE_OF_CONDUCT.md +0 -74
  23. data/CONTRIBUTING.md +0 -105
  24. data/Gemfile +0 -74
  25. data/Rakefile +0 -76
  26. data/active_model_serializers.gemspec +0 -64
  27. data/appveyor.yml +0 -28
  28. data/bin/bench +0 -171
  29. data/bin/bench_regression +0 -316
  30. data/bin/rubocop +0 -38
  31. data/bin/serve_benchmark +0 -39
  32. data/docs/README.md +0 -41
  33. data/docs/STYLE.md +0 -58
  34. data/docs/general/adapters.md +0 -269
  35. data/docs/general/caching.md +0 -58
  36. data/docs/general/configuration_options.md +0 -185
  37. data/docs/general/deserialization.md +0 -100
  38. data/docs/general/fields.md +0 -31
  39. data/docs/general/getting_started.md +0 -133
  40. data/docs/general/instrumentation.md +0 -40
  41. data/docs/general/key_transforms.md +0 -40
  42. data/docs/general/logging.md +0 -21
  43. data/docs/general/rendering.md +0 -293
  44. data/docs/general/serializers.md +0 -495
  45. data/docs/how-open-source-maintained.jpg +0 -0
  46. data/docs/howto/add_pagination_links.md +0 -138
  47. data/docs/howto/add_relationship_links.md +0 -140
  48. data/docs/howto/add_root_key.md +0 -62
  49. data/docs/howto/grape_integration.md +0 -42
  50. data/docs/howto/outside_controller_use.md +0 -66
  51. data/docs/howto/passing_arbitrary_options.md +0 -27
  52. data/docs/howto/serialize_poro.md +0 -73
  53. data/docs/howto/test.md +0 -154
  54. data/docs/howto/upgrade_from_0_8_to_0_10.md +0 -265
  55. data/docs/integrations/ember-and-json-api.md +0 -147
  56. data/docs/integrations/grape.md +0 -19
  57. data/docs/jsonapi/errors.md +0 -56
  58. data/docs/jsonapi/schema/schema.json +0 -366
  59. data/docs/jsonapi/schema.md +0 -151
  60. data/docs/rfcs/0000-namespace.md +0 -106
  61. data/docs/rfcs/template.md +0 -15
  62. data/test/action_controller/adapter_selector_test.rb +0 -64
  63. data/test/action_controller/explicit_serializer_test.rb +0 -137
  64. data/test/action_controller/json/include_test.rb +0 -248
  65. data/test/action_controller/json_api/deserialization_test.rb +0 -114
  66. data/test/action_controller/json_api/errors_test.rb +0 -42
  67. data/test/action_controller/json_api/fields_test.rb +0 -68
  68. data/test/action_controller/json_api/linked_test.rb +0 -204
  69. data/test/action_controller/json_api/pagination_test.rb +0 -126
  70. data/test/action_controller/json_api/transform_test.rb +0 -191
  71. data/test/action_controller/lookup_proc_test.rb +0 -51
  72. data/test/action_controller/namespace_lookup_test.rb +0 -234
  73. data/test/action_controller/serialization_scope_name_test.rb +0 -237
  74. data/test/action_controller/serialization_test.rb +0 -480
  75. data/test/active_model_serializers/adapter_for_test.rb +0 -210
  76. data/test/active_model_serializers/json_pointer_test.rb +0 -24
  77. data/test/active_model_serializers/logging_test.rb +0 -79
  78. data/test/active_model_serializers/model_test.rb +0 -144
  79. data/test/active_model_serializers/railtie_test_isolated.rb +0 -70
  80. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -163
  81. data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -73
  82. data/test/active_model_serializers/test/schema_test.rb +0 -133
  83. data/test/active_model_serializers/test/serializer_test.rb +0 -64
  84. data/test/active_record_test.rb +0 -11
  85. data/test/adapter/attributes_test.rb +0 -42
  86. data/test/adapter/deprecation_test.rb +0 -102
  87. data/test/adapter/json/belongs_to_test.rb +0 -47
  88. data/test/adapter/json/collection_test.rb +0 -106
  89. data/test/adapter/json/has_many_test.rb +0 -55
  90. data/test/adapter/json/transform_test.rb +0 -95
  91. data/test/adapter/json_api/belongs_to_test.rb +0 -157
  92. data/test/adapter/json_api/collection_test.rb +0 -98
  93. data/test/adapter/json_api/errors_test.rb +0 -78
  94. data/test/adapter/json_api/fields_test.rb +0 -98
  95. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -98
  96. data/test/adapter/json_api/has_many_test.rb +0 -175
  97. data/test/adapter/json_api/has_one_test.rb +0 -82
  98. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -215
  99. data/test/adapter/json_api/json_api_test.rb +0 -35
  100. data/test/adapter/json_api/linked_test.rb +0 -415
  101. data/test/adapter/json_api/links_test.rb +0 -112
  102. data/test/adapter/json_api/pagination_links_test.rb +0 -208
  103. data/test/adapter/json_api/parse_test.rb +0 -139
  104. data/test/adapter/json_api/relationship_test.rb +0 -399
  105. data/test/adapter/json_api/resource_meta_test.rb +0 -102
  106. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -84
  107. data/test/adapter/json_api/transform_test.rb +0 -514
  108. data/test/adapter/json_api/type_test.rb +0 -195
  109. data/test/adapter/json_test.rb +0 -48
  110. data/test/adapter/null_test.rb +0 -24
  111. data/test/adapter/polymorphic_test.rb +0 -220
  112. data/test/adapter_test.rb +0 -69
  113. data/test/array_serializer_test.rb +0 -24
  114. data/test/benchmark/app.rb +0 -67
  115. data/test/benchmark/benchmarking_support.rb +0 -69
  116. data/test/benchmark/bm_active_record.rb +0 -83
  117. data/test/benchmark/bm_adapter.rb +0 -40
  118. data/test/benchmark/bm_caching.rb +0 -121
  119. data/test/benchmark/bm_lookup_chain.rb +0 -85
  120. data/test/benchmark/bm_transform.rb +0 -47
  121. data/test/benchmark/config.ru +0 -3
  122. data/test/benchmark/controllers.rb +0 -85
  123. data/test/benchmark/fixtures.rb +0 -221
  124. data/test/cache_test.rb +0 -717
  125. data/test/collection_serializer_test.rb +0 -129
  126. data/test/fixtures/active_record.rb +0 -115
  127. data/test/fixtures/poro.rb +0 -227
  128. data/test/generators/scaffold_controller_generator_test.rb +0 -26
  129. data/test/generators/serializer_generator_test.rb +0 -77
  130. data/test/grape_test.rb +0 -198
  131. data/test/lint_test.rb +0 -51
  132. data/test/logger_test.rb +0 -22
  133. data/test/poro_test.rb +0 -11
  134. data/test/serializable_resource_test.rb +0 -81
  135. data/test/serializers/association_macros_test.rb +0 -39
  136. data/test/serializers/associations_test.rb +0 -520
  137. data/test/serializers/attribute_test.rb +0 -155
  138. data/test/serializers/attributes_test.rb +0 -54
  139. data/test/serializers/caching_configuration_test_isolated.rb +0 -172
  140. data/test/serializers/configuration_test.rb +0 -34
  141. data/test/serializers/fieldset_test.rb +0 -16
  142. data/test/serializers/meta_test.rb +0 -204
  143. data/test/serializers/options_test.rb +0 -34
  144. data/test/serializers/read_attribute_for_serialization_test.rb +0 -81
  145. data/test/serializers/reflection_test.rb +0 -481
  146. data/test/serializers/root_test.rb +0 -23
  147. data/test/serializers/serialization_test.rb +0 -57
  148. data/test/serializers/serializer_for_test.rb +0 -138
  149. data/test/serializers/serializer_for_with_namespace_test.rb +0 -90
  150. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  151. data/test/support/isolated_unit.rb +0 -86
  152. data/test/support/rails5_shims.rb +0 -55
  153. data/test/support/rails_app.rb +0 -40
  154. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  155. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
  156. data/test/support/schemas/custom/show.json +0 -7
  157. data/test/support/schemas/hyper_schema.json +0 -93
  158. data/test/support/schemas/render_using_json_api.json +0 -43
  159. data/test/support/schemas/simple_json_pointers.json +0 -10
  160. data/test/support/serialization_testing.rb +0 -81
  161. data/test/test_helper.rb +0 -72
@@ -1,69 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'benchmark/ips'
4
- require 'json'
5
-
6
- # Add benchmarking runner from ruby-bench-suite
7
- # https://github.com/ruby-bench/ruby-bench-suite/blob/master/rails/benchmarks/support/benchmark_rails.rb
8
- module Benchmark
9
- module ActiveModelSerializers
10
- module TestMethods
11
- def request(method, path)
12
- response = Rack::MockRequest.new(BenchmarkApp).send(method, path)
13
- if response.status.in?([404, 500])
14
- fail "omg, #{method}, #{path}, '#{response.status}', '#{response.body}'"
15
- end
16
- response
17
- end
18
- end
19
-
20
- # extend Benchmark with an `ams` method
21
- def ams(label = nil, time:, disable_gc: true, warmup: 3, &block)
22
- fail ArgumentError.new, 'block should be passed' unless block_given?
23
-
24
- if disable_gc
25
- GC.disable
26
- else
27
- GC.enable
28
- end
29
-
30
- report = Benchmark.ips(time, warmup, true) do |x|
31
- x.report(label) { yield }
32
- end
33
-
34
- entry = report.entries.first
35
-
36
- output = {
37
- label: label,
38
- version: ::ActiveModel::Serializer::VERSION.to_s,
39
- rails_version: ::Rails.version.to_s,
40
- iterations_per_second: entry.ips,
41
- iterations_per_second_standard_deviation: entry.error_percentage,
42
- total_allocated_objects_per_iteration: count_total_allocated_objects(&block)
43
- }.to_json
44
-
45
- puts output
46
- output
47
- end
48
-
49
- def count_total_allocated_objects
50
- if block_given?
51
- key =
52
- if RUBY_VERSION < '2.2'
53
- :total_allocated_object
54
- else
55
- :total_allocated_objects
56
- end
57
-
58
- before = GC.stat[key]
59
- yield
60
- after = GC.stat[key]
61
- after - before
62
- else
63
- -1
64
- end
65
- end
66
- end
67
-
68
- extend Benchmark::ActiveModelSerializers
69
- end
@@ -1,83 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative './benchmarking_support'
4
- require_relative './app'
5
-
6
- time = 10
7
- disable_gc = true
8
-
9
- # This is to disable any key transform effects that may impact performance
10
- ActiveModelSerializers.config.key_transform = :unaltered
11
-
12
- ###########################################
13
- # Setup active record models
14
- ##########################################
15
- require 'active_record'
16
- require 'sqlite3'
17
-
18
- # For debugging SQL output
19
- # ActiveRecord::Base.logger = Logger.new(STDERR)
20
-
21
- # Change the following to reflect your database settings
22
- ActiveRecord::Base.establish_connection(
23
- adapter: 'sqlite3',
24
- database: ':memory:'
25
- )
26
-
27
- # Don't show migration output when constructing fake db
28
- ActiveRecord::Migration.verbose = false
29
-
30
- ActiveRecord::Schema.define do
31
- create_table :authors, force: true do |t|
32
- t.string :name
33
- end
34
-
35
- create_table :posts, force: true do |t|
36
- t.text :body
37
- t.string :title
38
- t.references :author
39
- end
40
-
41
- create_table :profiles, force: true do |t|
42
- t.text :project_url
43
- t.text :bio
44
- t.date :birthday
45
- t.references :author
46
- end
47
- end
48
-
49
- class Author < ActiveRecord::Base
50
- has_one :profile
51
- has_many :posts
52
- end
53
-
54
- class Post < ActiveRecord::Base
55
- belongs_to :author
56
- end
57
-
58
- class Profile < ActiveRecord::Base
59
- belongs_to :author
60
- end
61
-
62
- # Build out the data to serialize
63
- author = Author.create(name: 'Preston Sego')
64
- Profile.create(project_url: 'https://github.com/NullVoxPopuli', author: author)
65
- 50.times do
66
- Post.create(
67
- body: 'something about how password restrictions are evil, and less secure, and with the math to prove it.',
68
- title: 'Your bank is does not know how to do security',
69
- author: author
70
- )
71
- end
72
-
73
- Benchmark.ams('AR: attributes', time: time, disable_gc: disable_gc) do
74
- ActiveModelSerializers::SerializableResource.new(author, adapter: :attributes, include: 'profile,posts').serializable_hash
75
- end
76
-
77
- Benchmark.ams('AR: json', time: time, disable_gc: disable_gc) do
78
- ActiveModelSerializers::SerializableResource.new(author, adapter: :json, include: 'profile,posts').serializable_hash
79
- end
80
-
81
- Benchmark.ams('AR: JSON API', time: time, disable_gc: disable_gc) do
82
- ActiveModelSerializers::SerializableResource.new(author, adapter: :json_api, include: 'profile,posts').serializable_hash
83
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative './benchmarking_support'
4
- require_relative './app'
5
-
6
- time = 10
7
- disable_gc = true
8
- ActiveModelSerializers.config.key_transform = :unaltered
9
- has_many_relationships = (0..60).map do |i|
10
- HasManyRelationship.new(id: i, body: 'ZOMG A HAS MANY RELATIONSHIP')
11
- end
12
- has_one_relationship = HasOneRelationship.new(
13
- id: 42,
14
- first_name: 'Joao',
15
- last_name: 'Moura'
16
- )
17
- primary_resource = PrimaryResource.new(
18
- id: 1337,
19
- title: 'New PrimaryResource',
20
- virtual_attribute: nil,
21
- body: 'Body',
22
- has_many_relationships: has_many_relationships,
23
- has_one_relationship: has_one_relationship
24
- )
25
- serializer = PrimaryResourceSerializer.new(primary_resource)
26
-
27
- Benchmark.ams('attributes', time: time, disable_gc: disable_gc) do
28
- attributes = ActiveModelSerializers::Adapter::Attributes.new(serializer)
29
- attributes.as_json
30
- end
31
-
32
- Benchmark.ams('json_api', time: time, disable_gc: disable_gc) do
33
- json_api = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
34
- json_api.as_json
35
- end
36
-
37
- Benchmark.ams('json', time: time, disable_gc: disable_gc) do
38
- json = ActiveModelSerializers::Adapter::Json.new(serializer)
39
- json.as_json
40
- end
@@ -1,121 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative './benchmarking_support'
4
- require_relative './app'
5
-
6
- # https://github.com/ruby-bench/ruby-bench-suite/blob/8ad567f7e43a044ae48c36833218423bb1e2bd9d/rails/benchmarks/actionpack_router.rb
7
- class ApiAssertion
8
- include Benchmark::ActiveModelSerializers::TestMethods
9
- class BadRevisionError < StandardError; end
10
-
11
- def valid?
12
- caching = get_caching
13
- caching[:body].delete('meta')
14
- non_caching = get_non_caching
15
- non_caching[:body].delete('meta')
16
- assert_responses(caching, non_caching)
17
- rescue BadRevisionError => e
18
- msg = { error: e.message }
19
- STDERR.puts msg
20
- STDOUT.puts msg
21
- exit 1
22
- end
23
-
24
- def get_status(on_off = 'on'.freeze)
25
- get("/status/#{on_off}")
26
- end
27
-
28
- def clear
29
- get('/clear')
30
- end
31
-
32
- def get_caching(on_off = 'on'.freeze)
33
- get("/caching/#{on_off}")
34
- end
35
-
36
- def get_fragment_caching(on_off = 'on'.freeze)
37
- get("/fragment_caching/#{on_off}")
38
- end
39
-
40
- def get_non_caching(on_off = 'on'.freeze)
41
- get("/non_caching/#{on_off}")
42
- end
43
-
44
- def debug(msg = '')
45
- if block_given? && ENV['DEBUG'] =~ /\Atrue|on|0\z/i
46
- STDERR.puts yield
47
- else
48
- STDERR.puts msg
49
- end
50
- end
51
-
52
- private
53
-
54
- def assert_responses(caching, non_caching)
55
- assert_equal(caching[:code], 200, "Caching response failed: #{caching}")
56
- assert_equal(caching[:body], expected, "Caching response format failed: \n+ #{caching[:body]}\n- #{expected}")
57
- assert_equal(caching[:content_type], 'application/json; charset=utf-8', "Caching response content type failed: \n+ #{caching[:content_type]}\n- application/json")
58
- assert_equal(non_caching[:code], 200, "Non caching response failed: #{non_caching}")
59
- assert_equal(non_caching[:body], expected, "Non Caching response format failed: \n+ #{non_caching[:body]}\n- #{expected}")
60
- assert_equal(non_caching[:content_type], 'application/json; charset=utf-8', "Non caching response content type failed: \n+ #{non_caching[:content_type]}\n- application/json")
61
- end
62
-
63
- def get(url)
64
- response = request(:get, url)
65
- { code: response.status, body: JSON.load(response.body), content_type: response.content_type }
66
- end
67
-
68
- def expected
69
- @expected ||=
70
- {
71
- 'primary_resource' => {
72
- 'id' => 1337,
73
- 'title' => 'New PrimaryResource',
74
- 'body' => 'Body',
75
- 'virtual_attribute' => {
76
- 'id' => 999,
77
- 'name' => 'Free-Range Virtual Attribute'
78
- },
79
- 'has_one_relationship' => {
80
- 'id' => 42,
81
- 'first_name' => 'Joao',
82
- 'last_name' => 'Moura'
83
- },
84
- 'has_many_relationships' => [
85
- {
86
- 'id' => 1,
87
- 'body' => 'ZOMG A HAS MANY RELATIONSHIP'
88
- }
89
- ]
90
- }
91
- }
92
- end
93
-
94
- def assert_equal(expected, actual, message)
95
- return true if expected == actual
96
- if ENV['FAIL_ASSERTION'] =~ /\Atrue|on|0\z/i # rubocop:disable Style/GuardClause
97
- fail BadRevisionError, message
98
- else
99
- STDERR.puts message unless ENV['SUMMARIZE']
100
- end
101
- end
102
- end
103
- assertion = ApiAssertion.new
104
- assertion.valid?
105
- assertion.debug { assertion.get_status }
106
-
107
- time = 10
108
- {
109
- 'caching on: caching serializers: gc off' => { disable_gc: true, send: [:get_caching, 'on'] },
110
- 'caching on: fragment caching serializers: gc off' => { disable_gc: true, send: [:get_fragment_caching, 'on'] },
111
- 'caching on: non-caching serializers: gc off' => { disable_gc: true, send: [:get_non_caching, 'on'] },
112
- 'caching off: caching serializers: gc off' => { disable_gc: true, send: [:get_caching, 'off'] },
113
- 'caching off: fragment caching serializers: gc off' => { disable_gc: true, send: [:get_fragment_caching, 'off'] },
114
- 'caching off: non-caching serializers: gc off' => { disable_gc: true, send: [:get_non_caching, 'off'] }
115
- }.each do |label, options|
116
- assertion.clear
117
- Benchmark.ams(label, time: time, disable_gc: options[:disable_gc]) do
118
- assertion.send(*options[:send])
119
- end
120
- assertion.debug { assertion.get_status(options[:send][-1]) }
121
- end
@@ -1,85 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative './benchmarking_support'
4
- require_relative './app'
5
-
6
- time = 10
7
- disable_gc = true
8
- ActiveModelSerializers.config.key_transform = :unaltered
9
-
10
- module AmsBench
11
- module Api
12
- module V1
13
- class PrimaryResourceSerializer < ActiveModel::Serializer
14
- attributes :title, :body
15
-
16
- has_many :has_many_relationships
17
- end
18
-
19
- class HasManyRelationshipSerializer < ActiveModel::Serializer
20
- attribute :body
21
- end
22
- end
23
- end
24
- class PrimaryResourceSerializer < ActiveModel::Serializer
25
- attributes :title, :body
26
-
27
- has_many :has_many_relationships
28
-
29
- class HasManyRelationshipSerializer < ActiveModel::Serializer
30
- attribute :body
31
- end
32
- end
33
- end
34
-
35
- resource = PrimaryResource.new(
36
- id: 1,
37
- title: 'title',
38
- body: 'body',
39
- has_many_relationships: [
40
- HasManyRelationship.new(id: 1, body: 'body1'),
41
- HasManyRelationship.new(id: 2, body: 'body1')
42
- ]
43
- )
44
-
45
- serialization = lambda do
46
- ActiveModelSerializers::SerializableResource.new(resource, serializer: AmsBench::PrimaryResourceSerializer).as_json
47
- ActiveModelSerializers::SerializableResource.new(resource, namespace: AmsBench::Api::V1).as_json
48
- ActiveModelSerializers::SerializableResource.new(resource).as_json
49
- end
50
-
51
- def clear_cache
52
- AmsBench::PrimaryResourceSerializer.serializers_cache.clear
53
- AmsBench::Api::V1::PrimaryResourceSerializer.serializers_cache.clear
54
- ActiveModel::Serializer.serializers_cache.clear
55
- end
56
-
57
- configurable = lambda do
58
- clear_cache
59
- Benchmark.ams('Configurable Lookup Chain', time: time, disable_gc: disable_gc, &serialization)
60
- end
61
-
62
- old = lambda do
63
- clear_cache
64
- module ActiveModel
65
- class Serializer
66
- def self.serializer_lookup_chain_for(klass, namespace = nil)
67
- chain = []
68
-
69
- resource_class_name = klass.name.demodulize
70
- resource_namespace = klass.name.deconstantize
71
- serializer_class_name = "#{resource_class_name}Serializer"
72
-
73
- chain.push("#{namespace}::#{serializer_class_name}") if namespace
74
- chain.push("#{name}::#{serializer_class_name}") if self != ActiveModel::Serializer
75
- chain.push("#{resource_namespace}::#{serializer_class_name}")
76
- chain
77
- end
78
- end
79
- end
80
-
81
- Benchmark.ams('Old Lookup Chain (v0.10)', time: time, disable_gc: disable_gc, &serialization)
82
- end
83
-
84
- configurable.call
85
- old.call
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative './benchmarking_support'
4
- require_relative './app'
5
-
6
- time = 10
7
- disable_gc = true
8
- ActiveModelSerializers.config.key_transform = :unaltered
9
- has_many_relationships = (0..50).map do |i|
10
- HasManyRelationship.new(id: i, body: 'ZOMG A HAS MANY RELATIONSHIP')
11
- end
12
- has_one_relationship = HasOneRelationship.new(
13
- id: 42,
14
- first_name: 'Joao',
15
- last_name: 'Moura'
16
- )
17
- primary_resource = PrimaryResource.new(
18
- id: 1337,
19
- title: 'New PrimaryResource',
20
- virtual_attribute: nil,
21
- body: 'Body',
22
- has_many_relationships: has_many_relationships,
23
- has_one_relationship: has_one_relationship
24
- )
25
- serializer = PrimaryResourceSerializer.new(primary_resource)
26
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
27
- serialization = adapter.as_json
28
-
29
- Benchmark.ams('camel', time: time, disable_gc: disable_gc) do
30
- CaseTransform.camel(serialization)
31
- end
32
-
33
- Benchmark.ams('camel_lower', time: time, disable_gc: disable_gc) do
34
- CaseTransform.camel_lower(serialization)
35
- end
36
-
37
- Benchmark.ams('dash', time: time, disable_gc: disable_gc) do
38
- CaseTransform.dash(serialization)
39
- end
40
-
41
- Benchmark.ams('unaltered', time: time, disable_gc: disable_gc) do
42
- CaseTransform.unaltered(serialization)
43
- end
44
-
45
- Benchmark.ams('underscore', time: time, disable_gc: disable_gc) do
46
- CaseTransform.underscore(serialization)
47
- end
@@ -1,3 +0,0 @@
1
- require File.expand_path(['..', 'app'].join(File::SEPARATOR), __FILE__)
2
-
3
- run Rails.application
@@ -1,85 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class PrimaryResourceController < ActionController::Base
4
- PRIMARY_RESOURCE =
5
- begin
6
- if ENV['BENCH_STRESS']
7
- has_many_relationships = (0..50).map do |i|
8
- HasManyRelationship.new(id: i, body: 'ZOMG A HAS MANY RELATIONSHIP')
9
- end
10
- else
11
- has_many_relationships = [HasManyRelationship.new(id: 1, body: 'ZOMG A HAS MANY RELATIONSHIP')]
12
- end
13
- has_one_relationship = HasOneRelationship.new(id: 42, first_name: 'Joao', last_name: 'Moura')
14
- PrimaryResource.new(id: 1337, title: 'New PrimaryResource', virtual_attribute: nil, body: 'Body', has_many_relationships: has_many_relationships, has_one_relationship: has_one_relationship)
15
- end
16
-
17
- def render_with_caching_serializer
18
- toggle_cache_status
19
- render json: PRIMARY_RESOURCE, serializer: CachingPrimaryResourceSerializer, adapter: :json, meta: { caching: perform_caching }
20
- end
21
-
22
- def render_with_fragment_caching_serializer
23
- toggle_cache_status
24
- render json: PRIMARY_RESOURCE, serializer: FragmentCachingPrimaryResourceSerializer, adapter: :json, meta: { caching: perform_caching }
25
- end
26
-
27
- def render_with_non_caching_serializer
28
- toggle_cache_status
29
- render json: PRIMARY_RESOURCE, adapter: :json, meta: { caching: perform_caching }
30
- end
31
-
32
- def render_cache_status
33
- toggle_cache_status
34
- # Uncomment to debug
35
- # STDERR.puts cache_store.class
36
- # STDERR.puts cache_dependencies
37
- # ActiveSupport::Cache::Store.logger.debug [ActiveModelSerializers.config.cache_store, ActiveModelSerializers.config.perform_caching, CachingPrimaryResourceSerializer._cache, perform_caching, params].inspect
38
- render json: { caching: perform_caching, meta: { cache_log: cache_messages, cache_status: cache_status } }.to_json
39
- end
40
-
41
- def clear
42
- ActionController::Base.cache_store.clear
43
- # Test caching is on
44
- # Uncomment to turn on logger; possible performance issue
45
- # logger = BenchmarkLogger.new
46
- # ActiveSupport::Cache::Store.logger = logger # seems to be the best way
47
- #
48
- # the below is used in some rails tests but isn't available/working in all versions, so far as I can tell
49
- # https://github.com/rails/rails/pull/15943
50
- # ActiveSupport::Notifications.subscribe(/^cache_(.*)\.active_support$/) do |*args|
51
- # logger.debug ActiveSupport::Notifications::Event.new(*args)
52
- # end
53
- render json: 'ok'.to_json
54
- end
55
-
56
- private
57
-
58
- def cache_status
59
- {
60
- controller: perform_caching,
61
- app: Rails.configuration.action_controller.perform_caching,
62
- serializers: Rails.configuration.serializers.each_with_object({}) { |serializer, data| data[serializer.name] = serializer._cache.present? }
63
- }
64
- end
65
-
66
- def cache_messages
67
- ActiveSupport::Cache::Store.logger.is_a?(BenchmarkLogger) && ActiveSupport::Cache::Store.logger.messages.split("\n")
68
- end
69
-
70
- def toggle_cache_status
71
- case params[:on]
72
- when 'on'.freeze then self.perform_caching = true
73
- when 'off'.freeze then self.perform_caching = false
74
- else nil # no-op
75
- end
76
- end
77
- end
78
-
79
- Rails.application.routes.draw do
80
- get '/status(/:on)' => 'primary_resource#render_cache_status'
81
- get '/clear' => 'primary_resource#clear'
82
- get '/caching(/:on)' => 'primary_resource#render_with_caching_serializer'
83
- get '/fragment_caching(/:on)' => 'primary_resource#render_with_fragment_caching_serializer'
84
- get '/non_caching(/:on)' => 'primary_resource#render_with_non_caching_serializer'
85
- end