jbuilder 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -3,3 +3,4 @@ source "http://rubygems.org"
3
3
  gemspec
4
4
 
5
5
  gem "actionpack"
6
+ gem "rake"
data/Gemfile.lock CHANGED
@@ -1,9 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- jbuilder (0.4.1)
4
+ jbuilder (0.6.0)
5
5
  activesupport (>= 3.0.0)
6
- blankslate (>= 2.1.2.4)
7
6
 
8
7
  GEM
9
8
  remote: http://rubygems.org/
@@ -24,7 +23,6 @@ GEM
24
23
  activesupport (3.2.8)
25
24
  i18n (~> 0.6)
26
25
  multi_json (~> 1.0)
27
- blankslate (2.1.2.4)
28
26
  builder (3.0.0)
29
27
  erubis (2.7.0)
30
28
  hike (1.2.1)
@@ -36,6 +34,7 @@ GEM
36
34
  rack (>= 0.4)
37
35
  rack-test (0.6.1)
38
36
  rack (>= 1.0)
37
+ rake (0.9.2.2)
39
38
  sprockets (2.1.3)
40
39
  hike (~> 1.2)
41
40
  rack (~> 1.0)
@@ -48,3 +47,4 @@ PLATFORMS
48
47
  DEPENDENCIES
49
48
  actionpack
50
49
  jbuilder!
50
+ rake
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler'
2
+ require 'rake/testtask'
3
+
4
+ Bundler.require
5
+
6
+ Rake::TestTask.new do |test|
7
+ test.test_files = FileList["test/*_test.rb"]
8
+ end
9
+
10
+ task :default => :test
data/jbuilder.gemspec CHANGED
@@ -1,12 +1,11 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'jbuilder'
3
- s.version = '0.5.0'
3
+ s.version = '0.6.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'
7
7
 
8
8
  s.add_dependency 'activesupport', '>= 3.0.0'
9
- s.add_dependency 'blankslate', '>= 2.1.2.4'
10
9
 
11
10
  s.files = Dir["#{File.dirname(__FILE__)}/**/*"]
12
11
  end
data/lib/jbuilder.rb CHANGED
@@ -1,10 +1,11 @@
1
- require 'blankslate'
1
+ require 'active_support/basic_object'
2
2
  require 'active_support/ordered_hash'
3
3
  require 'active_support/core_ext/array/access'
4
4
  require 'active_support/core_ext/enumerable'
5
5
  require 'active_support/json'
6
6
  require 'multi_json'
7
- class Jbuilder < BlankSlate
7
+
8
+ class Jbuilder < ActiveSupport::BasicObject
8
9
  class KeyFormatter
9
10
  def initialize(*args)
10
11
  @format = {}
@@ -34,20 +35,18 @@ class Jbuilder < BlankSlate
34
35
  end
35
36
  end
36
37
  end
37
-
38
+
38
39
  # Yields a builder and automatically turns the result into a JSON string
39
- def self.encode
40
- new._tap { |jbuilder| yield jbuilder }.target!
40
+ def self.encode(*args)
41
+ jbuilder = new(*args)
42
+ yield jbuilder
43
+ jbuilder.target!
41
44
  end
42
45
 
43
46
  @@key_formatter = KeyFormatter.new
44
47
 
45
- define_method(:__class__, find_hidden_method(:class))
46
- define_method(:_tap, find_hidden_method(:tap))
47
- reveal(:respond_to?)
48
-
49
48
  def initialize(key_formatter = @@key_formatter.clone)
50
- @attributes = ActiveSupport::OrderedHash.new
49
+ @attributes = ::ActiveSupport::OrderedHash.new
51
50
  @key_formatter = key_formatter
52
51
  end
53
52
 
@@ -68,8 +67,8 @@ class Jbuilder < BlankSlate
68
67
  #
69
68
  # { "author": { "name": "David", "age": 32 } }
70
69
  def set!(key, value = nil)
