juso 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 912622622f8b9a6866a505f8ba27a1cc21a3073a59ac364942ce6d997baeb875
4
- data.tar.gz: 125f56e1649fad476b076457272349a221ec69f38600bc17f62bf0255902a777
3
+ metadata.gz: a51c9bb514c29a43c32b28bfe8bc8b7e1be09c7cbfaa7f6e06e21c8f75bcc059
4
+ data.tar.gz: 243229044555a5d619327549801d2a6fdcd4b5272ddbb32beadd521e745035b5
5
5
  SHA512:
6
- metadata.gz: cc04ee74481f9fa92988d4e4457eb40929e670a91c95b07171af2358c5f85a77dbd2af2ba846a0bc1c90da13aca85363fba5060b75255e91373fcf964ee5893c
7
- data.tar.gz: 7d51bbec1f134665d4f058c666d64616762e8b86b2981fd94eb03af40a638e71d952e42bdaf1a8216342a4ee644da6f57f7ccba8730b0f4dc6f6672e1ae6e0b9
6
+ metadata.gz: 5d9f185580a6f4537aa41e7c18d4db70a69f2f8c11e4b47af1127df01322c0c1f1612278312910bb06076e6b679efc85906cfcf224a99683a9dfefd81eef9f2d
7
+ data.tar.gz: acf60f8aee9a93f15f2ed461a40b427e10bedf4b10ec273bc7884d7f5f5dd2ab2bb987d3bb550d19d70d4ea5d9bceb1af2619d71f43d29b096e790f3dbd7ef09
@@ -31,3 +31,22 @@ jobs:
31
31
  run: |
32
32
  bundle exec rails db:setup
33
33
  bundle exec rake test
34
+
35
+ benchmark:
36
+ runs-on: ubuntu-latest
37
+ timeout-minutes: 10
38
+
39
+ steps:
40
+ - uses: actions/checkout@v2
41
+
42
+ - name: Set up Ruby
43
+ uses: ruby/setup-ruby@v1
44
+ with:
45
+ ruby-version: 3.0.2
46
+ bundler-cache: true
47
+
48
+ - name: Run benchmark (collection)
49
+ run: ruby benchmark/collection.rb
50
+
51
+ - name: Run benchmark (single)
52
+ run: ruby benchmark/single_resource.rb
data/README.md CHANGED
@@ -89,8 +89,10 @@ juso メソッドは以下のインスタンスしか返してはいけません
89
89
  - False Class
90
90
  - Hash Class
91
91
  - Array Class
92
+ - - ActiveRecord::Relation
92
93
  - Juso::Serializable を include したクラス
93
- - Date / DateTime / ActiveSupport::TimeWithZone
94
+ - Date / DateTime
95
+ - - ActiveSupport::TimeWithZone
94
96
 
95
97
  再帰的に juso の処理が適用されるため、Array の要素や Hash の value も同様のルールが適用されます
96
98
 
@@ -111,8 +113,12 @@ class UserSerializer
111
113
  def juso(context)
112
114
  {
113
115
  id: @user.id,
114
- posts: Juso.wrap(@user.posts, PostSerializer), # use PostSerializer#juso method. Each post passes into PostSerializer object.
115
- team: @user.team, # use Team#juso method
116
+
117
+ # use PostSerializer#juso method. Each post passes into PostSerializer object.
118
+ posts: Juso.wrap(@user.posts, PostSerializer),
119
+
120
+ # use Team#juso method
121
+ team: @user.team,
116
122
  }
117
123
  end
118
124
  end
