blocks 2.3.1 → 2.4.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 CHANGED
@@ -1,3 +1,6 @@
1
+ 2.4.0 (September 4, 2013)
2
+ * Moved queue and render_templates methods into the new with_template gem.
3
+
1
4
  2.3.1 (September 3, 2013)
2
5
  * Removed call to autoload class that was moved into a separate gem, broke .rvmrc into .ruby-gemset and .ruby-version
3
6
 
data/Gemfile CHANGED
@@ -12,4 +12,5 @@ end
12
12
  group :test do
13
13
  gem "rspec-rails"
14
14
  gem "mocha"
15
+ gem "debugger"
15
16
  end
data/Rakefile CHANGED
@@ -27,11 +27,4 @@ Jeweler::Tasks.new do |gem|
27
27
  gem.authors = ["Andrew Hunter"]
28
28
  # dependencies defined in Gemfile
29
29
  end
30
- Jeweler::RubygemsDotOrgTasks.new
31
-
32
- require 'rake/testtask'
33
- Rake::TestTask.new(:test) do |test|
34
- test.libs << 'lib' << 'test'
35
- test.pattern = 'test/**/test_*.rb'
36
- test.verbose = true
37
- end
30
+ Jeweler::RubygemsDotOrgTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.1
1
+ 2.4.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.3.1"
8
+ s.version = "2.4.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-09-03"
12
+ s.date = "2013-09-05"
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/base.rb CHANGED
@@ -8,15 +8,9 @@ module Blocks
8
8
  # Hash of block names to Blocks::Container objects
9
9
  attr_accessor :blocks
10
10
 
11
- # Array of Blocks::Container objects, storing the order of blocks as they were queued
12
- attr_accessor :queued_blocks
13
-
14
11
  # counter, used to give unnamed blocks a unique name
15
12
  attr_accessor :anonymous_block_number
16
13
 
17
- # A Hash of queued_blocks arrays; a new array is started when method_missing is invoked
18
- attr_accessor :block_groups
19
-
20
14
  # These are the options that are passed into the initalize method
21
15
  attr_accessor :global_options
22
16
 
@@ -170,7 +164,7 @@ module Blocks
170
164
  args.push(options)
171
165
 
172
166
  if surrounding_tag_surrounds_before_and_after_blocks
173
- buffer << content_tag(surrounding_tag, surrounding_tag_html, *args) do
167
+ buffer << content_tag_with_block(surrounding_tag, surrounding_tag_html, *args) do
174
168
  temp_buffer = ActiveSupport::SafeBuffer.new
175
169
  temp_buffer << render_before_blocks(name_or_container, *args)
176
170
  temp_buffer << render_block_with_around_blocks(name_or_container, *args, &block)
@@ -178,7 +172,7 @@ module Blocks
178
172
  end
179
173
  else
180
174
  buffer << render_before_blocks(name_or_container, *args)
181
- buffer << content_tag(surrounding_tag, surrounding_tag_html, *args) do
175
+ buffer << content_tag_with_block(surrounding_tag, surrounding_tag_html, *args) do
182
176
  render_block_with_around_blocks(name_or_container, *args, &block)
183
177
  end
184
178
  buffer << render_after_blocks(name_or_container, *args)
@@ -277,91 +271,6 @@ module Blocks
277
271
  render(name_or_container, *args, &block)
278
272
  end
279
273
 
