menu-rails 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -0
- data/README.md +38 -2
- data/app/models/menu_rails/menu.rb +33 -4
- data/app/models/menu_rails/menu_item.rb +64 -4
- data/lib/menu-rails.rb +9 -1
- data/lib/menu-rails/base_menu.rb +22 -0
- data/lib/menu-rails/engine.rb +8 -0
- data/lib/menu-rails/helpers.rb +9 -0
- data/lib/menu-rails/helpers/menu_helper.rb +49 -0
- data/lib/menu-rails/version.rb +1 -1
- data/spec/controllers/pages_controller_spec.rb +12 -0
- data/spec/factories.rb +2 -1
- data/spec/features/pages_spec.rb +30 -11
- data/spec/helpers/menu_helper_spec.rb +24 -0
- data/spec/internal/app/controllers/not_visible_controller.rb +2 -0
- data/spec/internal/app/controllers/pages_controller.rb +7 -0
- data/spec/internal/app/models/dummy_menu_item.rb +7 -0
- data/spec/internal/app/models/second_dummy_menu.rb +2 -0
- data/spec/internal/app/models/second_dummy_menu_item.rb +2 -0
- data/spec/internal/app/views/pages/about.html.erb +0 -0
- data/spec/internal/app/views/pages/dummy1.html.erb +0 -0
- data/spec/internal/app/views/pages/home.html.erb +7 -1
- data/spec/internal/config/menu-rails.yml +39 -37
- data/spec/internal/config/routes.rb +3 -0
- data/spec/models/menu_item_spec.rb +35 -7
- data/spec/models/menu_spec.rb +14 -1
- data/spec/spec_helper.rb +2 -1
- metadata +23 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ade3caa8f049fcfc1c044546241a52b7371f71ad
|
4
|
+
data.tar.gz: 8cb89b4157e51547765c190f2816616f6a365231
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 035ea5bade29a8ee20e619ee369b03c5b7da41c799638a4ebd1bd10bb7ee3ff40911c5b0d2381d87fd5bf854819b25d5d0c22b5aff8736aec8408fc406a82efb
|
7
|
+
data.tar.gz: 1c0a7fe369d2a1864011ec74a4fca203c8c8a275aebc85c5c06ef40237f97d1e16fd4e815f8e849aac401df79101b91adad2a592daeca61f403248dffa5160df
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0-p353
|
data/README.md
CHANGED
@@ -1,12 +1,43 @@
|
|
1
1
|
# menu-rails
|
2
2
|
|
3
|
-
|
3
|
+
This gem provide a set of helpers and methods that allow to easily generate a menu and identify
|
4
|
+
the currently active link item.
|
5
|
+
Comes with support to generate menu from a YAML file in config directory, but supports generation
|
6
|
+
even from database (or whatever you want).
|
7
|
+
|
8
|
+
## Features
|
9
|
+
|
10
|
+
- Threadsafe (not tested)
|
11
|
+
- Menu generation from YAML file
|
12
|
+
- Menu generation from any other source (database for example)
|
13
|
+
- Check which menu item is active
|
14
|
+
- Cancan support
|
15
|
+
|
16
|
+
## How to generate menu from database
|
17
|
+
|
18
|
+
You must create 2 classes which will respond to some methods:
|
19
|
+
|
20
|
+
A `Menu` class which must respond to:
|
21
|
+
|
22
|
+
- `all_menu_items` with an array of menu items
|
23
|
+
- Must `include MenuRails::BaseMenu`
|
24
|
+
|
25
|
+
A `MenuItem` class which must respond to:
|
26
|
+
|
27
|
+
- `url` *String* which must be a valid url
|
28
|
+
- `text` *String* which is text displayed to users
|
29
|
+
- `authorization` should return `nil` (will be displayed without checking through `can?`) or a hash like this:
|
30
|
+
`{ can: :read, class_name: 'ApplicationController' }` which will be used in `can?` method (view) and if false, will skip the item
|
31
|
+
- `active_controller_only` *Boolean* `false` if you want to check both against controller and action name if this link is currently active. If `true`, only controller will be checked
|
32
|
+
- `active_method` *Symbol* if not `nil`, will be called instead of standard `active?` method (and `active_controller_only` ignored)
|
33
|
+
|
34
|
+
The gem should be threadsafe
|
4
35
|
|
5
36
|
## Installation
|
6
37
|
|
7
38
|
Add this line to your application's Gemfile:
|
8
39
|
|
9
|
-
gem 'menu-rails', '~> 0.0
|
40
|
+
gem 'menu-rails', '~> 0.1.0'
|
10
41
|
|
11
42
|
And then execute:
|
12
43
|
|
@@ -20,6 +51,11 @@ Or install it yourself as:
|
|
20
51
|
|
21
52
|
TODO: Write usage instructions here
|
22
53
|
|
54
|
+
## TODO
|
55
|
+
|
56
|
+
- Split `Menu` and `MenuItem` classes into 2 pairs, `MenuBase` will not include anything related to `has_no_table`, same for `MenuItemBase`
|
57
|
+
- I18n support (very important, for menu text string)
|
58
|
+
|
23
59
|
## Contributing
|
24
60
|
|
25
61
|
1. Fork it
|
@@ -8,6 +8,7 @@ module MenuRails
|
|
8
8
|
|
9
9
|
class Menu < ActiveRecord::Base
|
10
10
|
include Symbolize::ActiveRecord
|
11
|
+
include MenuRails::BaseMenu
|
11
12
|
|
12
13
|
has_no_table
|
13
14
|
|
@@ -18,13 +19,28 @@ module MenuRails
|
|
18
19
|
|
19
20
|
symbolize :mrid
|
20
21
|
|
22
|
+
def get_menu_item_by_mriid(identifier)
|
23
|
+
self.menu_items.select{ |menu_item| menu_item.mriid == identifier.to_sym }.first
|
24
|
+
end
|
25
|
+
|
26
|
+
def all_menu_items
|
27
|
+
self.menu_items
|
28
|
+
end
|
29
|
+
|
21
30
|
private
|
22
31
|
|
23
32
|
def build_menu_items_from_yaml_data!(menu_items_data)
|
24
33
|
menu_items_data.each do |menu_item_data|
|
25
|
-
|
26
|
-
|
27
|
-
|
34
|
+
menu_item_params = menu_item_data.values.first.merge(mriid: menu_item_data.keys.first.to_sym)
|
35
|
+
overwrite_menu_item_class = menu_item_params.delete(:class_name)
|
36
|
+
if overwrite_menu_item_class.nil?
|
37
|
+
overwrite_menu_item_class = menu_item_class
|
38
|
+
else
|
39
|
+
overwrite_menu_item_class = overwrite_menu_item_class.constantize
|
40
|
+
end
|
41
|
+
menu_item = overwrite_menu_item_class.new(menu_item_params)
|
42
|
+
menu_item.menu = self
|
43
|
+
self.menu_items << menu_item
|
28
44
|
end
|
29
45
|
self.menu_items.freeze
|
30
46
|
|
@@ -32,6 +48,10 @@ module MenuRails
|
|
32
48
|
self
|
33
49
|
end
|
34
50
|
|
51
|
+
def menu_item_class
|
52
|
+
Rails.application.config.menu_rails.menu_item_class_name.constantize
|
53
|
+
end
|
54
|
+
|
35
55
|
class << self
|
36
56
|
|
37
57
|
SEMAPHORE = Mutex.new
|
@@ -44,7 +64,10 @@ module MenuRails
|
|
44
64
|
|
45
65
|
base_menu.each do |menu_identifier, menu|
|
46
66
|
mid_sym = menu_identifier.to_sym
|
47
|
-
|
67
|
+
overwrite_menu_class = menu.delete(:class_name)
|
68
|
+
overwrite_menu_class = overwrite_menu_class.nil? ? menu_class : overwrite_menu_class.constantize
|
69
|
+
@menu_by_mrid[mid_sym] = overwrite_menu_class.new(mrid: mid_sym).send( :build_menu_items_from_yaml_data!,
|
70
|
+
menu[:menu_items] ).freeze
|
48
71
|
end
|
49
72
|
end
|
50
73
|
|
@@ -52,6 +75,12 @@ module MenuRails
|
|
52
75
|
end
|
53
76
|
end
|
54
77
|
|
78
|
+
private
|
79
|
+
|
80
|
+
def menu_class
|
81
|
+
Rails.application.config.menu_rails.menu_class_name.constantize
|
82
|
+
end
|
83
|
+
|
55
84
|
end
|
56
85
|
|
57
86
|
end
|
@@ -1,21 +1,81 @@
|
|
1
1
|
require 'activerecord-tableless'
|
2
2
|
require 'symbolize'
|
3
|
+
require 'active_support/all'
|
3
4
|
|
4
5
|
module MenuRails
|
5
6
|
|
6
7
|
class MenuItem < ActiveRecord::Base
|
7
8
|
include Symbolize::ActiveRecord
|
9
|
+
include Rails.application.routes.url_helpers
|
8
10
|
|
9
11
|
has_no_table
|
10
12
|
|
11
|
-
column :menu_id,
|
13
|
+
column :menu_id, :integer
|
12
14
|
# Stands for MenuRails Item ID
|
13
|
-
column :mriid,
|
14
|
-
column :text,
|
15
|
+
column :mriid, :string
|
16
|
+
column :text, :string
|
17
|
+
column :authorization_can, :string
|
18
|
+
column :authorization_class_name, :string
|
19
|
+
column :url_method, :string
|
20
|
+
column :url_text, :string
|
21
|
+
column :active_controller_only, :boolean
|
22
|
+
column :active_method, :string
|
15
23
|
|
16
24
|
belongs_to :menu
|
17
25
|
|
18
|
-
symbolize :mriid
|
26
|
+
symbolize :mriid, :authorization_can, :url_method, :active_method
|
27
|
+
|
28
|
+
validates :text, presence: true
|
29
|
+
validates :url_method, presence: { if: -> { self.url_text.blank? } }
|
30
|
+
validates :url_text, presence: { if: -> { self.url_method.blank? } }
|
31
|
+
|
32
|
+
def url=(value)
|
33
|
+
if value.kind_of? String
|
34
|
+
self.url_text = value
|
35
|
+
elsif value.kind_of? Symbol
|
36
|
+
self.url_method = value
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def url
|
41
|
+
self.url_is_string? ? url_for(self.url_text) : send(self.url_method)
|
42
|
+
end
|
43
|
+
|
44
|
+
def authorization=(value)
|
45
|
+
self.authorization_can = value[:can]
|
46
|
+
self.authorization_class_name = value[:class_name]
|
47
|
+
end
|
48
|
+
|
49
|
+
def authorization
|
50
|
+
return nil if self.authorization_can.nil? || self.authorization_class_name.blank?
|
51
|
+
|
52
|
+
{ can: self.authorization_can, class_name: self.authorization_class_name }
|
53
|
+
end
|
54
|
+
|
55
|
+
def active=(value)
|
56
|
+
self.active_controller_only = value[:controller_only]
|
57
|
+
self.active_method = value[:method]
|
58
|
+
end
|
59
|
+
|
60
|
+
def active?
|
61
|
+
return send(self.active_method) unless self.active_method.nil?
|
62
|
+
return false if self.url_is_string?
|
63
|
+
|
64
|
+
result = self.menu.controller.controller_name == Rails.application.routes.recognize_path(self.url)[:controller]
|
65
|
+
unless self.active_controller_only?
|
66
|
+
result &&= self.menu.controller.action_name == Rails.application.routes.recognize_path(self.url)[:action]
|
67
|
+
end
|
68
|
+
|
69
|
+
result
|
70
|
+
end
|
71
|
+
|
72
|
+
def to_s
|
73
|
+
self.text
|
74
|
+
end
|
75
|
+
|
76
|
+
def url_is_string?
|
77
|
+
self.url_method.nil?
|
78
|
+
end
|
19
79
|
|
20
80
|
end
|
21
81
|
|
data/lib/menu-rails.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
|
-
require
|
1
|
+
require 'menu-rails/version'
|
2
|
+
require 'menu-rails/helpers'
|
2
3
|
|
3
4
|
module MenuRails
|
5
|
+
autoload :BaseMenu, 'menu-rails/base_menu'
|
6
|
+
|
7
|
+
mattr_accessor :menu_class_name
|
8
|
+
@@menu_class_name = 'MenuRails::Menu'
|
9
|
+
|
10
|
+
mattr_accessor :menu_item_class_name
|
11
|
+
@@menu_item_class_name = 'MenuRails::MenuItem'
|
4
12
|
end
|
5
13
|
|
6
14
|
# load Rails/Railtie
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module MenuRails
|
2
|
+
|
3
|
+
module BaseMenu
|
4
|
+
|
5
|
+
def display_for_controller(tmp_controller)
|
6
|
+
old_controller = @controller
|
7
|
+
@controller = tmp_controller
|
8
|
+
block_result = yield
|
9
|
+
@controller = old_controller
|
10
|
+
|
11
|
+
block_result
|
12
|
+
end
|
13
|
+
|
14
|
+
def controller
|
15
|
+
raise 'Controller not valid if not displaying menu' if @controller.nil?
|
16
|
+
|
17
|
+
@controller
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/lib/menu-rails/engine.rb
CHANGED
@@ -3,5 +3,13 @@ require 'rails'
|
|
3
3
|
module MenuRails #:nodoc:
|
4
4
|
class Engine < ::Rails::Engine #:nodoc:
|
5
5
|
isolate_namespace MenuRails
|
6
|
+
|
7
|
+
config.menu_rails = MenuRails
|
8
|
+
|
9
|
+
initializer "menu-rails.helpers" do
|
10
|
+
ActiveSupport.on_load(:action_view) do
|
11
|
+
include MenuRails::Helpers::MenuHelper
|
12
|
+
end
|
13
|
+
end
|
6
14
|
end
|
7
15
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module MenuRails::Helpers
|
2
|
+
|
3
|
+
module MenuHelper
|
4
|
+
|
5
|
+
def menu_rails(menu)
|
6
|
+
raise 'Block must be provided' unless block_given?
|
7
|
+
|
8
|
+
block_result = nil
|
9
|
+
|
10
|
+
menu.display_for_controller(self.controller) do
|
11
|
+
menu_items = menu_rails_all_items(menu)
|
12
|
+
|
13
|
+
block_result = yield(menu_items)
|
14
|
+
end
|
15
|
+
|
16
|
+
block_result
|
17
|
+
end
|
18
|
+
|
19
|
+
def menu_rails_each(menu)
|
20
|
+
raise 'Block must be provided' unless block_given?
|
21
|
+
|
22
|
+
menu_rails(menu) do |menu_items|
|
23
|
+
menu_items.each_with_index do |menu_item, index|
|
24
|
+
yield(menu_item, index)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def menu_rails_all_items(menu)
|
30
|
+
menu_items = menu.all_menu_items
|
31
|
+
|
32
|
+
menu_items = menu_items.select do |menu_item|
|
33
|
+
if respond_to?(:can?)
|
34
|
+
if menu_item.authorization.nil?
|
35
|
+
true
|
36
|
+
else
|
37
|
+
can?(menu_item.authorization[:can], menu_item.authorization[:class_name].constantize)
|
38
|
+
end
|
39
|
+
else
|
40
|
+
true
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
menu_items
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
data/lib/menu-rails/version.rb
CHANGED
data/spec/factories.rb
CHANGED
@@ -8,7 +8,8 @@ FactoryGirl.define do
|
|
8
8
|
|
9
9
|
factory :menu_item, class: MenuRails::MenuItem do
|
10
10
|
sequence(:mriid) { |n| "menu_item_#{ n }" }
|
11
|
-
text { Faker::Lorem.word
|
11
|
+
text { Faker::Lorem.word }
|
12
|
+
url { Faker::Internet.url }
|
12
13
|
# name { Faker::Name.first_name }
|
13
14
|
|
14
15
|
# factory :dummy_invalid do
|
data/spec/features/pages_spec.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'active_support/all'
|
3
3
|
|
4
|
-
def menu_rails
|
5
|
-
@menu_rails ||= YAML::load_file(MenuRails::CONFIG_PATH).with_indifferent_access[:menu_rails]
|
6
|
-
end
|
7
|
-
|
8
4
|
feature "Menu generation" do
|
5
|
+
let(:menu) { MenuRails::Menu.get_menu_by_mrid(:client) }
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
ActionView::Base.any_instance.stub(:can?) do |accessor, klass|
|
9
|
+
klass != NotVisibleController
|
10
|
+
end
|
11
|
+
end
|
9
12
|
|
10
13
|
scenario "Ensure capybara is working correctly" do
|
11
14
|
visit root_path
|
@@ -13,13 +16,29 @@ feature "Menu generation" do
|
|
13
16
|
page.should have_content("Capybara working correctly")
|
14
17
|
end
|
15
18
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
19
|
+
context ":client menu" do
|
20
|
+
|
21
|
+
# scenario "Print Home menu item" do
|
22
|
+
['Home', 'About'].each do |menu_rails_item|
|
23
|
+
scenario "Print #{ menu_rails_item } menu item" do
|
24
|
+
visit root_path
|
25
|
+
|
26
|
+
page.should have_content(menu_rails_item)
|
27
|
+
end
|
28
|
+
end
|
20
29
|
|
21
|
-
|
22
|
-
|
23
|
-
|
30
|
+
scenario "Home is active" do
|
31
|
+
visit root_path
|
32
|
+
|
33
|
+
find('#menu a.is-active').should have_content('Home')
|
34
|
+
end
|
35
|
+
|
36
|
+
scenario "Dummy1 active? not called, instead it's called always_inactive" do
|
37
|
+
menu.get_menu_item_by_mriid(:dummy1).should_receive(:always_inactive).with(no_args).and_call_original
|
38
|
+
|
39
|
+
visit root_path
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
24
43
|
|
25
44
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MenuRails::Helpers::MenuHelper do
|
4
|
+
let(:menu) { MenuRails::Menu.get_menu_by_mrid(:client) }
|
5
|
+
|
6
|
+
it { view.menu_rails_all_items(menu).first.text.should == 'Home' }
|
7
|
+
it { view.menu_rails_all_items(menu).map(&:text).should include('Not visible') }
|
8
|
+
|
9
|
+
it "is not active because url it's a string" do
|
10
|
+
view.menu_rails(menu){ |menu_items| menu_items.second.active? }.should be_false
|
11
|
+
end
|
12
|
+
|
13
|
+
context "with cancan" do
|
14
|
+
before(:each) do
|
15
|
+
view.stub(:can?) do |accessor, klass|
|
16
|
+
klass != NotVisibleController
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it { view.menu_rails_all_items(menu).map(&:text).should_not include('Not visible') }
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
File without changes
|
File without changes
|
@@ -1,42 +1,44 @@
|
|
1
1
|
menu_rails:
|
2
2
|
client:
|
3
3
|
menu_items:
|
4
|
-
-
|
5
|
-
|
4
|
+
- home:
|
5
|
+
text: Home
|
6
|
+
url: :root_path
|
7
|
+
authorization:
|
8
|
+
can: :read
|
9
|
+
class_name: PagesController
|
10
|
+
- contact:
|
11
|
+
text: Contact
|
12
|
+
url: "http://www.myrandomurl.com/"
|
13
|
+
authorization:
|
14
|
+
class_name: MissingCanKey
|
15
|
+
active:
|
16
|
+
# It's ignored because url is a string
|
17
|
+
controller_only: true
|
18
|
+
- about:
|
19
|
+
text: About
|
20
|
+
url: :about_path
|
21
|
+
- dummy1:
|
22
|
+
text: Dummy1
|
23
|
+
url: :dummy1_path
|
24
|
+
active:
|
25
|
+
method: :always_inactive
|
26
|
+
- not_visible:
|
27
|
+
text: Not visible
|
28
|
+
url: :root_path
|
29
|
+
authorization:
|
30
|
+
can: :read
|
31
|
+
class_name: NotVisibleController
|
6
32
|
admin:
|
7
33
|
menu_items:
|
8
|
-
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
# can: :read
|
20
|
-
# url: :root_path
|
21
|
-
# - text: Archives
|
22
|
-
# class_name: 'PagesController'
|
23
|
-
# can: :read
|
24
|
-
# url: :root_path
|
25
|
-
# - text: Dropdown
|
26
|
-
# class_name: 'PagesController'
|
27
|
-
# can: :read
|
28
|
-
# url: :root_path
|
29
|
-
# - text: Templates
|
30
|
-
# class_name: 'PagesController'
|
31
|
-
# can: :read
|
32
|
-
# url: :root_path
|
33
|
-
# - text: Contact
|
34
|
-
# class_name: 'PagesController'
|
35
|
-
# can: :read
|
36
|
-
# url: :root_path
|
37
|
-
# last: true
|
38
|
-
# admin:
|
39
|
-
# menu:
|
40
|
-
# - text: Home
|
41
|
-
# class_name: 'Admin::PagesController'
|
42
|
-
# can: :read
|
34
|
+
- home:
|
35
|
+
text: Home
|
36
|
+
url: :root_path
|
37
|
+
|
38
|
+
custom_class_menu:
|
39
|
+
class_name: SecondDummyMenu
|
40
|
+
menu_items:
|
41
|
+
- home:
|
42
|
+
class_name: SecondDummyMenuItem
|
43
|
+
text: Home
|
44
|
+
url: :root_path
|
@@ -5,19 +5,47 @@ describe MenuRails::MenuItem do
|
|
5
5
|
it "has a valid factory" do
|
6
6
|
-> {FactoryGirl.build(:menu_item)}.should_not raise_error
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
|
+
it { FactoryGirl.build(:menu_item, text: 'Dummy', url: 'http://dummy.com/').should be_valid }
|
10
|
+
it { FactoryGirl.build(:menu_item, url: nil).should_not be_valid }
|
11
|
+
|
9
12
|
let(:menu_item) { FactoryGirl.build(:menu_item) }
|
10
13
|
|
11
|
-
it
|
12
|
-
|
13
|
-
|
14
|
+
it do
|
15
|
+
menu_item.should respond_to(:mriid,
|
16
|
+
:text,
|
17
|
+
:menu,
|
18
|
+
:authorization,
|
19
|
+
:url)
|
20
|
+
end
|
21
|
+
|
22
|
+
it { menu_item.text.should be_an_instance_of String }
|
23
|
+
it { menu_item.mriid.should be_an_instance_of Symbol }
|
14
24
|
|
15
25
|
context "with menu :client as parent" do
|
16
|
-
let(:menu)
|
17
|
-
let(:
|
26
|
+
let(:menu) { MenuRails::Menu.get_menu_by_mrid(:client) }
|
27
|
+
let(:first_menu_item) { menu.all_menu_items.first }
|
28
|
+
let(:second_menu_item) { menu.all_menu_items.second }
|
29
|
+
|
30
|
+
it { menu.get_menu_item_by_mriid(:home).should be first_menu_item }
|
31
|
+
it { menu.get_menu_item_by_mriid(:dummy1).should be_an_instance_of(DummyMenuItem) }
|
32
|
+
|
33
|
+
it { first_menu_item.menu.should be menu }
|
34
|
+
it { first_menu_item.authorization.should == { can: :read, class_name: 'PagesController' } }
|
35
|
+
it { first_menu_item.url.should == '/' }
|
36
|
+
|
37
|
+
it { second_menu_item.authorization.should be nil }
|
38
|
+
it { second_menu_item.url.should == second_menu_item.url_text }
|
39
|
+
it { second_menu_item.active_controller_only?.should be_true }
|
40
|
+
|
41
|
+
end
|
18
42
|
|
19
|
-
|
43
|
+
context "with menu :custom_class_menu as parent" do
|
44
|
+
let(:menu) { MenuRails::Menu.get_menu_by_mrid(:custom_class_menu) }
|
45
|
+
let(:first_menu_item) { menu.all_menu_items.first }
|
20
46
|
|
47
|
+
it { menu.should be_an_instance_of SecondDummyMenu }
|
48
|
+
it { first_menu_item.should be_an_instance_of SecondDummyMenuItem }
|
21
49
|
end
|
22
50
|
|
23
51
|
end
|
data/spec/models/menu_spec.rb
CHANGED
@@ -4,6 +4,7 @@ describe MenuRails::Menu do
|
|
4
4
|
|
5
5
|
it { described_class.should respond_to(:get_menu_by_mrid) }
|
6
6
|
it { described_class.get_menu_by_mrid(:client).should be_an_instance_of described_class }
|
7
|
+
it { described_class.get_menu_by_mrid(:admin).should be_an_instance_of described_class }
|
7
8
|
it { described_class.get_menu_by_mrid(:not_exist).should be_nil }
|
8
9
|
it { described_class.get_menu_by_mrid(:client).mrid.should be :client }
|
9
10
|
|
@@ -22,6 +23,18 @@ describe MenuRails::Menu do
|
|
22
23
|
it { menu.should respond_to(:menu_items, :mrid) }
|
23
24
|
it { menu.menu_items.should respond_to(:size, :each) }
|
24
25
|
it { menu.mrid.should be_a_kind_of Symbol }
|
25
|
-
it { menu.menu_items.first.text.should
|
26
|
+
it { menu.menu_items.first.text.should == 'Home' }
|
27
|
+
it { menu.all_menu_items.should be menu.menu_items }
|
28
|
+
|
29
|
+
it "uses given instance as controller while displaying in controller" do
|
30
|
+
fake_controller = double('Fake controller')
|
31
|
+
used_controller = nil
|
32
|
+
|
33
|
+
menu.display_for_controller(fake_controller) do
|
34
|
+
used_controller = menu.controller
|
35
|
+
end
|
36
|
+
|
37
|
+
used_controller.should be fake_controller
|
38
|
+
end
|
26
39
|
|
27
40
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -8,7 +8,8 @@ require 'capybara/rspec'
|
|
8
8
|
Combustion.initialize! :active_record,
|
9
9
|
:action_controller,
|
10
10
|
:action_view do
|
11
|
-
config.i18n.enforce_available_locales
|
11
|
+
config.i18n.enforce_available_locales = false
|
12
|
+
config.menu_rails.menu_item_class_name = 'DummyMenuItem'
|
12
13
|
end
|
13
14
|
|
14
15
|
Bundler.require(:default, :development, :test)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: menu-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fire-Dragon-DoL
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-12-
|
11
|
+
date: 2013-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|
@@ -230,6 +230,7 @@ extra_rdoc_files: []
|
|
230
230
|
files:
|
231
231
|
- .gitignore
|
232
232
|
- .rspec
|
233
|
+
- .ruby-version
|
233
234
|
- Gemfile
|
234
235
|
- LICENSE.txt
|
235
236
|
- README.md
|
@@ -238,14 +239,25 @@ files:
|
|
238
239
|
- app/models/menu_rails/menu_item.rb
|
239
240
|
- config.ru
|
240
241
|
- lib/menu-rails.rb
|
242
|
+
- lib/menu-rails/base_menu.rb
|
241
243
|
- lib/menu-rails/engine.rb
|
244
|
+
- lib/menu-rails/helpers.rb
|
245
|
+
- lib/menu-rails/helpers/menu_helper.rb
|
242
246
|
- lib/menu-rails/version.rb
|
243
247
|
- menu-rails.gemspec
|
248
|
+
- spec/controllers/pages_controller_spec.rb
|
244
249
|
- spec/factories.rb
|
245
250
|
- spec/features/pages_spec.rb
|
251
|
+
- spec/helpers/menu_helper_spec.rb
|
246
252
|
- spec/internal/app/controllers/application_controller.rb
|
253
|
+
- spec/internal/app/controllers/not_visible_controller.rb
|
247
254
|
- spec/internal/app/controllers/pages_controller.rb
|
255
|
+
- spec/internal/app/models/dummy_menu_item.rb
|
256
|
+
- spec/internal/app/models/second_dummy_menu.rb
|
257
|
+
- spec/internal/app/models/second_dummy_menu_item.rb
|
248
258
|
- spec/internal/app/views/layouts/application.html.erb
|
259
|
+
- spec/internal/app/views/pages/about.html.erb
|
260
|
+
- spec/internal/app/views/pages/dummy1.html.erb
|
249
261
|
- spec/internal/app/views/pages/home.html.erb
|
250
262
|
- spec/internal/config/database.yml
|
251
263
|
- spec/internal/config/menu-rails.yml
|
@@ -276,17 +288,25 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
276
288
|
version: '0'
|
277
289
|
requirements: []
|
278
290
|
rubyforge_project:
|
279
|
-
rubygems_version: 2.
|
291
|
+
rubygems_version: 2.1.11
|
280
292
|
signing_key:
|
281
293
|
specification_version: 4
|
282
294
|
summary: Gem that helps creating menu in views and setting the currently active link
|
283
295
|
item
|
284
296
|
test_files:
|
297
|
+
- spec/controllers/pages_controller_spec.rb
|
285
298
|
- spec/factories.rb
|
286
299
|
- spec/features/pages_spec.rb
|
300
|
+
- spec/helpers/menu_helper_spec.rb
|
287
301
|
- spec/internal/app/controllers/application_controller.rb
|
302
|
+
- spec/internal/app/controllers/not_visible_controller.rb
|
288
303
|
- spec/internal/app/controllers/pages_controller.rb
|
304
|
+
- spec/internal/app/models/dummy_menu_item.rb
|
305
|
+
- spec/internal/app/models/second_dummy_menu.rb
|
306
|
+
- spec/internal/app/models/second_dummy_menu_item.rb
|
289
307
|
- spec/internal/app/views/layouts/application.html.erb
|
308
|
+
- spec/internal/app/views/pages/about.html.erb
|
309
|
+
- spec/internal/app/views/pages/dummy1.html.erb
|
290
310
|
- spec/internal/app/views/pages/home.html.erb
|
291
311
|
- spec/internal/config/database.yml
|
292
312
|
- spec/internal/config/menu-rails.yml
|