@@ -0,0 +1,472 @@
1
+ # original: https://github.com/okuramasafumi/alba/blob/main/benchmark/collection.rb
2
+
3
+ # Benchmark script to run varieties of JSON serializers
4
+ # Fetch juso from local, otherwise fetch latest from RubyGems
5
+
6
+ # --- Bundle dependencies ---
7
+
8
+ require "bundler/inline"
9
+
10
+ gemfile(true) do
11
+ source "https://rubygems.org"
12
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
13
+
14
+ gem "active_model_serializers"
15
+ gem "activerecord", "6.1.3"
16
+ gem "alba"
17
+ gem "juso", path: '../'
18
+ gem "benchmark-ips"
19
+ gem "benchmark-memory"
20
+ gem "blueprinter"
21
+ gem "jbuilder"
22
+ gem "jserializer"
23
+ gem "jsonapi-serializer" # successor of fast_jsonapi
24
+ gem "multi_json"
25
+ gem "panko_serializer"
26
+ gem "pg"
27
+ gem "primalize"
28
+ gem "oj"
29
+ gem "representable"
30
+ gem "simple_ams"
31
+ gem "sqlite3"
32
+ end
33
+
34
+ # --- Test data model setup ---
35
+
36
+ require "pg"
37
+ require "active_record"
38
+ require "active_record/connection_adapters/postgresql_adapter"
39
+ require "logger"
40
+ require "oj"
41
+ require "sqlite3"
42
+ Oj.optimize_rails
43
+
44
+ ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
45
+ # ActiveRecord::Base.logger = Logger.new($stdout)
46
+
47
+ ActiveRecord::Schema.define do
48
+ create_table :posts, force: true do |t|
49
+ t.string :body
50
+ end
51
+
52
+ create_table :comments, force: true do |t|
53
+ t.integer :post_id
54
+ t.string :body
55
+ t.integer :commenter_id
56
+ end
57
+
58
+ create_table :users, force: true do |t|
59
+ t.string :name
60
+ end
61
+ end
62
+
63
+ class Post < ActiveRecord::Base
64
+ has_many :comments
65
+ has_many :commenters, through: :comments, class_name: 'User', source: :commenter
66
+
67
+ def attributes
68
+ {id: nil, body: nil, commenter_names: commenter_names}
69
+ end
70
+
71
+ def commenter_names
72
+ commenters.pluck(:name)
73
+ end
74
+ end
75
+
76
+ class Comment < ActiveRecord::Base
77
+ belongs_to :post
78
+ belongs_to :commenter, class_name: 'User'
79
+
80
+ def attributes
81
+ {id: nil, body: nil}
82
+ end
83
+ end
84
+
85
+ class User < ActiveRecord::Base
86
+ has_many :comments
87
+ end
88
+
89
+ # --- Juso serializers ---
90
+
91
+ require "juso"
92
+
93
+ class Comment
94
+ include ::Juso::Serializable
95
+
96
+ def juso(context)
97
+ {id: id, body: body}
98
+ end
99
+ end
100
+
101
+ class Post
102
+ include ::Juso::Serializable
103
+
104
+ def juso(context)
105
+ {id: id, body: body, commenter_names: commenter_names, comments: comments}
106
+ end
107
+ end
108
+
109
+ # --- Alba serializers ---
110
+
111
+ require "alba"
112
+
113
+ class AlbaCommentResource
114
+ include ::Alba::Resource
115
+ attributes :id, :body
116
+ end
117
+
118
+ class AlbaPostResource
119
+ include ::Alba::Resource
120
+ attributes :id, :body
121
+ attribute :commenter_names do |post|
122
+ post.commenters.pluck(:name)
123
+ end
124
+ many :comments, resource: AlbaCommentResource
125
+ end
126
+
127
+ # --- ActiveModelSerializer serializers ---
128
+
129
+ require "active_model_serializers"
130
+
131
+ ActiveModelSerializers.logger = Logger.new(nil)
132
+
133
+ class AMSCommentSerializer < ActiveModel::Serializer
134
+ attributes :id, :body
135
+ end
136
+
137
+ class AMSPostSerializer < ActiveModel::Serializer
138
+ attributes :id, :body
139
+ attribute :commenter_names
140
+ has_many :comments, serializer: AMSCommentSerializer
141
+
142
+ def commenter_names
143
+ object.commenters.pluck(:name)
144
+ end
145
+ end
146
+
147
+ # --- Blueprint serializers ---
148
+
149
+ require "blueprinter"
150
+
151
+ class CommentBlueprint < Blueprinter::Base
152
+ fields :id, :body
153
+ end
154
+
155
+ class PostBlueprint < Blueprinter::Base
156
+ fields :id, :body, :commenter_names
157
+ association :comments, blueprint: CommentBlueprint
158
+
159
+ def commenter_names
160
+ commenters.pluck(:name)
161
+ end
162
+ end
163
+
164
+ # --- JBuilder serializers ---
165
+
166
+ require "jbuilder"
167
+
168
+ class Post
169
+ def to_builder
170
+ Jbuilder.new do |post|
171
+ post.call(self, :id, :body, :commenter_names, :comments)
172
+ end
173
+ end
174
+
175
+ def commenter_names
176
+ commenters.pluck(:name)
177
+ end
178
+ end
179
+
180
+ class Comment
181
+ def to_builder
182
+ Jbuilder.new do |comment|
183
+ comment.call(self, :id, :body)
184
+ end
185
+ end
186
+ end
187
+
188
+ # --- Jserializer serializers ---
189
+
190
+ require 'jserializer'
191
+
192
+ class JserializerCommentSerializer < Jserializer::Base
193
+ attributes :id, :body
194
+ end
195
+
196
+ class JserializerPostSerializer < Jserializer::Base
197
+ attributes :id, :body, :commenter_names
198
+ has_many :comments, serializer: JserializerCommentSerializer
199
+ def commenter_names
200
+ object.commenters.pluck(:name)
201
+ end
202
+ end
203
+
204
+ # --- JSONAPI:Serializer serializers / (successor of fast_jsonapi) ---
205
+
206
+ class JsonApiStandardCommentSerializer
207
+ include JSONAPI::Serializer
208
+
209
+ attribute :id
210
+ attribute :body
211
+ end
212
+
213
+ class JsonApiStandardPostSerializer
214
+ include JSONAPI::Serializer
215
+
216
+ # set_type :post # optional
217
+ attribute :id
218
+ attribute :body
219
+ attribute :commenter_names
220
+
221
+ attribute :comments do |post|
222
+ post.comments.map { |comment| JsonApiSameFormatCommentSerializer.new(comment) }
223
+ end
224
+ end
225
+
226
+ # --- JSONAPI:Serializer serializers that format the code the same flat way as the other gems here ---
227
+
228
+ # code to convert from JSON:API output to "flat" JSON, like the other serializers build
229
+ class JsonApiSameFormatSerializer
230
+ include JSONAPI::Serializer
231
+
232
+ def as_json(*_options)
233
+ hash = serializable_hash
234
+
235
+ if hash[:data].is_a? Hash
236
+ hash[:data][:attributes]
237
+
238
+ elsif hash[:data].is_a? Array
239
+ hash[:data].pluck(:attributes)
240
+
241
+ elsif hash[:data].nil?
242
+ { }
243
+
244
+ else
245
+ raise "unexpected data type #{hash[:data].class}"
246
+ end
247
+ end
248
+ end
249
+
250
+ class JsonApiSameFormatCommentSerializer < JsonApiSameFormatSerializer
251
+ attribute :id
252
+ attribute :body
253
+ end
254
+
255
+ class JsonApiSameFormatPostSerializer < JsonApiSameFormatSerializer
256
+ attribute :id
257
+ attribute :body
258
+ attribute :commenter_names
259
+
260
+ attribute :comments do |post|
261
+ post.comments.map { |comment| JsonApiSameFormatCommentSerializer.new(comment) }
262
+ end
263
+ end
264
+
265
+ # --- Panko serializers ---
266
+ #
267
+
268
+ require "panko_serializer"
269
+
270
+ class PankoCommentSerializer < Panko::Serializer
271
+ attributes :id, :body
272
+ end
273
+
274
+
275
+ class PankoPostSerializer < Panko::Serializer
276
+ attributes :id, :body, :commenter_names
277
+
278
+ has_many :comments, serializer: PankoCommentSerializer
279
+
280
+ def commenter_names
281
+ object.comments.pluck(:name)
282
+ end
283
+ end
284
+
285
+ # --- Primalize serializers ---
286
+ #
287
+ class PrimalizeCommentResource < Primalize::Single
288
+ attributes id: integer, body: string
289
+ end
290
+
291
+ class PrimalizePostResource < Primalize::Single
292
+ alias post object
293
+
294
+ attributes(
295
+ id: integer,
296
+ body: string,
297
+ comments: array(primalize(PrimalizeCommentResource)),
298
+ commenter_names: array(string),
299
+ )
300
+
301
+ def commenter_names
302
+ post.commenters.pluck(:name)
303
+ end
304
+ end
305
+
306
+ class PrimalizePostsResource < Primalize::Many
307
+ attributes posts: enumerable(PrimalizePostResource)
308
+ end
309
+
310
+ # --- Representable serializers ---
311
+
312
+ require "representable"
313
+
314
+ class CommentRepresenter < Representable::Decorator
315
+ include Representable::JSON
316
+
317
+ property :id
318
+ property :body
319
+ end
320
+
321
+ class PostsRepresenter < Representable::Decorator
322
+ include Representable::JSON::Collection
323
+
324
+ items class: Post do
325
+ property :id
326
+ property :body
327
+ property :commenter_names
328
+ collection :comments
329
+ end
330
+
331
+ def commenter_names
332
+ commenters.pluck(:name)
333
+ end
334
+ end
335
+
336
+ # --- SimpleAMS serializers ---
337
+
338
+ require "simple_ams"
339
+
340
+ class SimpleAMSCommentSerializer
341
+ include SimpleAMS::DSL
342
+
343
+ attributes :id, :body
344
+ end
345
+
346
+ class SimpleAMSPostSerializer
347
+ include SimpleAMS::DSL
348
+
349
+ attributes :id, :body
350
+ attribute :commenter_names
351
+ has_many :comments, serializer: SimpleAMSCommentSerializer
352
+
353
+ def commenter_names
354
+ object.commenters.pluck(:name)
355
+ end
356
+ end
357
+
358
+ # --- Test data creation ---
359
+
360
+ 100.times do |i|
361
+ post = Post.create!(body: "post#{i}")
362
+ user1 = User.create!(name: "John#{i}")
363
+ user2 = User.create!(name: "Jane#{i}")
364
+ 10.times do |n|
365
+ post.comments.create!(commenter: user1, body: "Comment1_#{i}_#{n}")
366
+ post.comments.create!(commenter: user2, body: "Comment2_#{i}_#{n}")
367
+ end
368
+ end
369
+
370
+ posts = Post.all.to_a
371
+
372
+ # --- Store the serializers in procs ---
373
+
374
+ alba = Proc.new { AlbaPostResource.new(posts).serialize }
375
+ alba_inline = Proc.new do
376
+ Alba.serialize(posts) do
377
+ attributes :id, :body
378
+ attribute :commenter_names do |post|
379
+ post.commenters.pluck(:name)
380
+ end
381
+ many :comments do
382
+ attributes :id, :body
383
+ end
384
+ end
385
+ end
386
+
387
+ juso = Proc.new do
388
+ Juso.generate(posts)
389
+ end
390
+
391
+ ams = Proc.new { ActiveModelSerializers::SerializableResource.new(posts, {}).as_json }
392
+ blueprinter = Proc.new { PostBlueprint.render(posts) }
393
+ jbuilder = Proc.new do
394
+ Jbuilder.new do |json|
395
+ json.array!(posts) do |post|
396
+ json.post post.to_builder
397
+ end
398
+ end.target!
399
+ end
400
+ jserializer = Proc.new { JserializerPostSerializer.new(posts, is_collection: true).to_json }
401
+ jsonapi = proc { JsonApiStandardPostSerializer.new(posts).to_json }
402
+ jsonapi_same_format = proc { JsonApiSameFormatPostSerializer.new(posts).to_json }
403
+ panko = proc { Panko::ArraySerializer.new(posts, each_serializer: PankoPostSerializer).to_json }
404
+ primalize = proc { PrimalizePostsResource.new(posts: posts).to_json }
405
+ rails = Proc.new do
406
+ ActiveSupport::JSON.encode(posts.map{ |post| post.serializable_hash(include: :comments) })
407
+ end
408
+ representable = Proc.new { PostsRepresenter.new(posts).to_json }
409
+ simple_ams = Proc.new { SimpleAMS::Renderer::Collection.new(posts, serializer: SimpleAMSPostSerializer).to_json }
410
+
411
+ # --- Execute the serializers to check their output ---
412
+
413
+ puts "Serializer outputs ----------------------------------"
414
+ {
415
+ alba: alba,
416
+ alba_inline: alba_inline,
417
+ juso: juso,
418
+ ams: ams,
419
+ blueprinter: blueprinter,
420
+ jbuilder: jbuilder, # different order
421
+ jserializer: jserializer,
422
+ jsonapi: jsonapi, # nested JSON:API format
423
+ jsonapi_same_format: jsonapi_same_format,
424
+ panko: panko,
425
+ primalize: primalize,
426
+ rails: rails,
427
+ representable: representable,
428
+ simple_ams: simple_ams,
429
+ }.each { |name, serializer| puts "#{name.to_s.ljust(24, ' ')} #{serializer.call}" }
430
+
431
+ # --- Run the benchmarks ---
432
+
433
+ require 'benchmark/ips'
434
+ Benchmark.ips do |x|
435
+ x.report(:alba, &alba)
436
+ x.report(:alba_inline, &alba_inline)
437
+ x.report(:juso, &juso)
438
+ x.report(:ams, &ams)
439
+ x.report(:blueprinter, &blueprinter)
440
+ x.report(:jbuilder, &jbuilder)
441
+ x.report(:jserializer, &jserializer)
442
+ x.report(:jsonapi, &jsonapi)
443
+ x.report(:jsonapi_same_format, &jsonapi_same_format)
444
+ x.report(:panko, &panko)
445
+ x.report(:primalize, &primalize)
446
+ x.report(:rails, &rails)
447
+ x.report(:representable, &representable)
448
+ x.report(:simple_ams, &simple_ams)
449
+
450
+ x.compare!
451
+ end
452
+
453
+
454
+ require 'benchmark/memory'
455
+ Benchmark.memory do |x|
456
+ x.report(:alba, &alba)
457
+ x.report(:alba_inline, &alba_inline)
458
+ x.report(:juso, &juso)
459
+ x.report(:ams, &ams)
460
+ x.report(:blueprinter, &blueprinter)
461
+ x.report(:jbuilder, &jbuilder)
462
+ x.report(:jserializer, &jserializer)
463
+ x.report(:jsonapi, &jsonapi)
464
+ x.report(:jsonapi_same_format, &jsonapi_same_format)
465
+ x.report(:panko, &panko)
466
+ x.report(:primalize, &primalize)
467
+ x.report(:rails, &rails)
468
+ x.report(:representable, &representable)
469
+ x.report(:simple_ams, &simple_ams)
470
+
471
+ x.compare!
472
+ end
@@ -1,7 +1,7 @@
1
1
  # original from https://github.com/okuramasafumi/alba/blob/main/benchmark/single_resource.rb
