active_model_serializers 0.9.5 → 0.9.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -1
  3. data/README.md +1 -1
  4. data/lib/active_model/serializer/generators/serializer/scaffold_controller_generator.rb +1 -1
  5. data/lib/active_model/serializer/version.rb +1 -1
  6. data/lib/bulk_cache_fetcher.rb +104 -0
  7. data/test/action_controller/http_cache_test.rb +56 -0
  8. data/test/benchmark/bm_rails_cache.rb +141 -0
  9. data/test/benchmark/tmp/miniprofiler/mp_timers_16x1i2wkkt8b8zybbfbx +0 -0
  10. data/test/benchmark/tmp/miniprofiler/mp_timers_3aa299ezxdqvog6sfjzr +0 -0
  11. data/test/benchmark/tmp/miniprofiler/mp_timers_3f0bdfx4nib4hxfb5lmq +0 -0
  12. data/test/benchmark/tmp/miniprofiler/mp_timers_54wkvaidi0avdc8yawyt +0 -0
  13. data/test/benchmark/tmp/miniprofiler/mp_timers_6b9d32ftlk8v5xy2op05 +0 -0
  14. data/test/benchmark/tmp/miniprofiler/mp_timers_7nlok5ykeley83h8bine +0 -0
  15. data/test/benchmark/tmp/miniprofiler/mp_timers_b36ymkc1vgu5fy9fvm9k +0 -0
  16. data/test/benchmark/tmp/miniprofiler/mp_timers_c3a27vo6uvfijeh105nt +0 -0
  17. data/test/benchmark/tmp/miniprofiler/mp_timers_eqcbrj14r4c341abi3h6 +0 -0
  18. data/test/benchmark/tmp/miniprofiler/mp_timers_hqodkd691tbr7sbfdiez +0 -0
  19. data/test/benchmark/tmp/miniprofiler/mp_timers_j7y5frtod7cw4qc4cear +0 -0
  20. data/test/benchmark/tmp/miniprofiler/mp_timers_jpxzfgo92l24t7wzt8g1 +0 -0
  21. data/test/benchmark/tmp/miniprofiler/mp_timers_m78k2w11sd7ba5oh40rw +0 -0
  22. data/test/benchmark/tmp/miniprofiler/mp_timers_mkvat4ehphrje9n2hu3t +0 -0
  23. data/test/benchmark/tmp/miniprofiler/mp_timers_nd3ymt54l1ga22i2brn8 +0 -0
  24. data/test/benchmark/tmp/miniprofiler/mp_timers_o2dk1yhw6ez9jzxf6p0a +0 -0
  25. data/test/benchmark/tmp/miniprofiler/mp_timers_p76i310zb4y12iqm5o0n +0 -0
  26. data/test/benchmark/tmp/miniprofiler/mp_timers_pi3hvrrkfxnxl300wvah +0 -0
  27. data/test/benchmark/tmp/miniprofiler/mp_timers_q4w5d86flb4u9tsadqvw +0 -0
  28. data/test/benchmark/tmp/miniprofiler/mp_timers_sfa5nundogo63o056n5y +0 -0
  29. data/test/benchmark/tmp/miniprofiler/mp_timers_tkjlmqeauf5gur2u5nob +0 -0
  30. data/test/benchmark/tmp/miniprofiler/mp_timers_tngbj11ilv2i75rqn2d2 +0 -0
  31. data/test/benchmark/tmp/miniprofiler/mp_timers_u4haqgvgybvc1sb5nihw +0 -0
  32. data/test/benchmark/tmp/miniprofiler/mp_timers_uc1b3hwqrd4q512gy6c9 +0 -0
  33. data/test/benchmark/tmp/miniprofiler/mp_timers_uwholuf0iix2vvbo2l3c +0 -0
  34. data/test/benchmark/tmp/miniprofiler/mp_timers_waye238ygft3p4xvppc4 +0 -0
  35. data/test/benchmark/tmp/miniprofiler/mp_timers_ydwo7p117loo2ky40lk3 +0 -0
  36. data/test/benchmark/tmp/miniprofiler/mp_timers_zhgmyfizfa8slppitgua +0 -0
  37. data/test/benchmark/tmp/miniprofiler/mp_views_127.0.0.1 +0 -0
  38. metadata +65 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 824c53b8e015242b747a646eb8d39e6f5bfb6828
