building-blocks 0.0.3 → 0.0.4

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.0.4
@@ -1,33 +1,80 @@
1
1
  module BuildingBlocks
2
2
  class Base
3
+ attr_accessor :view
3
4
 
4
- attr_accessor :view, :blocks, :block_positions, :anonymous_block_number,
5
- :start_rendering_blocks, :block_groups, :shared_options
5
+ attr_accessor :blocks
6
6
 
7
+ attr_accessor :block
8
+
9
+ # Array of BuildingBlocks::Container objects, storing the order of blocks as they were used
10
+ attr_accessor :block_positions
11
+
12
+ # counter, used to give unnamed blocks a unique name
13
+ attr_accessor :anonymous_block_number
14
+
15
+ attr_accessor :start_rendering_blocks
16
+
17
+ attr_accessor :block_groups
18
+
19
+ # These are the options that are passed into the initalize method
20
+ attr_accessor :global_options
21
+
22
+ # Checks if a particular block has been defined within the current block scope.
23
+ # <%= blocks.defined? :some_block_name %>
24
+ # Options:
25
+ # [+name+]
26
+ # The name of the block to check
7
27
  def defined?(name)
8
28
  !blocks[name.to_sym].nil?
9
29
  end
10
30
 
31
+ # Define a block, unless a block by the same name is already defined.
32
+ # <%= blocks.define :some_block_name, :parameter1 => "1", :parameter2 => "2" do |options| %>
33
+ # <%= options[:parameter1] %> and <%= options[:parameter2] %>
34
+ # <% end %>
35
+ #
36
+ # Options:
37
+ # [+name+]
38
+ # The name of the block being defined (either a string or a symbol)
39
+ # [+options+]
40
+ # The default options for the block definition. Any or all of these options may be overrideen by
41
+ # whomever calls "blocks.use" on this block.
42
+ # [+block+]
43
+ # The block that is to be rendered when "blocks.use" is called for this block.
11
44
  def define(name, options={}, &block)
12
- block_container = BuildingBlocks::Container.new
13
- block_container.name = name
14
- block_container.options = options
15
- block_container.block = block
45
+ # Check if a block by this name is already defined.
46
+ if blocks[name.to_sym].nil?
47
+ # Store the attributes of the defined block in a container for later use
48
+ block_container = BuildingBlocks::Container.new
49
+ block_container.name = name
50
+ block_container.options = options
51
+ block_container.block = block
16
52
 
17
- blocks[name.to_sym] = block_container if blocks[name.to_sym].nil?
53
+ blocks[name.to_sym] = block_container
54
+ end
18
55
 
19
56
  nil
20
57
  end
21
58
 
59
+ # Define a block, replacing an existing block by the same name if it is already defined.
60
+ # <%= blocks.define :some_block_name, :parameter1 => "1", :parameter2 => "2" do |options| %>
61
+ # <%= options[:parameter1] %> and <%= options[:parameter2] %>
62
+ # <% end %>
63
+ #
64
+ # <%= blocks.replace :some_block_name, :parameter3 => "3", :parameter4 => "4" do |options| %>
65
+ # <%= options[:parameter3] %> and <%= options[:parameter4] %>
66
+ # <% end %>
67
+ # Options:
68
+ # [+name+]
69
+ # The name of the block being defined (either a string or a symbol)
70
+ # [+options+]
71
+ # The default options for the block definition. Any or all of these options may be overrideen by
72
+ # whomever calls "blocks.use" on this block.
73
+ # [+block+]
74
+ # The block that is to be rendered when "blocks.use" is called for this block.
22
75
  def replace(name, options={}, &block)
23
- block_container = BuildingBlocks::Container.new
24
- block_container.name = name
25
- block_container.options = options
26
- block_container.block = block
27
-
28
- blocks[name.to_sym] = block_container
29
-
30
- nil
76
+ blocks[name.to_sym] = nil
77
+ define(name, options, &block)
31
78
  end
32
79
 
33
80
  def use(*args, &block)
@@ -42,26 +89,27 @@ module BuildingBlocks
42
89
  block_container.options = options
43
90
  block_container.block = block
44
91
 
