jbuilder 2.11.1 → 2.11.2
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 +6 -1
- data/README.md +19 -0
- data/jbuilder.gemspec +1 -1
- data/lib/jbuilder.rb +39 -10
- data/test/jbuilder_test.rb +138 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '039b14d174dd7bfb3a5e00d5a315aee89f1efd46a570244191ab985bb44fc328'
|
4
|
+
data.tar.gz: 4eda58d10150903687b7940b858fa02c6f0a2cbca8858cd2ae9866c5be5a4b62
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d20f2794455635cbb3272bd4b6e8f91781e2c55aa40c7228d5347b4b6ad049cd3cc22ebc9ef708b8bbe4a05811774de07770b175035342123458a4637b9240f
|
7
|
+
data.tar.gz: 383aca1c7489eda135339e4538fa8a9dec80900c7c8bab786729a7c323d63f3a75657889ee6dad6bf91b769ced3eb507e41ef7daa15faa8bb3c5d0261c0c0394
|
data/CHANGELOG.md
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
2.11.2
|
4
|
+
------
|
5
|
+
|
6
|
+
* [Improve key formatting for nested hashes and disable by default](https://github.com/rails/jbuilder/pull/497)
|
7
|
+
|
3
8
|
2.11.1
|
4
9
|
------
|
5
10
|
|
6
|
-
* Use symbols instead of strings for before_action
|
11
|
+
* Use symbols instead of strings for before_action filters [DHH]
|
7
12
|
* Slim down comments in generated scaffold code [DHH]
|
8
13
|
|
9
14
|
2.11.0
|
data/README.md
CHANGED
@@ -274,6 +274,25 @@ environment.rb for example):
|
|
274
274
|
Jbuilder.key_format camelize: :lower
|
275
275
|
```
|
276
276
|
|
277
|
+
By default, key format is not applied to keys of hashes that are
|
278
|
+
passed to methods like `set!`, `array!` or `merge!`. You can opt into
|
279
|
+
deeply transforming these as well:
|
280
|
+
|
281
|
+
``` ruby
|
282
|
+
json.key_format! camelize: :lower
|
283
|
+
json.deep_format_keys!
|
284
|
+
json.settings([{some_value: "abc"}])
|
285
|
+
|
286
|
+
# => { "settings": [{ "someValue": "abc" }]}
|
287
|
+
```
|
288
|
+
|
289
|
+
You can set this globally with the class method `deep_format_keys` (from inside your
|
290
|
+
environment.rb for example):
|
291
|
+
|
292
|
+
``` ruby
|
293
|
+
Jbuilder.deep_format_keys true
|
294
|
+
```
|
295
|
+
|
277
296
|
## Contributing to Jbuilder
|
278
297
|
|
279
298
|
Jbuilder is the work of many contributors. You're encouraged to submit pull requests, propose
|
data/jbuilder.gemspec
CHANGED
data/lib/jbuilder.rb
CHANGED
@@ -9,12 +9,14 @@ require 'active_support/core_ext/hash/deep_merge'
|
|
9
9
|
class Jbuilder
|
10
10
|
@@key_formatter = nil
|
11
11
|
@@ignore_nil = false
|
12
|
+
@@deep_format_keys = false
|
12
13
|
|
13
14
|
def initialize(options = {})
|
14
15
|
@attributes = {}
|
15
16
|
|
16
17
|
@key_formatter = options.fetch(:key_formatter){ @@key_formatter ? @@key_formatter.clone : nil}
|
17
18
|
@ignore_nil = options.fetch(:ignore_nil, @@ignore_nil)
|
19
|
+
@deep_format_keys = options.fetch(:deep_format_keys, @@deep_format_keys)
|
18
20
|
|
19
21
|
yield self if ::Kernel.block_given?
|
20
22
|
end
|
@@ -131,6 +133,31 @@ class Jbuilder
|
|
131
133
|
@@ignore_nil = value
|
132
134
|
end
|
133
135
|
|
136
|
+
# Deeply apply key format to nested hashes and arrays passed to
|
137
|
+
# methods like set!, merge! or array!.
|
138
|
+
#
|
139
|
+
# Example:
|
140
|
+
#
|
141
|
+
# json.key_format! camelize: :lower
|
142
|
+
# json.settings({some_value: "abc"})
|
143
|
+
#
|
144
|
+
# { "settings": { "some_value": "abc" }}
|
145
|
+
#
|
146
|
+
# json.key_format! camelize: :lower
|
147
|
+
# json.deep_format_keys!
|
148
|
+
# json.settings({some_value: "abc"})
|
149
|
+
#
|
150
|
+
# { "settings": { "someValue": "abc" }}
|
151
|
+
#
|
152
|
+
def deep_format_keys!(value = true)
|
153
|
+
@deep_format_keys = value
|
154
|
+
end
|
155
|
+
|
156
|
+
# Same as instance method deep_format_keys! except sets the default.
|
157
|
+
def self.deep_format_keys(value = true)
|
158
|
+
@@deep_format_keys = value
|
159
|
+
end
|
160
|
+
|
134
161
|
# Turns the current element into an array and yields a builder to add a hash.
|
135
162
|
#
|
136
163
|
# Example:
|
@@ -190,10 +217,10 @@ class Jbuilder
|
|
190
217
|
elsif attributes.any?
|
191
218
|
_map_collection(collection) { |element| extract! element, *attributes }
|
192
219
|
else
|
193
|
-
collection.to_a
|
220
|
+
_format_keys(collection.to_a)
|
194
221
|
end
|
195
222
|
|
196
|
-
|
223
|
+
@attributes = _merge_values(@attributes, array)
|
197
224
|
end
|
198
225
|
|
199
226
|
# Extracts the mentioned attributes or hash elements from the passed object and turns them into attributes of the JSON.
|
@@ -244,7 +271,7 @@ class Jbuilder
|
|
244
271
|
# Merges hash, array, or Jbuilder instance into current builder.
|
245
272
|
def merge!(object)
|
246
273
|
hash_or_array = ::Jbuilder === object ? object.attributes! : object
|
247
|
-
@attributes = _merge_values(@attributes, hash_or_array)
|
274
|
+
@attributes = _merge_values(@attributes, _format_keys(hash_or_array))
|
248
275
|
end
|
249
276
|
|
250
277
|
# Encodes the current builder as JSON.
|
@@ -255,11 +282,11 @@ class Jbuilder
|
|
255
282
|
private
|
256
283
|
|
257
284
|
def _extract_hash_values(object, attributes)
|
258
|
-
attributes.each{ |key| _set_value key, object.fetch(key) }
|
285
|
+
attributes.each{ |key| _set_value key, _format_keys(object.fetch(key)) }
|
259
286
|
end
|
260
287
|
|
261
288
|
def _extract_method_values(object, attributes)
|
262
|
-
attributes.each{ |key| _set_value key, object.public_send(key) }
|
289
|
+
attributes.each{ |key| _set_value key, _format_keys(object.public_send(key)) }
|
263
290
|
end
|
264
291
|
|
265
292
|
def _merge_block(key)
|
@@ -273,11 +300,11 @@ class Jbuilder
|
|
273
300
|
if _blank?(updates)
|
274
301
|
current_value
|
275
302
|
elsif _blank?(current_value) || updates.nil? || current_value.empty? && ::Array === updates
|
276
|
-
|
303
|
+
updates
|
277
304
|
elsif ::Array === current_value && ::Array === updates
|
278
|
-
current_value +
|
305
|
+
current_value + updates
|
279
306
|
elsif ::Hash === current_value && ::Hash === updates
|
280
|
-
current_value.deep_merge(
|
307
|
+
current_value.deep_merge(updates)
|
281
308
|
else
|
282
309
|
raise MergeError.build(current_value, updates)
|
283
310
|
end
|
@@ -288,6 +315,8 @@ class Jbuilder
|
|
288
315
|
end
|
289
316
|
|
290
317
|
def _format_keys(hash_or_array)
|
318
|
+
return hash_or_array unless @deep_format_keys
|
319
|
+
|
291
320
|
if ::Array === hash_or_array
|
292
321
|
hash_or_array.map { |value| _format_keys(value) }
|
293
322
|
elsif ::Hash === hash_or_array
|
@@ -312,12 +341,12 @@ class Jbuilder
|
|
312
341
|
end
|
313
342
|
|
314
343
|
def _scope
|
315
|
-
parent_attributes, parent_formatter = @attributes, @key_formatter
|
344
|
+
parent_attributes, parent_formatter, parent_deep_format_keys = @attributes, @key_formatter, @deep_format_keys
|
316
345
|
@attributes = BLANK
|
317
346
|
yield
|
318
347
|
@attributes
|
319
348
|
ensure
|
320
|
-
@attributes, @key_formatter = parent_attributes, parent_formatter
|
349
|
+
@attributes, @key_formatter, @deep_format_keys = parent_attributes, parent_formatter, parent_deep_format_keys
|
321
350
|
end
|
322
351
|
|
323
352
|
def _is_collection?(object)
|
data/test/jbuilder_test.rb
CHANGED
@@ -566,6 +566,36 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
566
566
|
assert_equal 'one', result['level1']
|
567
567
|
end
|
568
568
|
|
569
|
+
test 'key_format! can be changed in child elements' do
|
570
|
+
result = jbuild do |json|
|
571
|
+
json.key_format! camelize: :lower
|
572
|
+
|
573
|
+
json.level_one do
|
574
|
+
json.key_format! :upcase
|
575
|
+
json.value 'two'
|
576
|
+
end
|
577
|
+
end
|
578
|
+
|
579
|
+
assert_equal ['levelOne'], result.keys
|
580
|
+
assert_equal ['VALUE'], result['levelOne'].keys
|
581
|
+
end
|
582
|
+
|
583
|
+
test 'key_format! can be changed in array!' do
|
584
|
+
result = jbuild do |json|
|
585
|
+
json.key_format! camelize: :lower
|
586
|
+
|
587
|
+
json.level_one do
|
588
|
+
json.array! [{value: 'two'}] do |object|
|
589
|
+
json.key_format! :upcase
|
590
|
+
json.value object[:value]
|
591
|
+
end
|
592
|
+
end
|
593
|
+
end
|
594
|
+
|
595
|
+
assert_equal ['levelOne'], result.keys
|
596
|
+
assert_equal ['VALUE'], result['levelOne'][0].keys
|
597
|
+
end
|
598
|
+
|
569
599
|
test 'key_format! with no parameter' do
|
570
600
|
result = jbuild do |json|
|
571
601
|
json.key_format! :upcase
|
@@ -593,51 +623,121 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
593
623
|
assert_equal ['oats and friends'], result.keys
|
594
624
|
end
|
595
625
|
|
596
|
-
test 'key_format!
|
626
|
+
test 'key_format! is not applied deeply by default' do
|
627
|
+
names = { first_name: 'camel', last_name: 'case' }
|
628
|
+
result = jbuild do |json|
|
629
|
+
json.key_format! camelize: :lower
|
630
|
+
json.set! :all_names, names
|
631
|
+
end
|
632
|
+
|
633
|
+
assert_equal %i[first_name last_name], result['allNames'].keys
|
634
|
+
end
|
635
|
+
|
636
|
+
test 'applying key_format! deeply can be enabled per scope' do
|
637
|
+
names = { first_name: 'camel', last_name: 'case' }
|
638
|
+
result = jbuild do |json|
|
639
|
+
json.key_format! camelize: :lower
|
640
|
+
json.scope do
|
641
|
+
json.deep_format_keys!
|
642
|
+
json.set! :all_names, names
|
643
|
+
end
|
644
|
+
json.set! :all_names, names
|
645
|
+
end
|
646
|
+
|
647
|
+
assert_equal %w[firstName lastName], result['scope']['allNames'].keys
|
648
|
+
assert_equal %i[first_name last_name], result['allNames'].keys
|
649
|
+
end
|
650
|
+
|
651
|
+
test 'applying key_format! deeply can be disabled per scope' do
|
652
|
+
names = { first_name: 'camel', last_name: 'case' }
|
653
|
+
result = jbuild do |json|
|
654
|
+
json.key_format! camelize: :lower
|
655
|
+
json.deep_format_keys!
|
656
|
+
json.set! :all_names, names
|
657
|
+
json.scope do
|
658
|
+
json.deep_format_keys! false
|
659
|
+
json.set! :all_names, names
|
660
|
+
end
|
661
|
+
end
|
662
|
+
|
663
|
+
assert_equal %w[firstName lastName], result['allNames'].keys
|
664
|
+
assert_equal %i[first_name last_name], result['scope']['allNames'].keys
|
665
|
+
end
|
666
|
+
|
667
|
+
test 'applying key_format! deeply can be enabled globally' do
|
668
|
+
names = { first_name: 'camel', last_name: 'case' }
|
669
|
+
|
670
|
+
Jbuilder.deep_format_keys true
|
671
|
+
result = jbuild do |json|
|
672
|
+
json.key_format! camelize: :lower
|
673
|
+
json.set! :all_names, names
|
674
|
+
end
|
675
|
+
|
676
|
+
assert_equal %w[firstName lastName], result['allNames'].keys
|
677
|
+
Jbuilder.send(:class_variable_set, '@@deep_format_keys', false)
|
678
|
+
end
|
679
|
+
|
680
|
+
test 'deep key_format! with merge!' do
|
597
681
|
hash = { camel_style: 'for JS' }
|
598
682
|
result = jbuild do |json|
|
599
683
|
json.key_format! camelize: :lower
|
684
|
+
json.deep_format_keys!
|
600
685
|
json.merge! hash
|
601
686
|
end
|
602
687
|
|
603
688
|
assert_equal ['camelStyle'], result.keys
|
604
689
|
end
|
605
690
|
|
606
|
-
test 'key_format! with merge! deep' do
|
691
|
+
test 'deep key_format! with merge! deep' do
|
607
692
|
hash = { camel_style: { sub_attr: 'for JS' } }
|
608
693
|
result = jbuild do |json|
|
609
694
|
json.key_format! camelize: :lower
|
695
|
+
json.deep_format_keys!
|
610
696
|
json.merge! hash
|
611
697
|
end
|
612
698
|
|
613
699
|
assert_equal ['subAttr'], result['camelStyle'].keys
|
614
700
|
end
|
615
701
|
|
616
|
-
test 'key_format! with set! array of hashes' do
|
702
|
+
test 'deep key_format! with set! array of hashes' do
|
617
703
|
names = [{ first_name: 'camel', last_name: 'case' }]
|
618
704
|
result = jbuild do |json|
|
619
705
|
json.key_format! camelize: :lower
|
706
|
+
json.deep_format_keys!
|
620
707
|
json.set! :names, names
|
621
708
|
end
|
622
709
|
|
623
710
|
assert_equal %w[firstName lastName], result['names'][0].keys
|
624
711
|
end
|
625
712
|
|
626
|
-
test 'key_format! with
|
713
|
+
test 'deep key_format! with set! extracting hash from object' do
|
714
|
+
comment = Struct.new(:author).new({ first_name: 'camel', last_name: 'case' })
|
715
|
+
result = jbuild do |json|
|
716
|
+
json.key_format! camelize: :lower
|
717
|
+
json.deep_format_keys!
|
718
|
+
json.set! :comment, comment, :author
|
719
|
+
end
|
720
|
+
|
721
|
+
assert_equal %w[firstName lastName], result['comment']['author'].keys
|
722
|
+
end
|
723
|
+
|
724
|
+
test 'deep key_format! with array! of hashes' do
|
627
725
|
names = [{ first_name: 'camel', last_name: 'case' }]
|
628
726
|
result = jbuild do |json|
|
629
727
|
json.key_format! camelize: :lower
|
728
|
+
json.deep_format_keys!
|
630
729
|
json.array! names
|
631
730
|
end
|
632
731
|
|
633
732
|
assert_equal %w[firstName lastName], result[0].keys
|
634
733
|
end
|
635
734
|
|
636
|
-
test 'key_format! with merge! array of hashes' do
|
735
|
+
test 'deep key_format! with merge! array of hashes' do
|
637
736
|
names = [{ first_name: 'camel', last_name: 'case' }]
|
638
737
|
new_names = [{ first_name: 'snake', last_name: 'case' }]
|
639
738
|
result = jbuild do |json|
|
640
739
|
json.key_format! camelize: :lower
|
740
|
+
json.deep_format_keys!
|
641
741
|
json.array! names
|
642
742
|
json.merge! new_names
|
643
743
|
end
|
@@ -645,6 +745,39 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
645
745
|
assert_equal %w[firstName lastName], result[1].keys
|
646
746
|
end
|
647
747
|
|
748
|
+
test 'deep key_format! is applied to hash extracted from object' do
|
749
|
+
comment = Struct.new(:author).new({ first_name: 'camel', last_name: 'case' })
|
750
|
+
result = jbuild do |json|
|
751
|
+
json.key_format! camelize: :lower
|
752
|
+
json.deep_format_keys!
|
753
|
+
json.extract! comment, :author
|
754
|
+
end
|
755
|
+
|
756
|
+
assert_equal %w[firstName lastName], result['author'].keys
|
757
|
+
end
|
758
|
+
|
759
|
+
test 'deep key_format! is applied to hash extracted from hash' do
|
760
|
+
comment = {author: { first_name: 'camel', last_name: 'case' }}
|
761
|
+
result = jbuild do |json|
|
762
|
+
json.key_format! camelize: :lower
|
763
|
+
json.deep_format_keys!
|
764
|
+
json.extract! comment, :author
|
765
|
+
end
|
766
|
+
|
767
|
+
assert_equal %w[firstName lastName], result['author'].keys
|
768
|
+
end
|
769
|
+
|
770
|
+
test 'deep key_format! is applied to hash extracted directly from array' do
|
771
|
+
comments = [Struct.new(:author).new({ first_name: 'camel', last_name: 'case' })]
|
772
|
+
result = jbuild do |json|
|
773
|
+
json.key_format! camelize: :lower
|
774
|
+
json.deep_format_keys!
|
775
|
+
json.array! comments, :author
|
776
|
+
end
|
777
|
+
|
778
|
+
assert_equal %w[firstName lastName], result[0]['author'].keys
|
779
|
+
end
|
780
|
+
|
648
781
|
test 'default key_format!' do
|
649
782
|
Jbuilder.key_format camelize: :lower
|
650
783
|
result = jbuild{ |json| json.camel_style 'for JS' }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jbuilder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.11.
|
4
|
+
version: 2.11.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01-
|
11
|
+
date: 2021-01-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|