71
- if block_given?
72
- _yield_nesting(key) { |jbuilder| yield jbuilder }
70
+ if ::Kernel::block_given?
71
+ _set_value(key, _with_attributes { yield self })
73
72
  else
74
73
  _set_value(key, value)
75
74
  end
@@ -106,7 +105,7 @@ class Jbuilder < BlankSlate
106
105
  def key_format!(*args)
107
106
  @key_formatter = KeyFormatter.new(*args)
108
107
  end
109
-
108
+
110
109
  # Same as the instance method key_format! except sets the default.
111
110
  def self.key_format(*args)
112
111
  @@key_formatter = KeyFormatter.new(*args)
@@ -127,13 +126,13 @@ class Jbuilder < BlankSlate
127
126
  #
128
127
  # json.comments(@post.comments) do |json, comment|
129
128
  # json.content comment.formatted_content
130
- # end
129
+ # end
131
130
  def child!
132
- @attributes = [] unless @attributes.is_a? Array
133
- @attributes << _new_instance._tap { |jbuilder| yield jbuilder }.attributes!
131
+ @attributes = [] unless @attributes.is_a? ::Array
132
+ @attributes << _with_attributes { yield self }
134
133
  end
135
134
 
136
- # Turns the current element into an array and iterates over the passed collection, adding each iteration as
135
+ # Turns the current element into an array and iterates over the passed collection, adding each iteration as
137
136
  # an element of the resulting array.
138
137
  #
139
138
  # Example:
@@ -154,14 +153,11 @@ class Jbuilder < BlankSlate
154
153
  # json.people(@people) do |json, person|
155
154
  # json.name person.name
156
155
  # json.age calculate_age(person.birthday)
157
- # end
156
+ # end
158
157
  #
159
158
  # { "people": [ { "name": David", "age": 32 }, { "name": Jamie", "age": 31 } ] }
160
159
  def array!(collection)
161
- @attributes = []
162
- collection.each do |element| #[] and return if collection.empty?
163
- @attributes << _new_instance._tap { |jbuilder| yield jbuilder, element }.attributes!
164
- end
160
+ @attributes = _map_collection(collection) { |element| yield self, element }
165
161
  end
166
162
 
167
163
  # Extracts the mentioned attributes or hash elements from the passed object and turns them into attributes of the JSON.
@@ -182,20 +178,18 @@ class Jbuilder < BlankSlate
182
178
  #
183
179
  # json.(@person, :name, :age)
184
180
  def extract!(object, *attributes)
185
- if object.is_a?(Hash)
181
+ if object.is_a?(::Hash)
186
182
  attributes.each {|attribute| _set_value attribute, object.send(:fetch, attribute)}
187
183
  else
188
184
  attributes.each {|attribute| _set_value attribute, object.send(attribute)}
189
185
  end
190
186
  end
191
187
 
192
- if RUBY_VERSION > '1.9'
193
- def call(object = nil, *attributes)
194
- if attributes.empty?
195
- array!(object) { |json, element| yield json, element }
196
- else
197
- extract!(object, *attributes)
198
- end
188
+ def call(object = nil, *attributes)
189
+ if attributes.empty?
190
+ array!(object) { |_, element| yield self, element }
191
+ else
192
+ extract!(object, *attributes)
199
193
  end
200
194
  end
201
195
 
@@ -203,10 +197,10 @@ class Jbuilder < BlankSlate
203
197
  def attributes!
204
198
  @attributes
205
199
  end
206
-
200
+
207
201
  # Encodes the current builder as JSON.
208
202
  def target!
209
- MultiJson.encode @attributes
203
+ ::MultiJson.encode @attributes
210
204
  end
211
205
 
212
206
 
@@ -218,71 +212,60 @@ class Jbuilder < BlankSlate
218
212
 
219
213
  private
220
214
  def method_missing(method, value = nil, *args)
