bldr 0.6.0 → 0.7.0

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.
data/.travis.yml CHANGED
@@ -1,5 +1,4 @@
1
1
  rvm:
2
2
  - 1.9.3
3
- - ree
4
3
  - ruby-head
5
- - rbx
4
+ - rbx-19mode
data/Gemfile CHANGED
@@ -6,4 +6,5 @@ gem "rake"
6
6
 
7
7
  group :test do
8
8
  gem "rspec", ">= 2.6.0"
9
+ gem 'debugger', :platform => :mri_19
9
10
  end
data/HISTORY.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## 0.7.0 (2013-xx-xx)
2
+ * Support for inherited instance variables
3
+ * Breaking change: Node#attribute block syntax no longer inherits
4
+ context from current_object. See 941608e7 for more
5
+ * Breaking change: Drop ruby 1.8 support
6
+
7
+ ## 0.6.1 (2013-02-18) -- yanked
8
+ * Feature: Add the ability to access instance variables set in sinatra
9
+ actions in bldr templates.
10
+
1
11
  ## 0.6.0 (2012-xx-xx)
2
12
  * Feature: Add the ability to pass-through objects directly to `object` and
3
13
  `collection` DSL methods
@@ -21,4 +31,4 @@
21
31
  * Add new `attribute` inferred object syntax (@ihunter)
22
32
 
23
33
  ## 0.1.2 (2011-09-08)
