jbuilder 2.0.8 → 2.1.0
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 +4 -0
- data/jbuilder.gemspec +1 -1
- data/lib/jbuilder.rb +39 -12
- data/test/jbuilder_test.rb +69 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a389ec3a309016718e77b531bb60b89aa18b5734
|
4
|
+
data.tar.gz: 0b749ea3555366e70c5f99d7697072e9f9badb27
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a807a3a810d46fa3c6b16a1d171d6f94f765aee7dfb93da2a435160a26a4ac3e921a34783e80738cfc5b30eadfd3fffcbf074ce2e6cba801c2f7332c373c75a6
|
7
|
+
data.tar.gz: 3409ea860fbff36986ba86572d9db4690f1328d83d3876b19fb6c97744c15b1df7cd80f953fa4f2a231325c6dfe6656dfdee9f64619e917fb608248c096efb35
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
2.1.0
|
4
|
+
-----
|
5
|
+
* [Blocks and their extract! shortcuts are additive by default](https://github.com/rails/jbuilder/commit/a49390736c5f6e2d7a31111df6531bc28dba9fb1)
|
6
|
+
|
3
7
|
2.0.8
|
4
8
|
-----
|
5
9
|
* [Eliminate circular dependencies](https://github.com/rails/jbuilder/commit/0879484dc74e7be93b695f66e3708ba48cdb1be3)
|
data/jbuilder.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'jbuilder'
|
3
|
-
s.version = '2.0
|
3
|
+
s.version = '2.1.0'
|
4
4
|
s.authors = ['David Heinemeier Hansson', 'Pavel Pravosud']
|
5
5
|
s.email = ['david@37signals.com', 'pavel@pravosud.com']
|
6
6
|
s.summary = 'Create JSON structures via a Builder-style DSL'
|
data/lib/jbuilder.rb
CHANGED
@@ -32,7 +32,7 @@ class Jbuilder
|
|
32
32
|
else
|
33
33
|
# json.comments { ... }
|
34
34
|
# { "comments": ... }
|
35
|
-
|
35
|
+
_merge_block(key){ yield self }
|
36
36
|
end
|
37
37
|
elsif args.empty?
|
38
38
|
if ::Jbuilder === value
|
@@ -52,7 +52,7 @@ class Jbuilder
|
|
52
52
|
else
|
53
53
|
# json.author @post.creator, :name, :email_address
|
54
54
|
# { "author": { "name": "David", "email_address": "david@loudthinking.com" } }
|
55
|
-
|
55
|
+
_merge_block(key){ extract! value, *args }
|
56
56
|
end
|
57
57
|
|
58
58
|
_set_value key, result
|
@@ -174,13 +174,15 @@ class Jbuilder
|
|
174
174
|
#
|
175
175
|
# [1,2,3]
|
176
176
|
def array!(collection = [], *attributes, &block)
|
177
|
-
|
177
|
+
array = if block
|
178
178
|
_map_collection(collection, &block)
|
179
179
|
elsif attributes.any?
|
180
180
|
_map_collection(collection) { |element| extract! element, *attributes }
|
181
181
|
else
|
182
182
|
collection
|
183
183
|
end
|
184
|
+
|
185
|
+
merge! array
|
184
186
|
end
|
185
187
|
|
186
188
|
# Extracts the mentioned attributes or hash elements from the passed object and turns them into attributes of the JSON.
|
@@ -230,12 +232,7 @@ class Jbuilder
|
|
230
232
|
|
231
233
|
# Merges hash or array into current builder.
|
232
234
|
def merge!(hash_or_array)
|
233
|
-
|
234
|
-
@attributes = [] unless ::Array === @attributes
|
235
|
-
@attributes.concat hash_or_array
|
236
|
-
else
|
237
|
-
@attributes.update hash_or_array
|
238
|
-
end
|
235
|
+
@attributes = _merge_values(@attributes, hash_or_array)
|
239
236
|
end
|
240
237
|
|
241
238
|
# Encodes the current builder as JSON.
|
@@ -253,12 +250,29 @@ class Jbuilder
|
|
253
250
|
attributes.each{ |key| _set_value key, object.public_send(key) }
|
254
251
|
end
|
255
252
|
|
253
|
+
def _merge_block(key, &block)
|
254
|
+
current_value = _read(key, {})
|
255
|
+
raise NullError.build(key) if current_value.nil?
|
256
|
+
value = _scope{ yield self }
|
257
|
+
value.nil? ? value : _merge_values(current_value, value)
|
258
|
+
end
|
259
|
+
|
260
|
+
def _read(key, default = nil)
|
261
|
+
@attributes.fetch(_key(key)){ default }
|
262
|
+
end
|
263
|
+
|
264
|
+
def _write(key, value)
|
265
|
+
@attributes[_key(key)] = value
|
266
|
+
end
|
267
|
+
|
268
|
+
def _key(key)
|
269
|
+
@key_formatter.format(key)
|
270
|
+
end
|
271
|
+
|
256
272
|
def _set_value(key, value)
|
257
273
|
raise NullError.build(key) if @attributes.nil?
|
258
274
|
return if @ignore_nil && value.nil?
|
259
|
-
|
260
|
-
key = @key_formatter.format(key)
|
261
|
-
@attributes[key] = value
|
275
|
+
_write key, value
|
262
276
|
end
|
263
277
|
|
264
278
|
def _map_collection(collection)
|
@@ -281,6 +295,19 @@ class Jbuilder
|
|
281
295
|
def _mapable_arguments?(value, *args)
|
282
296
|
value.respond_to?(:map)
|
283
297
|
end
|
298
|
+
|
299
|
+
def _merge_values(attributes, hash_or_array)
|
300
|
+
attributes = attributes.dup
|
301
|
+
|
302
|
+
if ::Array === hash_or_array
|
303
|
+
attributes = [] unless ::Array === attributes
|
304
|
+
attributes.concat hash_or_array
|
305
|
+
else
|
306
|
+
attributes.update hash_or_array
|
307
|
+
end
|
308
|
+
|
309
|
+
attributes
|
310
|
+
end
|
284
311
|
end
|
285
312
|
|
286
313
|
require 'jbuilder/jbuilder_template' if defined?(ActionView::Template)
|
data/test/jbuilder_test.rb
CHANGED
@@ -121,6 +121,42 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
121
121
|
assert_equal 32, result['author']['age']
|
122
122
|
end
|
123
123
|
|
124
|
+
test 'blocks are additive' do
|
125
|
+
result = jbuild do |json|
|
126
|
+
json.author do
|
127
|
+
json.name 'David'
|
128
|
+
end
|
129
|
+
|
130
|
+
json.author do
|
131
|
+
json.age 32
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
assert_equal 'David', result['author']['name']
|
136
|
+
assert_equal 32, result['author']['age']
|
137
|
+
end
|
138
|
+
|
139
|
+
test 'blocks are additive via extract syntax' do
|
140
|
+
person = Person.new('Pavel', 27)
|
141
|
+
|
142
|
+
result = jbuild do |json|
|
143
|
+
json.author person, :age
|
144
|
+
json.author person, :name
|
145
|
+
end
|
146
|
+
|
147
|
+
assert_equal 'Pavel', result['author']['name']
|
148
|
+
assert_equal 27, result['author']['age']
|
149
|
+
end
|
150
|
+
|
151
|
+
test 'arrays are additive' do
|
152
|
+
result = jbuild do |json|
|
153
|
+
json.array! %w[foo]
|
154
|
+
json.array! %w[bar]
|
155
|
+
end
|
156
|
+
|
157
|
+
assert_equal %w[foo bar], result
|
158
|
+
end
|
159
|
+
|
124
160
|
test 'nesting multiple children with block' do
|
125
161
|
result = jbuild do |json|
|
126
162
|
json.comments do
|
@@ -531,9 +567,40 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
531
567
|
assert_nil result
|
532
568
|
end
|
533
569
|
|
534
|
-
test '
|
570
|
+
test 'null! in a block' do
|
571
|
+
result = jbuild do |json|
|
572
|
+
json.author do
|
573
|
+
json.name 'David'
|
574
|
+
end
|
575
|
+
|
576
|
+
json.author do
|
577
|
+
json.null!
|
578
|
+
end
|
579
|
+
end
|
580
|
+
|
581
|
+
assert result.key?('author')
|
582
|
+
assert_nil result['author']
|
583
|
+
end
|
584
|
+
|
585
|
+
test 'throws NullError when trying to add properties to null' do
|
535
586
|
json = Jbuilder.new
|
536
587
|
json.null!
|
537
|
-
assert_raise
|
588
|
+
assert_raise Jbuilder::NullError do
|
589
|
+
json.foo 'bar'
|
590
|
+
end
|
591
|
+
end
|
592
|
+
|
593
|
+
test 'throws NullError when trying to add properties to null using block syntax' do
|
594
|
+
assert_raise Jbuilder::NullError do
|
595
|
+
jbuild do |json|
|
596
|
+
json.author do
|
597
|
+
json.null!
|
598
|
+
end
|
599
|
+
|
600
|
+
json.author do
|
601
|
+
json.name "Pavel"
|
602
|
+
end
|
603
|
+
end
|
604
|
+
end
|
538
605
|
end
|
539
606
|
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: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-06-
|
12
|
+
date: 2014-06-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|