breezy_template 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,6 @@
1
- module BreezyTemplate
1
+ require 'breezy_template/breezy_template'
2
+
3
+ class BreezyTemplate
2
4
  module SearchExtension
3
5
  def found!
4
6
  found = @found
@@ -67,7 +69,6 @@ module BreezyTemplate
67
69
  def set!(key, value = BLANK, *args)
68
70
  return if @found
69
71
  options = args.first || {}
70
- options = _normalize_options(options)
71
72
 
72
73
  if @search_path && !@search_path.empty?
73
74
  if key.to_s == @search_path.first
@@ -80,7 +81,6 @@ module BreezyTemplate
80
81
  yield self
81
82
  elsif _partial_options?(options)
82
83
  without_track = args.dup
83
- # without_track.first.delete(:track)
84
84
  super(key, value, *without_track)
85
85
  else
86
86
  ::Kernel.raise 'This should not happen'
@@ -1,66 +1,82 @@
1
1
  # # taken from jbuilder's jbuilder_dependency_tracker_test.rb
2
2
  #
3
- # require 'test_helper'
4
- # require 'breezy_template/dependency_tracker'
5
- # require 'mocha'
6
- #
7
- # class FakeTemplate
8
- # attr_reader :source, :handler
9
- # def initialize(source, handler = :jbuilder)
10
- # @source, @handler = source, handler
11
- # end
12
- # end
13
- #
14
- #
15
- # class BreezyTemplateDependencyTrackerTest < ActiveSupport::TestCase
16
- # def make_tracker(name, source)
17
- # template = FakeTemplate.new(source)
18
- # BreezyTemplate::DependencyTracker.new(name, template)
19
- # end
20
- #
21
- # def track_dependencies(source)
22
- # make_tracker('breezy_template', source).dependencies
23
- # end
24
- #
25
- # test 'jbuilder direct partial! feature are not allowed' do
26
- # dependencies = track_dependencies <<-RUBY
27
- # json.partial! 'path/to/partial', foo: bar
28
- # json.partial! 'path/to/another/partial', :fizz => buzz
29
- # RUBY
30
- #
31
- # assert_equal [], dependencies
32
- # end
33
- #
34
- # test 'detects partial with options (1.9 style)' do
35
- # dependencies = track_dependencies <<-RUBY
36
- # json.content hello: 'world', partial: 'path/to/partial', foo: :bar
37
- # RUBY
38
- #
39
- # assert_equal %w[path/to/partial], dependencies
40
- # end
41
- #
42
- # test 'detects partial with options (1.8 style)' do
43
- # dependencies = track_dependencies <<-RUBY
44
- # json.content :hello => 'world', :partial => 'path/to/partial', :foo => :bar
45
- # RUBY
46
- #
47
- # assert_equal %w[path/to/partial], dependencies
48
- # end
49
- #
50
- # test 'detects partial in indirect collecton calls' do
51
- # dependencies = track_dependencies <<-RUBY
52
- # json.comments @post.comments, partial: 'comments/comment', as: :comment
53
- # RUBY
54
- #
55
- # assert_equal %w[comments/comment], dependencies
56
- # end
57
- #
58
- # test 'detects explicit depedency' do
59
- # dependencies = track_dependencies <<-RUBY
60
- # # Template Dependency: path/to/partial
61
- # json.foo 'bar'
62
- # RUBY
63
- #
64
- # assert_equal %w[path/to/partial], dependencies
65
- # end
66
- # end
3
+ require 'test_helper'
4
+ require 'breezy_template/dependency_tracker'
5
+ require 'mocha'
6
+
7
+ class FakeTemplate
8
+ attr_reader :source, :handler
9
+ def initialize(source, handler = :jbuilder)
10
+ @source, @handler = source, handler
11
+ end
12
+ end
13
+
14
+
15
+ class BreezyTemplateDependencyTrackerTest < ActiveSupport::TestCase
16
+ def make_tracker(name, source)
17
+ template = FakeTemplate.new(source)
18
+ BreezyTemplate::DependencyTracker.new(name, template)
19
+ end
20
+
21
+ def track_dependencies(source)
22
+ make_tracker('breezy_template', source).dependencies
23
+ end
24
+
25
+ test 'jbuilder direct partial! feature are not allowed' do
26
+ dependencies = track_dependencies <<-RUBY
27
+ json.partial! 'path/to/partial', foo: bar
28
+ json.partial! 'path/to/another/partial', :fizz => buzz
29
+ RUBY
30
+
31
+ assert_equal [], dependencies
32
+ end
33
+
34
+ test 'detects partial with no options (1.9 style)' do
35
+ dependencies = track_dependencies <<-RUBY
36
+ json.content hello: 'world', partial: 'path/to/partial'
37
+ RUBY
38
+
39
+ assert_equal %w[path/to/partial], dependencies
40
+ end
41
+
42
+ test 'detects partial with no options (1.8 style)' do
43
+ dependencies = track_dependencies <<-RUBY
44
+ json.content :hello => 'world', :partial => 'path/to/partial'
45
+ RUBY
46
+
47
+ assert_equal %w[path/to/partial], dependencies
48
+ end
49
+
50
+ test 'detects partial with options (1.9 style)' do
51
+ dependencies = track_dependencies <<-RUBY
52
+ json.content hello: 'world', partial: ['path/to/partial', foo: :bar]
53
+ RUBY
54
+
55
+ assert_equal %w[path/to/partial], dependencies
56
+ end
57
+
58
+ test 'detects partial with options (1.8 style)' do
59
+ dependencies = track_dependencies <<-RUBY
60
+ json.content :hello => 'world', :partial => ['path/to/partial', :foo => :bar]
61
+ RUBY
62
+
63
+ assert_equal %w[path/to/partial], dependencies
64
+ end
65
+
66
+ test 'detects partial in indirect collecton calls' do
67
+ dependencies = track_dependencies <<-RUBY
68
+ json.comments @post.comments, partial: ['comments/comment', as: :comment]
69
+ RUBY
70
+
71
+ assert_equal %w[comments/comment], dependencies
72
+ end
73
+
74
+ test 'detects explicit depedency' do
75
+ dependencies = track_dependencies <<-RUBY
76
+ # Template Dependency: path/to/partial
77
+ json.foo 'bar'
78
+ RUBY
79
+
80
+ assert_equal %w[path/to/partial], dependencies
81
+ end
82
+ end
@@ -297,7 +297,7 @@ class BreezyTemplateTest < ActionView::TestCase
297
297
  Rails.cache.clear
