simple-navigation 3.12.0 → 3.12.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.
Files changed (30) hide show
  1. data/CHANGELOG +4 -0
  2. data/generators/navigation_config/navigation_config_generator.rb +3 -3
  3. data/generators/navigation_config/templates/config/navigation.rb +9 -10
  4. data/init.rb +1 -1
  5. data/lib/generators/navigation_config/navigation_config_generator.rb +11 -6
  6. data/lib/simple-navigation.rb +1 -1
  7. data/lib/simple_navigation.rb +93 -65
  8. data/lib/simple_navigation/adapters/base.rb +16 -16
  9. data/lib/simple_navigation/adapters/nanoc.rb +7 -6
  10. data/lib/simple_navigation/adapters/padrino.rb +5 -7
  11. data/lib/simple_navigation/adapters/rails.rb +52 -39
  12. data/lib/simple_navigation/adapters/sinatra.rb +14 -17
  13. data/lib/simple_navigation/core/configuration.rb +73 -34
  14. data/lib/simple_navigation/core/item.rb +110 -54
  15. data/lib/simple_navigation/core/item_adapter.rb +18 -13
  16. data/lib/simple_navigation/core/item_container.rb +93 -66
  17. data/lib/simple_navigation/core/items_provider.rb +12 -10
  18. data/lib/simple_navigation/rails_controller_methods.rb +98 -78
  19. data/lib/simple_navigation/rendering/helpers.rb +130 -68
  20. data/lib/simple_navigation/rendering/renderer/base.rb +30 -25
  21. data/lib/simple_navigation/rendering/renderer/breadcrumbs.rb +26 -19
  22. data/lib/simple_navigation/rendering/renderer/json.rb +11 -13
  23. data/lib/simple_navigation/rendering/renderer/links.rb +18 -13
  24. data/lib/simple_navigation/rendering/renderer/list.rb +28 -15
  25. data/lib/simple_navigation/rendering/renderer/text.rb +7 -12
  26. data/lib/simple_navigation/version.rb +1 -1
  27. data/spec/lib/simple_navigation/core/item_adapter_spec.rb +1 -1
  28. data/spec/lib/simple_navigation/core/item_container_spec.rb +118 -68
  29. data/spec/lib/simple_navigation_spec.rb +16 -5
  30. metadata +2 -2
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ *3.12.1
2
+
3
+ * bugfix (error in generator)
4
+
1
5
  *3.12.0
2
6
 
3
7
  * Relax hash constraint on item_adapter. Thanks to Ramon Tayag.
@@ -1,8 +1,8 @@
1
1
  class NavigationConfigGenerator < Rails::Generator::Base
2
2
  def manifest
3
3
  record do |m|
4
- m.file "config/navigation.rb", "config/navigation.rb"
5
- m.readme "../../../README"
4
+ m.file 'config/navigation.rb', 'config/navigation.rb'
5
+ m.readme '../../../README.md'
6
6
  end
7
7
  end
8
- end
8
+ end
@@ -6,8 +6,8 @@ SimpleNavigation::Configuration.run do |navigation|
6
6
  # The renderer can also be specified as option in the render_navigation call.
7
7
  # navigation.renderer = Your::Custom::Renderer
8
8
 
9
- # Specify the class that will be applied to active navigation items. Defaults to 'selected'
10
- # navigation.selected_class = 'your_selected_class'
9
+ # Specify the class that will be applied to active navigation items.
10
+ # Defaults to 'selected' navigation.selected_class = 'your_selected_class'
11
11
 
12
12
  # Specify the class that will be applied to the current leaf of
13
13
  # active navigation items. Defaults to 'simple-navigation-active-leaf'
@@ -22,7 +22,8 @@ SimpleNavigation::Configuration.run do |navigation|
22
22
  # The example below would add a prefix to each key.
23
23
  # navigation.id_generator = Proc.new {|key| "my-prefix-#{key}"}
24
24
 
25
- # If you need to add custom html around item names, you can define a proc that will be called with the name you pass in to the navigation.
25
+ # If you need to add custom html around item names, you can define a proc that
26
+ # will be called with the name you pass in to the navigation.
26
27
  # The example below shows how to wrap items spans.
27
28
  # navigation.name_generator = Proc.new {|name, item| "<span>#{name}</span>"}
28
29
 
@@ -42,15 +43,15 @@ SimpleNavigation::Configuration.run do |navigation|
42
43
  # options - can be used to specify attributes that will be included in the rendered navigation item (e.g. id, class etc.)