221
- if block_given?
215
+ result = if ::Kernel.block_given?
222
216
  if value
223
217
  # json.comments @post.comments { |json, comment| ... }
224
218
  # { "comments": [ { ... }, { ... } ] }
225
- _yield_iteration(method, value) { |child, element| yield child, element }
219
+ _map_collection(value) { |element| yield self, element }
226
220
  else
227
221
  # json.comments { |json| ... }
228
222
  # { "comments": ... }
229
- _yield_nesting(method) { |jbuilder| yield jbuilder }
223
+ _with_attributes { yield self }
230
224
  end
231
225
  else
232
226
  if args.empty?
233
- if Jbuilder === value
227
+ if ::Jbuilder === value
234
228
  # json.age 32
235
229
  # json.person another_jbuilder
236
230
  # { "age": 32, "person": { ... }
237
- _set_value method, value.attributes!
231
+ value.attributes!
238
232
  else
239
233
  # json.age 32
240
234
  # { "age": 32 }
241
- _set_value method, value
235
+ value
242
236
  end
243
237
  else
244
238
  if value.respond_to?(:each)
245
239
  # json.comments(@post.comments, :content, :created_at)
246
240
  # { "comments": [ { "content": "hello", "created_at": "..." }, { "content": "world", "created_at": "..." } ] }
247
- _inline_nesting method, value, args
241
+ _map_collection(value) do |element|
242
+ args.each do |attribute|
243
+ _set_value attribute, element.send(attribute)
244
+ end
245
+ end
248
246
  else
249
247
  # json.author @post.creator, :name, :email_address
250
248
  # { "author": { "name": "David", "email_address": "david@loudthinking.com" } }
251
- _inline_extract method, value, args
249
+ _with_attributes { extract! value, *args }
252
250
  end
253
251
  end
254
252
  end
253
+ _set_value method, result
255
254
  end
256
255
 
257
- # Overwrite in subclasses if you need to add initialization values
258
- def _new_instance
259
- __class__.new(@key_formatter)
260
- end
261
-
262
- def _yield_nesting(container)
263
- _set_value container, _new_instance._tap { |jbuilder| yield jbuilder }.attributes!
264
- end
265
-
266
- def _inline_nesting(container, collection, attributes)
267
- _yield_nesting(container) do |parent|
268
- parent.array!(collection) do |child, element|
269
- attributes.each do |attribute|
270
- child._set_value attribute, element.send(attribute)
271
- end
272
- end
256
+ def _map_collection(collection)
257
+ collection.each.map do |element|
258
+ _with_attributes { yield element }
273
259
  end
274
260
  end
275
-
276
- def _yield_iteration(container, collection)
277
- _yield_nesting(container) do |parent|
278
- parent.array!(collection) do |child, element|
279
- yield child, element
280
- end
281
- end
282
- end
283
-
284
- def _inline_extract(container, record, attributes)
285
- _yield_nesting(container) { |parent| parent.extract! record, *attributes }
261
+
262
+ def _with_attributes
263
+ parent_attributes, parent_formatter = @attributes, @key_formatter
264
+ @attributes = ::ActiveSupport::OrderedHash.new
265
+ yield
266
+ @attributes
267
+ ensure
268
+ @attributes, @key_formatter = parent_attributes, parent_formatter
286
269
  end
287
270
  end
288
271
 
@@ -1,8 +1,4 @@
1
1
  class JbuilderTemplate < Jbuilder
2
- def self.encode(context)
3
- new(context)._tap { |jbuilder| yield jbuilder }.target!
4
- end
5
-
6
2
  def initialize(context, *args)
7
3
  @context = context
8
4
  super(*args)
@@ -10,7 +6,7 @@ class JbuilderTemplate < Jbuilder
10
6
 
11
7
  def partial!(options, locals = {})
12
8
  case options
13
- when Hash
9
+ when ::Hash
14
10
  options[:locals] ||= {}