45
- blocks[name.to_sym] = block_container if !name.is_a?(BuildingBlocks::Container) and blocks[name.to_sym].nil? and block
92
+ blocks[name.to_sym] = block_container if !name.is_a?(BuildingBlocks::Container) and blocks[name.to_sym].nil? and block_given?
46
93
 
47
- if start_rendering_blocks
94
+ if start_rendering_blocks
48
95
  render_block name, args, options
49
96
  else
50
97
  # Delays rendering this block until the partial has been rendered and all the blocks have had a chance to be defined
51
98
  self.block_positions << block_container
99
+ nil
52
100
  end
53
101
 
54
- nil
102
+ # nil
55
103
  end
56
104
 
57
105
  def render
58
106
  self.start_rendering_blocks = false
59
107
 
60
- shared_options[:captured_block] = view.capture(self, &shared_options[:block]) if shared_options[:block]
108
+ global_options[:captured_block] = view.capture(self, &self.block) if self.block
61
109
 
62
110
  self.start_rendering_blocks = true
63
111
 
64
- view.render shared_options[:template], shared_options
112
+ view.render global_options[:template], global_options
65
113
  end
66
114
 
67
115
  def before(name, options={}, &block)
@@ -113,7 +161,7 @@ module BuildingBlocks
113
161
  self.block_groups[m] = self.block_positions
114
162
 
115
163
  # Capture the contents of the block group (this will only capture block definitions and block uses)
116
- view.capture(shared_options.merge(options), &block) if block_given?
164
+ view.capture(global_options.merge(options), &block) if block_given?
117
165
 
118
166
  # restore the original block positions array
119
167
  self.block_positions = original_block_positions
@@ -122,13 +170,13 @@ module BuildingBlocks
122
170
 
123
171
  protected
124
172
 
125
- def initialize(options)
126
- self.view = options[:view]
127
- self.shared_options = options
128
-
173
+ def initialize(view, options={}, &block)
129
174
  options[options[:variable] ? options[:variable].to_sym : :blocks] = self
130
175
  options[:templates_folder] = "blocks" if options[:templates_folder].nil?
131
176
 
177
+ self.view = view
178
+ self.global_options = options
179
+ self.block = block
132
180
  self.block_positions = []
133
181
  self.blocks = {}
134
182
  self.anonymous_block_number = 0
@@ -141,9 +189,11 @@ module BuildingBlocks
141
189
  "block_#{anonymous_block_number}"
142
190
  end
143
191
 
144
- def render_block(name_or_container, args, options={})
192
+ def render_block(name_or_container, args, options={})
145
193
  render_options = options
146
194
 
195
+ buffer = ActionView::NonConcattingString.new
196
+
147
197
  if (name_or_container.is_a?(BuildingBlocks::Container))
148
198
  name = name_or_container.name.to_sym
149
199
  render_options = render_options.merge(name_or_container.options)
@@ -151,86 +201,92 @@ module BuildingBlocks
151
201
  name = name_or_container.to_sym
152
202
  end
153
203
 
154
- view.concat(render_before_blocks(name, options))
204
+ buffer << render_before_blocks(name, options)
155
205
 
156
206
  if blocks[name]
157
207
  block_container = blocks[name]
158
208
 
159
- args.push(shared_options.merge(block_container.options).merge(render_options))
209
+ args.push(global_options.merge(block_container.options).merge(render_options))
160
210
 
161
211
  # If the block is taking more than one parameter, we can use *args
162
212
  if block_container.block.arity > 1
163
- view.concat(view.capture *args, &block_container.block)
213
+ buffer << view.capture(*args, &block_container.block)
164
214
 
165
215
  # However, if the block only takes a single parameter, we do not want ruby to try to cram the args list into that parameter
166
216
  # as an array
167
217
  else
168
- view.concat(view.capture args.first, &block_container.block)
218
+ buffer << view.capture(args.first, &block_container.block)
169
219
  end
170
220
  elsif view.blocks.blocks[name]
171
221
  block_container = view.blocks.blocks[name]
172
222
 
173
- args.push(shared_options.merge(block_container.options).merge(render_options))
223
+ args.push(global_options.merge(block_container.options).merge(render_options))
174
224
 
175
225
  # If the block is taking more than one parameter, we can use *args
