simple-navigation 1.1.1
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 +3 -0
- data/README +19 -0
- data/Rakefile +65 -0
- data/VERSION.yml +4 -0
- data/generators/navigation_config/USAGE +1 -0
- data/generators/navigation_config/navigation_config_generator.rb +8 -0
- data/generators/navigation_config/templates/config/navigation.rb +28 -0
- data/lib/simple_navigation.rb +21 -0
- data/lib/simple_navigation/configuration.rb +41 -0
- data/lib/simple_navigation/controller_methods.rb +74 -0
- data/lib/simple_navigation/helpers.rb +51 -0
- data/lib/simple_navigation/item.rb +40 -0
- data/lib/simple_navigation/item_container.rb +43 -0
- data/lib/simple_navigation/renderer/base.rb +30 -0
- data/lib/simple_navigation/renderer/list.rb +24 -0
- data/rails/init.rb +3 -0
- data/spec/lib/configuration_spec.rb +81 -0
- data/spec/lib/controller_methods_spec.rb +75 -0
- data/spec/lib/helpers_spec.rb +97 -0
- data/spec/lib/item_container_spec.rb +94 -0
- data/spec/lib/item_spec.rb +101 -0
- data/spec/lib/renderer/base_spec.rb +15 -0
- data/spec/lib/renderer/list_spec.rb +94 -0
- data/spec/spec_helper.rb +24 -0
- metadata +84 -0
data/CHANGELOG
ADDED
data/README
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
== Simple Navigation
|
3
|
+
|
4
|
+
Simple Navigation is a plugin for creating a navigation (optionally with sub navigation) for your rails app.
|
5
|
+
|
6
|
+
Source code:
|
7
|
+
git://github.com/andi/simple-navigation.git
|
8
|
+
|
9
|
+
Documentation:
|
10
|
+
http://wiki.github.com/andi/simple-navigation
|
11
|
+
|
12
|
+
Online Demo:
|
13
|
+
http://simple-navigation-demo.andischacke.com
|
14
|
+
|
15
|
+
Discussion Group for Feedback and Questions
|
16
|
+
http://groups.google.com/group/simple-navigation
|
17
|
+
|
18
|
+
Copyright (c) 2009 Andi Schacke, released under the MIT license
|
19
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'spec/rake/spectask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
|
5
|
+
desc 'Default: run specs.'
|
6
|
+
task :default => :spec
|
7
|
+
|
8
|
+
desc 'Run the specs'
|
9
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
10
|
+
t.spec_opts = ['--colour --format progress --loadby mtime --reverse']
|
11
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'Generate documentation for the simple_navigation plugin.'
|
15
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
16
|
+
rdoc.rdoc_dir = 'rdoc'
|
17
|
+
rdoc.title = 'SimpleNavigation'
|
18
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
19
|
+
rdoc.rdoc_files.include('README')
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
+
end
|
22
|
+
|
23
|
+
begin
|
24
|
+
require 'jeweler'
|
25
|
+
Jeweler::Tasks.new do |gemspec|
|
26
|
+
gemspec.name = "simple-navigation"
|
27
|
+
gemspec.summary = "Simple Navigation is a ruby library for creating a navigation (optionally with sub navigation) for your rails app."
|
28
|
+
gemspec.email = "andreas.schacke@gmail.com"
|
29
|
+
gemspec.homepage = "http://github.com/andi/simple-navigation"
|
30
|
+
gemspec.description = "Simple Navigation is a ruby library for creating a navigation (optionally with sub navigation) for your rails app."
|
31
|
+
gemspec.authors = ["Andi Schacke"]
|
32
|
+
gemspec.rdoc_options = ["--inline-source", "--charset=UTF-8"]
|
33
|
+
gemspec.files += ["CHANGELOG"]
|
34
|
+
gemspec.rubyforge_project = 'andi'
|
35
|
+
end
|
36
|
+
rescue LoadError
|
37
|
+
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
38
|
+
end
|
39
|
+
|
40
|
+
begin
|
41
|
+
require 'rake/contrib/sshpublisher'
|
42
|
+
namespace :rubyforge do
|
43
|
+
|
44
|
+
desc "Release gem and RDoc documentation to RubyForge"
|
45
|
+
task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
|
46
|
+
|
47
|
+
namespace :release do
|
48
|
+
desc "Publish RDoc to RubyForge."
|
49
|
+
task :docs => [:rdoc] do
|
50
|
+
config = YAML.load(
|
51
|
+
File.read(File.expand_path('~/.rubyforge/user-config.yml'))
|
52
|
+
)
|
53
|
+
|
54
|
+
host = "#{config['username']}@rubyforge.org"
|
55
|
+
remote_dir = "/var/www/gforge-projects/simple-navigation/"
|
56
|
+
local_dir = 'rdoc'
|
57
|
+
|
58
|
+
Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
rescue LoadError
|
63
|
+
puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
|
64
|
+
end
|
65
|
+
|
data/VERSION.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Creates a template config file for the simple-navigation plugin. You will find the generated file in config/navigation.rb.
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Configures your navigation
|
2
|
+
SimpleNavigation::Configuration.run do |navigation|
|
3
|
+
# Specify a custom renderer if needed.
|
4
|
+
# The default renderer is SimpleNavigation::Renderer::List which renders HTML lists.
|
5
|
+
# navigation.renderer = Your::Custom::Renderer
|
6
|
+
|
7
|
+
# Specify the class that will be applied to active navigation items. Defaults to 'selected'
|
8
|
+
# navigation.selected_class = 'your_selected_class'
|
9
|
+
|
10
|
+
# Define the primary navigation
|
11
|
+
navigation.items do |primary|
|
12
|
+
# Add an item to the primary navigation. The following params apply:
|
13
|
+
# key - a symbol which uniquely defines your navigation item in the scope of the primary_navigation
|
14
|
+
# name - will be displayed in the rendered navigation. This can also be a call to your I18n-framework.
|
15
|
+
# url - the address that the generated item links to. You can also use url_helpers (named routes, restful routes helper, url_for etc.)
|
16
|
+
# html_options - can be used to specify attributes that will be included in the rendered navigation item (e.g. id, class etc.)
|
17
|
+
#
|
18
|
+
primary.item :key_1, 'name', url, html_options
|
19
|
+
|
20
|
+
# Add an item which has a sub navigation (same params, but with block)
|
21
|
+
primary.item :key_2, 'name', url, html_options do |sub_nav|
|
22
|
+
# Add an item to the sub navigation (same params again)
|
23
|
+
sub_nav.item :key_2_1, 'name', url, html_options
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# A plugin for generating a simple navigation. See README for resources on usage instructions.
|
2
|
+
module SimpleNavigation
|
3
|
+
|
4
|
+
mattr_accessor :config_file
|
5
|
+
|
6
|
+
# Reads the specified config_file and stores it for later evaluation.
|
7
|
+
def self.load_config(config_file)
|
8
|
+
self.config_file = IO.read(config_file)
|
9
|
+
end
|
10
|
+
|
11
|
+
# Returns the singleton instance of the SimpleNavigation::Configuration
|
12
|
+
def self.config
|
13
|
+
Configuration.instance
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns the ItemContainer that contains the items for the primary navigation
|
17
|
+
def self.primary_navigation
|
18
|
+
config.primary_navigation
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module SimpleNavigation
|
4
|
+
|
5
|
+
# Responsible for evaluating and handling the config/navigation.rb file.
|
6
|
+
class Configuration
|
7
|
+
include Singleton
|
8
|
+
|
9
|
+
attr_accessor :renderer
|
10
|
+
attr_accessor :selected_class
|
11
|
+
attr_reader :primary_navigation
|
12
|
+
|
13
|
+
# Evals the config_file inside the specified context (usually a controller or view)
|
14
|
+
def self.eval_config(context)
|
15
|
+
context.instance_eval(SimpleNavigation.config_file)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Starts processing the configuration
|
19
|
+
def self.run(&block)
|
20
|
+
block.call Configuration.instance
|
21
|
+
end
|
22
|
+
|
23
|
+
# Sets the config's default-settings
|
24
|
+
def initialize
|
25
|
+
@renderer = SimpleNavigation::Renderer::List
|
26
|
+
@selected_class = 'selected'
|
27
|
+
end
|
28
|
+
|
29
|
+
# Yields an SimpleNavigation::ItemContainer for adding navigation items
|
30
|
+
def items(&block)
|
31
|
+
@primary_navigation = ItemContainer.new
|
32
|
+
block.call @primary_navigation
|
33
|
+
end
|
34
|
+
|
35
|
+
# Returns true if the config_file has already been evaluated.
|
36
|
+
def loaded?
|
37
|
+
!@primary_navigation.nil?
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
#TODO: add :except and :only options to navigation method
|
2
|
+
module SimpleNavigation
|
3
|
+
|
4
|
+
# Adds methods for handling the current 'active' navigation to the controllers.
|
5
|
+
#
|
6
|
+
# On the controller class level, use the navigation method to set the active navigation for all actions in the controller.
|
7
|
+
#
|
8
|
+
# ==== Examples
|
9
|
+
# class AccountController << ActionController
|
10
|
+
# navigation :account
|
11
|
+
# ...
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# class AccountSettingsController << ActionController
|
15
|
+
# navigation :account, :settings
|
16
|
+
# ...
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# The first example sets the current_primary_navigation to :account for all actions. No active sub_navigation.
|
20
|
+
# The second example sets the current_primary_navigation to :account and the current_sub_navigation to :settings.
|
21
|
+
#
|
22
|
+
# On the controller instance level, use the current_navigation method to define the active navigation for a specific action.
|
23
|
+
# The navigation item that is set in current_navigation overrides the one defined on the controller class level (see navigation method).
|
24
|
+
#
|
25
|
+
# ==== Example
|
26
|
+
# class AccountController << ActionController
|
27
|
+
# navigation :account
|
28
|
+
#
|
29
|
+
# def your_special_action
|
30
|
+
# ...
|
31
|
+
# current_navigation :special
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# This overrides :account as active navigation for your_special_action and sets it to :special.
|
36
|
+
#
|
37
|
+
# Note: The specified symbols must match the keys for your navigation items in your config/navigation.rb file.
|
38
|
+
module ControllerMethods
|
39
|
+
def self.included(base) #:nodoc:
|
40
|
+
base.class_eval do
|
41
|
+
extend ClassMethods
|
42
|
+
include InstanceMethods
|
43
|
+
helper SimpleNavigation::Helpers
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
module ClassMethods
|
48
|
+
# Sets the active navigation for all actions in this controller.
|
49
|
+
#
|
50
|
+
# The specified symbols must match the keys for your navigation items in your config/navigation.rb file.
|
51
|
+
def navigation(primary_navigation, sub_navigation=nil)
|
52
|
+
self.class_eval do
|
53
|
+
define_method :set_navigation do
|
54
|
+
current_navigation(primary_navigation, sub_navigation)
|
55
|
+
end
|
56
|
+
before_filter :set_navigation
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
module InstanceMethods
|
62
|
+
|
63
|
+
# Sets the active navigation. Call this method in any action to override the controller-wide active navigation
|
64
|
+
# specified by navigation.
|
65
|
+
#
|
66
|
+
# The specified symbols must match the keys for your navigation items in your config/navigation.rb file.
|
67
|
+
def current_navigation(primary_navigation, sub_navigation=nil)
|
68
|
+
@current_primary_navigation = primary_navigation
|
69
|
+
@current_secondary_navigation = sub_navigation
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module SimpleNavigation
|
2
|
+
|
3
|
+
# View helpers to render the navigation.
|
4
|
+
#
|
5
|
+
# Use render_primary_navigation to render your primary navigation with the configured renderer.
|
6
|
+
# Use render_sub_navigation to render the sub navigation belonging to the active primary navigation.
|
7
|
+
# Use render_navigation to render the primary navigation with the corresponding sub navigation rendered inside primary navigation item which is active.
|
8
|
+
#
|
9
|
+
# ==== Examples (using Haml)
|
10
|
+
# #primary_navigation= render_primary_navigation
|
11
|
+
#
|
12
|
+
# #sub_navigation= render_sub_navigation
|
13
|
+
#
|
14
|
+
# #main_navigation= render_navigation
|
15
|
+
#
|
16
|
+
module Helpers
|
17
|
+
|
18
|
+
# Renders the navigation according to the specified <tt>level</tt>.
|
19
|
+
#
|
20
|
+
# The <tt>level</tt> defaults to :nested which renders the the sub_navigation for an active primary_navigation inside that active primary_navigation item.
|
21
|
+
#
|
22
|
+
# Other possible levels are
|
23
|
+
#
|
24
|
+
# :primary which only renders the primary_navigation (also see render_primary_navigation) and :secondary which only renders the sub_navigation (see render_sub_navigation).
|
25
|
+
def render_navigation(level = :nested)
|
26
|
+
SimpleNavigation::Configuration.eval_config(self) unless SimpleNavigation.config.loaded?
|
27
|
+
case level
|
28
|
+
when :primary:
|
29
|
+
SimpleNavigation.primary_navigation.render(@current_primary_navigation)
|
30
|
+
when :secondary:
|
31
|
+
primary = SimpleNavigation.primary_navigation[@current_primary_navigation]
|
32
|
+
primary.sub_navigation.render(@current_secondary_navigation) if primary && primary.sub_navigation
|
33
|
+
when :nested:
|
34
|
+
SimpleNavigation.primary_navigation.render(@current_primary_navigation, true, @current_secondary_navigation)
|
35
|
+
else
|
36
|
+
raise ArgumentError, "Invalid navigation level: #{level}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Renders the primary_navigation with the configured renderer. Calling render_navigation(:primary) has the same effect.
|
41
|
+
def render_primary_navigation
|
42
|
+
render_navigation(:primary)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Renders the sub_navigation with the configured renderer. Calling render_navigation(:secondary) has the same effect.
|
46
|
+
def render_sub_navigation
|
47
|
+
render_navigation(:secondary)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module SimpleNavigation
|
2
|
+
|
3
|
+
# Represents an item in your navigation. Gets generated by the item method in the config-file.
|
4
|
+
class Item
|
5
|
+
attr_reader :key, :name, :url, :sub_navigation
|
6
|
+
|
7
|
+
# see ItemContainer#item
|
8
|
+
def initialize(key, name, url, html_options, sub_nav_block)
|
9
|
+
@key = key
|
10
|
+
@name = name
|
11
|
+
@url = url
|
12
|
+
@html_options = html_options
|
13
|
+
if sub_nav_block
|
14
|
+
@sub_navigation = ItemContainer.new
|
15
|
+
sub_nav_block.call @sub_navigation
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns true if this navigation item should be rendered as 'selected' for the specified current_navigation.
|
20
|
+
def selected?(current_navigation)
|
21
|
+
key == current_navigation
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returns the html-options hash for the item, i.e. the options specified for this item in the config-file.
|
25
|
+
# It also adds the 'selected' class to the list of classes if necessary.
|
26
|
+
def html_options(current_navigation)
|
27
|
+
default_options = {:id => key.to_s}
|
28
|
+
options = default_options.merge(@html_options)
|
29
|
+
options[:class] = [@html_options[:class], self.selected_class(current_navigation)].flatten.compact.join(' ')
|
30
|
+
options.delete(:class) if options[:class].blank?
|
31
|
+
options
|
32
|
+
end
|
33
|
+
|
34
|
+
def selected_class(current_navigation) #:nodoc:
|
35
|
+
selected?(current_navigation) ? SimpleNavigation.config.selected_class : nil
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module SimpleNavigation
|
2
|
+
|
3
|
+
# Holds the Items for a navigation 'level' (either the primary_navigation or a sub_navigation).
|
4
|
+
class ItemContainer
|
5
|
+
|
6
|
+
attr_reader :items
|
7
|
+
attr_accessor :renderer, :dom_id
|
8
|
+
|
9
|
+
def initialize #:nodoc:
|
10
|
+
@items = []
|
11
|
+
@renderer = Configuration.instance.renderer
|
12
|
+
end
|
13
|
+
|
14
|
+
# Creates a new navigation item.
|
15
|
+
#
|
16
|
+
# The <tt>key</tt> is a symbol which uniquely defines your navigation item in the scope of the primary_navigation or the sub_navigation.
|
17
|
+
#
|
18
|
+
# The <tt>name</tt> will be displayed in the rendered navigation. This can also be a call to your I18n-framework.
|
19
|
+
#
|
20
|
+
# The <tt>url</tt> is the address that the generated item points to. You can also use url_helpers (named routes, restful routes helper, url_for etc.)
|
21
|
+
#
|
22
|
+
# The <tt>html_options</tt> can be used to specify attributes that will be included in the rendered navigation item (e.g. id, class etc.)
|
23
|
+
#
|
24
|
+
# The <tt>block</tt> - if specified - will hold the item's sub_navigation.
|
25
|
+
def item(key, name, url, html_options={}, &block)
|
26
|
+
@items << Item.new(key, name, url, html_options, block)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns the Item with the specified key, nil otherwise.
|
30
|
+
def [](navi_key)
|
31
|
+
items.find {|i| i.key == navi_key}
|
32
|
+
end
|
33
|
+
|
34
|
+
# Renders the items in this ItemContainer using the configured renderer.
|
35
|
+
#
|
36
|
+
# Set <tt>include_sub_navigation</tt> to true if you want to nest the sub_navigation into the active primary_navigation
|
37
|
+
def render(current_navigation, include_sub_navigation=false, current_sub_navigation=nil)
|
38
|
+
self.renderer.new(current_navigation, current_sub_navigation).render(self, include_sub_navigation)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module SimpleNavigation
|
2
|
+
module Renderer
|
3
|
+
|
4
|
+
# This is the base class for all renderers.
|
5
|
+
#
|
6
|
+
# A renderer is responsible for rendering an ItemContainer (primary or a sub_navigation) and its containing items to HTML.
|
7
|
+
# It must be initialized with the current_navigation for the rendered ItemContainer and
|
8
|
+
# optionally with the current_sub_navigation (if the sub_navigation will be nested).
|
9
|
+
class Base
|
10
|
+
include ActionView::Helpers::UrlHelper
|
11
|
+
include ActionView::Helpers::TagHelper
|
12
|
+
|
13
|
+
attr_reader :current_navigation, :current_sub_navigation
|
14
|
+
|
15
|
+
def initialize(current_navigation, current_sub_navigation=nil) #:nodoc:
|
16
|
+
@current_navigation = current_navigation
|
17
|
+
@current_sub_navigation = current_sub_navigation
|
18
|
+
end
|
19
|
+
|
20
|
+
# Renders the specified ItemContainer to HTML.
|
21
|
+
#
|
22
|
+
# If <tt>include_sub_navigation</tt> is set to true, the renderer should nest the sub_navigation for the active navigation
|
23
|
+
# inside that navigation item.
|
24
|
+
def render(item_container, include_sub_navigation=false)
|
25
|
+
raise 'subclass responsibility'
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module SimpleNavigation
|
2
|
+
module Renderer
|
3
|
+
|
4
|
+
# Renders an ItemContainer as a <ul> element and its containing items as <li> elements.
|
5
|
+
# It adds the 'selected' class to li element AND the link inside the li element that is currently active.
|
6
|
+
# If the sub navigation should be included, it renders another <ul> containing the sub navigation inside the active <li> element.
|
7
|
+
#
|
8
|
+
# By default, the renderer sets the item's key as dom_id for the rendered <li> element. The id can be explicitely specified by setting
|
9
|
+
# the id in the html-options of the 'item' method in the config/navigation.rb file.
|
10
|
+
class List < Renderer::Base
|
11
|
+
|
12
|
+
def render(item_container, include_sub_navigation=false)
|
13
|
+
list_content = item_container.items.inject([]) do |list, item|
|
14
|
+
html_options = item.html_options(current_navigation)
|
15
|
+
li_content = link_to(item.name, item.url, :class => item.selected_class(current_navigation))
|
16
|
+
li_content << (item.sub_navigation.render(current_sub_navigation)) if include_sub_navigation && item.sub_navigation && item.selected?(current_navigation)
|
17
|
+
list << content_tag(:li, li_content, html_options)
|
18
|
+
end
|
19
|
+
content_tag(:ul, list_content, {:id => item_container.dom_id})
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/rails/init.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe SimpleNavigation do
|
4
|
+
|
5
|
+
describe 'load_config' do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@config_file = '"my_navigation_config"'
|
9
|
+
IO.stub!(:read).and_return(@config_file)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should load the navigation-configfile into a string" do
|
13
|
+
IO.should_receive(:read).with('./config/navigation.rb')
|
14
|
+
SimpleNavigation.load_config('./config/navigation.rb')
|
15
|
+
end
|
16
|
+
it "should store that string in a module-var" do
|
17
|
+
SimpleNavigation.load_config('./config/navigation.rb')
|
18
|
+
SimpleNavigation.config_file.should == @config_file
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'config' do
|
23
|
+
it {SimpleNavigation.config.should == SimpleNavigation::Configuration.instance}
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
describe SimpleNavigation::Configuration do
|
29
|
+
|
30
|
+
before(:each) do
|
31
|
+
@config = SimpleNavigation::Configuration.instance
|
32
|
+
end
|
33
|
+
|
34
|
+
describe 'self.run' do
|
35
|
+
it "should yield the singleton Configuration object" do
|
36
|
+
SimpleNavigation::Configuration.run do |c|
|
37
|
+
c.should == @config
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'self.eval_config' do
|
43
|
+
before(:each) do
|
44
|
+
@context = mock(:context)
|
45
|
+
@config_file = stub(:config_file)
|
46
|
+
SimpleNavigation.stub!(:config_file).and_return(@config_file)
|
47
|
+
end
|
48
|
+
it "should instance_eval the config_file-string inside the context" do
|
49
|
+
@context.should_receive(:instance_eval).with(@config_file)
|
50
|
+
SimpleNavigation::Configuration.eval_config(@context)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe 'initialize' do
|
55
|
+
it "should set the List-Renderer as default upon initialize" do
|
56
|
+
@config.renderer.should == SimpleNavigation::Renderer::List
|
57
|
+
end
|
58
|
+
it "should set the selected_class to 'selected' as default" do
|
59
|
+
@config.selected_class.should == 'selected'
|
60
|
+
end
|
61
|
+
end
|
62
|
+
describe 'items' do
|
63
|
+
before(:each) do
|
64
|
+
@container = stub(:items_container)
|
65
|
+
SimpleNavigation::ItemContainer.stub!(:new).and_return(@container)
|
66
|
+
end
|
67
|
+
it "should should yield an new ItemContainer" do
|
68
|
+
@config.items do |container|
|
69
|
+
container.should == @container
|
70
|
+
end
|
71
|
+
end
|
72
|
+
it "should assign the ItemContainer to an instance-var" do
|
73
|
+
@config.items {}
|
74
|
+
@config.primary_navigation.should == @container
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
ActionController::Base.send(:include, SimpleNavigation::ControllerMethods)
|
4
|
+
|
5
|
+
describe SimpleNavigation::ControllerMethods do
|
6
|
+
|
7
|
+
def stub_loading_config
|
8
|
+
SimpleNavigation::Configuration.stub!(:load)
|
9
|
+
end
|
10
|
+
|
11
|
+
before(:each) do
|
12
|
+
stub_loading_config
|
13
|
+
class ApplicationController < ActionController::Base
|
14
|
+
end
|
15
|
+
@controller = ApplicationController.new
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'when being included' do
|
19
|
+
it "should extend the ClassMethods" do
|
20
|
+
@controller.class.should respond_to(:navigation)
|
21
|
+
end
|
22
|
+
it "should include the InstanceMethods" do
|
23
|
+
@controller.should respond_to(:current_navigation)
|
24
|
+
end
|
25
|
+
it "should install the Helpers Module" do
|
26
|
+
@controller.master_helper_module.included_modules.should include(SimpleNavigation::Helpers)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe 'class_methods' do
|
31
|
+
|
32
|
+
describe 'navigation' do
|
33
|
+
|
34
|
+
def call_navigation(key1, key2=nil)
|
35
|
+
@controller.class_eval do
|
36
|
+
navigation key1, key2
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should not have an instance-method 'set_navigation if navigation-method has not been called" do
|
41
|
+
@controller.respond_to?(:set_navigation).should be_false
|
42
|
+
end
|
43
|
+
it 'should create an instance-method "set_navigation" when being called' do
|
44
|
+
call_navigation(:key)
|
45
|
+
@controller.respond_to?(:set_navigation).should be_true
|
46
|
+
end
|
47
|
+
it 'the created method should call current_navigation with the specified keys' do
|
48
|
+
call_navigation(:primary, :secondary)
|
49
|
+
@controller.should_receive(:current_navigation).with(:primary, :secondary)
|
50
|
+
@controller.set_navigation
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
describe 'instance_methods' do
|
57
|
+
|
58
|
+
describe 'current_navigation' do
|
59
|
+
it "should set the current_primary_navigation as specified" do
|
60
|
+
@controller.current_navigation(:first)
|
61
|
+
@controller.instance_variable_get(:@current_primary_navigation).should == :first
|
62
|
+
end
|
63
|
+
it "should set the current_secondary_navigation as specified" do
|
64
|
+
@controller.current_navigation(:first, :second)
|
65
|
+
@controller.instance_variable_get(:@current_secondary_navigation).should == :second
|
66
|
+
end
|
67
|
+
it "should set the current_secondary_navigation to nil if no secondary is specified" do
|
68
|
+
@controller.current_navigation(:first)
|
69
|
+
@controller.instance_variable_get(:@current_secondary_navigation).should be_nil
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe SimpleNavigation::Helpers do
|
4
|
+
class ControllerMock
|
5
|
+
include SimpleNavigation::Helpers
|
6
|
+
end
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
@controller = ControllerMock.new
|
10
|
+
SimpleNavigation.config.stub!(:loaded?).and_return(true)
|
11
|
+
@primary_navigation = stub(:primary_navigation)
|
12
|
+
SimpleNavigation.stub!(:primary_navigation).and_return(@primary_navigation)
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'render_navigation' do
|
16
|
+
context 'primary' do
|
17
|
+
before(:each) do
|
18
|
+
@controller.instance_variable_set(:@current_primary_navigation, :current_primary)
|
19
|
+
end
|
20
|
+
it "should call render on the primary_navigation" do
|
21
|
+
@primary_navigation.should_receive(:render).with(:current_primary)
|
22
|
+
@controller.render_navigation(:primary)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'secondary' do
|
27
|
+
context 'with current_primary_navigation set' do
|
28
|
+
before(:each) do
|
29
|
+
@sub_navigation = stub(:sub_navigation, :null_object => true)
|
30
|
+
@primary_navigation.stub!(:[]).and_return(@sub_navigation)
|
31
|
+
@controller.instance_variable_set(:@current_primary_navigation, :current_primary)
|
32
|
+
@controller.instance_variable_set(:@current_secondary_navigation, :current_secondary)
|
33
|
+
end
|
34
|
+
it "should find the sub_navigation belonging to the current primary_navigation" do
|
35
|
+
@primary_navigation.should_receive(:[]).with(:current_primary)
|
36
|
+
@controller.render_navigation(:secondary)
|
37
|
+
end
|
38
|
+
it "should call render on the current primary_navigation's sub_navigation" do
|
39
|
+
@sub_navigation.should_receive(:render).with(:current_secondary)
|
40
|
+
@controller.render_navigation(:secondary)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
context 'without current_primary_navigation set' do
|
44
|
+
before(:each) do
|
45
|
+
@primary_navigation.stub!(:[]).and_return(nil)
|
46
|
+
@controller.instance_variable_set(:@current_primary_navigation, nil)
|
47
|
+
end
|
48
|
+
it "should not raise an error" do
|
49
|
+
lambda{@controller.render_navigation(:secondary)}.should_not raise_error
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'nested' do
|
56
|
+
before(:each) do
|
57
|
+
@controller.instance_variable_set(:@current_primary_navigation, :current_primary)
|
58
|
+
@controller.instance_variable_set(:@current_secondary_navigation, :current_secondary)
|
59
|
+
end
|
60
|
+
it "should call render on the primary navigation" do
|
61
|
+
@primary_navigation.should_receive(:render).with(anything, anything, anything)
|
62
|
+
@controller.render_navigation(:nested)
|
63
|
+
end
|
64
|
+
it "should call render with the current_primary_navigation" do
|
65
|
+
@primary_navigation.should_receive(:render).with(:current_primary, anything, anything)
|
66
|
+
@controller.render_navigation(:nested)
|
67
|
+
end
|
68
|
+
it "should call render with the include_subnavigation option set" do
|
69
|
+
@primary_navigation.should_receive(:render).with(anything, true, anything)
|
70
|
+
@controller.render_navigation(:nested)
|
71
|
+
end
|
72
|
+
it "should call render with the current_sub_navigation" do
|
73
|
+
@primary_navigation.should_receive(:render).with(anything, anything, :current_secondary)
|
74
|
+
@controller.render_navigation(:nested)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'unknown level' do
|
79
|
+
it {lambda {@controller.render_navigation(:unknown)}.should raise_error(ArgumentError)}
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe 'render_primary_navigation' do
|
84
|
+
it "should delegate to render_navigation(:primary)" do
|
85
|
+
@controller.should_receive(:render_navigation).with(:primary)
|
86
|
+
@controller.render_primary_navigation
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe 'render_sub_navigation' do
|
91
|
+
it "should delegate to render_navigation(:secondary)" do
|
92
|
+
@controller.should_receive(:render_navigation).with(:secondary)
|
93
|
+
@controller.render_sub_navigation
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe SimpleNavigation::ItemContainer do
|
4
|
+
before(:each) do
|
5
|
+
@item_container = SimpleNavigation::ItemContainer.new
|
6
|
+
end
|
7
|
+
describe 'initialize' do
|
8
|
+
it "should set the renderer to the globally-configured renderer per default" do
|
9
|
+
SimpleNavigation::Configuration.instance.should_receive(:renderer)
|
10
|
+
@item_container = SimpleNavigation::ItemContainer.new
|
11
|
+
end
|
12
|
+
it "should have an empty items-array" do
|
13
|
+
@item_container = SimpleNavigation::ItemContainer.new
|
14
|
+
@item_container.items.should be_empty
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'item' do
|
19
|
+
|
20
|
+
context 'block given' do
|
21
|
+
before(:each) do
|
22
|
+
@sub_container = stub(:sub_container)
|
23
|
+
SimpleNavigation::ItemContainer.stub!(:new).and_return(@sub_container)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should should yield an new ItemContainer" do
|
27
|
+
@item_container.item('key', 'name', 'url', 'options') do |container|
|
28
|
+
container.should == @sub_container
|
29
|
+
end
|
30
|
+
end
|
31
|
+
it "should create a new Navigation-Item with the given params and the specified block" do
|
32
|
+
SimpleNavigation::Item.should_receive(:new).with('key', 'name', 'url', 'options', @proc)
|
33
|
+
@item_container.item('key', 'name', 'url', 'options', &@proc)
|
34
|
+
end
|
35
|
+
it "should add the created item to the list of items" do
|
36
|
+
@item_container.items.should_receive(:<<)
|
37
|
+
@item_container.item('key', 'name', 'url', 'options') {}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'no block given' do
|
42
|
+
it "should create a new Navigation_item with the given params and nil as sub_navi" do
|
43
|
+
SimpleNavigation::Item.should_receive(:new).with('key', 'name', 'url', 'options', nil)
|
44
|
+
@item_container.item('key', 'name', 'url', 'options')
|
45
|
+
end
|
46
|
+
it "should add the created item to the list of items" do
|
47
|
+
@item_container.items.should_receive(:<<)
|
48
|
+
@item_container.item('key', 'name', 'url', 'options')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '[]' do
|
55
|
+
|
56
|
+
before(:each) do
|
57
|
+
@item_container.item(:first, 'first', 'bla')
|
58
|
+
@item_container.item(:second, 'second', 'bla')
|
59
|
+
@item_container.item(:third, 'third', 'bla')
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should return the item with the specified navi_key" do
|
63
|
+
@item_container[:second].name.should == 'second'
|
64
|
+
end
|
65
|
+
it "should return nil if no item exists for the specified navi_key" do
|
66
|
+
@item_container[:invalid].should be_nil
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe 'render' do
|
71
|
+
before(:each) do
|
72
|
+
@renderer = stub(:renderer)
|
73
|
+
@renderer_instance = stub(:renderer_instance, :null_object => true)
|
74
|
+
@renderer.stub!(:new).and_return(@renderer_instance)
|
75
|
+
@item_container.stub!(:renderer).and_return(@renderer)
|
76
|
+
@items = stub(:items)
|
77
|
+
@item_container.stub!(:items).and_return(@items)
|
78
|
+
end
|
79
|
+
it "should instatiate a renderer with the current_primary and current_secondary" do
|
80
|
+
@renderer.should_receive(:new).with(:current_navigation, nil)
|
81
|
+
@item_container.render(:current_navigation)
|
82
|
+
end
|
83
|
+
it "should call render on the renderer and pass self" do
|
84
|
+
@renderer_instance.should_receive(:render).with(@item_container, anything)
|
85
|
+
@item_container.render(:current_navigation)
|
86
|
+
end
|
87
|
+
it "should call render on the renderer and pass the include_sub_navigation option" do
|
88
|
+
@renderer_instance.should_receive(:render).with(anything, true)
|
89
|
+
@item_container.render(:current_navigation, true, :current_sub_navigation)
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe SimpleNavigation::Item do
|
4
|
+
|
5
|
+
describe 'initialize' do
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'selected?' do
|
10
|
+
before(:each) do
|
11
|
+
@item = SimpleNavigation::Item.new(:my_key, 'name', 'url', {}, nil)
|
12
|
+
end
|
13
|
+
it {@item.selected?(:my_key).should be_true}
|
14
|
+
it {@item.selected?(:my_other_key).should be_false}
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'selected_class' do
|
18
|
+
before(:each) do
|
19
|
+
@item = SimpleNavigation::Item.new(:my_key, 'name', 'url', {}, nil)
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'item is selected' do
|
23
|
+
before(:each) do
|
24
|
+
@item.stub!(:selected?).and_return(true)
|
25
|
+
end
|
26
|
+
it {@item.instance_eval {selected_class(:bla).should == 'selected'}}
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'item is not selected' do
|
30
|
+
before(:each) do
|
31
|
+
@item.stub!(:selected?).and_return(false)
|
32
|
+
end
|
33
|
+
it {@item.instance_eval {selected_class(:bla).should == nil}}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'html_options' do
|
38
|
+
describe 'class' do
|
39
|
+
context 'with classes defined in options' do
|
40
|
+
before(:each) do
|
41
|
+
@options = {:class => 'my_class'}
|
42
|
+
@item = SimpleNavigation::Item.new(:my_key, 'name', 'url', @options, nil)
|
43
|
+
end
|
44
|
+
context 'with item selected' do
|
45
|
+
before(:each) do
|
46
|
+
@item.stub!(:selected?).and_return(true)
|
47
|
+
end
|
48
|
+
it {@item.html_options(:bla)[:class].should == 'my_class selected'}
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'with item not selected' do
|
52
|
+
before(:each) do
|
53
|
+
@item.stub!(:selected?).and_return(false)
|
54
|
+
end
|
55
|
+
it {@item.html_options(:bla)[:class].should == 'my_class'}
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'without classes in options' do
|
60
|
+
before(:each) do
|
61
|
+
@options = {}
|
62
|
+
@item = SimpleNavigation::Item.new(:my_key, 'name', 'url', @options, nil)
|
63
|
+
end
|
64
|
+
context 'with item selected' do
|
65
|
+
before(:each) do
|
66
|
+
@item.stub!(:selected?).and_return(true)
|
67
|
+
end
|
68
|
+
it {@item.html_options(:bla)[:class].should == 'selected'}
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'with item not selected' do
|
72
|
+
before(:each) do
|
73
|
+
@item.stub!(:selected?).and_return(false)
|
74
|
+
end
|
75
|
+
it {@item.html_options(:bla)[:class].should be_blank}
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe 'id' do
|
81
|
+
context 'with id defined in options' do
|
82
|
+
before(:each) do
|
83
|
+
@options = {:id => 'my_id'}
|
84
|
+
@item = SimpleNavigation::Item.new(:my_key, 'name', 'url', @options, nil)
|
85
|
+
end
|
86
|
+
it {@item.html_options(:bla)[:id].should == 'my_id'}
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'with no id definied in options (using default id)' do
|
90
|
+
before(:each) do
|
91
|
+
@options = {}
|
92
|
+
@item = SimpleNavigation::Item.new(:my_key, 'name', 'url', @options, nil)
|
93
|
+
end
|
94
|
+
it {@item.html_options(:bla)[:id].should == 'my_key'}
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe SimpleNavigation::Renderer::Base do
|
4
|
+
before(:each) do
|
5
|
+
@base_renderer = SimpleNavigation::Renderer::Base.new(:current_primary, :current_secondary)
|
6
|
+
end
|
7
|
+
it "should inclue ActionView::Helpers::UrlHelper" do
|
8
|
+
@base_renderer.should respond_to(:link_to)
|
9
|
+
end
|
10
|
+
it "should include ActionView::Helpers::TagHelper" do
|
11
|
+
@base_renderer.should respond_to(:content_tag)
|
12
|
+
end
|
13
|
+
it {@base_renderer.current_navigation.should == :current_primary}
|
14
|
+
it {@base_renderer.current_sub_navigation.should == :current_secondary}
|
15
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
require 'html/document' unless defined? HTML::Document
|
3
|
+
|
4
|
+
describe SimpleNavigation::Renderer::List do
|
5
|
+
|
6
|
+
describe 'render' do
|
7
|
+
|
8
|
+
def sub_items
|
9
|
+
[
|
10
|
+
SimpleNavigation::Item.new(:subnav1, 'subnav1', 'subnav1_url', {}, nil),
|
11
|
+
SimpleNavigation::Item.new(:subnav2, 'subnav2', 'subnav2_url', {}, nil)
|
12
|
+
]
|
13
|
+
end
|
14
|
+
|
15
|
+
def primary_items
|
16
|
+
@item1 = SimpleNavigation::Item.new(:users, 'users', 'first_url', {:id => 'my_id'}, nil)
|
17
|
+
@item2 = SimpleNavigation::Item.new(:invoices, 'invoices', 'second_url', {}, nil)
|
18
|
+
@item3 = SimpleNavigation::Item.new(:accounts, 'accounts', 'third_url', {:style => 'float:right'}, nil)
|
19
|
+
@item2.instance_variable_set(:@sub_navigation, item_container(sub_items))
|
20
|
+
[@item1, @item2, @item3]
|
21
|
+
end
|
22
|
+
|
23
|
+
def item_container(items)
|
24
|
+
container = SimpleNavigation::ItemContainer.new
|
25
|
+
container.dom_id = 'nav_dom_id'
|
26
|
+
container.instance_variable_set(:@items, items)
|
27
|
+
container
|
28
|
+
end
|
29
|
+
|
30
|
+
def primary_navigation
|
31
|
+
@item_container = item_container(primary_items)
|
32
|
+
@item_container
|
33
|
+
end
|
34
|
+
|
35
|
+
def render(current_navigation=nil, include_subnav=false)
|
36
|
+
@renderer = SimpleNavigation::Renderer::List.new(current_navigation)
|
37
|
+
HTML::Document.new(@renderer.render(primary_navigation, include_subnav)).root
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should render a ul-tag around the items" do
|
41
|
+
HTML::Selector.new('ul').select(render).should have(1).entries
|
42
|
+
end
|
43
|
+
it "the rendered ul-tag should have the specified dom_id" do
|
44
|
+
HTML::Selector.new('ul#nav_dom_id').select(render).should have(1).entries
|
45
|
+
end
|
46
|
+
it "should render a li tag for each item" do
|
47
|
+
HTML::Selector.new('li').select(render).should have(3).entries
|
48
|
+
end
|
49
|
+
it "should render an a-tag inside each li-tag" do
|
50
|
+
HTML::Selector.new('li a').select(render).should have(3).entries
|
51
|
+
end
|
52
|
+
it "should pass the specified html_options to the li element" do
|
53
|
+
HTML::Selector.new('li[style=float:right]').select(render).should have(1).entries
|
54
|
+
end
|
55
|
+
it "should give the li the id specified in the html_options" do
|
56
|
+
HTML::Selector.new('li#my_id').select(render).should have(1).entries
|
57
|
+
end
|
58
|
+
it "should give the li the default id (stringified key) if no id is specified in the html_options" do
|
59
|
+
HTML::Selector.new('ul li#invoices').select(render).should have(1).entries
|
60
|
+
end
|
61
|
+
it "should not apply the the default id where there is an id specified in the html_options" do
|
62
|
+
HTML::Selector.new('ul li#users').select(render).should be_empty
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'with current_navigation set' do
|
66
|
+
it "should mark the matching li-item as selected (with the css_class specified in configuration)" do
|
67
|
+
HTML::Selector.new('li.selected').select(render(:invoices)).should have(1).entries
|
68
|
+
end
|
69
|
+
it "should also mark the links inside the selected li's as selected" do
|
70
|
+
HTML::Selector.new('li.selected a.selected').select(render(:invoices)).should have(1).entries
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'without current_navigation set' do
|
76
|
+
it "should not mark any of the items as selected" do
|
77
|
+
HTML::Selector.new('li.selected').select(render).should be_empty
|
78
|
+
end
|
79
|
+
it "should not mark any links as selected" do
|
80
|
+
HTML::Selector.new('a.selected').select(render).should be_empty
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'nested sub_navigation' do
|
85
|
+
it "should nest the current_primary's subnavigation inside the selected li-element" do
|
86
|
+
HTML::Selector.new('li.selected ul li').select(render(:invoices, true)).should have(2).entries
|
87
|
+
end
|
88
|
+
it "should be possible to identify sub items using an html selector (using ids)" do
|
89
|
+
HTML::Selector.new('#invoices #subnav1').select(render(:invoices, true)).should have(1).entries
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
ENV["RAILS_ENV"] = "test"
|
2
|
+
require 'rubygems'
|
3
|
+
require 'spec'
|
4
|
+
require 'active_support'
|
5
|
+
require 'action_controller'
|
6
|
+
|
7
|
+
RAILS_ROOT = './' unless defined? RAILS_ROOT
|
8
|
+
|
9
|
+
$:.unshift File.dirname(__FILE__)
|
10
|
+
$:.unshift File.join(File.dirname(__FILE__), '../lib')
|
11
|
+
|
12
|
+
require 'simple_navigation/configuration'
|
13
|
+
require 'simple_navigation/helpers'
|
14
|
+
require 'simple_navigation/controller_methods'
|
15
|
+
require 'simple_navigation/item'
|
16
|
+
require 'simple_navigation/item_container'
|
17
|
+
require 'simple_navigation/renderer/base'
|
18
|
+
require 'simple_navigation/renderer/list'
|
19
|
+
|
20
|
+
require 'simple_navigation'
|
21
|
+
|
22
|
+
# Spec::Runner.configure do |config|
|
23
|
+
# no special config
|
24
|
+
# endx
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: simple-navigation
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Andi Schacke
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-04-14 00:00:00 +02:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Simple Navigation is a ruby library for creating a navigation (optionally with sub navigation) for your rails app.
|
17
|
+
email: andreas.schacke@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README
|
24
|
+
files:
|
25
|
+
- CHANGELOG
|
26
|
+
- Rakefile
|
27
|
+
- VERSION.yml
|
28
|
+
- generators/navigation_config/USAGE
|
29
|
+
- generators/navigation_config/navigation_config_generator.rb
|
30
|
+
- generators/navigation_config/templates/config/navigation.rb
|
31
|
+
- lib/simple_navigation.rb
|
32
|
+
- lib/simple_navigation/configuration.rb
|
33
|
+
- lib/simple_navigation/controller_methods.rb
|
34
|
+
- lib/simple_navigation/helpers.rb
|
35
|
+
- lib/simple_navigation/item.rb
|
36
|
+
- lib/simple_navigation/item_container.rb
|
37
|
+
- lib/simple_navigation/renderer/base.rb
|
38
|
+
- lib/simple_navigation/renderer/list.rb
|
39
|
+
- rails/init.rb
|
40
|
+
- spec/lib/configuration_spec.rb
|
41
|
+
- spec/lib/controller_methods_spec.rb
|
42
|
+
- spec/lib/helpers_spec.rb
|
43
|
+
- spec/lib/item_container_spec.rb
|
44
|
+
- spec/lib/item_spec.rb
|
45
|
+
- spec/lib/renderer/base_spec.rb
|
46
|
+
- spec/lib/renderer/list_spec.rb
|
47
|
+
- spec/spec_helper.rb
|
48
|
+
- README
|
49
|
+
has_rdoc: true
|
50
|
+
homepage: http://github.com/andi/simple-navigation
|
51
|
+
post_install_message:
|
52
|
+
rdoc_options:
|
53
|
+
- --inline-source
|
54
|
+
- --charset=UTF-8
|
55
|
+
require_paths:
|
56
|
+
- lib
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: "0"
|
62
|
+
version:
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: "0"
|
68
|
+
version:
|
69
|
+
requirements: []
|
70
|
+
|
71
|
+
rubyforge_project: andi
|
72
|
+
rubygems_version: 1.3.1
|
73
|
+
signing_key:
|
74
|
+
specification_version: 2
|
75
|
+
summary: Simple Navigation is a ruby library for creating a navigation (optionally with sub navigation) for your rails app.
|
76
|
+
test_files:
|
77
|
+
- spec/lib/configuration_spec.rb
|
78
|
+
- spec/lib/controller_methods_spec.rb
|
79
|
+
- spec/lib/helpers_spec.rb
|
80
|
+
- spec/lib/item_container_spec.rb
|
81
|
+
- spec/lib/item_spec.rb
|
82
|
+
- spec/lib/renderer/base_spec.rb
|
83
|
+
- spec/lib/renderer/list_spec.rb
|
84
|
+
- spec/spec_helper.rb
|