simple-navigation 2.5.4 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,10 @@
1
+ *2.6.0
2
+
3
+ * added rendering option 'skip_if_empty' to Renderer::List to avoid rendering of empty ul-tags
4
+ * added breadcrumbs renderer incl. specs. A big thanks to Markus Schirp.
5
+ * added ability to register a renderer / specify your renderer as symbol in render_navigation
6
+ * renderer can be specified in render_navigation. Credits to Andi Badi from Galaxy Cats.
7
+
1
8
  *2.5.4
2
9
 
3
10
  * bugfix: SimpleNavigation.config_file? without params does not check for _navigation.rb file anymore. Credits to Markus Schirp.
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :major: 2
3
- :minor: 5
4
- :patch: 4
3
+ :minor: 6
4
+ :patch: 0
@@ -2,6 +2,7 @@
2
2
  SimpleNavigation::Configuration.run do |navigation|
3
3
  # Specify a custom renderer if needed.
4
4
  # The default renderer is SimpleNavigation::Renderer::List which renders HTML lists.
5
+ # The renderer can also be specified as option in the render_navigation call.
5
6
  # navigation.renderer = Your::Custom::Renderer
6
7
 
7
8
  # Specify the class that will be applied to active navigation items. Defaults to 'selected'
@@ -7,8 +7,7 @@ module SimpleNavigation
7
7
  include Singleton
8
8
 
9
9
  attr_accessor :renderer, :selected_class, :autogenerate_item_ids, :id_generator, :auto_highlight
10
- attr_reader :render_all_levels
11
- attr_reader :primary_navigation
10
+ attr_reader :render_all_levels, :primary_navigation
12
11
 
13
12
  class << self
14
13
 
@@ -52,6 +51,7 @@ module SimpleNavigation
52
51
  # end
53
52
  #
54
53
  # ==== To consider when directly providing items
54
+ # items_provider should be:
55
55
  # * a methodname (as symbol) that returns your items. The method needs to be available in the view (i.e. a helper method)
56
56
  # * an object that responds to :items
57
57
  # * an enumerable containing your items
@@ -75,7 +75,7 @@ module SimpleNavigation
75
75
  def context_for_eval
76
76
  self.class.context_for_eval
77
77
  end
78
-
78
+
79
79
  end
80
80
 
81
81
  end
@@ -77,4 +77,4 @@ module SimpleNavigation
77
77
  end
78
78
 
79
79
  end
80
- end
80
+ end
@@ -30,6 +30,7 @@ module SimpleNavigation
30
30
  # If you specify a context then the plugin tries to load the configuration file for that context, e.g. if you call <tt>render_navigation(:context => :admin)</tt> the file config/admin_navigation.rb
31
31
  # will be loaded and used for rendering the navigation.
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
+ # * <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).
33
34
  def render_navigation(*args)
34
35
  args = [Hash.new] if args.empty?
35
36
  options = extract_backwards_compatible_options(*args)
@@ -94,4 +95,4 @@ module SimpleNavigation
94
95
  end
95
96
 
96
97
  end
97
- end
98
+ end
@@ -75,19 +75,17 @@ module SimpleNavigation
75
75
  url == '/' && SimpleNavigation.controller.request.path == '/'
76
76
  end
77
77
 
78
- # Converts url to url_hash. Accesses routing system, quite slow... Not used at the moment
79
- # def hash_for_url(url) #:nodoc:
80
- # ActionController::Routing::Routes.recognize_path(url, {:method => (method || :get)})
81
- # end
82
-
78
+ # Returns true if the item's id should be added to the rendered output.
83
79
  def autogenerate_item_ids?
84
80
  SimpleNavigation.config.autogenerate_item_ids
85
81
  end
86
82
 
83
+ # Returns the item's id which is added to the rendered output.
87
84
  def autogenerated_item_id
88
85
  SimpleNavigation.config.id_generator.call(key)
89
86
  end
90
87
 
88
+ # Return true if auto_highlight is on for this item.
91
89
  def auto_highlight?
92
90
  SimpleNavigation.config.auto_highlight && @container.auto_highlight
93
91
  end