4
- data.tar.gz: c57b340d57742eda89976c6eff76f79c630615ce
3
+ metadata.gz: 1191ac4c27b87b68e877584e0739eeb45d98652b
4
+ data.tar.gz: e22fcf90100f324db9ff4617015e787ddb1186bb
5
5
  SHA512:
6
- metadata.gz: 1d102aafb1713dd3010bde0cfc29e84626f9dd56d02a0d63807fed04a05d519a4d11ee35ee19e6c0a1e15714a460bdc8280e0d491421bc9fc8dc49fe84dce3fc
7
- data.tar.gz: 3135135c42d6533232266a5d7f8b7efba43c83b2fc9017a2867172afeb2c459fc9b335d1322dd625eb916729891902357898785f51b981590ff5cc20671c1d34
6
+ metadata.gz: 00d60b3ac320a5f50fc2b460ce114a7723f8ed85b5ac94513cd159d50aa86f7587a523c00297048a5bf7938dd78be7eb8ac0c6b78b2104009abc473498b6187a
7
+ data.tar.gz: f00ab07a45f77ab3650e26f083d90f38ccf46ee53b55bc4f526f0f74628d4f06abd3df83133388c11bfa2889470e03ecd07b8413a7bc1db10403ea74f15ccde2
data/CHANGELOG.md CHANGED
@@ -1,6 +1,10 @@
1
1
  ## 0.09.x
2
2
 
