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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +41 -2
- data/README.md +18 -19
- data/lib/action_controller/serialization.rb +9 -1
- data/lib/active_model/serializer/collection_serializer.rb +11 -2
- data/lib/active_model/serializer/concerns/caching.rb +2 -1
- data/lib/active_model/serializer/fieldset.rb +1 -1
- data/lib/active_model/serializer/reflection.rb +4 -4
- data/lib/active_model/serializer/version.rb +1 -1
- data/lib/active_model/serializer.rb +13 -4
- data/lib/active_model_serializers/adapter/attributes.rb +21 -0
- data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +5 -1
- data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +1 -1
- data/lib/active_model_serializers/model/caching.rb +26 -0
- metadata +20 -292
- data/.github/ISSUE_TEMPLATE.md +0 -29
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
- data/.gitignore +0 -35
- data/.rubocop.yml +0 -109
- data/.simplecov +0 -110
- data/.travis.yml +0 -63
- data/CODE_OF_CONDUCT.md +0 -74
- data/CONTRIBUTING.md +0 -105
- data/Gemfile +0 -74
- data/Rakefile +0 -76
- data/active_model_serializers.gemspec +0 -64
- data/appveyor.yml +0 -28
- data/bin/bench +0 -171
- data/bin/bench_regression +0 -316
- data/bin/rubocop +0 -38
- data/bin/serve_benchmark +0 -39
- data/docs/README.md +0 -41
- data/docs/STYLE.md +0 -58
- data/docs/general/adapters.md +0 -269
- data/docs/general/caching.md +0 -58
- data/docs/general/configuration_options.md +0 -185
- data/docs/general/deserialization.md +0 -100
- data/docs/general/fields.md +0 -31
- data/docs/general/getting_started.md +0 -133
- data/docs/general/instrumentation.md +0 -40
- data/docs/general/key_transforms.md +0 -40
- data/docs/general/logging.md +0 -21
- data/docs/general/rendering.md +0 -293
- data/docs/general/serializers.md +0 -495
- data/docs/how-open-source-maintained.jpg +0 -0
- data/docs/howto/add_pagination_links.md +0 -138
- data/docs/howto/add_relationship_links.md +0 -140
- data/docs/howto/add_root_key.md +0 -62
- data/docs/howto/grape_integration.md +0 -42
- data/docs/howto/outside_controller_use.md +0 -66
- data/docs/howto/passing_arbitrary_options.md +0 -27
- data/docs/howto/serialize_poro.md +0 -73
- data/docs/howto/test.md +0 -154
- data/docs/howto/upgrade_from_0_8_to_0_10.md +0 -265
- data/docs/integrations/ember-and-json-api.md +0 -147
- data/docs/integrations/grape.md +0 -19
- data/docs/jsonapi/errors.md +0 -56
- data/docs/jsonapi/schema/schema.json +0 -366
- data/docs/jsonapi/schema.md +0 -151
- data/docs/rfcs/0000-namespace.md +0 -106
- data/docs/rfcs/template.md +0 -15
- data/test/action_controller/adapter_selector_test.rb +0 -64
- data/test/action_controller/explicit_serializer_test.rb +0 -137
- data/test/action_controller/json/include_test.rb +0 -248
- data/test/action_controller/json_api/deserialization_test.rb +0 -114
- data/test/action_controller/json_api/errors_test.rb +0 -42
- data/test/action_controller/json_api/fields_test.rb +0 -68
- data/test/action_controller/json_api/linked_test.rb +0 -204
- data/test/action_controller/json_api/pagination_test.rb +0 -126
- data/test/action_controller/json_api/transform_test.rb +0 -191
- data/test/action_controller/lookup_proc_test.rb +0 -51
- data/test/action_controller/namespace_lookup_test.rb +0 -234
- data/test/action_controller/serialization_scope_name_test.rb +0 -237
- data/test/action_controller/serialization_test.rb +0 -480
- data/test/active_model_serializers/adapter_for_test.rb +0 -210
- data/test/active_model_serializers/json_pointer_test.rb +0 -24
- data/test/active_model_serializers/logging_test.rb +0 -79
- data/test/active_model_serializers/model_test.rb +0 -144
- data/test/active_model_serializers/railtie_test_isolated.rb +0 -70
- data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -163
- data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -73
- data/test/active_model_serializers/test/schema_test.rb +0 -133
- data/test/active_model_serializers/test/serializer_test.rb +0 -64
- data/test/active_record_test.rb +0 -11
- data/test/adapter/attributes_test.rb +0 -42
- data/test/adapter/deprecation_test.rb +0 -102
- data/test/adapter/json/belongs_to_test.rb +0 -47
- data/test/adapter/json/collection_test.rb +0 -106
- data/test/adapter/json/has_many_test.rb +0 -55
- data/test/adapter/json/transform_test.rb +0 -95
- data/test/adapter/json_api/belongs_to_test.rb +0 -157
- data/test/adapter/json_api/collection_test.rb +0 -98
- data/test/adapter/json_api/errors_test.rb +0 -78
- data/test/adapter/json_api/fields_test.rb +0 -98
- data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -98
- data/test/adapter/json_api/has_many_test.rb +0 -175
- data/test/adapter/json_api/has_one_test.rb +0 -82
- data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -215
- data/test/adapter/json_api/json_api_test.rb +0 -35
- data/test/adapter/json_api/linked_test.rb +0 -415
- data/test/adapter/json_api/links_test.rb +0 -112
- data/test/adapter/json_api/pagination_links_test.rb +0 -208
- data/test/adapter/json_api/parse_test.rb +0 -139
- data/test/adapter/json_api/relationship_test.rb +0 -399
- data/test/adapter/json_api/resource_meta_test.rb +0 -102
- data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -84
- data/test/adapter/json_api/transform_test.rb +0 -514
- data/test/adapter/json_api/type_test.rb +0 -195
- data/test/adapter/json_test.rb +0 -48
- data/test/adapter/null_test.rb +0 -24
- data/test/adapter/polymorphic_test.rb +0 -220
- data/test/adapter_test.rb +0 -69
- data/test/array_serializer_test.rb +0 -24
- data/test/benchmark/app.rb +0 -67
- data/test/benchmark/benchmarking_support.rb +0 -69
- data/test/benchmark/bm_active_record.rb +0 -83
- data/test/benchmark/bm_adapter.rb +0 -40
- data/test/benchmark/bm_caching.rb +0 -121
- data/test/benchmark/bm_lookup_chain.rb +0 -85
- data/test/benchmark/bm_transform.rb +0 -47
- data/test/benchmark/config.ru +0 -3
- data/test/benchmark/controllers.rb +0 -85
- data/test/benchmark/fixtures.rb +0 -221
- data/test/cache_test.rb +0 -717
- data/test/collection_serializer_test.rb +0 -129
- data/test/fixtures/active_record.rb +0 -115
- data/test/fixtures/poro.rb +0 -227
- data/test/generators/scaffold_controller_generator_test.rb +0 -26
- data/test/generators/serializer_generator_test.rb +0 -77
- data/test/grape_test.rb +0 -198
- data/test/lint_test.rb +0 -51
- data/test/logger_test.rb +0 -22
- data/test/poro_test.rb +0 -11
- data/test/serializable_resource_test.rb +0 -81
- data/test/serializers/association_macros_test.rb +0 -39
- data/test/serializers/associations_test.rb +0 -520
- data/test/serializers/attribute_test.rb +0 -155
- data/test/serializers/attributes_test.rb +0 -54
- data/test/serializers/caching_configuration_test_isolated.rb +0 -172
- data/test/serializers/configuration_test.rb +0 -34
- data/test/serializers/fieldset_test.rb +0 -16
- data/test/serializers/meta_test.rb +0 -204
- data/test/serializers/options_test.rb +0 -34
- data/test/serializers/read_attribute_for_serialization_test.rb +0 -81
- data/test/serializers/reflection_test.rb +0 -481
- data/test/serializers/root_test.rb +0 -23
- data/test/serializers/serialization_test.rb +0 -57
- data/test/serializers/serializer_for_test.rb +0 -138
- data/test/serializers/serializer_for_with_namespace_test.rb +0 -90
- data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
- data/test/support/isolated_unit.rb +0 -86
- data/test/support/rails5_shims.rb +0 -55
- data/test/support/rails_app.rb +0 -40
- data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
- data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
- data/test/support/schemas/custom/show.json +0 -7
- data/test/support/schemas/hyper_schema.json +0 -93
- data/test/support/schemas/render_using_json_api.json +0 -43
- data/test/support/schemas/simple_json_pointers.json +0 -10
- data/test/support/serialization_testing.rb +0 -81
- 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
|
data/test/benchmark/config.ru
DELETED
|
@@ -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
|