2
2
 
3
3
  # Benchmark script to run varieties of JSON serializers
4
- # Fetch Alba from local, otherwise fetch latest from RubyGems
4
+ # Fetch juso from local, otherwise fetch latest from RubyGems
5
5
 
6
6
  # --- Bundle dependencies ---
7
7
 
@@ -22,10 +22,10 @@ gemfile(true) do
22
22
  gem "jserializer"
23
23
  gem "jsonapi-serializer" # successor of fast_jsonapi
24
24
  gem "multi_json"
25
- # gem "panko_serializer"
26
- # gem "pg"
25
+ gem "panko_serializer"
26
+ gem "pg"
27
27
  gem "primalize"
28
- # gem "oj"
28
+ gem "oj"
29
29
  gem "representable"
30
30
  gem "simple_ams"
31
31
  gem "sqlite3"
@@ -33,14 +33,14 @@ end
33
33
 
34
34
  # --- Test data model setup ---
35
35
 
36
- # require "pg"
36
+ require "pg"
37
37
  require "active_record"
38
- # require "active_record/connection_adapters/postgresql_adapter"
38
+ require "active_record/connection_adapters/postgresql_adapter"
39
39
  require "active_record/connection_adapters/sqlite3_adapter"
40
40
  require "logger"
41
- # require "oj"
41
+ require "oj"
42
42
  require "sqlite3"
