jbuilder 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- jbuilder (0.7.0)
4
+ jbuilder (0.8.0)
5
5
  activesupport (>= 3.0.0)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -8,7 +8,7 @@ Jbuilder.encode do |json|
8
8
  json.content format_content(@message.content)
9
9
  json.(@message, :created_at, :updated_at)
10
10
 
11
- json.author do |json|
11
+ json.author do
12
12
  json.name @message.creator.name.familiar
13
13
  json.email_address @message.creator.email_address_with_name
14
14
  json.url url_for(@message.creator, format: :json)
@@ -20,7 +20,7 @@ Jbuilder.encode do |json|
20
20
 
21
21
  json.comments @message.comments, :content, :created_at
22
22
 
23
- json.attachments @message.attachments do |json, attachment|
23
+ json.attachments @message.attachments do |attachment|
24
24
  json.filename attachment.filename
25
25
  json.url url_for(attachment)
26
26
  end
@@ -59,7 +59,7 @@ Top level arrays can be handled directly. Useful for index and other collection
59
59
 
60
60
  ``` ruby
61
61
  # @people = People.all
62
- json.array!(@people) do |json, person|
62
+ json.array!(@people) do |person|
63
63
  json.name person.name
64
64
  json.age calculate_age(person.birthday)
65
65
  end
@@ -101,7 +101,7 @@ You can either use Jbuilder stand-alone or directly as an ActionView template la
101
101
  json.content format_content(@message.content)
102
102
  json.(@message, :created_at, :updated_at)
103
103
 
104
- json.author do |json|
104
+ json.author do
105
105
  json.name @message.creator.name.familiar
106
106
  json.email_address @message.creator.email_address_with_name
107
107
  json.url url_for(@message.creator, format: :json)
Binary file
data/jbuilder.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'jbuilder'
3
- s.version = '0.7.0'
3
+ s.version = '0.8.0'
4
4
  s.author = 'David Heinemeier Hansson'
5
5
  s.email = 'david@37signals.com'
6
6
  s.summary = 'Create JSON structures via a Builder-style DSL'
data/lib/jbuilder.rb CHANGED
@@ -62,7 +62,7 @@ class Jbuilder < ActiveSupport::BasicObject
62
62
  #
63
63
  # You can also pass a block for nested attributes
64
64
  #
65
- # json.set!(:author) do |json|
65
+ # json.set!(:author) do
66
66
  # json.name "David"
67
67
  # json.age 32
68
68
  # end
@@ -70,7 +70,7 @@ class Jbuilder < ActiveSupport::BasicObject
70
70
  # { "author": { "name": "David", "age": 32 } }
71
71
  def set!(key, value = nil)
72
72
  if ::Kernel::block_given?
73
- _set_value(key, _with_attributes { yield self })
73
+ _set_value(key, _scope { yield self })
74
74
  else
75
75
  _set_value(key, value)
76
76
  end
@@ -83,7 +83,7 @@ class Jbuilder < ActiveSupport::BasicObject
83
83
  # Example:
84
84
  #
85
85
  # json.key_format! :upcase
86
- # json.author do |json|
86
+ # json.author do
87
87
  # json.name "David"
88
88
  # json.age 32
89
89
  # end
@@ -117,21 +117,21 @@ class Jbuilder < ActiveSupport::BasicObject
117
117
  #
118
118
  # Example:
119
119
  #
120
- # json.comments do |json|
121
- # json.child! { |json| json.content "hello" }
122
- # json.child! { |json| json.content "world" }
120
+ # json.comments do
121
+ # json.child! { json.content "hello" }
122
+ # json.child! { json.content "world" }
123
123
  # end
124
124
  #
125
125
  # { "comments": [ { "content": "hello" }, { "content": "world" } ]}
126
126
  #
127
127
  # More commonly, you'd use the combined iterator, though:
128
128
  #
129
- # json.comments(@post.comments) do |json, comment|
129
+ # json.comments(@post.comments) do |comment|
130
130
  # json.content comment.formatted_content
131
131
  # end
132
132
  def child!
133
133
  @attributes = [] unless @attributes.is_a? ::Array
134
- @attributes << _with_attributes { yield self }
134
+ @attributes << _scope { yield self }
135
135
  end
136
136
 
137
137
  # Turns the current element into an array and iterates over the passed collection, adding each iteration as
@@ -139,7 +139,7 @@ class Jbuilder < ActiveSupport::BasicObject
139
139
  #
140
140
  # Example:
141
141
  #
142
- # json.array!(@people) do |json, person|
142
+ # json.array!(@people) do |person|
143
143
  # json.name person.name
144
144
  # json.age calculate_age(person.birthday)
145
145
  # end
@@ -148,11 +148,11 @@ class Jbuilder < ActiveSupport::BasicObject
148
148
  #
149
149
  # If you are using Ruby 1.9+, you can use the call syntax instead of an explicit extract! call:
150
150
  #
151
- # json.(@people) { |json, person| ... }
151
+ # json.(@people) { |person| ... }
152
152
  #
153
153
  # It's generally only needed to use this method for top-level arrays. If you have named arrays, you can do:
154
154
  #
155
- # json.people(@people) do |json, person|
155
+ # json.people(@people) do |person|
156
156
  # json.name person.name
157
157
  # json.age calculate_age(person.birthday)
158
158
  # end
@@ -165,8 +165,8 @@ class Jbuilder < ActiveSupport::BasicObject
165
165
  #
166
166
  # [1,2,3]
167
167
  def array!(collection)
168
- @attributes = if block_given?
169
- _map_collection(collection) { |element| yield self, element }
168
+ @attributes = if ::Kernel::block_given?
169
+ _map_collection(collection) { |element| if ::Proc.new.arity == 2 then yield self, element else yield element end }
170
170
  else
171
171
  collection
172
172
  end
@@ -199,7 +199,7 @@ class Jbuilder < ActiveSupport::BasicObject
199
199
 
200
200
  def call(object = nil, *attributes)
201
201
  if attributes.empty?
202
- array!(object) { |_, element| yield self, element }
202
+ array!(object, &::Proc.new)
203
203
  else
204
204
  extract!(object, *attributes)
205
205
  end
@@ -215,48 +215,22 @@ class Jbuilder < ActiveSupport::BasicObject
215
215
  ::MultiJson.encode @attributes
216
216
  end
217
217
 
218
- # Caches the json constructed within the block passed. Has the same signature as the `cache` helper
219
- # method in `ActionView::Helpers::CacheHelper` and so can be used in the same way.
220
- #
221
- # Example:
222
- #
223
- # json.cache! ['v1', @person], :expires_in => 10.minutes do |json|
224
- # json.extract! @person, :name, :age
225
- # end
226
- def cache!(key=nil, options={}, &block)
227
- cache_key = ::ActiveSupport::Cache.expand_cache_key(key.is_a?(::Hash) ? url_for(key).split("://").last : key, :jbuilder)
228
- value = ::Rails.cache.fetch(cache_key, options) do
229
- jb = ::Jbuilder.new
230
- yield jb
231
- jb.attributes!
232
- end
233
-
234
- if value.is_a?(::Array)
235
- array! value
236
- else
237
- value.each do |k, v|
238
- set! k, v
239
- end
240
- end
241
- end
242
-
243
218
  protected
244
219
  def _set_value(key, value)
245
220
  @attributes[@key_formatter.format(key)] = value
246
221
  end
247
222
 
248
-
249
223
  private
250
224
  def method_missing(method, value = nil, *args)
251
225
  result = if ::Kernel.block_given?
252
226
  if value
253
- # json.comments @post.comments { |json, comment| ... }
227
+ # json.comments @post.comments { |comment| ... }
254
228
  # { "comments": [ { ... }, { ... } ] }
255
- _map_collection(value) { |element| yield self, element }
229
+ _map_collection(value) { |element| if ::Proc.new.arity == 2 then yield self, element else yield element end }
256
230
  else
257
- # json.comments { |json| ... }
231
+ # json.comments { ... }
258
232
  # { "comments": ... }
259
- _with_attributes { yield self }
233
+ _scope { yield self }
260
234
  end
261
235
  else
262
236
  if args.empty?
@@ -282,7 +256,7 @@ class Jbuilder < ActiveSupport::BasicObject
282
256
  else
283
257
  # json.author @post.creator, :name, :email_address
284
258
  # { "author": { "name": "David", "email_address": "david@loudthinking.com" } }
285
- _with_attributes { extract! value, *args }
259
+ _scope { extract! value, *args }
286
260
  end
287
261
  end
288
262
  end
@@ -291,11 +265,11 @@ class Jbuilder < ActiveSupport::BasicObject
291
265
 
292
266
  def _map_collection(collection)
293
267
  collection.each.map do |element|
294
- _with_attributes { yield element }
268
+ _scope { yield element }
295
269
  end
296
270
  end
297
271
 
298
- def _with_attributes
272
+ def _scope
299
273
  parent_attributes, parent_formatter = @attributes, @key_formatter
300
274
  @attributes = ::ActiveSupport::OrderedHash.new
301
275
  yield
@@ -303,6 +277,15 @@ class Jbuilder < ActiveSupport::BasicObject
303
277
  ensure
304
278
  @attributes, @key_formatter = parent_attributes, parent_formatter
305
279
  end
280
+
281
+ def _merge(hash_or_array)
282
+ if hash_or_array.is_a?(::Array)
283
+ @attributes = [] unless @attributes.is_a? ::Array
284
+ @attributes.concat(hash_or_array)
285
+ else
286
+ @attributes.update(hash_or_array)
287
+ end
288
+ end
306
289
  end
307
290
 
308
291
  require "jbuilder_template" if defined?(ActionView::Template)
@@ -14,6 +14,22 @@ class JbuilderTemplate < Jbuilder
14
14
  @context.render(options, locals.merge(:json => self))
15
15
  end
16
16
  end
17
+
18
+ # Caches the json constructed within the block passed. Has the same signature as the `cache` helper
19
+ # method in `ActionView::Helpers::CacheHelper` and so can be used in the same way.
20
+ #
21
+ # Example:
22
+ #
23
+ # json.cache! ['v1', @person], :expires_in => 10.minutes do
24
+ # json.extract! @person, :name, :age
25
+ # end
26
+ def cache!(key=nil, options={}, &block)
27
+ cache_key = ::ActiveSupport::Cache.expand_cache_key(key.is_a?(::Hash) ? url_for(key).split("://").last : key, :jbuilder)
28
+ value = ::Rails.cache.fetch(cache_key, options) do
29
+ _scope { yield self }
30
+ end
31
+ _merge(value)
32
+ end
17
33
  end
18
34
 
19
35
  class JbuilderHandler
@@ -1,9 +1,32 @@
1
1
  require 'test/unit'
2
2
  require 'action_view'
3
3
  require 'action_view/testing/resolvers'
4
+ require 'active_support/cache'
4
5
 
5
6
  require 'jbuilder'
6
7
 
8
+ module Rails
9
+ class Cache
10
+ def initialize
11
+ @cache = {}
12
+ end
13
+
14
+ def write(k, v, opt={})
15
+ @cache[k] = v
16
+ end
17
+
18
+ def read(k, opt={})
19
+ @cache[k]
20
+ end
21
+
22
+ def fetch(k, opt={}, &block)
23
+ @cache[k] || @cache[k] = block.call
24
+ end
25
+ end
26
+
27
+ def self.cache; @cache ||= Cache.new; end
28
+ end
29
+
7
30
  class JbuilderTemplateTest < ActionView::TestCase
8
31
  def partials
9
32
  { "_partial.json.jbuilder" => 'json.content "hello"' }
@@ -36,7 +59,7 @@ class JbuilderTemplateTest < ActionView::TestCase
36
59
  json = render_jbuilder <<-JBUILDER
37
60
  json.key_format! :upcase
38
61
  json.level1 "one"
39
- json.level2 do |json|
62
+ json.level2 do
40
63
  json.value "two"
41
64
  end
42
65
  JBUILDER
@@ -53,4 +76,43 @@ class JbuilderTemplateTest < ActionView::TestCase
53
76
 
54
77
  assert_equal "hello", MultiJson.load(json)["content"]
55
78
  end
79
+
80
+ test "fragment caching a JSON object" do
81
+ json = render_jbuilder <<-JBUILDER
82
+ json.cache!("cachekey") do
83
+ json.name "Cache"
84
+ end
85
+ JBUILDER
86
+
87
+ Rails.cache.read("jbuilder/cachekey").tap do |parsed|
88
+ assert_equal "Cache", parsed['name']
89
+ end
90
+ end
91
+
92
+ test "fragment caching deserializes a JSON object" do
93
+ Rails.cache.write("jbuilder/cachekey", {'name' => "Something"})
94
+ json = render_jbuilder <<-JBUILDER
95
+ json.cache!("cachekey") do
96
+ json.name "Cache"
97
+ end
98
+ JBUILDER
99
+
100
+ MultiJson.load(json).tap do |parsed|
101
+ assert_equal "Something", parsed['name']
102
+ end
103
+ end
104
+
105
+ test "fragment caching deserializes an array" do
106
+ Rails.cache.write("jbuilder/cachekey", ["a", "b", "c"])
107
+ json = render_jbuilder <<-JBUILDER
108
+ json.cache!("cachekey") do
109
+ json.array! ['1', '2', '3']
110
+ end
111
+ JBUILDER
112
+
113
+ MultiJson.load(json).tap do |parsed|
114
+ assert_equal ["a", "b", "c"], parsed
115
+ end
116
+ end
117
+
56
118
  end
@@ -1,32 +1,9 @@
1
1
  require 'test/unit'
2
2
  require 'active_support/test_case'
3
- require 'active_support/cache'
4
3
  require 'active_support/inflector'
5
4
 
6
5
  require 'jbuilder'
7
6
 
8
- module Rails
9
- class Cache
10
- def initialize
11
- @cache = {}
12
- end
13
-
14
- def write(k, v, opt={})
15
- @cache[k] = v
16
- end
17
-
18
- def read(k, opt={})
19
- @cache[k]
20
- end
21
-
22
- def fetch(k, opt={}, &block)
23
- @cache[k] || @cache[k] = block.call
24
- end
25
- end
26
-
27
- def self.cache; @cache ||= Cache.new; end
28
- end
29
-
30
7
  class JbuilderTest < ActiveSupport::TestCase
31
8
  test "single key" do
32
9
  json = Jbuilder.encode do |json|
@@ -110,7 +87,7 @@ class JbuilderTest < ActiveSupport::TestCase
110
87
 
111
88
  test "nesting single child with block" do
112
89
  json = Jbuilder.encode do |json|
113
- json.author do |json|
90
+ json.author do
114
91
  json.name "David"
115
92
  json.age 32
116
93
  end
@@ -124,9 +101,9 @@ class JbuilderTest < ActiveSupport::TestCase
124
101
 
125
102
  test "nesting multiple children with block" do
126
103
  json = Jbuilder.encode do |json|
127
- json.comments do |json|
128
- json.child! { |json| json.content "hello" }
129
- json.child! { |json| json.content "world" }
104
+ json.comments do
105
+ json.child! { json.content "hello" }
106
+ json.child! { json.content "world" }
130
107
  end
131
108
  end
132
109
 
@@ -186,6 +163,22 @@ class JbuilderTest < ActiveSupport::TestCase
186
163
  test "nesting multiple children from array with inline loop" do
187
164
  comments = [ Struct.new(:content, :id).new("hello", 1), Struct.new(:content, :id).new("world", 2) ]
188
165
 
166
+ json = Jbuilder.encode do |json|
167
+ json.comments comments do |comment|
168
+ json.content comment.content
169
+ end
170
+ end
171
+
172
+ MultiJson.load(json).tap do |parsed|
173
+ assert_equal ["content"], parsed["comments"].first.keys
174
+ assert_equal "hello", parsed["comments"].first["content"]
175
+ assert_equal "world", parsed["comments"].second["content"]
176
+ end
177
+ end
178
+
179
+ test "nesting multiple children from array with inline loop with old api" do
180
+ comments = [ Struct.new(:content, :id).new("hello", 1), Struct.new(:content, :id).new("world", 2) ]
181
+
189
182
  json = Jbuilder.encode do |json|
190
183
  json.comments comments do |json, comment|
191
184
  json.content comment.content
@@ -202,6 +195,21 @@ class JbuilderTest < ActiveSupport::TestCase
202
195
  test "nesting multiple children from array with inline loop on root" do
203
196
  comments = [ Struct.new(:content, :id).new("hello", 1), Struct.new(:content, :id).new("world", 2) ]
204
197
 
198
+ json = Jbuilder.encode do |json|
199
+ json.call(comments) do |comment|
200
+ json.content comment.content
201
+ end
202
+ end
203
+
204
+ MultiJson.load(json).tap do |parsed|
205
+ assert_equal "hello", parsed.first["content"]
206
+ assert_equal "world", parsed.second["content"]
207
+ end
208
+ end
209
+
210
+ test "nesting multiple children from array with inline loop on root with old api" do
211
+ comments = [ Struct.new(:content, :id).new("hello", 1), Struct.new(:content, :id).new("world", 2) ]
212
+
205
213
  json = Jbuilder.encode do |json|
206
214
  json.call(comments) do |json, comment|
207
215
  json.content comment.content
@@ -216,13 +224,13 @@ class JbuilderTest < ActiveSupport::TestCase
216
224
 
217
225
  test "array nested inside nested hash" do
218
226
  json = Jbuilder.encode do |json|
219
- json.author do |json|
227
+ json.author do
220
228
  json.name "David"
221
229
  json.age 32
222
230
 
223
- json.comments do |json|
224
- json.child! { |json| json.content "hello" }
225
- json.child! { |json| json.content "world" }
231
+ json.comments do
232
+ json.child! { json.content "hello" }
233
+ json.child! { json.content "world" }
226
234
  end
227
235
  end
228
236
  end
@@ -235,10 +243,10 @@ class JbuilderTest < ActiveSupport::TestCase
235
243
 
236
244
  test "array nested inside array" do
237
245
  json = Jbuilder.encode do |json|
238
- json.comments do |json|
239
- json.child! do |json|
240
- json.authors do |json|
241
- json.child! do |json|
246
+ json.comments do
247
+ json.child! do
248
+ json.authors do
249
+ json.child! do
242
250
  json.name "david"
243
251
  end
244
252
  end
@@ -249,6 +257,36 @@ class JbuilderTest < ActiveSupport::TestCase
249
257
  assert_equal "david", MultiJson.load(json)["comments"].first["authors"].first["name"]
250
258
  end
251
259
 
260
+ test "directly set an array nested in another array" do
261
+ data = [ { :department => 'QA', :not_in_json => 'hello', :names => ['John', 'David'] } ]
262
+ json = Jbuilder.encode do |json|
263
+ json.array! data do |object|
264
+ json.department object[:department]
265
+ json.names do
266
+ json.array! object[:names]
267
+ end
268
+ end
269
+ end
270
+
271
+ assert_equal 'David', MultiJson.load(json)[0]['names'].last
272
+ assert_not_equal 'hello', MultiJson.load(json)[0]['not_in_json']
273
+ end
274
+
275
+ test "directly set an array nested in another array with old api" do
276
+ data = [ { :department => 'QA', :not_in_json => 'hello', :names => ['John', 'David'] } ]
277
+ json = Jbuilder.encode do |json|
278
+ json.array! data do |json, object|
279
+ json.department object[:department]
280
+ json.names do
281
+ json.array! object[:names]
282
+ end
283
+ end
284
+ end
285
+
286
+ assert_equal 'David', MultiJson.load(json)[0]['names'].last
287
+ assert_not_equal 'hello', MultiJson.load(json)[0]['not_in_json']
288
+ end
289
+
252
290
  test "nested jbuilder objects" do
253
291
  to_nest = Jbuilder.new
254
292
  to_nest.nested_value "Nested Test"
@@ -265,7 +303,7 @@ class JbuilderTest < ActiveSupport::TestCase
265
303
  comments = [ Struct.new(:content, :id).new("hello", 1), Struct.new(:content, :id).new("world", 2) ]
266
304
 
267
305
  json = Jbuilder.encode do |json|
268
- json.array!(comments) do |json, comment|
306
+ json.array!(comments) do |comment|
269
307
  json.content comment.content
270
308
  end
271
309
  end
@@ -280,7 +318,7 @@ class JbuilderTest < ActiveSupport::TestCase
280
318
  comments = []
281
319
 
282
320
  json = Jbuilder.encode do |json|
283
- json.array!(comments) do |json, comment|
321
+ json.array!(comments) do |comment|
284
322
  json.content comment.content
285
323
  end
286
324
  end
@@ -298,7 +336,7 @@ class JbuilderTest < ActiveSupport::TestCase
298
336
 
299
337
  test "dynamically set a key/nested child with block" do
300
338
  json = Jbuilder.encode do |json|
301
- json.set!(:author) do |json|
339
+ json.set!(:author) do
302
340
  json.name "David"
303
341
  json.age 32
304
342
  end
@@ -357,7 +395,7 @@ class JbuilderTest < ActiveSupport::TestCase
357
395
  json = Jbuilder.new
358
396
  json.key_format! :upcase
359
397
  json.level1 "one"
360
- json.level2 do |json|
398
+ json.level2 do
361
399
  json.value "two"
362
400
  end
363
401
 
@@ -368,7 +406,7 @@ class JbuilderTest < ActiveSupport::TestCase
368
406
 
369
407
  test "key_format! resets after child element" do
370
408
  json = Jbuilder.new
371
- json.level2 do |json|
409
+ json.level2 do
372
410
  json.key_format! :upcase
373
411
  json.value "two"
374
412
  end
@@ -419,41 +457,4 @@ class JbuilderTest < ActiveSupport::TestCase
419
457
  assert_equal [], Jbuilder.send(:class_variable_get, "@@key_formatter").instance_variable_get("@cache").keys
420
458
  end
421
459
 
422
- test "fragment caching a JSON object" do
423
- json = Jbuilder.encode do |json|
424
- json.cache!("cachekey") do |json|
425
- json.name "Cache"
426
- end
427
- end
428
-
429
- Rails.cache.read("jbuilder/cachekey").tap do |parsed|
430
- assert_equal "Cache", parsed['name']
431
- end
432
- end
433
-
434
- test "fragment caching deserializes a JSON object" do
435
- Rails.cache.write("jbuilder/cachekey", {'name' => "Something"})
436
- json = Jbuilder.encode do |json|
437
- json.cache!("cachekey") do |json|
438
- json.name "Cache"
439
- end
440
- end
441
-
442
- JSON.parse(json).tap do |parsed|
443
- assert_equal "Something", parsed['name']
444
- end
445
- end
446
-
447
- test "fragment caching deserializes an array" do
448
- Rails.cache.write("jbuilder/cachekey", ["a", "b", "c"])
449
- json = Jbuilder.encode do |json|
450
- json.cache!("cachekey") do |json|
451
- json.array! ['1', '2', '3']
452
- end
453
- end
454
-
455
- JSON.parse(json).tap do |parsed|
456
- assert_equal ["a", "b", "c"], parsed
457
- end
458
- end
459
460
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jbuilder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-24 00:00:00.000000000 Z
12
+ date: 2012-09-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &2152334840 !ruby/object:Gem::Requirement
16
+ requirement: &2152108040 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: 3.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2152334840
24
+ version_requirements: *2152108040
25
25
  description:
26
26
  email: david@37signals.com
27
27
  executables: []
@@ -31,6 +31,7 @@ files:
31
31
  - ./Gemfile
32
32
  - ./Gemfile.lock
33
33
  - ./jbuilder-0.6.0.gem
34
+ - ./jbuilder-0.7.0.gem
34
35
  - ./jbuilder.gemspec
35
36
  - ./lib/jbuilder.rb
36
37
  - ./lib/jbuilder_template.rb