bldr 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -55,6 +55,26 @@ describe "Using Bldr with a sinatra app" do
55
55
  get '/root_partial' do
56
56
  bldr :'fixtures/root_partial'
57
57
  end
58
+
59
+ get '/ivar' do
60
+ @person = Person.new('bert', 99)
61
+ bldr :'fixtures/ivar'
62
+ end
63
+
64
+ get '/nested_ivars' do
65
+ @person = Person.new('bert', 99)
66
+ bldr :'fixtures/nested_ivars'
67
+ end
68
+ end
69
+
70
+ it 'passes ivars through to the template' do
71
+ response = Rack::MockRequest.new(TestApp).get('/ivar')
72
+ decode(response.body).should == {'person' => {'name' => 'bert', 'age' => 99}}
73
+ end
74
+
75
+ it 'makes ivars available in nested objects' do
76
+ response = Rack::MockRequest.new(TestApp).get('/nested_ivars')
77
+ decode(response.body).should == {'person' => {'name' => 'bert', 'age' => 99}}
58
78
  end
59
79
 
60
80
  it "properly renders a template that only contains a template call" do
@@ -118,4 +138,4 @@ describe "access to the locals hash inside sinatra bldr templates" do
118
138
  response = Rack::MockRequest.new(Locals).get('/')
119
139
  MultiJson.decode(response.body)['locals']['key'].should == 'val'
120
140
  end
121
- end
141
+ end
@@ -0,0 +1,6 @@
1
+ class Song
2
+ attr_accessor :name
3
+ def initialize(name)
4
+ @name = name
5
+ end
6
+ end
data/spec/spec_helper.rb CHANGED
@@ -30,6 +30,7 @@ RSpec.configure do |c|
30
30
  def parse_json(str)
31
31
  Yajl::Parser.parse(str)
32
32
  end
33
+ alias :decode :parse_json
33
34
 
34
35
  # Jsonify a ruby object
35
36
  def jsonify(hash)
@@ -1,176 +1,157 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  ERROR_MESSAGES = { :attribute_lambda_one_argument => "You may only pass one argument to #attribute when using the block syntax.",
4
- :attribute_inferred_missing_one_argument => "#attribute can't be used when there is no current_object.",
5
- :attribute_more_than_two_arg => "You cannot pass more than two arguments to #attribute.",
6
- :attribute_inferred_missing_arity_too_large => "You cannot use a block of arity > 0 if current_object is not present.",
7
- :attributes_inferred_missing => "No current_object to apply #attributes to." }
8
-
9
- describe "Node#attributes" do
10
- let(:person) {
11
- Person.new('john', 25)
12
- }
13
- let(:node) { Bldr::Node.new(person) }
14
-
15
- it "returns stuff" do
16
- node.attribute(:age).should == node
17
- end
18
- end
4
+ :attribute_inferred_missing_one_argument => "#attribute can't be used when there is no current_object.",
5
+ :attribute_more_than_two_arg => "You cannot pass more than two arguments to #attribute.",
6
+ :attribute_inferred_missing_arity_too_large => "You cannot use a block of arity > 0 if current_object is not present.",
7
+ :attributes_inferred_missing => "No current_object to apply #attributes to." }
8
+
9
+ module Bldr
10
+ describe Node, "#attributes" do
11
+ let(:person) {
12
+ Person.new('john', 25)
13
+ }
14
+ let(:node) { Bldr::Node.new(person) }
19
15
 
20
- describe "Node#object" do
21
- context "rendering an object exactly as it exists" do
22
- it "renders the object exactly as it appears when passed an object with no block" do
23
- obj = {'key' => 'val', 'nested' => {'key' => 'val'}}
24
- node = node_wrap do
25
- object obj
26
- end
27
- node.result.should == obj
16
+ it "returns stuff" do
17
+ node.attribute(:age).should == node
28
18
  end
29
19
  end
30
20
 
31
- context "a zero arg root object node" do
21
+ describe Node, "#attribute" do
22
+ it "raises an exception when passed more than one argument and a block" do
23
+ expect {
24
+ Node.new {
25
+ attribute(:one, :two) do |person|
26
+ "..."
27
+ end
28
+ }
29
+ }.to raise_error(ArgumentError, ERROR_MESSAGES[:attribute_lambda_one_argument])
30
+ end
32
31
 
33
- def wrap(&block)
34
- Bldr::Node.new do
35
- object(&block)
36
- end
32
+ it "raises an exception when passed more than two args" do
33
+ expect {
34
+ Node.new {
35
+ attribute(:one, :two, :three)
36
+ }
37
+ }.to raise_error(ArgumentError, ERROR_MESSAGES[:attribute_more_than_two_arg])
37
38
  end
38
39
 
39
- describe "#attribute" do
40
- it "errors on a single argument" do
41
- expect {
42
- node_wrap {
43
- attribute(:one, :two) do |person|
44
- "..."
45
- end
46
- }
47
- }.to raise_error(ArgumentError, ERROR_MESSAGES[:attribute_lambda_one_argument])
40
+ it "errors on 1 argument since there is no inferred object" do
41
+ expect {
42
+ Node.new {
43
+ attribute(:one)
44
+ }
45
+ }.to raise_error(ArgumentError, ERROR_MESSAGES[:attribute_inferred_missing_one_argument])
46
+ end
47
+
48
+ describe "wrapped in an object block" do
49
+ it "renders 2 arguments statically" do
50
+ node = Node.new do
51
+ object :person do
52
+ attribute(:name, "alex")
53
+ end
54
+ end
55
+ node.result.should == {:person => {:name => 'alex'}}
48
56
  end
