rails_menu 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,120 @@
1
+ # Rails Menu
2
+
3
+ This small app let you create menu in your app and seamlessly generate views for it later.
4
+
5
+ ## Installation
6
+
7
+ In Gemfile
8
+
9
+ ``` ruby
10
+ gem 'rails_menu'
11
+ ```
12
+
13
+ And install bundle
14
+
15
+ ``` bash
16
+ bundle install
17
+ ```
18
+
19
+ ## Setting up menu
20
+
21
+ Anywhere in your app add code like that:
22
+
23
+ ``` ruby
24
+ RailsMenu::Set.new('default', [
25
+ [:home, root_path],
26
+ [:settings, settings_path]
27
+ ])
28
+ ```
29
+
30
+ This will create basic menu that will be accessible later. You can also split this to several independent lines:
31
+
32
+ ``` ruby
33
+ menu = RailsMenu::Set.new
34
+ menu.add(:home, root_path)
35
+ menu.add(:settings, root_path)
36
+ ```
37
+
38
+ and even specify custom options:
39
+
40
+ ``` ruby
41
+ menu = RailsMenu::Set.new
42
+ menu.add(:home, root_path, :label => "Homepage")
43
+ menu.add(:settings, root_path, :label => "My Settings")
44
+ ```
45
+
46
+ ## Configuring which menu is currently active
47
+
48
+ In your controller you can use method "set_meny" to inform RailsMenu that you can set one of menus to default. Menu id is first parameter that was provided on creating menu.
49
+
50
+ ``` ruby
51
+ class Settings < ApplicationController
52
+ set_menu :settings
53
+ end
54
+ ```
55
+
56
+ You can also add any options that are acceptable by before_filter:
57
+
58
+ ``` ruby
59
+ class Settings < ApplicationController
60
+ set_menu :settings, :except => :some_action
61
+ end
62
+ ```
63
+
64
+ If you think that it's easier to provide current menu directly in action then you are free to do so:
65
+
66
+ ``` ruby
67
+ class Settings < ApplicationController
68
+ def index
69
+ set_menu :settings
70
+ end
71
+ end
72
+ ```
73
+
74
+ ## Displaying menu
75
+
76
+ In you view you can call helper "menu" to receive table of active menus. Each element will have following elements:
77
+
78
+ - id - this is id set as first argument on creating menu. Usually needed only internal
79
+ - url - url provided to menu
80
+ - options - hash that was passed as last argument on creation
81
+ - active - true or false depending on current set menu
82
+
83
+ ``` erb
84
+ <p>My menu:</p>
85
+ <ul>
86
+ <% menu.each do |menu_element| %>
87
+ <li id="menu-<%= menu_element.id %>" class="<%= menu.active ? 'active' : nil %>">
88
+ <%= link_to menu_element.options[:label], menu_element.url %>
89
+ </li>
90
+ <% end %>
91
+ </ul>
92
+ ```
93
+
94
+ ## Creating multiple different menus
95
+
96
+ Both RailsMenu::Set.new and menu helper can receive menu name as first parameter. At defualt it's set to "default", but if you want to create multiple menus then you should provide different names. Example:
97
+
98
+ ``` ruby
99
+ menu = RailsMenu::Set.new('admin')
100
+ menu.add(:home, root_path, :label => "Homepage")
101
+ menu.add(:users, users_path, :label => "Users")
102
+ ```
103
+
104
+ ``` erb
105
+ <% menu('admin').each do |menu_element| %>
106
+ ...
107
+ <% end %>
108
+ ```
109
+
110
+ ## License
111
+
112
+ (The MIT License)
113
+
114
+ Copyright (c) 2011 Bernard Potocki
115
+
116
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
117
+
118
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
119
+
120
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake'
5
+ require 'rake/testtask'
6
+ require 'rake/rdoctask'
7
+
8
+ desc 'Default: run unit tests.'
9
+ task :default => :test
10
+
11
+ desc 'Test the semantic_menu plugin.'
12
+ Rake::TestTask.new(:test) do |t|
13
+ t.libs << 'lib'
14
+ t.pattern = 'test/**/*_test.rb'
15
+ t.verbose = true
16
+ end
data/lib/rails_menu.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'action_controller'
2
+ require 'action_view'
3
+
4
+ module RailsMenu
5
+ ROOT = File.expand_path(File.dirname(__FILE__))
6
+
7
+ autoload :Element, "#{ROOT}/rails_menu/element"
8
+ autoload :Set, "#{ROOT}/rails_menu/set"
9
+
10
+ autoload :ControllerHelper, "#{ROOT}/rails_menu/controller_helper"
11
+ autoload :ViewHelper, "#{ROOT}/rails_menu/view_helper"
12
+ end
13
+
14
+ ActionController::Base.send(:include, RailsMenu::ControllerHelper)
15
+ ActionView::Base.send(:include, RailsMenu::ViewHelper)
@@ -0,0 +1,21 @@
1
+ module RailsMenu
2
+ module ControllerHelper
3
+
4
+ def self.included(base)
5
+ base.extend ClassMethods
6
+ end
7
+
8
+ def set_menu(id)
9
+ @rails_menu_active = id
10
+ end
11
+
12
+ module ClassMethods
13
+ def set_menu(id, options = {})
14
+ before_filter(options) do
15
+ set_menu id
16
+ end
17
+ end
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ module RailsMenu
2
+ class Element
3
+
4
+ attr_accessor :id, :url, :options, :active
5
+
6
+ def initialize(id, url = '', options = {})
7
+ @id = id.to_s
8
+ @url = url
9
+ @options = options
10
+ @active = false
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,35 @@
1
+ module RailsMenu
2
+ class Set
3
+
4
+ class << self
5
+ def list
6
+ @list ||= {}
7
+ end
8
+
9
+ def [](list_name)
10
+ list[list_name]
11
+ end
12
+ end
13
+
14
+ attr_accessor :name
15
+
16
+ def initialize(name = 'default', element_list = [])
17
+ @name = name
18
+ @element_list = []
19
+ element_list.each{ |elem| self.add(*elem) }
20
+
21
+ self.class.list[name] = self
22
+ end
23
+
24
+ def add(id, url = '', options = {})
25
+ element = Element.new(id.to_s, url, options)
26
+ @element_list << element
27
+ element
28
+ end
29
+
30
+ def elements
31
+ @element_list
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,3 @@
1
+ module RailsMenu
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,14 @@
1
+ module RailsMenu
2
+ module ViewHelper
3
+
4
+ def menu(set_name = 'default')
5
+ set = RailsMenu::Set[set_name]
6
+ elements = set.nil? ? [] : set.elements
7
+ elements.each do |elem|
8
+ elem.active = (@rails_menu_active.to_s == elem.id ? true : false)
9
+ end
10
+ elements
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "rails_menu/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "rails_menu"
7
+ s.version = RailsMenu::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Bernard Potocki"]
10
+ s.email = ["bernard.potocki@imanel.org"]
11
+ s.homepage = ""
12
+ s.summary = %q{Simple menu generator for Ruby on Rails}
13
+ s.description = %q{Simple menu generator for Ruby on Rails}
14
+
15
+ s.add_dependency 'actionpack'
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+ end
@@ -0,0 +1,48 @@
1
+ require './test/test_helper'
2
+
3
+ class ActiveSupport::TestCase
4
+ setup do
5
+ @routes = RailsMenu::Routes
6
+ end
7
+ end
8
+
9
+ class BooksController < ApplicationController
10
+ set_menu :books
11
+ def index; end
12
+ end
13
+
14
+ class SettingsController < ApplicationController
15
+ set_menu :settings, :only => :index
16
+
17
+ def index; end
18
+
19
+ def other; end
20
+
21
+ def notifications
22
+ set_menu :notification
23
+ end
24
+ end
25
+
26
+ class BooksControllerTest < ActionController::TestCase
27
+ test "assign global" do
28
+ get :index
29
+ assert_equal(:books, assigns(:rails_menu_active))
30
+ end
31
+ end
32
+
33
+ class SettingsControllerTest < ActionController::TestCase
34
+ test "assign specific action" do
35
+ get :index
36
+ assert_equal(:settings, assigns(:rails_menu_active))
37
+ end
38
+
39
+ test "ignore specific action" do
40
+ get :other
41
+ assert_equal(nil, assigns(:rails_menu_active))
42
+ end
43
+
44
+ test "override specific action" do
45
+ get :notifications
46
+ assert_equal(:notification, assigns(:rails_menu_active))
47
+ end
48
+ end
@@ -0,0 +1,13 @@
1
+ require './test/test_helper'
2
+
3
+ class ElementTest < Test::Unit::TestCase
4
+
5
+ def test_initialization
6
+ elem = RailsMenu::Element.new('my_id', 'my_url', :my => 'hash')
7
+ assert_equal 'my_id', elem.id
8
+ assert_equal 'my_url', elem.url
9
+ assert_equal({:my => 'hash'}, elem.options)
10
+ assert_equal false, elem.active
11
+ end
12
+
13
+ end
data/test/set_test.rb ADDED
@@ -0,0 +1,39 @@
1
+ require './test/test_helper'
2
+
3
+ class SetTest < Test::Unit::TestCase
4
+
5
+ def teardown
6
+ RailsMenu::Set.list.keys.each { |key| RailsMenu::Set.list.delete(key) }
7
+ end
8
+
9
+ def test_empty_list
10
+ assert_equal RailsMenu::Set.list, {}
11
+ end
12
+
13
+ def test_adding_default
14
+ set = RailsMenu::Set.new
15
+ assert_equal RailsMenu::Set, set.class
16
+ assert_equal 'default', set.name
17
+ assert_equal [], set.elements
18
+ assert_equal set, RailsMenu::Set['default']
19
+ end
20
+
21
+ def test_adding_custom
22
+ set = RailsMenu::Set.new('my_name', [
23
+ ['first', '/first'],
24
+ ['second', '/second']
25
+ ])
26
+ assert_equal RailsMenu::Set, set.class
27
+ assert_equal 'my_name', set.name
28
+ assert_not_equal [], set.elements
29
+ assert_equal set, RailsMenu::Set['my_name']
30
+ end
31
+
32
+ def test_adding_element
33
+ set = RailsMenu::Set.new('default')
34
+ assert_equal [], set.elements
35
+ element = set.add('my', 'url')
36
+ assert_equal [element], set.elements
37
+ end
38
+
39
+ end
@@ -0,0 +1,6 @@
1
+ class ApplicationController < ActionController::Base
2
+ protected
3
+ def default_render
4
+ render :text => action_name
5
+ end
6
+ end
@@ -0,0 +1,12 @@
1
+ require 'test/unit'
2
+ require 'rails_menu'
3
+
4
+ Dir["#{File.dirname(__FILE__)}/support/*.rb"].each { |f| require f }
5
+
6
+ RailsMenu::Routes = ActionDispatch::Routing::RouteSet.new
7
+ RailsMenu::Routes.draw do
8
+ match ':controller(/:action(/:id(.:format)))'
9
+ end
10
+
11
+ class ApplicationController < ActionController::Base; end
12
+ ActionController::Base.send :include, RailsMenu::Routes.url_helpers
@@ -0,0 +1,38 @@
1
+ require "./test/test_helper"
2
+
3
+ class ViewHelperTest < ActionView::TestCase
4
+ tests RailsMenu::ViewHelper
5
+
6
+ attr_accessor :controller, :request
7
+
8
+ def setup
9
+ @menu = RailsMenu::Set.new
10
+ end
11
+
12
+ def teardown
13
+ RailsMenu::Set.list.keys.each { |key| RailsMenu::Set.list.delete(key) }
14
+ end
15
+
16
+ test "default menu is empty" do
17
+ assert_equal [], menu("default")
18
+ end
19
+
20
+ test "unknown menu is empty" do
21
+ assert_equal [], menu("unknown")
22
+ end
23
+
24
+ test "access elements in menu" do
25
+ element = @menu.add("my", "url", :my => "options")
26
+ assert_equal [element], menu("default")
27
+ end
28
+
29
+ test "current element should be active" do
30
+ @rails_menu_active = "second"
31
+ first = @menu.add("first")
32
+ second = @menu.add("second")
33
+ assert_equal [first, second], menu("default")
34
+ assert_equal false, first.active
35
+ assert_equal true, second.active
36
+ end
37
+
38
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails_menu
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - Bernard Potocki
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-04-22 00:00:00 +02:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: actionpack
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: "0"
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ description: Simple menu generator for Ruby on Rails
28
+ email:
29
+ - bernard.potocki@imanel.org
30
+ executables: []
31
+
32
+ extensions: []
33
+
34
+ extra_rdoc_files: []
35
+
36
+ files:
37
+ - .gitignore
38
+ - Gemfile
39
+ - README.md
40
+ - Rakefile
41
+ - lib/rails_menu.rb
42
+ - lib/rails_menu/controller_helper.rb
43
+ - lib/rails_menu/element.rb
44
+ - lib/rails_menu/set.rb
45
+ - lib/rails_menu/version.rb
46
+ - lib/rails_menu/view_helper.rb
47
+ - rails_menu.gemspec
48
+ - test/controller_helper_test.rb
49
+ - test/element_test.rb
50
+ - test/set_test.rb
51
+ - test/support/controllers.rb
52
+ - test/test_helper.rb
53
+ - test/view_helper_test.rb
54
+ has_rdoc: true
55
+ homepage: ""
56
+ licenses: []
57
+
58
+ post_install_message:
59
+ rdoc_options: []
60
+
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: "0"
75
+ requirements: []
76
+
77
+ rubyforge_project:
78
+ rubygems_version: 1.6.1
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: Simple menu generator for Ruby on Rails
82
+ test_files:
83
+ - test/controller_helper_test.rb
84
+ - test/element_test.rb
85
+ - test/set_test.rb
86
+ - test/support/controllers.rb
87
+ - test/test_helper.rb
88
+ - test/view_helper_test.rb