semantic_navigation 0.1.1 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data/.editorconfig +14 -0
  2. data/.gitignore +2 -0
  3. data/.travis.yml +10 -2
  4. data/Appraisals +7 -0
  5. data/Gemfile +1 -1
  6. data/MIT-LICENSE +20 -0
  7. data/README.md +31 -20
  8. data/Rakefile +2 -1
  9. data/TODO +14 -0
  10. data/gemfiles/3.2.gemfile +7 -0
  11. data/gemfiles/3.2.gemfile.lock +112 -0
  12. data/gemfiles/4.0.gemfile +7 -0
  13. data/gemfiles/4.0.gemfile.lock +107 -0
  14. data/lib/generators/semantic_navigation/breadcrumb_renderer/templates/breadcrumb_renderer.rb +5 -5
  15. data/lib/generators/semantic_navigation/list_renderer/list_renderer_generator.rb +0 -1
  16. data/lib/generators/semantic_navigation/list_renderer/templates/list_renderer.rb +4 -4
  17. data/lib/semantic_navigation.rb +30 -0
  18. data/lib/semantic_navigation/configuration.rb +8 -9
  19. data/lib/semantic_navigation/core.rb +8 -6
  20. data/lib/semantic_navigation/core/leaf.rb +2 -2
  21. data/lib/semantic_navigation/core/mix_in/name_methods.rb +24 -0
  22. data/lib/semantic_navigation/core/mix_in/url_methods.rb +25 -0
  23. data/lib/semantic_navigation/core/navigation.rb +8 -2
  24. data/lib/semantic_navigation/core/node.rb +2 -2
  25. data/lib/semantic_navigation/deprecations/renderers/acts_as_breadcrumb.rb +14 -0
  26. data/lib/semantic_navigation/deprecations/renderers/acts_as_list.rb +12 -0
  27. data/lib/semantic_navigation/deprecations/renderers/render_helpers.rb +14 -0
  28. data/lib/semantic_navigation/helper_methods.rb +8 -4
  29. data/lib/semantic_navigation/railtie.rb +9 -19
  30. data/lib/semantic_navigation/renderers.rb +15 -8
  31. data/lib/semantic_navigation/renderers/bread_crumb.rb +6 -6
  32. data/lib/semantic_navigation/renderers/list.rb +6 -6
  33. data/lib/semantic_navigation/renderers/mix_in/acts_as_breadcrumb.rb +43 -0
  34. data/lib/semantic_navigation/renderers/mix_in/acts_as_list.rb +49 -0
  35. data/lib/semantic_navigation/renderers/mix_in/render_helpers.rb +110 -0
  36. data/lib/semantic_navigation/twitter_bootstrap/breadcrumb.rb +5 -5
  37. data/lib/semantic_navigation/twitter_bootstrap/list.rb +2 -2
  38. data/lib/semantic_navigation/twitter_bootstrap/tabs.rb +2 -2
  39. data/lib/semantic_navigation/version.rb +1 -1
  40. data/semantic_navigation.gemspec +3 -2
  41. data/spec/lib/semantic_navigation/configuration_spec.rb +29 -24
  42. data/spec/lib/semantic_navigation/core/leaf_spec.rb +121 -114
  43. data/spec/lib/semantic_navigation/core/navigation_spec.rb +81 -76
  44. data/spec/lib/semantic_navigation/core/node_spec.rb +52 -49
  45. data/spec/lib/semantic_navigation/helper_methods_spec.rb +47 -42
  46. data/spec/lib/semantic_navigation/renderers/bread_crumb_spec.rb +191 -187
  47. data/spec/lib/semantic_navigation/renderers/deprecations_spec.rb +67 -0
  48. data/spec/lib/semantic_navigation/renderers/list_spec.rb +260 -258
  49. data/spec/lib/semantic_navigation/twitter_bootstrap/breadcrumb_spec.rb +163 -159
  50. data/spec/lib/semantic_navigation/twitter_bootstrap/list_spec.rb +263 -262
  51. data/spec/lib/semantic_navigation/twitter_bootstrap/tabs_spec.rb +269 -266
  52. data/spec/spec_helper.rb +6 -0
  53. metadata +41 -13
  54. data/gemfiles/rails3 +0 -7
  55. data/lib/semantic_navigation/core/name_methods.rb +0 -24
  56. data/lib/semantic_navigation/core/url_methods.rb +0 -24
  57. data/lib/semantic_navigation/renderers/acts_as_breadcrumb.rb +0 -42
  58. data/lib/semantic_navigation/renderers/acts_as_list.rb +0 -48
  59. data/lib/semantic_navigation/renderers/render_helpers.rb +0 -109
