simple-navigation 1.3.1 → 1.4.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 CHANGED
@@ -1,3 +1,8 @@
1
+ *1.4.0
2
+
3
+ * added the capability to have several navigation-contexts
4
+ * doc-fix
5
+
1
6
  *1.3.1
2
7
 
3
8
  * now compliant with ruby 1.9.1 (thanks to Gernot Kogler for the feedback)
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
- :patch: 1
2
+ :patch: 0
3
3
  :major: 1
4
- :minor: 3
4
+ :minor: 4
@@ -1,25 +1,40 @@
1
1
  # A plugin for generating a simple navigation. See README for resources on usage instructions.
2
2
  module SimpleNavigation
3
3
 
4
- mattr_accessor :config_file
4
+ mattr_accessor :config_files
5
5
  mattr_accessor :config_file_path
6
6
  mattr_accessor :controller
7
+ self.config_files = {}
7
8
 
8
- # Reads the specified config_file and stores it for later evaluation.
9
- def self.load_config
10
- raise "config_file_path is not set!" unless self.config_file_path
11
- raise "Config file '#{config_file_path}' does not exists!" unless File.exists?(self.config_file_path)
12
- self.config_file = IO.read(self.config_file_path)
13
- end
9
+ class << self
10
+
11
+ # Reads the config_file for the specified navigation_context and stores it for later evaluation.
12
+ def load_config(navigation_context = :default)
13
+ raise "config_file_path is not set!" unless self.config_file_path
14
+ raise "Config file '#{config_file_name(navigation_context)}' does not exists!" unless File.exists?(config_file_name(navigation_context))
15
+ if ::RAILS_ENV == 'production'
16
+ self.config_files[navigation_context] ||= IO.read(config_file_name(navigation_context))
17
+ else
18
+ self.config_files[navigation_context] = IO.read(config_file_name(navigation_context))
19
+ end
20
+ end
14
21
 
15
- # Returns the singleton instance of the SimpleNavigation::Configuration
16
- def self.config
17
- Configuration.instance
18
- end
22
+ # Returns the singleton instance of the SimpleNavigation::Configuration
23
+ def config
24
+ Configuration.instance
25
+ end
19
26
 
20
- # Returns the ItemContainer that contains the items for the primary navigation
21
- def self.primary_navigation
22
- config.primary_navigation
27
+ # Returns the ItemContainer that contains the items for the primary navigation
28
+ def primary_navigation
29
+ config.primary_navigation
30
+ end
31
+
32
+ # Returns the path to the config_file for the given navigation_context
33
+ def config_file_name(navigation_context = :default)
34
+ file_name = navigation_context == :default ? '' : "#{navigation_context.to_s.underscore}_"
35
+ File.join(config_file_path, "#{file_name}navigation.rb")
36
+ end
37
+
23
38
  end
24
39
 
25
40
  end
@@ -14,9 +14,9 @@ module SimpleNavigation
14
14
 
15
15
  class << self
16
16
 
17
- # Evals the config_file inside the specified context (usually a controller or view)
18
- def eval_config(context)
19
- context.instance_eval(SimpleNavigation.config_file)
17
+ # Evals the config_file for the given navigation_context inside the specified context (usually a controller or view)
18
+ def eval_config(context, navigation_context = :default)
19
+ context.instance_eval(SimpleNavigation.config_files[navigation_context])
20
20
  SimpleNavigation.controller = extract_controller_from context
21
21
  end
22
22
 
@@ -28,11 +28,11 @@ module SimpleNavigation
28
28
  #
29
29
  # def your_special_action
30
30
  # ...
31
- # current_navigation :special
31
+ # current_navigation :account, :special
32
32
  # end
33
33
  # end
34
34
  #
35
- # This overrides :account as active navigation for your_special_action and sets it to :special.
35
+ # The code above still sets the active primary navigation to :account but also sets the sub_navigation to :special for 'your_special_action'.
36
36
  #
37
37
  # Note: The specified symbols must match the keys for your navigation items in your config/navigation.rb file.
38
38
  module ControllerMethods
@@ -15,16 +15,29 @@ module SimpleNavigation
15
15
  #
16
16
  module Helpers