@@ -68,7 +68,16 @@ module SimpleNavigation
68
68
  #
69
69
  # The options are the same as in the view's render_navigation call (they get passed on)
70
70
  def render(options={})
71
- self.renderer.new(options).render(self)
71
+ renderer_class = if options[:renderer]
72
+ if options[:renderer].instance_of?(Symbol) && SimpleNavigation.registered_renderers.key?(options[:renderer])
73
+ SimpleNavigation.registered_renderers[options[:renderer]].new(options)
74
+ else
75
+ options[:renderer].new(options)
76
+ end
77
+ else
78
+ self.renderer.new(options)
79
+ end
80
+ renderer_class.render(self)
72
81
  end
73
82
 
74
83
  # Returns true if any of this container's items is selected.
@@ -99,6 +108,11 @@ module SimpleNavigation
99
108
  return selected_item.sub_navigation.active_item_container_for(desired_level)
100
109
  end
101
110
 
111
+ # Returns true if there are no items defined for this container.
112
+ def empty?
113
+ items.empty?
114
+ end
115
+
102
116
  private
103
117
 
104
118
  def selected_sub_navigation?
@@ -34,6 +34,10 @@ module SimpleNavigation
34
34
 
35
35
  def level
36
36
  options[:level] || :all
37
+ end
38
+
39
+ def skip_if_empty?
40
+ !!options[:skip_if_empty]
37
41
  end
38
42
 
39
43
  def include_sub_navigation?(item)
@@ -81,4 +85,4 @@ module SimpleNavigation
81
85
 
82
86
  end
83
87
  end
84
- end
88
+ end
@@ -0,0 +1,38 @@
1
+ module SimpleNavigation
2
+ module Renderer
3
+
4
+ # Renders an ItemContainer as a <div> element and its containing items as <a> elements.
5
+ # It only renders 'selected' elements.
6
+ #
7
+ # By default, the renderer sets the item's key as dom_id for the rendered <a> element unless the config option <tt>autogenerate_item_ids</tt> is set to false.
8
+ # The id can also be explicitely specified by setting the id in the html-options of the 'item' method in the config/navigation.rb file.
9
+ # The ItemContainer's dom_class and dom_id are applied to the surrounding <div> element.
10
+ #
11
+ class Breadcrumbs < SimpleNavigation::Renderer::Base
12
+
13
+ def render(item_container)
14
+ a_tags = a_tags(item_container)
15
+ content_tag(:div, html_safe(a_tags(item_container).join(join_with)), {:id => item_container.dom_id, :class => item_container.dom_class})
16
+ end
17
+
18
+ protected
19
+
20
+ def a_tags(item_container)
21
+ item_container.items.inject([]) do |list, item|
22
+ if item.selected?
23
+ list << link_to(html_safe(item.name), item.url, {:method => item.method}.merge(item.html_options.except(:class,:id))) if item.selected?
24
+ if include_sub_navigation?(item)
25
+ list.concat a_tags(item.sub_navigation)
26
+ end
27
+ end
28
+ list
29
+ end
30
+ end
31
+
32
+ def join_with
33
+ @join_with ||= options[:join_with] || " "
34
+ end
35
+ end
36
+
37
+ end
38
+ end
@@ -19,7 +19,11 @@ module SimpleNavigation
19
19
  end
20
20
  list << content_tag(:li, li_content, html_options)
21
21
  end.join
22
- content_tag(:ul, html_safe(list_content), {:id => item_container.dom_id, :class => item_container.dom_class})
22
+ if skip_if_empty? && item_container.empty?
23
+ ''
24
+ else
25
+ content_tag(:ul, html_safe(list_content), {:id => item_container.dom_id, :class => item_container.dom_class})
26
+ end
23
27
  end
24
28
  end
25
29
 
@@ -9,18 +9,26 @@ require 'simple_navigation/items_provider'
9
9
  require 'simple_navigation/renderer/base'
10
10
  require 'simple_navigation/renderer/list'
11
11
  require 'simple_navigation/renderer/links'
12
+ require 'simple_navigation/renderer/breadcrumbs'
12
13
  require 'simple_navigation/initializer'