15
11
  options[:locals].merge!(:json => self)
16
12
  @context.render(options)
@@ -18,11 +14,6 @@ class JbuilderTemplate < Jbuilder
18
14
  @context.render(options, locals.merge(:json => self))
19
15
  end
20
16
  end
21
-
22
- private
23
- def _new_instance
24
- __class__.new(@context, @key_formatter)
25
- end
26
17
  end
27
18
 
28
19
  class JbuilderHandler
@@ -30,7 +21,6 @@ class JbuilderHandler
30
21
  self.default_format = Mime::JSON
31
22
 
32
23
  def self.call(template)
33
-
34
24
  # this juggling is required to keep line numbers right in the error
35
25
  %{__already_defined = defined?(json); json||=JbuilderTemplate.new(self); #{template.source}
36
26
  json.target! unless __already_defined}
@@ -1,39 +1,56 @@
1
1
  require 'test/unit'
2
- require 'active_support/test_case'
3
- require 'active_support/inflector'
4
- require 'action_dispatch'
5
2
  require 'action_view'
3
+ require 'action_view/testing/resolvers'
6
4
 
7
5
  require 'jbuilder'
8
- require 'jbuilder_template'
9
6
 
10
- class JbuilderTemplateTest < ActiveSupport::TestCase
7
+ class JbuilderTemplateTest < ActionView::TestCase
8
+ def partials
9
+ { "_partial.json.jbuilder" => 'json.content "hello"' }
10
+ end
11
+
12
+ def render_jbuilder(source)
13
+ @rendered = []
14
+ lookup_context.view_paths = [ActionView::FixtureResolver.new(partials.merge("test.json.jbuilder" => source))]
15
+ ActionView::Template.new(source, "test", JbuilderHandler, :virtual_path => "test").render(self, {}).strip
16
+ end
17
+
11
18
  test "rendering" do
12
- json = JbuilderTemplate.encode(binding) do |json|
19
+ json = render_jbuilder <<-JBUILDER
13
20
  json.content "hello"
14
- end
15
-
16
- assert_equal "hello", JSON.parse(json)["content"]
21
+ JBUILDER
22
+
23
+ assert_equal "hello", MultiJson.load(json)["content"]
17
24
  end
18
25
 
19
26
  test "key_format! with parameter" do
20
- json = JbuilderTemplate.new(binding)
21
- json.key_format! :camelize => [:lower]
22
- json.camel_style "for JS"
27
+ json = render_jbuilder <<-JBUILDER
28
+ json.key_format! :camelize => [:lower]
29
+ json.camel_style "for JS"
30
+ JBUILDER
23
31
 
24
- assert_equal ['camelStyle'], json.attributes!.keys
32
+ assert_equal ['camelStyle'], MultiJson.load(json).keys
25
33
  end
26
34
 
27
35
  test "key_format! propagates to child elements" do
28
- json = JbuilderTemplate.new(binding)
29
- json.key_format! :upcase
30
- json.level1 "one"
31
- json.level2 do |json|
32
- json.value "two"
33
- end
34
-
35
- result = json.attributes!
36
+ json = render_jbuilder <<-JBUILDER
37
+ json.key_format! :upcase
38
+ json.level1 "one"
39
+ json.level2 do |json|
40
+ json.value "two"
41
+ end
42
+ JBUILDER
43
+
44
+ result = MultiJson.load(json)
36
45
  assert_equal "one", result["LEVEL1"]
37
46
  assert_equal "two", result["LEVEL2"]["VALUE"]
38
47
  end
48
+
49
+ test "partial! renders partial" do
50
+ json = render_jbuilder <<-JBUILDER
51
+ json.partial! 'partial'
52
+ JBUILDER
53
+
54
+ assert_equal "hello", MultiJson.load(json)["content"]
55
+ end
39
56
  end
@@ -9,8 +9,8 @@ class JbuilderTest < ActiveSupport::TestCase
9
9
  json = Jbuilder.encode do |json|