43
44
  # some special options that can be set:
44
45
  # :if - Specifies a proc to call to determine if the item should
45
- # be rendered (e.g. <tt>:if => Proc.new { current_user.admin? }</tt>). The
46
+ # be rendered (e.g. <tt>if: -> { current_user.admin? }</tt>). The
46
47
  # proc should evaluate to a true or false value and is evaluated in the context of the view.
47
48
  # :unless - Specifies a proc to call to determine if the item should not
48
- # be rendered (e.g. <tt>:unless => Proc.new { current_user.admin? }</tt>). The
49
+ # be rendered (e.g. <tt>unless: -> { current_user.admin? }</tt>). The
49
50
  # proc should evaluate to a true or false value and is evaluated in the context of the view.
50
51
  # :method - Specifies the http-method for the generated link - default is :get.
51
52
  # :highlights_on - if autohighlighting is turned off and/or you want to explicitly specify
52
53
  # when the item should be highlighted, you can set a regexp which is matched
53
- # against the current URI. You may also use a proc, or the symbol <tt>:subpath</tt>.
54
+ # against the current URI. You may also use a proc, or the symbol <tt>:subpath</tt>.
54
55
  #
55
56
  primary.item :key_1, 'name', url, options
56
57
 
@@ -63,8 +64,8 @@ SimpleNavigation::Configuration.run do |navigation|
63
64
  # You can also specify a condition-proc that needs to be fullfilled to display an item.
64
65
  # Conditions are part of the options. They are evaluated in the context of the views,
65
66
  # thus you can use all the methods and vars you have available in the views.
66
- primary.item :key_3, 'Admin', url, :class => 'special', :if => Proc.new { current_user.admin? }
67
- primary.item :key_4, 'Account', url, :unless => Proc.new { logged_in? }
67
+ primary.item :key_3, 'Admin', url, class: 'special', if: -> { current_user.admin? }
68
+ primary.item :key_4, 'Account', url, unless: -> { logged_in? }
68
69
 
69
70
  # you can also specify html attributes to attach to this particular level
70
71
  # works for all levels of the menu
@@ -72,7 +73,5 @@ SimpleNavigation::Configuration.run do |navigation|
72
73
 
73
74
  # You can turn off auto highlighting for a specific level
74
75
  # primary.auto_highlight = false
75
-
76
76
  end
77
-
78
77
  end
data/init.rb CHANGED
@@ -1 +1 @@
1
- require File.dirname(__FILE__) + "/rails/init"
1
+ require File.dirname(__FILE__) + '/rails/init'
@@ -1,12 +1,17 @@
1
1
  class NavigationConfigGenerator < Rails::Generators::Base
2
2
  def self.source_root
3
- @source_root ||= File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','generators','navigation_config', 'templates'))
3
+ @source_root ||= begin
4
+ tpl_dir = %w[.. .. .. .. generators navigation_config templates]
5
+ tpl_dir_path = File.join(tpl_dir)
6
+ File.expand_path(tpl_dir_path, __FILE__)
7
+ end
4
8
  end
5
9
 
6
- desc 'Creates a template config file for the simple-navigation plugin. You will find the generated file in config/navigation.rb.'
10
+ desc 'Creates a template config file for the simple-navigation plugin. ' \
11
+ 'You will find the generated file in config/navigation.rb.'
7
12
  def navigation_config