@@ -13,7 +13,6 @@ module SemanticNavigation
13
13
  register_string = " register_renderer :#{file_name}, Renderers::#{class_name}\n"
14
14
  inject_into_file semantic_navigation_config, register_string, :after => "SemanticNavigation::Configuration.run do\n"
15
15
  end
16
-
17
16
  end
18
17
  end
19
18
  end
@@ -1,8 +1,8 @@
1
1
  class Renderers::<%= class_name %>
2
2
  #Default render helpers. Do not delete this if don't want to write your own.
3
- include SemanticNavigation::Renderers::RenderHelpers
3
+ include SemanticNavigation::Renderers::MixIn::RenderHelpers
4
4
  #The default list rendering logic. Do not delete if don't want to write your own.
5
- include SemanticNavigation::Renderers::ActsAsList
5
+ include SemanticNavigation::Renderers::MixIn::ActsAsList
6
6
 
7
7
  #Default navigation classes
8
8
  navigation_active_class [:active]
@@ -53,7 +53,7 @@ class Renderers::<%= class_name %>
53
53
  end
54
54
  end
55
55
 
56
- #Navigation leaf block
56
+ #Navigation leaf block
57
57
  def leaf(object)
58
58
  content_tag :li, nil, :id => show_id(:leaf, object.id),
59
59
  :class => merge_classes(:leaf, object.active, object.classes) do
@@ -61,4 +61,4 @@ class Renderers::<%= class_name %>
61
61
  :class => merge_classes(:link, object.active, object.link_classes)
62
62
  end
63
63
  end
64
- end
64
+ end
@@ -4,3 +4,33 @@ require 'semantic_navigation/renderers'
4
4
  require "semantic_navigation/configuration"
5
5
  require 'semantic_navigation/railtie' if defined?(Rails)
6
6
 
7
+ module SemanticNavigation
8
+ def self.deprecation_message(type, deprecated_object, new_object, action = nil)
9
+ if SemanticNavigation::Configuration.display_deprecation_messages
10
+ message = ["DEPRECATION WARNING:",
11
+ "You are using deprecated #{type} `#{deprecated_object}`"]
12
+ if action
13
+ message[-1] += " for #{action}."
14
+ else
15
+ message[-1] += '.'
16
+ end
17
+ message += ["That #{type} will be depreacted soon.",
18
+ "Please use `#{new_object}` instead."]
19
+ puts message.join("\n")
20
+ end
21
+ end
22
+
23
+ def self.actual_config_location
24
+ locations = ["#{Rails.root}/config/initializers/semantic_navigation.rb",
25
+ "#{Rails.root}/config/semantic_navigation.rb"]
26
+ actual_location = locations.find{|l| File.exists?(l)}
27
+ raise ["Please create a semantic_navigation configuration",
28
+ "(rails g semantic_navigation:install)",
29
+ "file before starting the project!"].join(" ") unless actual_location
30
+ puts "DEPRECATION WARNING: Please move the configuration file from #{locations.second}
31
+ to #{locations.first}! Current configuration file path will be deprecated soon!" if locations.find_index(actual_location) == 1
32
+ actual_location
33
+ end
34
+
35
+ end
36
+
@@ -1,11 +1,18 @@
1
1
  module SemanticNavigation
2
2
  class Configuration
3
3
 
4
- @@view_object = nil
5
4
  @@navigations = {}
6
5
  @@renderers = {}
7
6
  @@render_styles = {}
8
7
 
8
+ cattr_accessor :view_object do
9
+ nil
10
+ end
11
+
12
+ cattr_accessor :display_deprecation_messages do
13
+ true
14
+ end
15
+
9
16
  def self.run(&block)
10
17
  self.class_eval &block if block_given?
11
18
  end
@@ -52,14 +59,6 @@ module SemanticNavigation
52
59
  "
53
60
  end
54
61
 
55
- def self.view_object
56
- @@view_object
57
- end
58
-
59
- def self.view_object=(view_object)
60
- @@view_object = view_object
61
- end
62
-
63
62
  def self.navigation(name)
