menumatic 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -6,5 +6,5 @@ gemspec
6
6
  gem 'rspec'
7
7
  gem 'autotest'
8
8
  gem 'autotest-growl'
9
- gem 'factory_girl'
9
+ gem 'capybara', :git => 'https://github.com/jnicklas/capybara.git'
10
10
  gem 'rails', '3.0.5'
data/Gemfile.lock CHANGED
@@ -1,7 +1,21 @@
1
+ GIT
2
+ remote: https://github.com/jnicklas/capybara.git
3
+ revision: 47dbcdfdf0ae5896586f0131250a64b2553115a0
4
+ specs:
5
+ capybara (0.4.1.1)
6
+ celerity (>= 0.7.9)
7
+ culerity (>= 0.2.4)
8
+ mime-types (>= 1.16)
9
+ nokogiri (>= 1.3.3)
10
+ rack (>= 1.0.0)
11
+ rack-test (>= 0.5.4)
12
+ selenium-webdriver (>= 0.0.27)
13
+ xpath (~> 0.1.3)
14
+
1
15
  PATH
2
16
  remote: .
3
17
  specs:
4
- menumatic (0.0.1)
18
+ menumatic (0.1.4)
5
19
 
6
20
  GEM
7
21
  remote: http://rubygems.org/
@@ -39,17 +53,24 @@ GEM
39
53
  ZenTest (>= 4.4.1)
40
54
  autotest-growl (0.2.9)
41
55
  builder (2.1.2)
56
+ celerity (0.8.8)
57
+ childprocess (0.1.7)
58
+ ffi (~> 0.6.3)
59
+ culerity (0.2.15)
42
60
  diff-lcs (1.1.2)
43
61
  erubis (2.6.6)
44
62
  abstract (>= 1.0.0)
45
- factory_girl (1.3.2)
63
+ ffi (0.6.3)
64
+ rake (>= 0.8.7)
46
65
  i18n (0.5.0)
66
+ json_pure (1.5.1)
47
67
  mail (2.2.15)
48
68
  activesupport (>= 2.3.6)
49
69
  i18n (>= 0.4.0)
50
70
  mime-types (~> 1.16)
51
71
  treetop (~> 1.4.8)
52
72
  mime-types (1.16)
73
+ nokogiri (1.4.4)
53
74
  polyglot (0.3.1)
54
75
  rack (1.2.1)
55
76
  rack-mount (0.6.13)
@@ -78,10 +99,18 @@ GEM
78
99
  rspec-expectations (2.5.0)
79
100
  diff-lcs (~> 1.1.2)
80
101
  rspec-mocks (2.5.0)
102
+ rubyzip (0.9.4)
103
+ selenium-webdriver (0.1.3)
104
+ childprocess (~> 0.1.5)
105
+ ffi (~> 0.6.3)
106
+ json_pure
107
+ rubyzip
81
108
  thor (0.14.6)
82
109
  treetop (1.4.9)
83
110
  polyglot (>= 0.3.1)
84
111
  tzinfo (0.3.24)
112
+ xpath (0.1.3)
113
+ nokogiri (~> 1.3)
85
114
 
86
115
  PLATFORMS
87
116
  ruby
@@ -89,7 +118,7 @@ PLATFORMS
89
118
  DEPENDENCIES
90
119
  autotest
91
120
  autotest-growl
92
- factory_girl
121
+ capybara!
93
122
  menumatic!
94
- rails (~> 3.0.4)
123
+ rails (= 3.0.5)
95
124
  rspec
data/README.md CHANGED
@@ -55,7 +55,7 @@ Inside your navigation file, you can then define the structure of your
55
55
  navigation, here is an example taken from the [Menumatic example
56
56
  application](http://github.com/thetron/menumatic-sample-application):
57
57
 
58
- navigate_to "Home", home_path, :active_on => [:home_path, :root_path]
58
+ navigate_to "Home", home_path, :active_on => [home_path, root_path]
59
59
  navigate_to "About", about_path
60
60
  navigate_to "Store", store_on_special_path do |store|
61
61
  store.navigate_to "On special", store_on_special_path
@@ -135,11 +135,8 @@ some feedback!
135
135
 
136
136
  This is what I have planned for some future releases:
137
137
 
138
- * __Tests__ I know I should've been doing this properly from the start,
139
- but i'm still trying to get my head around TDD. However, this is definitely a
140
- big priority for Menumatic.
141
-
142
- * __More configuration options__
138
+ * Better test coverage
139
+ * More configuration options
143
140
 
144
141
 
145
142
  # Credits
@@ -16,7 +16,7 @@ module Menumatic
16
16
  end
17
17
 
18
18
  def sitemap(document, navigation_id = "application", options = {})
19
- navigation = load_navigation(navigation_id)
19
+ navigation = Menumatic::Navigation::Base.load_navigation(navigation_id)
20
20
  navigation.root.render_sitemap(document, request, options)
21
21
  end
22
22
  end
@@ -39,9 +39,8 @@ module Menumatic
39
39
  # render link
40
40
  link = ""
41
41
  link = link_to(self.label, self.destination, self.html_options).html_safe if self.is_link? && !options[:group]
42
-
43
42
  if on_valid_level?(options[:levels], options[:current_level])
44
- if options[:current_level] == 1 || (self.is_group? && options[:group] == self.group_id)
43
+ if (options[:current_level] == 1 && self.is_group?) || (self.is_group? && options[:group] == self.group_id)
45
44
  list.html_safe
46
45
  elsif options[:show] == :all || self.is_active?(request)
47
46
  content_tag(options[:item_tag], link.to_s + list.to_s, html_options.merge_with_join(self.wrapper_options)).to_s.html_safe
@@ -95,26 +94,26 @@ module Menumatic
95
94
  end
96
95
 
97
96
  def depth_count(request, options = {})
98
- return options[:levels].count unless options[:levels].empty?
97
+ return options[:levels].count if options[:levels] && !options[:levels].empty?
99
98
  count_active_descendants(request)
100
99
  end
101
100
 
102
101
  def paths_match?(request)
103
102
  if self.is_link?
104
103
  self.active_paths.each do |path|
105
- return true if path.is_a?(Regexp) && (request.fullpath =~ path || request.url =~ path)
106
- return true if path.is_a?(String) && (request.fullpath == path || request.url == path)
104
+ return true if path.is_a?(Regexp) && (request.fullpath.split('?').first =~ path || request.url.split('?').first =~ path)
105
+ return true if path.is_a?(String) && (request.fullpath.split('?').first == path || request.url.split('?').first == path)
107
106
  end
108
- return request.fullpath == self.destination || request.url == self.destination if self.active_paths.empty?
107
+ return request.fullpath.split('?').first == self.destination || request.url.split('?').first == self.destination if self.active_paths.empty?
109
108
  end
110
109
  end
111
110
 
112
111
  def on_valid_level?(levels, current_level)
113
- levels_to_i(levels).include?(current_level-1) || levels.empty?
112
+ levels.nil? || levels.empty? || levels_to_i(levels).include?(current_level-1)
114
113
  end
115
114
 
116
115
  def levels_to_i(levels_in_words)
117
- levels_in_words.map{ |word| word.is_a?(Symbol) ? @@level_options.index(word.to_sym) + 1 : word }
116
+ levels_in_words.map{ |word| word.is_a?(Symbol) ? @@level_options.index(word.to_sym) + 1 : word } if levels_in_words
118
117
  end
119
118
  end
120
119
  end
@@ -6,6 +6,8 @@ module Menumatic
6
6
  attr_accessor :id, :root
7
7
 
8
8
  class << self
9
+ include Rails.application.routes.url_helpers if Rails && Rails.application
10
+
9
11
  def navigate_to(label, destination, options = {})
10
12
  if block_given?
11
13
  item = self.get_instance.root.navigate_to(label, destination, options, &Proc.new)
@@ -1,3 +1,3 @@
1
1
  module Menumatic
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
data/lib/menumatic.rb CHANGED
@@ -18,6 +18,7 @@ module Menumatic
18
18
  #autoload :SitemapController, '../app/controllers/menumatic
19
19
  end
20
20
 
21
+ require 'rails'
21
22
  require 'menumatic/rails/routes'
22
23
  require 'menumatic/rails/rendering'
23
24
  require 'menumatic/engine'
data/spec/factories.rb CHANGED
@@ -1,6 +0,0 @@
1
- Factory.define :request do |f|
2
- f.full_path '/'
3
- f.host 'lvh.me'
4
- f.port '3000'
5
- f.url 'http://lvh.me:3000/'
6
- end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe Menumatic::Navigation::Item::Group do
4
+ before :each do
5
+ @group = Menumatic::Navigation::Item::Group.new(:test_group, {})
6
+ @group.navigate_to("Home", "/home")
7
+ @group.navigate_to("About", "/about")
8
+ @group.navigate_to("Contact us", "/contact_us")
9
+ end
10
+
11
+ it "should have a group ID" do
12
+ @group.respond_to?(:group_id).should == true
13
+ end
14
+
15
+ it "should render a list containing its child items" do
16
+ html = Capybara.string @group.render(@request)
17
+ html.should have_selector('ul.level_1')
18
+ html.should have_selector('ul.level_1 > li > a[href="/home"]')
19
+ html.should have_selector('ul.level_1 > li > a[href="/about"]')
20
+ html.should have_selector('ul.level_1 > li > a[href="/contact_us"]')
21
+ end
22
+ end
data/spec/link_spec.rb CHANGED
@@ -1,17 +1,12 @@
1
1
  require 'spec_helper'
2
- require 'active_resource/http_mock'
3
2
 
4
3
  describe Menumatic::Navigation::Item::Link do
5
4
 
6
5
  before :each do
7
6
  @label = "Search"
8
- @destination = "/search"
7
+ @destination = @request.fullpath
9
8
  @options = {}
10
9
  @link = Menumatic::Navigation::Item::Link.new(@label, @destination, @options)
11
-
12
- ActiveResource::HttpMock.respond_to do |mock|
13
- mock.get '/search', {}, ''
14
- end
15
10
  end
16
11
 
17
12
  it "should have a label" do
@@ -33,20 +28,29 @@ describe Menumatic::Navigation::Item::Link do
33
28
  end
34
29
 
35
30
  it "should be active when destination is the same as the request path" do
36
- request = ActiveResource::Request.new(:get, @link.destination)
37
- @link.is_active?(request).should == true
31
+ @link.is_active?(@request).should == true
32
+ end
33
+
34
+ it "should be active when destination is the same as the request path and the request path includes a get param" do
35
+ @request.stub!(:fullpath).and_return("/search?text=a%20search&page=1")
36
+ @link.is_active?(@request).should == true
38
37
  end
39
38
 
40
39
  it "should not be active when destination is not the same as the request path" do
41
- @link.is_active?(request).should == false
40
+ @link.destination = "/home"
41
+ @link.is_active?(@request).should == false
42
42
  end
43
43
 
44
- it "should be able to parent links"
45
- it "should be able to parent groups"
44
+ it "should be able to parent links" do
45
+ @link.navigate_to("Contact us", "/contact_us")
46
+ @link.items.first.is_link?.should == true
47
+ @link.items.first.label.should == "Contact us"
48
+ @link.items.first.destination.should == "/contact_us"
49
+ end
46
50
 
47
- it "should render a list item containing only a link when it has no children"
48
- it "should render a list item containing only a link when it has no active descendants"
49
- it "should render a list item containing an active link when active"
50
- it "should render a list item containing a list of its children when active"
51
- it "should render a list item containing an active link and a list of its children when it has an active descendant"
51
+ it "should be able to parent groups" do
52
+ @link.group(:sidebar)
53
+ @link.items.first.is_group?.should == true
54
+ @link.items.first.group_id.should == :sidebar
55
+ end
52
56
  end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe Menumatic::Navigation::Item::Group do
4
+ before :each do
5
+ # build a reasonably complex navigation and ensure that it's
6
+ # properly stored for retreival
7
+ end
8
+
9
+ it "should be reloadable from it's ID"
10
+ it "should reload between renders"
11
+ it "should have a depth of 1 if no items are active"
12
+ it "should have a depth of 1 if a first-level child is active"
13
+ it "should have a depth of 2 if a second-level child is active"
14
+ it "should have a depth of 3 if a third-level child is active"
15
+ it "should have each level labelled in sequence starting at 1"
16
+ it "should be able to display all links"
17
+ it "should be able to render a different list tag"
18
+ it "should be able to render a different item tag"
19
+ it "should render different "
20
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe Menumatic::Navigation::Item::Base do
4
+ before :each do
5
+ @item = Menumatic::Navigation::Item::Base.new()
6
+ end
7
+
8
+ it "should have items" do
9
+ @item.respond_to?(:items).should == true
10
+ @item.items.is_a?(Array).should == true
11
+ end
12
+
13
+ it "should have html options" do
14
+ @item.respond_to?(:html_options).should == true
15
+ @item.html_options.is_a?(Hash).should == true
16
+ end
17
+
18
+ it "should have wrapper options" do
19
+ @item.respond_to?(:wrapper_options).should == true
20
+ @item.wrapper_options.is_a?(Hash).should == true
21
+ end
22
+
23
+ it "should test if it is a link" do
24
+ @item.respond_to?(:is_link?).should == true
25
+ end
26
+
27
+ it "should test if it is a group" do
28
+ @item.respond_to?(:is_group?).should == true
29
+ end
30
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe Menumatic::Navigation::Item::Renderers do
4
+ before :each do
5
+ @label = "Search"
6
+ @destination = @request.fullpath
7
+ @options = {}
8
+ @link = Menumatic::Navigation::Item::Link.new(@label, @destination, @options)
9
+ end
10
+
11
+ it "should render a list item containing only a link when it has no children" do
12
+ html = Capybara.string @link.render(@request)
13
+ html.should have_selector('li a')
14
+ html.should_not have_selector('li ul')
15
+ end
16
+
17
+ it "should render a list item containing only a link when it has no active descendants" do
18
+ @link.navigate_to("Child link", "/page/something_unrelated")
19
+ @link.destination = "/page"
20
+ html = Capybara.string @link.render(@request)
21
+ html.should have_selector('li a')
22
+ html.should_not have_selector('li ul')
23
+ end
24
+
25
+ it "should render a list item containing an active link when active" do
26
+ html = Capybara.string @link.render(@request)
27
+ html.should have_selector('li.active a')
28
+ end
29
+
30
+ it "should render a list item containing a list of its children when active" do
31
+ @link.navigate_to("Child link 1", "/page/child_1")
32
+ @link.navigate_to("Child link 2", "/page/child_2")
33
+ html = Capybara.string @link.render(@request)
34
+ html.should have_selector('li ul li a[href="/page/child_1"]')
35
+ html.should have_selector('li ul li a[href="/page/child_2"]')
36
+ end
37
+
38
+ it "should render a list item containing an active link and a list of its children when it has an active descendant" do
39
+ @link.destination = "/home"
40
+
41
+ @link.navigate_to "Child link 1", "/page/child_1" do |child|
42
+ child.navigate_to "Search", @request.fullpath
43
+ end
44
+ @link.navigate_to "Child link 2", "/page/child_2"
45
+
46
+ html = Capybara.string @link.render(@request)
47
+ html.should have_selector('li > ul.active')
48
+ html.should have_selector("li > ul.active > li.active > ul.active > li.active > a[href='#{@request.fullpath}']")
49
+ end
50
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,14 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
3
 
4
+ require 'capybara'
4
5
  require 'action_controller'
5
6
  require 'menumatic'
6
7
 
7
8
  RSpec.configure do |config|
8
-
9
+ config.before :each do
10
+ @request = mock(:request)
11
+ @request.stub!(:fullpath).and_return("/search")
12
+ @request.stub!(:url).and_return("http://test.menumatic.com/search")
13
+ end
9
14
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: menumatic
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 4
10
- version: 0.1.4
9
+ - 5
10
+ version: 0.1.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Nicholas Bruning
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-10 00:00:00 +11:00
18
+ date: 2011-03-13 00:00:00 +11:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -63,7 +63,11 @@ files:
63
63
  - lib/menumatic/version.rb
64
64
  - menumatic.gemspec
65
65
  - spec/factories.rb
66
+ - spec/group_spec.rb
66
67
  - spec/link_spec.rb
68
+ - spec/navigation_helper_spec.rb
69
+ - spec/navigation_spec.rb
70
+ - spec/renderer_spec.rb
67
71
  - spec/spec_helper.rb
68
72
  has_rdoc: true
69
73
  homepage: http://github.com/thetron/menumatic
@@ -101,5 +105,9 @@ specification_version: 3
101
105
  summary: Menumatic is a Rails 3 gem which aims to simplify building complex website navigation
102
106
  test_files:
103
107
  - spec/factories.rb
108
+ - spec/group_spec.rb
104
109
  - spec/link_spec.rb
110
+ - spec/navigation_helper_spec.rb
111
+ - spec/navigation_spec.rb
112
+ - spec/renderer_spec.rb
105
113
  - spec/spec_helper.rb