17
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.load_config unless ::RAILS_ENV == 'production'
27
- SimpleNavigation::Configuration.eval_config(self)
18
+ # Renders the navigation according to the specified options-hash.
19
+ #
20
+ # The following options are supported:
21
+ # * <tt>level</tt> - defaults to :nested which renders the the sub_navigation for an active primary_navigation inside that active primary_navigation item.
22
+ # Other possible levels are :primary which only renders the primary_navigation (also see render_primary_navigation) and :secondary which only renders the sub_navigation (see render_sub_navigation).
23
+ # * <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)
24
+ # 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
25
+ # will be loaded and used for rendering the navigation.
26
+ #
27
+ def render_navigation(*args)
28
+ args = [Hash.new] if args.empty?
29
+ default_options = {:context => :default, :level => :nested}
30
+ level, navigation_context = case args.first
31
+ when Hash
32
+ options = default_options.merge(args.first)
33
+ [options[:level], options[:context]]
34
+ when Symbol
35
+ [args[0], default_options.merge(args[1] || {})[:context]]
36
+ else
37
+ raise ArgumentError, "Invalid arguments"
38
+ end
39
+ SimpleNavigation.load_config(navigation_context)
40
+ SimpleNavigation::Configuration.eval_config(self, navigation_context)
28
41
  case level
29
42
  when :primary
30
43
  SimpleNavigation.primary_navigation.render(@current_primary_navigation)
@@ -38,14 +51,14 @@ module SimpleNavigation
38
51
  end
39
52
  end
40
53
 
41
- # Renders the primary_navigation with the configured renderer. Calling render_navigation(:primary) has the same effect.
42
- def render_primary_navigation
43
- render_navigation(:primary)
54
+ # Renders the primary_navigation with the configured renderer. Calling render_navigation(:level => :primary) has the same effect.
55
+ def render_primary_navigation(options = {})
56
+ render_navigation(options.merge(:level => :primary))
44
57
  end
45
58
 
46
- # Renders the sub_navigation with the configured renderer. Calling render_navigation(:secondary) has the same effect.
47
- def render_sub_navigation
48
- render_navigation(:secondary)
59
+ # Renders the sub_navigation with the configured renderer. Calling render_navigation(:level => :secondary) has the same effect.
60
+ def render_sub_navigation(options = {})
61
+ render_navigation(options.merge(:level => :secondary))
49
62
  end
50
63
 
51
64
  end
data/rails/init.rb CHANGED
@@ -1,4 +1,3 @@
1
- default_config_file_path = File.join(RAILS_ROOT, 'config', 'navigation.rb')
1
+ default_config_file_path = File.join(RAILS_ROOT, 'config')
2
2
  SimpleNavigation.config_file_path = default_config_file_path unless SimpleNavigation.config_file_path
3
- SimpleNavigation.load_config
4
3
  ActionController::Base.send(:include, SimpleNavigation::ControllerMethods)
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{simple-navigation}
5
- s.version = "1.3.1"
5
+ s.version = "1.4.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Andi Schacke"]
9
- s.date = %q{2009-06-28}
9
+ s.date = %q{2009-08-10}
10
10
  s.description = %q{Simple Navigation is a ruby library for creating a navigation (optionally with sub navigation) for your rails app.}
11
11
  s.email = %q{andreas.schacke@gmail.com}