10
10
  json.content "hello"
11
11
  end
12
-
13
- assert_equal "hello", JSON.parse(json)["content"]
12
+
13
+ assert_equal "hello", MultiJson.load(json)["content"]
14
14
  end
15
15
 
16
16
  test "single key with false value" do
@@ -18,7 +18,7 @@ class JbuilderTest < ActiveSupport::TestCase
18
18
  json.content false
19
19
  end
20
20
 
21
- assert_equal false, JSON.parse(json)["content"]
21
+ assert_equal false, MultiJson.load(json)["content"]
22
22
  end
23
23
 
24
24
  test "single key with nil value" do
@@ -26,8 +26,8 @@ class JbuilderTest < ActiveSupport::TestCase
26
26
  json.content nil
27
27
  end
28
28
 
29
- assert JSON.parse(json).has_key?("content")
30
- assert_equal nil, JSON.parse(json)["content"]
29
+ assert MultiJson.load(json).has_key?("content")
30
+ assert_equal nil, MultiJson.load(json)["content"]
31
31
  end
32
32
 
33
33
  test "multiple keys" do
@@ -35,34 +35,38 @@ class JbuilderTest < ActiveSupport::TestCase
35
35
  json.title "hello"
36
36
  json.content "world"
37
37
  end
38
-
39
- JSON.parse(json).tap do |parsed|
38
+
39
+ MultiJson.load(json).tap do |parsed|
40
40
  assert_equal "hello", parsed["title"]
41
41
  assert_equal "world", parsed["content"]
42
42
  end
43
43
  end
44
-
44
+
45
45
  test "extracting from object" do
46
46
  person = Struct.new(:name, :age).new("David", 32)
47
-
47
+
48
48
  json = Jbuilder.encode do |json|
49
49
  json.extract! person, :name, :age
50
50
  end
51
-
52
- JSON.parse(json).tap do |parsed|
51
+
52
+ MultiJson.load(json).tap do |parsed|
53
53
  assert_equal "David", parsed["name"]
54
54
  assert_equal 32, parsed["age"]
55
55
  end
56
56
  end
57
-
57
+
58
58
  test "extracting from object using call style for 1.9" do
59
59
  person = Struct.new(:name, :age).new("David", 32)
60
-
60
+
61
61
  json = Jbuilder.encode do |json|
62
- json.(person, :name, :age)
62
+ if ::RUBY_VERSION > '1.9'
63
+ instance_eval "json.(person, :name, :age)"
64
+ else
65
+ instance_eval "json.call(person, :name, :age)"
66
+ end
63
67
  end
64
-
65
- JSON.parse(json).tap do |parsed|
68
+
69
+ MultiJson.load(json).tap do |parsed|
66
70
  assert_equal "David", parsed["name"]
67
71
  assert_equal 32, parsed["age"]
68
72
  end
@@ -75,7 +79,7 @@ class JbuilderTest < ActiveSupport::TestCase
75
79
  json.extract! person, :name, :age
76
80
  end
77
81
 
78
- JSON.parse(json).tap do |parsed|
82
+ MultiJson.load(json).tap do |parsed|
79
83
  assert_equal "Jim", parsed["name"]
80
84
  assert_equal 34, parsed["age"]
81
85
  end
@@ -88,13 +92,13 @@ class JbuilderTest < ActiveSupport::TestCase
88
92
  json.age 32
89
93
  end
90
94
  end
91
-
92
- JSON.parse(json).tap do |parsed|
95
+
96
+ MultiJson.load(json).tap do |parsed|
93
97
  assert_equal "David", parsed["author"]["name"]
94
98
  assert_equal 32, parsed["author"]["age"]
95
99
  end
96
100
  end
97
-
101
+
98
102
  test "nesting multiple children with block" do
99
103
  json = Jbuilder.encode do |json|
100
104
  json.comments do |json|
