jbuilder 2.6.0 → 2.11.5
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 +5 -5
- data/.github/workflows/ruby.yml +108 -0
- data/.gitignore +2 -0
- data/Appraisals +16 -35
- data/CONTRIBUTING.md +9 -10
- data/Gemfile +0 -1
- data/MIT-LICENSE +1 -1
- data/README.md +100 -20
- data/Rakefile +2 -6
- data/gemfiles/rails_5_0.gemfile +3 -6
- data/gemfiles/rails_5_1.gemfile +10 -0
- data/gemfiles/rails_5_2.gemfile +10 -0
- data/gemfiles/rails_6_0.gemfile +10 -0
- data/gemfiles/rails_6_1.gemfile +10 -0
- data/gemfiles/rails_head.gemfile +10 -0
- data/jbuilder.gemspec +20 -6
- data/lib/generators/rails/jbuilder_generator.rb +12 -2
- data/lib/generators/rails/scaffold_controller_generator.rb +7 -1
- data/lib/generators/rails/templates/api_controller.rb +4 -4
- data/lib/generators/rails/templates/controller.rb +15 -19
- data/lib/generators/rails/templates/index.json.jbuilder +1 -1
- data/lib/generators/rails/templates/partial.json.jbuilder +16 -2
- data/lib/generators/rails/templates/show.json.jbuilder +1 -1
- data/lib/jbuilder/collection_renderer.rb +109 -0
- data/lib/jbuilder/errors.rb +7 -0
- data/lib/jbuilder/jbuilder_template.rb +90 -16
- data/lib/jbuilder/key_formatter.rb +2 -2
- data/lib/jbuilder/railtie.rb +1 -1
- data/lib/jbuilder.rb +70 -28
- data/test/jbuilder_dependency_tracker_test.rb +2 -2
- data/test/jbuilder_generator_test.rb +27 -7
- data/test/jbuilder_template_test.rb +281 -295
- data/test/jbuilder_test.rb +256 -4
- data/test/scaffold_api_controller_generator_test.rb +29 -14
- data/test/scaffold_controller_generator_test.rb +54 -21
- data/test/test_helper.rb +30 -8
- metadata +25 -31
- data/.travis.yml +0 -44
- data/CHANGELOG.md +0 -229
- data/gemfiles/rails_3_0.gemfile +0 -14
- data/gemfiles/rails_3_1.gemfile +0 -14
- data/gemfiles/rails_3_2.gemfile +0 -14
- data/gemfiles/rails_4_0.gemfile +0 -13
- data/gemfiles/rails_4_1.gemfile +0 -13
- data/gemfiles/rails_4_2.gemfile +0 -13
data/test/jbuilder_test.rb
CHANGED
@@ -49,7 +49,7 @@ end
|
|
49
49
|
|
50
50
|
|
51
51
|
class JbuilderTest < ActiveSupport::TestCase
|
52
|
-
|
52
|
+
teardown do
|
53
53
|
Jbuilder.send :class_variable_set, '@@key_formatter', nil
|
54
54
|
end
|
55
55
|
|
@@ -75,7 +75,7 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
75
75
|
end
|
76
76
|
|
77
77
|
assert result.has_key?('content')
|
78
|
-
|
78
|
+
assert_nil result['content']
|
79
79
|
end
|
80
80
|
|
81
81
|
test 'multiple keys' do
|
@@ -99,7 +99,7 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
99
99
|
assert_equal 32, result['age']
|
100
100
|
end
|
101
101
|
|
102
|
-
test 'extracting from object using call style
|
102
|
+
test 'extracting from object using call style' do
|
103
103
|
person = Struct.new(:name, :age).new('David', 32)
|
104
104
|
|
105
105
|
result = jbuild do |json|
|
@@ -159,6 +159,25 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
159
159
|
assert_equal 32, result['author']['age']
|
160
160
|
end
|
161
161
|
|
162
|
+
test 'nested blocks are additive' do
|
163
|
+
result = jbuild do |json|
|
164
|
+
json.author do
|
165
|
+
json.name do
|
166
|
+
json.first 'David'
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
json.author do
|
171
|
+
json.name do
|
172
|
+
json.last 'Heinemeier Hansson'
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
assert_equal 'David', result['author']['name']['first']
|
178
|
+
assert_equal 'Heinemeier Hansson', result['author']['name']['last']
|
179
|
+
end
|
180
|
+
|
162
181
|
test 'support merge! method' do
|
163
182
|
result = jbuild do |json|
|
164
183
|
json.merge! 'foo' => 'bar'
|
@@ -177,6 +196,18 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
177
196
|
assert_equal 'Pavel', result['author']['name']
|
178
197
|
end
|
179
198
|
|
199
|
+
test 'support merge! method with Jbuilder instance' do
|
200
|
+
obj = jbuild do |json|
|
201
|
+
json.foo 'bar'
|
202
|
+
end
|
203
|
+
|
204
|
+
result = jbuild do |json|
|
205
|
+
json.merge! obj
|
206
|
+
end
|
207
|
+
|
208
|
+
assert_equal 'bar', result['foo']
|
209
|
+
end
|
210
|
+
|
180
211
|
test 'blocks are additive via extract syntax' do
|
181
212
|
person = Person.new('Pavel', 27)
|
182
213
|
|
@@ -281,7 +312,7 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
281
312
|
assert_equal 'world', result['comments'].second['content']
|
282
313
|
end
|
283
314
|
|
284
|
-
test 'nesting multiple
|
315
|
+
test 'nesting multiple children from a non-Enumerable that responds to #map with inline loop' do
|
285
316
|
comments = NonEnumerable.new([ Comment.new('hello', 1), Comment.new('world', 2) ])
|
286
317
|
|
287
318
|
result = jbuild do |json|
|
@@ -535,6 +566,36 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
535
566
|
assert_equal 'one', result['level1']
|
536
567
|
end
|
537
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
|
+
|
538
599
|
test 'key_format! with no parameter' do
|
539
600
|
result = jbuild do |json|
|
540
601
|
json.key_format! :upcase
|
@@ -562,6 +623,161 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
562
623
|
assert_equal ['oats and friends'], result.keys
|
563
624
|
end
|
564
625
|
|
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
|
681
|
+
hash = { camel_style: 'for JS' }
|
682
|
+
result = jbuild do |json|
|
683
|
+
json.key_format! camelize: :lower
|
684
|
+
json.deep_format_keys!
|
685
|
+
json.merge! hash
|
686
|
+
end
|
687
|
+
|
688
|
+
assert_equal ['camelStyle'], result.keys
|
689
|
+
end
|
690
|
+
|
691
|
+
test 'deep key_format! with merge! deep' do
|
692
|
+
hash = { camel_style: { sub_attr: 'for JS' } }
|
693
|
+
result = jbuild do |json|
|
694
|
+
json.key_format! camelize: :lower
|
695
|
+
json.deep_format_keys!
|
696
|
+
json.merge! hash
|
697
|
+
end
|
698
|
+
|
699
|
+
assert_equal ['subAttr'], result['camelStyle'].keys
|
700
|
+
end
|
701
|
+
|
702
|
+
test 'deep key_format! with set! array of hashes' do
|
703
|
+
names = [{ first_name: 'camel', last_name: 'case' }]
|
704
|
+
result = jbuild do |json|
|
705
|
+
json.key_format! camelize: :lower
|
706
|
+
json.deep_format_keys!
|
707
|
+
json.set! :names, names
|
708
|
+
end
|
709
|
+
|
710
|
+
assert_equal %w[firstName lastName], result['names'][0].keys
|
711
|
+
end
|
712
|
+
|
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
|
725
|
+
names = [{ first_name: 'camel', last_name: 'case' }]
|
726
|
+
result = jbuild do |json|
|
727
|
+
json.key_format! camelize: :lower
|
728
|
+
json.deep_format_keys!
|
729
|
+
json.array! names
|
730
|
+
end
|
731
|
+
|
732
|
+
assert_equal %w[firstName lastName], result[0].keys
|
733
|
+
end
|
734
|
+
|
735
|
+
test 'deep key_format! with merge! array of hashes' do
|
736
|
+
names = [{ first_name: 'camel', last_name: 'case' }]
|
737
|
+
new_names = [{ first_name: 'snake', last_name: 'case' }]
|
738
|
+
result = jbuild do |json|
|
739
|
+
json.key_format! camelize: :lower
|
740
|
+
json.deep_format_keys!
|
741
|
+
json.array! names
|
742
|
+
json.merge! new_names
|
743
|
+
end
|
744
|
+
|
745
|
+
assert_equal %w[firstName lastName], result[1].keys
|
746
|
+
end
|
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
|
+
|
565
781
|
test 'default key_format!' do
|
566
782
|
Jbuilder.key_format camelize: :lower
|
567
783
|
result = jbuild{ |json| json.camel_style 'for JS' }
|
@@ -686,4 +902,40 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
686
902
|
end
|
687
903
|
end
|
688
904
|
end
|
905
|
+
|
906
|
+
test "throws MergeError when trying to merge array with non-empty hash" do
|
907
|
+
assert_raise Jbuilder::MergeError do
|
908
|
+
jbuild do |json|
|
909
|
+
json.name "Daniel"
|
910
|
+
json.merge! []
|
911
|
+
end
|
912
|
+
end
|
913
|
+
end
|
914
|
+
|
915
|
+
test "throws MergeError when trying to merge hash with array" do
|
916
|
+
assert_raise Jbuilder::MergeError do
|
917
|
+
jbuild do |json|
|
918
|
+
json.array!
|
919
|
+
json.merge!({})
|
920
|
+
end
|
921
|
+
end
|
922
|
+
end
|
923
|
+
|
924
|
+
test "throws MergeError when trying to merge invalid objects" do
|
925
|
+
assert_raise Jbuilder::MergeError do
|
926
|
+
jbuild do |json|
|
927
|
+
json.name "Daniel"
|
928
|
+
json.merge! "Nope"
|
929
|
+
end
|
930
|
+
end
|
931
|
+
end
|
932
|
+
|
933
|
+
if RUBY_VERSION >= "2.2.10"
|
934
|
+
test "respects JSON encoding customizations" do
|
935
|
+
# Active Support overrides Time#as_json for custom formatting.
|
936
|
+
# Ensure we call #to_json on the final attributes instead of JSON.dump.
|
937
|
+
result = JSON.load(Jbuilder.encode { |json| json.time Time.parse("2018-05-13 11:51:00.485 -0400") })
|
938
|
+
assert_equal "2018-05-13T11:51:00.485-04:00", result["time"]
|
939
|
+
end
|
940
|
+
end
|
689
941
|
end
|
@@ -6,7 +6,7 @@ if Rails::VERSION::MAJOR > 4
|
|
6
6
|
|
7
7
|
class ScaffoldApiControllerGeneratorTest < Rails::Generators::TestCase
|
8
8
|
tests Rails::Generators::ScaffoldControllerGenerator
|
9
|
-
arguments %w(Post title body:text --api)
|
9
|
+
arguments %w(Post title body:text images:attachments --api)
|
10
10
|
destination File.expand_path('../tmp', __FILE__)
|
11
11
|
setup :prepare_destination
|
12
12
|
|
@@ -15,7 +15,7 @@ if Rails::VERSION::MAJOR > 4
|
|
15
15
|
|
16
16
|
assert_file 'app/controllers/posts_controller.rb' do |content|
|
17
17
|
assert_instance_method :index, content do |m|
|
18
|
-
assert_match
|
18
|
+
assert_match %r{@posts = Post\.all}, m
|
19
19
|
end
|
20
20
|
|
21
21
|
assert_instance_method :show, content do |m|
|
@@ -23,32 +23,47 @@ if Rails::VERSION::MAJOR > 4
|
|
23
23
|
end
|
24
24
|
|
25
25
|
assert_instance_method :create, content do |m|
|
26
|
-
assert_match
|
27
|
-
assert_match
|
28
|
-
assert_match
|
29
|
-
assert_match
|
26
|
+
assert_match %r{@post = Post\.new\(post_params\)}, m
|
27
|
+
assert_match %r{@post\.save}, m
|
28
|
+
assert_match %r{render :show, status: :created, location: @post}, m
|
29
|
+
assert_match %r{render json: @post\.errors, status: :unprocessable_entity}, m
|
30
30
|
end
|
31
31
|
|
32
32
|
assert_instance_method :update, content do |m|
|
33
|
-
assert_match
|
34
|
-
assert_match
|
33
|
+
assert_match %r{render :show, status: :ok, location: @post}, m
|
34
|
+
assert_match %r{render json: @post.errors, status: :unprocessable_entity}, m
|
35
35
|
end
|
36
36
|
|
37
37
|
assert_instance_method :destroy, content do |m|
|
38
|
-
assert_match
|
38
|
+
assert_match %r{@post\.destroy}, m
|
39
39
|
end
|
40
40
|
|
41
|
-
assert_match
|
42
|
-
|
41
|
+
assert_match %r{def post_params}, content
|
42
|
+
if Rails::VERSION::MAJOR >= 6
|
43
|
+
assert_match %r{params\.require\(:post\)\.permit\(:title, :body, images: \[\]\)}, content
|
44
|
+
else
|
45
|
+
assert_match %r{params\.require\(:post\)\.permit\(:title, :body, :images\)}, content
|
46
|
+
end
|
43
47
|
end
|
44
48
|
end
|
45
49
|
|
46
|
-
test '
|
50
|
+
test "don't use require and permit if there are no attributes" do
|
47
51
|
run_generator %w(Post --api)
|
48
52
|
|
49
53
|
assert_file 'app/controllers/posts_controller.rb' do |content|
|
50
|
-
assert_match
|
51
|
-
assert_match
|
54
|
+
assert_match %r{def post_params}, content
|
55
|
+
assert_match %r{params\.fetch\(:post, \{\}\)}, content
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
if Rails::VERSION::MAJOR >= 6
|
61
|
+
test 'handles virtual attributes' do
|
62
|
+
run_generator ["Message", "content:rich_text", "video:attachment", "photos:attachments"]
|
63
|
+
|
64
|
+
assert_file 'app/controllers/messages_controller.rb' do |content|
|
65
|
+
assert_match %r{params\.require\(:message\)\.permit\(:content, :video, photos: \[\]\)}, content
|
66
|
+
end
|
52
67
|
end
|
53
68
|
end
|
54
69
|
end
|
@@ -4,7 +4,7 @@ require 'generators/rails/scaffold_controller_generator'
|
|
4
4
|
|
5
5
|
class ScaffoldControllerGeneratorTest < Rails::Generators::TestCase
|
6
6
|
tests Rails::Generators::ScaffoldControllerGenerator
|
7
|
-
arguments %w(Post title body:text)
|
7
|
+
arguments %w(Post title body:text images:attachments)
|
8
8
|
destination File.expand_path('../tmp', __FILE__)
|
9
9
|
setup :prepare_destination
|
10
10
|
|
@@ -13,7 +13,7 @@ class ScaffoldControllerGeneratorTest < Rails::Generators::TestCase
|
|
13
13
|
|
14
14
|
assert_file 'app/controllers/posts_controller.rb' do |content|
|
15
15
|
assert_instance_method :index, content do |m|
|
16
|
-
assert_match
|
16
|
+
assert_match %r{@posts = Post\.all}, m
|
17
17
|
end
|
18
18
|
|
19
19
|
assert_instance_method :show, content do |m|
|
@@ -21,7 +21,7 @@ class ScaffoldControllerGeneratorTest < Rails::Generators::TestCase
|
|
21
21
|
end
|
22
22
|
|
23
23
|
assert_instance_method :new, content do |m|
|
24
|
-
assert_match
|
24
|
+
assert_match %r{@post = Post\.new}, m
|
25
25
|
end
|
26
26
|
|
27
27
|
assert_instance_method :edit, content do |m|
|
@@ -29,38 +29,71 @@ class ScaffoldControllerGeneratorTest < Rails::Generators::TestCase
|
|
29
29
|
end
|
30
30
|
|
31
31
|
assert_instance_method :create, content do |m|
|
32
|
-
assert_match
|
33
|
-
assert_match
|
34
|
-
assert_match
|
35
|
-
assert_match
|
36
|
-
assert_match
|
37
|
-
assert_match
|
32
|
+
assert_match %r{@post = Post\.new\(post_params\)}, m
|
33
|
+
assert_match %r{@post\.save}, m
|
34
|
+
assert_match %r{format\.html \{ redirect_to post_url\(@post\), notice: "Post was successfully created\." \}}, m
|
35
|
+
assert_match %r{format\.json \{ render :show, status: :created, location: @post \}}, m
|
36
|
+
assert_match %r{format\.html \{ render :new, status: :unprocessable_entity \}}, m
|
37
|
+
assert_match %r{format\.json \{ render json: @post\.errors, status: :unprocessable_entity \}}, m
|
38
38
|
end
|
39
39
|
|
40
40
|
assert_instance_method :update, content do |m|
|
41
|
-
assert_match
|
42
|
-
assert_match
|
43
|
-
assert_match
|
44
|
-
assert_match
|
41
|
+
assert_match %r{format\.html \{ redirect_to post_url\(@post\), notice: "Post was successfully updated\." \}}, m
|
42
|
+
assert_match %r{format\.json \{ render :show, status: :ok, location: @post \}}, m
|
43
|
+
assert_match %r{format\.html \{ render :edit, status: :unprocessable_entity \}}, m
|
44
|
+
assert_match %r{format\.json \{ render json: @post.errors, status: :unprocessable_entity \}}, m
|
45
45
|
end
|
46
46
|
|
47
47
|
assert_instance_method :destroy, content do |m|
|
48
|
-
assert_match
|
49
|
-
assert_match
|
50
|
-
assert_match
|
48
|
+
assert_match %r{@post\.destroy}, m
|
49
|
+
assert_match %r{format\.html \{ redirect_to posts_url, notice: "Post was successfully destroyed\." \}}, m
|
50
|
+
assert_match %r{format\.json \{ head :no_content \}}, m
|
51
51
|
end
|
52
52
|
|
53
|
-
assert_match
|
54
|
-
|
53
|
+
assert_match %r{def post_params}, content
|
54
|
+
if Rails::VERSION::MAJOR >= 6
|
55
|
+
assert_match %r{params\.require\(:post\)\.permit\(:title, :body, images: \[\]\)}, content
|
56
|
+
else
|
57
|
+
assert_match %r{params\.require\(:post\)\.permit\(:title, :body, :images\)}, content
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
if Rails::VERSION::MAJOR >= 6
|
63
|
+
test 'controller with namespace' do
|
64
|
+
run_generator %w(Admin::Post --model-name=Post)
|
65
|
+
assert_file 'app/controllers/admin/posts_controller.rb' do |content|
|
66
|
+
assert_instance_method :create, content do |m|
|
67
|
+
assert_match %r{format\.html \{ redirect_to admin_post_url\(@post\), notice: "Post was successfully created\." \}}, m
|
68
|
+
end
|
69
|
+
|
70
|
+
assert_instance_method :update, content do |m|
|
71
|
+
assert_match %r{format\.html \{ redirect_to admin_post_url\(@post\), notice: "Post was successfully updated\." \}}, m
|
72
|
+
end
|
73
|
+
|
74
|
+
assert_instance_method :destroy, content do |m|
|
75
|
+
assert_match %r{format\.html \{ redirect_to admin_posts_url, notice: "Post was successfully destroyed\." \}}, m
|
76
|
+
end
|
77
|
+
end
|
55
78
|
end
|
56
79
|
end
|
57
80
|
|
58
|
-
test '
|
81
|
+
test "don't use require and permit if there are no attributes" do
|
59
82
|
run_generator %w(Post)
|
60
83
|
|
61
84
|
assert_file 'app/controllers/posts_controller.rb' do |content|
|
62
|
-
assert_match
|
63
|
-
assert_match
|
85
|
+
assert_match %r{def post_params}, content
|
86
|
+
assert_match %r{params\.fetch\(:post, \{\}\)}, content
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
if Rails::VERSION::MAJOR >= 6
|
91
|
+
test 'handles virtual attributes' do
|
92
|
+
run_generator %w(Message content:rich_text video:attachment photos:attachments)
|
93
|
+
|
94
|
+
assert_file 'app/controllers/messages_controller.rb' do |content|
|
95
|
+
assert_match %r{params\.require\(:message\)\.permit\(:content, :video, photos: \[\]\)}, content
|
96
|
+
end
|
64
97
|
end
|
65
98
|
end
|
66
99
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,14 +1,36 @@
|
|
1
1
|
require "bundler/setup"
|
2
|
-
require "active_support"
|
3
|
-
require "rails/version"
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
require "rails"
|
4
|
+
|
5
|
+
require "jbuilder"
|
6
|
+
|
7
|
+
require "active_support/core_ext/array/access"
|
8
|
+
require "active_support/cache/memory_store"
|
9
|
+
require "active_support/json"
|
10
|
+
require "active_model"
|
11
|
+
|
12
|
+
require "active_support/testing/autorun"
|
13
|
+
require "mocha/minitest"
|
14
|
+
|
15
|
+
ActiveSupport.test_order = :random
|
16
|
+
|
17
|
+
class << Rails
|
18
|
+
def cache
|
19
|
+
@cache ||= ActiveSupport::Cache::MemoryStore.new
|
20
|
+
end
|
9
21
|
end
|
10
22
|
|
23
|
+
Jbuilder::CollectionRenderer.collection_cache = Rails.cache
|
24
|
+
|
25
|
+
class Post < Struct.new(:id, :body, :author_name)
|
26
|
+
def cache_key
|
27
|
+
"post-#{id}"
|
28
|
+
end
|
29
|
+
end
|
11
30
|
|
12
|
-
|
13
|
-
|
31
|
+
class Racer < Struct.new(:id, :name)
|
32
|
+
extend ActiveModel::Naming
|
33
|
+
include ActiveModel::Conversion
|
14
34
|
end
|
35
|
+
|
36
|
+
ActionView::Template.register_template_handler :jbuilder, JbuilderHandler
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jbuilder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.11.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
|
-
- Pavel Pravosud
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2021-12-21 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activesupport
|
@@ -17,58 +16,48 @@ dependencies:
|
|
17
16
|
requirements:
|
18
17
|
- - ">="
|
19
18
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
21
|
-
- - "<"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: '5.1'
|
19
|
+
version: 5.0.0
|
24
20
|
type: :runtime
|
25
21
|
prerelease: false
|
26
22
|
version_requirements: !ruby/object:Gem::Requirement
|
27
23
|
requirements:
|
28
24
|
- - ">="
|
29
25
|
- !ruby/object:Gem::Version
|
30
|
-
version:
|
31
|
-
- - "<"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '5.1'
|
26
|
+
version: 5.0.0
|
34
27
|
- !ruby/object:Gem::Dependency
|
35
|
-
name:
|
28
|
+
name: actionview
|
36
29
|
requirement: !ruby/object:Gem::Requirement
|
37
30
|
requirements:
|
38
|
-
- - "
|
31
|
+
- - ">="
|
39
32
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
33
|
+
version: 5.0.0
|
41
34
|
type: :runtime
|
42
35
|
prerelease: false
|
43
36
|
version_requirements: !ruby/object:Gem::Requirement
|
44
37
|
requirements:
|
45
|
-
- - "
|
38
|
+
- - ">="
|
46
39
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
40
|
+
version: 5.0.0
|
48
41
|
description:
|
49
|
-
email:
|
50
|
-
- david@37signals.com
|
51
|
-
- pavel@pravosud.com
|
42
|
+
email: david@basecamp.com
|
52
43
|
executables: []
|
53
44
|
extensions: []
|
54
45
|
extra_rdoc_files: []
|
55
46
|
files:
|
47
|
+
- ".github/workflows/ruby.yml"
|
56
48
|
- ".gitignore"
|
57
|
-
- ".travis.yml"
|
58
49
|
- Appraisals
|
59
|
-
- CHANGELOG.md
|
60
50
|
- CONTRIBUTING.md
|
61
51
|
- Gemfile
|
62
52
|
- MIT-LICENSE
|
63
53
|
- README.md
|
64
54
|
- Rakefile
|
65
|
-
- gemfiles/rails_3_0.gemfile
|
66
|
-
- gemfiles/rails_3_1.gemfile
|
67
|
-
- gemfiles/rails_3_2.gemfile
|
68
|
-
- gemfiles/rails_4_0.gemfile
|
69
|
-
- gemfiles/rails_4_1.gemfile
|
70
|
-
- gemfiles/rails_4_2.gemfile
|
71
55
|
- gemfiles/rails_5_0.gemfile
|
56
|
+
- gemfiles/rails_5_1.gemfile
|
57
|
+
- gemfiles/rails_5_2.gemfile
|
58
|
+
- gemfiles/rails_6_0.gemfile
|
59
|
+
- gemfiles/rails_6_1.gemfile
|
60
|
+
- gemfiles/rails_head.gemfile
|
72
61
|
- jbuilder.gemspec
|
73
62
|
- lib/generators/rails/jbuilder_generator.rb
|
74
63
|
- lib/generators/rails/scaffold_controller_generator.rb
|
@@ -79,6 +68,7 @@ files:
|
|
79
68
|
- lib/generators/rails/templates/show.json.jbuilder
|
80
69
|
- lib/jbuilder.rb
|
81
70
|
- lib/jbuilder/blank.rb
|
71
|
+
- lib/jbuilder/collection_renderer.rb
|
82
72
|
- lib/jbuilder/dependency_tracker.rb
|
83
73
|
- lib/jbuilder/errors.rb
|
84
74
|
- lib/jbuilder/jbuilder.rb
|
@@ -95,7 +85,12 @@ files:
|
|
95
85
|
homepage: https://github.com/rails/jbuilder
|
96
86
|
licenses:
|
97
87
|
- MIT
|
98
|
-
metadata:
|
88
|
+
metadata:
|
89
|
+
bug_tracker_uri: https://github.com/rails/jbuilder/issues
|
90
|
+
changelog_uri: https://github.com/rails/jbuilder/releases/tag/v2.11.5
|
91
|
+
mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
|
92
|
+
source_code_uri: https://github.com/rails/jbuilder/tree/v2.11.5
|
93
|
+
rubygems_mfa_required: 'true'
|
99
94
|
post_install_message:
|
100
95
|
rdoc_options: []
|
101
96
|
require_paths:
|
@@ -104,15 +99,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
104
99
|
requirements:
|
105
100
|
- - ">="
|
106
101
|
- !ruby/object:Gem::Version
|
107
|
-
version:
|
102
|
+
version: 2.2.2
|
108
103
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
104
|
requirements:
|
110
105
|
- - ">="
|
111
106
|
- !ruby/object:Gem::Version
|
112
107
|
version: '0'
|
113
108
|
requirements: []
|
114
|
-
|
115
|
-
rubygems_version: 2.6.4
|
109
|
+
rubygems_version: 3.2.32
|
116
110
|
signing_key:
|
117
111
|
specification_version: 4
|
118
112
|
summary: Create JSON structures via a Builder-style DSL
|