13
14
  require 'simple_navigation/railtie' if Rails::VERSION::MAJOR == 3
14
15
 
15
16
  # A plugin for generating a simple navigation. See README for resources on usage instructions.
16
17
  module SimpleNavigation
17
18
 
18
- mattr_accessor :config_files, :config_file_path, :default_renderer, :controller, :template, :explicit_current_navigation, :rails_env, :rails_root
19
+ mattr_accessor :config_files, :config_file_path, :default_renderer, :controller, :template, :explicit_current_navigation, :rails_env, :rails_root, :registered_renderers
19
20
 
20
21
  self.config_files = {}
22
+ self.registered_renderers = {
23
+ :list => SimpleNavigation::Renderer::List,
24
+ :links => SimpleNavigation::Renderer::Links,
25
+ :breadcrumbs => SimpleNavigation::Renderer::Breadcrumbs
26
+ }
27
+
21
28
 
22
29
  class << self
23
30
 
31
+ # Sets the config file path and installs the ControllerMethods in ActionController::Base.
24
32
  def init_rails
25
33
  SimpleNavigation.config_file_path = SimpleNavigation.default_config_file_path unless SimpleNavigation.config_file_path
26
34
  ActionController::Base.send(:include, SimpleNavigation::ControllerMethods)
@@ -30,6 +38,7 @@ module SimpleNavigation
30
38
  File.join(SimpleNavigation.rails_root, 'config')
31
39
  end
32
40
 
41
+ # Returns true if the config_file for specified context does exist.
33
42
  def config_file?(navigation_context = :default)
34
43
  File.exists?(config_file_name(navigation_context))
35
44
  end
@@ -124,6 +133,21 @@ module SimpleNavigation
124
133
  context
125
134
  end
126
135
  end
136
+
137
+ # Registers a renderer.
138
+ #
139
+ # === Example
140
+ # To register your own renderer:
141
+ #
142
+ # SimpleNavigation.register_renderer :my_renderer => My::RendererClass
143
+ #
144
+ # Then in the view you can call:
145
+ #
146
+ # render_navigation(:renderer => :my_renderer)
147
+ #
148
+ def register_renderer(renderer_hash)
149
+ self.registered_renderers.merge!(renderer_hash)
150
+ end
127
151
 
128
152
  private
129
153
 
@@ -158,7 +182,6 @@ module SimpleNavigation
158
182
  end
159
183
 
160
184
  # TODOs for the next releases:
161
- # 0) make sn_set_navigation private in controllers
162
185
  # 1) add ability to specify explicit highlighting in the config-file itself (directly with the item)
163
186
  # - item.highlight_on :controller => 'users', :action => 'show' ...^
164
187
  # --> with that we can get rid of the controller_methods...
@@ -282,13 +282,10 @@ describe SimpleNavigation::ItemContainer do
282
282
  @item_container.item('key', 'name', 'url', @options)
283
283
  end
284
284
  end
285
-
285
+
286
286
  end
287
-
288
287
  end
289
-
290
288
  end
291
-
292
289
  end
293
290
 
294
291
  describe '[]' do
@@ -309,23 +306,51 @@ describe SimpleNavigation::ItemContainer do
309
306
 
310
307
  describe 'render' do
311
308
  before(:each) do
312
- @renderer = stub(:renderer)
313
- @renderer_instance = stub(:renderer_instance, :null_object => true)
314
- @renderer.stub!(:new).and_return(@renderer_instance)
315
- @item_container.stub!(:renderer).and_return(@renderer)
316
- @items = stub(:items)
317
- @item_container.stub!(:items).and_return(@items)
318
- @options = stub(:options)
309
+ @renderer_instance = stub(:renderer, :null_object => true)
310
+ @renderer_class = stub(:renderer_class, :new => @renderer_instance)
319
311
  end
