ramenu 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +12 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.md +16 -0
- data/Gemfile +3 -0
- data/LICENSE +23 -0
- data/README.md +372 -0
- data/Rakefile +13 -0
- data/init.rb +1 -0
- data/lib/ramenu.rb +13 -0
- data/lib/ramenu/action_controller.rb +223 -0
- data/lib/ramenu/config.rb +44 -0
- data/lib/ramenu/menus.rb +167 -0
- data/lib/ramenu/railtie.rb +12 -0
- data/lib/ramenu/ramenu_definer.rb +23 -0
- data/lib/ramenu/ramenu_methods.rb +39 -0
- data/lib/ramenu/version.rb +14 -0
- data/ramenu.gemspec +28 -0
- data/test/dummy.rb +34 -0
- data/test/minitest_helper.rb +19 -0
- data/test/test_helper.rb +22 -0
- data/test/unit/action_controller_test.rb +109 -0
- data/test/unit/builder_test.rb +117 -0
- data/test/unit/element_test.rb +52 -0
- data/test/unit/simple_builder_test.rb +68 -0
- metadata +183 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
module Ramenu
|
2
|
+
# A menu definer to create menus in a block
|
3
|
+
class RamenuDefiner
|
4
|
+
attr_accessor :menus, :flags, :options
|
5
|
+
|
6
|
+
def initialize(menus, flags, options = {})
|
7
|
+
self.menus = menus
|
8
|
+
self.flags = flags
|
9
|
+
self.options = options
|
10
|
+
end
|
11
|
+
|
12
|
+
# create a new flag in a block
|
13
|
+
def set_flag(name, value = nil, options = {})
|
14
|
+
Ramenu.set_flag_in(flags, name, value, options)
|
15
|
+
end
|
16
|
+
|
17
|
+
# create a new menu in a block
|
18
|
+
def add_menu(name, path = nil, options = {}, &block)
|
19
|
+
options[:flag] = name if @options[:flag_for_menu] == true && name.is_a?(Symbol)
|
20
|
+
Ramenu.add_menu_to(menus, name, path, options, &block)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Ramenu
|
2
|
+
# flags
|
3
|
+
def self.static_flags(flagset = nil)
|
4
|
+
flagset = DEFAULT_GROUP if flagset.nil?
|
5
|
+
@ramenu_flags ||= {}
|
6
|
+
@ramenu_flags[flagset] ||= {}
|
7
|
+
end
|
8
|
+
|
9
|
+
# return static menus
|
10
|
+
def self.static_menus(menu = nil)
|
11
|
+
menu = DEFAULT_GROUP if menu.nil?
|
12
|
+
@ramenu_menus ||= {}
|
13
|
+
@ramenu_menus[menu] ||= []
|
14
|
+
end
|
15
|
+
|
16
|
+
# add a new flag to a set of flags
|
17
|
+
def self.set_flag_in(flags, name, value, options = {})
|
18
|
+
flags.merge!({ name => value }) unless name.nil? || value.nil?
|
19
|
+
end
|
20
|
+
# add a new menu element to a set of menus
|
21
|
+
def self.add_menu_to(menu, name, path, options = {}, &block)
|
22
|
+
menu << new_ramenu_element(name, path, options, &block)
|
23
|
+
end
|
24
|
+
|
25
|
+
# create a new menu element
|
26
|
+
def self.new_ramenu_element(name, path = nil, options = {}, &block)
|
27
|
+
elem = Menus::Element.new(name, path, options)
|
28
|
+
yield elem if block_given?
|
29
|
+
return elem
|
30
|
+
end
|
31
|
+
|
32
|
+
# menus
|
33
|
+
def self.add_menu(name, path, options = {}, &block)
|
34
|
+
menu = options[:menu]
|
35
|
+
add_menu_to(static_menus(menu), name, path, options, &block)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
data/ramenu.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "ramenu/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.authors = ["Thomas Kienlen", "Simone Carletti"]
|
7
|
+
gem.email = "thomas.kienlen@lafourmi-immo.com"
|
8
|
+
gem.description = "Ramenu is a simple Ruby on Rails plugin for creating and managing navigation menus for a Rails project."
|
9
|
+
gem.summary = "Rails 'A la carte' menu plugin for creating and managing navigation menus."
|
10
|
+
gem.homepage = "https://github.com/lafourmi/ramenu"
|
11
|
+
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
15
|
+
gem.name = "ramenu"
|
16
|
+
gem.require_paths = ["lib"]
|
17
|
+
gem.version = Ramenu::VERSION
|
18
|
+
|
19
|
+
gem.add_dependency 'rails', ">= 3.0"
|
20
|
+
gem.add_development_dependency 'appraisal', ">= 0"
|
21
|
+
gem.add_development_dependency 'mocha', "~> 0.9.10"
|
22
|
+
gem.add_development_dependency 'yard', ">= 0"
|
23
|
+
gem.add_development_dependency 'rake'
|
24
|
+
gem.add_development_dependency 'rack-test'
|
25
|
+
unless ENV["CI"]
|
26
|
+
gem.add_development_dependency "turn", "~> 0.9" if defined?(RUBY_VERSION) && RUBY_VERSION > '1.9'
|
27
|
+
end
|
28
|
+
end
|
data/test/dummy.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
Ramenu::Routes = ActionDispatch::Routing::RouteSet.new
|
2
|
+
Ramenu::Routes.draw do
|
3
|
+
match ':controller(/:action(/:id))'
|
4
|
+
end
|
5
|
+
|
6
|
+
ActionController::Base.view_paths = File.join(File.dirname(__FILE__), 'views')
|
7
|
+
ActionController::Base.send :include, Ramenu::Routes.url_helpers
|
8
|
+
|
9
|
+
class ActiveSupport::TestCase
|
10
|
+
|
11
|
+
setup do
|
12
|
+
@routes = Ramenu::Routes
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
def controller
|
17
|
+
@controller_proxy ||= ControllerProxy.new(@controller)
|
18
|
+
end
|
19
|
+
|
20
|
+
class ControllerProxy
|
21
|
+
def initialize(controller)
|
22
|
+
@controller = controller
|
23
|
+
end
|
24
|
+
def method_missing(method, *args)
|
25
|
+
@controller.instance_eval do
|
26
|
+
m = method(method)
|
27
|
+
m.call(*args)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'turn/autorun'
|
2
|
+
# http://www.mattsears.com/articles/2011/12/10/minitest-quick-reference
|
3
|
+
|
4
|
+
Turn.config do |c|
|
5
|
+
# use one of output formats:
|
6
|
+
# :outline - turn's original case/test outline mode [default]
|
7
|
+
# :progress - indicates progress with progress bar
|
8
|
+
# :dotted - test/unit's traditional dot-progress mode
|
9
|
+
# :pretty - new pretty reporter
|
10
|
+
# :marshal - dump output as YAML (normal run mode only)
|
11
|
+
# :cue - interactive testing
|
12
|
+
#c.format = :outline
|
13
|
+
c.format = :progress
|
14
|
+
# turn on invoke/execute tracing, enable full backtrace
|
15
|
+
c.trace = true
|
16
|
+
# use humanized test names (works only with :outline format)
|
17
|
+
c.natural = true
|
18
|
+
end
|
19
|
+
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'minitest/pride'
|
3
|
+
|
4
|
+
#require 'mocha'
|
5
|
+
#require 'dummy'
|
6
|
+
|
7
|
+
# minitest and turn
|
8
|
+
#require 'minitest_helper'
|
9
|
+
|
10
|
+
ENV["RAILS_ENV"] = "test"
|
11
|
+
|
12
|
+
require "active_support"
|
13
|
+
require "action_controller"
|
14
|
+
require "rails/railtie"
|
15
|
+
#require "i18n"
|
16
|
+
|
17
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
18
|
+
require 'ramenu'
|
19
|
+
|
20
|
+
#ActionController::Base.view_paths = File.join(File.dirname(__FILE__), 'views')
|
21
|
+
|
22
|
+
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'dummy'
|
3
|
+
|
4
|
+
Ramenu.configure do |config|
|
5
|
+
config.add_menu :static_menu, :root_path
|
6
|
+
config.add_menu :static_menu_bis, :root_path, :menu => :default
|
7
|
+
|
8
|
+
config.definer :user_menu, :flag_for_menu => true do |d|
|
9
|
+
d.add_menu :home, :root_path
|
10
|
+
d.add_menu :users, :users_path, :flag => :users do |menu|
|
11
|
+
menu.add_menu :dashboard, :dashboard_users_path
|
12
|
+
menu.add_menu :help, :help_users_path
|
13
|
+
end
|
14
|
+
|
15
|
+
d.set_flag :home, true
|
16
|
+
d.set_flag :users, false
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
class MenusTestController < ActionController::Base
|
23
|
+
add_menu :root, :extranet_root_path
|
24
|
+
add_menu :footab, :root_path
|
25
|
+
add_menu_for_current :current_page
|
26
|
+
|
27
|
+
set_flag :foo, true
|
28
|
+
set_flag :bar, false
|
29
|
+
|
30
|
+
definer :user_menu, :flag_for_menu => true do |d|
|
31
|
+
d.add_menu :dashboard, :root_path
|
32
|
+
d.add_menu :main_screen, :root_path
|
33
|
+
|
34
|
+
d.set_flag :dashboard, false
|
35
|
+
d.set_flag :dashboard_icon, :none
|
36
|
+
d.set_flag :main_screen_value, 2
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
def index
|
41
|
+
render :text => ''
|
42
|
+
end
|
43
|
+
|
44
|
+
def show
|
45
|
+
set_flag :bar, true
|
46
|
+
render :text => ''
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class MenusTest < ActionController::TestCase
|
51
|
+
tests MenusTestController
|
52
|
+
|
53
|
+
def test_add_volatile_menu
|
54
|
+
get :index
|
55
|
+
assert_equal(:root, controller.volatile_menus(:default).first.name)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_add_menu_for_current
|
59
|
+
get :show
|
60
|
+
assert_equal('/menus_test/show', controller.volatile_menus(:default).last.path)
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_add_static_menu
|
64
|
+
get :index
|
65
|
+
assert_equal(:static_menu, controller.menus(:default).first.name)
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_static_and_volatile_menus
|
69
|
+
get :index
|
70
|
+
assert_equal(5, controller.menus(:default).count)
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_set_volatile_flag
|
74
|
+
get :index
|
75
|
+
assert_equal(true, controller.flags(:default)[:foo])
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_set_static_flag
|
79
|
+
get :index
|
80
|
+
assert_equal(true, controller.flags(:user_menu)[:home])
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_static_and_volatile_flags
|
84
|
+
get :index
|
85
|
+
assert_equal(5, controller.flags(:user_menu).count)
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_set_flag_within_method
|
89
|
+
get :show
|
90
|
+
assert_equal(true, controller.flags(:default)[:bar])
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_add_menu_with_definer
|
94
|
+
get :index
|
95
|
+
assert_equal(:main_screen, controller.menus(:user_menu).last.name)
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_definer_with_flag_for_menu_set
|
99
|
+
get :index
|
100
|
+
assert_equal(:main_screen, controller.menus(:user_menu).last.options[:flag])
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_set_flag_with_definer
|
104
|
+
get :index
|
105
|
+
assert_equal(:none, controller.flags(:user_menu)[:dashboard_icon])
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class BuilderTest < ActionView::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@template = self
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
def test_initialize_should_require_context_and_elements
|
11
|
+
assert_raise(ArgumentError) { Ramenu::Menus::Builder.new }
|
12
|
+
assert_raise(ArgumentError) { Ramenu::Menus::Builder.new(@template) }
|
13
|
+
assert_nothing_raised { Ramenu::Menus::Builder.new(@template, []) }
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_initialize_should_allow_options
|
17
|
+
assert_nothing_raised { Ramenu::Menus::Builder.new(@template, [], {}) }
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_initialize_should_set_context
|
21
|
+
builder = Ramenu::Menus::Builder.new(@template, [])
|
22
|
+
assert_equal(@template, builder.instance_variable_get(:'@context'))
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_initialize_should_set_elements
|
26
|
+
builder= Ramenu::Menus::Builder.new(@template, [1, 2])
|
27
|
+
assert_equal([1, 2], builder.instance_variable_get(:'@elements'))
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def test_compute_name_with_symbol
|
32
|
+
builder = Ramenu::Menus::Builder.new(@template, [])
|
33
|
+
element = Ramenu::Menus::Element.new(:method_for_name, nil)
|
34
|
+
|
35
|
+
assert_equal("name from symbol", builder.send(:compute_name, element))
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_compute_name_with_proc
|
39
|
+
builder = Ramenu::Menus::Builder.new(@template, [])
|
40
|
+
element = Ramenu::Menus::Element.new(proc { |template| template.send(:proc_for_name) }, nil)
|
41
|
+
|
42
|
+
assert_equal("name from proc", builder.send(:compute_name, element))
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_compute_name_with_string
|
46
|
+
builder = Ramenu::Menus::Builder.new(@template, [])
|
47
|
+
element = Ramenu::Menus::Element.new("name from string", nil)
|
48
|
+
|
49
|
+
assert_equal("name from string", builder.send(:compute_name, element))
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
def test_compute_path_with_symbol
|
54
|
+
builder = Ramenu::Menus::Builder.new(@template, [])
|
55
|
+
element = Ramenu::Menus::Element.new(nil, :method_for_path)
|
56
|
+
|
57
|
+
assert_equal("http://localhost/#symbol", builder.send(:compute_path, element))
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_compute_path_with_proc
|
61
|
+
builder = Ramenu::Menus::Builder.new(@template, [])
|
62
|
+
element = Ramenu::Menus::Element.new(nil, proc { |template| template.send(:proc_for_path) })
|
63
|
+
|
64
|
+
assert_equal("http://localhost/#proc", builder.send(:compute_path, element))
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_compute_path_with_hash
|
68
|
+
builder = Ramenu::Menus::Builder.new(@template, [])
|
69
|
+
element = Ramenu::Menus::Element.new(nil, { :foo => "bar" })
|
70
|
+
|
71
|
+
assert_equal("http://localhost?foo=bar", builder.send(:compute_path, element))
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_compute_path_with_string
|
75
|
+
builder = Ramenu::Menus::Builder.new(@template, [])
|
76
|
+
element = Ramenu::Menus::Element.new(nil, "http://localhost/#string")
|
77
|
+
|
78
|
+
assert_equal("http://localhost/#string", builder.send(:compute_path, element))
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_empty_associated_flagset
|
82
|
+
builder = Ramenu::Menus::Builder.new(@template, [])
|
83
|
+
element = Ramenu::Menus::Element.new(nil, "http://localhost/")
|
84
|
+
|
85
|
+
assert_equal(nil, builder.send(:flag_for, element))
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_associated_flagset
|
89
|
+
builder = Ramenu::Menus::Builder.new(@template, [], :flags => {:activated => true, :seen => 5})
|
90
|
+
element = Ramenu::Menus::Element.new(nil, "http://localhost/", :flag => :activated)
|
91
|
+
|
92
|
+
assert_equal(true, builder.send(:flag_for, element, :flag))
|
93
|
+
end
|
94
|
+
|
95
|
+
def url_for(params)
|
96
|
+
"http://localhost?" + params.to_param
|
97
|
+
end
|
98
|
+
|
99
|
+
protected
|
100
|
+
|
101
|
+
def method_for_name
|
102
|
+
"name from symbol"
|
103
|
+
end
|
104
|
+
|
105
|
+
def proc_for_name
|
106
|
+
"name from proc"
|
107
|
+
end
|
108
|
+
|
109
|
+
def method_for_path
|
110
|
+
"http://localhost/#symbol"
|
111
|
+
end
|
112
|
+
|
113
|
+
def proc_for_path
|
114
|
+
"http://localhost/#proc"
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ElementTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
def test_initialize_should_require_name_and_path
|
6
|
+
assert_raise(ArgumentError) { Ramenu::Menus::Element.new }
|
7
|
+
assert_raise(ArgumentError) { Ramenu::Menus::Element.new(nil) }
|
8
|
+
assert_nothing_raised { Ramenu::Menus::Element.new(nil, nil) }
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_initialize_should_set_name
|
12
|
+
element = Ramenu::Menus::Element.new(:homepage, nil)
|
13
|
+
assert_equal :homepage, element.name
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_initialize_should_set_path
|
17
|
+
element = Ramenu::Menus::Element.new(nil, "/")
|
18
|
+
assert_equal "/", element.path
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_initialize_should_allow_options
|
22
|
+
element = Ramenu::Menus::Element.new(:homepage, "/", :title => "Go to the Homepage")
|
23
|
+
assert_equal({ :title => "Go to the Homepage" }, element.options)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_initialize_should_allow_childs
|
27
|
+
element = Ramenu::Menus::Element.new(:homepage, "/", :title => "Go to the Homepage")
|
28
|
+
element.add_child(nil, '/')
|
29
|
+
element.add_child(:homepage, nil)
|
30
|
+
assert_equal(2, element.childs.count)
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
def test_name
|
35
|
+
element = Ramenu::Menus::Element.new(nil, nil)
|
36
|
+
element.name = :the_name
|
37
|
+
assert_equal :the_name, element.name
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_path
|
41
|
+
element = Ramenu::Menus::Element.new(nil, nil)
|
42
|
+
element.path = { :controller => "index", :action => "index" }
|
43
|
+
assert_equal({ :controller => "index", :action => "index" }, element.path)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_options
|
47
|
+
element = Ramenu::Menus::Element.new(nil, nil)
|
48
|
+
element.options = { :title => "Go to the Homepage" }
|
49
|
+
assert_equal({ :title => "Go to the Homepage" }, element.options)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|