298
298
 
299
299
  result = jbuild(<<-JBUILDER)
300
- json.post @post, partial: "blog_post", as: :blog_post, joint: :header
300
+ json.post @post, partial: ["blog_post", as: :blog_post, joint: :header]
301
301
  JBUILDER
302
302
 
303
303
  expected = strip_format(<<-JS)
@@ -317,6 +317,58 @@ class BreezyTemplateTest < ActionView::TestCase
317
317
  assert_equal expected, result
318
318
  end
319
319
 
320
+ test "renders a partial with implicit joint" do
321
+ result = jbuild(<<-JBUILDER)
322
+ json.footer nil, partial: ["footer", joint: true]
323
+ JBUILDER
324
+
325
+ expected = strip_format(<<-JS)
326
+ (function(){
327
+ var joints={};
328
+ var cache={};
329
+ var defers=[];
330
+ joints['footer'] ||= []; joints['footer'].push('footer');
331
+ return ({"data":{"footer":{"terms":"You agree"}},"joints":joints,"defers":defers});
332
+ })()
333
+ JS
334
+ assert_equal expected, result
335
+ end
336
+
337
+ test "renders a partial with explicit joint" do
338
+ result = jbuild(<<-JBUILDER)
339
+ json.footer nil, partial: ["footer", joint: 'hello']
340
+ JBUILDER
341
+
342
+ expected = strip_format(<<-JS)
343
+ (function(){
344
+ var joints={};
345
+ var cache={};
346
+ var defers=[];
347
+ joints['hello'] ||= []; joints['hello'].push('footer');
348
+ return ({"data":{"footer":{"terms":"You agree"}},"joints":joints,"defers":defers});
349
+ })()
350
+ JS
351
+ assert_equal expected, result
352
+ end
353
+
354
+ test "render array of partials with unique joints" do
355
+ result = jbuild(<<-JBUILDER)
356
+ json.array! [1,2], partial: ["footer", joint: ->(x){"somefoo"+x.to_s}]
357
+ JBUILDER
358
+
359
+ expected = strip_format(<<-JS)
360
+ (function(){
361
+ var joints={};
362
+ var cache={};
363
+ var defers=[];
364
+ joints['somefoo1'] ||= []; joints['somefoo1'].push('0');joints['somefoo2'] ||= []; joints['somefoo2'].push('1');
365
+ return ({"data":[{"terms":"You agree"},{"terms":"You agree"}],"joints":joints,"defers":defers});
366
+ })()
367
+ JS
368
+
369
+ assert_equal expected, result
370
+ end
371
+
320
372
  test "renders a partial with no locals" do