320
- it "should instatiate a renderer" do
321
- @renderer.should_receive(:new).with(@options)
322
- @item_container.render(@options)
312
+ context 'renderer specified as option' do
313
+ context 'renderer-class specified' do
314
+ it "should instantiate the passed renderer_class with the options" do
315
+ @renderer_class.should_receive(:new).with(:renderer => @renderer_class)
316
+ end
317
+ it "should call render on the renderer and pass self" do
318
+ @renderer_instance.should_receive(:render).with(@item_container)
319
+ end
320
+ after(:each) do
321
+ @item_container.render(:renderer => @renderer_class)
322
+ end
323
+ end
324
+ context 'renderer-symbol specified' do
325
+ before(:each) do
326
+ SimpleNavigation.registered_renderers = {:my_renderer => @renderer_class}
327
+ end
328
+ it "should instantiate the passed renderer_class with the options" do
329
+ @renderer_class.should_receive(:new).with(:renderer => :my_renderer)
330
+ end
331
+ it "should call render on the renderer and pass self" do
332
+ @renderer_instance.should_receive(:render).with(@item_container)
333
+ end
334
+ after(:each) do
335
+ @item_container.render(:renderer => :my_renderer)
336
+ end
337
+ end
323
338
  end
324
- it "should call render on the renderer and pass self" do
325
- @renderer_instance.should_receive(:render).with(@item_container)
326
- @item_container.render
339
+ context 'no renderer specified' do
340
+ before(:each) do
341
+ @item_container.stub!(:renderer => @renderer_class)
342
+ @options = {}
343
+ end
344
+ it "should instantiate the container's renderer with the options" do
345
+ @renderer_class.should_receive(:new).with(@options)
346
+ end
347
+ it "should call render on the renderer and pass self" do
348
+ @renderer_instance.should_receive(:render).with(@item_container)
349
+ end
350
+ after(:each) do
351
+ @item_container.render(@options)
352
+ end
327
353
  end
328
-
329
354
  end
330
355
 
331
356
  describe 'level_for_item' do
@@ -347,8 +372,17 @@ describe SimpleNavigation::ItemContainer do
347
372
  it {@item_container.level_for_item(:ss1).should == 3}
348
373
  it {@item_container.level_for_item(:x).should be_nil}
349
374
 
350
-
351
-
375
+ end
376
+
377
+ describe 'empty?' do
378
+ it "should be empty if there are no items" do
379
+ @item_container.instance_variable_set(:@items, [])
380
+ @item_container.should be_empty
381
+ end
382
+ it "should not be empty if there are some items" do
383
+ @item_container.instance_variable_set(:@items, [stub(:item)])
384
+ @item_container.should_not be_empty
385
+ end
352
386
  end
353
387
 
354
388
  end
@@ -97,6 +97,29 @@ describe SimpleNavigation::Renderer::Base do
97
97
  it {@base_renderer.expand_all?.should be_false}
98
98
  end
99
99
  end
100
+
101
+ describe 'skip_if_empty?' do
102
+ context 'option is set' do
103
+ context 'skip_if_empty is true' do
104
+ before(:each) do
105
+ @base_renderer.stub!(:options => {:skip_if_empty => true})
106
+ end
107
+ it {@base_renderer.skip_if_empty?.should be_true}
108
+ end
109
+ context 'skip_if_empty is false' do
110
+ before(:each) do
111
+ @base_renderer.stub!(:options => {:skip_if_empty => false})
112
+ end
113
+ it {@base_renderer.skip_if_empty?.should be_false}
114
+ end
115
+ end
116
+ context 'option is not set' do
117
+ before(:each) do
118
+ @base_renderer.stub!(:options => {})
119
+ end
120
+ it {@base_renderer.skip_if_empty?.should be_false}
121
+ end
122
+ end
100
123
 
101
124
  describe 'level' do
102
125
  context 'options[level] is set' do
