active_model_serializers 0.9.5 → 0.9.6

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 (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