321
373
  result = jbuild(<<-JBUILDER)
322
374
  json.footer nil, partial: "footer"
@@ -335,7 +387,7 @@ class BreezyTemplateTest < ActionView::TestCase
335
387
 
336
388
  test "renders a partial with locals" do
337
389
  result = jbuild(<<-JBUILDER)
338
- json.profile nil, partial: "profile", locals: {email: "test@test.com"}
390
+ json.profile nil, partial: ["profile", locals: {email: "test@test.com"}]
339
391
  JBUILDER
340
392
 
341
393
  expected = strip_format(<<-JS)
@@ -351,8 +403,11 @@ class BreezyTemplateTest < ActionView::TestCase
351
403
 
352
404
  test "renders a partial with locals and caches" do
353
405
  result = jbuild(<<-JBUILDER)
354
- json.wrap! :cache, 'cachekey'
355
- json.profile 32, partial: "profile", locals: {email: "test@test.com"}
406
+ opts = {
407
+ cache: 'cachekey',
408
+ partial: ["profile", locals: {email: "test@test.com"}]
409
+ }
410
+ json.profile 32, opts
356
411
  JBUILDER
357
412
 
358
413
  expected = strip_format(<<-JS)
@@ -370,7 +425,7 @@ class BreezyTemplateTest < ActionView::TestCase
370
425
 
371
426
  test "renders a partial even without a :as to the value, this usage is rare" do
372
427
  result = jbuild(<<-JBUILDER)
373
- json.profile 32, partial: "profile", locals: {email: "test@test.com"}
428
+ json.profile 32, partial: ["profile", locals: {email: "test@test.com"}]
374
429
  JBUILDER
375
430
 
376
431
  expected = strip_format(<<-JS)
@@ -404,8 +459,7 @@ class BreezyTemplateTest < ActionView::TestCase
404
459
 
405
460
  test "render array of partials without an :as to a member and cache" do
406
461
  result = jbuild(<<-JBUILDER)
407
- json.wrap! :cache, ->(i){ ['a', i] }
408
- json.array! [1,2], partial: "footer"
462
+ json.array! [1,2], partial: "footer", cache: ->(i){ ['a', i] }
409
463
  JBUILDER
410
464
 
411
465
  expected = strip_format(<<-JS)
@@ -424,7 +478,7 @@ class BreezyTemplateTest < ActionView::TestCase
424
478
 
425
479
  test "render array of partials" do
426
480
  result = jbuild(<<-JBUILDER)
427
- json.array! BLOG_POST_COLLECTION, partial: "blog_post", as: :blog_post
481
+ json.array! BLOG_POST_COLLECTION, partial: ["blog_post", as: :blog_post]
428
482
  JBUILDER
429
483
 
430
484
  expected = strip_format(<<-JS)
@@ -452,7 +506,7 @@ class BreezyTemplateTest < ActionView::TestCase
452
506
 
453
507
  test "renders array of partials as empty array with nil-collection" do
454
508
  result = jbuild(<<-JBUILDER)
455
- json.array! nil, partial: "blog_post", as: :blog_post
509
+ json.array! nil, partial: ["blog_post", as: :blog_post]
456
510
  JBUILDER
457
511
 
458
512
  expected = strip_format(<<-JS)
@@ -487,8 +541,10 @@ class BreezyTemplateTest < ActionView::TestCase
487
541
  undef_context_methods :fragment_name_with_digest, :cache_fragment_name
488
542
 
489
543
  result = jbuild(<<-JBUILDER)
490
- json.wrap! :cache, ['b', 'c']
491
- json.hello 32
544
+ opts = {
545
+ cache: [['b', 'c']]
546
+ }
547
+ json.hello 32, opts
492
548
  JBUILDER
493
549
 