@@ -0,0 +1,100 @@
1
+ require File.dirname(__FILE__) + '/../../../spec_helper'
2
+ require 'html/document' unless defined? HTML::Document
3
+
4
+ describe SimpleNavigation::Renderer::Breadcrumbs do
5
+
6
+ describe 'render' do
7
+
8
+ def render(current_nav=nil, options={:level => :all})
9
+ primary_navigation = primary_container
10
+ select_item(current_nav) if current_nav
11
+ @renderer = SimpleNavigation::Renderer::Breadcrumbs.new(options)
12
+ HTML::Document.new(@renderer.render(primary_navigation)).root
13
+ end
14
+
15
+ context 'regarding result' do
16
+
17
+ it "should render a div-tag around the items" do
18
+ HTML::Selector.new('div').select(render).should have(1).entries
19
+ end
20
+ it "the rendered div-tag should have the specified dom_id" do
21
+ HTML::Selector.new('div#nav_dom_id').select(render).should have(1).entries
22
+ end
23
+ it "the rendered div-tag should have the specified class" do
24
+ HTML::Selector.new('div.nav_dom_class').select(render).should have(1).entries
25
+ end
26
+
27
+ context 'without current_navigation set' do
28
+ it "should not render any a-tag in the div-tag" do
29
+ HTML::Selector.new('div a').select(render).should have(0).entries
30
+ end
31
+ end
32
+
33
+ context 'with current_navigation set' do
34
+ before :all do
35
+ @selection = HTML::Selector.new('div a').select(render(:invoices))
36
+ end
37
+ it "should render the selected a tags" do
38
+ @selection.should have(1).entries
39
+ end
40
+
41
+ it "should not render class or id" do
42
+ @selection.each do |tag|
43
+ raise unless tag.name == "a"
44
+ tag["id"].should be_nil
45
+ tag["class"].should be_nil
46
+ end
47
+ end
48
+ end
49
+
50
+
51
+ context 'nested sub_navigation' do
52
+ it "should add an a tag for each selected item" do
53
+ HTML::Selector.new('div a').select(render(:subnav1)).should have(2).entries
54
+ end
55
+ end
56
+ end
57
+
58
+ context 'regarding method calls' do
59
+
60
+ context 'regarding the list_content' do
61
+ before(:each) do
62
+ @primary_navigation = primary_container
63
+ @list_content = stub(:list_content)
64
+ @list_items = stub(:list_items, :join => @list_content)
65
+ @items.stub!(:inject => @list_items)
66
+ @renderer = SimpleNavigation::Renderer::Breadcrumbs.new(options)
67
+ end
68
+
69
+ it "should join the list_items" do
70
+ @list_items.should_receive(:join)
71
+ end
72
+
73
+ it "should html_saferize the list_content" do
74
+ @renderer.should_receive(:html_safe).with(@list_content)
75
+ end
76
+
77
+ after(:each) do
78
+ @renderer.render(@primary_navigation)
79
+ end
80
+ end
81
+
82
+ context 'regarding the items' do
83
+ before(:each) do
84
+ @primary_navigation = primary_container
85
+ select_item(:invoices)
86
+ @renderer = SimpleNavigation::Renderer::Breadcrumbs.new(options)
87
+ end
88
+
89
+ it "should call html_safe on every rendered item's name" do
90
+ @items.each do |item|
91
+ @renderer.should_receive(:html_safe).with(item.name) if item.selected?
92
+ end
93
+ @renderer.should_receive(:html_safe).with(anything).twice()
94
+ @renderer.render(@primary_navigation)
95
+ end
96
+ end
97
+
98
+ end
99
+ end
100
+ end
@@ -83,6 +83,46 @@ describe SimpleNavigation::Renderer::List do
83
83
  end
84
84
 
85
85
  end
86
+
87
+ context 'skip_if_empty' do
88
+
89
+ def render_container(options={})
90
+ @renderer = SimpleNavigation::Renderer::List.new(options)
91
+ HTML::Document.new(@renderer.render(@container)).root
92
+ end
93
+
94
+ context 'container is empty' do
95
+ before(:each) do
96
+ @container = SimpleNavigation::ItemContainer.new(0)
97
+ end
98
+ context 'skip_if_empty is true' do
99
+ it "should not render a ul tag for the empty container" do
100
+ HTML::Selector.new('ul').select(render_container(:skip_if_empty => true)).should be_empty
101
+ end
102
+ end
103
+ context 'skip_if_empty is false' do
104
+ it "should render a ul tag for the empty container" do
105
+ HTML::Selector.new('ul').select(render_container(:skip_if_empty => false)).should have(1).entry
106
+ end
107
+ end
108
+ end
109
+
110
+ context 'container is not empty' do
111
+ before(:each) do
112
+ @container = primary_container
113
+ end
114
+ context 'skip_if_empty is true' do
115
+ it "should render a ul tag for the container" do
116
+ HTML::Selector.new('ul').select(render_container(:skip_if_empty => true)).should have(1).entry
117
+ end
118
+ end
119
+ context 'skip_if_empty is false' do
120
+ it "should render a ul tag for the container" do
121
+ HTML::Selector.new('ul').select(render_container(:skip_if_empty => false)).should have(1).entry
122
+ end
123
+ end
124
+ end
125
+ end
86
126
  end