43
- # Oj.optimize_rails
43
+ Oj.optimize_rails
44
44
 
45
45
  ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
46
46
  # ActiveRecord::Base.logger = Logger.new($stdout)
@@ -264,22 +264,22 @@ end
264
264
 
265
265
  # --- Panko serializers ---
266
266
  #
267
- # require "panko_serializer"
268
- #
269
- # class PankoCommentSerializer < Panko::Serializer
270
- # attributes :id, :body
271
- # end
272
- #
273
- #
274
- # class PankoPostSerializer < Panko::Serializer
275
- # attributes :id, :body, :commenter_names
276
- #
277
- # has_many :comments, serializer: PankoCommentSerializer
278
- #
279
- # def commenter_names
280
- # object.comments.pluck(:name)
281
- # end
282
- # end
267
+ require "panko_serializer"
268
+
269
+ class PankoCommentSerializer < Panko::Serializer
270
+ attributes :id, :body
271
+ end
272
+
273
+
274
+ class PankoPostSerializer < Panko::Serializer
275
+ attributes :id, :body, :commenter_names
276
+
277
+ has_many :comments, serializer: PankoCommentSerializer
278
+
279
+ def commenter_names
280
+ object.comments.pluck(:name)
281
+ end
282
+ end
283
283
 
284
284
  # --- Primalize serializers ---