64
63
  @@navigations[name]
65
64
  end
@@ -1,8 +1,10 @@
1
- required_files = %w(base
2
- url_methods
3
- name_methods
4
- navigation
5
- leaf node)
6
- required_files.each do |file|
1
+ %w(
2
+ base
3
+ mix_in/url_methods
4
+ mix_in/name_methods
5
+ navigation
6
+ leaf
7
+ node
8
+ ).each do |file|
7
9
  require "semantic_navigation/core/#{file}"
8
10
  end
@@ -1,8 +1,8 @@
1
1
  module SemanticNavigation
2
2
  module Core
3
3
  class Leaf < Base
4
- include UrlMethods
5
- include NameMethods
4
+ include MixIn::UrlMethods
5
+ include MixIn::NameMethods
6
6
 
7
7
  attr_accessor :link_classes, :link_html
8
8
 
@@ -0,0 +1,24 @@
1
+ module SemanticNavigation
2
+ module Core
3
+ module MixIn
4
+ module NameMethods
5
+ def name(renderer_name = nil)
6
+ rendering_name = @name
7
+ rendering_name = rendering_name[renderer_name.to_sym] || rendering_name[:default] if rendering_name.is_a?(Hash)
8
+ rendering_name = view_object.instance_eval(&rendering_name).to_s if rendering_name.is_a?(Proc)
9
+ rendering_name || i18n_name(renderer_name)
10
+ end
11
+
12
+ private
13
+
14
+ def i18n_name(renderer_name = nil)
15
+ name = I18n.t("#{@i18n_name}.#{@id}", :default => '')
16
+ if name.is_a? Hash
17
+ name = name[renderer_name.to_sym] || name[:default]
18
+ end
19
+ name || ''
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,25 @@
1
+ module SemanticNavigation
2
+ module Core
3
+ module MixIn
4
+ module UrlMethods
5
+
6
+ def url
7
+ urls.first
8
+ end
9
+
10
+ private
11
+
12
+ def urls
13
+ [@url].flatten(1).map do |url|
14
+ if url.is_a?(Proc)
15
+ view_object.instance_eval(&url) rescue ''
16
+ else
17
+ url
18
+ end
19
+ end
20
+ end
21
+
22
+ end
23
+ end
24
+ end
25
+ end
@@ -29,9 +29,15 @@ module SemanticNavigation
29
29
  #Deprecation warning message
30
30
  #TODO:Should be deleted after moving the header and divider definition via item
31
31
  if element.url.nil? && !element.name.empty?
32
- puts 'Warning: do not define `headers` using `item` method. Use `header` instead. This logic will be deprecated soon.'
32
+ SemanticNavigation.deprecation_message(:method,
33
+ 'item',
34
+ 'header',
35
+ 'header definition')
33
36
  elsif element.url.nil? && element.name.empty?
34
- puts 'Warning: do not define `dividers` using `item` method. Use `divider` instead. This logic will be deprecated soon.'
37
+ SemanticNavigation.deprecation_message(:method,
38
+ 'item',
39
+ 'header',
40
+ 'divider definition')
35
41
  end
36
42
  end
37
43
 
@@ -1,8 +1,8 @@
1
1
  module SemanticNavigation
2
2
  module Core
3
3
  class Node < Navigation
4
- include UrlMethods
5
- include NameMethods
4
+ include MixIn::UrlMethods
5
+ include MixIn::NameMethods
6
6
 
7
7
  attr_accessor :link_classes, :node_classes,
8
8
  :link_html, :node_html