87
127
 
88
128
  context 'regarding method calls' do
@@ -127,4 +167,4 @@ describe SimpleNavigation::Renderer::List do
127
167
  end
128
168
 
129
169
  end
130
- end
170
+ end
@@ -204,6 +204,23 @@ describe SimpleNavigation do
204
204
  end
205
205
  end
206
206
  end
207
+
208
+ describe 'regarding renderers' do
209
+ it "should have registered the builtin renderers by default" do
210
+ SimpleNavigation.registered_renderers.should_not be_empty
211
+ end
212
+
213
+ describe 'register_renderer' do
214
+ before(:each) do
215
+ @renderer = stub(:renderer)
216
+ end
217
+ it "should add the specified renderer to the list of renderers" do
218
+ SimpleNavigation.register_renderer(:my_renderer => @renderer)
219
+ SimpleNavigation.registered_renderers[:my_renderer].should == @renderer
220
+ end
221
+ end
222
+
223
+ end
207
224
 
208
225
 
209
226
  describe 'load_config' do
data/spec/spec_helper.rb CHANGED
@@ -53,7 +53,14 @@ def primary_item(key)
53
53
  end
54
54
 
55
55
  def select_item(key)
56
- primary_item(key) {|item| item.stub!(:selected? => true)}
56
+ if(key == :subnav1)
57
+ select_item(:invoices)
58
+ primary_item(:invoices) do |item|
59
+ item.instance_variable_get(:@sub_navigation).items.find { |i| i.key == key}.stub!(:selected? => true)
60
+ end
61
+
62
+ end
63
+ primary_item(key) {|item| item.stub!(:selected? => true) unless item.frozen?}
57
64
  end
58
65
 
59
66
  def subnav_container
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 2
7
- - 5
8
- - 4
9
- version: 2.5.4
7
+ - 6
8
+ - 0
9
+ version: 2.6.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Andi Schacke
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-17 00:00:00 +02:00
17
+ date: 2010-06-19 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -60,6 +60,7 @@ files:
60
60
  - lib/simple_navigation/items_provider.rb
61
61
  - lib/simple_navigation/railtie.rb
62
62
  - lib/simple_navigation/renderer/base.rb
63
+ - lib/simple_navigation/renderer/breadcrumbs.rb
63
64
  - lib/simple_navigation/renderer/links.rb
64
65
  - lib/simple_navigation/renderer/list.rb
65
66
  - rails/init.rb
@@ -71,6 +72,7 @@ files:
71
72
  - spec/lib/simple_navigation/item_spec.rb
72
73
  - spec/lib/simple_navigation/items_provider_spec.rb
73
74
  - spec/lib/simple_navigation/renderer/base_spec.rb
75
+ - spec/lib/simple_navigation/renderer/breadcrumbs_spec.rb
74
76
  - spec/lib/simple_navigation/renderer/links_spec.rb
75
77
  - spec/lib/simple_navigation/renderer/list_spec.rb
76
78
  - spec/lib/simple_navigation_spec.rb
@@ -115,6 +117,7 @@ test_files:
115
117
  - spec/lib/simple_navigation/item_spec.rb
116
118
  - spec/lib/simple_navigation/items_provider_spec.rb
117
119
  - spec/lib/simple_navigation/renderer/base_spec.rb
120
+ - spec/lib/simple_navigation/renderer/breadcrumbs_spec.rb
118
121
  - spec/lib/simple_navigation/renderer/links_spec.rb
119
122
  - spec/lib/simple_navigation/renderer/list_spec.rb
120
123
  - spec/lib/simple_navigation_spec.rb