285
285
  #
@@ -361,8 +361,6 @@ post.reload
361
361
 
362
362
  juso = Proc.new do
363
363
  Juso.generate(post)
364
- rescue
365
- binding.irb
366
364
  end
367
365
 
368
366
  alba = Proc.new { AlbaPostResource.new(post).serialize }
@@ -383,8 +381,8 @@ jbuilder = Proc.new { post.to_builder.target! }
383
381
  jserializer = Proc.new { JserializerPostSerializer.new(post).to_json }
384
382
  jsonapi = proc { JsonApiStandardPostSerializer.new(post).to_json }
385
383
  jsonapi_same_format = proc { JsonApiSameFormatPostSerializer.new(post).to_json }
386
- # panko = proc { PankoPostSerializer.new.serialize_to_json(post) }
387
- panko = proc { 'nop' }
384
+ panko = proc { PankoPostSerializer.new.serialize_to_json(post) }
385
+ # panko = proc { 'nop' }
388
386
  primalize = proc { PrimalizePostResource.new(post).to_json }
389
387
  rails = Proc.new { ActiveSupport::JSON.encode(post.serializable_hash(include: :comments)) }
390
388
  representable = Proc.new { PostRepresenter.new(post).to_json }
data/lib/juso/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Juso
4
- VERSION = "1.0.0"
4
+ VERSION = "1.0.1"
5
5
  end