280
- # Queue a block for later rendering, such as within a template.
281
- # <%= Blocks::Base.new(self).render_template("shared/wizard") do |blocks| %>
282
- # <% blocks.queue :step1 %>
283
- # <% blocks.queue :step2 do %>
284
- # My overridden Step 2 |
285
- # <% end %>
286
- # <% blocks.queue :step3 %>
287
- # <% blocks.queue do %>
288
- # | Anonymous Step 4
289
- # <% end %>
290
- # <% end %>
291
- #
292
- # <!-- In /app/views/shared/wizard -->
293
- # <% blocks.define :step1 do %>
294
- # Step 1 |
295
- # <% end %>
296
- #
297
- # <% blocks.define :step2 do %>
298
- # Step 2 |
299
- # <% end %>
300
- #
301
- # <% blocks.define :step3 do %>
302
- # Step 3
303
- # <% end %>
304
- #
305
- # <% blocks.queued_blocks.each do |block| %>
306
- # <%= blocks.render block %>
307
- # <% end %>
308
- #
309
- # <!-- Will render: Step 1 | My overridden Step 2 | Step 3 | Anonymous Step 4-->
310
- # Options:
311
- # [+*args+]
312
- # The options to pass in when this block is rendered. These will override any options provided to the actual block
313
- # definition. Any or all of these options may be overriden by whoever calls "blocks.render" on this block.
314
- # Usually the first of these args will be the name of the block being queued (either a string or a symbol)
315
- # [+block+]
316
- # The optional block definition to render when the queued block is rendered
317
- def queue(*args, &block)
318
- self.queued_blocks << self.define_block_container(*args, &block)
319
- nil
320
- end
321
-
322
- # Render a partial, treating it as a template, and any code in the block argument will impact how the template renders
323
- # <%= Blocks::Base.new(self).render_template("shared/wizard") do |blocks| %>
324
- # <% blocks.queue :step1 %>
325
- # <% blocks.queue :step2 do %>
326
- # My overridden Step 2 |
327
- # <% end %>
328
- # <% blocks.queue :step3 %>
329
- # <% blocks.queue do %>
330
- # | Anonymous Step 4
331
- # <% end %>
332
- # <% end %>
333
- #
334
- # <!-- In /app/views/shared/wizard -->
335
- # <% blocks.define :step1 do %>
336
- # Step 1 |
337
- # <% end %>
338
- #
339
- # <% blocks.define :step2 do %>
340
- # Step 2 |
341
- # <% end %>
342
- #
343
- # <% blocks.define :step3 do %>
344
- # Step 3
345
- # <% end %>
346
- #
347
- # <% blocks.queued_blocks.each do |block| %>
348
- # <%= blocks.render block %>
349
- # <% end %>
350
- #
351
- # <!-- Will render: Step 1 | My overridden Step 2 | Step 3 | Anonymous Step 4-->
352
- # Options:
353
- # [+partial+]
354
- # The partial to render as a template
355
- # [+block+]
356
- # An optional block with code that affects how the template renders
357
- def render_template(partial, &block)
358
- render_options = global_options.clone
359
- render_options[self.variable] = self
360
- render_options[:captured_block] = view.capture(self, &block) if block_given?
361
-
362
- view.render partial, render_options
363
- end
364
-
365
274
  # Add a block to render before another block. This before block will be put into an array so that multiple
366
275
  # before blocks may be queued. They will render in the order in which they are declared when the
367
276
  # "blocks#render" method is called. Any options specified to the before block will override any options
@@ -396,7 +305,7 @@ module Blocks
396
305
  # [+block+]
397
306
  # The block of code to render before another block
398
307
  def before(name, options={}, &block)
399
- self.queue_block_container("before_#{name.to_s}", options, &block)
308
+ self.add_block_container_to_list("before_#{name.to_s}", options, &block)
400
309
  nil
401
310
  end
402
311
  alias prepend before
@@ -435,7 +344,7 @@ module Blocks
435
344
  # [+block+]
436
345
  # The block of code to render after another block
437
346
  def after(name, options={}, &block)
438
- self.queue_block_container("after_#{name.to_s}", options, &block)
347
+ self.add_block_container_to_list("after_#{name.to_s}", options, &block)
439
348
  nil
440
349
  end
441
350
  alias append after
@@ -482,43 +391,19 @@ module Blocks
482
391
  # [+block+]
483
392
  # The block of code to render after another block
484
393
  def around(name, options={}, &block)
485
- self.queue_block_container("around_#{name.to_s}", options, &block)
394
+ self.add_block_container_to_list("around_#{name.to_s}", options, &block)
486
395
  nil
487
396
  end
488
397
 
489
398
  protected
490
399
 
491
- # If a method is missing, we'll assume the user is starting a new block group by that missing method name
492
- def method_missing(m, *args, &block)
493
- options = args.extract_options!
494
-
495
- # If the specified block group has already been defined, it is simply returned here for iteration.
496
- # It will consist of all the blocks used in this block group that have yet to be rendered,
497
- # as the call for their use occurred before the template was rendered (where their definitions likely occurred)
498
- return self.block_groups[m] unless self.block_groups[m].nil?
499
-
500
- # Allows for nested block groups, store the current block positions array and start a new one
501
- original_queued_blocks = self.queued_blocks
502
- self.queued_blocks = []
503
- self.block_groups[m] = self.queued_blocks
504
-
505
- # Capture the contents of the block group (this will only capture block definitions and block renders; it will ignore anything else)
506
- view.capture(global_options.merge(options), &block) if block_given?
507
-
508
- # restore the original block positions array
509
- self.queued_blocks = original_queued_blocks
510
- nil
511
- end
512
-
513
400
  def initialize(view, options={})