@@ -103,69 +107,69 @@ class JbuilderTest < ActiveSupport::TestCase
103
107
  end
104
108
  end
105
109
 
106
- JSON.parse(json).tap do |parsed|
110
+ MultiJson.load(json).tap do |parsed|
107
111
  assert_equal "hello", parsed["comments"].first["content"]
108
112
  assert_equal "world", parsed["comments"].second["content"]
109
113
  end
110
114
  end
111
-
115
+
112
116
  test "nesting single child with inline extract" do
113
117
  person = Class.new do
114
118
  attr_reader :name, :age
115
-
119
+
116
120
  def initialize(name, age)
117
121
  @name, @age = name, age
118
122
  end
119
123
  end.new("David", 32)
120
-
124
+
121
125
  json = Jbuilder.encode do |json|
122
126
  json.author person, :name, :age
123
127
  end
124
-
125
- JSON.parse(json).tap do |parsed|
128
+
129
+ MultiJson.load(json).tap do |parsed|
126
130
  assert_equal "David", parsed["author"]["name"]
127
131
  assert_equal 32, parsed["author"]["age"]
128
132
  end
129
133
  end
130
-
134
+
131
135
  test "nesting multiple children from array" do
132
136
  comments = [ Struct.new(:content, :id).new("hello", 1), Struct.new(:content, :id).new("world", 2) ]
133
-
137
+
134
138
  json = Jbuilder.encode do |json|
135
139
  json.comments comments, :content
136
140
  end
137
-
138
- JSON.parse(json).tap do |parsed|
141
+
142
+ MultiJson.load(json).tap do |parsed|
139
143
  assert_equal ["content"], parsed["comments"].first.keys
140
144
  assert_equal "hello", parsed["comments"].first["content"]
141
145
  assert_equal "world", parsed["comments"].second["content"]
142
146
  end
143
147
  end
144
-
148
+
145
149
  test "nesting multiple children from array when child array is empty" do
146
150
  comments = []
147
-
151
+
148
152
  json = Jbuilder.encode do |json|
149
153
  json.name "Parent"
150
154
  json.comments comments, :content
151
155
  end
152
-
153
- JSON.parse(json).tap do |parsed|
156
+
157
+ MultiJson.load(json).tap do |parsed|
154
158
  assert_equal "Parent", parsed["name"]
155
159
  assert_equal [], parsed["comments"]
156
160
  end
157
161
  end
158
-
162
+
159
163
  test "nesting multiple children from array with inline loop" do
160
164
  comments = [ Struct.new(:content, :id).new("hello", 1), Struct.new(:content, :id).new("world", 2) ]
161
-
165
+
162
166
  json = Jbuilder.encode do |json|
163
167
  json.comments comments do |json, comment|
164
168
  json.content comment.content
165
169
  end
166
170
  end
167
-
168
- JSON.parse(json).tap do |parsed|
171
+
172
+ MultiJson.load(json).tap do |parsed|
169
173
  assert_equal ["content"], parsed["comments"].first.keys
170
174
  assert_equal "hello", parsed["comments"].first["content"]
171
175
  assert_equal "world", parsed["comments"].second["content"]
@@ -174,42 +178,42 @@ class JbuilderTest < ActiveSupport::TestCase
174
178
 
175
179
  test "nesting multiple children from array with inline loop on root" do
176
180
  comments = [ Struct.new(:content, :id).new("hello", 1), Struct.new(:content, :id).new("world", 2) ]
177
-
181
+
178
182
  json = Jbuilder.encode do |json|
179
- json.(comments) do |json, comment|
183
+ json.call(comments) do |json, comment|
180
184
  json.content comment.content
181
185
  end
182
186
  end
183
-
184
- JSON.parse(json).tap do |parsed|
187
+
188
+ MultiJson.load(json).tap do |parsed|
185
189
  assert_equal "hello", parsed.first["content"]
186
190
  assert_equal "world", parsed.second["content"]
