happy-nav 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Andy Pearson
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,17 @@
1
+ = happy-nav
2
+
3
+ Happy Nav is the easy (and cheerful) way to create structured HTML for you site navigation.
4
+
5
+ == Note on Patches/Pull Requests
6
+
7
+ * Fork the project.
8
+ * Make your feature addition or bug fix.
9
+ * Add tests for it. This is important so I don't break it in a
10
+ future version unintentionally.
11
+ * Commit, do not mess with rakefile, version, or history.
12
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
13
+ * Send me a pull request. Bonus points for topic branches.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2010 Andy Pearson. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,46 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rspec/core/rake_task'
4
+
5
+ begin
6
+ require 'jeweler'
7
+ Jeweler::Tasks.new do |gem|
8
+ gem.name = "happy-nav"
9
+ gem.summary = %Q{Happy Nav is the easy (and cheerful) way to create structured HTML for your site navigation.}
10
+ gem.description = %Q{Happy Nav is the easy (and cheerful) way to create structured HTML for your site navigation.}
11
+ gem.email = "andy@andy-pearson.com"
12
+ gem.homepage = "http://github.com/andypearson/happy-nav"
13
+ gem.authors = ["Andy Pearson"]
14
+ end
15
+ Jeweler::GemcutterTasks.new
16
+ rescue LoadError
17
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
18
+ end
19
+
20
+ desc 'Test the happ-nav plugin.'
21
+ RSpec::Core::RakeTask.new('spec') do |t|
22
+ t.pattern = FileList['spec/**/*_spec.rb']
23
+ end
24
+
25
+ begin
26
+ require 'rcov/rcovtask'
27
+ Rcov::RcovTask.new do |test|
28
+ test.libs << 'test'
29
+ test.pattern = 'test/**/test_*.rb'
30
+ test.verbose = true
31
+ end
32
+ rescue LoadError
33
+ task :rcov do
34
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
35
+ end
36
+ end
37
+
38
+ require 'rake/rdoctask'
39
+ Rake::RDocTask.new do |rdoc|
40
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
41
+
42
+ rdoc.rdoc_dir = 'rdoc'
43
+ rdoc.title = "happy-nav #{version}"
44
+ rdoc.rdoc_files.include('README*')
45
+ rdoc.rdoc_files.include('lib/**/*.rb')
46
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,137 @@
1
+ class NavigationPresenter
2
+
3
+ include ActionView::Helpers::TagHelper
4
+
5
+ attr_accessor :items, :options
6
+
7
+ def initialize(items = [], options = {}, current_items = [])
8
+ @items = items
9
+ @options = options
10
+ @current_items = current_items
11
+ end
12
+
13
+ def to_html
14
+ unless @items.empty?
15
+ wrap do
16
+ h.content_tag :ul, :class => @options[:class] do i=0
17
+ content = ''
18
+ @items.each do |item| i=i+1
19
+ content += h.content_tag :li, :class => classes(i) do
20
+ item_link(item) + nested_navigation(item).to_s
21
+ end
22
+ end
23
+ content.html_safe
24
+ end
25
+ end
26
+ else
27
+ ''
28
+ end
29
+ end
30
+
31
+ def nested_navigation(item)
32
+ unless @options[:flat]
33
+ item = format_item(item)
34
+ if item[:items] && current_item?(item[:permalink])
35
+ options = {
36
+ :level => next_level,
37
+ :class => 'nav-sub-' + next_level.to_s,
38
+ :base_url => item[:url],
39
+ :wrap => false
40
+ }
41
+ NavigationPresenter.new(item[:items], options, @current_items[1..-1]).to_html
42
+ end
43
+ end
44
+ end
45
+
46
+ def item_link(item, options = {})
47
+
48
+ item = format_item(item, options)
49
+ content = item[:text]
50
+
51
+ if item[:summary]
52
+ item[:title] += ': '+item[:summary]
53
+ content = h.content_tag(:strong, content) + ' ' + content_tag(:em, item[:summary])
54
+ end
55
+
56
+ if item[:id] || @options[:id]
57
+ item[:id] = item[:permalink] if @options[:id] === true || item[:id] === true
58
+ item[:id] = "nav_#{item[:id]}"
59
+ end
60
+
61
+ h.link_to content, item[:url], {
62
+ :id => item[:id],
63
+ :class => (current_item?(item[:permalink]) ? 'current' : nil),
64
+ :title => item[:title],
65
+ }
66
+ end
67
+
68
+ def item_url(text)
69
+ if (text == 'Home')
70
+ admin? ? '/admin' : '/'
71
+ else
72
+ base_url + '/' + text.parameterize('-')
73
+ end
74
+ end
75
+
76
+ def base_url
77
+ if options[:base_url]
78
+ options[:base_url]
79
+ else
80
+ admin? ? '/admin' : ''
81
+ end
82
+ end
83
+
84
+ def current_item(current_item)
85
+ @current_items << current_item
86
+ end
87
+
88
+ private
89
+
90
+ def h
91
+ ActionController::Base.helpers
92
+ end
93
+
94
+ def classes(i)
95
+ classes = []
96
+ classes << 'first' if i==1
97
+ classes << 'last' if i==@items.length
98
+ !classes.empty? ? classes.join(' ') : nil
99
+ end
100
+
101
+ def current_item?(permalink)
102
+ !@current_items.empty? && permalink == @current_items.first.parameterize('-')
103
+ end
104
+
105
+ def admin?
106
+ @options[:admin]
107
+ end
108
+
109
+ def format_item(item, options = {})
110
+ item = { :text => item } if item.kind_of? String
111
+ item = item.merge(options)
112
+ item[:id] = nil if !item[:id]
113
+ item[:url] = item_url(item[:text]) if !item[:url]
114
+ item[:title] = item[:text] if !item[:title]
115
+ item[:permalink] = item[:text].parameterize('-') if !item[:permalink]
116
+ item
117
+ end
118
+
119
+ def current_level
120
+ @options[:level] ||= 0
121
+ end
122
+
123
+ def next_level
124
+ current_level + 1
125
+ end
126
+
127
+ def wrap(&block)
128
+ if @options[:wrap] === false
129
+ yield
130
+ else
131
+ h.content_tag :div, { :class => 'nav' } do
132
+ yield
133
+ end
134
+ end
135
+ end
136
+
137
+ end
@@ -0,0 +1,10 @@
1
+ require 'happy-nav'
2
+ require 'rails'
3
+
4
+ module HappyNav
5
+ class Railtie < Rails::Railtie
6
+ initializer 'happy-nav.initialize', :after => :after_initialize do
7
+ ActionView::Base.send :include, HappyNav
8
+ end
9
+ end
10
+ end
data/lib/happy-nav.rb ADDED
@@ -0,0 +1,23 @@
1
+ require File.join(File.dirname(__FILE__), *%w[happy-nav navigation_presenter])
2
+ require File.join(File.dirname(__FILE__), *%w[happy-nav railtie]) if defined?(::Rails::Railtie)
3
+
4
+ module HappyNav
5
+
6
+ def navigation(items = [], options = {})
7
+ unless items.empty?
8
+ @navigation_presenter = NavigationPresenter.new(items, options)
9
+ if @current_pages
10
+ @current_pages.each { |page| @navigation_presenter.current_item(page) }
11
+ end
12
+ @navigation = @navigation_presenter.to_html
13
+ end
14
+ @navigation ||= ''
15
+ end
16
+
17
+ def current_page(page = nil)
18
+ @current_pages ||= []
19
+ @current_pages << page if page
20
+ @current_pages.first
21
+ end
22
+
23
+ end
@@ -0,0 +1,103 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe 'Happy Nav!' do
4
+
5
+ include SpecHelperMethods
6
+
7
+ before do
8
+ @view = ActionView::Base.new
9
+ end
10
+
11
+ describe 'after loading the plugin' do
12
+
13
+ it "should be mixed into ActionView::Base" do
14
+ ActionView::Base.included_modules.include?(HappyNav).should be_true
15
+ end
16
+
17
+ it 'should respond to happy_title helper' do
18
+ @view.should respond_to(:navigation)
19
+ end
20
+
21
+ it 'should respond to title helper' do
22
+ @view.should respond_to(:current_page)
23
+ end
24
+
25
+ end
26
+
27
+ describe '#navigation' do
28
+
29
+ before do
30
+ @items = ['Home', 'About', 'Our Services', 'Contact']
31
+ @output = <<-eos
32
+ <div class="nav">
33
+ <ul>
34
+ <li class="first"><a href="/" title="Home">Home</a></li>
35
+ <li><a href="/about" title="About">About</a></li>
36
+ <li><a href="/our-services" title="Our Services">Our Services</a></li>
37
+ <li class="last"><a href="/contact" title="Contact">Contact</a></li>
38
+ </ul>
39
+ </div>
40
+ eos
41
+ end
42
+
43
+ it 'should always return a string' do
44
+ @view.navigation.should be_a(String)
45
+ end
46
+
47
+ it 'should return blank if there are no items' do
48
+ @view.navigation.should == ''
49
+ end
50
+
51
+ it 'should return the formatted navigation if there are items' do
52
+ @view.navigation(@items).should == clean_string(@output)
53
+ end
54
+
55
+ it 'should return the generated navigation multiple times' do
56
+ output = ''
57
+ output += @view.navigation(@items)
58
+ output += @view.navigation
59
+ output += @view.navigation
60
+
61
+ output.should == clean_string(@output+@output+@output)
62
+ end
63
+
64
+ it 'should regenerate the navigation if new items are passed' do
65
+ output = <<-eos
66
+ <div class="nav">
67
+ <ul>
68
+ <li class="first last"><a href="/about" title="About">About</a></li>
69
+ </ul>
70
+ </div>
71
+ eos
72
+ @view.navigation(@items).should == clean_string(@output)
73
+ @view.navigation(['About']).should == clean_string(output)
74
+ end
75
+
76
+ end
77
+
78
+ describe '#current_page' do
79
+
80
+ it 'should be nil by default' do
81
+ @view.current_page.should == nil
82
+ end
83
+
84
+ it 'should mark the current page' do
85
+ @view.current_page('Home')
86
+ @view.current_page.should == 'Home'
87
+ end
88
+
89
+ it 'should render a navigation with the current page' do
90
+ output = <<-eos
91
+ <div class="nav">
92
+ <ul>
93
+ <li class="first last"><a href="/about" class="current" title="About">About</a></li>
94
+ </ul>
95
+ </div>
96
+ eos
97
+ @view.current_page('About')
98
+ @view.navigation(['About']).should == clean_string(output)
99
+ end
100
+
101
+ end
102
+
103
+ end
@@ -0,0 +1,261 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe NavigationPresenter do
4
+
5
+ include SpecHelperMethods
6
+
7
+ before do
8
+ @items = ['Home', 'About', 'Our Services', 'Contact']
9
+ @output = <<-eos
10
+ <div class="nav">
11
+ <ul>
12
+ <li class="first"><a href="/" title="Home">Home</a></li>
13
+ <li><a href="/about" title="About">About</a></li>
14
+ <li><a href="/our-services" title="Our Services">Our Services</a></li>
15
+ <li class="last"><a href="/contact" title="Contact">Contact</a></li>
16
+ </ul>
17
+ </div>
18
+ eos
19
+ end
20
+
21
+ describe '#to_html' do
22
+
23
+ it 'should return an empty string with no items' do
24
+ NavigationPresenter.new.to_html.should == ''
25
+ end
26
+
27
+ it 'should always return a string' do
28
+ NavigationPresenter.new.to_html.should be_a(String)
29
+ NavigationPresenter.new(@items).to_html.should be_a(String)
30
+ end
31
+
32
+ it 'should return a formatted navigation if there are items' do
33
+ NavigationPresenter.new(@items).to_html.should == clean_string(@output)
34
+ end
35
+
36
+ it 'should correctly format a single item' do
37
+ output = <<-eos
38
+ <div class="nav">
39
+ <ul>
40
+ <li class="first last"><a href="/about" title="About">About</a></li>
41
+ </ul>
42
+ </div>
43
+ eos
44
+
45
+ NavigationPresenter.new(['About']).to_html.should == clean_string(output)
46
+ end
47
+
48
+ it 'should add an id to all links' do
49
+ output = <<-eos
50
+ <div class="nav">
51
+ <ul>
52
+ <li class="first"><a href="/" id="nav_home" title="Home">Home</a></li>
53
+ <li class="last"><a href="/contact" id="nav_contact" title="Contact">Contact</a></li>
54
+ </ul>
55
+ </div>
56
+ eos
57
+
58
+ NavigationPresenter.new(['Home', 'Contact'], :id => true).to_html.should == clean_string(output)
59
+ end
60
+
61
+ it 'should add a class to the unordered list' do
62
+ output = <<-eos
63
+ <div class="nav">
64
+ <ul class="ul-class">
65
+ <li class="first last"><a href="/about" title="About">About</a></li>
66
+ </ul>
67
+ </div>
68
+ eos
69
+
70
+ NavigationPresenter.new(['About'], :class => 'ul-class').to_html.should == clean_string(output)
71
+ end
72
+
73
+ it 'should not wrap the unordered list in a div' do
74
+ output = <<-eos
75
+ <ul>
76
+ <li class="first last"><a href="/about" title="About">About</a></li>
77
+ </ul>
78
+ eos
79
+
80
+ NavigationPresenter.new(['About'], :wrap => false).to_html.should == clean_string(output)
81
+ end
82
+
83
+ describe 'with nested items' do
84
+
85
+ before do
86
+ @items = [
87
+ 'Home',
88
+ {
89
+ :text => 'About Us',
90
+ :items => [
91
+ {
92
+ :text => 'Team',
93
+ :items => [
94
+ 'Guybrush Threepwood',
95
+ 'Ghost Pirate LeChuck'
96
+ ]
97
+ }
98
+ ]
99
+ },
100
+ {
101
+ :text => 'Our Services',
102
+ :items => ['Swash buckling']
103
+ },
104
+ 'Contact'
105
+ ]
106
+ end
107
+
108
+ it 'should render nested navigation links' do
109
+ output = <<-eos
110
+ <div class="nav">
111
+ <ul>
112
+ <li class="first"><a href="/" title="Home">Home</a></li>
113
+ <li>
114
+ <a href="/about-us" class="current" title="About Us">About Us</a>
115
+ <ul class="nav-sub-1">
116
+ <li class="first last">
117
+ <a href="/about-us/team" class="current" title="Team">Team</a>
118
+ <ul class="nav-sub-2">
119
+ <li class="first"><a href="/about-us/team/guybrush-threepwood" class="current" title="Guybrush Threepwood">Guybrush Threepwood</a></li>
120
+ <li class="last"><a href="/about-us/team/ghost-pirate-lechuck" title="Ghost Pirate LeChuck">Ghost Pirate LeChuck</a></li>
121
+ </ul>
122
+ </li>
123
+ </ul>
124
+ </li>
125
+ <li><a href="/our-services" title="Our Services">Our Services</a></li>
126
+ <li class="last"><a href="/contact" title="Contact">Contact</a></li>
127
+ </ul>
128
+ </div>
129
+ eos
130
+ navigation_presenter = NavigationPresenter.new(@items)
131
+ navigation_presenter.current_item('About Us')
132
+ navigation_presenter.current_item('Team')
133
+ navigation_presenter.current_item('Guybrush Threepwood')
134
+ navigation_presenter.to_html.should == clean_string(output)
135
+ end
136
+
137
+ it 'should render a flat list if flat is passed as an option' do
138
+ output = <<-eos
139
+ <div class="nav">
140
+ <ul>
141
+ <li class="first"><a href="/" title="Home">Home</a></li>
142
+ <li><a href="/about-us" class="current" title="About Us">About Us</a></li>
143
+ <li><a href="/our-services" title="Our Services">Our Services</a></li>
144
+ <li class="last"><a href="/contact" title="Contact">Contact</a></li>
145
+ </ul>
146
+ </div>
147
+ eos
148
+ navigation_presenter = NavigationPresenter.new(@items, :flat => true)
149
+ navigation_presenter.current_item('About Us')
150
+ navigation_presenter.current_item('Team')
151
+ navigation_presenter.current_item('Guybrush Threepwood')
152
+ navigation_presenter.to_html.should == clean_string(output)
153
+ end
154
+
155
+ end
156
+
157
+ end
158
+
159
+ describe '#item_link' do
160
+
161
+ before do
162
+ @navigation = NavigationPresenter.new
163
+ end
164
+
165
+ it 'should always return a string' do
166
+ @navigation.item_link('Home').should be_a(String)
167
+ end
168
+
169
+ it 'should return a link with a title' do
170
+ @navigation.item_link('About').should == '<a href="/about" title="About">About</a>'
171
+ end
172
+
173
+ it 'should return a link to root if the page is "Home"' do
174
+ @navigation.item_link('Home').should == '<a href="/" title="Home">Home</a>'
175
+ end
176
+
177
+ it 'should allow customisation using a Hash' do
178
+ @navigation.item_link({
179
+ :text => 'Custom',
180
+ :url => '/linky',
181
+ :title => 'Custom Title'
182
+ }).should == '<a href="/linky" title="Custom Title">Custom</a>'
183
+ end
184
+
185
+ it 'should allow for a summary' do
186
+ @navigation.item_link({ :text => 'Summary', :summary => 'A quick summary...' }).should == '<a href="/summary" title="Summary: A quick summary..."><strong>Summary</strong> <em>A quick summary...</em></a>'
187
+ end
188
+
189
+ it 'should mark "About" as the current page' do
190
+ @navigation.current_item('About')
191
+ @navigation.item_link('About').should == '<a href="/about" class="current" title="About">About</a>'
192
+ end
193
+
194
+ it 'should allow for an id' do
195
+ @navigation.item_link({ :text => 'Linky', :id => true }).should == '<a href="/linky" id="nav_linky" title="Linky">Linky</a>'
196
+ end
197
+
198
+ it 'should allow for a custom id' do
199
+ @navigation.item_link({ :text => 'Linky', :id => 'custom' }).should == '<a href="/linky" id="nav_custom" title="Linky">Linky</a>'
200
+ end
201
+
202
+ end
203
+
204
+ describe '#item_url' do
205
+
206
+ before do
207
+ @navigation = NavigationPresenter.new
208
+ end
209
+
210
+ it 'should always return a string' do
211
+ @navigation.item_url('Home').should be_a(String)
212
+ end
213
+
214
+ it 'should return the path to root if the page is "Home"' do
215
+ @navigation.item_url('Home').should == '/'
216
+ end
217
+
218
+ it 'should return a path' do
219
+ @navigation.item_url('About').should == '/about'
220
+ end
221
+
222
+ it 'should path to the admin homepage' do
223
+ @navigation.stub!(:admin?).and_return(true)
224
+ @navigation.item_url('Home').should == '/admin'
225
+ end
226
+
227
+ it 'should path to the admin namespace' do
228
+ @navigation.stub!(:admin?).and_return(true)
229
+ @navigation.item_url('About').should == '/admin/about'
230
+ end
231
+
232
+ it 'should use the base_url option' do
233
+ @navigation.stub!(:options).and_return({ :base_url => '/example/base' })
234
+ @navigation.item_url('About').should == '/example/base/about'
235
+ end
236
+
237
+ end
238
+
239
+ describe '#admin?' do
240
+
241
+ before do
242
+ @navigation = NavigationPresenter.new
243
+ end
244
+
245
+ it 'should return false if the admin option is not set' do
246
+ @navigation.send(:admin?).should be_false
247
+ end
248
+
249
+ it 'should return false if the admin option is false' do
250
+ @navigation.options[:admin] = false
251
+ @navigation.send(:admin?).should be_false
252
+ end
253
+
254
+ it 'should return true if the admin option is true' do
255
+ @navigation.options[:admin] = true
256
+ @navigation.send(:admin?).should be_true
257
+ end
258
+
259
+ end
260
+
261
+ end
@@ -0,0 +1,16 @@
1
+ require 'active_support'
2
+ require 'action_pack'
3
+ require 'action_view'
4
+ require 'action_controller'
5
+
6
+ require File.join(File.dirname(__FILE__), "../lib/happy-nav")
7
+
8
+ ActionView::Base.class_eval do
9
+ include HappyNav
10
+ end
11
+
12
+ module SpecHelperMethods
13
+ def clean_string(s)
14
+ s.gsub(/^\s+/, "").gsub(/\n/, "")
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: happy-nav
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Andy Pearson
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-12-26 00:00:00 +00:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: Happy Nav is the easy (and cheerful) way to create structured HTML for your site navigation.
22
+ email: andy@andy-pearson.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files:
28
+ - LICENSE
29
+ - README.rdoc
30
+ files:
31
+ - .document
32
+ - .gitignore
33
+ - LICENSE
34
+ - README.rdoc
35
+ - Rakefile
36
+ - VERSION
37
+ - lib/happy-nav.rb
38
+ - lib/happy-nav/navigation_presenter.rb
39
+ - lib/happy-nav/railtie.rb
40
+ - spec/navigation_helper_spec.rb
41
+ - spec/navigation_presenter_spec.rb
42
+ - spec/spec_helper.rb
43
+ has_rdoc: true
44
+ homepage: http://github.com/andypearson/happy-nav
45
+ licenses: []
46
+
47
+ post_install_message:
48
+ rdoc_options:
49
+ - --charset=UTF-8
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ segments:
57
+ - 0
58
+ version: "0"
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ segments:
64
+ - 0
65
+ version: "0"
66
+ requirements: []
67
+
68
+ rubyforge_project:
69
+ rubygems_version: 1.3.6
70
+ signing_key:
71
+ specification_version: 3
72
+ summary: Happy Nav is the easy (and cheerful) way to create structured HTML for your site navigation.
73
+ test_files:
74
+ - spec/navigation_helper_spec.rb
75
+ - spec/navigation_presenter_spec.rb
76
+ - spec/spec_helper.rb