514
401
  self.template_folder = options[:template_folder] ? options.delete(:template_folder) : Blocks.template_folder
515
402
  self.variable = (options[:variable] ? options.delete(:variable) : :blocks).to_sym
516
403
  self.view = view
517
404
  self.global_options = options
518
- self.queued_blocks = []
519
405
  self.blocks = {}
520
406
  self.anonymous_block_number = 0
521
- self.block_groups = {}
522
407
  self.use_partials = options[:use_partials].nil? ? Blocks.use_partials : options.delete(:use_partials)
523
408
  self.surrounding_tag_surrounds_before_and_after_blocks = options[:surrounding_tag_surrounds_before_and_after_blocks].nil? ? Blocks.surrounding_tag_surrounds_before_and_after_blocks : options.delete(:surrounding_tag_surrounds_before_and_after_blocks)
524
409
  end
@@ -639,8 +524,8 @@ module Blocks
639
524
  end
640
525
 
641
526
  # Build a Blocks::Container object and add it to an array of containers matching it's block name
642
- # (used only for queuing a collection of before and after blocks for a particular block name)
643
- def queue_block_container(*args, &block)
527
+ # (used only for queuing a collection of before, after, and around blocks for a particular block name)
528
+ def add_block_container_to_list(*args, &block)
644
529
  block_container = self.build_block_container(*args, &block)
645
530
  if blocks[block_container.name].nil?
646
531
  blocks[block_container.name] = [block_container]
@@ -657,7 +542,7 @@ module Blocks
657
542
  block_container
658
543
  end
659
544
 
660
- def content_tag(tag, tag_html, *args, &block)
545
+ def content_tag_with_block(tag, tag_html, *args, &block)
661
546
  if tag
662
547
  view.content_tag(tag, block.call, call_each_hash_value_with_params(tag_html, *args))
663
548
  else
@@ -90,98 +90,6 @@ describe Blocks::Base do
90
90
  end
91
91
  end
92
92
 
93
- describe "queue method" do
94
- it "should store all queued blocks in the queued_blocks array" do
95
- @builder.queued_blocks.should be_empty
96
- @builder.queue :test_block
97
- @builder.queued_blocks.length.should eql 1
98
- @builder.queued_blocks.map(&:name).first.should eql(:test_block)
99
- end
100
-
101
- it "should convert a string block name to a symbol" do
102
- @builder.queue "test_block"
103
- @builder.queued_blocks.map(&:name).first.should eql(:test_block)
104
- end
105
-
106
- it "should queue blocks as Blocks::Container objects" do
107
- @builder.queue :test_block, :a => 1, :b => 2, :c => 3
108
- container = @builder.queued_blocks.first
109
- container.should be_a(Blocks::Container)
110
- container.name.should eql(:test_block)
111
- container.options.should eql(:a => 1, :b => 2, :c => 3)
112
- end
113
-
114
- it "should not require a name for the block being queued" do
115
- @builder.queue
116
- @builder.queue
117
- @builder.queued_blocks.length.should eql 2
118
- @builder.queued_blocks.map(&:name).first.should eql(:block_1)
119
- @builder.queued_blocks.map(&:name).second.should eql(:block_2)
120
- end
121
-
122
- it "should anonymously define the name of a block if not specified" do
123
- @builder.queue
124
- @builder.queue :my_block
125
- @builder.queue
126
- @builder.queued_blocks.map(&:name).first.should eql(:block_1)
127
- @builder.queued_blocks.map(&:name).second.should eql(:my_block)
128
- @builder.queued_blocks.map(&:name).third.should eql(:block_2)
129
- end
130
-
131
- it "should store queued blocks in the order in which they are queued" do
132
- @builder.queue :block1
133
- @builder.queue :block3
134
- @builder.queue :block2
135
- @builder.queued_blocks.map(&:name).first.should eql(:block1)
136
- @builder.queued_blocks.map(&:name).second.should eql(:block3)
137
- @builder.queued_blocks.map(&:name).third.should eql(:block2)
138
- end
139
-
140
- it "should allow a definition to be provided for a queued block" do
141
- block = Proc.new do |options| end
142
- @builder.queue :test_block, &block
143
- container = @builder.queued_blocks.first
144
- container.block.should eql block
145
- end
146
- end
147
-
148
- describe "render_template method" do
149
- it "should attempt to render a partial specified as the :template parameter" do
150
- view = mock()
151
- builder = Blocks::Base.new(view)
152
- view.expects(:render).with{ |template, options| template == "my_template"}
153
- builder.render_template("my_template")
154
- end
155
-
156
- it "should set all of the global options as local variables to the partial it renders" do
157
- view = mock()
158
- builder = Blocks::Base.new(view)
159
- view.expects(:render).with { |template, options| template == 'some_template' && options[:blocks] == builder }
160
- builder.render_template("some_template")
161
- end
162
-
163
- it "should capture the data of a block if a block has been specified" do
164
- block = Proc.new { |options| "my captured block" }
165
- builder = Blocks::Base.new(@view)
166
- @view.expects(:render).with { |tempate, options| options[:captured_block] == "my captured block" }
167
- builder.render_template("template", &block)
168
- end
169
-
170
- it "should by default add a variable to the partial called 'blocks' as a pointer to the Blocks::Base instance" do
171
- view = mock()
172
- builder = Blocks::Base.new(view)
173
- view.expects(:render).with { |template, options| options[:blocks] == builder }
174
- builder.render_template("some_template")
175
- end
176
-
177
- it "should allow the user to override the local variable passed to the partial as a pointer to the Blocks::Base instance" do
178
- view = mock()
179
- builder = Blocks::Base.new(view, :variable => "my_variable")
180
- view.expects(:render).with { |template, options| options[:blocks].should be_nil }
181
- builder.render_template("some_template")
182
- end
183
- end
184
-
185
93
  describe "before method" do