24
- * Return an empty collection when a nil value is passed to `collection` method
34
+ * Return an empty collection when a nil value is passed to `collection` method
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2011-2012 Alex Sharp
1
+ Copyright (c) 2011-2013 Alex Sharp
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- [![Build Status](http://travis-ci.org/ajsharp/bldr.png)](http://travis-ci.org/ajsharp/bldr)
1
+ [![Build Status](https://travis-ci.org/ajsharp/bldr.png)](https://travis-ci.org/ajsharp/bldr)
2
2
 
3
3
 
4
4
  # Bldr
@@ -52,6 +52,75 @@ end
52
52
 
53
53
  See the [Documentation & Examples](https://github.com/ajsharp/bldr/wiki/Documentation-&-Examples) page on the wiki.
54
54
 
55
+ ## Deprecations & Breaking Changes
56
+
57
+ ### 0.7.0: current_object deprecation
58
+
59
+ The use of `current_object` is now deprecated. Instead of referencing `current_object` in bldr templates
60
+ use block variables in `object` and `collection` methods:
61
+
62
+ ```ruby
63
+ # OLD (deprecated)
64
+ collection :people => people do
65
+ attribute(:name) { current_object.name }
66
+ end
67
+
68
+ # NEW
69
+ collection :people => people do |person|
70
+ attribute(:name) { person.name }
71
+ end
72
+ ```
73
+
74
+ Make use of block variables the same way for the `object` method:
75
+
76
+ ```ruby
77
+ # OLD (deprecated)
78
+ object :person => person do
79
+ attributes :name, :age
80
+
81
+ person = current_object
82
+ object :address => person.address do
83
+ # current_object here would be assigned to person.address
84
+ attribute(:zip) { current_object.zip_code }
85
+ attribute(:address_title) { person.display_name }
86
+ end
87
+ end
88
+
89
+ # NEW
90
+ object :person => person do |person|
91
+ attributes :name, :age
92
+
93
+ object :adress => person.address do |address|
94
+ attribute(:zip) { address.zip_code }
95
+ attribute(:address_title) { person.display_name }
96
+ end
97
+ end
98
+ ```
99
+
100
+ ### 0.7.0: attribute method breaking change
101
+
102
+ One of the forms of the `attribute` method has changed in the 0.7.0 release.
103
+ Previously, using the dynamic block form of `attribute`, if you did not pass
104
+ in a block variable, the block would be eval'd in context of the `current_object`.
105
+ This behavior fails the "principle of least surprise" test.
106
+
107
+ 0.7.0 changes this behavior by simply executing the block in context of `Bldr::Node`, which provides
108
+ access to instance variables and locals available in that context.
109
+
110
+ ```ruby
111
+ # OLD
112
+ object :person => person do
113
+ attribute(:name) { display_name } # equivalent to doing attribute(:name) { |person| person.display_name }
114
+ end
115
+
116
+ # NEW
117
+ object :person => @person do
118
+ attribute(:name) { @person.display_name }
119
+ end
120
+ ```
121
+
122
+ See [941608e](https://github.com/ajsharp/bldr/commit/d0bfbd8) and [d0bfbd8](https://github.com/ajsharp/bldr/commit/d0bfbd8) for more info.
123
+
55
124
  ## Editor Syntax Support
56
125
 
57
126
  To get proper syntax highlighting in vim, add this line to your .vimrc:
@@ -75,8 +144,9 @@ au BufRead,BufNewFile *.bldr set filetype=ruby
75
144
 
76
145
  * Ian Hunter (@ihunter)
77
146
  * Justin Smestad (@jsmestad)
147
+ * Adam LaFave (@lafave)
78
148
 
79
149
  ## Copyright
80
150
 
81
- Copyright (c) 2011-2012 Alex Sharp. See the MIT-LICENSE file for full
151
+ Copyright (c) 2011-2013 Alex Sharp. See the MIT-LICENSE file for full
82
152
  copyright information.
data/bldr.gemspec CHANGED
@@ -22,8 +22,8 @@ Gem::Specification.new do |s|
22
22
  s.add_dependency 'multi_json'
23
23
 
24
24
  s.add_development_dependency 'json_pure'
25
- s.add_development_dependency 'sinatra', '~>1.2.6'
26
- s.add_development_dependency 'tilt', '~>1.3.2'
25
+ s.add_development_dependency 'sinatra'
26
+ s.add_development_dependency 'tilt'
27
27
  s.add_development_dependency 'yajl-ruby', '>= 1.0'
28
- s.add_development_dependency 'actionpack', '~> 3.0.7'
28
+ s.add_development_dependency 'actionpack'
29
29
  end
data/lib/bldr/node.rb CHANGED
@@ -3,6 +3,8 @@ module Bldr
3
3
 
4
4
  class Node
5
5
 
6
+ PROTECTED_IVARS = [:@current_object, :@result, :@parent, :@opts, :@views, :@locals]
7
+
6
8
  attr_reader :current_object, :result, :parent, :opts, :views, :locals
7
9
 
8
10
  # Initialize a new Node instance.
@@ -17,6 +19,8 @@ module Bldr
17
19
  #
18
20
  #
19
21
  # @param [Object] value an object to serialize.
22
+ # @param [Hash] opts
23
+ # @option [Object] opts :parent used to copy instance variables into self
20
24
  def initialize(value = nil, opts = {}, &block)
21
25
  @current_object = value
22
26
  @opts = opts
@@ -24,11 +28,24 @@ module Bldr
24
28
  @views = opts[:views]
25
29
  @locals = opts[:locals]
26
30
  # Storage hash for all descendant nodes
27
- @result = {}
31
+ @result = {}
32
+
33
+ copy_instance_variables_from(opts[:parent]) if opts[:parent]
28
34
 
29
- instance_eval(&block) if block_given?
35
+ if block_given?
36
+ if value && block.arity > 0
37
+ instance_exec(value, &block)
38
+ else
39
+ instance_eval(&block)
40
+ end
41
+ end
30
42
  end
31
-
43
+
44
+ def current_object
45
+ warn "[DEPRECATION] `current_object` is deprecated. Please use object or collection block varibles instead."
46
+ @current_object
47
+ end
48
+
32
49
  # Create and render a node.
33
50
  #
34
51
  # @example A keyed object
@@ -182,15 +199,15 @@ module Bldr
182
199
  #
183
200
  # @return [Nil]
184
201
  def attributes(*args, &block)
185
- if current_object.nil?
202
+ if @current_object.nil?
186
203
  raise(ArgumentError, "No current_object to apply #attributes to.")
187
204
  end
188
205
 
189
206
  args.each do |arg|
190
207
  if arg.is_a?(Hash)
191
- merge_result!(arg.keys.first, current_object.send(arg.values.first))
208
+ merge_result!(arg.keys.first, @current_object.send(arg.values.first))
192
209
  else
193
- merge_result!(arg, current_object.send(arg))
210
+ merge_result!(arg, @current_object.send(arg))
194
211
  end
195
212
  end
196
213
  self
@@ -199,16 +216,20 @@ module Bldr
199
216
  def attribute(*args,&block)
200
217
  if block_given?
201
218
  raise(ArgumentError, "You may only pass one argument to #attribute when using the block syntax.") if args.size > 1
202
- raise(ArgumentError, "You cannot use a block of arity > 0 if current_object is not present.") if block.arity > 0 and current_object.nil?
203
- merge_result!(args.first, (block.arity == 1) ? block.call(current_object) : current_object.instance_eval(&block))
219
+ raise(ArgumentError, "You cannot use a block of arity > 0 if current_object is not present.") if block.arity > 0 and @current_object.nil?
220
+ if block.arity > 0
221
+ merge_result! args.first, block.call(@current_object)
222
+ else
223
+ merge_result! args.first, block.call
224
+ end
204
225
  else
205
226
  case args.size
206
227
  when 1 # inferred object
207
- raise(ArgumentError, "#attribute can't be used when there is no current_object.") if current_object.nil?
228
+ raise(ArgumentError, "#attribute can't be used when there is no current_object.") if @current_object.nil?
208
229
  if args[0].is_a?(Hash)
209
- merge_result!(args[0].keys.first, current_object.send(args[0].values.first))
230
+ merge_result!(args[0].keys.first, @current_object.send(args[0].values.first))
210
231
  else
211
- merge_result!(args[0], current_object.send(args[0]))
232
+ merge_result!(args[0], @current_object.send(args[0]))
212
233
  end
213
234
  when 2 # static property
214
235
  merge_result!(args[0], args[1])
@@ -244,6 +265,17 @@ module Bldr
244
265
 
245
266
  private
246
267
 
268
+ # Retrieves all instance variables from an object and sets them in the
269
+ # current scope.
270
+ #
271
+ # @param [Object] object The object to copy instance variables from.
272
+ def copy_instance_variables_from(object)
273
+ ivar_names = (object.instance_variables - PROTECTED_IVARS).map(&:to_s)
274
+ ivar_names.map do |name|
275
+ instance_variable_set(name, object.instance_variable_get(name))
276
+ end
277
+ end
278
+
247
279
  # Determines if an object was passed in with a key pointing to it, or if
248
280
  # it was passed in as the "root" of the current object. Essentially, this
249
281
  # checks if `obj` quacks like a hash.
data/lib/bldr/template.rb CHANGED
@@ -2,6 +2,7 @@ require 'tilt'
2
2
 
3
3
  module Bldr
4
4
 
5
+ # This class is required for Tilt compatibility
5
6
  class Template < Tilt::Template
6
7
 
7
8
  self.default_mime_type = 'application/json'
@@ -14,6 +15,8 @@ module Bldr
14
15
  defined? ::Bldr
15
16
  end
16
17
 
18
+ # Called at the end of Tilt::Template#initialize.
19
+ # Use this method to access or mutate any state available to Tilt::Template
17
20
  def prepare
18
21
  # We get NotImplementedError by Tilt when we don't have this method
19
22
  end
data/lib/bldr/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Bldr
3
- VERSION = '0.6.0'
3
+ VERSION = '0.7.0'
4
4
  end
data/lib/sinatra/bldr.rb CHANGED
@@ -4,7 +4,6 @@ module Sinatra
4
4
 
5
5
  module Bldr
6
6
  module Helpers
7
-
8
7
  # Wrapper for Tilt's `render` method
9
8
  #
10
9
  # We use this to properly set the scope the template gets rendered
@@ -24,10 +23,13 @@ module Sinatra
24
23
  # @param [Hash] opts a hash of options
25
24
  # @option opts [Hash] :locals a hash of local variables to be used in the template
26
25
  def bldr(template, opts = {}, &block)
26
+ opts[:parent] = self
27
27
  opts[:scope] = ::Bldr::Node.new(nil, opts.merge(:views => (settings.views || "./views")))
28
- locals = opts.delete(:locals)
29
- MultiJson.encode render(:bldr, template, opts, locals, &block).result
28
+
29
+ locals = opts.delete(:locals) || {}
30
+
30
31
  # @todo add support for alternate formats, like plist
32
+ MultiJson.encode render(:bldr, template, opts, locals, &block).result
31
33
  end
32
34
  end
33
35
 
@@ -0,0 +1,3 @@
1
+ object :person => @person do
2
+ attributes :name, :age
3
+ end
@@ -0,0 +1,5 @@
1
+ object nil do
2
+ object :person => @person do
3
+ attributes :name, :age
4
+ end
5
+ end
@@ -1,8 +1,8 @@
1
1
 
2
2
  object :person => bert do
3
3
  attributes :name, :age
4
- attribute :name_age do
5
- "#{name} #{age}"
4
+ attribute :name_age do |person|
5
+ "#{person.name} #{person.age}"
6
6
  end
7
7
 
8
8
  object :friend => ernie do
@@ -1,75 +1,172 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "evaluating a tilt template" do
4
- it "registers with Tilt" do
5
- Tilt['test.bldr'].should == Bldr::Template
3
+ module Bldr
4
+ describe 'local variable access' do
5
+ it 'provides access to locals in nested object blocks' do
6
+ Template.new do
7
+ <<-RUBY
8
+ object :person => person do
9
+ attribute(:name) { person.name }
10
+ object :address => Object.new do |address|
11
+ attribute(:display_name) { person.name }
12
+ end
13
+ end
14
+ RUBY
15
+ end.render(Node.new(nil), {person: Person.new('alex')})
16
+ .result
17
+ .should == {:person => {:name => 'alex', :address => {:display_name => 'alex'}}}
18
+ end
6
19
  end
7
20
 
8
- it "renders a template" do
9
- alex = Person.new
10
- alex.name = 'alex'
21
+ describe "instance variables" do
22
+ let(:ctx) { Object.new }
23
+
24
+ describe "collection blocks" do
25
+ it 'has access to instance variables' do
26
+ ctx.instance_variable_set(:@person, Person.new("John Denver"))
27
+
28
+ Template.new do
29
+ <<-RUBY
30
+ collection :artists => [@person] do
31
+ attribute(:name) { @person.name }
32
+ end
33
+ RUBY
34
+ end.render(Node.new(nil, :parent => ctx))
35
+ .result
36
+ .should == {:artists => [{:name => 'John Denver'}]}
37
+ end
38
+ end
39
+
40
+ it 'has access to instance variables in included template partials' do
41
+ ctx.instance_variable_set(:@person, Person.new('john denver'))
42
+
43
+ Template.new {
44
+ <<-RUBY
45
+ template('spec/fixtures/ivar.bldr')
46
+ RUBY
47
+ }.render(Node.new(nil, :parent => ctx))
48
+ .result
49
+ .should == {:person => {:name => 'john denver', :age => nil}}
50
+ end
11
51
 
12
- tpl = Bldr::Template.new { "object(:person => alex) { attribute(:name) }" }
13
- tpl.render(Bldr::Node.new, :alex => alex).result.should == {:person => {:name => 'alex'}}
52
+ it 'has access to ivars in attribute blocks with no arity' do
53
+ ctx.instance_variable_set(:@person, Person.new('john denver'))
54
+
55
+ Template.new {
56
+ <<-RUBY
57
+ object :person do
58
+ attribute(:name) { @person.name }
59
+ end
60
+ RUBY
61
+ }.render(Node.new(nil, :parent => ctx))
62
+ .result
63
+ .should == {:person => {:name => 'john denver'}}
64
+ end
65
+
66
+ it 'has access to ivars in attribute blocks with arity of 1' do
67
+ ctx.instance_variable_set(:@denver, Person.new('john denver'))
68
+ ctx.instance_variable_set(:@rich, Person.new('charlie rich'))
69
+ Template.new {
70
+ <<-RUBY
71
+ object :person => @denver do
72
+ attribute(:name) { |p| @rich.name }
73
+ end
74
+ RUBY
75
+ }.render(Node.new(nil, :parent => ctx))
76
+ .result
77
+ .should == {:person => {:name => 'charlie rich'}}
78
+ end
79
+
80
+ it 'has access to ivars in nested object blocks' do
81
+ ctx.instance_variable_set(:@batman, Person.new('batman'))
82
+ ctx.instance_variable_set(:@bane, Person.new('bane'))
83
+ Template.new {
84
+ <<-RUBY
85
+ object :hero => @batman do
86
+ attribute(:name) { @batman.name }
87
+ object :nemesis do
88
+ attribute(:name) { @bane.name }
89
+ attribute(:nemesis_name) { @batman.name }
90
+ end
91
+ end
92
+ RUBY
93
+ }.render(Node.new(nil, :parent => ctx))
94
+ .result
95
+ .should == {hero: {name: 'batman', nemesis: {name: 'bane', nemesis_name: 'batman'}}}
96
+ end
14
97
  end
15
98
 
16
- it "allows attribute to be used at the root-level" do
17
- tpl = Bldr::Template.new {
99
+
100
+ describe "evaluating a tilt template" do
101
+ it "registers with Tilt" do
102
+ Tilt['test.bldr'].should == Bldr::Template
103
+ end
104
+
105
+ it "renders a template" do
106
+ alex = Person.new
107
+ alex.name = 'alex'
108
+
109
+ tpl = Bldr::Template.new { "object(:person => alex) { attribute(:name) }" }
110
+ tpl.render(Bldr::Node.new, :alex => alex).result.should == {:person => {:name => 'alex'}}
111
+ end
112
+
113
+ it "allows attribute to be used at the root-level" do
114
+ tpl = Bldr::Template.new {
18
115
  <<-RUBY
19
116
  attribute(:foo) { "bar" }
20
117
  RUBY
21
- }
22
- tpl.render(Bldr::Node.new(nil)).result.should == {:foo => 'bar'}
23
- end
118
+ }
119
+ tpl.render(Bldr::Node.new(nil)).result.should == {:foo => 'bar'}
120
+ end
24
121
 
25
- it "works when render two top-level objects" do
26
- alex = Person.new('alex')
27
- john = Person.new('john')
122
+ it "works when render two top-level objects" do
123
+ alex = Person.new('alex')
124
+ john = Person.new('john')
28
125
 
29
- tpl = Bldr::Template.new {
126
+ tpl = Bldr::Template.new {
30
127
  <<-RUBY
31
128
  object(:person_1 => alex) { attribute(:name) }
32
129
  object(:person_2 => john) { attribute(:name) }
33
130
  RUBY
34
- }
131
+ }
35
132
 
36
- result = tpl.render(Bldr::Node.new, :alex => alex, :john => john).result
37
- result.should == {
38
- :person_1 => {:name => 'alex'},
39
- :person_2 => {:name => 'john'}
40
- }
41
- end
133
+ result = tpl.render(Bldr::Node.new, :alex => alex, :john => john).result
134
+ result.should == {
135
+ :person_1 => {:name => 'alex'},
136
+ :person_2 => {:name => 'john'}
137
+ }
138
+ end
42
139
 
43
- it "renders nil -> null correctly" do
44
- alex = Person.new('alex')
45
- tpl = Bldr::Template.new {
140
+ it "renders nil -> null correctly" do
141
+ alex = Person.new('alex')
142
+ tpl = Bldr::Template.new {
46
143
  <<-RUBY
47
144
  object(:person_1 => alex) { attributes(:age) }
48
145
  RUBY
49
- }
50
- result = tpl.render(Bldr::Node.new, :alex => alex).result
51
- result.should == {:person_1 => {:age => nil}}
52
- end
146
+ }
147
+ result = tpl.render(Bldr::Node.new, :alex => alex).result
148
+ result.should == {:person_1 => {:age => nil}}
149
+ end
53
150
 
54
- describe "root Object nodes" do
151
+ describe "root Object nodes" do
55
152
 
56
- let(:alex) { Person.new('alex', 25) }
57
- let(:ian) { Person.new('ian', 32) }
153
+ let(:alex) { Person.new('alex', 25) }
154
+ let(:ian) { Person.new('ian', 32) }
58
155
 
59
- it "returns json for a root object" do
60
- tpl = Bldr::Template.new {
156
+ it "returns json for a root object" do
157
+ tpl = Bldr::Template.new {
61
158
  <<-RUBY
62
159
  object :person => alex do
63
160
  attributes :name, :age
64
161
  end
65
162
  RUBY
66
- }
67
- result = tpl.render(Bldr::Node.new, :alex => alex, :ian => ian).result
68
- result.should == {:person => {:name => 'alex', :age => 25}}
69
- end
163
+ }
164
+ result = tpl.render(Bldr::Node.new, :alex => alex, :ian => ian).result
165
+ result.should == {:person => {:name => 'alex', :age => 25}}
166
+ end
70
167
 
71
- it "returns json for root object templates with nested collections" do
72
- tpl = Bldr::Template.new {
168
+ it "returns json for root object templates with nested collections" do
169
+ tpl = Bldr::Template.new {
73
170
  <<-RUBY
74
171
  object :person => alex do
75
172
  attributes :name, :age
@@ -79,78 +176,79 @@ describe "evaluating a tilt template" do
79
176
  end
80
177
  end
81
178
  RUBY
82
- }
83
- result = tpl.render(Bldr::Node.new, :alex => alex, :friends => [ian]).result
84
- result.should == {
85
- :person=> {:name => 'alex', :age => 25, :friends => [{:name => 'ian', :age => 32}]}
86
- }
87
- end
88
-
89
- it "renders nil -> null correctly" do
90
- alex = Person.new('alex')
91
- tpl = Bldr::Template.new {
179
+ }
180
+ result = tpl.render(Bldr::Node.new, :alex => alex, :friends => [ian]).result
181
+ result.should == {
182
+ :person=> {:name => 'alex', :age => 25, :friends => [{:name => 'ian', :age => 32}]}
183
+ }
184
+ end
185
+
186
+ it "renders nil -> null correctly" do
187
+ alex = Person.new('alex')
188
+ tpl = Bldr::Template.new {
92
189
  <<-RUBY
93
190
  object :person_1 => alex do
94
191
  attributes(:age)
95
192
  end
96
193
  RUBY
97
- }
98
- result = tpl.render(Bldr::Node.new, :alex => alex).result
99
- result.should == {:person_1 => {:age => nil}}
100
- end
194
+ }
195
+ result = tpl.render(Bldr::Node.new, :alex => alex).result
196
+ result.should == {:person_1 => {:age => nil}}
197
+ end
101
198
 
102
- end
199
+ end
103
200
 
104
- describe "root Collection nodes" do
201
+ describe "root Collection nodes" do
105
202
 
106
- let(:alex) { Person.new('alex', 25, [Person.new('bo',33)]) }
107
- let(:ian) { Person.new('ian', 32, [Person.new('eric',34)]) }
203
+ let(:alex) { Person.new('alex', 25, [Person.new('bo',33)]) }
204
+ let(:ian) { Person.new('ian', 32, [Person.new('eric',34)]) }
108
205
 
109
- it "returns json for a root collection template" do
110
- tpl = Bldr::Template.new {
206
+ it "returns json for a root collection template" do
207
+ tpl = Bldr::Template.new {
111
208
  <<-RUBY
112
209
  collection :people => people do
113
210
  attributes :name, :age
114
211
  end
115
212
  RUBY
116
- }
117
- result = tpl.render(Bldr::Node.new, :people => [alex,ian]).result
118
- result.should == {
119
- :people => [{:name => 'alex', :age => 25}, {:name => 'ian', :age => 32}]
120
- }
121
- end
122
-
123
- it "returns json for a root collection with embedded collection template" do
124
- tpl = Bldr::Template.new {
213
+ }
214
+ result = tpl.render(Bldr::Node.new, :people => [alex,ian]).result
215
+ result.should == {
216
+ :people => [{:name => 'alex', :age => 25}, {:name => 'ian', :age => 32}]
217
+ }
218
+ end
219
+
220
+ it "returns json for a root collection with embedded collection template" do
221
+ tpl = Bldr::Template.new {
125
222
  <<-RUBY
126
- collection :people => people do
223
+ collection :people => people do |person|
127
224
  attributes :name, :age
128
- collection :friends => current_object.friends do
225
+ collection :friends => person.friends do
129
226
  attributes :name, :age
130
227
  end
131
228
  end
132
229
  RUBY
133
- }
134
- result = tpl.render(Bldr::Node.new, :people => [alex,ian]).result
135
- result.should == {
136
- :people=> [{
137
- :name => 'alex',
138
- :age => 25,
139
- :friends => [{:name => 'bo', :age => 33}]
140
- },{
141
- :name => 'ian',
142
- :age => 32,
143
- :friends => [{:name => 'eric', :age => 34}]
144
- }]
145
- }
146
- end
230
+ }
231
+ result = tpl.render(Bldr::Node.new, :people => [alex,ian]).result
232
+ result.should == {
233
+ :people=> [{
234
+ :name => 'alex',
235
+ :age => 25,
236
+ :friends => [{:name => 'bo', :age => 33}]
237
+ },{
238
+ :name => 'ian',
239
+ :age => 32,
240
+ :friends => [{:name => 'eric', :age => 34}]
241
+ }]
242
+ }
243
+ end
147
244
 
245
+ end
148
246
  end
149
- end
150
247
 
151
- describe "using a partial template at the root of another template" do
152
- it "works as expected" do
153
- template = Bldr::Template.new('./spec/fixtures/root_partial.bldr')
154
- template.render(Bldr::Node.new(nil, :views => './spec')).result.should == {:foo => 'bar'}
248
+ describe "using a partial template at the root of another template" do
249
+ it "works as expected" do
250
+ template = Bldr::Template.new('./spec/fixtures/root_partial.bldr')
251
+ template.render(Bldr::Node.new(nil, :views => './spec')).result.should == {:foo => 'bar'}
252
+ end
155
253
  end
156
- end
254
+ end