data/lib/juso.rb CHANGED
@@ -27,11 +27,11 @@ module Juso
27
27
  end
28
28
 
29
29
  # Juso.generate generates json string
30
- def self.generate(object, context: Context.new)
30
+ def self.generate(object, context = Context.new)
31
31
  JSON.fast_generate(_g(object, context))
32
32
  end
33
33
 
34
- # generate returns hash (as json)
34
+ # generate returns object (as json)
35
35
  def self._g(object, context)
36
36
  case object
37
37
  when nil, Numeric, String, true, false
@@ -46,7 +46,7 @@ module Juso
46
46
  when *collection_classes
47
47
  return object.to_a.map { |o| _g(o, context) }
48
48
  when *date_classes
49
- return object.iso8601
49
+ return object.iso8601(context.options[:juso_time_n_digits] || 0)
50
50
  else
51
51
  # TODO: fallback to respond_to?(:juso) and warn?
52
52
 
@@ -87,5 +87,5 @@ module Juso
87
87
  end
88
88
  end
89
89
 
90
- private_class_method :default_collection_classes, :default_date_classes, :_g
90
+ private_class_method :default_collection_classes, :default_date_classes
91
91
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: juso
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - ykpythemind
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-11-27 00:00:00.000000000 Z
11
+ date: 2021-12-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -40,6 +40,7 @@ files:
40
40
  - LICENSE.txt
41
41
  - README.md
42
42
  - Rakefile
43
+ - benchmark/collection.rb
43
44
  - benchmark/single_resource.rb
44
45
  - bin/console
45
46
  - bin/setup