emenu 0.4.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 (34) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +19 -0
  4. data/Gemfile.lock +71 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.rdoc +103 -0
  7. data/Rakefile +49 -0
  8. data/VERSION +1 -0
  9. data/emenu.gemspec +90 -0
  10. data/lib/emenu.rb +38 -0
  11. data/lib/emenu/menu.rb +93 -0
  12. data/lib/emenu/menu_config.rb +73 -0
  13. data/lib/emenu/string.rb +15 -0
  14. data/lib/generators/emenu/USAGE +1 -0
  15. data/lib/generators/emenu/install_generator.rb +42 -0
  16. data/lib/generators/emenu/templates/default_menu/navigation.rb +33 -0
  17. data/lib/generators/emenu/templates/images/menu.png +0 -0
  18. data/lib/generators/emenu/templates/images/menu_arrow.png +0 -0
  19. data/lib/generators/emenu/templates/images/menu_border.png +0 -0
  20. data/lib/generators/emenu/templates/images/menu_l.png +0 -0
  21. data/lib/generators/emenu/templates/images/menu_l_selected.png +0 -0
  22. data/lib/generators/emenu/templates/images/menu_minus.png +0 -0
  23. data/lib/generators/emenu/templates/images/menu_plus.png +0 -0
  24. data/lib/generators/emenu/templates/images/menu_r.png +0 -0
  25. data/lib/generators/emenu/templates/images/menu_r_selected.png +0 -0
  26. data/lib/generators/emenu/templates/images/menu_selected.png +0 -0
  27. data/lib/generators/emenu/templates/javascripts/emenu.js +71 -0
  28. data/lib/generators/emenu/templates/javascripts/jquery-1.4.2.min.js +154 -0
  29. data/lib/generators/emenu/templates/stylesheets/emenu.css +278 -0
  30. data/lib/generators/emenu/templates/stylesheets/reset.css +53 -0
  31. data/spec/menu_config_spec.rb +149 -0
  32. data/spec/menu_spec.rb +175 -0
  33. data/spec/spec_helper.rb +12 -0
  34. metadata +161 -0
@@ -0,0 +1,53 @@
1
+ /* http://meyerweb.com/eric/tools/css/reset/ */
2
+ /* v1.0 | 20080212 */
3
+
4
+ html, body, div, span, applet, object, iframe,
5
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
6
+ a, abbr, acronym, address, big, cite, code,
7
+ del, dfn, em, font, img, ins, kbd, q, s, samp,
8
+ small, strike, strong, sub, sup, tt, var,
9
+ b, u, i, center,
10
+ dl, dt, dd, ol, ul, li,
11
+ fieldset, form, label, legend,
12
+ table, caption, tbody, tfoot, thead, tr, th, td {
13
+ margin: 0;
14
+ padding: 0;
15
+ border: 0;
16
+ outline: 0;
17
+ font-size: 100%;
18
+ vertical-align: baseline;
19
+ background: transparent;
20
+ }
21
+ body {
22
+ line-height: 1;
23
+ }
24
+ ol, ul {
25
+ list-style: none;
26
+ }
27
+ blockquote, q {
28
+ quotes: none;
29
+ }
30
+ blockquote:before, blockquote:after,
31
+ q:before, q:after {
32
+ content: '';
33
+ content: none;
34
+ }
35
+
36
+ /* remember to define focus styles! */
37
+ :focus {
38
+ outline: 0;
39
+ }
40
+
41
+ /* remember to highlight inserts somehow! */
42
+ ins {
43
+ text-decoration: none;
44
+ }
45
+ del {
46
+ text-decoration: line-through;
47
+ }
48
+
49
+ /* tables still need 'cellspacing="0"' in the markup */
50
+ table {
51
+ border-collapse: collapse;
52
+ border-spacing: 0;
53
+ }
@@ -0,0 +1,149 @@
1
+ require 'spec_helper'
2
+
3
+ describe MenuConfig do
4
+
5
+ it 'should know how to mark selected menu' do
6
+ subject.item :djuka
7
+ subject.selected = :djuka
8
+ subject.selected.should == :djuka
9
+ end
10
+
11
+ it 'should know how to mark opened menus' do
12
+ subject.open :djuka
13
+ subject.open :marko
14
+ subject.opened?(:djuka).should == true
15
+ subject.opened?(:marko).should == true
16
+ subject.opened?(:petar).should == false
17
+ end
18
+
19
+ it 'should open all parent nodes when child is selected' do
20
+ subject.item :products do
21
+ item :napkin do
22
+ item :cool_napkin
23
+ end
24
+ end
25
+ subject.opened?(:products).should == false
26
+ subject.opened?(:napkin).should == false
27
+ subject.selected = :cool_napkin
28
+ subject.opened?(:products).should == true
29
+ subject.opened?(:napkin).should == true
30
+ end
31
+
32
+ it 'should know to add menu' do
33
+ subject.item :company
34
+ subject.config.size.should == 1
35
+ subject.config[:company].title.should == :company
36
+ end
37
+
38
+ it 'should know to add two menus' do
39
+ subject.item :company
40
+ subject.item :better_company
41
+ subject.config.size.should == 2
42
+ subject.config[:company].title.should == :company
43
+ subject.config[:better_company].title.should == :better_company
44
+ end
45
+
46
+ it 'should dissalow same root menu neme' do
47
+ lambda do
48
+ subject.item :products
49
+ subject.item :products
50
+ end.should raise_error "It's not allowed to have same menu keys: products"
51
+ end
52
+
53
+ it 'should enforce menu item uniqueness across all menus' do
54
+ lambda do
55
+ subject.item :products do
56
+ item :napkin
57
+ item :cool_napkin
58
+ end
59
+ subject.item :second do
60
+ item :something
61
+ item :napkin
62
+ end
63
+ end.should raise_error("It's not allowed to have same menu keys: napkin")
64
+ end
65
+
66
+ it 'should generate valid #menu tag and move menus for spacing to the right' do
67
+ subject.item :company do
68
+ item :napkin, '/napkin'
69
+ end
70
+ subject.item :better_company do
71
+ item :cars
72
+ end
73
+ subject.to_haml.should == <<-DEF.indent
74
+ #menu
75
+ %h6#h-menu-company
76
+ %a{ :href => '#company'}
77
+ %span Company
78
+ %ul#menu-company.closed
79
+ %li= link_to 'Napkin', '/napkin'
80
+ %h6#h-menu-better_company
81
+ %a{ :href => '#better_company'}
82
+ %span Better company
83
+ %ul#menu-better_company.closed
84
+ %li= link_to 'Cars', '#'
85
+ DEF
86
+ end
87
+
88
+ it 'should generate valid html' do
89
+ subject.item :transportation do
90
+ item :cars
91
+ end
92
+ subject.to_html.should == <<-DEF.indent
93
+ <div id='menu'>
94
+ <h6 id='h-menu-transportation'>
95
+ <a href='#transportation'>
96
+ <span>Transportation</span>
97
+ </a>
98
+ </h6>
99
+ <ul class='closed' id='menu-transportation'>
100
+ <li><a href="#">Cars</a></li>
101
+ </ul>
102
+ </div>
103
+ DEF
104
+ end
105
+
106
+ it 'should generate valid html with render method' do
107
+ subject.item :transportation do
108
+ item :cars
109
+ end
110
+ subject.render.should == <<-DEF.indent
111
+ <div id='menu'>
112
+ <h6 id='h-menu-transportation'>
113
+ <a href='#transportation'>
114
+ <span>Transportation</span>
115
+ </a>
116
+ </h6>
117
+ <ul class='closed' id='menu-transportation'>
118
+ <li><a href="#">Cars</a></li>
119
+ </ul>
120
+ </div>
121
+ DEF
122
+ end
123
+
124
+ it 'should know how to create menu config with static factory method' do
125
+ subject.item :transportation do
126
+ item :cars
127
+ item :trains do
128
+ item :fast_trains
129
+ item :slow_trains
130
+ end
131
+ end
132
+ subject.item :orders do
133
+ item :bananas
134
+ end
135
+
136
+ MenuConfig.define do |menu|
137
+ menu.item :transportation do
138
+ item :cars
139
+ item :trains do
140
+ item :fast_trains
141
+ item :slow_trains
142
+ end
143
+ end
144
+ menu.item :orders do
145
+ item :bananas
146
+ end
147
+ end.to_html.should == subject.to_html
148
+ end
149
+ end
data/spec/menu_spec.rb ADDED
@@ -0,0 +1,175 @@
1
+ require 'spec_helper'
2
+
3
+ describe Menu do
4
+
5
+ subject do
6
+ @config = stub(:config)
7
+ @config.stubs(:open)
8
+ @config.stubs(:selected=)
9
+ @config.stubs(:selected).returns nil
10
+ @config.stubs(:opened?).with(anything).returns false
11
+
12
+ Menu.new(:company, nil, @config)
13
+ end
14
+
15
+
16
+ it 'should have title' do
17
+ subject.title.should == :company
18
+ subject.type.should == :title
19
+ end
20
+
21
+ it 'should accept new items' do
22
+ subject.add(:napkin)
23
+ subject.add(:car)
24
+ subject.items.count.should == 2
25
+ subject.items.first.type.should == :menu
26
+ subject.items[1].type.should == :menu
27
+ end
28
+
29
+ it 'should know subitems titles' do
30
+ subject.add(:napkin)
31
+ subject.add(:car)
32
+ subject.items.first.title.should == :napkin
33
+ end
34
+
35
+ it 'should support collapsible items of sub items' do
36
+ subject.add(:napkin)
37
+ subject.items.first.type.should == :menu
38
+ subject.items.first.add(:cool_napkins)
39
+ subject.items.first.type.should == :collapsible_menu
40
+ subject.items.first.items.first.type.should == :menu
41
+ end
42
+
43
+ it 'should enforce menu keys uniqueness' do
44
+ lambda { subject.add(:company) }.should raise_error("It's not allowed to have same menu keys: company")
45
+ end
46
+
47
+ it 'should enforce keys uniqueness in colapslible items' do
48
+ lambda do
49
+ subject.add(:napkin)
50
+ subject.items.first.add(:cars)
51
+ subject.items.first.add(:cars)
52
+ end.should raise_error("It's not allowed to have same menu keys: cars")
53
+ end
54
+
55
+ it 'should generate valid haml for simple meni' do
56
+ subject.add(:table)
57
+ subject.add(:napkin)
58
+ subject.to_haml.should == <<-DEF.indent
59
+ %h6#h-menu-company
60
+ %a{ :href => '#company'}
61
+ %span Company
62
+ %ul#menu-company.closed
63
+ %li= link_to 'Table', '#'
64
+ %li= link_to 'Napkin', '#'
65
+ DEF
66
+ end
67
+
68
+ it 'should generate haml for simple opened menu' do
69
+ subject.add(:table)
70
+ subject.add(:napkin)
71
+ @config.open(:company)
72
+ @config.selected = :napkin
73
+
74
+ @config.stubs(:opened?).with(:company).returns true
75
+ @config.stubs(:selected).returns :napkin
76
+
77
+ subject.to_haml.should == <<-DEF.indent
78
+ %h6#h-menu-company{ :class => "selected" }
79
+ %a{ :href => '#company'}
80
+ %span Company
81
+ %ul#menu-company.opened
82
+ %li= link_to 'Table', '#'
83
+ %li{ :class => "selected" }= link_to 'Napkin', '#'
84
+ DEF
85
+ end
86
+
87
+
88
+ it 'should generate valid haml for complex meni' do
89
+ subject.add(:table)
90
+ subject.add(:napkin)
91
+ subject.items[1].add(:cool_napkins)
92
+ subject.add(:cars)
93
+ subject.to_haml.should == <<-DEF.indent
94
+ %h6#h-menu-company
95
+ %a{ :href => '#company'}
96
+ %span Company
97
+ %ul#menu-company.closed
98
+ %li= link_to 'Table', '#'
99
+ %li.collapsible
100
+ %a{ :href => '#', :class => 'collapsible plus'} Napkin
101
+ %ul#napkin.collapsed
102
+ %li= link_to 'Cool napkins', '#'
103
+ %li= link_to 'Cars', '#'
104
+ DEF
105
+ end
106
+
107
+ it 'should generate valid haml for complex opened meni' do
108
+ subject.add(:table)
109
+ subject.add(:napkin)
110
+ subject.items[1].add(:cool_napkins)
111
+ subject.add(:cars)
112
+ @config.open(:company)
113
+ @config.open(:napkin)
114
+ @config.selected = :cool_napkins
115
+
116
+ @config.stubs(:opened?).with(anything).returns true
117
+ @config.stubs(:selected).returns :cool_napkins
118
+
119
+ subject.to_haml.should == <<-DEF.indent
120
+ %h6#h-menu-company{ :class => "selected" }
121
+ %a{ :href => '#company'}
122
+ %span Company
123
+ %ul#menu-company.opened
124
+ %li= link_to 'Table', '#'
125
+ %li.collapsible
126
+ %a{ :href => '#', :class => 'collapsible minus'} Napkin
127
+ %ul#napkin.expanded
128
+ %li{ :class => "selected" }= link_to 'Cool napkins', '#'
129
+ %li= link_to 'Cars', '#'
130
+ DEF
131
+ end
132
+
133
+ it 'should generate valid haml for collapsible of collapsible meni' do
134
+ subject.add(:table)
135
+ subject.add(:napkin)
136
+ subject.items[1].add(:cool_napkins)
137
+ something = subject.items[1].add(:something)
138
+ something.add(:collapsible2)
139
+ subject.add(:cars)
140
+ subject.to_haml.should == <<-DEF.indent
141
+ %h6#h-menu-company
142
+ %a{ :href => '#company'}
143
+ %span Company
144
+ %ul#menu-company.closed
145
+ %li= link_to 'Table', '#'
146
+ %li.collapsible
147
+ %a{ :href => '#', :class => 'collapsible plus'} Napkin
148
+ %ul#napkin.collapsed
149
+ %li= link_to 'Cool napkins', '#'
150
+ %li.collapsible
151
+ %a{ :href => '#', :class => 'collapsible plus'} Something
152
+ %ul#something.collapsed
153
+ %li= link_to 'Collapsible2', '#'
154
+ %li= link_to 'Cars', '#'
155
+ DEF
156
+ end
157
+
158
+ it 'should enumerate all items' do
159
+ subject.add(:table)
160
+ subject.add(:napkin)
161
+ subject.items[1].add(:cool_napkins)
162
+ subject.all_items.count.should == 3
163
+ end
164
+
165
+ it 'should enumerate item parents' do
166
+ subject.add(:table)
167
+ subject.add(:napkin)
168
+ subject.items[1].add(:cool_napkins)
169
+ subject.parents.count.should == 0
170
+ subject.items[0].parents.count.should == 1
171
+ subject.items[1].items[0].parents.count.should == 2
172
+ end
173
+
174
+ end
175
+
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+
4
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/emenu.rb'))
5
+
6
+ # Requires supporting files with custom matchers and macros, etc,
7
+ # in ./support/ and its subdirectories.
8
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
9
+
10
+ RSpec.configure do |config|
11
+ config.mock_with :mocha
12
+ end
metadata ADDED
@@ -0,0 +1,161 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: emenu
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Kresimir Bojcic
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-07-13 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: haml
16
+ requirement: &19076540 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 3.1.1
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *19076540
25
+ - !ruby/object:Gem::Dependency
26
+ name: activesupport
27
+ requirement: &18830380 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 3.0.3
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *18830380
36
+ - !ruby/object:Gem::Dependency
37
+ name: actionpack
38
+ requirement: &18829420 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 3.0.3
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *18829420
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec-rails
49
+ requirement: &18828340 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 2.3.0
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *18828340
58
+ - !ruby/object:Gem::Dependency
59
+ name: bundler
60
+ requirement: &18827640 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: 1.0.0
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *18827640
69
+ - !ruby/object:Gem::Dependency
70
+ name: jeweler
71
+ requirement: &18826840 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: 1.6.4
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *18826840
80
+ - !ruby/object:Gem::Dependency
81
+ name: rcov
82
+ requirement: &18825860 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *18825860
91
+ description: Enterprise class menus with simple ruby based configuration, easy to
92
+ make, easy to maintain
93
+ email: kresimir.bojcic@gmail.com
94
+ executables: []
95
+ extensions: []
96
+ extra_rdoc_files:
97
+ - LICENSE.txt
98
+ - README.rdoc
99
+ files:
100
+ - .document
101
+ - .rspec
102
+ - Gemfile
103
+ - Gemfile.lock
104
+ - LICENSE.txt
105
+ - README.rdoc
106
+ - Rakefile
107
+ - VERSION
108
+ - emenu.gemspec
109
+ - lib/emenu.rb
110
+ - lib/emenu/menu.rb
111
+ - lib/emenu/menu_config.rb
112
+ - lib/emenu/string.rb
113
+ - lib/generators/emenu/USAGE
114
+ - lib/generators/emenu/install_generator.rb
115
+ - lib/generators/emenu/templates/default_menu/navigation.rb
116
+ - lib/generators/emenu/templates/images/menu.png
117
+ - lib/generators/emenu/templates/images/menu_arrow.png
118
+ - lib/generators/emenu/templates/images/menu_border.png
119
+ - lib/generators/emenu/templates/images/menu_l.png
120
+ - lib/generators/emenu/templates/images/menu_l_selected.png
121
+ - lib/generators/emenu/templates/images/menu_minus.png
122
+ - lib/generators/emenu/templates/images/menu_plus.png
123
+ - lib/generators/emenu/templates/images/menu_r.png
124
+ - lib/generators/emenu/templates/images/menu_r_selected.png
125
+ - lib/generators/emenu/templates/images/menu_selected.png
126
+ - lib/generators/emenu/templates/javascripts/emenu.js
127
+ - lib/generators/emenu/templates/javascripts/jquery-1.4.2.min.js
128
+ - lib/generators/emenu/templates/stylesheets/emenu.css
129
+ - lib/generators/emenu/templates/stylesheets/reset.css
130
+ - spec/menu_config_spec.rb
131
+ - spec/menu_spec.rb
132
+ - spec/spec_helper.rb
133
+ homepage: http://github.com/drKreso/emenu
134
+ licenses:
135
+ - MIT
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ none: false
142
+ requirements:
143
+ - - ! '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ segments:
147
+ - 0
148
+ hash: 119215118386209543
149
+ required_rubygems_version: !ruby/object:Gem::Requirement
150
+ none: false
151
+ requirements:
152
+ - - ! '>='
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ requirements: []
156
+ rubyforge_project:
157
+ rubygems_version: 1.8.5
158
+ signing_key:
159
+ specification_version: 3
160
+ summary: Enterprise class menus
161
+ test_files: []