simple-navigation 1.2.1 → 1.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +4 -0
- data/VERSION.yml +1 -1
- data/lib/simple_navigation.rb +1 -0
- data/lib/simple_navigation/configuration.rb +23 -8
- data/lib/simple_navigation/item.rb +4 -3
- data/lib/simple_navigation/renderer/base.rb +17 -3
- data/lib/simple_navigation/renderer/list.rb +1 -1
- data/spec/lib/simple_navigation/configuration_spec.rb +31 -0
- data/spec/lib/simple_navigation/item_container_spec.rb +8 -7
- data/spec/lib/simple_navigation/item_spec.rb +24 -2
- data/spec/lib/simple_navigation/renderer/base_spec.rb +43 -2
- data/spec/lib/simple_navigation_spec.rb +1 -0
- metadata +1 -1
data/CHANGELOG
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
*master
|
2
|
+
|
3
|
+
* renderers now have access to request_forgery_protection stuff (this allows delete-links as navigation-items)
|
4
|
+
|
1
5
|
*1.2.1
|
2
6
|
|
3
7
|
* changed way to include render_*-helper_methods into view (including them into Controller and declaring them as helper_methods instead of adding whole module as Helper). this seems to be more reliable under certain conditions. Credits to Gernot Kogler.
|
data/VERSION.yml
CHANGED
data/lib/simple_navigation.rb
CHANGED
@@ -10,15 +10,29 @@ module SimpleNavigation
|
|
10
10
|
attr_accessor :selected_class
|
11
11
|
attr_reader :primary_navigation
|
12
12
|
|
13
|
-
|
14
|
-
def self.eval_config(context)
|
15
|
-
context.instance_eval(SimpleNavigation.config_file)
|
16
|
-
end
|
13
|
+
class << self
|
17
14
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
# Evals the config_file inside the specified context (usually a controller or view)
|
16
|
+
def eval_config(context)
|
17
|
+
context.instance_eval(SimpleNavigation.config_file)
|
18
|
+
SimpleNavigation.controller = extract_controller_from context
|
19
|
+
end
|
20
|
+
|
21
|
+
# Starts processing the configuration
|
22
|
+
def run(&block)
|
23
|
+
block.call Configuration.instance
|
24
|
+
end
|
25
|
+
|
26
|
+
# Extracts a controller from the context.
|
27
|
+
def extract_controller_from(context)
|
28
|
+
if context.respond_to? :controller
|
29
|
+
context.controller
|
30
|
+
else
|
31
|
+
context
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
22
36
|
|
23
37
|
# Sets the config's default-settings
|
24
38
|
def initialize
|
@@ -36,6 +50,7 @@ module SimpleNavigation
|
|
36
50
|
def loaded?
|
37
51
|
!@primary_navigation.nil?
|
38
52
|
end
|
53
|
+
|
39
54
|
end
|
40
55
|
|
41
56
|
end
|
@@ -2,14 +2,15 @@ module SimpleNavigation
|
|
2
2
|
|
3
3
|
# Represents an item in your navigation. Gets generated by the item method in the config-file.
|
4
4
|
class Item
|
5
|
-
attr_reader :key, :name, :url, :sub_navigation
|
5
|
+
attr_reader :key, :name, :url, :sub_navigation, :method
|
6
6
|
|
7
7
|
# see ItemContainer#item
|
8
|
-
def initialize(key, name, url,
|
8
|
+
def initialize(key, name, url, options, sub_nav_block)
|
9
9
|
@key = key
|
10
|
+
@method = options.delete(:method)
|
10
11
|
@name = name
|
11
12
|
@url = url
|
12
|
-
@html_options =
|
13
|
+
@html_options = options
|
13
14
|
if sub_nav_block
|
14
15
|
@sub_navigation = ItemContainer.new
|
15
16
|
sub_nav_block.call @sub_navigation
|
@@ -10,13 +10,27 @@ module SimpleNavigation
|
|
10
10
|
include ActionView::Helpers::UrlHelper
|
11
11
|
include ActionView::Helpers::TagHelper
|
12
12
|
|
13
|
-
attr_reader :current_navigation, :current_sub_navigation
|
13
|
+
attr_reader :current_navigation, :current_sub_navigation, :controller
|
14
|
+
|
15
|
+
class << self
|
16
|
+
|
17
|
+
# Delegates method calls to the controller.
|
18
|
+
def controller_method(*methods)
|
19
|
+
methods.each do |method|
|
20
|
+
delegate method, :to => :controller
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
controller_method :form_authenticity_token, :protect_against_forgery?, :request_forgery_protection_token
|
14
27
|
|
15
28
|
def initialize(current_navigation, current_sub_navigation=nil) #:nodoc:
|
16
29
|
@current_navigation = current_navigation
|
17
30
|
@current_sub_navigation = current_sub_navigation
|
31
|
+
@controller = SimpleNavigation.controller
|
18
32
|
end
|
19
|
-
|
33
|
+
|
20
34
|
# Renders the specified ItemContainer to HTML.
|
21
35
|
#
|
22
36
|
# If <tt>include_sub_navigation</tt> is set to true, the renderer should nest the sub_navigation for the active navigation
|
@@ -24,7 +38,7 @@ module SimpleNavigation
|
|
24
38
|
def render(item_container, include_sub_navigation=false)
|
25
39
|
raise 'subclass responsibility'
|
26
40
|
end
|
27
|
-
|
41
|
+
|
28
42
|
end
|
29
43
|
end
|
30
44
|
end
|
@@ -12,7 +12,7 @@ module SimpleNavigation
|
|
12
12
|
def render(item_container, include_sub_navigation=false)
|
13
13
|
list_content = item_container.items.inject([]) do |list, item|
|
14
14
|
html_options = item.html_options(current_navigation)
|
15
|
-
li_content = link_to(item.name, item.url, :class => item.selected_class(current_navigation))
|
15
|
+
li_content = link_to(item.name, item.url, :class => item.selected_class(current_navigation), :method => item.method)
|
16
16
|
li_content << (item.sub_navigation.render(current_sub_navigation)) if include_sub_navigation && item.sub_navigation && item.selected?(current_navigation)
|
17
17
|
list << content_tag(:li, li_content, html_options)
|
18
18
|
end
|
@@ -17,6 +17,7 @@ describe SimpleNavigation::Configuration do
|
|
17
17
|
describe 'self.eval_config' do
|
18
18
|
before(:each) do
|
19
19
|
@context = mock(:context)
|
20
|
+
@context.stub!(:instance_eval)
|
20
21
|
@config_file = stub(:config_file)
|
21
22
|
SimpleNavigation.stub!(:config_file).and_return(@config_file)
|
22
23
|
end
|
@@ -24,8 +25,38 @@ describe SimpleNavigation::Configuration do
|
|
24
25
|
@context.should_receive(:instance_eval).with(@config_file)
|
25
26
|
SimpleNavigation::Configuration.eval_config(@context)
|
26
27
|
end
|
28
|
+
it "should set the controller" do
|
29
|
+
@controller = stub(:controller)
|
30
|
+
SimpleNavigation::Configuration.should_receive(:extract_controller_from).with(@context).and_return(@controller)
|
31
|
+
SimpleNavigation.should_receive(:controller=).with(@controller)
|
32
|
+
SimpleNavigation::Configuration.eval_config(@context)
|
33
|
+
end
|
27
34
|
end
|
28
35
|
|
36
|
+
describe 'self.extract_controller_from' do
|
37
|
+
before(:each) do
|
38
|
+
@nav_context = stub(:nav_context)
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'object responds to controller' do
|
42
|
+
before(:each) do
|
43
|
+
@controller = stub(:controller)
|
44
|
+
@nav_context.stub!(:controller).and_return(@controller)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should return the controller" do
|
48
|
+
SimpleNavigation::Configuration.extract_controller_from(@nav_context).should == @controller
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'object does not respond to controller' do
|
54
|
+
it "should return the nav_context" do
|
55
|
+
SimpleNavigation::Configuration.extract_controller_from(@nav_context).should == @nav_context
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
29
60
|
describe 'initialize' do
|
30
61
|
it "should set the List-Renderer as default upon initialize" do
|
31
62
|
@config.renderer.should == SimpleNavigation::Renderer::List
|
@@ -21,6 +21,7 @@ describe SimpleNavigation::ItemContainer do
|
|
21
21
|
|
22
22
|
before(:each) do
|
23
23
|
@item_container.stub!(:should_add_item?).and_return(true)
|
24
|
+
@options = {}
|
24
25
|
end
|
25
26
|
|
26
27
|
context 'block given' do
|
@@ -30,28 +31,28 @@ describe SimpleNavigation::ItemContainer do
|
|
30
31
|
end
|
31
32
|
|
32
33
|
it "should should yield an new ItemContainer" do
|
33
|
-
@item_container.item('key', 'name', 'url',
|
34
|
+
@item_container.item('key', 'name', 'url', @options) do |container|
|
34
35
|
container.should == @sub_container
|
35
36
|
end
|
36
37
|
end
|
37
38
|
it "should create a new Navigation-Item with the given params and the specified block" do
|
38
|
-
SimpleNavigation::Item.should_receive(:new).with('key', 'name', 'url',
|
39
|
-
@item_container.item('key', 'name', 'url',
|
39
|
+
SimpleNavigation::Item.should_receive(:new).with('key', 'name', 'url', @options, @proc)
|
40
|
+
@item_container.item('key', 'name', 'url', @options, &@proc)
|
40
41
|
end
|
41
42
|
it "should add the created item to the list of items" do
|
42
43
|
@item_container.items.should_receive(:<<)
|
43
|
-
@item_container.item('key', 'name', 'url',
|
44
|
+
@item_container.item('key', 'name', 'url', @options) {}
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
47
48
|
context 'no block given' do
|
48
49
|
it "should create a new Navigation_item with the given params and nil as sub_navi" do
|
49
|
-
SimpleNavigation::Item.should_receive(:new).with('key', 'name', 'url',
|
50
|
-
@item_container.item('key', 'name', 'url',
|
50
|
+
SimpleNavigation::Item.should_receive(:new).with('key', 'name', 'url', @options, nil)
|
51
|
+
@item_container.item('key', 'name', 'url', @options)
|
51
52
|
end
|
52
53
|
it "should add the created item to the list of items" do
|
53
54
|
@item_container.items.should_receive(:<<)
|
54
|
-
@item_container.item('key', 'name', 'url',
|
55
|
+
@item_container.item('key', 'name', 'url', @options)
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
@@ -3,7 +3,29 @@ require File.dirname(__FILE__) + '/../../spec_helper'
|
|
3
3
|
describe SimpleNavigation::Item do
|
4
4
|
|
5
5
|
describe 'initialize' do
|
6
|
-
|
6
|
+
context 'method' do
|
7
|
+
context 'defined' do
|
8
|
+
before(:each) do
|
9
|
+
@options = {:method => :delete}
|
10
|
+
@item = SimpleNavigation::Item.new(:my_key, 'name', 'url', @options, nil)
|
11
|
+
end
|
12
|
+
it 'should set the method as instance_var' do
|
13
|
+
@item.method.should == :delete
|
14
|
+
end
|
15
|
+
it 'should set the html-options without the method' do
|
16
|
+
@item.instance_variable_get(:@html_options).key?(:method).should be_false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'undefined' do
|
21
|
+
before(:each) do
|
22
|
+
@item = SimpleNavigation::Item.new(:my_key, 'name', 'url', {}, nil)
|
23
|
+
end
|
24
|
+
it 'should set the instance-var to nil' do
|
25
|
+
@item.method.should be_nil
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
7
29
|
end
|
8
30
|
|
9
31
|
describe 'selected?' do
|
@@ -94,7 +116,7 @@ describe SimpleNavigation::Item do
|
|
94
116
|
it {@item.html_options(:bla)[:id].should == 'my_key'}
|
95
117
|
end
|
96
118
|
end
|
97
|
-
|
119
|
+
|
98
120
|
end
|
99
121
|
|
100
122
|
|
@@ -2,6 +2,8 @@ require File.dirname(__FILE__) + '/../../../spec_helper'
|
|
2
2
|
|
3
3
|
describe SimpleNavigation::Renderer::Base do
|
4
4
|
before(:each) do
|
5
|
+
@controller = stub(:controller)
|
6
|
+
SimpleNavigation.stub!(:controller).and_return(@controller)
|
5
7
|
@base_renderer = SimpleNavigation::Renderer::Base.new(:current_primary, :current_secondary)
|
6
8
|
end
|
7
9
|
it "should inclue ActionView::Helpers::UrlHelper" do
|
@@ -10,6 +12,45 @@ describe SimpleNavigation::Renderer::Base do
|
|
10
12
|
it "should include ActionView::Helpers::TagHelper" do
|
11
13
|
@base_renderer.should respond_to(:content_tag)
|
12
14
|
end
|
13
|
-
|
14
|
-
|
15
|
+
|
16
|
+
describe 'delegated methods' do
|
17
|
+
it {@base_renderer.should respond_to(:form_authenticity_token)}
|
18
|
+
it {@base_renderer.should respond_to(:protect_against_forgery?)}
|
19
|
+
it {@base_renderer.should respond_to(:request_forgery_protection_token)}
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'initialize' do
|
23
|
+
it {@base_renderer.current_navigation.should == :current_primary}
|
24
|
+
it {@base_renderer.current_sub_navigation.should == :current_secondary}
|
25
|
+
it {@base_renderer.controller.should == @controller}
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'controller_method' do
|
29
|
+
context 'delegate a single method' do
|
30
|
+
before(:each) do
|
31
|
+
@base_renderer.class_eval do
|
32
|
+
controller_method :my_method
|
33
|
+
end
|
34
|
+
end
|
35
|
+
it 'should delegate a controller_method to the controller' do
|
36
|
+
@controller.should_receive(:my_method)
|
37
|
+
@base_renderer.my_method
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'delegate multiple methods' do
|
42
|
+
before(:each) do
|
43
|
+
@base_renderer.class_eval do
|
44
|
+
controller_method :test1, :test2
|
45
|
+
end
|
46
|
+
end
|
47
|
+
it 'should delegate all controller_methods to the controller' do
|
48
|
+
@controller.should_receive(:test1)
|
49
|
+
@base_renderer.test1
|
50
|
+
@controller.should_receive(:test2)
|
51
|
+
@base_renderer.test2
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
15
56
|
end
|