49
57
 
50
- it "errors on 3 arguments" do
51
- expect {
52
- node_wrap {
53
- attribute(:one, :two, :three)
54
- }
55
- }.to raise_error(ArgumentError, ERROR_MESSAGES[:attribute_more_than_two_arg])
58
+ it "renders 1 argument and one lambda with zero arity" do
59
+ node = Node.new do
60
+ object :person do
61
+ attribute(:name) { "alex" }
62
+ end
63
+ end
64
+ node.result.should == {:person => {:name => 'alex'}}
56
65
  end
57
66
 
58
- it "errors on 2 arguments and a lambda" do
59
- expect {
60
- node_wrap {
61
- attribute(:one, :two) do |person|
62
- "..."
63
- end
64
- }
65
- }.to raise_error(ArgumentError, ERROR_MESSAGES[:attribute_lambda_one_argument])
67
+ it "renders 1 argument to the inferred object" do
68
+ node = Node.new do
69
+ object :person => Person.new('alex', 25) do
70
+ attribute(:name)
71
+ end
72
+ end
73
+ node.result.should == {:person => {:name => 'alex'}}
66
74
  end
67
75
 
68
- it "errors on 1 argument since there is no inferred object" do
69
- expect {
70
- node_wrap {
71
- attribute(:one)
72
- }
73
- }.to raise_error(ArgumentError, ERROR_MESSAGES[:attribute_inferred_missing_one_argument])
76
+ it "renders 1 argument hash to the inferred object as the different key" do
77
+ node = Node.new do
78
+ object :person => Person.new('alex', 25) do
79
+ attribute(:fake => :name)
80
+ end
81
+ end
82
+ node.result.should == {:person => {:fake => 'alex'}}
74
83
  end
75
84
 
76
85
  it "renders 2 arguments statically" do
77
- node = wrap { attribute(:name, "alex") }
78
- node.result.should == {:name => 'alex'}
86
+ node = Node.new do
87
+ object :person => Person.new('alex', 25) do
88
+ attribute(:name, 'ian')
89
+ end
90
+ end
91
+ node.result.should == {:person => {:name => 'ian'}}
79
92
  end
80
93
 
81
94
  it "renders 1 argument and one lambda with zero arity" do
82
- node = wrap {
83
- attribute(:name) do
84
- "alex"
95
+ node = Node.new do
96
+ object :person => Person.new('alex', 25) do
97
+ attribute(:name) { 'ian' }
85
98
  end
86
- }
87
- node.result.should == {:name => 'alex'}
88
- end
99
+ end
89
100
 
90
- it "errors on 1 argument and one lambda with arity 1" do
91
- expect {
92
- node_wrap {
93
- attribute(:name) do |name|
94
- name
95
- end
96
- }
97
- }.to raise_error(ArgumentError, ERROR_MESSAGES[:attribute_inferred_missing_arity_too_large])
101
+ node.result.should == {:person => {:name => 'ian'}}
98
102
  end
99
103
 
100
- it "should render null attributes to null, not 'null'" do
101
- node = wrap { attribute(:name, nil) }
102
- node.result.should == {:name => nil}
103
- end
104
- end
104
+ it "renders 1 argument and one lambda with arity 1" do
105
+ node = Node.new do
106
+ object :person => Person.new('alex', 25) do
107
+ attribute(:name) { |person| person.name }
108
+ end
109
+ end
105
110
 
106
- describe "#attributes" do
107
- it "errors since current_object is nil" do
108
- expect {
109
- node_wrap {
110
- attributes(:name)
111
- }
112
- }.to raise_error(ArgumentError, ERROR_MESSAGES[:attributes_inferred_missing])
111
+ node.result.should == {:person => {:name => 'alex'}}
113
112
  end
114
- end
115
- end
116
113
 
117
- context "a single arg root object node" do
114
+ it "renders nil attributes" do
115
+ node = Node.new do
116
+ object :person => Person.new('alex') do
117
+ attribute :age
118
+ end
119
+ end
118
120
 
119
- def wrap(&block)
120
- Bldr::Node.new do
121
- object(:person, &block)
121
+ node.result.should == {:person => {:age => nil}}
122
122
  end
123
123
  end
124
124
 
125
- describe "#attribute" do
126
-
127
- it "errors on a single argument" do
128
- expect {
129
- node_wrap {
130
- attribute(:one, :two) do |person|
131
- "..."
132
- end
133
- }
134
- }.to raise_error(ArgumentError, ERROR_MESSAGES[:attribute_lambda_one_argument])
135
- end
136
- it "errors on 3 arguments" do
137
- expect {
138
- node_wrap {
139
- attribute(:one, :two, :three)
140
- }
141
- }.to raise_error(ArgumentError, ERROR_MESSAGES[:attribute_more_than_two_arg])
142
- end
143
- it "errors on 2 arguments and a lambda" do
144
- expect {
145
- node_wrap {
146
- attribute(:one, :two) do |person|
147
- "..."
148
- end
149
- }
150
- }.to raise_error(ArgumentError, ERROR_MESSAGES[:attribute_lambda_one_argument])
125
+ describe 'when in static key-value form (with two arguments)' do
126
+ it "renders 2 arguments statically as key, value" do
127
+ node = Node.new { attribute(:name, "alex") }
128
+ node.result.should == {:name => 'alex'}
151
129
  end