8
- copy_file('config/navigation.rb', 'config/navigation.rb')
9
- say File.read(File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','README')))
13
+ copy_file('config/navigation.rb', 'config/navigation.rb')
14
+ readme_path = File.join(%w[.. .. .. .. README.md])
15
+ say File.read(File.expand_path(readme_path, __FILE__))
10
16
  end
11
-
12
- end
17
+ end
@@ -1 +1 @@
1
- require 'simple_navigation'
1
+ require 'simple_navigation'
@@ -10,37 +10,52 @@ require 'simple_navigation/adapters'
10
10
 
11
11
  require 'forwardable'
12
12
 
13
- # A plugin for generating a simple navigation. See README for resources on usage instructions.
13
+ # A plugin for generating a simple navigation. See README for resources on
14
+ # usage instructions.
14
15
  module SimpleNavigation
15
-
16
- mattr_accessor :adapter_class, :adapter, :config_files, :config_file_paths, :default_renderer, :registered_renderers, :root, :environment
16
+ mattr_accessor :adapter,
17
+ :adapter_class,
18
+ :config_files,
19
+ :config_file_paths,
20
+ :default_renderer,
21
+ :environment,
22
+ :registered_renderers,
23
+ :root
17
24
 
18
25
  # Cache for loaded config files
19
26
  self.config_files = {}
20
27
 
21
- # Allows for multiple config_file_paths. Needed if a plugin itself uses simple-navigation and therefore has its own config file
28
+ # Allows for multiple config_file_paths. Needed if a plugin itself uses
29
+ # simple-navigation and therefore has its own config file
22
30
  self.config_file_paths = []
23
-
24
- # Maps renderer keys to classes. The keys serve as shortcut in the render_navigation calls (:renderer => :list)
31
+
32
+ # Maps renderer keys to classes. The keys serve as shortcut in the
33
+ # render_navigation calls (renderer: :list)
25
34
  self.registered_renderers = {
26
- :list => SimpleNavigation::Renderer::List,
27
- :links => SimpleNavigation::Renderer::Links,
28
- :breadcrumbs => SimpleNavigation::Renderer::Breadcrumbs,
29
- :text => SimpleNavigation::Renderer::Text,
30
- :json => SimpleNavigation::Renderer::Json
35
+ list: SimpleNavigation::Renderer::List,
36
+ links: SimpleNavigation::Renderer::Links,
37
+ breadcrumbs: SimpleNavigation::Renderer::Breadcrumbs,
38
+ text: SimpleNavigation::Renderer::Text,
39
+ json: SimpleNavigation::Renderer::Json
31
40
  }
32
-
41
+
33
42
  class << self
34
43
  extend Forwardable
35
-
36
- def_delegators :adapter, :request, :request_uri, :request_path, :context_for_eval, :current_page?
44
+
45
+ def_delegators :adapter, :context_for_eval,
46
+ :current_page?,
47
+ :request,
48
+ :request_path,
49
+ :request_uri
50
+
37
51
  def_delegators :adapter_class, :register
38
52
 
39
- # Sets the root path and current environment as specified. Also sets the default config_file_path.
53
+ # Sets the root path and current environment as specified. Also sets the
54
+ # default config_file_path.
40
55
  def set_env(root, environment)
41
56
  self.root = root
42
57
  self.environment = environment
43
- self.config_file_paths << SimpleNavigation.default_config_file_path
58
+ config_file_paths << SimpleNavigation.default_config_file_path
44
59
  end
45
60
 
46
61
  # Returns the current framework in which the plugin is running.
@@ -49,30 +64,29 @@ module SimpleNavigation
49
64
  return :padrino if defined?(Padrino)
50
65
  return :sinatra if defined?(Sinatra)
51
66
  return :nanoc if defined?(Nanoc3)
52
- raise 'simple_navigation currently only works for Rails, Sinatra and Padrino apps'
67
+ fail 'simple_navigation currently only works for Rails, Sinatra and ' \
68
+ 'Padrino apps'
53
69
  end
54
-
70
+
55
71
  # Loads the adapter for the current framework
56
72
  def load_adapter
57
- self.adapter_class = case framework
58
- when :rails
59
- SimpleNavigation::Adapters::Rails
60
- when :sinatra
61
- SimpleNavigation::Adapters::Sinatra
62
- when :padrino
63
- SimpleNavigation::Adapters::Padrino
64
- when :nanoc
65
- SimpleNavigation::Adapters::Nanoc
66
- end
73
+ self.adapter_class =
74
+ case framework
75
+ when :rails then SimpleNavigation::Adapters::Rails
76
+ when :sinatra then SimpleNavigation::Adapters::Sinatra
77
+ when :padrino then SimpleNavigation::Adapters::Padrino
78
+ when :nanoc then SimpleNavigation::Adapters::Nanoc
79
+ end
67
80
  end
68
81
 
69
- # Creates a new adapter instance based on the context in which render_navigation has been called.
82
+ # Creates a new adapter instance based on the context in which
83
+ # render_navigation has been called.
70
84
  def init_adapter_from(context)
71
- self.adapter = self.adapter_class.new(context)
85
+ self.adapter = adapter_class.new(context)
72
86
  end
73
-
87
+
74
88
  def default_config_file_path
75
- File.join(SimpleNavigation.root, 'config')
89
+ File.join(root, 'config')
76
90
  end
77
91
 
78
92
  # Returns true if the config_file for specified context does exist.
@@ -80,30 +94,47 @@ module SimpleNavigation
80
94
  !!config_file(navigation_context)
81
95
  end
82
96
 
83
- # Returns the path to the config file for the given navigation context or nil if no matching config file can be found.
97
+ # Returns the path to the config file for the given navigation context or
98
+ # nil if no matching config file can be found.
84
99
  # If multiple config_paths are set, it returns the first matching path.
85
100
  def config_file(navigation_context = :default)
86
- config_file_paths.collect { |path| File.join(path, config_file_name(navigation_context)) }.detect {|full_path| File.exists?(full_path)}
101
+ config_file_paths
102
+ .map { |path| File.join(path, config_file_name(navigation_context)) }
103
+ .find { |full_path| File.exist?(full_path) }
87
104
  end
88
105
 
89
106
  # Returns the name of the config file for the given navigation_context
90
107
  def config_file_name(navigation_context = :default)
91
- prefix = navigation_context == :default ? '' : "#{navigation_context.to_s.underscore}_"
92
- "#{prefix}navigation.rb"
108
+ prefix = if navigation_context == :default
109
+ ''
110
+ else
111
+ "#{navigation_context.to_s.underscore}_"
112
+ end
113
+ "#{prefix}navigation.rb"
93
114
  end
94
-
115
+
95
116
  # Resets the list of config_file_paths to the specified path
96
117
  def config_file_path=(path)
97
118
  self.config_file_paths = [path]
98
119
  end
99
120
 
100
- # Reads the config_file for the specified navigation_context and stores it for later evaluation.
121
+ # Reads the config_file for the specified navigation_context and stores it
122
+ # for later evaluation.
101
123
  def load_config(navigation_context = :default)
102
- raise "Config file '#{config_file_name(navigation_context)}' not found in path(s) #{config_file_paths.join(', ')}!" unless config_file?(navigation_context)
103
- if self.environment == 'production'
104
- self.config_files[navigation_context] ||= IO.read(config_file(navigation_context))
124
+ unless config_file?(navigation_context)
125
+ fail "Config file '#{config_file_name(navigation_context)}' not " \
126
+ "found in path(s) #{config_file_paths.join(', ')}!"
127
+ end
128
+
129
+ # FIXME: what about update_config and update_config! methods ?
130
+ if environment == 'production'
131
+ config_files[navigation_context] ||= begin
132
+ IO.read(config_file(navigation_context))
133
+ end
105
134
  else
106
- self.config_files[navigation_context] = IO.read(config_file(navigation_context))
135
+ config_files[navigation_context] = begin
136
+ IO.read(config_file(navigation_context))
137
+ end
107
138
  end
108
139
  end
109
140
 
@@ -112,57 +143,54 @@ module SimpleNavigation
112
143
  SimpleNavigation::Configuration.instance
113
144
  end
114
145
 
115
- # Returns the ItemContainer that contains the items for the primary navigation
146
+ # Returns the ItemContainer that contains the items for the
147
+ # primary navigation
116
148
  def primary_navigation
117
149
  config.primary_navigation
118
150
  end
119
151
 
120
- # Returns the active item container for the specified level. Valid levels are
152
+ # Returns the active item container for the specified level.
153
+ # Valid levels are
121
154
  # * :all - in this case the primary_navigation is returned.
122
155
  # * :leaves - the 'deepest' active item_container will be returned
123
- # * a specific level - the active item_container for the specified level will be returned
124
- # * a range of levels - the active item_container for the range's minimum will be returned
156
+ # * a specific level - the active item_container for the specified level
157
+ # will be returned
158
+ # * a range of levels - the active item_container for the range's minimum
159
+ # will be returned
125
160
  #
126
161
  # Returns nil if there is no active item_container for the specified level.
127
162
  def active_item_container_for(level)
128
163
  case level
129
- when :all
130
- self.primary_navigation
131
- when :leaves
132
- self.primary_navigation.active_leaf_container
133
- when Integer
134
- self.primary_navigation.active_item_container_for(level)
135
- when Range
136
- self.primary_navigation.active_item_container_for(level.min)
164
+ when :all then primary_navigation
165
+ when :leaves then primary_navigation.active_leaf_container
166
+ when Integer then primary_navigation.active_item_container_for(level)
167
+ when Range then primary_navigation.active_item_container_for(level.min)
137
168
  else
138
- raise ArgumentError, "Invalid navigation level: #{level}"
169
+ fail ArgumentError, "Invalid navigation level: #{level}"
139
170
  end
140
171
  end
141
-
172
+
142
173
  # Registers a renderer.
143
174
  #
144
175
  # === Example
145
176
  # To register your own renderer:
146
177
  #
147
- # SimpleNavigation.register_renderer :my_renderer => My::RendererClass
178
+ # SimpleNavigation.register_renderer my_renderer: My::RendererClass
148
179
  #
149
180
  # Then in the view you can call:
150
181
  #
151
- # render_navigation(:renderer => :my_renderer)
182
+ # render_navigation(renderer: :my_renderer)
152
183
  def register_renderer(renderer_hash)
153
- self.registered_renderers.merge!(renderer_hash)
184
+ registered_renderers.merge!(renderer_hash)
154
185
  end
155
-
186
+
156
187
  private
157
-
188
+
158
189
  def apply_defaults(options)
159
190
  options[:level] = options.delete(:levels) if options[:levels]
160
- {:context => :default, :level => :all}.merge(options)
191
+ { context: :default, level: :all }.merge(options)
161
192
  end
162
-
163
-
164
193
  end
165
-
166
194
  end
167
195
 
168
196
  SimpleNavigation.load_adapter
@@ -1,37 +1,37 @@
1
1
  module SimpleNavigation
2
2
  module Adapters
3
-
4
- # This is the base class for all adapters. This class mainly exists for documenting reasons.
3
+ # This is the base class for all adapters.
4
+ # This class mainly exists for documenting reasons.
5
5
  # It lists all the methods that an adapter should implement.
6
6
  #
7
7
  class Base
8
8
  attr_reader :context, :request
9
-
10
- # This method is usually called when the framework is initialized.
11
- # It should call SimpleNavigation.set_env and install SimpleNavigation::Helpers where appropriate.
9
+
10
+ # This method is usually called when the framework is initialized.
11
+ # It should call SimpleNavigation.set_env and install
12
+ # SimpleNavigation::Helpers where appropriate.
12
13
  def self.register; end
13
-
14
+
14
15
  # Returns the full path incl. query params
15
16
  def request_uri; end
16
-
17
+
17
18
  # Returns the path without query params
18
19
  def request_path; end
19
-
20
+
20
21
  # Returns the context in which the config files will be evaluated
21
22
  def context_for_eval; end
22
-
23
- # Returns true if the current request's url matches the specified url.
23
+
24
+ # Returns true if the current request's url matches the specified url.
24
25
  # Used to determine if an item should be autohighlighted.
25
26
  def current_page?(url); end
26
-
27
+
27
28
  # Returns a link with the specified name, url and options.
28
29
  # Used for rendering.
29
- def link_to(name, url, options={}); end
30
-
30
+ def link_to(name, url, options = {}); end
31
+
31
32
  # Returns a tag of the specified type, content and options.
32
33
  # Used for rendering.
33
- def content_tag(type, content, options={}); end
34
-
34
+ def content_tag(type, content, options = {}); end
35
35
  end
36
36
  end
37
- end
37
+ end
@@ -16,29 +16,30 @@ module SimpleNavigation
16
16
  def context_for_eval
17
17
  context
18
18
  end
19
-
20
- # Returns true if the current request's url matches the specified url.
19
+
20
+ # Returns true if the current request's url matches the specified url.
21
21
  # Used to determine if an item should be autohighlighted.
22
22
  def current_page?(url)
23
23
  path = context.item.path
24
24
  path && path.chop == url
25
25
  end
26
-
26
+
27
27
  # Returns a link with the specified name, url and options.
28
28
  # Used for rendering.
29
- def link_to(name, url, options={})
29
+ def link_to(name, url, options = {})
30
30
  "<a href='#{url}' #{to_attributes(options)}>#{name}</a>"
31
31
  end
32
32
 
33
33
  # Returns a tag of the specified type, content and options.
34
34
  # Used for rendering.
35
- def content_tag(type, content, options={})
35
+ def content_tag(type, content, options = {})
36
36
  "<#{type} #{to_attributes(options)}>#{content}</#{type}>"
37
37
  end
38
38
 
39
39
  private
40
+
40
41
  def to_attributes(options)
41
- options.map {|k, v| v.nil? ? nil : "#{k}='#{v}'"}.compact.join(' ')
42
+ options.map { |k, v| v.nil? ? nil : "#{k}='#{v}'" }.compact.join(' ')
42
43
  end
43
44
  end
44
45
  end