simple-navigation 2.0.1 → 2.1.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 +6 -0
- data/VERSION.yml +2 -2
- data/generators/navigation_config/templates/config/navigation.rb +5 -0
- data/lib/simple_navigation.rb +6 -0
- data/lib/simple_navigation/configuration.rb +30 -4
- data/lib/simple_navigation/helpers.rb +7 -3
- data/lib/simple_navigation/item.rb +11 -4
- data/lib/simple_navigation/item_adapter.rb +41 -0
- data/lib/simple_navigation/item_container.rb +8 -1
- data/lib/simple_navigation/items_provider.rb +35 -0
- data/simple-navigation.gemspec +8 -2
- data/spec/lib/simple_navigation/configuration_spec.rb +53 -6
- data/spec/lib/simple_navigation/helpers_spec.rb +46 -0
- data/spec/lib/simple_navigation/item_adapter_spec.rb +102 -0
- data/spec/lib/simple_navigation/item_container_spec.rb +43 -1
- data/spec/lib/simple_navigation/item_spec.rb +64 -11
- data/spec/lib/simple_navigation/items_provider_spec.rb +60 -0
- data/spec/lib/simple_navigation/renderer/list_spec.rb +5 -5
- metadata +8 -2
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
*2.1.0
|
2
|
+
|
3
|
+
* included Ben Marini's commit which allows individual id-generators. Thanks Ben!
|
4
|
+
* added ability to specify navigation items through items_provider. This is useful for generating the navigation dynamically (e.g. from database)
|
5
|
+
* items can now even be passed directly into render_navigation method.
|
6
|
+
|
1
7
|
*2.0.1
|
2
8
|
|
3
9
|
* fixed handling of a non-existent explicit navigation item for a navigation context
|
data/VERSION.yml
CHANGED
@@ -15,6 +15,11 @@ SimpleNavigation::Configuration.run do |navigation|
|
|
15
15
|
# Item keys are normally added to list items as id.
|
16
16
|
# This setting turns that off
|
17
17
|
# navigation.autogenerate_item_ids = false
|
18
|
+
|
19
|
+
# You can override the default logic that is used to autogenerate the item ids.
|
20
|
+
# To do this, define a Proc which takes the key of the current item as argument.
|
21
|
+
# The example below would add a prefix to each key.
|
22
|
+
# navigation.id_generator = Proc.new {|key| "my-prefix-#{key}"}
|
18
23
|
|
19
24
|
# The auto highlight feature is turned on by default.
|
20
25
|
# This turns it off globally (for the whole plugin)
|
data/lib/simple_navigation.rb
CHANGED
@@ -2,8 +2,10 @@
|
|
2
2
|
require 'simple_navigation/configuration'
|
3
3
|
require 'simple_navigation/helpers'
|
4
4
|
require 'simple_navigation/controller_methods'
|
5
|
+
require 'simple_navigation/item_adapter'
|
5
6
|
require 'simple_navigation/item'
|
6
7
|
require 'simple_navigation/item_container'
|
8
|
+
require 'simple_navigation/items_provider'
|
7
9
|
require 'simple_navigation/renderer/base'
|
8
10
|
require 'simple_navigation/renderer/list'
|
9
11
|
|
@@ -114,3 +116,7 @@ end
|
|
114
116
|
# 4) Enhance SampleProject (more examples)
|
115
117
|
#
|
116
118
|
# 5) Make SampleProject public
|
119
|
+
#
|
120
|
+
# - allow :function navigation item to specify function
|
121
|
+
# - allow specification of link-options in item (currently options are passed to li-element)
|
122
|
+
# - render_navigation: do not rescue from config-file not found error if no items are passed in directly
|
@@ -6,7 +6,7 @@ module SimpleNavigation
|
|
6
6
|
class Configuration
|
7
7
|
include Singleton
|
8
8
|
|
9
|
-
attr_accessor :renderer, :selected_class, :render_all_levels, :autogenerate_item_ids, :auto_highlight
|
9
|
+
attr_accessor :renderer, :selected_class, :render_all_levels, :autogenerate_item_ids, :id_generator, :auto_highlight
|
10
10
|
attr_reader :primary_navigation
|
11
11
|
|
12
12
|
class << self
|
@@ -47,13 +47,35 @@ module SimpleNavigation
|
|
47
47
|
@selected_class = 'selected'
|
48
48
|
@render_all_levels = false
|
49
49
|
@autogenerate_item_ids = true
|
50
|
+
@id_generator = Proc.new {|id| id.to_s }
|
50
51
|
@auto_highlight = true
|
51
52
|
end
|
52
53
|
|
53
|
-
#
|
54
|
-
|
54
|
+
# This is the main method for specifying the navigation items. It can be used in two ways:
|
55
|
+
#
|
56
|
+
# 1. Declaratively specify your items in the config/navigation.rb file using a block. It then yields an SimpleNavigation::ItemContainer for adding navigation items.
|
57
|
+
# 1. Directly provide your items to the method (e.g. when loading your items from the database). Either specify
|
58
|
+
#
|
59
|
+
# ==== Example for block style
|
60
|
+
# config.items do |primary|
|
61
|
+
# primary.item :my_item, 'My item', my_item_path
|
62
|
+
# ...
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
# ==== To consider when directly providing items
|
66
|
+
# * a methodname (as symbol) that returns your items. The method needs to be available in the view (i.e. a helper method)
|
67
|
+
# * an object that responds to :items
|
68
|
+
# * an enumerable containing your items
|
69
|
+
# The items you specify have to fullfill certain requirements. See SimpleNavigation::ItemAdapter for more details.
|
70
|
+
#
|
71
|
+
def items(items_provider=nil, &block)
|
72
|
+
raise 'please specify either items_provider or block, but not both' if (items_provider && block) || (items_provider.nil? && block.nil?)
|
55
73
|
@primary_navigation = ItemContainer.new
|
56
|
-
block
|
74
|
+
if block
|
75
|
+
block.call @primary_navigation
|
76
|
+
else
|
77
|
+
@primary_navigation.items = SimpleNavigation::ItemsProvider.new(items_provider).items
|
78
|
+
end
|
57
79
|
end
|
58
80
|
|
59
81
|
# Returns true if the config_file has already been evaluated.
|
@@ -61,6 +83,10 @@ module SimpleNavigation
|
|
61
83
|
!@primary_navigation.nil?
|
62
84
|
end
|
63
85
|
|
86
|
+
def context_for_eval
|
87
|
+
self.class.context_for_eval
|
88
|
+
end
|
89
|
+
|
64
90
|
end
|
65
91
|
|
66
92
|
end
|
@@ -24,14 +24,18 @@ module SimpleNavigation
|
|
24
24
|
# * <tt>:context</tt> - specifies the context for which you would render the navigation. Defaults to :default which loads the default navigation.rb (i.e. config/navigation.rb).
|
25
25
|
# 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
|
26
26
|
# will be loaded and used for rendering the navigation.
|
27
|
-
#
|
27
|
+
# * <tt>:all_open</tt> - setting this options to true means that all items are always open (ie. fully expanded tree). Same as setting render_all_levels option in the config-file.
|
28
|
+
# * <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.
|
28
29
|
def render_navigation(*args)
|
29
30
|
args = [Hash.new] if args.empty?
|
30
31
|
options = extract_backwards_compatible_options(*args)
|
31
32
|
options = {:context => :default, :level => :nested}.merge(options)
|
32
|
-
SimpleNavigation.load_config(options[:context])
|
33
|
-
SimpleNavigation::Configuration.eval_config(self, options[:context])
|
33
|
+
SimpleNavigation.load_config(options[:context]) rescue nil
|
34
|
+
SimpleNavigation::Configuration.eval_config(self, options[:context]) rescue nil
|
35
|
+
SimpleNavigation.config.render_all_levels = options[:all_open] unless options[:all_open].nil?
|
36
|
+
SimpleNavigation.config.items(options[:items]) if options[:items]
|
34
37
|
SimpleNavigation.handle_explicit_navigation
|
38
|
+
raise "no primary navigation defined, either use a navigation config file or pass items directly to render_navigation" unless SimpleNavigation.primary_navigation
|
35
39
|
case options[:level]
|
36
40
|
when Integer
|
37
41
|
active_item_container = SimpleNavigation.active_item_container_for(options[:level])
|
@@ -6,16 +6,19 @@ module SimpleNavigation
|
|
6
6
|
attr_writer :html_options
|
7
7
|
|
8
8
|
# see ItemContainer#item
|
9
|
-
|
9
|
+
#
|
10
|
+
# The subnavigation (if any) is either provided by a block or passed in directly as <tt>items</tt>
|
11
|
+
def initialize(container, key, name, url, options, items=nil, &sub_nav_block)
|
10
12
|
@container = container
|
11
13
|
@key = key
|
12
14
|
@method = options.delete(:method)
|
13
15
|
@name = name
|
14
16
|
@url = url
|
15
17
|
@html_options = options
|
16
|
-
if sub_nav_block
|
18
|
+
if sub_nav_block || items
|
17
19
|
@sub_navigation = ItemContainer.new(@container.level + 1)
|
18
|
-
sub_nav_block.call @sub_navigation
|
20
|
+
sub_nav_block.call @sub_navigation if sub_nav_block
|
21
|
+
@sub_navigation.items = items if items
|
19
22
|
end
|
20
23
|
end
|
21
24
|
|
@@ -33,7 +36,7 @@ module SimpleNavigation
|
|
33
36
|
# Returns the html-options hash for the item, i.e. the options specified for this item in the config-file.
|
34
37
|
# It also adds the 'selected' class to the list of classes if necessary.
|
35
38
|
def html_options
|
36
|
-
default_options = self.autogenerate_item_ids? ? {:id =>
|
39
|
+
default_options = self.autogenerate_item_ids? ? {:id => autogenerated_item_id} : {}
|
37
40
|
options = default_options.merge(@html_options)
|
38
41
|
options[:class] = [@html_options[:class], self.selected_class].flatten.compact.join(' ')
|
39
42
|
options.delete(:class) if options[:class].blank?
|
@@ -81,6 +84,10 @@ module SimpleNavigation
|
|
81
84
|
SimpleNavigation.config.autogenerate_item_ids
|
82
85
|
end
|
83
86
|
|
87
|
+
def autogenerated_item_id
|
88
|
+
SimpleNavigation.config.id_generator.call(key)
|
89
|
+
end
|
90
|
+
|
84
91
|
def auto_highlight?
|
85
92
|
SimpleNavigation.config.auto_highlight && @container.auto_highlight
|
86
93
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module SimpleNavigation
|
2
|
+
|
3
|
+
# This class acts as an adapter to items that are not defined using the DSL in the config/navigation.rb, but directly provided inside the application.
|
4
|
+
# When defining the items that way, every item you provide needs to define the following methods:
|
5
|
+
#
|
6
|
+
# * <tt>key</tt>
|
7
|
+
# * <tt>name</tt>
|
8
|
+
# * <tt>url</tt>
|
9
|
+
#
|
10
|
+
# and optionally
|
11
|
+
#
|
12
|
+
# * <tt>options</tt>
|
13
|
+
# * <tt>items</tt> - if one of your items has a subnavigation it must respond to <tt>items</tt> providing the subnavigation.
|
14
|
+
#
|
15
|
+
# See SimpleNavigation::ItemContainer#item for the purpose of these methods.
|
16
|
+
class ItemAdapter
|
17
|
+
delegate :key, :name, :url, :to => :item
|
18
|
+
|
19
|
+
attr_reader :item
|
20
|
+
|
21
|
+
def initialize(item)
|
22
|
+
@item = item
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns the options for this item. If the wrapped item does not implement an options method, an empty hash is returned.
|
26
|
+
def options
|
27
|
+
@item.respond_to?(:options) ? @item.options : {}
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns the items (subnavigation) for this item if it responds to :items and the items-collection is not empty. Returns nil otherwise.
|
31
|
+
def items
|
32
|
+
(@item.respond_to?(:items) && !(@item.items.nil? || @item.items.empty?)) ? @item.items : nil
|
33
|
+
end
|
34
|
+
|
35
|
+
# Converts this Item into a SimpleNavigation::Item
|
36
|
+
def to_simple_navigation_item(item_container)
|
37
|
+
SimpleNavigation::Item.new(item_container, key, name, url, options, items)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
@@ -32,7 +32,14 @@ module SimpleNavigation
|
|
32
32
|
#
|
33
33
|
# The <tt>block</tt> - if specified - will hold the item's sub_navigation.
|
34
34
|
def item(key, name, url, options={}, &block)
|
35
|
-
(@items << SimpleNavigation::Item.new(self, key, name, url, options, block)) if should_add_item?(options)
|
35
|
+
(@items << SimpleNavigation::Item.new(self, key, name, url, options, nil, &block)) if should_add_item?(options)
|
36
|
+
end
|
37
|
+
|
38
|
+
def items=(items)
|
39
|
+
items.each do |item|
|
40
|
+
item = SimpleNavigation::ItemAdapter.new(item)
|
41
|
+
(@items << item.to_simple_navigation_item(self)) if should_add_item?(item.options)
|
42
|
+
end
|
36
43
|
end
|
37
44
|
|
38
45
|
# Returns the Item with the specified key, nil otherwise.
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module SimpleNavigation
|
2
|
+
|
3
|
+
# Acts as a proxy to navigation items that are passed into the SimpleNavigation::Configuration#items method. It hides the logic
|
4
|
+
# for finding items from the Configuration object.
|
5
|
+
#
|
6
|
+
class ItemsProvider
|
7
|
+
|
8
|
+
attr_reader :provider
|
9
|
+
|
10
|
+
# It accepts the following types of provider:
|
11
|
+
# * methodname as symbol - the specified method should return the relevant items and has to be available in the view (a helper method)
|
12
|
+
# * object that responds to :items
|
13
|
+
# * enumerable object that represents the items
|
14
|
+
#
|
15
|
+
# See SimpleNavigation::ItemAdapter for the requirements that need to be fulfilled by the provided items.
|
16
|
+
#
|
17
|
+
def initialize(provider)
|
18
|
+
@provider = provider
|
19
|
+
end
|
20
|
+
|
21
|
+
# Returns the navigation items
|
22
|
+
def items
|
23
|
+
if provider.instance_of?(Symbol)
|
24
|
+
SimpleNavigation.config.context_for_eval.send(provider)
|
25
|
+
elsif provider.respond_to?(:items)
|
26
|
+
provider.items
|
27
|
+
elsif provider.respond_to?(:each)
|
28
|
+
provider
|
29
|
+
else
|
30
|
+
raise "items_provider either must be a symbol specifying the helper-method to call, an object with an items-method defined or an enumerable representing the items"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
data/simple-navigation.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{simple-navigation}
|
8
|
-
s.version = "2.0
|
8
|
+
s.version = "2.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Andi Schacke"]
|
12
|
-
s.date = %q{2009-
|
12
|
+
s.date = %q{2009-12-18}
|
13
13
|
s.description = %q{With the simple-navigation gem installed you can easily create multilevel navigations for your Ruby on Rails applications. The navigation is defined in a single configuration file. It supports automatic as well as explicit highlighting of the currently active navigation.}
|
14
14
|
s.email = %q{andreas.schacke@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -32,7 +32,9 @@ Gem::Specification.new do |s|
|
|
32
32
|
"lib/simple_navigation/controller_methods.rb",
|
33
33
|
"lib/simple_navigation/helpers.rb",
|
34
34
|
"lib/simple_navigation/item.rb",
|
35
|
+
"lib/simple_navigation/item_adapter.rb",
|
35
36
|
"lib/simple_navigation/item_container.rb",
|
37
|
+
"lib/simple_navigation/items_provider.rb",
|
36
38
|
"lib/simple_navigation/renderer/base.rb",
|
37
39
|
"lib/simple_navigation/renderer/list.rb",
|
38
40
|
"rails/init.rb",
|
@@ -40,8 +42,10 @@ Gem::Specification.new do |s|
|
|
40
42
|
"spec/lib/simple_navigation/configuration_spec.rb",
|
41
43
|
"spec/lib/simple_navigation/controller_methods_spec.rb",
|
42
44
|
"spec/lib/simple_navigation/helpers_spec.rb",
|
45
|
+
"spec/lib/simple_navigation/item_adapter_spec.rb",
|
43
46
|
"spec/lib/simple_navigation/item_container_spec.rb",
|
44
47
|
"spec/lib/simple_navigation/item_spec.rb",
|
48
|
+
"spec/lib/simple_navigation/items_provider_spec.rb",
|
45
49
|
"spec/lib/simple_navigation/renderer/base_spec.rb",
|
46
50
|
"spec/lib/simple_navigation/renderer/list_spec.rb",
|
47
51
|
"spec/lib/simple_navigation_spec.rb",
|
@@ -58,8 +62,10 @@ Gem::Specification.new do |s|
|
|
58
62
|
"spec/lib/simple_navigation/configuration_spec.rb",
|
59
63
|
"spec/lib/simple_navigation/controller_methods_spec.rb",
|
60
64
|
"spec/lib/simple_navigation/helpers_spec.rb",
|
65
|
+
"spec/lib/simple_navigation/item_adapter_spec.rb",
|
61
66
|
"spec/lib/simple_navigation/item_container_spec.rb",
|
62
67
|
"spec/lib/simple_navigation/item_spec.rb",
|
68
|
+
"spec/lib/simple_navigation/items_provider_spec.rb",
|
63
69
|
"spec/lib/simple_navigation/renderer/base_spec.rb",
|
64
70
|
"spec/lib/simple_navigation/renderer/list_spec.rb",
|
65
71
|
"spec/lib/simple_navigation_spec.rb",
|
@@ -129,20 +129,60 @@ describe SimpleNavigation::Configuration do
|
|
129
129
|
it "should set auto_highlight to true as default" do
|
130
130
|
@config.auto_highlight.should be_true
|
131
131
|
end
|
132
|
+
it "should set the id_generator" do
|
133
|
+
@config.id_generator.should_not be_nil
|
134
|
+
end
|
132
135
|
end
|
133
136
|
describe 'items' do
|
134
137
|
before(:each) do
|
135
138
|
@container = stub(:items_container)
|
136
139
|
SimpleNavigation::ItemContainer.stub!(:new).and_return(@container)
|
137
140
|
end
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
+
context 'block given' do
|
142
|
+
context 'items_provider specified' do
|
143
|
+
it {lambda {@config.items(stub(:provider)) {}}.should raise_error}
|
144
|
+
end
|
145
|
+
context 'no items_provider specified' do
|
146
|
+
it "should should yield an new ItemContainer" do
|
147
|
+
@config.items do |container|
|
148
|
+
container.should == @container
|
149
|
+
end
|
150
|
+
end
|
151
|
+
it "should assign the ItemContainer to an instance-var" do
|
152
|
+
@config.items {}
|
153
|
+
@config.primary_navigation.should == @container
|
154
|
+
end
|
155
|
+
it "should not set the items on the container" do
|
156
|
+
@container.should_not_receive(:items=)
|
157
|
+
@config.items {}
|
158
|
+
end
|
141
159
|
end
|
142
160
|
end
|
143
|
-
|
144
|
-
|
145
|
-
|
161
|
+
context 'no block given' do
|
162
|
+
context 'items_provider specified' do
|
163
|
+
before(:each) do
|
164
|
+
@external_provider = stub(:external_provider)
|
165
|
+
@items = stub(:items)
|
166
|
+
@items_provider = stub(:items_provider, :items => @items)
|
167
|
+
SimpleNavigation::ItemsProvider.stub!(:new => @items_provider)
|
168
|
+
@container.stub!(:items=)
|
169
|
+
end
|
170
|
+
it "should create an new Provider object for the specified provider" do
|
171
|
+
SimpleNavigation::ItemsProvider.should_receive(:new).with(@external_provider)
|
172
|
+
@config.items(@external_provider)
|
173
|
+
end
|
174
|
+
it "should call items on the provider object" do
|
175
|
+
@items_provider.should_receive(:items)
|
176
|
+
@config.items(@external_provider)
|
177
|
+
end
|
178
|
+
it "should set the items on the container" do
|
179
|
+
@container.should_receive(:items=).with(@items)
|
180
|
+
@config.items(@external_provider)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
context 'items_provider not specified' do
|
184
|
+
it {lambda {@config.items}.should raise_error}
|
185
|
+
end
|
146
186
|
end
|
147
187
|
end
|
148
188
|
|
@@ -157,6 +197,13 @@ describe SimpleNavigation::Configuration do
|
|
157
197
|
end
|
158
198
|
end
|
159
199
|
|
200
|
+
describe 'context_for_eval' do
|
201
|
+
it "should delegate to the Configuration class" do
|
202
|
+
@config.class.should_receive(:context_for_eval)
|
203
|
+
@config.context_for_eval
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
160
207
|
end
|
161
208
|
|
162
209
|
|
@@ -35,6 +35,52 @@ describe SimpleNavigation::Helpers do
|
|
35
35
|
@controller.render_navigation
|
36
36
|
end
|
37
37
|
|
38
|
+
describe "regarding setting the 'render_all_levels' option" do
|
39
|
+
context 'all_open is not specified' do
|
40
|
+
it "should not set the option" do
|
41
|
+
SimpleNavigation.config.should_not_receive(:render_all_levels=)
|
42
|
+
@controller.render_navigation
|
43
|
+
end
|
44
|
+
end
|
45
|
+
context 'all_open is true' do
|
46
|
+
it "should set the option to true" do
|
47
|
+
SimpleNavigation.config.should_receive(:render_all_levels=).with(true)
|
48
|
+
@controller.render_navigation(:all_open => true)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
context 'all_open is false' do
|
52
|
+
it "should set the option to false" do
|
53
|
+
SimpleNavigation.config.should_receive(:render_all_levels=).with(false)
|
54
|
+
@controller.render_navigation(:all_open => false)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe 'regarding setting of items' do
|
60
|
+
context 'not items specified in options' do
|
61
|
+
it "should not set the items directly" do
|
62
|
+
SimpleNavigation.config.should_not_receive(:items)
|
63
|
+
@controller.render_navigation
|
64
|
+
end
|
65
|
+
end
|
66
|
+
context 'items specified in options' do
|
67
|
+
before(:each) do
|
68
|
+
@items = stub(:items)
|
69
|
+
end
|
70
|
+
it "should set the items directly" do
|
71
|
+
SimpleNavigation.config.should_receive(:items).with(@items)
|
72
|
+
@controller.render_navigation(:items => @items)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe 'no primary navigation defined' do
|
78
|
+
before(:each) do
|
79
|
+
SimpleNavigation.stub!(:primary_navigation => nil)
|
80
|
+
end
|
81
|
+
it {lambda {@controller.render_navigation}.should raise_error}
|
82
|
+
end
|
83
|
+
|
38
84
|
context 'primary' do
|
39
85
|
it "should call render on the primary_navigation" do
|
40
86
|
@primary_navigation.should_receive(:render)
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
describe SimpleNavigation::ItemAdapter do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@item = stub(:item)
|
7
|
+
@item_adapter = SimpleNavigation::ItemAdapter.new(@item)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'key' do
|
11
|
+
it "should delegate key to item" do
|
12
|
+
@item.should_receive(:key)
|
13
|
+
@item_adapter.key
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'url' do
|
18
|
+
it "should delegate url to item" do
|
19
|
+
@item.should_receive(:url)
|
20
|
+
@item_adapter.url
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'name' do
|
25
|
+
it "should delegate name to item" do
|
26
|
+
@item.should_receive(:name)
|
27
|
+
@item_adapter.name
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'initialize' do
|
32
|
+
it "should set the item" do
|
33
|
+
@item_adapter.item.should == @item
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'options' do
|
38
|
+
context 'item does respond to options' do
|
39
|
+
before(:each) do
|
40
|
+
@options = stub(:options)
|
41
|
+
@item.stub!(:options => @options)
|
42
|
+
end
|
43
|
+
it "should return the item's options'" do
|
44
|
+
@item_adapter.options.should == @options
|
45
|
+
end
|
46
|
+
end
|
47
|
+
context 'item does not respond to options' do
|
48
|
+
it "should return an empty hash" do
|
49
|
+
@item_adapter.options.should == {}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe 'items' do
|
55
|
+
context 'item does respond to items' do
|
56
|
+
context 'items is nil' do
|
57
|
+
before(:each) do
|
58
|
+
@item.stub!(:items => nil)
|
59
|
+
end
|
60
|
+
it "should return nil" do
|
61
|
+
@item_adapter.items.should be_nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
context 'items is not nil' do
|
65
|
+
context 'items is empty' do
|
66
|
+
before(:each) do
|
67
|
+
@item.stub!(:items => [])
|
68
|
+
end
|
69
|
+
it "should return nil" do
|
70
|
+
@item_adapter.items.should be_nil
|
71
|
+
end
|
72
|
+
end
|
73
|
+
context 'items is not empty' do
|
74
|
+
before(:each) do
|
75
|
+
@items = stub(:items, :empty? => false)
|
76
|
+
@item.stub!(:items => @items)
|
77
|
+
end
|
78
|
+
it "should return the items" do
|
79
|
+
@item_adapter.items.should == @items
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
context 'item does not respond to items' do
|
85
|
+
it "should return nil" do
|
86
|
+
@item_adapter.items.should be_nil
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe 'to_simple_navigation_item' do
|
92
|
+
before(:each) do
|
93
|
+
@container = stub(:container)
|
94
|
+
@item.stub!(:url => 'url', :name => 'name', :key => 'key', :options => {}, :items => [])
|
95
|
+
end
|
96
|
+
it "should create a SimpleNavigation::Item" do
|
97
|
+
SimpleNavigation::Item.should_receive(:new).with(@container, 'key', 'name', 'url', {}, nil)
|
98
|
+
@item_adapter.to_simple_navigation_item(@container)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
@@ -15,6 +15,48 @@ describe SimpleNavigation::ItemContainer do
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
describe 'items=' do
|
19
|
+
before(:each) do
|
20
|
+
@item = stub(:item)
|
21
|
+
@items = [@item]
|
22
|
+
@item_adapter = stub(:item_adapter, :null_object => true)
|
23
|
+
SimpleNavigation::ItemAdapter.stub(:new => @item_adapter)
|
24
|
+
@item_container.stub!(:should_add_item? => true)
|
25
|
+
end
|
26
|
+
it "should wrap each item in an ItemAdapter" do
|
27
|
+
SimpleNavigation::ItemAdapter.should_receive(:new)
|
28
|
+
@item_container.items = @items
|
29
|
+
end
|
30
|
+
context 'item should be added' do
|
31
|
+
before(:each) do
|
32
|
+
@item_container.stub!(:should_add_item? => true)
|
33
|
+
@simple_navigation_item = stub(:simple_navigation_item)
|
34
|
+
@item_adapter.stub!(:to_simple_navigation_item => @simple_navigation_item)
|
35
|
+
end
|
36
|
+
it "should convert the item to a SimpleNavigation::Item" do
|
37
|
+
@item_adapter.should_receive(:to_simple_navigation_item).with(@item_container)
|
38
|
+
@item_container.items = @items
|
39
|
+
end
|
40
|
+
it "should add the item to the items-collection" do
|
41
|
+
@item_container.items.should_receive(:<<).with(@simple_navigation_item)
|
42
|
+
@item_container.items = @items
|
43
|
+
end
|
44
|
+
end
|
45
|
+
context 'item should not be added' do
|
46
|
+
before(:each) do
|
47
|
+
@item_container.stub!(:should_add_item? => false)
|
48
|
+
end
|
49
|
+
it "should not convert the item to a SimpleNavigation::Item" do
|
50
|
+
@item_adapter.should_not_receive(:to_simple_navigation_item)
|
51
|
+
@item_container.items = @items
|
52
|
+
end
|
53
|
+
it "should not add the item to the items-collection" do
|
54
|
+
@item_container.items.should_not_receive(:<<)
|
55
|
+
@item_container.items = @items
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
18
60
|
describe 'selected?' do
|
19
61
|
before(:each) do
|
20
62
|
@item_1 = stub(:item, :selected? => false)
|
@@ -148,7 +190,7 @@ describe SimpleNavigation::ItemContainer do
|
|
148
190
|
end
|
149
191
|
end
|
150
192
|
it "should create a new Navigation-Item with the given params and the specified block" do
|
151
|
-
SimpleNavigation::Item.should_receive(:new).with(@item_container, 'key', 'name', 'url', @options,
|
193
|
+
SimpleNavigation::Item.should_receive(:new).with(@item_container, 'key', 'name', 'url', @options, nil, &@proc)
|
152
194
|
@item_container.item('key', 'name', 'url', @options, &@proc)
|
153
195
|
end
|
154
196
|
it "should add the created item to the list of items" do
|
@@ -3,16 +3,53 @@ require File.dirname(__FILE__) + '/../../spec_helper'
|
|
3
3
|
describe SimpleNavigation::Item do
|
4
4
|
|
5
5
|
before(:each) do
|
6
|
-
@item_container = stub(:item_container)
|
7
|
-
@item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', {}
|
6
|
+
@item_container = stub(:item_container, :level => 1)
|
7
|
+
@item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', {})
|
8
8
|
end
|
9
9
|
|
10
10
|
describe 'initialize' do
|
11
|
+
context 'subnavigation' do
|
12
|
+
before(:each) do
|
13
|
+
@subnav_container = stub(:subnav_container, :null_object => true)
|
14
|
+
SimpleNavigation::ItemContainer.stub!(:new => @subnav_container)
|
15
|
+
end
|
16
|
+
context 'block given' do
|
17
|
+
it "should create a new ItemContainer with a level+1" do
|
18
|
+
SimpleNavigation::ItemContainer.should_receive(:new).with(2)
|
19
|
+
SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', {}) {}
|
20
|
+
end
|
21
|
+
it "should call the block" do
|
22
|
+
@subnav_container.should_receive(:test)
|
23
|
+
SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', {}) {|subnav| subnav.test}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
context 'no block given' do
|
27
|
+
context 'items given' do
|
28
|
+
before(:each) do
|
29
|
+
@items = stub(:items)
|
30
|
+
end
|
31
|
+
it "should create a new ItemContainer with a level+1" do
|
32
|
+
SimpleNavigation::ItemContainer.should_receive(:new).with(2)
|
33
|
+
SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', {}, @items)
|
34
|
+
end
|
35
|
+
it "should set the items on the subnav_container" do
|
36
|
+
@subnav_container.should_receive(:items=).with(@items)
|
37
|
+
SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', {}, @items)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
context 'no items given' do
|
41
|
+
it "should not create a new ItemContainer" do
|
42
|
+
SimpleNavigation::ItemContainer.should_not_receive(:new)
|
43
|
+
@item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', {})
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
11
48
|
context 'method' do
|
12
49
|
context 'defined' do
|
13
50
|
before(:each) do
|
14
51
|
@options = {:method => :delete}
|
15
|
-
@item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', @options
|
52
|
+
@item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', @options)
|
16
53
|
end
|
17
54
|
it 'should set the method as instance_var' do
|
18
55
|
@item.method.should == :delete
|
@@ -93,7 +130,7 @@ describe SimpleNavigation::Item do
|
|
93
130
|
context 'with classes defined in options' do
|
94
131
|
before(:each) do
|
95
132
|
@options = {:class => 'my_class'}
|
96
|
-
@item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', @options
|
133
|
+
@item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', @options)
|
97
134
|
end
|
98
135
|
context 'with item selected' do
|
99
136
|
before(:each) do
|
@@ -113,7 +150,7 @@ describe SimpleNavigation::Item do
|
|
113
150
|
context 'without classes in options' do
|
114
151
|
before(:each) do
|
115
152
|
@options = {}
|
116
|
-
@item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', @options
|
153
|
+
@item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', @options)
|
117
154
|
end
|
118
155
|
context 'with item selected' do
|
119
156
|
before(:each) do
|
@@ -305,34 +342,34 @@ describe SimpleNavigation::Item do
|
|
305
342
|
@global = stub(:config)
|
306
343
|
SimpleNavigation.stub!(:config => @global)
|
307
344
|
end
|
308
|
-
context 'global
|
345
|
+
context 'global auto_highlight on' do
|
309
346
|
before(:each) do
|
310
347
|
@global.stub!(:auto_highlight => true)
|
311
348
|
end
|
312
|
-
context 'container
|
349
|
+
context 'container auto_highlight on' do
|
313
350
|
before(:each) do
|
314
351
|
@item_container.stub!(:auto_highlight => true)
|
315
352
|
end
|
316
353
|
it {@item.send(:auto_highlight?).should be_true}
|
317
354
|
end
|
318
|
-
context 'container
|
355
|
+
context 'container auto_highlight off' do
|
319
356
|
before(:each) do
|
320
357
|
@item_container.stub!(:auto_highlight => false)
|
321
358
|
end
|
322
359
|
it {@item.send(:auto_highlight?).should be_false}
|
323
360
|
end
|
324
361
|
end
|
325
|
-
context 'global
|
362
|
+
context 'global auto_highlight off' do
|
326
363
|
before(:each) do
|
327
364
|
@global.stub!(:auto_highlight => false)
|
328
365
|
end
|
329
|
-
context 'container
|
366
|
+
context 'container auto_highlight on' do
|
330
367
|
before(:each) do
|
331
368
|
@item_container.stub!(:auto_highlight => true)
|
332
369
|
end
|
333
370
|
it {@item.send(:auto_highlight?).should be_false}
|
334
371
|
end
|
335
|
-
context 'container
|
372
|
+
context 'container auto_highlight off' do
|
336
373
|
before(:each) do
|
337
374
|
@item_container.stub!(:auto_highlight => false)
|
338
375
|
end
|
@@ -341,4 +378,20 @@ describe SimpleNavigation::Item do
|
|
341
378
|
end
|
342
379
|
end
|
343
380
|
|
381
|
+
describe 'autogenerated_item_id' do
|
382
|
+
context 'calls' do
|
383
|
+
before(:each) do
|
384
|
+
@id_generator = stub(:id_generator)
|
385
|
+
SimpleNavigation.config.stub!(:id_generator => @id_generator)
|
386
|
+
end
|
387
|
+
it "should call the configured generator with the key as param" do
|
388
|
+
@id_generator.should_receive(:call).with(:my_key)
|
389
|
+
@item.send(:autogenerated_item_id)
|
390
|
+
end
|
391
|
+
end
|
392
|
+
context 'default generator' do
|
393
|
+
it {@item.send(:autogenerated_item_id).should == 'my_key'}
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
344
397
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
describe SimpleNavigation::ItemsProvider do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@provider = stub(:provider)
|
7
|
+
@items_provider = SimpleNavigation::ItemsProvider.new(@provider)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'initialize' do
|
11
|
+
it "should set the provider" do
|
12
|
+
@items_provider.provider.should == @provider
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'items' do
|
17
|
+
before(:each) do
|
18
|
+
@items = stub(:items)
|
19
|
+
end
|
20
|
+
context 'provider is symbol' do
|
21
|
+
before(:each) do
|
22
|
+
@items_provider.instance_variable_set(:@provider, :provider_method)
|
23
|
+
@context = stub(:context, :provider_method => @items)
|
24
|
+
SimpleNavigation::Configuration.stub!(:context_for_eval => @context)
|
25
|
+
end
|
26
|
+
it "should call the method specified by symbol on the context" do
|
27
|
+
@context.should_receive(:provider_method)
|
28
|
+
@items_provider.items
|
29
|
+
end
|
30
|
+
it "should return the items returned by the helper method" do
|
31
|
+
@items_provider.items.should == @items
|
32
|
+
end
|
33
|
+
end
|
34
|
+
context 'provider responds to items' do
|
35
|
+
before(:each) do
|
36
|
+
@provider.stub!(:items => @items)
|
37
|
+
end
|
38
|
+
it "should get the items from the items_provider" do
|
39
|
+
@provider.should_receive(:items)
|
40
|
+
@items_provider.items
|
41
|
+
end
|
42
|
+
it "should return the items of the provider" do
|
43
|
+
@items_provider.items.should == @items
|
44
|
+
end
|
45
|
+
end
|
46
|
+
context 'provider is a collection' do
|
47
|
+
before(:each) do
|
48
|
+
@items_collection = []
|
49
|
+
@items_provider.instance_variable_set(:@provider, @items_collection)
|
50
|
+
end
|
51
|
+
it "should return the collection itsself" do
|
52
|
+
@items_provider.items.should == @items_collection
|
53
|
+
end
|
54
|
+
end
|
55
|
+
context 'neither symbol nor items_provider.items nor collection' do
|
56
|
+
it {lambda {@items_provider.items}.should raise_error}
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -7,16 +7,16 @@ describe SimpleNavigation::Renderer::List do
|
|
7
7
|
|
8
8
|
def sub_items
|
9
9
|
[
|
10
|
-
[:subnav1, 'subnav1', 'subnav1_url', {}
|
11
|
-
[:subnav2, 'subnav2', 'subnav2_url', {}
|
10
|
+
[:subnav1, 'subnav1', 'subnav1_url', {}],
|
11
|
+
[:subnav2, 'subnav2', 'subnav2_url', {}]
|
12
12
|
]
|
13
13
|
end
|
14
14
|
|
15
15
|
def primary_items
|
16
16
|
[
|
17
|
-
[:users, 'users', 'first_url', {:id => 'my_id'}
|
18
|
-
[:invoices, 'invoices', 'second_url', {}
|
19
|
-
[:accounts, 'accounts', 'third_url', {:style => 'float:right'}
|
17
|
+
[:users, 'users', 'first_url', {:id => 'my_id'}],
|
18
|
+
[:invoices, 'invoices', 'second_url', {}],
|
19
|
+
[:accounts, 'accounts', 'third_url', {:style => 'float:right'}]
|
20
20
|
]
|
21
21
|
end
|
22
22
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple-navigation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andi Schacke
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-12-18 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -37,7 +37,9 @@ files:
|
|
37
37
|
- lib/simple_navigation/controller_methods.rb
|
38
38
|
- lib/simple_navigation/helpers.rb
|
39
39
|
- lib/simple_navigation/item.rb
|
40
|
+
- lib/simple_navigation/item_adapter.rb
|
40
41
|
- lib/simple_navigation/item_container.rb
|
42
|
+
- lib/simple_navigation/items_provider.rb
|
41
43
|
- lib/simple_navigation/renderer/base.rb
|
42
44
|
- lib/simple_navigation/renderer/list.rb
|
43
45
|
- rails/init.rb
|
@@ -45,8 +47,10 @@ files:
|
|
45
47
|
- spec/lib/simple_navigation/configuration_spec.rb
|
46
48
|
- spec/lib/simple_navigation/controller_methods_spec.rb
|
47
49
|
- spec/lib/simple_navigation/helpers_spec.rb
|
50
|
+
- spec/lib/simple_navigation/item_adapter_spec.rb
|
48
51
|
- spec/lib/simple_navigation/item_container_spec.rb
|
49
52
|
- spec/lib/simple_navigation/item_spec.rb
|
53
|
+
- spec/lib/simple_navigation/items_provider_spec.rb
|
50
54
|
- spec/lib/simple_navigation/renderer/base_spec.rb
|
51
55
|
- spec/lib/simple_navigation/renderer/list_spec.rb
|
52
56
|
- spec/lib/simple_navigation_spec.rb
|
@@ -85,8 +89,10 @@ test_files:
|
|
85
89
|
- spec/lib/simple_navigation/configuration_spec.rb
|
86
90
|
- spec/lib/simple_navigation/controller_methods_spec.rb
|
87
91
|
- spec/lib/simple_navigation/helpers_spec.rb
|
92
|
+
- spec/lib/simple_navigation/item_adapter_spec.rb
|
88
93
|
- spec/lib/simple_navigation/item_container_spec.rb
|
89
94
|
- spec/lib/simple_navigation/item_spec.rb
|
95
|
+
- spec/lib/simple_navigation/items_provider_spec.rb
|
90
96
|
- spec/lib/simple_navigation/renderer/base_spec.rb
|
91
97
|
- spec/lib/simple_navigation/renderer/list_spec.rb
|
92
98
|
- spec/lib/simple_navigation_spec.rb
|