187
191
  end
188
192
  end
189
-
193
+
190
194
  test "array nested inside nested hash" do
191
195
  json = Jbuilder.encode do |json|
192
196
  json.author do |json|
193
197
  json.name "David"
194
198
  json.age 32
195
-
199
+
196
200
  json.comments do |json|
197
201
  json.child! { |json| json.content "hello" }
198
202
  json.child! { |json| json.content "world" }
199
203
  end
200
204
  end
201
205
  end
202
-
203
- JSON.parse(json).tap do |parsed|
206
+
207
+ MultiJson.load(json).tap do |parsed|
204
208
  assert_equal "hello", parsed["author"]["comments"].first["content"]
205
209
  assert_equal "world", parsed["author"]["comments"].second["content"]
206
210
  end
207
211
  end
208
-
212
+
209
213
  test "array nested inside array" do
210
214
  json = Jbuilder.encode do |json|
211
215
  json.comments do |json|
212
- json.child! do |json|
216
+ json.child! do |json|
213
217
  json.authors do |json|
214
218
  json.child! do |json|
215
219
  json.name "david"
@@ -218,8 +222,8 @@ class JbuilderTest < ActiveSupport::TestCase
218
222
  end
219
223
  end
220
224
  end
221
-
222
- assert_equal "david", JSON.parse(json)["comments"].first["authors"].first["name"]
225
+
226
+ assert_equal "david", MultiJson.load(json)["comments"].first["authors"].first["name"]
223
227
  end
224
228
 
225
229
  test "nested jbuilder objects" do
@@ -229,7 +233,7 @@ class JbuilderTest < ActiveSupport::TestCase
229
233
  json.value "Test"
230
234
  json.nested to_nest
231
235
  end
232
- parsed = JSON.parse(json)
236
+ parsed = MultiJson.load(json)
233
237
  assert_equal "Test", parsed['value']
234
238
  assert_equal "Nested Test", parsed["nested"]["nested_value"]
235
239
  end
@@ -242,31 +246,31 @@ class JbuilderTest < ActiveSupport::TestCase
242
246
  json.content comment.content
243
247
  end
244
248
  end
245
-
246
- JSON.parse(json).tap do |parsed|
249
+
250
+ MultiJson.load(json).tap do |parsed|
247
251
  assert_equal "hello", parsed.first["content"]
248
252
  assert_equal "world", parsed.second["content"]
249
253
  end
250
- end
251
-
254
+ end
255
+
252
256
  test "empty top-level array" do
253
257
  comments = []
254
-
258
+
255
259
  json = Jbuilder.encode do |json|
256
260
  json.array!(comments) do |json, comment|
257
261
  json.content comment.content
258
262
  end
259
263
  end
260
-
261
- assert_equal [], JSON.parse(json)
264
+
265
+ assert_equal [], MultiJson.load(json)
262
266
  end
263
-
267
+
264
268
  test "dynamically set a key/value" do
265
269
  json = Jbuilder.encode do |json|
266
270
  json.set!(:each, "stuff")
267
271
  end
268
-
269
- assert_equal "stuff", JSON.parse(json)["each"]
272
+
273
+ assert_equal "stuff", MultiJson.load(json)["each"]
270
274
  end
271
275
 
272
276
  test "dynamically set a key/nested child with block" do
@@ -276,8 +280,8 @@ class JbuilderTest < ActiveSupport::TestCase
276
280
  json.age 32
277
281
  end
278
282
  end
279
-
280
- JSON.parse(json).tap do |parsed|
283
+
284
+ MultiJson.load(json).tap do |parsed|
281
285
  assert_equal "David", parsed["author"]["name"]
282
286
  assert_equal 32, parsed["author"]["age"]
283
287
  end
@@ -304,7 +308,7 @@ class JbuilderTest < ActiveSupport::TestCase
304
308
  json.relations RelationMock.new, :name, :age