494
550
  expected = strip_format(<<-JS)
@@ -509,8 +565,10 @@ class BreezyTemplateTest < ActionView::TestCase
509
565
 
510
566
  result = jbuild(<<-JBUILDER)
511
567
  json.hello do
512
- json.wrap! :cache, ->(i){ ['a', i] }
513
- json.array! [4,5] do |x|
568
+ opts = {
569
+ cache: ->(i){ ['a', i] }
570
+ }
571
+ json.array! [4,5], opts do |x|
514
572
  json.top "hello" + x.to_s
515
573
  end
516
574
  end
@@ -534,14 +592,11 @@ class BreezyTemplateTest < ActionView::TestCase
534
592
  undef_context_methods :fragment_name_with_digest, :cache_fragment_name
535
593
 
536
594
  result = jbuild(<<-JBUILDER)
537
- json.wrap! :cache, ['a', 'b']
538
- json.hello do
539
- json.wrap! :cache, ['d', 'z']
540
- json.content do
595
+ json.hello cache: [['a', 'b']] do
596
+ json.content cache: [['d', 'z']] do
541
597
  json.subcontent 'inner'
542
598
  end
543
- json.wrap! :cache, ['e', 'z']
544
- json.other do
599
+ json.other cache: [['e', 'z']] do
545
600
  json.subcontent 'other'
546
601
  end
547
602
  end
@@ -612,15 +667,15 @@ class BreezyTemplateTest < ActionView::TestCase
612
667
  undef_context_methods :fragment_name_with_digest, :cache_fragment_name
613
668
 
614
669
  jbuild(<<-JBUILDER)
615
- json.wrap! :cache, ['cachekey']
616
- json.post do
670
+ opts = {cache: ['cachekey']}
671
+ json.post opts do
617
672
  json.name "Cache"
618
673
  end
619
674
  JBUILDER
620
675
 
621
676
  result = jbuild(<<-JBUILDER)
622
- json.wrap! :cache, ['cachekey']
623
- json.post do
677
+ opts = {cache: ['cachekey']}
678
+ json.post opts do
624
679
  json.name "Miss"
625
680
  end
626
681
  JBUILDER
@@ -642,8 +697,7 @@ class BreezyTemplateTest < ActionView::TestCase
642
697
  undef_context_methods :fragment_name_with_digest, :cache_fragment_name
643
698
 
644
699
  result = jbuild <<-JBUILDER
645
- json.wrap! :cache, "cachekey"
646
- json.content do
700
+ json.content cache: "cachekey" do
647
701
  json.array! %w[a b c]
648
702
  end
649
703
  JBUILDER
@@ -674,8 +728,7 @@ class BreezyTemplateTest < ActionView::TestCase
674
728
  @context.expects :fragment_name_with_digest
675
729
 
676
730
  jbuild <<-JBUILDER
677
- json.wrap! :cache, 'cachekey'
678
- json.content do
731
+ json.content cache: 'cachekey' do
679
732
  json.name "Cache"
680
733
  end
681
734
  JBUILDER
@@ -688,36 +741,34 @@ class BreezyTemplateTest < ActionView::TestCase
688
741
  ActiveSupport::Cache.expects :expand_cache_key
689
742
 
690
743
  jbuild <<-JBUILDER
691
- json.wrap! :cache, 'cachekey'
692
- json.content do
744
+ json.content cache: 'cachekey' do
693
745
  json.name "Cache"
694
746
  end
695
747
  JBUILDER
696
748
  end
697
749
 
698
- test "current cache digest option accepts options through the last element hash" do
699
- undef_context_methods :fragment_name_with_digest
700
-
701
- @context.expects(:cache_fragment_name)
702
- .with("cachekey", skip_digest: true)
703
- .returns("cachekey")
704
-
705
- ActiveSupport::Cache.expects :expand_cache_key
706
-
707
- jbuild <<-JBUILDER
708
- json.wrap! :cache, 'cachekey', skip_digest: true
709
- json.content do
710
- json.name "Cache"
711
- end
712
- JBUILDER
713
- end
750
+ # test "current cache digest option accepts options through the last element hash" do
751
+ # undef_context_methods :fragment_name_with_digest
752
+ #
753
+ # @context.expects(:cache_fragment_name)
754
+ # .with("cachekey", skip_digest: true)
755
+ # .returns("cachekey")
756
+ #
757
+ # ActiveSupport::Cache.expects :expand_cache_key
758
+ #
759
+ # jbuild <<-JBUILDER
760
+ # json.wrap! :cache, 'cachekey', skip_digest: true
761
+ # json.content do
762
+ # json.name "Cache"
763
+ # end
764
+ # JBUILDER
765
+ # end
714
766
 