@@ -0,0 +1,14 @@
1
+ module SemanticNavigation
2
+ module Renderers
3
+ module ActsAsBreadcrumb
4
+
5
+ def self.included(base)
6
+ SemanticNavigation.deprecation_message(:module,
7
+ "SemanticNavigation::Renderers::ActsAsBreadcrumb",
8
+ "SemanticNavigation::Renderers::MixIn::ActsAsBreadcrumb")
9
+ base.send :include, SemanticNavigation::Renderers::MixIn::ActsAsBreadcrumb
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ module SemanticNavigation
2
+ module Renderers
3
+ module ActsAsList
4
+ def self.included(base)
5
+ SemanticNavigation.deprecation_message(:module,
6
+ "SemanticNavigation::Renderers::ActsAsList",
7
+ "SemanticNavigation::Renderers::MixIn::ActsAsList")
8
+ base.send :include, SemanticNavigation::Renderers::MixIn::ActsAsList
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ module SemanticNavigation
2
+ module Renderers
3
+ module RenderHelpers
4
+
5
+ def self.included(base)
6
+ SemanticNavigation.deprecation_message(:module,
7
+ "SemanticNavigation::Renderers::RenderHelpers",
8
+ "SemanticNavigation::Renderers::MixIn::RenderHelpers")
9
+ base.send :include, SemanticNavigation::Renderers::MixIn::RenderHelpers
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -5,17 +5,21 @@ module SemanticNavigation::HelperMethods
5
5
  render_name ||= :list
6
6
  SemanticNavigation::Configuration.new.render(name, render_name, options, self)
7
7
  end
8
-
9
- def active_item_for(name, level = nil)
8
+
9
+ def active_item_for(name, level = nil, &block)
10
10
  SemanticNavigation::Configuration.view_object = self
11
11
  navigation = SemanticNavigation::Configuration.navigation(name)
12
12
  navigation.mark_active
13
13
  item = navigation
14
14
  while !item.is_a?(SemanticNavigation::Core::Leaf) &&
15
- !item.sub_elements.find{|e| e.active}.nil? &&
15
+ !item.sub_elements.find{|e| e.active}.nil? &&
16
16
  (!level.nil? ? item.level < level : true)
17
17
  item = item.sub_elements.find{|e| e.active}
18
18
  end
19
- item != navigation ? item.name(:active_item_for) : ''
19
+ if !block_given?
20
+ item != navigation ? item.name(:active_item_for) : ''
21
+ else
22
+ capture(item, &block)
23
+ end
20
24
  end
21
25
  end
@@ -25,25 +25,15 @@ module SemanticNavigation
25
25
  end
26
26
  end
27
27
 
28
- def self.actual_config_location
29
- locations = ["#{Rails.root}/config/initializers/semantic_navigation.rb",
30
- "#{Rails.root}/config/semantic_navigation.rb"]
31
- actual_location = locations.find{|l| File.exists?(l)}
32
- throw "Please create a semantic_navigation configuration file before starting the project!" unless actual_location
33
- puts "DEPRECATION WARNING: Please move the configuration file from #{locations.second}
34
- to #{locations.first}! Current configuration file path will be deprecated soon!" if locations.find_index(actual_location) == 1
35
- actual_location
36
- end
37
-
38
- if Rails.env == "production"
39
- config.after_initialize {
40
- load SemanticNavigation::Railtie.actual_config_location
41
- }
42
- else
43
- ActionDispatch::Callbacks.before {
44
- load SemanticNavigation::Railtie.actual_config_location
45
- }
46
- end
28
+ if Rails.env == "production"
29
+ config.after_initialize {
30
+ load SemanticNavigation.actual_config_location
31
+ }
32
+ else
33
+ ActionDispatch::Callbacks.before {
34
+ load SemanticNavigation.actual_config_location
35
+ }
36
+ end
47
37
 
48
38
  end
49
39
  end
@@ -1,8 +1,15 @@
1
- require 'semantic_navigation/renderers/render_helpers'
2
- require 'semantic_navigation/renderers/acts_as_list'
3
- require 'semantic_navigation/renderers/acts_as_breadcrumb'
4
- require 'semantic_navigation/renderers/list'
5
- require 'semantic_navigation/renderers/bread_crumb'
6
- require 'semantic_navigation/twitter_bootstrap/breadcrumb'
7
- require 'semantic_navigation/twitter_bootstrap/list'
8
- require 'semantic_navigation/twitter_bootstrap/tabs'
1
+ %w(
2
+ renderers/mix_in/render_helpers
3
+ renderers/mix_in/acts_as_list
4
+ renderers/mix_in/acts_as_breadcrumb
5
+ deprecations/renderers/render_helpers
6
+ deprecations/renderers/acts_as_breadcrumb
7
+ deprecations/renderers/acts_as_list
8
+ renderers/list
9
+ renderers/bread_crumb
10
+ twitter_bootstrap/breadcrumb
11
+ twitter_bootstrap/list
12
+ twitter_bootstrap/tabs
13
+ ).each do |file|
14
+ require "semantic_navigation/#{file}"
15
+ end
@@ -1,8 +1,8 @@
1
1
  module SemanticNavigation