305
309
  end
306
310
 
307
- parsed = JSON.parse(result)
311
+ parsed = MultiJson.load(result)
308
312
  assert_equal 2, parsed["relations"].length
309
313
  assert_equal "Bob", parsed["relations"][0]["name"]
310
314
  assert_equal 50, parsed["relations"][1]["age"]
@@ -339,6 +343,19 @@ class JbuilderTest < ActiveSupport::TestCase
339
343
  assert_equal "two", result["LEVEL2"]["VALUE"]
340
344
  end
341
345
 
346
+ test "key_format! resets after child element" do
347
+ json = Jbuilder.new
348
+ json.level2 do |json|
349
+ json.key_format! :upcase
350
+ json.value "two"
351
+ end
352
+ json.level1 "one"
353
+
354
+ result = json.attributes!
355
+ assert_equal "two", result["level2"]["VALUE"]
356
+ assert_equal "one", result["level1"]
357
+ end
358
+
342
359
  test "key_format! with no parameter" do
343
360
  json = Jbuilder.new
344
361
  json.key_format! :upcase
@@ -357,7 +374,7 @@ class JbuilderTest < ActiveSupport::TestCase
357
374
 
358
375
  test "key_format! with lambda/proc" do
359
376
  json = Jbuilder.new
360
- json.key_format! ->(key){ key + " and friends" }
377
+ json.key_format! lambda { |key| key + " and friends" }
361
378
  json.oats ""
362
379
 
363
380
  assert_equal ["oats and friends"], json.attributes!.keys
@@ -369,13 +386,13 @@ class JbuilderTest < ActiveSupport::TestCase
369
386
  json.camel_style "for JS"
370
387
 
371
388
  assert_equal ['camelStyle'], json.attributes!.keys
372
- Jbuilder.class_variable_set("@@key_formatter", Jbuilder::KeyFormatter.new)
389
+ Jbuilder.send(:class_variable_set, "@@key_formatter", Jbuilder::KeyFormatter.new)
373
390
  end
374
391
 
375
392
  test "don't use default key formatter directly" do
376
393
  json = Jbuilder.new
377
394
  json.key "value"
378
395
 
379
- assert_equal [], Jbuilder.class_variable_get("@@key_formatter").instance_variable_get("@cache").keys
396
+ assert_equal [], Jbuilder.send(:class_variable_get, "@@key_formatter").instance_variable_get("@cache").keys
380
397
  end
381
398
  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.5.0
4
+ version: 0.6.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-06 00:00:00.000000000 Z
12
+ date: 2012-09-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: !ruby/object:Gem::Requirement
16
+ requirement: &2152682460 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,28 +21,7 @@ dependencies:
21
21
  version: 3.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: 3.0.0
30
- - !ruby/object:Gem::Dependency
31
- name: blankslate
32
- requirement: !ruby/object:Gem::Requirement
33
- none: false
34
- requirements:
35
- - - ! '>='
36
- - !ruby/object:Gem::Version
37
- version: 2.1.2.4
38
- type: :runtime
39
- prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: 2.1.2.4
24
+ version_requirements: *2152682460
46
25
  description:
47
26
  email: david@37signals.com
48
27
  executables: []
@@ -55,6 +34,7 @@ files:
55
34
  - ./lib/jbuilder.rb
56
35
  - ./lib/jbuilder_template.rb
57
36
  - ./MIT-LICENSE
37
+ - ./Rakefile
58
38
  - ./README.md
59
39
  - ./test/jbuilder_template_test.rb
60
40
  - ./test/jbuilder_test.rb
@@ -78,7 +58,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
58
  version: '0'
79
59
  requirements: []
80
60
  rubyforge_project:
81
- rubygems_version: 1.8.23
61
+ rubygems_version: 1.8.7
82
62
  signing_key:
83
63
  specification_version: 3
84
64
  summary: Create JSON structures via a Builder-style DSL