12
12
  s.extra_rdoc_files = [
@@ -18,13 +18,21 @@ describe SimpleNavigation::Configuration do
18
18
  before(:each) do
19
19
  @context = mock(:context)
20
20
  @context.stub!(:instance_eval)
21
- @config_file = stub(:config_file)
22
- SimpleNavigation.stub!(:config_file).and_return(@config_file)
21
+ @config_files = {:default => 'default', :my_context => 'my_context'}
22
+ SimpleNavigation.stub!(:config_files).and_return(@config_files)
23
+ end
24
+ context "with default navigation context" do
25
+ it "should instance_eval the default config_file-string inside the context" do
26
+ @context.should_receive(:instance_eval).with('default')
27
+ SimpleNavigation::Configuration.eval_config(@context)
28
+ end
29
+ end
30
+ context 'with non default navigation context' do
31
+ it "should instance_eval the specified config_file-string inside the context" do
32
+ @context.should_receive(:instance_eval).with('my_context')
33
+ SimpleNavigation::Configuration.eval_config(@context, :my_context)
34
+ end
23
35
  end
24
- it "should instance_eval the config_file-string inside the context" do
25
- @context.should_receive(:instance_eval).with(@config_file)
26
- SimpleNavigation::Configuration.eval_config(@context)
27
- end
28
36
  it "should set the controller" do
29
37
  @controller = stub(:controller)
30
38
  SimpleNavigation::Configuration.should_receive(:extract_controller_from).with(@context).and_return(@controller)
@@ -15,50 +15,23 @@ describe SimpleNavigation::Helpers do
15
15
 
16
16
  describe 'render_navigation' do
17
17
  describe 'regarding loading of the config-file' do
18
- context "RAILS_ENV undefined" do
19
- before(:each) do
20
- ::RAILS_ENV = nil
21
- end
22
- it "should load the config file" do
23
- SimpleNavigation.should_receive(:load_config)
18
+ context 'no options specified' do
19
+ it "should load the config-file for the default context" do
20
+ SimpleNavigation.should_receive(:load_config).with(:default)
24
21
  @controller.render_navigation
25
22
  end
26
23
  end
27
- context "RAILS_ENV defined" do
28
- before(:each) do
29
- ::RAILS_ENV = 'production'
30
- end
31
- context "RAILS_ENV=production" do
32
- it "should not load the config file" do
33
- SimpleNavigation.should_not_receive(:load_config)
34
- @controller.render_navigation
35
- end
36
- end
37
-
38
- context "RAILS_ENV=development" do
39
- before(:each) do
40
- ::RAILS_ENV = 'development'
41
- end
42
- it "should load the config file" do
43
- SimpleNavigation.should_receive(:load_config)
44
- @controller.render_navigation
45
- end
46
- end
47
-
48
- context "RAILS_ENV=test" do
49
- before(:each) do
50
- ::RAILS_ENV = 'test'
51
- end
52
- it "should load the config file" do
53
- SimpleNavigation.should_receive(:load_config)
54
- @controller.render_navigation
55
- end
24
+
25
+ context 'with options specified' do
26
+ it "should load the config-file for the specified context" do
27
+ SimpleNavigation.should_receive(:load_config).with(:my_context)
28
+ @controller.render_navigation(:context => :my_context)
56
29
  end
57
30
  end
58
31
  end
59
32
 
60
33
  it "should eval the config on every request" do
61
- SimpleNavigation::Configuration.should_receive(:eval_config).with(@controller)
34
+ SimpleNavigation::Configuration.should_receive(:eval_config).with(@controller, :default)
62
35
  @controller.render_navigation
63
36
  end
64
37
 
@@ -70,6 +43,10 @@ describe SimpleNavigation::Helpers do
70
43
  @primary_navigation.should_receive(:render).with(:current_primary)
71
44
  @controller.render_navigation(:primary)
72
45
  end
46
+ it "should call render on the primary_navigation (specifying level through options)" do
47
+ @primary_navigation.should_receive(:render).with(:current_primary)
48
+ @controller.render_navigation(:level => :primary)
49
+ end
73
50
  end
74
51
 
75
52
  context 'secondary' do
@@ -125,20 +102,22 @@ describe SimpleNavigation::Helpers do
125
102
  end
126
103
 
127
104
  context 'unknown level' do
128
- it {lambda {@controller.render_navigation(:unknown)}.should raise_error(ArgumentError)}
105
+ it "should raise an error" do
106
+ lambda {@controller.render_navigation(:unknown)}.should raise_error(ArgumentError)
107
+ end
129
108
  end
130
109
  end
131
110
 
132
111
  describe 'render_primary_navigation' do
133
112
  it "should delegate to render_navigation(:primary)" do
134
- @controller.should_receive(:render_navigation).with(:primary)
113
+ @controller.should_receive(:render_navigation).with(:level => :primary)
135
114
  @controller.render_primary_navigation
136
115
  end
137
116
  end
138
117
 
139
118
  describe 'render_sub_navigation' do
140
119
  it "should delegate to render_navigation(:secondary)" do
141
- @controller.should_receive(:render_navigation).with(:secondary)
120
+ @controller.should_receive(:render_navigation).with(:level => :secondary)
142
121
  @controller.render_sub_navigation
143
122
  end
144
123
  end
@@ -2,10 +2,40 @@ require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  describe SimpleNavigation do
4
4
 
5
+ describe 'config_files' do
6
+ before(:each) do
7
+ SimpleNavigation.config_files = {}
8
+ end
9
+ it "should be an empty hash after loading the module" do
10
+ SimpleNavigation.config_files.should == {}
11
+ end
12
+ end
13
+
14
+ describe 'config_file_name' do
15
+ before(:each) do
16
+ SimpleNavigation.config_file_path = 'path_to_config'
17
+ end
18
+ context 'for :default navigation_context' do
19
+ it "should return the path to default config file" do
20
+ SimpleNavigation.config_file_name.should == 'path_to_config/navigation.rb'
21
+ end
22
+ end
23
+
24
+ context 'for other navigation_context' do
25
+ it "should return the path to the config file matching the specified context" do
26
+ SimpleNavigation.config_file_name(:my_other_context).should == 'path_to_config/my_other_context_navigation.rb'
27
+ end
28
+ it "should convert camelcase-contexts to underscore" do
29
+ SimpleNavigation.config_file_name(:WhyWouldYouDoThis).should == 'path_to_config/why_would_you_do_this_navigation.rb'
30
+ end
31
+ end
32
+ end
33
+
5
34
  describe 'load_config' do
6
35
  context 'config_file_path is set' do
7
36
  before(:each) do
8
37
  SimpleNavigation.config_file_path = 'path_to_config'
38
+ #SimpleNavigation.stub!(:config_file_name => 'path_to_config/navigation.rb')
9
39
  end
10
40
 
11
41
  context 'config_file does exist' do
@@ -16,13 +46,19 @@ describe SimpleNavigation do
16
46
  it "should not raise an error" do
17
47
  lambda{SimpleNavigation.load_config}.should_not raise_error
18
48
  end
19
- it "should read the config file from disc" do
20
- IO.should_receive(:read).with('path_to_config')
49
+ it "should read the specified config file from disc" do
50
+ IO.should_receive(:read).with('path_to_config/navigation.rb')
21
51
  SimpleNavigation.load_config
22
52
  end
23
- it "should store the read content in the module" do
24
- SimpleNavigation.should_receive(:config_file=).with('file_content')
53
+ it "should store the read content in the module (default context)" do
54
+ SimpleNavigation.should_receive(:config_file_name).with(:default).twice
25
55
  SimpleNavigation.load_config
56
+ SimpleNavigation.config_files[:default].should == 'file_content'
57
+ end
58
+ it "should store the content in the module (non default context)" do
59
+ SimpleNavigation.should_receive(:config_file_name).with(:my_context).twice
60
+ SimpleNavigation.load_config(:my_context)
61
+ SimpleNavigation.config_files[:my_context].should == 'file_content'
26
62
  end
27
63
  end
28
64
 
@@ -40,6 +76,61 @@ describe SimpleNavigation do
40
76
  end
41
77
  it {lambda{SimpleNavigation.load_config}.should raise_error}
42
78
  end
79
+
80
+ describe 'regarding caching of the config-files' do
81
+ before(:each) do
82
+ IO.stub!(:read).and_return('file_content')
83
+ SimpleNavigation.config_file_path = 'path_to_config'
84
+ File.stub!(:exists? => true)
85
+ end
86
+ context "RAILS_ENV undefined" do
87
+ before(:each) do
88
+ ::RAILS_ENV = nil
89
+ end
90
+ it "should load the config file twice" do
91
+ IO.should_receive(:read).twice
92
+ SimpleNavigation.load_config
93
+ SimpleNavigation.load_config
94
+ end
95
+ end
96
+ context "RAILS_ENV defined" do
97
+ before(:each) do
98
+ ::RAILS_ENV = 'production'
99
+ end
100
+ context "RAILS_ENV=production" do
101
+ it "should load the config file only once" do
102
+ IO.should_receive(:read).once
103
+ SimpleNavigation.load_config
104
+ SimpleNavigation.load_config
105
+ end
106
+ end
107
+
108
+ context "RAILS_ENV=development" do
109
+ before(:each) do
110
+ ::RAILS_ENV = 'development'
111
+ end
112
+ it "should load the config file twice" do
113
+ IO.should_receive(:read).twice
114
+ SimpleNavigation.load_config
115
+ SimpleNavigation.load_config
116
+ end
117
+ end
118
+
119
+ context "RAILS_ENV=test" do
120
+ before(:each) do
121
+ ::RAILS_ENV = 'test'
122
+ end
123
+ it "should load the config file twice" do
124
+ IO.should_receive(:read).twice
125
+ SimpleNavigation.load_config
126
+ SimpleNavigation.load_config
127
+ end
128
+ end
129
+ end
130
+ after(:each) do
131
+ SimpleNavigation.config_files = {}
132
+ end
133
+ end
43
134
  end
44
135
 
45
136
  describe 'config' do
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: 1.3.1
4
+ version: 1.4.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-06-28 00:00:00 +02:00
12
+ date: 2009-08-10 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies: []
15
15