2
2
  module Renderers
3
3
  class BreadCrumb
4
- include RenderHelpers
5
- include ActsAsBreadcrumb
4
+ include MixIn::RenderHelpers
5
+ include MixIn::ActsAsBreadcrumb
6
6
 
7
7
  style_accessor last_as_link: false,
8
8
  breadcrumb_separator: '/'
@@ -27,8 +27,8 @@ module SemanticNavigation
27
27
  content_tag(:li, nil, {id: show_id(:leaf, object.id),
28
28
  class: merge_classes(:leaf, object.active, object.classes)
29
29
  }.merge(object.html)) do
30
- link_to(object_name(object),
31
- object.url,
30
+ link_to(object_name(object),
31
+ object.url,
32
32
  {id: show_id(:link, object.id),
33
33
  class: merge_classes(:link, object.active, object.link_classes)
34
34
  }.merge(object.link_html))
@@ -44,8 +44,8 @@ module SemanticNavigation
44
44
  class: merge_classes(:leaf, object.active, object.classes)
45
45
  }.merge(object.html) do
46
46
  if last_as_link
47
- link_to object_name(object),
48
- object.url,
47
+ link_to object_name(object),
48
+ object.url,
49
49
  {id: show_id(:link, object.id),
50
50
  class: merge_classes(:link, object.active, object.link_classes)
51
51
  }.merge(object.link_html)
@@ -1,8 +1,8 @@
1
1
  module SemanticNavigation
2
2
  module Renderers
3
3
  class List
4
- include RenderHelpers
5
- include ActsAsList
4
+ include MixIn::RenderHelpers
5
+ include MixIn::ActsAsList
6
6
 
7
7
  navigation_default_classes [:list]
8
8
 
@@ -20,8 +20,8 @@ module SemanticNavigation
20
20
  content_tag :li, nil, {id: show_id(:leaf, object.id),
21
21
  class: merge_classes(:leaf, object.active, object.classes)
22
22
  }.merge(object.html) do
23
- link_to(object_name(object),
24
- object.url,
23
+ link_to(object_name(object),
24
+ object.url,
25
25
  {id: show_id(:link, object.id),
26
26
  class: merge_classes(:link, object.active, object.link_classes)
27
27
  }.merge(object.link_html))+
@@ -41,8 +41,8 @@ module SemanticNavigation
41
41
  content_tag :li, nil, {id: show_id(:leaf, object.id),
42
42
  class: merge_classes(:leaf, object.active, object.classes)
43
43
  }.merge(object.html) do
44
- link_to object_name(object),
45
- object.url,
44
+ link_to object_name(object),
45
+ object.url,
46
46
  {id: show_id(:link, object.id),
47
47
  class: merge_classes(:link, object.active, object.link_classes)
48
48
  }.merge(object.link_html)
@@ -0,0 +1,43 @@
1
+ module SemanticNavigation
2
+ module Renderers
3
+ module MixIn
4
+ module ActsAsBreadcrumb
5
+
6
+ def render_navigation(object)
7
+ return '' unless object.render_if
8
+ navigation(object) do
9
+ while !object.class.in?([SemanticNavigation::Core::Leaf, NilClass]) &&
10
+ from_level.to_i > object.level
11
+ object = object.sub_elements.find(&:active)
12
+ end
13
+ unless object.class.in?([SemanticNavigation::Core::Leaf, NilClass])
14
+ active_element = object.sub_elements.find{|e| e.active}
15
+ active_element.render(self) if active_element
16
+ end
17
+ end
18
+ end
19
+
20
+ def render_node(object)
21
+ active_element = object.sub_elements.find{|e| e.active}
22
+ if active_element && !active_element.id.in?([except_for].flatten) && active_element.render_if
23
+ render_element = active_element.render(self)
24
+ end
25
+ if render_element
26
+ node(object) do
27
+ render_element
28
+ end
29
+ else
30
+ render_leaf(object)
31
+ end
32
+ end
33
+
34
+ def render_leaf(object)
35
+ show = !until_level.nil? ? object.level <= until_level+1 : true
36
+ return nil unless show
37
+
38
+ leaf(object)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end