semantic_navigation 0.0.10 → 0.0.12

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/.gitignore CHANGED
@@ -4,3 +4,5 @@ Gemfile.lock
4
4
  pkg/*
5
5
  .rvmrc
6
6
  nbproject/*
7
+
8
+ coverage/
data/Changelog.md CHANGED
@@ -1,3 +1,14 @@
1
+ ### 0.0.12 / Not yet
2
+
3
+ * Bug fixes in renderers
4
+ * Added possibility to pass an array of urls for one item
5
+
6
+ ### 0.0.11 / August 4, 2012
7
+
8
+ * Added possibility to define urls in Rails routes way like 'namespace/controller#action'
9
+ * Removed empty `class` parameter for tags
10
+ * Added new semantic navigation configuration methods `header` and `divider`
11
+
1
12
  ### 0.0.10 / July 30, 2012
2
13
 
3
14
  * Added Simple bootstrap navigation class
@@ -33,11 +33,7 @@ module SemanticNavigation
33
33
  def self.styles_for(name)
34
34
  @@render_styles[name.to_sym] = proc
35
35
  end
36
-
37
- def self.to_s
38
- "<#{self.name}:#{@@navigations};#{@@renderers}>"
39
- end
40
-
36
+
41
37
  def self.register_renderer(*options)
42
38
  if options.count == 1
43
39
  name = options[0].name.demodulize.underscore.to_sym
@@ -26,6 +26,18 @@ module SemanticNavigation
26
26
  def view_object
27
27
  SemanticNavigation::Configuration.view_object
28
28
  end
29
+
30
+ def current_page?(options = {})
31
+ result = true
32
+ if options.is_a? Hash
33
+ options.each do |key, value|
34
+ result &= (view_object.params[key.to_sym].to_s == value.to_s)
35
+ end
36
+ else
37
+ result = view_object.current_page? options
38
+ end
39
+ result
40
+ end
29
41
 
30
42
  end
31
43
  end
@@ -1,8 +1,12 @@
1
1
  module SemanticNavigation
2
2
  module Core
3
3
  class Leaf < Base
4
- attr :url, :link_classes
4
+ attr :link_classes
5
5
 
6
+ def url
7
+ @url.is_a?(Array) ? @url.first : @url
8
+ end
9
+
6
10
  def initialize(options, level)
7
11
  super options, level
8
12
  end
@@ -18,7 +22,7 @@ module SemanticNavigation
18
22
 
19
23
  def mark_active
20
24
  if @url
21
- @active = view_object.current_page?(@url)
25
+ @active = [@url].flatten(1).map{|u| current_page?(u) rescue false}.reduce(:"|")
22
26
  else
23
27
  @active = false
24
28
  end
@@ -10,7 +10,7 @@ module SemanticNavigation
10
10
 
11
11
  def item(id, url=nil, options={}, &block)
12
12
  options[:id] = id.to_sym
13
- options[:url] = url unless url.nil?
13
+ options[:url] = decode_url(url) unless url.nil?
14
14
  options[:i18n_name] = @i18n_name
15
15
 
16
16
  if block_given?
@@ -21,14 +21,48 @@ module SemanticNavigation
21
21
  end
22
22
 
23
23
  @sub_elements.push element
24
- end
25
-
24
+ end
25
+
26
+ def header(id, options={})
27
+ options[:id] = id.to_sym
28
+ options[:url] = nil
29
+ options[:i18n_name] = @i18n_name
30
+ @sub_elements.push Leaf.new(options, @level+1)
31
+ end
32
+
33
+ def divider
34
+ options = {:id => :divider,
35
+ :url => nil,
36
+ :i18n_name => nil}
37
+ @sub_elements.push Leaf.new(options, @level+1)
38
+ end
39
+
40
+ def method_missing(m,*args,&block)
41
+ if m.to_s.match(/^[_]+$/).to_a.size > 0
42
+ divider
43
+ else
44
+ super(m,args,&block)
45
+ end
46
+ end
47
+
26
48
  def mark_active
27
49
  @sub_elements.each do |element|
28
50
  element.mark_active
29
51
  end
30
52
  @active = !@sub_elements.find{|element| element.active}.nil?
31
53
  end
54
+
55
+ private
56
+
57
+ def decode_url(url)
58
+ if url.is_a? String
59
+ controller_name, action_name = url.split('#')
60
+ if controller_name && action_name
61
+ url = {:controller => controller_name, :action => action_name}
62
+ end
63
+ end
64
+ url
65
+ end
32
66
 
33
67
  end
34
68
  end
@@ -1,9 +1,14 @@
1
1
  module SemanticNavigation
2
2
  module Core
3
3
  class Node < Navigation
4
- attr :url, :link_classes, :node_classes
4
+ attr :link_classes, :node_classes
5
+
6
+ def url
7
+ @url.is_a?(Array) ? @url.first : @url
8
+ end
5
9
 
6
10
  def initialize(options, level)
11
+ @url = []
7
12
  super options, level
8
13
  end
9
14
 
@@ -18,7 +23,7 @@ module SemanticNavigation
18
23
 
19
24
  def mark_active
20
25
  @sub_elements.each{|element| element.mark_active}
21
- @active = view_object.current_page?(@url)
26
+ @active = [@url].flatten(1).map{|u| current_page?(u) rescue false}.reduce(:"|")
22
27
  @active |= !@sub_elements.find{|element| element.active}.nil?
23
28
  end
24
29
 
@@ -93,13 +93,11 @@ module SemanticNavigation
93
93
  end
94
94
 
95
95
  def merge_classes(name, active, object_classes = [])
96
- classes = []
97
- classes += [send("#{name}_default_classes")].flatten
98
- if active && send("show_#{name}_active_class")
99
- classes.push [send("#{name}_active_class")].flatten
100
- end
101
- classes += [object_classes].flatten
102
- classes.compact
96
+ default_classes = send("#{name}_default_classes")
97
+ active_classes = active && send("show_#{name}_active_class") ? send("#{name}_active_class") : nil
98
+
99
+ classes = [*default_classes, *active_classes, *object_classes]
100
+ !classes.empty? ? classes : nil
103
101
  end
104
102
 
105
103
  def show_id(name, id)
@@ -18,17 +18,17 @@ module SemanticNavigation
18
18
 
19
19
  def navigation(object)
20
20
  content_tag :ul, nil, :id => show_id(:navigation, object.id),
21
- :class => merge_classes(:navigation, object.active, object.classes).push("pull-#{direction}") do
21
+ :class => merge_classes(:navigation, object.active, [object.classes,"pull-#{direction}"]) do
22
22
  yield
23
23
  end
24
24
  end
25
25
 
26
26
  def node(object)
27
27
  content_tag :li, nil, :id => show_id(:leaf, object.id),
28
- :class => merge_classes(:leaf, object.active, object.classes).push(:dropdown) do
28
+ :class => merge_classes(:leaf, object.active, [object.classes,'dropdown'].flatten) do
29
29
  content_tag(:a, :href => '#',
30
30
  :id => show_id(:link, object.id),
31
- :class => merge_classes(:link, object.active, object.link_classes).push('dropdown-toggle'),
31
+ :class => merge_classes(:link, object.active, [object.link_classes,'dropdown-toggle'].flatten),
32
32
  'data-toggle'=> :dropdown) do
33
33
  [object.ico ? content_tag(:i,nil,:class => "icon-#{object.ico}") : '',
34
34
  object.name,
@@ -41,7 +41,7 @@ module SemanticNavigation
41
41
 
42
42
  def node_content(object)
43
43
  content_tag(:ul, nil, :id => show_id(:node, object.id),
44
- :class => merge_classes(:node, false, object.node_classes).push('dropdown-menu')) do
44
+ :class => merge_classes(:node, false, [object.node_classes,'dropdown-menu'].flatten)) do
45
45
  yield
46
46
  end
47
47
  end
@@ -1,3 +1,3 @@
1
1
  module SemanticNavigation
2
- VERSION = "0.0.10"
2
+ VERSION = "0.0.12"
3
3
  end
@@ -21,5 +21,6 @@ Gem::Specification.new do |s|
21
21
 
22
22
  # specify any dependencies here; for example:
23
23
  s.add_development_dependency "rspec", ">=2.0.1"
24
+ s.add_development_dependency "simplecov"
24
25
  s.add_runtime_dependency "rails", ">=3.0.0"
25
26
  end
@@ -2,54 +2,4 @@ require 'spec_helper'
2
2
 
3
3
  describe SemanticNavigation::Configuration do
4
4
 
5
- before :all do
6
- @config_class = SemanticNavigation::Configuration
7
- default_renderers = @config_class.class_variable_get("@@renderers")
8
- default_renderers.keys.should == [:list, :breadcrumb, :bootstrap_breadcrumb, :bootstrap_list, :bootstrap_tabs, :bootstrap_pills]
9
- end
10
-
11
- describe '#navigate' do
12
- it 'should accept navigation method' do
13
- @config_class.class_variable_get("@@navigations").should == {}
14
- SemanticNavigation::Configuration.run do
15
- navigate :navigation
16
- end
17
- navigations = @config_class.class_variable_get("@@navigations")
18
- navigations[:navigation].should_not be_nil
19
- navigations[:navigation].id.should == :navigation
20
- navigations[:navigation].instance_variable_get("@i18n_name").should == 'semantic_navigation.navigation'
21
- end
22
- end
23
-
24
- describe '#styles_for' do
25
- it 'should save the proc' do
26
-
27
- SemanticNavigation::Configuration.run do
28
- styles_for :navigation do
29
- navigation_default_classes [:default]
30
- end
31
- end
32
-
33
- render_styles = @config_class.class_variable_get("@@render_styles")
34
- render_styles[:navigation].should_not be_nil
35
- render_styles[:navigation].class.should == Proc
36
- end
37
- end
38
-
39
- describe 'register_render' do
40
- it 'should get the name and render class and reg as renderer' do
41
- @config_class.register_renderer(:some_renderer,CustomRenderer)
42
- renderers = @config_class.class_variable_get("@@renderers")
43
- renderers[:some_renderer].should_not be_nil
44
- renderers[:some_renderer].should == CustomRenderer
45
- end
46
-
47
- it 'should receive only renderer class and make a renderer name for itself' do
48
- @config_class.register_renderer(CustomRenderer)
49
- renderers = @config_class.class_variable_get("@@renderers")
50
- renderers[:custom_renderer].should_not be_nil
51
- renderers[:custom_renderer].should == CustomRenderer
52
- end
53
- end
54
-
55
5
  end
@@ -0,0 +1 @@
1
+ require 'spec_helper'
@@ -0,0 +1,98 @@
1
+ require 'spec_helper'
2
+
3
+ describe SemanticNavigation::Core::Leaf do
4
+ describe '#name' do
5
+
6
+ it 'should return saved name' do
7
+ leaf = SemanticNavigation::Core::Leaf.new({:id => :first, :name => 'first'},1)
8
+ leaf.name.should == 'first'
9
+ end
10
+
11
+ it 'should return i18n name if @name is nil' do
12
+ leaf = SemanticNavigation::Core::Leaf.new({:id => :first, :i18n_name => 'some_navigation'},1)
13
+ I18n.should_receive(:t).with("some_navigation.first", {:default => ""}).and_return 'first'
14
+ leaf.name.should == 'first'
15
+ end
16
+
17
+ it 'should return result of proc block if name is_a? proc' do
18
+ leaf = SemanticNavigation::Core::Leaf.new({:name => proc{["first", "item"].join(' ')}},1)
19
+ leaf.name.should == "first item"
20
+ end
21
+ end
22
+
23
+ describe '#url' do
24
+ it 'should return passed url' do
25
+ leaf = SemanticNavigation::Core::Leaf.new({:url => {:controller => 'controller', :action => 'action'}},1)
26
+ leaf.url.should == {:controller => 'controller', :action => 'action'}
27
+ end
28
+
29
+ it 'should return first url if passed array of urls' do
30
+ leaf = SemanticNavigation::Core::Leaf.new({:url => [{:controller => 'controller1', :action => 'action'},
31
+ {:controller => 'controller2', :action => 'action'}]},1)
32
+ leaf.url.should == {:controller => 'controller1', :action => 'action'}
33
+ end
34
+ end
35
+
36
+ describe '#mark_active' do
37
+
38
+ before :each do
39
+ @view_object = mock
40
+ SemanticNavigation::Configuration.stub!(:view_object).and_return @view_object
41
+ end
42
+
43
+ it 'should set as active if have active url with symbol names' do
44
+ leaf = SemanticNavigation::Core::Leaf.new({:url => {:controller => :first, :action => :index}}, 1)
45
+ @view_object.stub(:params).and_return({:controller => 'first', :action => 'index'})
46
+ leaf.mark_active.should be_true
47
+ leaf.active.should be_true
48
+ end
49
+
50
+ it 'should set as active if have active url with string names' do
51
+ leaf = SemanticNavigation::Core::Leaf.new({:url => {:controller => "first", :action => "index"}}, 1)
52
+ @view_object.stub(:params).and_return({:controller => 'first', :action => 'index'})
53
+ leaf.mark_active.should be_true
54
+ leaf.active.should be_true
55
+ end
56
+
57
+ it 'should set as inactive if have inactive url with symbol names' do
58
+ leaf = SemanticNavigation::Core::Leaf.new({:url => {:controller => :first, :action => :index}}, 1)
59
+ @view_object.stub(:params).and_return({controller: "second", action: 'index'})
60
+ leaf.mark_active.should be_false
61
+ leaf.active.should be_false
62
+ end
63
+
64
+ it 'should set as inactive if have inactive url with string names' do
65
+ leaf = SemanticNavigation::Core::Leaf.new({:url => {:controller => "first", :action => "index"}}, 1)
66
+ @view_object.stub(:params).and_return({controller: "second", action: 'index'})
67
+ leaf.mark_active.should be_false
68
+ leaf.active.should be_false
69
+ end
70
+
71
+ it 'should set as inactive if have nil url' do
72
+ leaf = SemanticNavigation::Core::Leaf.new({},1)
73
+ leaf.mark_active.should be_false
74
+ leaf.active.should be_false
75
+ end
76
+
77
+ it 'should be active if at least one url in passed array is active' do
78
+ leaf = SemanticNavigation::Core::Leaf.new({:url => [{:controller => :leaf_controller1, :action => :action},
79
+ {:controller => :leaf_controller2, :action => :action}]},1)
80
+ @view_object.stub(:params).and_return(:controller => 'leaf_controller2', :action => 'action')
81
+ leaf.mark_active
82
+ leaf.active.should be_true
83
+ end
84
+
85
+ it 'should accept array like urls with other urls' do
86
+ leaf = SemanticNavigation::Core::Leaf.new({:url => [['url','with','id'],
87
+ :symbol_url_name,
88
+ {:controller => 'hash', :action => 'url'},
89
+ "string_url"]}, 1)
90
+ leaf.should_receive(:current_page?).with(['url','with','id'])
91
+ leaf.should_receive(:current_page?).with(:symbol_url_name)
92
+ leaf.should_receive(:current_page?).with({:controller => 'hash', :action => 'url'})
93
+ leaf.should_receive(:current_page?).with("string_url")
94
+ leaf.mark_active
95
+ end
96
+
97
+ end
98
+ end
@@ -0,0 +1,181 @@
1
+ require 'spec_helper'
2
+
3
+ describe SemanticNavigation::Core::Navigation do
4
+
5
+ describe '#initialize' do
6
+
7
+ it 'should create instance of navigation with level 0 and empty subitems' do
8
+ navigation = SemanticNavigation::Core::Navigation.new({})
9
+ navigation.level.should == 0
10
+ navigation.sub_elements.should be_empty
11
+ end
12
+
13
+ it 'should create instance and save sended options' do
14
+ navigation = SemanticNavigation::Core::Navigation.new :id => :some_id,
15
+ :classes => [:one, :two]
16
+ navigation.id.should == :some_id
17
+ navigation.classes.should == [:one,:two]
18
+ end
19
+
20
+ it 'should create instance and save unintended properties' do
21
+ navigation = SemanticNavigation::Core::Navigation.new :some_attribute => :some_value
22
+ navigation.instance_variable_get("@some_attribute").should == :some_value
23
+ end
24
+
25
+ end
26
+
27
+ describe '#item' do
28
+ before :each do
29
+ @navigation = SemanticNavigation::Core::Navigation.new({})
30
+ end
31
+
32
+ it "should receive item method and make the leaf" do
33
+ @navigation.item :some_id, 'some_url'
34
+ @navigation.sub_elements.size.should == 1
35
+ @navigation.sub_elements.first.is_a?(SemanticNavigation::Core::Leaf).should be_true
36
+ end
37
+
38
+ it "should receive item method with block and create node" do
39
+ @navigation.item :node_id, 'node_url' do
40
+ item :leaf_id, 'leaf_url'
41
+ end
42
+ @navigation.sub_elements.size.should == 1
43
+ @navigation.sub_elements.first.is_a?(SemanticNavigation::Core::Node).should be_true
44
+ end
45
+ end
46
+
47
+ describe '#header' do
48
+ before :each do
49
+ @navigation = SemanticNavigation::Core::Navigation.new({})
50
+ @navigation.header :some_id
51
+ end
52
+
53
+ it "should create item with nil url" do
54
+ @navigation.sub_elements.size.should == 1
55
+ @navigation.sub_elements.first.url.should be_nil
56
+ end
57
+ end
58
+
59
+ describe "#divider" do
60
+ before :each do
61
+ @navigation = SemanticNavigation::Core::Navigation.new({})
62
+ end
63
+
64
+ it "should create divider item with nil url and name" do
65
+ @navigation.divider
66
+ @navigation.sub_elements.size.should == 1
67
+ @navigation.sub_elements.first.url.should be_nil
68
+ @navigation.sub_elements.first.name.should be_empty
69
+ end
70
+
71
+ it "should receive any length method containing char `_` and create divider" do
72
+
73
+ (1..10).each do |c|
74
+ @navigation.send ('_'*c).to_sym
75
+ end
76
+ @navigation.sub_elements.size.should == 10
77
+ @navigation.sub_elements.map(&:id).should == [:divider]*10
78
+ end
79
+ end
80
+
81
+ describe "#decode_url" do
82
+
83
+ before :each do
84
+ @navigation = SemanticNavigation::Core::Navigation.new({})
85
+ end
86
+
87
+ it "while creating the item make support for urls in format controller#action" do
88
+ view_object = mock
89
+
90
+ @navigation.item :some_id, 'controller#action'
91
+ @navigation.sub_elements.size.should == 1
92
+ @navigation.sub_elements.first.url.should == {:controller => "controller", :action => "action"}
93
+ end
94
+ end
95
+
96
+ describe '#render_if' do
97
+ it 'should return true if render_if proc is nil' do
98
+ navigation = SemanticNavigation::Core::Navigation.new({})
99
+ navigation.render_if.should be_true
100
+ end
101
+
102
+ it 'should return true if render_if proc return true' do
103
+ navigation = SemanticNavigation::Core::Navigation.new({:render_if => proc{true}})
104
+ navigation.render_if.should be_true
105
+ end
106
+
107
+ it 'should return false if render_if proc return false' do
108
+ navigation = SemanticNavigation::Core::Navigation.new({:render_if => proc{false}})
109
+ navigation.render_if.should be_false
110
+ end
111
+ end
112
+
113
+ describe '#render' do
114
+ it 'should call renderer class :render_navigation method' do
115
+ renderer = mock
116
+ navigation = SemanticNavigation::Core::Navigation.new({})
117
+ renderer.should_receive(:render_navigation).with(navigation)
118
+ navigation.render(renderer)
119
+ end
120
+ end
121
+
122
+ describe '#mark_active' do
123
+ before :each do
124
+ @navigation = SemanticNavigation::Core::Navigation.new({})
125
+
126
+ @view_object = mock
127
+ SemanticNavigation::Configuration.stub(:view_object).and_return @view_object
128
+ end
129
+
130
+ it 'should define @active variable to false if no sub_elemetns' do
131
+ @navigation.mark_active
132
+ @navigation.instance_variable_get("@active").should be false
133
+ end
134
+
135
+ it 'should define @active variable to true if at least one sub_element is active' do
136
+ @navigation.item :first_item, '111'
137
+ @navigation.item :second_item, '222'
138
+ @view_object.should_receive(:current_page?).with('111').and_return true
139
+ @view_object.should_receive(:current_page?).with('222').and_return false
140
+
141
+ @navigation.mark_active
142
+ end
143
+
144
+ it 'should define @active variable to false if all sub_elements is unactive' do
145
+ @navigation.item :first_item, '333'
146
+ @navigation.item :secodn_item, '444'
147
+ @view_object.should_receive(:current_page?).with('333').and_return false
148
+ @view_object.should_receive(:current_page?).with('444').and_return false
149
+
150
+ @navigation.mark_active
151
+ end
152
+
153
+ it 'should use custom current_page? for Hash url params' do
154
+ @navigation.item :first_item, {:controller => "controller1", :action => "action"}
155
+ @navigation.item :second_item, {:controller => "controller2", :action => "action"}
156
+ @view_object.stub(:params).and_return({:controller => "controller1", :action => "action", :some_other_params => "blablabla"})
157
+
158
+ @navigation.mark_active
159
+ @navigation.sub_elements[0].active.should be_true
160
+ @navigation.sub_elements[1].active.should be_false
161
+ end
162
+
163
+ it 'should work for route like urls as good as for Hash url params' do
164
+ @navigation.item :first_item, "controller1#action"
165
+ @navigation.item :second_item, "controller2#action"
166
+ @view_object.stub(:params).and_return({:controller => "controller1", :action => "action", :some_other_params => "blablabla"})
167
+
168
+ @navigation.mark_active
169
+ @navigation.sub_elements[0].active.should be_true
170
+ @navigation.sub_elements[1].active.should be_false
171
+ end
172
+
173
+ end
174
+
175
+ describe '#method_missing' do
176
+ it 'should get unknown method and call super' do
177
+ @navigation = SemanticNavigation::Core::Navigation.new({})
178
+ lambda{@navigation.unknow_method}.should raise_exception
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,118 @@
1
+ require 'spec_helper'
2
+
3
+ describe SemanticNavigation::Core::Node do
4
+
5
+ describe '#name' do
6
+
7
+ it 'should return passed name while creating node' do
8
+ node = SemanticNavigation::Core::Node.new({:name => 'some name'}, 1)
9
+ node.name.should == 'some name'
10
+ end
11
+
12
+ it 'should return i18n name if passed name is nil' do
13
+ node = SemanticNavigation::Core::Node.new({:id => :some_id, :i18n_name => :parent_name}, 1)
14
+ I18n.should_receive(:t).with("parent_name.some_id", {:default=>""}).and_return 'some name'
15
+ node.name.should == 'some name'
16
+ end
17
+
18
+ it 'should return result of proc if passed name is a proc' do
19
+ node = SemanticNavigation::Core::Node.new({:name => proc{'some name'}},1)
20
+ node.name.should == 'some name'
21
+ end
22
+ end
23
+
24
+ describe '#url' do
25
+ it 'should return passed url' do
26
+ node = SemanticNavigation::Core::Node.new({:url => {:controller => 'controller', :action => 'action'}},1)
27
+ node.url.should == {:controller => 'controller', :action => 'action'}
28
+ end
29
+
30
+ it 'should return first url if passed array of urls' do
31
+ node = SemanticNavigation::Core::Node.new({:url => [{:controller => 'controller1', :action => 'action'},
32
+ {:controller => 'controller2', :action => 'action'}]},1)
33
+ node.url.should == {:controller => 'controller1', :action => 'action'}
34
+ end
35
+ end
36
+
37
+ describe '#mark_active' do
38
+ before :each do
39
+ @node = SemanticNavigation::Core::Node.new({:url => [{:controller => :node_controller, :action => :action},
40
+ {:controller => :node_controller2, :action => :action}]},1)
41
+
42
+ @view_object = mock
43
+ @view_object.stub(:params).and_return({:action => "some", :action => "some"})
44
+ SemanticNavigation::Configuration.stub(:view_object).and_return @view_object
45
+ end
46
+
47
+ it 'should define @active variable to false if no active sub_elements and node url is not active' do
48
+ @node.mark_active
49
+ @node.instance_variable_get("@active").should be_false
50
+ end
51
+
52
+ it 'should define @active variable to true if at least one sub_element is active' do
53
+ @node.item :first_item, '111'
54
+ @node.item :second_item, '222'
55
+ @view_object.should_receive(:current_page?).with('111').and_return true
56
+ @view_object.should_receive(:current_page?).with('222').and_return false
57
+
58
+ @node.mark_active
59
+ @node.sub_elements[0].active.should be_true
60
+ @node.sub_elements[1].active.should be_false
61
+ @node.active.should be_true
62
+ end
63
+
64
+ it 'should define @active variable to false if all sub_elements is unactive' do
65
+ @node.item :first_item, '333'
66
+ @node.item :second_item, '444'
67
+ @view_object.should_receive(:current_page?).with('333').and_return false
68
+ @view_object.should_receive(:current_page?).with('444').and_return false
69
+
70
+ @node.mark_active
71
+ @node.sub_elements[0].active.should be_false
72
+ @node.sub_elements[1].active.should be_false
73
+ @node.active.should be_false
74
+ end
75
+
76
+ it 'should use custom current_page? for Hash url params' do
77
+ @node.item :first_item, {:controller => "controller1", :action => "action"}
78
+ @node.item :second_item, {:controller => "controller2", :action => "action"}
79
+ @view_object.stub(:params).and_return({:controller => "controller1", :action => "action", :some_other_params => "blablabla"})
80
+
81
+ @node.mark_active
82
+ @node.sub_elements[0].active.should be_true
83
+ @node.sub_elements[1].active.should be_false
84
+ @node.active.should be true
85
+ end
86
+
87
+ it 'should work for route like urls as good as for Hash url params' do
88
+ @node.item :first_item, "controller1#action"
89
+ @node.item :second_item, "controller2#action"
90
+ @view_object.stub(:params).and_return({:controller => "controller1", :action => "action", :some_other_params => "blablabla"})
91
+
92
+ @node.mark_active
93
+ @node.sub_elements[0].active.should be_true
94
+ @node.sub_elements[1].active.should be_false
95
+ @node.active.should be true
96
+ end
97
+
98
+ it 'should be active if at least one url in passed array is active' do
99
+ @view_object.stub(:params).and_return(:controller => 'node_controller2', :action => 'action')
100
+ @node.mark_active
101
+ @node.active.should be_true
102
+ end
103
+
104
+ it 'should accept array like urls with other urls' do
105
+ node = SemanticNavigation::Core::Node.new({:url => [['url','with','id'],
106
+ :symbol_url_name,
107
+ {:controller => 'hash', :action => 'url'},
108
+ "string_url"]}, 1)
109
+ node.should_receive(:current_page?).with(['url','with','id'])
110
+ node.should_receive(:current_page?).with(:symbol_url_name)
111
+ node.should_receive(:current_page?).with({:controller => 'hash', :action => 'url'})
112
+ node.should_receive(:current_page?).with("string_url")
113
+ node.mark_active
114
+ end
115
+
116
+ end
117
+
118
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,12 @@
1
- require 'rails'
2
1
  require 'rspec'
2
+ require 'rails'
3
+ require 'simplecov'
4
+ SimpleCov.start do
5
+ add_filter '/spec/'
6
+ add_group "Core", "lib/semantic_navigation/core"
7
+ add_group "Renderers", "lib/semantic_navigation/renderers"
8
+ add_group "Twitter Bootstrap Renderer", "lib/semantic_navigation/twitter_bootstrap"
9
+ end
3
10
  require 'semantic_navigation'
4
11
 
5
12
  RSpec.configure do |config|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: semantic_navigation
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.12
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-30 00:00:00.000000000 Z
12
+ date: 2012-08-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &16243940 !ruby/object:Gem::Requirement
16
+ requirement: &13675440 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,21 @@ dependencies:
21
21
  version: 2.0.1
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *16243940
24
+ version_requirements: *13675440
25
+ - !ruby/object:Gem::Dependency
26
+ name: simplecov
27
+ requirement: &13674940 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *13674940
25
36
  - !ruby/object:Gem::Dependency
26
37
  name: rails
27
- requirement: &16243420 !ruby/object:Gem::Requirement
38
+ requirement: &13674260 !ruby/object:Gem::Requirement
28
39
  none: false
29
40
  requirements:
30
41
  - - ! '>='
@@ -32,7 +43,7 @@ dependencies:
32
43
  version: 3.0.0
33
44
  type: :runtime
34
45
  prerelease: false
35
- version_requirements: *16243420
46
+ version_requirements: *13674260
36
47
  description: ! "Simply and customizable navigation in the Ruby on Rails 3 application.\n
37
48
  \ Predefined bootstrap renderers"
38
49
  email:
@@ -70,6 +81,10 @@ files:
70
81
  - lib/semantic_navigation/version.rb
71
82
  - semantic_navigation.gemspec
72
83
  - spec/lib/semantic_navigation/configuration_spec.rb
84
+ - spec/lib/semantic_navigation/core/base_spec.rb
85
+ - spec/lib/semantic_navigation/core/leaf_spec.rb
86
+ - spec/lib/semantic_navigation/core/navigation_spec.rb
87
+ - spec/lib/semantic_navigation/core/node_spec.rb
73
88
  - spec/lib/semantic_navigation/custom_renderer.rb
74
89
  - spec/lib/semantic_navigation/helper_methods_spec.rb
75
90
  - spec/lib/semantic_navigation_spec.rb