715
767
  test "does not perform caching when controller.perform_caching is false" do
716
768
  controller.perform_caching = false
717
769
 
718
770
  result = jbuild <<-JBUILDER
719
- json.wrap! :cache, 'cachekey'
720
- json.content do
771
+ json.content cache: 'cachekey' do
721
772
  json.name "Cache"
722
773
  end
723
774
  JBUILDER
@@ -738,8 +789,7 @@ class BreezyTemplateTest < ActionView::TestCase
738
789
  @post = BLOG_POST_COLLECTION.first
739
790
 
740
791
  result = jbuild(<<-JBUILDER)
741
- json.wrap! :cache, ['a', 'b']
742
- json.post @post, partial: "blog_post", as: :blog_post
792
+ json.post @post, partial: ["blog_post", as: :blog_post], cache: [['a', 'b']]
743
793
  JBUILDER
744
794
 
745
795
  expected = strip_format(<<-JS)
@@ -762,13 +812,21 @@ class BreezyTemplateTest < ActionView::TestCase
762
812
  @miss = BlogPost.new(2, "miss", "John Smith")
763
813
 
764
814
  cat = jbuild(<<-JBUILDER)
765
- json.wrap! :cache, ['a', 'b']
766
- json.post @hit, partial: "blog_post", as: :blog_post
815
+ opts = {
816
+ cache: [['a', 'b']],
817
+ partial: ["blog_post", as: :blog_post]
818
+ }
819
+
820
+ json.post @hit, opts
767
821
  JBUILDER
768
822
 
769
823
  result = jbuild(<<-JBUILDER)
770
- json.wrap! :cache, ['a', 'b']
771
- json.post @miss, partial: "blog_post", as: :blog_post
824
+ opts = {
825
+ cache: [['a', 'b']],
826
+ partial: ["blog_post", as: :blog_post]
827
+ }
828
+
829
+ json.post @miss, opts
772
830
  JBUILDER
773
831
 
774
832
  expected = strip_format(<<-JS)
@@ -787,8 +845,11 @@ class BreezyTemplateTest < ActionView::TestCase
787
845
 
788
846
  test "render array of partials and caches" do
789
847
  result = jbuild(<<-JBUILDER)
790
- json.wrap! :cache, ->(d){ ['a', d.id] }
791
- json.array! BLOG_POST_COLLECTION, partial: "blog_post", as: :blog_post
848
+ opts = {
849
+ cache: (->(d){ ['a', d.id] }),
850
+ partial: ["blog_post", as: :blog_post]
851
+ }
852
+ json.array! BLOG_POST_COLLECTION, opts
792
853
  JBUILDER
793
854
  Rails.cache.clear
794
855
 
@@ -929,8 +990,7 @@ class BreezyTemplateTest < ActionView::TestCase
929
990
  undef_context_methods :fragment_name_with_digest, :cache_fragment_name
930
991
  result = jbuild(<<-JBUILDER, breezy_filter: 'hit.hit2')
931
992
  json.hit do
932
- json.wrap! :cache, ['a']
933
- json.hit2 do
993
+ json.hit2 cache: 'a' do
934
994
  json.greeting 'hello world'
935
995
  end
936
996
  end
@@ -955,14 +1015,14 @@ class BreezyTemplateTest < ActionView::TestCase
955
1015
  test "filtering for a node of a AR relation in a tree by id via an appended where clause" do
956
1016
  result = jbuild(<<-JBUILDER, breezy_filter: 'hit.hit2.id=1')
957
1017
  post = Post.create
958
- post.comments.create title: 'first'
959
- post.comments.create title: 'second'
1018
+ post.notes.create title: 'first'
1019
+ post.notes.create title: 'second'
960
1020
 
961
- post.comments.expects(:where).once().with('id'=>1).returns([{id: 1, title: 'first'}])
1021
+ post.notes.expects(:where).once().with('id'=>1).returns([{id: 1, title: 'first'}])
962
1022
 