186
94
  it "should be aliased with prepend" do
187
95
  block = Proc.new { |options| }
@@ -406,13 +314,12 @@ describe Blocks::Base do
406
314
  @builder.render :some_block, :value1 => 1, :value2 => 2, &block
407
315
  end
408
316
 
409
- it "should override hash options for a block by merging the runtime options the define default options into the queue level options into the global options" do
317
+ it "should override hash options for a block by merging the runtime options into the define default options into the queue level options into the global options" do
410
318
  block = Proc.new {|options|}
411
319
  @builder.global_options.merge!(:param1 => "global level", :param2 => "global level", :param3 => "global level", :param4 => "global level")
412
- @builder.queue(:my_before_block, :param1 => "queue level", :param2 => "queue level")
320
+ block_container = @builder.send(:define_block_container, :my_before_block, :param1 => "queue level", :param2 => "queue level")
413
321
  @builder.define(:my_before_block, :param1 => "define level", :param2 => "define level", :param3 => "define level", &block)
414
- block_container = @builder.queued_blocks.first
415
- @view.expects(:capture).with(:param4 => 'global level', :param1 => 'use level', :param2 => 'queue level', :param3 => 'define level')
322
+ @view.expects(:capture).with(:param1 => 'use level', :param2 => 'queue level', :param3 => 'define level', :param4 => 'global level')
416
323
  @builder.render block_container, :param1 => "use level"
417
324
  end
418
325
 
@@ -587,30 +494,4 @@ describe Blocks::Base do
587
494
  @builder.render :my_after_block, :param1 => "top level"
588
495
  end
589
496
  end
590
-
591
- describe "method_missing method" do
592
- it "should start a new block group if a method is missing" do
593
- @builder.some_method
594
- queued_blocks = @builder.block_groups[:some_method]
595
- queued_blocks.should eql []
596
- end
597
-
598
- it "should add items to a queue when a new block group is started" do
599
- @builder.some_method do
600
- @builder.queue :myblock1
601
- @builder.queue :myblock2
602
- end
603
- @builder.some_method2 do
604
- @builder.queue :myblock3
605
- end
606
- queued_blocks = @builder.block_groups[:some_method]
607
- queued_blocks.length.should eql 2
608
- queued_blocks.first.name.should eql :myblock1
609
- queued_blocks.second.name.should eql :myblock2
610
- queued_blocks = @builder.block_groups[:some_method2]
611
- queued_blocks.length.should eql 1
612
- queued_blocks.first.name.should eql :myblock3
613
- @builder.queued_blocks.should eql []
614
- end
615
- end
616
497
  end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
+ require 'ruby-debug'
3
4
 
4
5
  require 'blocks' # and any other gems you need
5
6
 
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.3.1
4
+ version: 2.4.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-09-03 00:00:00.000000000 Z
12
+ date: 2013-09-05 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: 709572836072334068
137
+ hash: 1012298278410896826
138
138
  required_rubygems_version: !ruby/object:Gem::Requirement
139
139
  none: false
140
140
  requirements: