merb-menus 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +1 -4
- data/lib/merb-menus/item.rb +10 -2
- data/lib/merb-menus/menu.rb +11 -5
- data/lib/merb-menus/merb_controller.rb +55 -69
- data/lib/merb-menus/submenu.rb +21 -3
- data/lib/merb-menus/version.rb +1 -5
- data/lib/merb-menus.rb +3 -3
- metadata +22 -19
- data/spec/merb-menus/item_spec.rb +0 -37
- data/spec/merb-menus/menu_spec.rb +0 -30
- data/spec/merb-menus/rule.rb +0 -23
- data/spec/merb-menus/submenu_spec.rb +0 -28
- data/spec/merb-menus_spec.rb +0 -137
- data/spec/spec_helper.rb +0 -16
data/README
CHANGED
data/lib/merb-menus/item.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
module Merb::Menus
|
2
2
|
class Item
|
3
|
-
def initialize(opts)
|
3
|
+
def initialize(opts, &data)
|
4
4
|
@submenu = opts[:submenu]
|
5
5
|
@name = opts[:name]
|
6
6
|
@anchor = opts[:anchor] || build_anchor
|
7
7
|
@href = opts[:href] || build_url
|
8
8
|
end
|
9
9
|
|
10
|
-
attr_reader :name, :anchor, :
|
10
|
+
attr_reader :name, :anchor, :submenu, :data
|
11
11
|
|
12
12
|
def inspect
|
13
13
|
"<Merb::Menus::Item> - name~>#{name}"
|
@@ -17,6 +17,14 @@ module Merb::Menus
|
|
17
17
|
anchor.to_s
|
18
18
|
end
|
19
19
|
|
20
|
+
def needs_generation?
|
21
|
+
Proc === @href
|
22
|
+
end
|
23
|
+
|
24
|
+
def href
|
25
|
+
needs_generation? ? @href[] : @href
|
26
|
+
end
|
27
|
+
|
20
28
|
private
|
21
29
|
|
22
30
|
def build_url
|
data/lib/merb-menus/menu.rb
CHANGED
@@ -46,8 +46,15 @@ module Merb::Menus
|
|
46
46
|
@collection.first
|
47
47
|
end
|
48
48
|
|
49
|
-
def reset
|
50
|
-
each
|
49
|
+
def reset!
|
50
|
+
each do |e|
|
51
|
+
e.submenus.each do |menu|
|
52
|
+
menu.current_item = nil
|
53
|
+
menu.items.clear
|
54
|
+
end
|
55
|
+
|
56
|
+
e.current_submenu = nil
|
57
|
+
end
|
51
58
|
end
|
52
59
|
end
|
53
60
|
|
@@ -66,9 +73,8 @@ module Merb::Menus
|
|
66
73
|
attr_accessor :current_submenu, :default_display_style, :default_url_generator
|
67
74
|
attr_reader :name, :submenus
|
68
75
|
|
69
|
-
def submenu(name, opts={}, &
|
70
|
-
submenu = Submenu.new(name, self, opts)
|
71
|
-
submenu.instance_eval(&blk) if block_given?
|
76
|
+
def submenu(name, opts={}, &data)
|
77
|
+
submenu = Submenu.new(name, self, opts, &data)
|
72
78
|
@submenus << submenu
|
73
79
|
self
|
74
80
|
end
|
@@ -1,57 +1,25 @@
|
|
1
1
|
class Merb::Controller
|
2
|
-
before do
|
3
|
-
|
2
|
+
before do; Merb::Menus.reset! end
|
3
|
+
before :generate_default_menu
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
action = params['action']
|
9
|
-
|
10
|
-
if top = Merb::Menus.current_menu = Merb::Menus.default
|
11
|
-
if menu = top.current_submenu = get_submenu(top,controller)
|
12
|
-
menu.current_item = get_item(menu,action)
|
13
|
-
end
|
5
|
+
class << self
|
6
|
+
def create_menu(name, &data)
|
7
|
+
Merb::Menus::Menu.new(name).instance_eval &data
|
14
8
|
end
|
15
9
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.set_current
|
25
|
-
end
|
26
|
-
|
27
|
-
# FIXME: if only one arg is given, we probably want to set submenu only? maybe? grr
|
28
|
-
def self.use_menu(*args)
|
29
|
-
@callback = lambda{
|
30
|
-
menu, submenu = *args
|
31
|
-
top = Merb::Menus[menu]
|
32
|
-
Merb::Menus.current_menu = top
|
33
|
-
raise Merb::Menus::NoMenuError.new("Menu '#{menu}' does not exist") unless top
|
34
|
-
|
35
|
-
if submenu
|
36
|
-
top.current_submenu = get_submenu(top, submenu)
|
37
|
-
raise Merb::Menus::NoMenuError.new("Menu '#{submenu}' does not exist") unless top.current_submenu
|
38
|
-
end
|
39
|
-
}
|
40
|
-
@callback.call
|
41
|
-
end
|
42
|
-
|
43
|
-
# ==== Parameters
|
44
|
-
# top<Merb::Menus::Menu>::
|
45
|
-
# sub<Symbol>:: name of desired submenu
|
46
|
-
def self.get_submenu(top, sub)
|
47
|
-
top.submenus.find {|m| m.name.to_s == sub.to_s}
|
48
|
-
end
|
10
|
+
# ==== Parameters
|
11
|
+
# top<Merb::Menus::Menu>::
|
12
|
+
# sub<Symbol>:: name of desired submenu
|
13
|
+
def get_submenu(top, sub)
|
14
|
+
top.submenus.find {|m| m.name.to_s == sub.to_s}
|
15
|
+
end
|
49
16
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
17
|
+
# ==== Parameters
|
18
|
+
# menu<Merb::Menus::Submenu>::
|
19
|
+
# item<Symbol>:: name of desired item
|
20
|
+
def get_item(menu, item)
|
21
|
+
item = menu.items.find{|e| e.name.to_s == item.to_s}
|
22
|
+
end
|
55
23
|
end
|
56
24
|
|
57
25
|
def get_submenu(top, sub)
|
@@ -63,27 +31,20 @@ class Merb::Controller
|
|
63
31
|
end
|
64
32
|
|
65
33
|
def menu_item(*args)
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
menu =
|
72
|
-
menu.current_item = get_item(menu,item)
|
73
|
-
when 2
|
74
|
-
submenu, item = *args
|
75
|
-
top = Merb::Menus.default
|
76
|
-
self.class.use_menu(top.name,submenu)
|
77
|
-
menu = get_submenu(top,submenu)
|
78
|
-
menu.current_item = get_item(menu,item)
|
79
|
-
when 1
|
80
|
-
item = *args
|
81
|
-
top = Merb::Menus.default
|
82
|
-
menu = top.current_submenu
|
83
|
-
menu.current_item = get_item(menu,item)
|
84
|
-
else
|
85
|
-
raise ArgumentError.new("Wrong number of arguments given (#{args.size} for 1)")
|
34
|
+
menu, submenu, item = *args
|
35
|
+
|
36
|
+
if item.nil?
|
37
|
+
item = submenu
|
38
|
+
submenu = menu
|
39
|
+
menu = Merb::Menus.default.name
|
86
40
|
end
|
41
|
+
|
42
|
+
top = Merb::Menus[menu]
|
43
|
+
Merb::Menus.current_menu = top
|
44
|
+
generate_menu(top)
|
45
|
+
submenu = get_submenu(top, submenu)
|
46
|
+
top.current_submenu = submenu
|
47
|
+
submenu.current_item = get_item(submenu, item)
|
87
48
|
end
|
88
49
|
|
89
50
|
def current_menu
|
@@ -98,5 +59,30 @@ class Merb::Controller
|
|
98
59
|
Merb::Menus.current_item
|
99
60
|
end
|
100
61
|
|
62
|
+
# Generate items in the context of our current controller instance
|
63
|
+
# so that we can generate urls with merb's url helpers
|
64
|
+
def item(*args)
|
65
|
+
@__submenu_generation__.item(*args)
|
66
|
+
end
|
67
|
+
|
68
|
+
def generate_menu(menu)
|
69
|
+
menu.submenus.each do |m|
|
70
|
+
@__submenu_generation__ = m
|
71
|
+
instance_eval &m.data
|
72
|
+
m.generated!
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def generate_default_menu
|
79
|
+
if top = Merb::Menus.current_menu = Merb::Menus.default
|
80
|
+
generate_menu(top)
|
81
|
+
|
82
|
+
if menu = top.current_submenu = get_submenu(top, controller_name)
|
83
|
+
menu.current_item = get_item(menu, action_name)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
101
87
|
end
|
102
88
|
|
data/lib/merb-menus/submenu.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
module Merb::Menus
|
2
2
|
class Submenu
|
3
|
-
def initialize(name, menu, opts={})
|
3
|
+
def initialize(name, menu, opts={}, &data)
|
4
4
|
@name = name
|
5
5
|
@menu = menu
|
6
6
|
@display_style = @menu.default_display_style
|
7
7
|
@url_generator = @menu.default_url_generator
|
8
8
|
@details = Item.new(opts.merge({:name => name, :submenu => self}))
|
9
9
|
@items = []
|
10
|
+
@data = data
|
10
11
|
end
|
11
12
|
|
12
13
|
attr_accessor :current_item
|
13
|
-
attr_reader :name, :items, :menu, :display_style, :url_generator
|
14
|
+
attr_reader :name, :items, :menu, :display_style, :url_generator, :data
|
14
15
|
|
15
16
|
def anchor
|
16
17
|
@details.anchor
|
@@ -21,7 +22,8 @@ module Merb::Menus
|
|
21
22
|
end
|
22
23
|
|
23
24
|
def item(name, opts={})
|
24
|
-
@items << Item.new(opts.merge({:name => name, :submenu => self}))
|
25
|
+
@items << Item.new(opts.merge({:name => name, :submenu => self})) unless
|
26
|
+
@items.any? {|i| i.name == name}
|
25
27
|
self
|
26
28
|
end
|
27
29
|
|
@@ -40,6 +42,22 @@ module Merb::Menus
|
|
40
42
|
def to_s
|
41
43
|
anchor
|
42
44
|
end
|
45
|
+
|
46
|
+
def generated!
|
47
|
+
@generated = true
|
48
|
+
end
|
49
|
+
|
50
|
+
def generated?
|
51
|
+
!!@generated
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
# Don't generate the URLs until the action is hit
|
57
|
+
# when using merb url/resource helpers
|
58
|
+
def method_missing(meth, *args, &block)
|
59
|
+
lambda {Merb::Menus.controller.send(meth, *args, &block)}
|
60
|
+
end
|
43
61
|
end
|
44
62
|
end
|
45
63
|
|
data/lib/merb-menus/version.rb
CHANGED
data/lib/merb-menus.rb
CHANGED
@@ -22,7 +22,7 @@ if defined?(Merb::Plugins)
|
|
22
22
|
Merb::Plugins.add_rakefiles "merb-menus/merbtasks"
|
23
23
|
|
24
24
|
module Merb::Menus
|
25
|
-
class << self; attr_accessor :current_menu
|
25
|
+
class << self; attr_accessor :current_menu, :controller end
|
26
26
|
|
27
27
|
class NoMenuError < StandardError;end
|
28
28
|
|
@@ -34,8 +34,8 @@ if defined?(Merb::Plugins)
|
|
34
34
|
Menu.find{|menu| menu.default?} || Menu.first
|
35
35
|
end
|
36
36
|
|
37
|
-
def self.reset
|
38
|
-
Menu.reset
|
37
|
+
def self.reset!
|
38
|
+
Menu.reset!
|
39
39
|
end
|
40
40
|
|
41
41
|
def self.current_submenu
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: merb-menus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 0.2.0
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- jonah honeyman
|
@@ -9,7 +14,7 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date:
|
17
|
+
date: 2011-01-19 00:00:00 +02:00
|
13
18
|
default_executable:
|
14
19
|
dependencies: []
|
15
20
|
|
@@ -24,24 +29,18 @@ extra_rdoc_files:
|
|
24
29
|
- LICENSE
|
25
30
|
- TODO
|
26
31
|
files:
|
27
|
-
- LICENSE
|
28
|
-
- README
|
29
|
-
- Rakefile
|
30
|
-
- TODO
|
31
32
|
- lib/merb-menus/version.rb
|
32
|
-
- lib/merb-menus/merb_controller.rb
|
33
|
-
- lib/merb-menus/submenu.rb
|
34
|
-
- lib/merb-menus/item.rb
|
35
33
|
- lib/merb-menus/merbtasks.rb
|
36
|
-
- lib/merb-menus/
|
34
|
+
- lib/merb-menus/submenu.rb
|
37
35
|
- lib/merb-menus/menu.rb
|
36
|
+
- lib/merb-menus/rule.rb
|
37
|
+
- lib/merb-menus/item.rb
|
38
|
+
- lib/merb-menus/merb_controller.rb
|
38
39
|
- lib/merb-menus.rb
|
39
|
-
-
|
40
|
-
-
|
41
|
-
-
|
42
|
-
-
|
43
|
-
- spec/spec_helper.rb
|
44
|
-
- spec/merb-menus_spec.rb
|
40
|
+
- LICENSE
|
41
|
+
- README
|
42
|
+
- Rakefile
|
43
|
+
- TODO
|
45
44
|
has_rdoc: true
|
46
45
|
homepage: http://github.com/jonuts/merb-menus
|
47
46
|
licenses: []
|
@@ -52,21 +51,25 @@ rdoc_options: []
|
|
52
51
|
require_paths:
|
53
52
|
- lib
|
54
53
|
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
55
|
requirements:
|
56
56
|
- - ">="
|
57
57
|
- !ruby/object:Gem::Version
|
58
|
+
segments:
|
59
|
+
- 0
|
58
60
|
version: "0"
|
59
|
-
version:
|
60
61
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
61
63
|
requirements:
|
62
64
|
- - ">="
|
63
65
|
- !ruby/object:Gem::Version
|
66
|
+
segments:
|
67
|
+
- 0
|
64
68
|
version: "0"
|
65
|
-
version:
|
66
69
|
requirements: []
|
67
70
|
|
68
71
|
rubyforge_project:
|
69
|
-
rubygems_version: 1.3.
|
72
|
+
rubygems_version: 1.3.7
|
70
73
|
signing_key:
|
71
74
|
specification_version: 3
|
72
75
|
summary: Merb plugin that provides dot dot dot uh menus
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
-
|
3
|
-
describe Merb::Menus::Item do
|
4
|
-
before do
|
5
|
-
@menu = Merb::Menus::Menu.new(:foo)
|
6
|
-
@menu.display_style(:split) {|thing| thing.to_s.split("_").join(" ")}
|
7
|
-
|
8
|
-
@submenu = Merb::Menus::Submenu.new(:cakes, @menu)
|
9
|
-
@submenu.use_display_style(:split)
|
10
|
-
|
11
|
-
@cheesecake = Merb::Menus::Item.new(:name => :cheese_cake, :submenu => @submenu)
|
12
|
-
@spongecake = Merb::Menus::Item.new(:name => :sponge, :submenu => @submenu, :anchor => "sPOnge cAkE")
|
13
|
-
@poundcake = Merb::Menus::Item.new(:name => :pound, :submenu => @submenu, :href => "http://bettercakesite")
|
14
|
-
end
|
15
|
-
|
16
|
-
it "has a unique key"
|
17
|
-
it "has a submenu" do
|
18
|
-
@cheesecake.submenu.should == @submenu
|
19
|
-
end
|
20
|
-
|
21
|
-
it "sets the anchor based on display rule in submenu" do
|
22
|
-
@cheesecake.anchor.should == "cheese cake"
|
23
|
-
end
|
24
|
-
|
25
|
-
it "overrides default display style if given in opts" do
|
26
|
-
@spongecake.anchor.should == "sPOnge cAkE"
|
27
|
-
end
|
28
|
-
|
29
|
-
it "generates a url" do
|
30
|
-
@cheesecake.href.should == "/cakes/cheese_cake"
|
31
|
-
@spongecake.href.should == "/cakes/sponge"
|
32
|
-
@poundcake.href.should == "http://bettercakesite"
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
-
|
3
|
-
describe Merb::Menus::Menu do
|
4
|
-
before do
|
5
|
-
@menu = Merb::Menus::Menu.new(:foo)
|
6
|
-
@menu.submenu(:wutup){}
|
7
|
-
@menu.submenu(:dog){}
|
8
|
-
end
|
9
|
-
|
10
|
-
it "tracks submenus" do
|
11
|
-
@menu.submenus.should have(2).things
|
12
|
-
end
|
13
|
-
|
14
|
-
it "stores different display rules"
|
15
|
-
it "defines a url generator"
|
16
|
-
it "has a default url generation method"
|
17
|
-
end
|
18
|
-
|
19
|
-
describe Merb::Menus::Menu, "#submenu" do
|
20
|
-
before do
|
21
|
-
@menu = Merb::Menus::Menu.new(:hellothar)
|
22
|
-
end
|
23
|
-
|
24
|
-
it "creates a submenu without taking a block" do
|
25
|
-
lambda{@menu.submenu(:foo)}.should_not raise_error(ArgumentError)
|
26
|
-
@menu.submenus.should have(1).item
|
27
|
-
@menu.submenus.first.name.should == :foo
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
data/spec/merb-menus/rule.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
-
|
3
|
-
describe Merb::Menus::DisplayStyle do
|
4
|
-
before do
|
5
|
-
@menu = Merb::Menus::Menu.new(:foo)
|
6
|
-
@split_rule = Merb::Menus::DisplayStyle.new(:split,@menu){|thing| thing.to_s.split("_").join(" ")}
|
7
|
-
@splitncap = Merb::Menus::DisplayStyle.new(:split,@menu){|thing| thing.to_s.split("_").join(" ")}
|
8
|
-
@dollarfy = Merb::Menus::DisplayStyle.new(:dollar,@menu){|thing| "$#{thing.to_s.gsub(/_/,',')}"}
|
9
|
-
end
|
10
|
-
|
11
|
-
it "has a unique key" do
|
12
|
-
@split_rule.key.should == :split
|
13
|
-
@splitncap.key.should == :split
|
14
|
-
|
15
|
-
@split_rule.rule.call("hello_thar").should == "hello thar"
|
16
|
-
@splitncap.rule.call("wut_the_deal").should == "wut the deal"
|
17
|
-
end
|
18
|
-
|
19
|
-
it "has a styling rule" do
|
20
|
-
Merb::Menus::DisplayStyle.add_rule(:feh).should be_nil
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
-
|
3
|
-
describe Merb::Menus::Submenu do
|
4
|
-
before do
|
5
|
-
Merb::Menus::Menu.new :foo
|
6
|
-
@submenu = Merb::Menus::Submenu.new(:berries, Merb::Menus::Menu[:foo])
|
7
|
-
@submenu.item(:straw)
|
8
|
-
@submenu.item(:rasp)
|
9
|
-
@submenu.item(:black, :anchor => "HELLOTHAR", :url => "eek")
|
10
|
-
end
|
11
|
-
|
12
|
-
it "has a unique key" do
|
13
|
-
@submenu.name.should == :berries
|
14
|
-
end
|
15
|
-
|
16
|
-
it "has a collection of items" do
|
17
|
-
@submenu.items.should have(3).things
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'sets item properly' do
|
21
|
-
item = @submenu.items.first
|
22
|
-
item.name.should == :straw
|
23
|
-
item.submenu.should == @submenu
|
24
|
-
item.anchor.should == "straw"
|
25
|
-
item.href.should == "/berries/straw"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
data/spec/merb-menus_spec.rb
DELETED
@@ -1,137 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
-
|
3
|
-
class Application < Merb::Controller
|
4
|
-
create_menu :main do
|
5
|
-
submenu :cakes, :href => "/cakes" do
|
6
|
-
item :cheese
|
7
|
-
item :chocolate
|
8
|
-
item :devils_food, :anchor => "Devil's Food"
|
9
|
-
end
|
10
|
-
|
11
|
-
submenu :beers, :href => "/beers" do
|
12
|
-
item :budweiser
|
13
|
-
item :rolling_rock
|
14
|
-
item :fosters, :anchor => "Foster's"
|
15
|
-
item :fat_tire
|
16
|
-
end
|
17
|
-
|
18
|
-
submenu :drinks, :href => "/drinks" do
|
19
|
-
item :soda
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
class Cakes < Application
|
26
|
-
use_menu :main
|
27
|
-
|
28
|
-
# this should be associated with item :cheese
|
29
|
-
def cheese
|
30
|
-
'hello'
|
31
|
-
end
|
32
|
-
|
33
|
-
def chocolate
|
34
|
-
menu_item :beers, :budweiser
|
35
|
-
|
36
|
-
'word up'
|
37
|
-
end
|
38
|
-
|
39
|
-
def not_devils_food
|
40
|
-
# associate this action with item :devils_food
|
41
|
-
menu_item :devils_food
|
42
|
-
|
43
|
-
':)'
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
class Beers < Application
|
48
|
-
def fat_tire
|
49
|
-
'yoink'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
class Snack < Application
|
54
|
-
use_menu :main, :cakes
|
55
|
-
|
56
|
-
def cheese_cake
|
57
|
-
menu_item :cheese
|
58
|
-
|
59
|
-
[current_menu, current_submenu, current_item].join(" ")
|
60
|
-
end
|
61
|
-
|
62
|
-
def pistachios
|
63
|
-
[current_menu, current_submenu, current_item].join(" ")
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
class Drinks < Application
|
68
|
-
def soda
|
69
|
-
"#{current_menu}/#{current_submenu}/#{current_item}"
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
describe "menu generator", "Merb::Controller" do
|
74
|
-
before do
|
75
|
-
@menu = Merb::Menus[:main]
|
76
|
-
end
|
77
|
-
|
78
|
-
it "should create the menu" do
|
79
|
-
@menu.name.should == :main
|
80
|
-
end
|
81
|
-
|
82
|
-
it "should create all the submenus" do
|
83
|
-
@menu.submenus.should have(3).things
|
84
|
-
@menu.submenus.first.name.should == :cakes
|
85
|
-
end
|
86
|
-
|
87
|
-
it "should create the submenu items" do
|
88
|
-
@menu.submenus.first.items.should have(3).things
|
89
|
-
@menu.submenus.first.items.map{|e| e.name}.should == [:cheese, :chocolate, :devils_food]
|
90
|
-
|
91
|
-
@menu.submenus[1].items.should have(4).things
|
92
|
-
@menu.submenus[1].items.map{|e| e.name}.should == [:budweiser, :rolling_rock, :fosters, :fat_tire]
|
93
|
-
end
|
94
|
-
|
95
|
-
it "is accessible from child controllers"
|
96
|
-
|
97
|
-
it "sets the current menu properly" do
|
98
|
-
request('/cakes/cheese')
|
99
|
-
top = Merb::Menus[:main]
|
100
|
-
top.current_submenu.name.should == :cakes
|
101
|
-
top.current_submenu.current_item.name.should == :cheese
|
102
|
-
end
|
103
|
-
|
104
|
-
it "overrides actions default menu item" do
|
105
|
-
request('/cakes/chocolate')
|
106
|
-
top = Merb::Menus[:main]
|
107
|
-
top.current_submenu.name.should == :beers
|
108
|
-
top.current_submenu.current_item.name.should == :budweiser
|
109
|
-
end
|
110
|
-
|
111
|
-
it "finds the correct controller/action combo automagically" do
|
112
|
-
request '/beers/fat_tire'
|
113
|
-
Merb::Menus.current_menu.name.should == :main
|
114
|
-
Merb::Menus.current_menu.current_submenu.name.should == :beers
|
115
|
-
Merb::Menus.current_menu.current_submenu.current_item.name.should == :fat_tire
|
116
|
-
end
|
117
|
-
|
118
|
-
it "has helpers to access current menu data" do
|
119
|
-
req = request '/drinks/soda'
|
120
|
-
|
121
|
-
req.body.to_s.should == "main/drinks/soda"
|
122
|
-
end
|
123
|
-
|
124
|
-
it do
|
125
|
-
req = request '/snack/cheese_cake'
|
126
|
-
req.body.to_s.should == "main cakes cheese"
|
127
|
-
end
|
128
|
-
|
129
|
-
it "resets all current menus before each request" do
|
130
|
-
req = request '/snack/pistachios'
|
131
|
-
req.body.to_s.should_not == "main cakes cheese" #this would happen w/o the reset
|
132
|
-
req.body.to_s.should == "main cakes "
|
133
|
-
end
|
134
|
-
|
135
|
-
|
136
|
-
end
|
137
|
-
|
data/spec/spec_helper.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
$:.push File.join(File.dirname(__FILE__), '..', 'lib')
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'spec'
|
5
|
-
require 'merb-core'
|
6
|
-
require 'merb-core/test'
|
7
|
-
require 'merb-menus'
|
8
|
-
|
9
|
-
Merb::Router.prepare {default_routes}
|
10
|
-
|
11
|
-
Merb.start :environment => "test", :adapter => "runner"
|
12
|
-
|
13
|
-
Spec::Runner.configure {|config|
|
14
|
-
config.include(Merb::Test::RouteHelper)
|
15
|
-
}
|
16
|
-
|