963
1023
  json.hit do
964
1024
  json.hit2 do
965
- json.array! post.comments do |x|
1025
+ json.array! post.notes do |x|
966
1026
  raise 'this should be be called' if x[:title] == 'second'
967
1027
  json.title x[:title]
968
1028
  end
@@ -989,15 +1049,15 @@ class BreezyTemplateTest < ActionView::TestCase
989
1049
  test "filtering for a node of a AR relation in a tree by index via an appended where clause" do
990
1050
  result = jbuild(<<-JBUILDER, breezy_filter: 'hit.hit2.0')
991
1051
  post = Post.create
992
- post.comments.create title: 'first'
993
- post.comments.create title: 'second'
1052
+ post.notes.create title: 'first'
1053
+ post.notes.create title: 'second'
994
1054
 
995
- offset = post.comments.offset(0)
996
- post.comments.expects(:offset).once().with(0).returns(offset)
1055
+ offset = post.notes.offset(0)
1056
+ post.notes.expects(:offset).once().with(0).returns(offset)
997
1057
 
998
1058
  json.hit do
999
1059
  json.hit2 do
1000
- json.array! post.comments do |x|
1060
+ json.array! post.notes do |x|
1001
1061
  raise 'this should be be called' if x[:title] == 'second'
1002
1062
  json.title x[:title]
1003
1063
  end
@@ -1080,8 +1140,7 @@ class BreezyTemplateTest < ActionView::TestCase
1080
1140
 
1081
1141
  result = jbuild(<<-JBUILDER, request: req)
1082
1142
  json.hit do
1083
- json.wrap! :defer, :auto
1084
- json.hit2 do
1143
+ json.hit2(defer: :auto)do
1085
1144
  json.hit3 do
1086
1145
  json.greeting 'hello world'
1087
1146
  end
@@ -1111,8 +1170,7 @@ class BreezyTemplateTest < ActionView::TestCase
1111
1170
 
1112
1171
  result = jbuild(<<-JBUILDER, request: req)
1113
1172
  json.hit do
1114
- json.wrap! :defer, :manual
1115
- json.hit2 do
1173
+ json.hit2 defer: :manual do
1116
1174
  json.hit3 do
1117
1175
  json.greeting 'hello world'
1118
1176
  end
@@ -1144,8 +1202,7 @@ class BreezyTemplateTest < ActionView::TestCase
1144
1202
  json.hit2 do
1145
1203
  data = [{id: 1, name: 'foo'}, {id: 2, name: 'bar'}]
1146
1204
  json.array! data, key: :id do
1147
- json.wrap! :defer, :auto
1148
- json.greeting do
1205
+ json.greeting defer: :auto do
1149
1206
  json.gree 'hi'
1150
1207
  end
1151
1208
  end
@@ -1174,7 +1231,6 @@ class BreezyTemplateTest < ActionView::TestCase
1174
1231
  undef_context_methods :fragment_name_with_digest, :cache_fragment_name
1175
1232
 
1176
1233
  result = jbuild(<<-JBUILDER)
1177
- json.wrap! :defer, :auto
1178
1234
  json.hello(32, defer: :auto)
1179
1235
  JBUILDER
1180
1236
 
@@ -1193,7 +1249,6 @@ class BreezyTemplateTest < ActionView::TestCase
1193
1249
  test 'deferment is disabled when filtering by keypath' do
1194
1250
  undef_context_methods :fragment_name_with_digest, :cache_fragment_name
1195
1251
  result = jbuild(<<-JBUILDER, breezy_filter: 'hello.world')
1196
- json.wrap! :defer, :auto
1197
1252
  json.hello defer: :auto do
1198
1253
  json.world 32
1199
1254
  end
@@ -1215,10 +1270,8 @@ class BreezyTemplateTest < ActionView::TestCase
1215
1270
  test 'deferment is enabled at the end of a keypath when filtering' do
1216
1271
  undef_context_methods :fragment_name_with_digest, :cache_fragment_name
1217
1272
  result = jbuild(<<-JBUILDER, breezy_filter: 'hello')
1218
- json.wrap! :defer, :auto
1219
1273
  json.hello do
1220
- json.wrap! :defer, :auto
1221
- json.content do
1274
+ json.content defer: :auto do
1222
1275
  json.world 32
1223
1276
  end
1224
1277
  end