simple-navigation 3.2.0 → 3.3.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 +10 -0
- data/VERSION +1 -1
- data/lib/simple_navigation/adapters/rails.rb +4 -3
- data/lib/simple_navigation/rendering/helpers.rb +61 -28
- data/spec/lib/simple_navigation/adapters/rails_spec.rb +4 -1
- data/spec/lib/simple_navigation/rendering/helpers_spec.rb +77 -4
- data/spec/spec_helper.rb +13 -3
- metadata +6 -45
data/CHANGELOG
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
*3.3.0
|
2
|
+
|
3
|
+
* add a new method active_navigation_item_key which returns the symbol for the currently selected navigation item in a similar way to active_navigation_item_name does for the name (useful for CSS class styling for eg.)
|
4
|
+
* open up the helper API to provide active_navigation_item and active_navigation_item_container methods to make it easy to access the items/containers should it be necessary (came for free with the above refactoring)
|
5
|
+
* isolate the apply_defaults and load_config private methods from ActionController mixin leakage by refactoring to module class instance methods
|
6
|
+
* addition of test coverage for the added helpers within helpers_spec.rb
|
7
|
+
* inclusion of new helpers within the rails adapter and minor refactoring to DRY up the helper_method invocations
|
8
|
+
* addition of test coverage for the newly included helpers
|
9
|
+
* Credits to Mark J. Titorenko for all the changes in this release! Thanks.
|
10
|
+
|
1
11
|
*3.2.0
|
2
12
|
|
3
13
|
* Added Renderer::Text for rendering selected navigation items without markup (useful for dynamic page titles). Credits to Tim Cowlishaw.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.3.0
|
@@ -7,8 +7,9 @@ module SimpleNavigation
|
|
7
7
|
def self.register
|
8
8
|
SimpleNavigation.set_env(rails_root, rails_env)
|
9
9
|
ActionController::Base.send(:include, SimpleNavigation::Helpers)
|
10
|
-
|
11
|
-
|
10
|
+
SimpleNavigation::Helpers.instance_methods.each do |m|
|
11
|
+
ActionController::Base.send(:helper_method, m.to_sym)
|
12
|
+
end
|
12
13
|
end
|
13
14
|
|
14
15
|
def initialize(context)
|
@@ -91,4 +92,4 @@ if defined?(Rails) && Rails::VERSION::MAJOR == 3
|
|
91
92
|
end
|
92
93
|
end
|
93
94
|
end
|
94
|
-
end
|
95
|
+
end
|
@@ -32,14 +32,29 @@ module SimpleNavigation
|
|
32
32
|
# * <tt>:items</tt> - you can specify the items directly (e.g. if items are dynamically generated from database). See SimpleNavigation::ItemsProvider for documentation on what to provide as items.
|
33
33
|
# * <tt>:renderer</tt> - specify the renderer to be used for rendering the navigation. Either provide the Class or a symbol matching a registered renderer. Defaults to :list (html list renderer).
|
34
34
|
def render_navigation(options={})
|
35
|
-
options
|
36
|
-
load_config(options)
|
37
|
-
active_item_container = SimpleNavigation.active_item_container_for(options[:level])
|
38
|
-
active_item_container.render(options) unless active_item_container.nil?
|
35
|
+
active_navigation_item_container(options) { |container| container && container.render(options) }
|
39
36
|
end
|
40
37
|
|
41
38
|
# Returns the name of the currently active navigation item belonging to the specified level.
|
42
39
|
#
|
40
|
+
# See Helpers#active_navigation_item for supported options.
|
41
|
+
#
|
42
|
+
# Returns an empty string if no active item can be found for the specified options
|
43
|
+
def active_navigation_item_name(options={})
|
44
|
+
active_navigation_item(options,'') { |item| item.name(:apply_generator => false) }
|
45
|
+
end
|
46
|
+
|
47
|
+
# Returns the key of the currently active navigation item belonging to the specified level.
|
48
|
+
#
|
49
|
+
# See Helpers#active_navigation_item for supported options.
|
50
|
+
#
|
51
|
+
# Returns <tt>nil</tt> if no active item can be found for the specified options
|
52
|
+
def active_navigation_item_key(options={})
|
53
|
+
active_navigation_item(options) { |item| item.key }
|
54
|
+
end
|
55
|
+
|
56
|
+
# Returns the currently active navigation item belonging to the specified level.
|
57
|
+
#
|
43
58
|
# The following options are supported:
|
44
59
|
# * <tt>:level</tt> - defaults to :all which returns the most specific/deepest selected item (the leaf).
|
45
60
|
# Specify a specific level to only look for the selected item in the specified level of navigation (e.g. :level => 1 for primary_navigation etc...).
|
@@ -48,35 +63,53 @@ module SimpleNavigation
|
|
48
63
|
# will be loaded and used for searching the active item.
|
49
64
|
# * <tt>:items</tt> - you can specify the items directly (e.g. if items are dynamically generated from database). See SimpleNavigation::ItemsProvider for documentation on what to provide as items.
|
50
65
|
#
|
51
|
-
# Returns
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
options[:level] = :leaves if options[:level] == :all
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
66
|
+
# Returns the supplied <tt>value_for_nil</tt> object (<tt>nil</tt>
|
67
|
+
# by default) if no active item can be found for the specified
|
68
|
+
# options
|
69
|
+
def active_navigation_item(options={},value_for_nil = nil)
|
70
|
+
options[:level] = :leaves if options[:level].nil? || options[:level] == :all
|
71
|
+
active_navigation_item_container(options) do |container|
|
72
|
+
if container && (item = container.selected_item)
|
73
|
+
block_given? ? yield(item) : item
|
74
|
+
else
|
75
|
+
value_for_nil
|
76
|
+
end
|
61
77
|
end
|
62
78
|
end
|
63
79
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
80
|
+
# Returns the currently active item container belonging to the specified level.
|
81
|
+
#
|
82
|
+
# The following options are supported:
|
83
|
+
# * <tt>:level</tt> - defaults to :all which returns the least specific/shallowest selected item.
|
84
|
+
# Specify a specific level to only look for the selected item in the specified level of navigation (e.g. :level => 1 for primary_navigation etc...).
|
85
|
+
# * <tt>:context</tt> - specifies the context for which you would like to find the active navigation item. Defaults to :default which loads the default navigation.rb (i.e. config/navigation.rb).
|
86
|
+
# If you specify a context then the plugin tries to load the configuration file for that context, e.g. if you call <tt>active_navigation_item_name(:context => :admin)</tt> the file config/admin_navigation.rb
|
87
|
+
# will be loaded and used for searching the active item.
|
88
|
+
# * <tt>:items</tt> - you can specify the items directly (e.g. if items are dynamically generated from database). See SimpleNavigation::ItemsProvider for documentation on what to provide as items.
|
89
|
+
#
|
90
|
+
# Returns <tt>nil</tt> if no active item container can be found
|
91
|
+
def active_navigation_item_container(options={})
|
92
|
+
options = SimpleNavigation::Helpers::apply_defaults(options)
|
93
|
+
SimpleNavigation::Helpers::load_config(options,self)
|
94
|
+
container = SimpleNavigation.active_item_container_for(options[:level])
|
95
|
+
block_given? ? yield(container) : container
|
74
96
|
end
|
75
97
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
98
|
+
class << self
|
99
|
+
def load_config(options,includer)
|
100
|
+
ctx = options.delete(:context)
|
101
|
+
SimpleNavigation.init_adapter_from includer
|
102
|
+
SimpleNavigation.load_config(ctx)
|
103
|
+
SimpleNavigation::Configuration.eval_config(ctx)
|
104
|
+
SimpleNavigation.config.items(options[:items]) if options[:items]
|
105
|
+
SimpleNavigation.handle_explicit_navigation if SimpleNavigation.respond_to?(:handle_explicit_navigation)
|
106
|
+
raise "no primary navigation defined, either use a navigation config file or pass items directly to render_navigation" unless SimpleNavigation.primary_navigation
|
107
|
+
end
|
80
108
|
|
109
|
+
def apply_defaults(options)
|
110
|
+
options[:level] = options.delete(:levels) if options[:levels]
|
111
|
+
{:context => :default, :level => :all}.merge(options)
|
112
|
+
end
|
113
|
+
end
|
81
114
|
end
|
82
115
|
end
|
@@ -30,6 +30,9 @@ describe SimpleNavigation::Adapters::Rails do
|
|
30
30
|
it "should install the helper methods in the controller" do
|
31
31
|
ActionController::Base.should_receive(:helper_method).with(:render_navigation)
|
32
32
|
ActionController::Base.should_receive(:helper_method).with(:active_navigation_item_name)
|
33
|
+
ActionController::Base.should_receive(:helper_method).with(:active_navigation_item_key)
|
34
|
+
ActionController::Base.should_receive(:helper_method).with(:active_navigation_item)
|
35
|
+
ActionController::Base.should_receive(:helper_method).with(:active_navigation_item_container)
|
33
36
|
SimpleNavigation.register
|
34
37
|
end
|
35
38
|
|
@@ -281,4 +284,4 @@ describe SimpleNavigation::Adapters::Rails do
|
|
281
284
|
end
|
282
285
|
end
|
283
286
|
|
284
|
-
end
|
287
|
+
end
|
@@ -7,10 +7,13 @@ describe SimpleNavigation::Helpers do
|
|
7
7
|
|
8
8
|
def blackbox_setup()
|
9
9
|
@controller = ControllerMock.new
|
10
|
-
|
10
|
+
SimpleNavigation.stub!(:load_config)
|
11
|
+
SimpleNavigation::Configuration.stub!(:eval_config)
|
11
12
|
setup_adapter_for :rails
|
12
|
-
|
13
|
-
|
13
|
+
@primary_container, @subnav_container = containers
|
14
|
+
@subnav1_item = sub_item(:subnav1)
|
15
|
+
@invoices_item = primary_item(:invoices)
|
16
|
+
SimpleNavigation.stub!(:primary_navigation => @primary_container)
|
14
17
|
end
|
15
18
|
|
16
19
|
def whitebox_setup
|
@@ -54,6 +57,76 @@ describe SimpleNavigation::Helpers do
|
|
54
57
|
end
|
55
58
|
end
|
56
59
|
|
60
|
+
describe 'active_navigation_item_key' do
|
61
|
+
before(:each) do
|
62
|
+
blackbox_setup
|
63
|
+
end
|
64
|
+
context 'active item_container for desired level exists' do
|
65
|
+
context 'container has selected item' do
|
66
|
+
before(:each) do
|
67
|
+
select_item(:subnav1)
|
68
|
+
end
|
69
|
+
it {@controller.active_navigation_item_key(:level => 2).should == :subnav1}
|
70
|
+
it {@controller.active_navigation_item_key.should == :subnav1}
|
71
|
+
it {@controller.active_navigation_item_key(:level => 1).should == :invoices}
|
72
|
+
it {@controller.active_navigation_item_key(:level => :all).should == :subnav1}
|
73
|
+
end
|
74
|
+
context 'container does not have selected item' do
|
75
|
+
it {@controller.active_navigation_item_key.should == nil}
|
76
|
+
end
|
77
|
+
end
|
78
|
+
context 'no active item_container for desired level' do
|
79
|
+
it {@controller.active_navigation_item_key(:level => 5).should == nil}
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe 'active_navigation_item' do
|
84
|
+
before(:each) do
|
85
|
+
blackbox_setup
|
86
|
+
end
|
87
|
+
context 'active item_container for desired level exists' do
|
88
|
+
context 'container has selected item' do
|
89
|
+
before(:each) do
|
90
|
+
select_item(:subnav1)
|
91
|
+
end
|
92
|
+
it {@controller.active_navigation_item(:level => 2).should == @subnav1_item}
|
93
|
+
it {@controller.active_navigation_item.should == @subnav1_item}
|
94
|
+
it {@controller.active_navigation_item(:level => 1).should == @invoices_item}
|
95
|
+
it {@controller.active_navigation_item(:level => :all).should == @subnav1_item}
|
96
|
+
end
|
97
|
+
context 'container does not have selected item' do
|
98
|
+
context 'return value defaults to nil' do
|
99
|
+
it {@controller.active_navigation_item.should == nil}
|
100
|
+
end
|
101
|
+
context 'return value reflects passed in value' do
|
102
|
+
it {@controller.active_navigation_item({},'none').should == 'none'}
|
103
|
+
it {@controller.active_navigation_item({},@invoices_item).should == @invoices_item}
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
context 'no active item_container for desired level' do
|
108
|
+
it {@controller.active_navigation_item(:level => 5).should == nil}
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe 'active_navigation_item_container' do
|
113
|
+
before(:each) do
|
114
|
+
blackbox_setup
|
115
|
+
end
|
116
|
+
context 'active item_container for desired level exists' do
|
117
|
+
before(:each) do
|
118
|
+
select_item(:subnav1)
|
119
|
+
end
|
120
|
+
it {@controller.active_navigation_item_container(:level => 2).should == @subnav_container}
|
121
|
+
it {@controller.active_navigation_item_container.should == @primary_container}
|
122
|
+
it {@controller.active_navigation_item_container(:level => 1).should == @primary_container}
|
123
|
+
it {@controller.active_navigation_item_container(:level => :all).should == @primary_container}
|
124
|
+
end
|
125
|
+
context 'no active item_container for desired level' do
|
126
|
+
it {@controller.active_navigation_item_container(:level => 5).should == nil}
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
57
130
|
describe 'render_navigation' do
|
58
131
|
|
59
132
|
before(:each) do
|
@@ -189,4 +262,4 @@ describe SimpleNavigation::Helpers do
|
|
189
262
|
end
|
190
263
|
end
|
191
264
|
|
192
|
-
end
|
265
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -48,18 +48,28 @@ def primary_items
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def primary_container
|
51
|
+
containers.first
|
52
|
+
end
|
53
|
+
|
54
|
+
def containers
|
51
55
|
container = SimpleNavigation::ItemContainer.new(1)
|
52
56
|
container.dom_id = 'nav_dom_id'
|
53
57
|
container.dom_class = 'nav_dom_class'
|
54
58
|
@items = primary_items.map {|params| SimpleNavigation::Item.new(container, *params)}
|
55
59
|
@items.each {|i| i.stub!(:selected? => false)}
|
56
60
|
container.instance_variable_set(:@items, @items)
|
57
|
-
|
58
|
-
|
61
|
+
sub_container = subnav_container
|
62
|
+
primary_item(:invoices) {|item| item.instance_variable_set(:@sub_navigation, sub_container)}
|
63
|
+
[container,sub_container]
|
59
64
|
end
|
60
65
|
|
61
66
|
def primary_item(key)
|
62
|
-
|
67
|
+
item = @items.find {|i| i.key == key}
|
68
|
+
block_given? ? yield(item) : item
|
69
|
+
end
|
70
|
+
|
71
|
+
def sub_item(key)
|
72
|
+
primary_item(:invoices).instance_variable_get(:@sub_navigation).items.find { |i| i.key == key}
|
63
73
|
end
|
64
74
|
|
65
75
|
def select_item(key)
|
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple-navigation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
segments:
|
7
|
-
- 3
|
8
|
-
- 2
|
9
|
-
- 0
|
10
|
-
version: 3.2.0
|
4
|
+
prerelease:
|
5
|
+
version: 3.3.0
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- Andi Schacke
|
@@ -15,8 +10,7 @@ autorequire:
|
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
12
|
|
18
|
-
date: 2011-
|
19
|
-
default_executable:
|
13
|
+
date: 2011-06-14 00:00:00 Z
|
20
14
|
dependencies:
|
21
15
|
- !ruby/object:Gem::Dependency
|
22
16
|
name: rspec
|
@@ -26,11 +20,6 @@ dependencies:
|
|
26
20
|
requirements:
|
27
21
|
- - ">="
|
28
22
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 13
|
30
|
-
segments:
|
31
|
-
- 2
|
32
|
-
- 0
|
33
|
-
- 1
|
34
23
|
version: 2.0.1
|
35
24
|
type: :development
|
36
25
|
version_requirements: *id001
|
@@ -42,11 +31,6 @@ dependencies:
|
|
42
31
|
requirements:
|
43
32
|
- - ">="
|
44
33
|
- !ruby/object:Gem::Version
|
45
|
-
hash: 7
|
46
|
-
segments:
|
47
|
-
- 2
|
48
|
-
- 3
|
49
|
-
- 2
|
50
34
|
version: 2.3.2
|
51
35
|
type: :runtime
|
52
36
|
version_requirements: *id002
|
@@ -106,7 +90,6 @@ files:
|
|
106
90
|
- spec/lib/simple_navigation/rendering/renderer/text_spec.rb
|
107
91
|
- spec/lib/simple_navigation_spec.rb
|
108
92
|
- spec/spec_helper.rb
|
109
|
-
has_rdoc: true
|
110
93
|
homepage: http://github.com/andi/simple-navigation
|
111
94
|
licenses: []
|
112
95
|
|
@@ -121,41 +104,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
121
104
|
requirements:
|
122
105
|
- - ">="
|
123
106
|
- !ruby/object:Gem::Version
|
124
|
-
hash: 3
|
125
|
-
segments:
|
126
|
-
- 0
|
127
107
|
version: "0"
|
128
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
109
|
none: false
|
130
110
|
requirements:
|
131
111
|
- - ">="
|
132
112
|
- !ruby/object:Gem::Version
|
133
|
-
hash: 3
|
134
|
-
segments:
|
135
|
-
- 0
|
136
113
|
version: "0"
|
137
114
|
requirements: []
|
138
115
|
|
139
116
|
rubyforge_project: andi
|
140
|
-
rubygems_version: 1.
|
117
|
+
rubygems_version: 1.8.5
|
141
118
|
signing_key:
|
142
119
|
specification_version: 3
|
143
120
|
summary: simple-navigation is a ruby library for creating navigations (with multiple levels) for your Rails2, Rails3, Sinatra or Padrino application.
|
144
|
-
test_files:
|
145
|
-
|
146
|
-
- spec/lib/simple_navigation/adapters/rails_spec.rb
|
147
|
-
- spec/lib/simple_navigation/adapters/sinatra_spec.rb
|
148
|
-
- spec/lib/simple_navigation/core/configuration_spec.rb
|
149
|
-
- spec/lib/simple_navigation/core/item_adapter_spec.rb
|
150
|
-
- spec/lib/simple_navigation/core/item_container_spec.rb
|
151
|
-
- spec/lib/simple_navigation/core/item_spec.rb
|
152
|
-
- spec/lib/simple_navigation/core/items_provider_spec.rb
|
153
|
-
- spec/lib/simple_navigation/rails_controller_methods_spec.rb
|
154
|
-
- spec/lib/simple_navigation/rendering/helpers_spec.rb
|
155
|
-
- spec/lib/simple_navigation/rendering/renderer/base_spec.rb
|
156
|
-
- spec/lib/simple_navigation/rendering/renderer/breadcrumbs_spec.rb
|
157
|
-
- spec/lib/simple_navigation/rendering/renderer/links_spec.rb
|
158
|
-
- spec/lib/simple_navigation/rendering/renderer/list_spec.rb
|
159
|
-
- spec/lib/simple_navigation/rendering/renderer/text_spec.rb
|
160
|
-
- spec/lib/simple_navigation_spec.rb
|
161
|
-
- spec/spec_helper.rb
|
121
|
+
test_files: []
|
122
|
+
|