3
- ### [0-9-stable](https://github.com/rails-api/active_model_serializers/compare/v0.9.4...0-9-stable)
3
+ ### [0-9-stable](https://github.com/rails-api/active_model_serializers/compare/v0.9.5...0-9-stable)
4
+
5
+ ### [v0.9.6 (2017-01-10)](https://github.com/rails-api/active_model_serializers/compare/v0.9.5...v0.9.6)
6
+
7
+ - [#2008](https://github.com/rails-api/active_model_serializers/pull/2008) Fix warning on Thor. (@kirs)
4
8
 
5
9
  ### [v0.9.5 (2016-03-30)](https://github.com/rails-api/active_model_serializers/compare/v0.9.4...v0.9.5)
6
10
 
data/README.md CHANGED
@@ -378,7 +378,7 @@ The above usage of `:meta` will produce the following:
378
378
  If you would like to change the meta key name you can use the `:meta_key` option:
379
379
 
380
380
  ```ruby
381
- render json: @posts, serializer: CustomArraySerializer, meta_object: {total: 10}, meta_key: 'meta_object'
381
+ render json: @posts, serializer: CustomArraySerializer, meta_object: { total: 10 }, meta_key: :meta_object
382
382
  ```
383
383
 
384
384
  The above usage of `:meta_key` will produce the following:
@@ -7,7 +7,7 @@ module Rails
7
7
  if Rails::VERSION::MAJOR >= 4
8
8
  source_root File.expand_path('../templates', __FILE__)
9
9
 
10
- hook_for :serializer, default: true
10
+ hook_for :serializer, default: true, type: :boolean
11
11
  end
12
12
  end
13
13
  end
@@ -1,5 +1,5 @@
1
1
  module ActiveModel
2
2
  class Serializer
3
- VERSION = '0.9.5'
3
+ VERSION = '0.9.6'
4
4
  end
5
5
  end
@@ -0,0 +1,104 @@
1
+ # https://github.com/justinweiss/bulk_cache_fetcher/blob/df1c83e06b9641b7ec3408ec577b37528021190f/lib/bulk_cache_fetcher.rb
2
+ # Fetches many objects from a cache in order. In the event that some
3
+ # objects can't be served from the cache, you will have the
4
+ # opportunity to fetch them in bulk. This allows you to preload and
5
+ # cache entire object hierarchies, which works particularly well with
6
+ # Rails' nested caching while avoiding the n+1 queries problem in the
7
+ # uncached case.
8
+ class BulkCacheFetcher
9
+ VERSION = '1.0.0'.freeze
10
+
11
+ # Creates a new bulk cache fetcher, backed by +cache+. Cache must
12
+ # respond to the standard Rails cache API, described on
13
+ # http://guides.rubyonrails.org/caching_with_rails.html
14
+ def initialize(cache)
15
+ @cache = cache
16
+ end
17
+
18
+ # Returns a list of objects identified by
19
+ # <tt>object_identifiers</tt>. +fetch+ will try to find the objects
20
+ # from the cache first. Identifiers for objects that aren't in the
21
+ # cache will be passed as an ordered list to <tt>finder_block</tt>,
22
+ # where you can find the objects as you see fit. These objects
23
+ # should be returned in the same order as the identifiers that were
24
+ # passed into the block, because they'll be cached under their
25
+ # respective keys. The objects returned by +fetch+ will be returned
26
+ # in the same order as the <tt>object_identifiers</tt> passed in.
27
+ #
28
+ # +options+ will be passed along unmodified when caching newly found
29
+ # objects, so you can use it for things like setting cache
30
+ # expiration.
31
+ def fetch(object_identifiers, options = {}, &finder_block)
32
+ object_identifiers = normalize(object_identifiers)
33
+ cached_keys_with_objects, uncached_identifiers = partition(object_identifiers)
34
+ found_objects = find(uncached_identifiers, options, &finder_block)
35
+ coalesce(cache_keys(object_identifiers), cached_keys_with_objects, found_objects)
36
+ end
37
+
38
+ private
39
+
40
+ # Splits a list of identifiers into two objects. The first is a hash
41
+ # of <tt>{cache_key: object}</tt> for all the objects we were able to serve
42
+ # from the cache. The second is a list of all of the identifiers for
43
+ # objects that weren't cached.
44
+ def partition(object_identifiers)
45
+ uncached_identifiers = object_identifiers.dup
46
+
47
+ cache_keys = cache_keys(object_identifiers)
48
+ cached_keys_with_objects = @cache.read_multi(*cache_keys)
49
+
50
+ cache_keys.each do |cache_key|
51
+ uncached_identifiers.delete(cache_key) if cached_keys_with_objects.key?(cache_key)
52
+ end
53
+
54
+ [cached_keys_with_objects, uncached_identifiers]
55
+ end
56
+
57
+ # Finds all of the objects identified by +identifiers+, using the
58
+ # +finder_block+. Will pass +options+ on to the cache.
59
+ def find(identifiers, options = {})
60
+ return [] if identifiers.empty?
61
+ Array(yield(identifiers)).tap do |objects|
62
+ verify_equal_key_and_value_counts!(identifiers, objects)
63
+ cache_all(identifiers, objects, options)
64
+ end
65
+ end
66
+
67
+ # Makes sure we have enough +identifiers+ to cache all of our
68
+ # +objects+, and vice-versa.
69
+ def verify_equal_key_and_value_counts!(identifiers, objects)
70
+ fail ArgumentError, 'You are returning too many objects from your cache block!' if objects.length > identifiers.length
71
+ fail ArgumentError, 'You are returning too few objects from your cache block!' if objects.length < identifiers.length
72
+ end
73
+
74
+ # Caches all +values+ under their respective +keys+.
75
+ def cache_all(keys, values, options = {})
76
+ keys.zip(values) { |k, v| @cache.write(cache_key(k), v, options) }
77
+ end
78
+
79
+ # Given a list of +cache_keys+, either find associated objects from
80
+ # +cached_keys_with_objects, or grab them from +found_objects+, in
81
+ # order.
82
+ def coalesce(cache_keys, cached_keys_with_objects, found_objects)
83
+ found_objects = Array(found_objects)
84
+ cache_keys.map { |key| cached_keys_with_objects.fetch(key) { found_objects.shift } }
85
+ end
86
+
87
+ # Returns the part of the identifier that we can use as the cache
88
+ # key. For simple identifiers, it's just the identifier, for
89
+ # identifiers with extra information attached, it's the first part
90
+ # of the identifier.
91
+ def cache_key(identifier)
92
+ Array(identifier).first
93
+ end
94
+
95
+ # Returns the cache keys for all of the +identifiers+.
96
+ def cache_keys(identifiers)
97
+ identifiers.map { |identifier| cache_key(identifier) }
98
+ end
99
+
100
+ # Makes sure we can iterate over identifiers.
101
+ def normalize(identifiers)
102
+ identifiers.respond_to?(:each) ? identifiers : Array(identifiers)
103
+ end
104
+ end
@@ -0,0 +1,56 @@
1
+ require 'test_helper'
2
+
3
+ # https://github.com/rails/rails/blob/4-2-stable/actionpack/lib/action_dispatch/testing/integration.rb
4
+ # rubocop:disable Style/ClassAndModuleChildren:
5
+ class ActionController::Serialization::HttpCacheTest < ActionController::TestCase
6
+ # class ActionController::Serialization::HttpCacheTest < ActionDispatch::IntegrationTest
7
+ class HttpCacheTestController < ActionController::Base
8
+ class Model < ActiveModelSerializers::Model
9
+ attr_accessor :name, :description, :comments
10
+ end
11
+ class ModelSerializer < ActiveModel::Serializer
12
+ attributes :name, :description, :comments
13
+ end
14
+
15
+ def render_as_serializable_object
16
+ render serialization_options.merge!(json: model)
17
+ end
18
+
19
+ def render_as_json_string
20
+ json = ActiveModelSerializers::SerializableResource.new(model, serialization_options).to_json
21
+ render json: json
22
+ end
23
+
24
+ private
25
+
26
+ def model
27
+ Model.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
28
+ end
29
+
30
+ def serialization_options
31
+ { serializer: ModelSerializer, adapter: :json }
32
+ end
33
+ end
34
+
35
+ tests HttpCacheTestController
36
+
37
+ DATE = 'Date'.freeze
38
+ LAST_MODIFIED = 'Last-Modified'.freeze
39
+ ETAG = 'ETag'.freeze
40
+ CACHE_CONTROL = 'Cache-Control'.freeze
41
+ SPECIAL_KEYS = Set.new(%w(extras no-cache max-age public must-revalidate))
42
+ def test_render_as_serializable_object
43
+ 10.times do
44
+ get :render_as_serializable_object
45
+ end
46
+ p [@response.etag?, @response.last_modified, @response.date, @response.headers[CACHE_CONTROL], @response.headers[ETAG], @response.headers[LAST_MODIFIED], @response.headers[DATE]]
47
+ end
48
+
49
+ def test_render_as_json_string
50
+ 10.times do
51
+ get :render_as_json_string
52
+ end
53
+ p [@response.etag?, @response.last_modified, @response.date, @response.headers[CACHE_CONTROL], @response.headers[ETAG], @response.headers[LAST_MODIFIED], @response.headers[DATE]]
54
+ end
55
+ end
56
+ # rubocop:enable Style/ClassAndModuleChildren:
@@ -0,0 +1,141 @@
1
+ require 'bundler/setup'
2
+ require_relative './benchmarking_support'
3
+ require_relative './app'
4
+
5
+ time = 10
6
+ cache_store = ActiveSupport::Cache.lookup_store(:memory_store)
7
+ comments = (0..50).map do |i|
8
+ Comment.new(id: i, body: 'ZOMG A COMMENT')
9
+ end
10
+ author = Author.new(id: 42, first_name: 'Joao', last_name: 'Moura')
11
+ model = Post.new(id: 1337, title: 'New Post', blog: nil, body: 'Body', comments: comments, author: author)
12
+
13
+ define_method :json do
14
+ model.to_json
15
+ end
16
+ define_method :cached_json do
17
+ parts = []
18
+ parts << 'key_name'
19
+ parts << 'adapter_name'
20
+ cache_key = parts.join('/')
21
+ cache_store.fetch(cache_key) { model.to_json }
22
+ end
23
+ define_method :ams do
24
+ ActiveModelSerializers::SerializableResource.new(model, adapter: :json, serializer: PostSerializer).as_json
25
+ end
26
+ define_method :cached_ams do
27
+ ActiveModelSerializers::SerializableResource.new(model, adapter: :json, serializer: CachingPostSerializer).as_json
28
+ end
29
+ def as_json(serializer_instance, adapter_instance, fields, includes = '*')
30
+ if serializer_instance.respond_to?(:each)
31
+ return serializer_instance.map do |each_serializer|
32
+ as_json(each_serializer, adapter_instance, fields, includes)
33
+ end
34
+ end
35
+ cache_key = serializer_instance.cache_key(adapter_instance)
36
+ include_tree = includes || ActiveModel::Serializer::IncludeTree.from_include_args(includes)
37
+ cache_store = ActiveModelSerializers.config.cache_store
38
+ json = cache_store.fetch(cache_key) do
39
+ serializer_instance.attributes(fields)
40
+ end
41
+ serializer_instance.associations(include_tree).each do |association|
42
+ # FIXME: yields each association twice
43
+ json[association.key] ||= as_json(association.serializer, adapter_instance, [], includes[association.key])
44
+ end
45
+ json
46
+ end
47
+
48
+ define_method :cached_virtual_ams do
49
+ ### OMG
50
+ post_serializer = CachingPostSerializer.new(model)
51
+ adapter_instance = ActiveModelSerializers::Adapter::Attributes.new(post_serializer)
52
+ fields = nil
53
+ includes = ActiveModel::Serializer::IncludeTree.from_include_args('*')
54
+ { post: as_json(post_serializer, adapter_instance, fields, includes) }
55
+ # parts = []
56
+ # parts << 'ams_blog'
57
+ # parts << 'attributes'
58
+ # cache_key = parts.join('/')
59
+ # cache_store.fetch(cache_key) do
60
+ # include_tree = ActiveModel::Serializer::IncludeTree.from_include_args('*')
61
+ # post_serializer = CachingPostSerializer.new(model)
62
+ # json = { post: post_serializer.attributes }
63
+ # post_serializer.associations(include_tree).each do |association|
64
+ # # FIXME: yields each association twice
65
+ # json[:post][association.key] ||=
66
+ # case association.key
67
+ # when :comments
68
+ # cache_store.fetch(%w(ams_comments attributes).join('/')) do
69
+ # association.serializer.map(&:attributes)
70
+ # end
71
+ # when :blog
72
+ # association.serializer.attributes
73
+ # when :author
74
+ # cache_store.fetch(%w(ams_author attributes).join('/')) do
75
+ # association.serializer.attributes
76
+ # end
77
+ # else
78
+ # fail ArgumentError, "unexpected association #{association}"
79
+ # end
80
+ # end
81
+ # json
82
+ # end
83
+ end
84
+ puts JSON.pretty_generate(
85
+ equality: { cached_ams: ams == cached_ams, cached_virtual_ams: ams == cached_virtual_ams },
86
+ ams: ams,
87
+ cached_ams: cached_ams,
88
+ cached_virtual_ams: cached_virtual_ams
89
+ )
90
+
91
+ {
92
+ # 'cached json' => { disable_gc: true, send: :cached_json },
93
+ # 'json' => { disable_gc: true, send: :json },
94
+ # 'cached ams' => { disable_gc: true, send: :cached_ams },
95
+ 'cached virtual ams' => { disable_gc: true, send: :cached_virtual_ams },
96
+ 'ams' => { disable_gc: true, send: :ams }
97
+ }.each do |label, options|
98
+ Benchmark.ams(label, time: time, disable_gc: options[:disable_gc]) do
99
+ send(options[:send])
100
+ end
101
+ end
102
+ __END__
103
+ cached json 121321.3745504354/ips; 16 objects
104
+ json 1177.243210850789/ips; 1984 objects
105
+ cached ams 251.90341731442047/ips; 5879 objects
106
+ cached virtual ams 89169.87612473704/ips; 16 objects
107
+ ams 598.9890084759535/ips; 2348 objects
108
+ Benchmark results:
109
+ {
110
+ "commit_hash": "aa0be94",
111
+ "version": "0.10.0.rc5",
112
+ "rails_version": "4.2.5.1",
113
+ "benchmark_run[environment]": "2.2.3p173",
114
+ "runs": [
115
+ {
116
+ "benchmark_type[category]": "cached json",
117
+ "benchmark_run[result][iterations_per_second]": 121321.375,
118
+ "benchmark_run[result][total_allocated_objects_per_iteration]": 16
119
+ },
120
+ {
121
+ "benchmark_type[category]": "json",
122
+ "benchmark_run[result][iterations_per_second]": 1177.243,
123
+ "benchmark_run[result][total_allocated_objects_per_iteration]": 1984
124
+ },
125
+ {
126
+ "benchmark_type[category]": "cached ams",
127
+ "benchmark_run[result][iterations_per_second]": 251.903,
128
+ "benchmark_run[result][total_allocated_objects_per_iteration]": 5879
129
+ },
130
+ {
131
+ "benchmark_type[category]": "cached virtual ams",
132
+ "benchmark_run[result][iterations_per_second]": 89169.876,
133
+ "benchmark_run[result][total_allocated_objects_per_iteration]": 16
134
+ },
135
+ {
136
+ "benchmark_type[category]": "ams",
137
+ "benchmark_run[result][iterations_per_second]": 598.989,
138
+ "benchmark_run[result][total_allocated_objects_per_iteration]": 2348
139
+ }
140
+ ]
141
+ }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_model_serializers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.5
4
+ version: 0.9.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - José Valim
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-03-30 00:00:00.000000000 Z
13
+ date: 2017-01-10 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activemodel
@@ -75,6 +75,38 @@ files:
75
75
  - lib/active_model/serializer/version.rb
76
76
  - lib/active_model/serializer_support.rb
77
77
  - lib/active_model_serializers.rb
78
+ - lib/bulk_cache_fetcher.rb
79
+ - test/action_controller/http_cache_test.rb
80
+ - test/benchmark/bm_rails_cache.rb
81
+ - test/benchmark/tmp/miniprofiler/mp_timers_16x1i2wkkt8b8zybbfbx
82
+ - test/benchmark/tmp/miniprofiler/mp_timers_3aa299ezxdqvog6sfjzr
83
+ - test/benchmark/tmp/miniprofiler/mp_timers_3f0bdfx4nib4hxfb5lmq
84
+ - test/benchmark/tmp/miniprofiler/mp_timers_54wkvaidi0avdc8yawyt
85
+ - test/benchmark/tmp/miniprofiler/mp_timers_6b9d32ftlk8v5xy2op05
86
+ - test/benchmark/tmp/miniprofiler/mp_timers_7nlok5ykeley83h8bine
87
+ - test/benchmark/tmp/miniprofiler/mp_timers_b36ymkc1vgu5fy9fvm9k
88
+ - test/benchmark/tmp/miniprofiler/mp_timers_c3a27vo6uvfijeh105nt
89
+ - test/benchmark/tmp/miniprofiler/mp_timers_eqcbrj14r4c341abi3h6
90
+ - test/benchmark/tmp/miniprofiler/mp_timers_hqodkd691tbr7sbfdiez
91
+ - test/benchmark/tmp/miniprofiler/mp_timers_j7y5frtod7cw4qc4cear
92
+ - test/benchmark/tmp/miniprofiler/mp_timers_jpxzfgo92l24t7wzt8g1
93
+ - test/benchmark/tmp/miniprofiler/mp_timers_m78k2w11sd7ba5oh40rw
94
+ - test/benchmark/tmp/miniprofiler/mp_timers_mkvat4ehphrje9n2hu3t
95
+ - test/benchmark/tmp/miniprofiler/mp_timers_nd3ymt54l1ga22i2brn8
96
+ - test/benchmark/tmp/miniprofiler/mp_timers_o2dk1yhw6ez9jzxf6p0a
97
+ - test/benchmark/tmp/miniprofiler/mp_timers_p76i310zb4y12iqm5o0n
98
+ - test/benchmark/tmp/miniprofiler/mp_timers_pi3hvrrkfxnxl300wvah
99
+ - test/benchmark/tmp/miniprofiler/mp_timers_q4w5d86flb4u9tsadqvw
100
+ - test/benchmark/tmp/miniprofiler/mp_timers_sfa5nundogo63o056n5y
101
+ - test/benchmark/tmp/miniprofiler/mp_timers_tkjlmqeauf5gur2u5nob
102
+ - test/benchmark/tmp/miniprofiler/mp_timers_tngbj11ilv2i75rqn2d2
103
+ - test/benchmark/tmp/miniprofiler/mp_timers_u4haqgvgybvc1sb5nihw
104
+ - test/benchmark/tmp/miniprofiler/mp_timers_uc1b3hwqrd4q512gy6c9
105
+ - test/benchmark/tmp/miniprofiler/mp_timers_uwholuf0iix2vvbo2l3c
106
+ - test/benchmark/tmp/miniprofiler/mp_timers_waye238ygft3p4xvppc4
107
+ - test/benchmark/tmp/miniprofiler/mp_timers_ydwo7p117loo2ky40lk3
108
+ - test/benchmark/tmp/miniprofiler/mp_timers_zhgmyfizfa8slppitgua
109
+ - test/benchmark/tmp/miniprofiler/mp_views_127.0.0.1
78
110
  - test/fixtures/active_record.rb
79
111
  - test/fixtures/poro.rb
80
112
  - test/fixtures/template.html.erb
@@ -139,6 +171,37 @@ specification_version: 4
139
171
  summary: Bringing consistency and object orientation to model serialization. Works
140
172
  great for client-side MVC frameworks!
141
173
  test_files:
174
+ - test/action_controller/http_cache_test.rb
175
+ - test/benchmark/bm_rails_cache.rb
176
+ - test/benchmark/tmp/miniprofiler/mp_timers_16x1i2wkkt8b8zybbfbx
177
+ - test/benchmark/tmp/miniprofiler/mp_timers_3aa299ezxdqvog6sfjzr
178
+ - test/benchmark/tmp/miniprofiler/mp_timers_3f0bdfx4nib4hxfb5lmq
179
+ - test/benchmark/tmp/miniprofiler/mp_timers_54wkvaidi0avdc8yawyt
180
+ - test/benchmark/tmp/miniprofiler/mp_timers_6b9d32ftlk8v5xy2op05
181
+ - test/benchmark/tmp/miniprofiler/mp_timers_7nlok5ykeley83h8bine
182
+ - test/benchmark/tmp/miniprofiler/mp_timers_b36ymkc1vgu5fy9fvm9k
183
+ - test/benchmark/tmp/miniprofiler/mp_timers_c3a27vo6uvfijeh105nt
184
+ - test/benchmark/tmp/miniprofiler/mp_timers_eqcbrj14r4c341abi3h6
185
+ - test/benchmark/tmp/miniprofiler/mp_timers_hqodkd691tbr7sbfdiez
186
+ - test/benchmark/tmp/miniprofiler/mp_timers_j7y5frtod7cw4qc4cear
187
+ - test/benchmark/tmp/miniprofiler/mp_timers_jpxzfgo92l24t7wzt8g1
188
+ - test/benchmark/tmp/miniprofiler/mp_timers_m78k2w11sd7ba5oh40rw
189
+ - test/benchmark/tmp/miniprofiler/mp_timers_mkvat4ehphrje9n2hu3t
190
+ - test/benchmark/tmp/miniprofiler/mp_timers_nd3ymt54l1ga22i2brn8
191
+ - test/benchmark/tmp/miniprofiler/mp_timers_o2dk1yhw6ez9jzxf6p0a
192
+ - test/benchmark/tmp/miniprofiler/mp_timers_p76i310zb4y12iqm5o0n
193
+ - test/benchmark/tmp/miniprofiler/mp_timers_pi3hvrrkfxnxl300wvah
194
+ - test/benchmark/tmp/miniprofiler/mp_timers_q4w5d86flb4u9tsadqvw
195
+ - test/benchmark/tmp/miniprofiler/mp_timers_sfa5nundogo63o056n5y
196
+ - test/benchmark/tmp/miniprofiler/mp_timers_tkjlmqeauf5gur2u5nob
197
+ - test/benchmark/tmp/miniprofiler/mp_timers_tngbj11ilv2i75rqn2d2
198
+ - test/benchmark/tmp/miniprofiler/mp_timers_u4haqgvgybvc1sb5nihw
199
+ - test/benchmark/tmp/miniprofiler/mp_timers_uc1b3hwqrd4q512gy6c9
200
+ - test/benchmark/tmp/miniprofiler/mp_timers_uwholuf0iix2vvbo2l3c
201
+ - test/benchmark/tmp/miniprofiler/mp_timers_waye238ygft3p4xvppc4
202
+ - test/benchmark/tmp/miniprofiler/mp_timers_ydwo7p117loo2ky40lk3
203
+ - test/benchmark/tmp/miniprofiler/mp_timers_zhgmyfizfa8slppitgua
204
+ - test/benchmark/tmp/miniprofiler/mp_views_127.0.0.1
142
205
  - test/fixtures/active_record.rb
143
206
  - test/fixtures/poro.rb
144
207
  - test/fixtures/template.html.erb