menu_builder 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ require 'bundler'
4
4
  Bundler::GemHelper.install_tasks
5
5
 
6
6
  require 'rake/testtask'
7
- require 'rake/rdoctask'
7
+ require 'rdoc/task'
8
8
 
9
9
  desc 'Default: run unit tests.'
10
10
  task :default => :test
@@ -1,23 +1,71 @@
1
1
  module MenuBuilder
2
2
  module ViewHelpers
3
- class Menu
4
- def initialize(context)
5
- @context = context
6
- @menu_items = @context.instance_variable_get('@menu_items')
7
- end
3
+ def menu(options={}, &block)
4
+ content_tag :ul, Menu.new(self, &block).render, options
5
+ end
8
6
 
9
- def included_in_current_items?(item)
10
- @menu_items.present? && @menu_items.include?(item.to_sym)
11
- end
7
+ private
8
+
9
+ class MenuItem
10
+ attr_reader :item, :args, :block
12
11
 
13
- def method_missing(item, *args, &block)
14
- css_class = "current" if included_in_current_items? item
15
- @context.content_tag :li, @context.link_to(*args, &block), :class=>css_class
12
+ def initialize(item, args, block)
13
+ @item, @args, @block = item, args, block
14
+ end
15
+
16
+ def link_to_in_context context
17
+ context.link_to *@args, &@block
18
+ end
19
+
20
+ def to_sym
21
+ item.to_sym
22
+ end
16
23
  end
17
- end
18
24
 
19
- def menu(options={}, &block)
20
- content_tag :ul, capture(Menu.new(self), &block), options
21
- end
25
+ class Menu
26
+ def initialize(context, &block)
27
+ @context = context
28
+ @menu_items = context.instance_variable_get('@menu_items')
29
+ @actual_items = []
30
+ @block = block
31
+ end
32
+
33
+ def method_missing item, *args, &block
34
+ @actual_items << MenuItem.new(item, args, block)
35
+ nil
36
+ end
37
+
38
+ def render
39
+ @block.call(self)
40
+ @actual_items.map { |item| render_one item }.join.html_safe
41
+ end
42
+
43
+ def render_one item
44
+ @context.content_tag :li, item.link_to_in_context(@context), html_options_for(item)
45
+ end
46
+
47
+ def html_options_for item
48
+ css_classes = []
49
+ css_classes << "current" if included_in_current_items? item
50
+ css_classes << "first" if first? item
51
+ css_classes << "last" if last? item
52
+
53
+ options = {}
54
+ options[:class] = css_classes.join(" ") if css_classes.any?
55
+ options
56
+ end
57
+
58
+ def included_in_current_items?(item)
59
+ @menu_items.present? && @menu_items.include?(item.to_sym)
60
+ end
61
+
62
+ def last? item
63
+ @actual_items.last == item
64
+ end
65
+
66
+ def first? item
67
+ @actual_items.first == item
68
+ end
69
+ end
22
70
  end
23
- end
71
+ end
@@ -1,3 +1,3 @@
1
1
  module MenuBuilder
2
- VERSION = "0.4.1"
2
+ VERSION = "0.4.2"
3
3
  end
data/test/helper_test.rb CHANGED
@@ -6,9 +6,9 @@ class HelperTest < ActionView::TestCase
6
6
  attr_accessor :controller, :request
7
7
 
8
8
  test "menu yields an instance of Menu" do
9
- concat(menu do |m|
9
+ concat(menu { |m|
10
10
  assert m.instance_of?(MenuBuilder::ViewHelpers::Menu)
11
- end)
11
+ })
12
12
  end
13
13
 
14
14
  test "menu create an unordered list" do
@@ -17,7 +17,7 @@ class HelperTest < ActionView::TestCase
17
17
  end
18
18
 
19
19
  test "menu accept html options like classes and id" do
20
- concat(menu :id=>"menu", :class=>"tabs" do |m| end)
20
+ concat(menu(:id=>"menu", :class=>"tabs") { |m| })
21
21
  assert_select "ul#menu.tabs"
22
22
  end
23
23
 
@@ -28,16 +28,15 @@ class HelperTest < ActionView::TestCase
28
28
 
29
29
  test "create a link inside line item" do
30
30
  concat(menu { |m| concat m.home "Home", "/" })
31
- expected = %(<ul><li><a href="/">Home</a></li></ul>)
32
- assert_dom_equal expected, output_buffer
31
+ assert_select "ul > li > a"
33
32
  end
34
33
 
35
34
  test "set the class to the current item li" do
36
35
  @menu_items = [:home]
37
- concat(menu do |m|
36
+ concat(menu { |m|
38
37
  concat m.home "Home", "/"
39
38
  concat m.contact "Store", "/store"
40
- end)
39
+ })
41
40
 
42
41
  assert_select "li.current", 1
43
42
  end
@@ -45,11 +44,11 @@ class HelperTest < ActionView::TestCase
45
44
  test "accept more than one menu item" do
46
45
  @menu_items = [:settings, :notifications]
47
46
 
48
- concat(menu do |m|
47
+ concat(menu { |m|
49
48
  concat m.home "Home", "/"
50
49
  concat m.notifications "Notifications", "/notifications"
51
50
  concat m.settings "Settings", "/settings"
52
- end)
51
+ })
53
52
 
54
53
  assert_select "li.current", 2
55
54
  end
@@ -57,16 +56,43 @@ class HelperTest < ActionView::TestCase
57
56
  test "accept more than one menu" do
58
57
  @menu_items = [:settings, :notifications]
59
58
 
60
- concat(menu do |m|
59
+ concat(menu { |m|
61
60
  concat m.home "Home", "/"
62
61
  concat m.notifications "Notifications", "/notifications"
63
- end)
62
+ })
64
63
 
65
- concat(menu do |m|
64
+ concat(menu { |m|
66
65
  concat m.home "Contact", "/contact"
67
66
  concat m.notifications "Settings", "/settings"
68
- end)
67
+ })
69
68
 
70
69
  assert_select "li.current", 2
71
70
  end
72
- end
71
+
72
+ test "marks the first item with class .first" do
73
+ concat(menu { |m|
74
+ concat m.home "Home", "/"
75
+ concat m.contact "Store", "/store"
76
+ })
77
+ assert_select "li.first", 1
78
+ end
79
+
80
+ test 'marks the last item with class .last' do
81
+ concat(menu { |m|
82
+ concat m.home "Home", "/"
83
+ concat m.contact "Store", "/store"
84
+ concat m.notifications "Settings", "/settings"
85
+ })
86
+ assert_select "li.last", 1
87
+ end
88
+
89
+ test "pass a block to an item" do
90
+ concat(menu { |m|
91
+ concat(m.account("/account") {
92
+ concat tag(:img, nil, { :src => 'icon.jpg' })
93
+ })
94
+ })
95
+
96
+ assert_select "ul > li > a > img"
97
+ end
98
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: menu_builder
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 11
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
- - 1
10
- version: 0.4.1
9
+ - 2
10
+ version: 0.4.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Daniel Lopes
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-07 00:00:00 Z
18
+ date: 2011-06-06 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: actionpack