176
226
  if block_container.block.arity > 1
177
- view.concat(view.capture *args, &block_container.block)
227
+ buffer << view.capture(*args, &block_container.block)
178
228
 
179
229
  # However, if the block only takes a single parameter, we do not want ruby to try to cram the args list into that parameter
180
230
  # as an array
181
231
  else
182
- view.concat(view.capture args.first, &block_container.block)
232
+ buffer << view.capture(args.first, &block_container.block)
183
233
  end
184
234
  else
185
235
  begin
186
- begin
187
- view.concat(view.render "#{name.to_s}", shared_options.merge(render_options))
188
- rescue ActionView::MissingTemplate
236
+ begin
237
+ buffer << view.render("#{name.to_s}", global_options.merge(render_options))
238
+ rescue ActionView::MissingTemplate
189
239
  # This partial did not exist in the current controller's view directory; now checking in the default templates folder
190
- view.concat(view.render "#{shared_options[:templates_folder]}/#{name.to_s}", shared_options.merge(render_options))
240
+ buffer << view.render("#{self.global_options[:templates_folder]}/#{name.to_s}", global_options.merge(render_options))
191
241
  end
192
242
  rescue ActionView::MissingTemplate
193
243
  # This block does not exist and no partial can be found to satify it
194
244
  end
195
245
  end
196
246
 
197
- view.concat(render_after_blocks(name, options))
247
+ buffer << render_after_blocks(name, options)
248
+
249
+ buffer
198
250
  end
199
251
 
200
252
  def render_before_blocks(name, options={})
201
253
  name = "before_#{name.to_s}".to_sym
202
254
 
255
+ buffer = ActionView::NonConcattingString.new
256
+
203
257
  unless blocks[name].nil?
204
258
  blocks[name].each do |block_container|
205
- view.concat(view.capture shared_options.merge(block_container.options).merge(options), &block_container.block)
259
+ buffer << view.capture(global_options.merge(block_container.options).merge(options), &block_container.block)
206
260
  end
207
261
  end
208
262
 
209
263
  unless view.blocks.blocks[name].nil? || view.blocks.blocks == blocks
210
264
  view.blocks.blocks[name].each do |block_container|
211
- view.concat(view.capture shared_options.merge(block_container.options).merge(options), &block_container.block)
265
+ buffer << view.capture(global_options.merge(block_container.options).merge(options), &block_container.block)
212
266
  end
213
267
  end
214
268
 
215
- nil
269
+ buffer
216
270
  end
217
271
 
218
272
  def render_after_blocks(name, options={})
219
273
  name = "after_#{name.to_s}".to_sym
220
274
 
275
+ buffer = ActionView::NonConcattingString.new
276
+
221
277
  unless blocks[name].nil?
222
278
  blocks[name].each do |block_container|
223
- view.concat(view.capture shared_options.merge(block_container.options).merge(options), &block_container.block)
279
+ buffer << view.capture(global_options.merge(block_container.options).merge(options), &block_container.block)
224
280
  end
225
281
  end
226
282
 
227
283
  unless view.blocks.blocks[name].nil? || view.blocks.blocks == blocks
228
284
  view.blocks.blocks[name].each do |block_container|
229
- view.concat(view.capture shared_options.merge(block_container.options).merge(options), &block_container.block)
285
+ buffer << view.capture(global_options.merge(block_container.options).merge(options), &block_container.block)
230
286
  end
231
287
  end
232
288
 
233
- nil
289
+ buffer
234
290
  end
235
291
  end
236
292
  end
@@ -1,10 +1,7 @@
1
1
  module BuildingBlocks
2
2
  module HelperMethods
3
3
  def blocks
4
- options = {}
5
- options[:view] = self
6
-
7
- @blocks ||= Base.new(options)
4
+ @blocks ||= BuildingBlocks::Base.new(self)
8
5
  end
9
6
  end
10
7
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: building-blocks
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Andrew Hunter
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-03 00:00:00 -04:00
18
+ date: 2011-05-16 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -39,7 +39,7 @@ dependencies:
39
39
  version_requirements: &id002 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
- - - ~>
42
+ - - ">="
43
43
  - !ruby/object:Gem::Version
44
44
  hash: 7
45
45
  segments: