alacarte 0.0.1 → 0.0.2
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/CHANGES +11 -0
- data/LICENSE +19 -0
- data/lib/alacarte/engine.rb +1 -0
- data/lib/alacarte/menu.rb +38 -7
- data/lib/alacarte/menus.rb +3 -0
- data/lib/alacarte/rails.rb +1 -0
- data/lib/alacarte/version.rb +1 -1
- data/lib/alacarte.rb +7 -3
- data/spec/alacarte/menu_spec.rb +113 -0
- data/spec/alacarte/menus_spec.rb +55 -0
- data/spec/alacarte_spec.rb +13 -0
- data/spec/spec_helper.rb +13 -0
- metadata +15 -6
data/CHANGES
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2010 Stijn Mathysen
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/lib/alacarte/engine.rb
CHANGED
data/lib/alacarte/menu.rb
CHANGED
@@ -1,14 +1,45 @@
|
|
1
1
|
module Alacarte
|
2
2
|
|
3
|
+
# Alacarte::Menu is the base class for defining menu items.
|
3
4
|
class Menu
|
4
5
|
|
5
6
|
VALID_ELEMENTS = [:link, :span]
|
7
|
+
@@env = nil
|
6
8
|
|
7
|
-
cattr_reader :env
|
8
9
|
attr_reader :parent, :type, :name, :deep_name, :path, :as, :label, :options, :items, :block, :html_options, :group_options
|
9
10
|
|
11
|
+
# Tests if an environment was set to the Alacarte::Menu
|
12
|
+
def self.env?
|
13
|
+
!!@@env
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns the environment that was set to the Alacarte::Menu
|
17
|
+
def self.env
|
18
|
+
@@env
|
19
|
+
end
|
20
|
+
|
21
|
+
# Resets the env, used in rspec testing
|
22
|
+
def self.reset_env!
|
23
|
+
@@env = nil
|
24
|
+
end
|
25
|
+
|
26
|
+
# Creates a menu item. Menu items can relate to a +parent+ menu item and a type should be passed. The type can be used for
|
27
|
+
# rendering (current types are +:menu+, +:link+ and +:span+).
|
28
|
+
#
|
29
|
+
# The first two attributes that can be passed (not required) are the +name+ and +path+ of the menu item. These can also
|
30
|
+
# be set in the options hash. Other settings are derived from +name+, but can also be passed in the options hash.
|
31
|
+
#
|
32
|
+
# The options you can pass are:
|
33
|
+
# * +:name+ sets the name of the menu item
|
34
|
+
# * +:path+ sets the path that the menu item should link to
|
35
|
+
# * +:label+ sets the label that should be displayed as the menu item
|
36
|
+
# * +:as+ defines how the element can be matched with the current element
|
37
|
+
# * +:if+ set a conditions when the menu item should be valid
|
38
|
+
# * +:unless+ set an inverse conditions when the menu item should be valid
|
39
|
+
# * +:html+ pass any html options that you want to be added to the menu item
|
40
|
+
# * +:group+ when the menu item has valid children, the +group+ options are passed as the html options of the grouping element
|
10
41
|
def initialize(parent, type, *args, &block)
|
11
|
-
@options = args.
|
42
|
+
@options = args.last.is_a?(::Hash) ? args.pop : {}
|
12
43
|
@parent = parent
|
13
44
|
@type = type
|
14
45
|
@name = options[:name] || args[0]
|
@@ -23,14 +54,12 @@ module Alacarte
|
|
23
54
|
build
|
24
55
|
end
|
25
56
|
|
57
|
+
# Tests if a block was passed to the Alacarte::Menu object
|
26
58
|
def block?
|
27
59
|
!!@block
|
28
60
|
end
|
29
61
|
|
30
|
-
|
31
|
-
!!@@env
|
32
|
-
end
|
33
|
-
|
62
|
+
# Builds the menu, based on the environment that is passed.
|
34
63
|
def build(env = nil)
|
35
64
|
@@env = env if env
|
36
65
|
@items = []
|
@@ -38,6 +67,7 @@ module Alacarte
|
|
38
67
|
self.instance_eval(&@block) if Menu.env? && self.block?
|
39
68
|
end
|
40
69
|
|
70
|
+
# Tests to see if the current menu item is valid in the current setting
|
41
71
|
def valid?
|
42
72
|
if options[:if] && options[:if].respond_to?(:call)
|
43
73
|
return options[:if].call
|
@@ -49,7 +79,8 @@ module Alacarte
|
|
49
79
|
|
50
80
|
return true
|
51
81
|
end
|
52
|
-
|
82
|
+
|
83
|
+
# Try to send the menu to the passed +env+, then try to create a menu item of the missing method.
|
53
84
|
def method_missing(id, *args, &block)
|
54
85
|
if Menu.env? && Menu.env.respond_to?(id)
|
55
86
|
@@env.send(id, *args, &block)
|
data/lib/alacarte/menus.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
module Alacarte
|
2
2
|
|
3
|
+
# Alacarte::Menus provides a dsl for building menus.
|
3
4
|
class Menus < Hash
|
5
|
+
# Draw the menu
|
4
6
|
def draw(&block)
|
5
7
|
self.instance_exec(&block)
|
6
8
|
end
|
7
9
|
|
10
|
+
# Define a menu in a draw block
|
8
11
|
def menu(name, *args, &block)
|
9
12
|
self[name] = Menu.new(nil, :menu, name, *args, &block)
|
10
13
|
end
|
data/lib/alacarte/rails.rb
CHANGED
data/lib/alacarte/version.rb
CHANGED
data/lib/alacarte.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
|
-
require 'alacarte/engine'
|
2
|
-
require 'alacarte/rails'
|
1
|
+
require 'alacarte/engine' if defined?(Rails)
|
2
|
+
require 'alacarte/rails' if defined?(Rails)
|
3
3
|
require 'alacarte/menus'
|
4
4
|
require 'alacarte/menu'
|
5
5
|
|
6
6
|
module Alacarte
|
7
|
-
mattr_reader :menus
|
8
7
|
@@menus = Alacarte::Menus.new
|
8
|
+
|
9
|
+
# menus provides an access point to the Alacarte module +menus+ attribute.
|
10
|
+
def self.menus
|
11
|
+
@@menus
|
12
|
+
end
|
9
13
|
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Alacarte::Menu do
|
4
|
+
|
5
|
+
context "when creating a menu" do
|
6
|
+
|
7
|
+
it "should be possible to create an item with its minimal settings" do
|
8
|
+
@menu = Alacarte::Menu.new(nil, :menu)
|
9
|
+
|
10
|
+
@menu.name.should be_nil
|
11
|
+
@menu.path.should be_nil
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should be possible to pass in a name" do
|
15
|
+
@menu = Alacarte::Menu.new(nil, :menu, 'name')
|
16
|
+
@menu.name.should eql 'name'
|
17
|
+
@menu.label.should eql 'name'
|
18
|
+
@menu.deep_name.should eql 'name'
|
19
|
+
@menu.as.should eql 'name'
|
20
|
+
|
21
|
+
@menu = Alacarte::Menu.new(nil, :menu, :name => 'other name')
|
22
|
+
@menu.name.should eql 'other name'
|
23
|
+
@menu.label.should eql 'other name'
|
24
|
+
@menu.deep_name.should eql 'other name'
|
25
|
+
@menu.as.should eql 'other name'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should be possible to pass in a path" do
|
29
|
+
@menu = Alacarte::Menu.new(nil, :link, 'login', '/accounts/login')
|
30
|
+
@menu.path.should eql '/accounts/login'
|
31
|
+
|
32
|
+
@menu = Alacarte::Menu.new(nil, :link, 'logout', :path => '/accounts/logout')
|
33
|
+
@menu.path.should eql '/accounts/logout'
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should be possible to specify a label" do
|
37
|
+
@menu = Alacarte::Menu.new(nil, :span, :label => 'spacer')
|
38
|
+
@menu.label.should eql 'spacer'
|
39
|
+
|
40
|
+
@menu = Alacarte::Menu.new(nil, :link, 'login', :label => 'Log in here!')
|
41
|
+
@menu.name.should eql 'login'
|
42
|
+
@menu.label.should eql 'Log in here!'
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should be possible to specify an 'as'" do
|
46
|
+
@menu = Alacarte::Menu.new(nil, :span, :as => 'spacestation')
|
47
|
+
@menu.as.should eql 'spacestation'
|
48
|
+
|
49
|
+
@menu = Alacarte::Menu.new(nil, :link, 'login', :as => 'login_button')
|
50
|
+
@menu.name.should eql 'login'
|
51
|
+
@menu.as.should eql 'login_button'
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should set the env property when the menu is built" do
|
57
|
+
@menu = Alacarte::Menu.new(nil, :menu, :as => 'account')
|
58
|
+
Alacarte::Menu.env?.should be_false
|
59
|
+
Alacarte::Menu.env.should be_nil
|
60
|
+
|
61
|
+
@menu.build
|
62
|
+
Alacarte::Menu.env?.should be_false
|
63
|
+
Alacarte::Menu.env.should be_nil
|
64
|
+
|
65
|
+
@object = Object.new
|
66
|
+
@menu.build(@object)
|
67
|
+
Alacarte::Menu.env?.should be_true
|
68
|
+
Alacarte::Menu.env.should eql @object
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should be possible to reset the env property" do
|
72
|
+
Alacarte::Menu.env?.should be_false
|
73
|
+
Alacarte::Menu.env.should be_nil
|
74
|
+
|
75
|
+
@menu = Alacarte::Menu.new(nil, :menu, :as => 'account')
|
76
|
+
@object = Object.new
|
77
|
+
@menu.build(@object)
|
78
|
+
Alacarte::Menu.env?.should be_true
|
79
|
+
Alacarte::Menu.env.should eql @object
|
80
|
+
|
81
|
+
Alacarte::Menu.reset_env!
|
82
|
+
Alacarte::Menu.env?.should be_false
|
83
|
+
Alacarte::Menu.env.should be_nil
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should be able to test if a block was set on the menu" do
|
87
|
+
@menu = Alacarte::Menu.new(nil, :menu, :as => 'account') do
|
88
|
+
link :login, '/login'
|
89
|
+
link :logout, '/logout'
|
90
|
+
end
|
91
|
+
@menu.block?.should be_true
|
92
|
+
|
93
|
+
@menu = Alacarte::Menu.new(nil, :menu, :as => 'account')
|
94
|
+
@menu.block?.should be_false
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should return the correct valid state for if statements" do
|
98
|
+
@menu = Alacarte::Menu.new(nil, :menu, :if => lambda{ 4 == 3 })
|
99
|
+
@menu.valid?.should be_false
|
100
|
+
|
101
|
+
@menu = Alacarte::Menu.new(nil, :menu, :if => lambda{ 4 == 4 })
|
102
|
+
@menu.valid?.should be_true
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should return the correct valid state for unless statements" do
|
106
|
+
@menu = Alacarte::Menu.new(nil, :menu, :unless => lambda{ 4 == 3 })
|
107
|
+
@menu.valid?.should be_true
|
108
|
+
|
109
|
+
@menu = Alacarte::Menu.new(nil, :menu, :unless => lambda{ 4 == 4 })
|
110
|
+
@menu.valid?.should be_false
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Alacarte::Menus do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@menus = Alacarte::Menus.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should be possible to draw menus using a block" do
|
10
|
+
@menus.size.should eql 0
|
11
|
+
|
12
|
+
@menus.draw do
|
13
|
+
menu :one
|
14
|
+
menu :two
|
15
|
+
end
|
16
|
+
|
17
|
+
@menus.size.should eql 2
|
18
|
+
@menus.keys.should include(:one)
|
19
|
+
@menus.keys.should include(:two)
|
20
|
+
|
21
|
+
@menus.values.each do |menu|
|
22
|
+
menu.should be_instance_of Alacarte::Menu
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should be possible to create a menu directly" do
|
27
|
+
@menus.size.should eql 0
|
28
|
+
@menus.menu :three
|
29
|
+
@menus.size.should eql 1
|
30
|
+
@menus.keys.first.should eql :three
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should construct menu items when the build command is issued" do
|
34
|
+
Alacarte::Menu.env?.should be_false
|
35
|
+
@menus.size.should eql 0
|
36
|
+
@menus.draw do
|
37
|
+
menu :account do
|
38
|
+
link :account, '/account' do
|
39
|
+
link :avatar, '/account/avatar'
|
40
|
+
link :edit, '/account/edit'
|
41
|
+
end
|
42
|
+
link :login, '/login'
|
43
|
+
link :logout, '/logout'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
@menus.size.should eql 1
|
48
|
+
@menus[:account].items.size.should eql 0
|
49
|
+
|
50
|
+
@menus[:account].build(Object.new)
|
51
|
+
@menus[:account].items.size.should eql 3
|
52
|
+
@menus[:account].items.first.items.size.should eql 2
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Alacarte do
|
4
|
+
|
5
|
+
before :all do
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should be possible to access the menus in the Alacarte namespace" do
|
9
|
+
Alacarte.menus.should be_instance_of Alacarte::Menus
|
10
|
+
Alacarte.menus.size.should eql 0
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'I18n'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/alacarte.rb'
|
3
|
+
|
4
|
+
# Add I18n load_path
|
5
|
+
# I18n.load_path = (I18n.load_path << Dir[File.join(File.dirname(__FILE__), 'locales', '*.yml')]).uniq
|
6
|
+
|
7
|
+
RSpec.configure do |c|
|
8
|
+
|
9
|
+
c.before :each do
|
10
|
+
Alacarte::Menu.reset_env!
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alacarte
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Stijn Mathysen
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-12-
|
18
|
+
date: 2010-12-20 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -30,7 +30,9 @@ extra_rdoc_files: []
|
|
30
30
|
|
31
31
|
files:
|
32
32
|
- .gitignore
|
33
|
+
- CHANGES
|
33
34
|
- Gemfile
|
35
|
+
- LICENSE
|
34
36
|
- README.textile
|
35
37
|
- Rakefile
|
36
38
|
- alacarte.gemspec
|
@@ -41,6 +43,10 @@ files:
|
|
41
43
|
- lib/alacarte/menus.rb
|
42
44
|
- lib/alacarte/rails.rb
|
43
45
|
- lib/alacarte/version.rb
|
46
|
+
- spec/alacarte/menu_spec.rb
|
47
|
+
- spec/alacarte/menus_spec.rb
|
48
|
+
- spec/alacarte_spec.rb
|
49
|
+
- spec/spec_helper.rb
|
44
50
|
has_rdoc: true
|
45
51
|
homepage: http://github.com/stijnster/alacarte
|
46
52
|
licenses: []
|
@@ -75,5 +81,8 @@ rubygems_version: 1.3.7
|
|
75
81
|
signing_key:
|
76
82
|
specification_version: 3
|
77
83
|
summary: Provides a generic menu system for Rails
|
78
|
-
test_files:
|
79
|
-
|
84
|
+
test_files:
|
85
|
+
- spec/alacarte/menu_spec.rb
|
86
|
+
- spec/alacarte/menus_spec.rb
|
87
|
+
- spec/alacarte_spec.rb
|
88
|
+
- spec/spec_helper.rb
|