blocks 2.4.0 → 2.5.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/CHANGELOG.rdoc +10 -0
- data/VERSION +1 -1
- data/blocks.gemspec +2 -2
- data/lib/blocks.rb +2 -2
- data/lib/blocks/base.rb +47 -24
- data/spec/blocks/base_spec.rb +27 -7
- data/spec/spec_helper.rb +1 -1
- metadata +3 -3
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
2.5.0 (October 14, 2013)
|
2
|
+
* Added skip method as a shorthand for defining or replacing a block's definition so that nothing is output when the block is rendered
|
3
|
+
* Added ability to wrap each block in a collection with an element or render a block with an element, using syntax like:
|
4
|
+
<%= blocks.render :brand,
|
5
|
+
:collection => @brands,
|
6
|
+
:wrap_each => {:tag => "div", :style => "border: 1px solid black", :class => Proc.new {cycle("even", "odd")}},
|
7
|
+
:wrap_with => {:tag => "div", :style => "color: red"} %>
|
8
|
+
<%= blocks.render :brand, :wrap_with => {:tag => "div", :class => Proc.new {cycle("even", "odd")}} %>
|
9
|
+
* Changed blocks.surrounding_tag_surrounds_before_and_after_blocks to Blocks.wrap_with_surrounds_before_and_after_blocks
|
10
|
+
|
1
11
|
2.4.0 (September 4, 2013)
|
2
12
|
* Moved queue and render_templates methods into the new with_template gem.
|
3
13
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.5.0
|
data/blocks.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "blocks"
|
8
|
-
s.version = "2.
|
8
|
+
s.version = "2.5.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Andrew Hunter"]
|
12
|
-
s.date = "2013-
|
12
|
+
s.date = "2013-10-15"
|
13
13
|
s.description = "Blocks goes beyond blocks and partials"
|
14
14
|
s.email = "hunterae@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/blocks.rb
CHANGED
@@ -14,8 +14,8 @@ module Blocks
|
|
14
14
|
mattr_accessor :use_partials
|
15
15
|
@@use_partials = false
|
16
16
|
|
17
|
-
mattr_accessor :
|
18
|
-
@@
|
17
|
+
mattr_accessor :wrap_with_surrounds_before_and_after_blocks
|
18
|
+
@@wrap_with_surrounds_before_and_after_blocks = false
|
19
19
|
|
20
20
|
# Shortcut for using the templating feature / rendering templates
|
21
21
|
def self.render_template(view, partial, options={}, &block)
|
data/lib/blocks/base.rb
CHANGED
@@ -23,8 +23,8 @@ module Blocks
|
|
23
23
|
# Boolean variable for whether Blocks should attempt to render blocks as partials if a defined block cannot be found
|
24
24
|
attr_accessor :use_partials
|
25
25
|
|
26
|
-
# Boolean variable for whether Blocks should render before and after blocks inside or outside of a collections' elements'
|
27
|
-
attr_accessor :
|
26
|
+
# Boolean variable for whether Blocks should render before and after blocks inside or outside of a collections' elements' wrap_with tags
|
27
|
+
attr_accessor :wrap_with_surrounds_before_and_after_blocks
|
28
28
|
|
29
29
|
# Checks if a particular block has been defined within the current block scope.
|
30
30
|
# <%= blocks.defined? :some_block_name %>
|
@@ -84,6 +84,25 @@ module Blocks
|
|
84
84
|
nil
|
85
85
|
end
|
86
86
|
|
87
|
+
# Skip the rendering of a particular block when blocks.render is called for the a particular block name
|
88
|
+
# <%= blocks.define :some_block_name do %>
|
89
|
+
# My output
|
90
|
+
# <% end %>
|
91
|
+
#
|
92
|
+
# <%= blocks.skip :some_block_name %>
|
93
|
+
#
|
94
|
+
# <%= blocks.render :some_block_name %>
|
95
|
+
# <%# will not render anything %>
|
96
|
+
# Options:
|
97
|
+
# [+name+]
|
98
|
+
# The name of the block to skip rendering for
|
99
|
+
def skip(name)
|
100
|
+
blocks[name.to_sym] = nil
|
101
|
+
self.define_block_container(name) do
|
102
|
+
end
|
103
|
+
nil
|
104
|
+
end
|
105
|
+
|
87
106
|
# Render a block, first rendering any "before" blocks, then rendering the block itself, then rendering
|
88
107
|
# any "after" blocks. Additionally, a collection may also be passed in, and Blocks will render
|
89
108
|
# an the block, along with corresponding before and after blocks for each element of the collection.
|
@@ -123,10 +142,10 @@ module Blocks
|
|
123
142
|
# The collection of elements to render blocks for
|
124
143
|
# [:as]
|
125
144
|
# The variable name to assign the current element in the collection being rendered over
|
126
|
-
# [:
|
145
|
+
# [:wrap_with]
|
127
146
|
# The content tag to render around a block, which might be particularly useful when rendering a collection of blocks,
|
128
147
|
# such as for a list or table
|
129
|
-
# [:
|
148
|
+
# [:wrap_each]
|
130
149
|
# The attributes to be applied to the HTML content tag, such as styling or special properties. Please note, any Procs passed
|
131
150
|
# in will automatically be evaluated (For example: :class => lambda { cycle("even", "odd") })
|
132
151
|
# [:use_partials]
|
@@ -141,30 +160,34 @@ module Blocks
|
|
141
160
|
|
142
161
|
buffer = ActiveSupport::SafeBuffer.new
|
143
162
|
|
163
|
+
wrap_with = options.delete(:wrap_with) || {}
|
164
|
+
|
144
165
|
if collection
|
145
166
|
as = options.delete(:as)
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
167
|
+
wrap_each = options.delete(:wrap_each) || {}
|
168
|
+
|
169
|
+
buffer = content_tag_with_block(wrap_with[:tag], wrap_with.except(:tag), *args) do
|
170
|
+
collection.each do |object|
|
171
|
+
cloned_args = args.clone
|
172
|
+
cloned_args.unshift(object)
|
173
|
+
cloned_options = options.clone
|
174
|
+
cloned_options = cloned_options.merge(object.options) if object.is_a?(Blocks::Container)
|
175
|
+
cloned_args.push(cloned_options)
|
176
|
+
|
177
|
+
block_name = call_with_params(name_or_container, *cloned_args)
|
178
|
+
as_name = (as.presence || block_name).to_sym
|
179
|
+
cloned_options[as_name] = object
|
180
|
+
cloned_options[:wrap_with] = wrap_each
|
181
|
+
|
182
|
+
buffer << render(block_name, *cloned_args, &block)
|
183
|
+
end
|
184
|
+
buffer
|
159
185
|
end
|
160
186
|
else
|
161
|
-
surrounding_tag = options.delete(:surrounding_tag)
|
162
|
-
surrounding_tag_html = options.delete(:surrounding_tag_html)
|
163
|
-
|
164
187
|
args.push(options)
|
165
188
|
|
166
|
-
if
|
167
|
-
buffer << content_tag_with_block(
|
189
|
+
if wrap_with_surrounds_before_and_after_blocks
|
190
|
+
buffer << content_tag_with_block(wrap_with[:tag], wrap_with.except(:tag), *args) do
|
168
191
|
temp_buffer = ActiveSupport::SafeBuffer.new
|
169
192
|
temp_buffer << render_before_blocks(name_or_container, *args)
|
170
193
|
temp_buffer << render_block_with_around_blocks(name_or_container, *args, &block)
|
@@ -172,7 +195,7 @@ module Blocks
|
|
172
195
|
end
|
173
196
|
else
|
174
197
|
buffer << render_before_blocks(name_or_container, *args)
|
175
|
-
buffer << content_tag_with_block(
|
198
|
+
buffer << content_tag_with_block(wrap_with[:tag], wrap_with.except(:tag), *args) do
|
176
199
|
render_block_with_around_blocks(name_or_container, *args, &block)
|
177
200
|
end
|
178
201
|
buffer << render_after_blocks(name_or_container, *args)
|
@@ -405,7 +428,7 @@ module Blocks
|
|
405
428
|
self.blocks = {}
|
406
429
|
self.anonymous_block_number = 0
|
407
430
|
self.use_partials = options[:use_partials].nil? ? Blocks.use_partials : options.delete(:use_partials)
|
408
|
-
self.
|
431
|
+
self.wrap_with_surrounds_before_and_after_blocks = options[:wrap_with_surrounds_before_and_after_blocks].nil? ? Blocks.wrap_with_surrounds_before_and_after_blocks : options.delete(:wrap_with_surrounds_before_and_after_blocks)
|
409
432
|
end
|
410
433
|
|
411
434
|
# Return a unique name for an anonymously defined block (i.e. a block that has not been given a name)
|
data/spec/blocks/base_spec.rb
CHANGED
@@ -331,6 +331,14 @@ describe Blocks::Base do
|
|
331
331
|
buffer.should eql "rendered content"
|
332
332
|
end
|
333
333
|
|
334
|
+
it "should be able to render an element surrounding the block" do
|
335
|
+
block = Proc.new {}
|
336
|
+
@view.expects(:capture).with(nil).returns("rendered content")
|
337
|
+
@builder.define :some_block, &block
|
338
|
+
buffer = @builder.render :some_block, :wrap_with => {:tag => "span", :id => "my-id"}
|
339
|
+
buffer.should eql "<span id=\"my-id\">rendered content</span>"
|
340
|
+
end
|
341
|
+
|
334
342
|
describe "with a collection passed in" do
|
335
343
|
it "should render a block for each element of the collection with the name of the block used as the name of the element passed into the block" do
|
336
344
|
block = Proc.new {|item, options| "output#{options[:some_block]} "}
|
@@ -347,13 +355,13 @@ describe Blocks::Base do
|
|
347
355
|
it "should render a block for each element of the collection with a surrounding element if that option is specified" do
|
348
356
|
block = Proc.new {|item, options| "output#{options[:my_block_name]} "}
|
349
357
|
@builder.define :some_block, &block
|
350
|
-
@builder.render(:some_block, :collection => [1,2,3], :
|
358
|
+
@builder.render(:some_block, :collection => [1,2,3], :wrap_each => {:tag => "div"}).should eql "<div>output </div><div>output </div><div>output </div>"
|
351
359
|
end
|
352
360
|
|
353
361
|
it "should render a block for each element of the collection with a surrounding element and specified html options if those options are specified" do
|
354
362
|
block = Proc.new {|item, options| "output#{options[:my_block_name]} "}
|
355
363
|
@builder.define :some_block, &block
|
356
|
-
@builder.render(:some_block, :collection => [1,2,3], :
|
364
|
+
@builder.render(:some_block, :collection => [1,2,3], :wrap_each => {:tag => "div", :class => lambda { @view.cycle("even", "odd")}, :style => "color:red"}).should eql "<div class=\"even\" style=\"color:red\">output </div><div class=\"odd\" style=\"color:red\">output </div><div class=\"even\" style=\"color:red\">output </div>"
|
357
365
|
end
|
358
366
|
|
359
367
|
it "should be able to render before blocks before each element of a collection" do
|
@@ -395,11 +403,11 @@ describe Blocks::Base do
|
|
395
403
|
|
396
404
|
block = Proc.new {|item, options| "output#{options[:some_block]} "}
|
397
405
|
@builder.define :some_block, &block
|
398
|
-
@builder.render(:some_block, :collection => [1,2,3], :
|
406
|
+
@builder.render(:some_block, :collection => [1,2,3], :wrap_each => {:tag => "div"}).should eql "<div>before1 output1 after1 </div><div>before2 output2 after2 </div><div>before3 output3 after3 </div>"
|
399
407
|
end
|
400
408
|
|
401
409
|
it "should allow the global option to be set to render before and after blocks outside of surrounding elements" do
|
402
|
-
Blocks.
|
410
|
+
Blocks.wrap_with_surrounds_before_and_after_blocks = false
|
403
411
|
@builder = Blocks::Base.new(@view)
|
404
412
|
before_block = Proc.new {|item, options| "before#{options[:some_block]} "}
|
405
413
|
@builder.before :some_block, &before_block
|
@@ -409,11 +417,23 @@ describe Blocks::Base do
|
|
409
417
|
|
410
418
|
block = Proc.new {|item, options| "output#{options[:some_block]} "}
|
411
419
|
@builder.define :some_block, &block
|
412
|
-
@builder.render(:some_block, :collection => [1,2,3], :
|
420
|
+
@builder.render(:some_block, :collection => [1,2,3], :wrap_each => {:tag => "div"}).should eql "before1 <div>output1 </div>after1 before2 <div>output2 </div>after2 before3 <div>output3 </div>after3 "
|
413
421
|
end
|
414
422
|
|
415
423
|
it "should allow the option to be set to render before and after blocks outside of surrounding elements to be specified when Blocks is initialized" do
|
416
|
-
@builder = Blocks::Base.new(@view, :
|
424
|
+
@builder = Blocks::Base.new(@view, :wrap_with_surrounds_before_and_after_blocks => false)
|
425
|
+
before_block = Proc.new {|item, options| "before#{options[:some_block]} "}
|
426
|
+
@builder.before :some_block, &before_block
|
427
|
+
|
428
|
+
after_block = Proc.new {|item, options| "after#{options[:some_block]} "}
|
429
|
+
@builder.after :some_block, &after_block
|
430
|
+
|
431
|
+
block = Proc.new {|item, options| "output#{options[:some_block]} "}
|
432
|
+
@builder.define :some_block, &block
|
433
|
+
@builder.render(:some_block, :collection => [1,2,3], :wrap_each => {:tag => "div"}).should eql "before1 <div>output1 </div>after1 before2 <div>output2 </div>after2 before3 <div>output3 </div>after3 "
|
434
|
+
end
|
435
|
+
|
436
|
+
it "should be able to render an element around everything" do
|
417
437
|
before_block = Proc.new {|item, options| "before#{options[:some_block]} "}
|
418
438
|
@builder.before :some_block, &before_block
|
419
439
|
|
@@ -422,7 +442,7 @@ describe Blocks::Base do
|
|
422
442
|
|
423
443
|
block = Proc.new {|item, options| "output#{options[:some_block]} "}
|
424
444
|
@builder.define :some_block, &block
|
425
|
-
@builder.render(:some_block, :collection => [1,2,3], :
|
445
|
+
@builder.render(:some_block, :collection => [1,2,3], :wrap_each => {:tag => "div"}, :wrap_with => {:tag => "div", :style => "color:red"}).should eql "<div style=\"color:red\"><div>before1 output1 after1 </div><div>before2 output2 after2 </div><div>before3 output3 after3 </div></div>"
|
426
446
|
end
|
427
447
|
end
|
428
448
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -13,7 +13,7 @@ RSpec.configure do |config|
|
|
13
13
|
|
14
14
|
config.before :each do
|
15
15
|
Blocks.template_folder = "blocks"
|
16
|
-
Blocks.
|
16
|
+
Blocks.wrap_with_surrounds_before_and_after_blocks = true
|
17
17
|
Blocks.use_partials = false
|
18
18
|
end
|
19
19
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blocks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-10-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -134,7 +134,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
134
134
|
version: '0'
|
135
135
|
segments:
|
136
136
|
- 0
|
137
|
-
hash:
|
137
|
+
hash: -2216410614422126676
|
138
138
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
139
139
|
none: false
|
140
140
|
requirements:
|