152
- it "errors on 1 argument since there is no inferred object" do
153
- expect {
154
- node_wrap {
155
- attribute(:one)
156
- }
157
- }.to raise_error(ArgumentError, ERROR_MESSAGES[:attribute_inferred_missing_one_argument])
130
+
131
+ it "renders null attributes to null, not 'null'" do
132
+ node = Node.new { attribute(:name, nil) }
133
+ node.result.should == {:name => nil}
158
134
  end
159
- it "renders 2 arguments statically" do
160
- node = wrap { attribute(:name, "alex") }
161
- node.result.should == {:person => {:name => 'alex'}}
135
+ end
136
+
137
+ describe 'when in dynamic block form (with 1 argument and a block)' do
138
+ it 'sets the attribute default context to bldr node' do
139
+ node = Node.new { attribute(:key) { self.class } }
140
+ node.result[:key].should == ::Bldr::Node
162
141
  end
163
- it "renders 1 argument and one lambda with zero arity" do
164
- node = wrap {
142
+
143
+ it "uses the argument as the key and the block result as the value" do
144
+ node = Node.new {
165
145
  attribute(:name) do
166
146
  "alex"
167
147
  end
168
148
  }
169
- node.result.should == {:person => {:name => 'alex'}}
149
+ node.result.should == {:name => 'alex'}
170
150
  end
151
+
171
152
  it "errors on 1 argument and one lambda with arity 1" do
172
153
  expect {
173
- node_wrap {
154
+ Node.new {
174
155
  attribute(:name) do |name|
175
156
  name
176
157
  end
@@ -179,520 +160,550 @@ describe "Node#object" do
179
160
  end
180
161
  end
181
162
 
182
- describe "#attributes" do
163
+ end
183
164
 
184
- it "errors since current_object is nil" do
185
- expect {
186
- node_wrap {
187
- attributes(:name)
188
- }
189
- }.to raise_error(ArgumentError, ERROR_MESSAGES[:attributes_inferred_missing])
165
+ describe Node, "#object" do
166
+ it 'is passes block the block variable to the block' do
167
+ denver = Person.new('John Denver')
168
+ node = Node.new do
169
+ object :person => denver do |jd|
170
+ attribute(:name) { jd.name }
171
+ end
190
172
  end
191
173
 
174
+ node.result.should == {:person => {:name => 'John Denver'}}
192
175
  end
193
176
 
194
- end
177
+ context "rendering an object exactly as it exists" do
178
+ it "renders the object exactly as it appears when passed an object with no block" do
179
+ obj = {'key' => 'val', 'nested' => {'key' => 'val'}}
180
+ node = node_wrap do
181
+ object obj
182
+ end
183
+ node.result.should == obj
184
+ end
185
+ end
186
+
187
+ context "a zero arg root object node" do
195
188
 
196
- context "a hash-arg root object node" do
189
+ def wrap(&block)
190
+ Bldr::Node.new do
191
+ object(&block)
192
+ end
193
+ end
197
194
 
198
- def wrap(&block)
199
- alex = Person.new('alex').tap { |p| p.age = 25; p }
200
- Bldr::Node.new do
201
- object(:person => alex, &block)
195
+ describe "#attributes" do
196
+ it "errors since current_object is nil" do
197
+ expect {
198
+ node_wrap {
199
+ attributes(:name)
200
+ }
201
+ }.to raise_error(ArgumentError, ERROR_MESSAGES[:attributes_inferred_missing])
202
+ end
202
203
  end
203
204
  end
204
205
 
205
- describe "#attribute" do
206
- it "works at the root level" do
207
- node_wrap {
208
- attribute(:foo) { "bar" }
209
- }.result.should == {:foo => 'bar'}
206
+ context "a single arg root object node" do
207
+
208
+ def wrap(&block)
209
+ Bldr::Node.new do
210
+ object(:person, &block)
211
+ end
210
212
  end
211
213
 
212
- it "errors on 3 arguments" do
213
- expect {
214
- node_wrap {
215
- attribute(:one, :two, :three)
216
- }
217
- }.to raise_error(ArgumentError, ERROR_MESSAGES[:attribute_more_than_two_arg])
214
+ describe "#attributes" do
215
+
216
+ it "errors since current_object is nil" do
217
+ expect {
218
+ node_wrap {
219
+ attributes(:name)
220
+ }
221
+ }.to raise_error(ArgumentError, ERROR_MESSAGES[:attributes_inferred_missing])
222
+ end
218
223
  end
219
- it "errors on 2 arguments and a lambda" do
220
- expect {
221
- node_wrap {
222
- attribute(:one, :two) do |person|
223
- "..."
224
+ end
225
+
226
+ context "a hash-arg root object node" do
227
+ def wrap(&block)
228
+ alex = Person.new('alex').tap { |p| p.age = 25; p }
229
+ Bldr::Node.new do
230
+ object(:person => alex, &block)
231
+ end
232
+ end
233
+
234
+
235
+ describe "#attributes" do
236
+ describe "when an object key is passed a null value" do
237
+ subject {
238
+ node = node_wrap do
239
+ object(:person => nil) do
240
+ attributes(:one, :two) do |person|
241
+ "..."
242
+ end
243
+ end
224
244
  end
225
245
  }
226
- }.to raise_error(ArgumentError, ERROR_MESSAGES[:attribute_lambda_one_argument])
227
- end
228
- it "renders 1 argument to the inferred object" do
229
- node = wrap { attribute(:name) }
230
- node.result.should == {:person => {:name => 'alex'}}
231
- end
232
- it "renders 1 argument hash to the inferred object as the different key" do
233
- node = wrap { attribute(:fake => :name) }
234
- node.result.should == {:person => {:fake => 'alex'}}
235
- end
236
- it "renders 2 arguments statically" do
237
- node = wrap { attribute(:name, "ian") }
238
- node.result.should == {:person => {:name => 'ian'}}
239
- end
240
- it "renders 1 argument and one lambda with zero arity" do
241
- node = wrap { attribute(:name){"ian"} }
242
- node.result.should == {:person => {:name => 'ian'}}
243
- end
244
- it "renders 1 argument and one lambda with arity 1" do
245
- node = wrap { attribute(:name){|person| person.name} }
246
- node.result.should == {:person => {:name => 'alex'}}
247
- end
248
- it "renders nil attributes" do
249
- node = node_wrap do
250
- object :person => Person.new('alex') do
251
- attribute :age
252
- end
253
- end
254
246
 
255
- node.result.should == {:person => {:age => nil}}
256
- end
247
+ it "does not raise an inferred object error" do
248
+ expect {
249
+ subject
250
+ }.not_to raise_error(ArgumentError, ERROR_MESSAGES[:attributes_inferred_missing])
251
+ end
257
252
 
258
- end
253
+ its(:result) { should == {} }
254
+ end
259
255
 
260
- describe "#attributes" do
261
- describe "when an object key is passed a null value" do
262
- subject {
256
+ it "renders each argument against the inferred object" do
257
+ node = wrap { attributes(:name, :age) }
258
+ node.result.should == {:person => {:name => 'alex', :age => 25}}
259
+ end
260
+ it "renders nil attributes" do
263
261
  node = node_wrap do
264
- object(:person => nil) do
265
- attributes(:one, :two) do |person|
266
- "..."
267
- end
262
+ object :person => Person.new('alex') do
263
+ attributes :name, :age
268
264
  end
269
265
  end
270
- }
271
266
 
272
- it "does not raise an inferred object error" do
273
- expect {
274
- subject
275
- }.not_to raise_error(ArgumentError, ERROR_MESSAGES[:attributes_inferred_missing])
267
+ node.result.should == {:person => {:name => 'alex', :age => nil}}
276
268
  end
277
269
 
278
- its(:result) { should == {} }
279
270
  end
280
271
 
281
- it "renders each argument against the inferred object" do
282
- node = wrap { attributes(:name, :age) }
283
- node.result.should == {:person => {:name => 'alex', :age => 25}}
284
- end
285
- it "renders nil attributes" do
272
+ end
273
+
274
+ describe "embedded objects" do
275
+ it "evaluates the block and returns json" do
286
276
  node = node_wrap do
287
- object :person => Person.new('alex') do
288
- attributes :name, :age
277
+ object(:dude => Person.new("alex")) do
278
+ attributes :name
279
+
280
+ object(:bro => Person.new("john")) do
281
+ attributes :name
282
+ end
289
283
  end
290
284
  end
291
285
 
292
- node.result.should == {:person => {:name => 'alex', :age => nil}}
286
+ node.result.should == {:dude => {:name => 'alex', :bro => {:name => 'john'}}}
293
287
  end
294
-
295
288
  end
296
289
 
297
290
  end
298
291
 
299
- describe "embedded objects" do
300
- it "evaluates the block and returns json" do
292
+ describe "Node#result" do
293
+ it "returns an empty hash when not passed an object" do
294
+ Bldr::Node.new.result.should == {}
295
+ end
296
+
297
+ it "a document with a single node with no nesting" do
301
298
  node = node_wrap do
302
- object(:dude => Person.new("alex")) do
299
+ object :person => Person.new('alex') do
303
300
  attributes :name
304
-
305
- object(:bro => Person.new("john")) do
306
- attributes :name
307
- end
308
301
  end
309
302
  end
310
303
 
311
- node.result.should == {:dude => {:name => 'alex', :bro => {:name => 'john'}}}
304
+ node.result.should == {:person => {:name => 'alex'}}
312
305
  end
313
- end
314
306
 
315
- end
307
+ it "works for multiple top-level objects" do
308
+ alex, john = Person.new("alex"), Person.new("john")
316
309
 
317
- describe "Node#result" do
318
- it "returns an empty hash when not passed an object" do
319
- Bldr::Node.new.result.should == {}
320
- end
310
+ node = node_wrap do
311
+ object(:alex => alex) do
312
+ attributes :name
313
+ end
321
314
 
322
- it "a document with a single node with no nesting" do
323
- node = node_wrap do
324
- object :person => Person.new('alex') do
325
- attributes :name
315
+ object(:john => john) do
316
+ attributes :name
317
+ end
326
318
  end
327
- end
328
319
 
329
- node.result.should == {:person => {:name => 'alex'}}
330
- end
320
+ node.result.should == {:alex => {:name => 'alex'}, :john => {:name => 'john'}}
321
+ end
331
322
 
332
- it "works for multiple top-level objects" do
333
- alex, john = Person.new("alex"), Person.new("john")
323
+ it "recursively renders nested objects" do
324
+ node = node_wrap do
325
+ object :alex => Person.new("alex") do
326
+ attributes :name
334
327
 
335
- node = node_wrap do
336
- object(:alex => alex) do
337
- attributes :name
328
+ object :friend => Person.new("john") do
329
+ attributes :name
330
+ end
331
+ end
338
332
  end
339
333
 
340
- object(:john => john) do
341
- attributes :name
342
- end
334
+ node.result.should == {
335
+ :alex => {
336
+ :name => 'alex', :friend => {:name => 'john'}
337
+ }
338
+ }
343
339
  end
344
340
 
345
- node.result.should == {:alex => {:name => 'alex'}, :john => {:name => 'john'}}
346
- end
347
-
348
- it "recursively renders nested objects" do
349
- node = node_wrap do
350
- object :alex => Person.new("alex") do
351
- attributes :name
341
+ describe "#attributes syntax" do
342
+ it "allows a hash to be sent where the keys are the result keys" do
343
+ alex = Person.new("alex").tap do |p|
344
+ p.age = 25
345
+ p
346
+ end
352
347
 
353
- object :friend => Person.new("john") do
354
- attributes :name
348
+ node = node_wrap do
349
+ object(:person => alex) do
350
+ attributes({:surname => :name}, :age)
351
+ end
355
352
  end
353
+
354
+ node.result.should == {:person => {:surname => 'alex', :age => 25}}
356
355
  end
357
356
  end
358
-
359
- node.result.should == {
360
- :alex => {
361
- :name => 'alex',
362
- :friend => {:name => 'john'}
363
- }
364
- }
365
357
  end
366
358
 
367
- describe "#attributes syntax" do
368
- it "allows a hash to be sent where the keys are the result keys" do
369
- alex = Person.new("alex").tap do |p|
370
- p.age = 25
371
- p
372
- end
373
-
359
+ describe Node, "#to_json" do
360
+ it "recursively returns the result json" do
374
361
  node = node_wrap do
375
- object(:person => alex) do
376
- attributes({:surname => :name}, :age)
362
+ object :person => Person.new("alex") do
363
+ attributes :name
364
+
365
+ object :friend => Person.new("pete", 30) do
366
+ attributes :name, :age
367
+ end
377
368
  end
378
369
  end
379
370
 
380
- node.result.should == {:person => {:surname => 'alex', :age => 25}}
371
+ node.result.should == {
372
+ :person => {
373
+ :name => 'alex',
374
+ :friend => {:name => 'pete', :age => 30}
375
+ }
376
+ }
381
377
  end
382
- end
383
- end
384
378
 
385
- describe "Node#to_json" do
386
- it "recursively returns the result json" do
387
- node = node_wrap do
388
- object :person => Person.new("alex") do
389
- attributes :name
390
-
391
- object :friend => Person.new("pete", 30) do
379
+ it "returns null values for nil attributes" do
380
+ node = node_wrap do
381
+ object :person => Person.new('alex') do
392
382
  attributes :name, :age
393
383
  end
394
384
  end
395
- end
396
385
 
397
- node.result.should == {
398
- :person => {
399
- :name => 'alex',
400
- :friend => {:name => 'pete', :age => 30}
401
- }
402
- }
386
+ node.result[:person].should have_key(:age)
387
+ node.result[:person][:age].should be_nil
388
+ end
403
389
  end
404
390
 
405
- it "returns null values for nil attributes" do
406
- node = node_wrap do
407
- object :person => Person.new('alex') do
408
- attributes :name, :age
391
+ describe Node, "#collection" do
392
+ context "when passed an object with no block" do
393
+ it "renders the object exactly as it exists" do
394
+ coll = [{'key' => 'val'}]
395
+ node = node_wrap do
396
+ collection coll
397
+ end
398
+
399
+ node.result.should == coll
409
400
  end
410
- end
411
401
 
412
- node.result[:person].should have_key(:age)
413
- node.result[:person][:age].should be_nil
414
- end
415
- end
402
+ it "renders complex collection objects correctly" do
403
+ hobbies = [{'name' => "Gym"}, {'name' => "Tan"}, {'name' => "Laundry"}]
416
404
 
417
- describe "Node#collection" do
418
- context "when passed an object with no block" do
419
- it "renders the object exactly as it exists" do
420
- coll = [{'key' => 'val'}]
421
- node = node_wrap do
422
- collection coll
423
- end
405
+ node = node_wrap do
406
+ object 'person' => Person.new("Alex") do
407
+ attribute :name
408
+ collection 'hobbies' => hobbies
409
+ end
410
+ end
424
411
 
425
- node.result.should == coll
412
+ node.result.should == {'person' => {:name => "Alex", 'hobbies' => hobbies}}
413
+ end
426
414
  end
427
415
 
428
- it "renders complex collection objects correctly" do
429
- hobbies = [{'name' => "Gym"}, {'name' => "Tan"}, {'name' => "Laundry"}]
416
+ it "iterates through the collection and passes each item as a block variable" do
417
+ denver = Person.new('John Denver')
418
+ songs = [Song.new('Rocky Mountain High'), Song.new('Take Me Home, Country Roads')]
430
419
 
431
- node = node_wrap do
432
- object 'person' => Person.new("Alex") do
420
+ node = Node.new do
421
+ object :artist => denver do
433
422
  attribute :name
434
- collection 'hobbies' => hobbies
423
+
424
+ collection :songs => songs do |song|
425
+ attribute(:name) { song.name }
426
+ end
435
427
  end
436
428
  end
437
429
 
438
- node.result.should == {'person' => {:name => "Alex", 'hobbies' => hobbies}}
430
+ node.result.should == {
431
+ :artist => {:name => 'John Denver',
432
+ :songs => [{:name => 'Rocky Mountain High'},
433
+ {:name => 'Take Me Home, Country Roads'}
434
+ ]
435
+ }
436
+ }
439
437
  end
440
- end
441
-
442
- it "iterates through the collection and renders them as nodes" do
443
- node = node_wrap do
444
- object :person => Person.new('alex', 26) do
445
- attributes :name, :age
446
438
 
447
- collection :friends => [Person.new('john', 24), Person.new('jeff', 25)] do
439
+ it "iterates through the collection and renders them as nodes" do
440
+ node = node_wrap do
441
+ object :person => Person.new('alex', 26) do
448
442
  attributes :name, :age
443
+
444
+ collection :friends => [Person.new('john', 24), Person.new('jeff', 25)] do
445
+ attributes :name, :age
446
+ end
449
447
  end
450
448
  end
451
- end
452
449
 
453
- node.result.should == {
454
- :person => {
455
- :name => 'alex', :age => 26,
456
- :friends => [{:name => 'john', :age => 24}, {:name => 'jeff', :age => 25}]
450
+ node.result.should == {
451
+ :person => {
452
+ :name => 'alex', :age => 26,
453
+ :friends => [
454
+ {:name => 'john', :age => 24},
455
+ {:name => 'jeff', :age => 25}]
456
+ }
457
457
  }
458
- }
459
- end
460
-
461
- # @todo fix this
462
- it "renders properly when a collection is the named root node" do
463
- nodes = node_wrap do
464
- collection :people => [Person.new('bert'), Person.new('ernie')] do
465
- attributes :name
466
- end
467
458
  end
468
459
 
469
- nodes.result.should == {:people => [{:name => 'bert'}, {:name => 'ernie'}]}
470
- end
471
-
472
- it "renders properly when a collection is the root node" do
473
- nodes = node_wrap do
474
- collection [Person.new('bert'), Person.new('ernie')] do
475
- attributes :name
460
+ # @todo fix this
461
+ it "renders properly when a collection is the named root node" do
462
+ nodes = node_wrap do
463
+ collection :people => [Person.new('bert'), Person.new('ernie')] do
464
+ attributes :name
465
+ end
476
466
  end
477
- end
478
-
479
- nodes.result.should == [{:name => 'bert'}, {:name => 'ernie'}]
480
- end
481
467
 
482
- it "gracefully handles empty collections" do
483
- nodes = node_wrap do
484
- collection :people => [] do
485
- attributes :name
486
- end
468
+ nodes.result.should == {:people => [{:name => 'bert'}, {:name => 'ernie'}]}
487
469
  end
488
470
 
489
- nodes.result.should == {:people => []}
490
- end
491
-
492
- it "gracefully handles nil collections" do
493
- nodes = node_wrap do
494
- collection :people => nil do
495
- attributes :name
471
+ it "renders properly when a collection is the root node" do
472
+ nodes = node_wrap do
473
+ collection [Person.new('bert'), Person.new('ernie')] do
474
+ attributes :name
475
+ end
496
476
  end
497
- end
498
477
 
499
- nodes.result.should == {:people => []}
500
- end
478
+ nodes.result.should == [{:name => 'bert'}, {:name => 'ernie'}]
479
+ end
501
480
 
502
- it "renders nested collections properly" do
503
- post = Post.new("my post")
504
- post.comments << Comment.new('my comment')
481
+ it "gracefully handles empty collections" do
482
+ nodes = node_wrap do
483
+ collection :people => [] do
484
+ attributes :name
485
+ end
486
+ end
505
487
 
506
- nodes = node_wrap do
507
- collection :posts => [post] do
508
- attributes :title
509
- attribute(:comment_count) { |post| post.comments.count }
488
+ nodes.result.should == {:people => []}
489
+ end
510
490
 
511
- collection :comments => current_object.comments do
512
- attributes :body
491
+ it "gracefully handles nil collections" do
492
+ nodes = node_wrap do
493
+ collection :people => nil do
494
+ attributes :name
513
495
  end
514
496
  end
515
- end
516
497
 
517
- nodes.result.should == {
518
- :posts => [
519
- {:title => 'my post', :comment_count => 1, :comments => [{:body => 'my comment'}]}
520
- ]
521
- }
522
- end
498
+ nodes.result.should == {:people => []}
499
+ end
523
500
 
524
- it "renders objects nested in collections properly" do
525
- post = Post.new 'foo'
526
- post.author = Author.new('John Doe')
527
- posts = [post]
501
+ it "renders nested collections properly" do
502
+ post = Post.new("my post")
503
+ post.comments << Comment.new('my comment')
528
504
 
529
- nodes = node_wrap do
530
- collection :data => posts do
531
- attributes :title
505
+ nodes = node_wrap do
506
+ collection :posts => [post] do |post|
507
+ attributes :title
508
+ attribute(:comment_count) { |post| post.comments.count }
532
509
 
533
- object :author => current_object.author do
534
- attributes :name
510
+ collection :comments => post.comments do
511
+ attributes :body
512
+ end
535
513
  end
536
514
  end
537
- end
538
515
 
539
- nodes.result.should == {
540
- :data => [
541
- {:title => 'foo', :author => {:name => 'John Doe'}}
542
- ]
543
- }
544
- end
516
+ nodes.result.should == {
517
+ :posts => [
518
+ {:title => 'my post', :comment_count => 1, :comments => [{:body => 'my comment'}]}
519
+ ]
520
+ }
521
+ end
545
522
 
546
- it "renders nested collections with dynamic property values correctly" do
547
- post1 = Post.new("post 1")
548
- post2 = Post.new("post 2")
549
- post1.comments << Comment.new('post 1 comment')
550
- post2.comments << Comment.new('post 2 first comment')
551
- post2.comments << Comment.new('post 2 second comment')
523
+ it "renders objects nested in collections properly" do
524
+ post = Post.new 'foo'
525
+ post.author = Author.new('John Doe')
526
+ posts = [post]
552
527
 
553
- nodes = node_wrap do
554
- collection :posts => [post1, post2] do
555
- attributes :title
556
- attribute(:comment_count) { |post| post.comments.count }
528
+ nodes = node_wrap do
529
+ collection :data => posts do |post|
530
+ attributes :title
557
531
 
558
- collection :comments => current_object.comments do
559
- attributes :body
532
+ object :author => post.author do
533
+ attributes :name
534
+ end
560
535
  end
561
536
  end
537
+
538
+ nodes.result.should == {
539
+ :data => [
540
+ {:title => 'foo', :author => {:name => 'John Doe'}}
541
+ ]
542
+ }
562
543
  end
563
544
 
564
- nodes.result.should == {
565
- :posts => [
566
- {
567
- :title => 'post 1',
568
- :comment_count => 1,
569
- :comments => [{:body => 'post 1 comment'}]
570
- },
571
- {
572
- :title => 'post 2',
573
- :comment_count => 2,
574
- :comments => [{:body => 'post 2 first comment'}, {:body => 'post 2 second comment'}]
575
- }
576
- ]
577
- }
578
- end
545
+ it "renders nested collections with dynamic property values correctly" do
546
+ post1 = Post.new("post 1")
547
+ post2 = Post.new("post 2")
548
+ post1.comments << Comment.new('post 1 comment')
549
+ post2.comments << Comment.new('post 2 first comment')
550
+ post2.comments << Comment.new('post 2 second comment')
579
551
 
580
- it "allows root level attributes using local variables" do
581
- node = node_wrap do
582
- name = "john doe"
583
- age = 25
552
+ nodes = node_wrap do
553
+ collection :posts => [post1, post2] do |post|
554
+ attributes :title
555
+ attribute(:comment_count) { |post| post.comments.count }
584
556
 
585
- object do
586
- attribute(:name) { name }
587
- attribute(:age) { age }
557
+ collection :comments => post.comments do
558
+ attributes :body
559
+ end
560
+ end
588
561
  end
562
+
563
+ nodes.result.should == {
564
+ :posts => [
565
+ {
566
+ :title => 'post 1',
567
+ :comment_count => 1,
568
+ :comments => [{:body => 'post 1 comment'}]
569
+ },
570
+ {
571
+ :title => 'post 2',
572
+ :comment_count => 2,
573
+ :comments => [{:body => 'post 2 first comment'}, {:body => 'post 2 second comment'}]
574
+ }
575
+ ]
576
+ }
589
577
  end
590
578
 
591
- node.result.should == {:name => 'john doe', :age => 25}
592
- end
579
+ it "allows root level attributes using local variables" do
580
+ node = node_wrap do
581
+ name = "john doe"
582
+ age = 25
593
583
 
594
- end
584
+ object do
585
+ attribute(:name) { name }
586
+ attribute(:age) { age }
587
+ end
588
+ end
595
589
 
596
- describe "Node#template" do
597
- it "includes the partial as a top level" do
598
- nodes = node_wrap do
599
- template "spec/fixtures/partial.json.bldr"
590
+ node.result.should == {:name => 'john doe', :age => 25}
600
591
  end
601
592
 
602
- nodes.result.should == {:foo => "bar"}
603
593
  end
604
-
605
- it "includes the partial on a top level object" do
606
- nodes = node_wrap do
607
- object :container do
608
- attribute(:blah) { "baz" }
609
- template "spec/fixtures/partial.json.bldr"
610
- end
611
- end
612
594
 
613
- nodes.result.should == {:container => {:blah => "baz", :foo => "bar"}}
614
- end
615
-
616
- it "includes the partial on a top level collection" do
617
- nodes = node_wrap do
618
- collection :people => [Person.new('bert'), Person.new('ernie')] do
619
- attribute(:blah) { "baz" }
595
+ describe Node, "#template" do
596
+ it "includes the partial as a top level" do
597
+ nodes = node_wrap do
620
598
  template "spec/fixtures/partial.json.bldr"
621
599
  end
600
+
601
+ nodes.result.should == {:foo => "bar"}
622
602
  end
623
603
 
624
- nodes.result.should == {:people => [{:blah => "baz", :foo => 'bar'}, {:blah => "baz", :foo => 'bar'}]}
625
- end
626
-
627
- it "includes the partial on a sub object" do
628
- nodes = node_wrap do
629
- object :container do
630
- object :sub do
604
+ it "includes the partial on a top level object" do
605
+ nodes = node_wrap do
606
+ object :container do
631
607
  attribute(:blah) { "baz" }
632
608
  template "spec/fixtures/partial.json.bldr"
633
609
  end
634
610
  end
611
+
612
+ nodes.result.should == {:container => {:blah => "baz", :foo => "bar"}}
635
613
  end
636
614
 
637
- nodes.result.should == {:container => {:sub => {:blah => "baz", :foo => "bar"}}}
638
- end
639
-
640
- it "includes the partial on a sub collection" do
641
- nodes = node_wrap do
642
- object :container do
615
+ it "includes the partial on a top level collection" do
616
+ nodes = node_wrap do
643
617
  collection :people => [Person.new('bert'), Person.new('ernie')] do
644
618
  attribute(:blah) { "baz" }
645
619
  template "spec/fixtures/partial.json.bldr"
646
620
  end
647
621
  end
622
+
623
+ nodes.result.should == {:people => [{:blah => "baz", :foo => 'bar'}, {:blah => "baz", :foo => 'bar'}]}
648
624
  end
649
625
 
650
- nodes.result.should == {:container => {:people => [{:blah => "baz", :foo => 'bar'}, {:blah => "baz", :foo => 'bar'}]}}
651
- end
652
-
653
- it "includes both the partials" do
654
- nodes = node_wrap do
655
- object :container do
656
- template "spec/fixtures/partial.json.bldr"
657
- object :sub do
658
- attribute(:blah) { "baz" }
659
- template "spec/fixtures/partial.json.bldr"
626
+ it "includes the partial on a sub object" do
627
+ nodes = node_wrap do
628
+ object :container do
629
+ object :sub do
630
+ attribute(:blah) { "baz" }
631
+ template "spec/fixtures/partial.json.bldr"
632
+ end
660
633
  end
661
634
  end
635
+
636
+ nodes.result.should == {:container => {:sub => {:blah => "baz", :foo => "bar"}}}
662
637
  end
663
638
 
664
- nodes.result.should == {:container => {:foo => "bar", :sub => {:blah => "baz", :foo => "bar"}}}
665
- end
666
-
667
- it "includes the partial with the locals" do
668
- Obj = Struct.new(:foo)
669
- nodes = node_wrap do
670
- template "spec/fixtures/partial_with_locals.json.bldr", :locals => {:obj => Obj.new('test')}
639
+ it "includes the partial on a sub collection" do
640
+ nodes = node_wrap do
641
+ object :container do
642
+ collection :people => [Person.new('bert'), Person.new('ernie')] do
643
+ attribute(:blah) { "baz" }
644
+ template "spec/fixtures/partial.json.bldr"
645
+ end
646
+ end
647
+ end
648
+
649
+ nodes.result.should == {:container => {:people => [{:blah => "baz", :foo => 'bar'}, {:blah => "baz", :foo => 'bar'}]}}
671
650
  end
672
651
 
673
- nodes.result.should == {:name => {:foo => 'test'}}
674
- end
675
-
676
- it "raises an error when the partial isn't found" do
677
- expect {
652
+ it "includes both the partials" do
653
+ nodes = node_wrap do
654
+ object :container do
655
+ template "spec/fixtures/partial.json.bldr"
656
+ object :sub do
657
+ attribute(:blah) { "baz" }
658
+ template "spec/fixtures/partial.json.bldr"
659
+ end
660
+ end
661
+ end
662
+
663
+ nodes.result.should == {:container => {:foo => "bar", :sub => {:blah => "baz", :foo => "bar"}}}
664
+ end
665
+
666
+ it "includes the partial with the locals" do
667
+ Obj = Struct.new(:foo)
678
668
  nodes = node_wrap do
679
- template "unknown/path"
669
+ template "spec/fixtures/partial_with_locals.json.bldr", :locals => {:obj => Obj.new('test')}
680
670
  end
681
- }.to raise_error(Errno::ENOENT)
682
- end
683
-
684
- it "doesn't raise an error when with a base path option specified and the right file" do
685
- nodes = node_wrap nil, :views => 'spec/fixtures/some' do
686
- object :foo do
687
- template "include"
671
+
672
+ nodes.result.should == {:name => {:foo => 'test'}}
673
+ end
674
+
675
+ it "raises an error when the partial isn't found" do
676
+ expect {
677
+ nodes = node_wrap do
678
+ template "unknown/path"
679
+ end
680
+ }.to raise_error(Errno::ENOENT)
681
+ end
682
+
683
+ it "doesn't raise an error when with a base path option specified and the right file" do
684
+ nodes = node_wrap nil, :views => 'spec/fixtures/some' do
685
+ object :foo do
686
+ template "include"
687
+ end
688
688
  end
689
689
  end
690
690
  end
691
- end
692
691
 
693
- describe "Node#locals" do
694
- let(:node) { Bldr::Node.new({:foo => 'bar'}, :locals => {:key => 'val'})}
695
- subject { node.locals }
692
+ describe Node, "#locals" do
693
+ let(:node) { Bldr::Node.new({:foo => 'bar'}, :locals => {:key => 'val'})}
694
+ subject { node.locals }
696
695
 
697
- it { should == {:key => 'val'} }
696
+ it { should == {:key => 'val'} }
697
+ end
698
+
699
+ describe Node, '#current_object' do
700
+ it 'returns the node value' do
701
+ Node.new('hey').current_object.should == 'hey'
702
+ end
703
+
704
+ it 'displays a deprecation warning' do
705
+ Object.any_instance.should_receive(:warn).with("[DEPRECATION] `current_object` is deprecated. Please use object or collection block varibles instead.")
706
+ Node.new.current_object
707
+ end
708
+ end
698
709
  end