stateful_link 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "rails", ">= 3"
4
+ gem "capybara", ">= 0.3.9"
5
+ gem "sqlite3-ruby", :require => "sqlite3"
6
+
7
+ if RUBY_VERSION < '1.9'
8
+ gem "ruby-debug", ">= 0.10.3"
9
+ end
10
+
11
+ gem "rspec-rails", ">= 2.0.0.beta"
data/Gemfile.lock ADDED
@@ -0,0 +1,120 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ abstract (1.0.0)
5
+ actionmailer (3.0.1)
6
+ actionpack (= 3.0.1)
7
+ mail (~> 2.2.5)
8
+ actionpack (3.0.1)
9
+ activemodel (= 3.0.1)
10
+ activesupport (= 3.0.1)
11
+ builder (~> 2.1.2)
12
+ erubis (~> 2.6.6)
13
+ i18n (~> 0.4.1)
14
+ rack (~> 1.2.1)
15
+ rack-mount (~> 0.6.12)
16
+ rack-test (~> 0.5.4)
17
+ tzinfo (~> 0.3.23)
18
+ activemodel (3.0.1)
19
+ activesupport (= 3.0.1)
20
+ builder (~> 2.1.2)
21
+ i18n (~> 0.4.1)
22
+ activerecord (3.0.1)
23
+ activemodel (= 3.0.1)
24
+ activesupport (= 3.0.1)
25
+ arel (~> 1.0.0)
26
+ tzinfo (~> 0.3.23)
27
+ activeresource (3.0.1)
28
+ activemodel (= 3.0.1)
29
+ activesupport (= 3.0.1)
30
+ activesupport (3.0.1)
31
+ arel (1.0.1)
32
+ activesupport (~> 3.0.0)
33
+ builder (2.1.2)
34
+ capybara (0.4.0)
35
+ celerity (>= 0.7.9)
36
+ culerity (>= 0.2.4)
37
+ mime-types (>= 1.16)
38
+ nokogiri (>= 1.3.3)
39
+ rack (>= 1.0.0)
40
+ rack-test (>= 0.5.4)
41
+ selenium-webdriver (>= 0.0.27)
42
+ xpath (~> 0.1.2)
43
+ celerity (0.8.2)
44
+ childprocess (0.1.4)
45
+ ffi (~> 0.6.3)
46
+ columnize (0.3.2)
47
+ culerity (0.2.12)
48
+ diff-lcs (1.1.2)
49
+ erubis (2.6.6)
50
+ abstract (>= 1.0.0)
51
+ ffi (0.6.3)
52
+ rake (>= 0.8.7)
53
+ i18n (0.4.2)
54
+ json_pure (1.4.6)
55
+ linecache (0.43)
56
+ mail (2.2.9)
57
+ activesupport (>= 2.3.6)
58
+ i18n (~> 0.4.1)
59
+ mime-types (~> 1.16)
60
+ treetop (~> 1.4.8)
61
+ mime-types (1.16)
62
+ nokogiri (1.4.3.1)
63
+ polyglot (0.3.1)
64
+ rack (1.2.1)
65
+ rack-mount (0.6.13)
66
+ rack (>= 1.0.0)
67
+ rack-test (0.5.6)
68
+ rack (>= 1.0)
69
+ rails (3.0.1)
70
+ actionmailer (= 3.0.1)
71
+ actionpack (= 3.0.1)
72
+ activerecord (= 3.0.1)
73
+ activeresource (= 3.0.1)
74
+ activesupport (= 3.0.1)
75
+ bundler (~> 1.0.0)
76
+ railties (= 3.0.1)
77
+ railties (3.0.1)
78
+ actionpack (= 3.0.1)
79
+ activesupport (= 3.0.1)
80
+ rake (>= 0.8.4)
81
+ thor (~> 0.14.0)
82
+ rake (0.8.7)
83
+ rspec (2.1.0)
84
+ rspec-core (~> 2.1.0)
85
+ rspec-expectations (~> 2.1.0)
86
+ rspec-mocks (~> 2.1.0)
87
+ rspec-core (2.1.0)
88
+ rspec-expectations (2.1.0)
89
+ diff-lcs (~> 1.1.2)
90
+ rspec-mocks (2.1.0)
91
+ rspec-rails (2.1.0)
92
+ rspec (~> 2.1.0)
93
+ ruby-debug (0.10.4)
94
+ columnize (>= 0.1)
95
+ ruby-debug-base (~> 0.10.4.0)
96
+ ruby-debug-base (0.10.4)
97
+ linecache (>= 0.3)
98
+ rubyzip (0.9.4)
99
+ selenium-webdriver (0.1.0)
100
+ childprocess (= 0.1.4)
101
+ ffi (~> 0.6.3)
102
+ json_pure
103
+ rubyzip
104
+ sqlite3-ruby (1.3.2)
105
+ thor (0.14.4)
106
+ treetop (1.4.8)
107
+ polyglot (>= 0.3.1)
108
+ tzinfo (0.3.23)
109
+ xpath (0.1.2)
110
+ nokogiri (~> 1.3)
111
+
112
+ PLATFORMS
113
+ ruby
114
+
115
+ DEPENDENCIES
116
+ capybara (>= 0.3.9)
117
+ rails (~> 3)
118
+ rspec-rails (>= 2.0.0.beta)
119
+ ruby-debug (>= 0.10.3)
120
+ sqlite3-ruby
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2010 YOURNAME
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,61 @@
1
+ = StatefulLink
2
+
3
+ StatefulLink is a helper that simplifies displaying stateful navigation links. State
4
+ depends on current controller and action.
5
+
6
+ = Installation
7
+
8
+ gem 'stateful_link', :git => 'git://github.com/gzigzigzeo/stateful_link.git'
9
+
10
+ = Examples
11
+
12
+ Let we have RESTful PostsController and two navigation links in layout.
13
+
14
+ layouts/application.html.erb
15
+ <ul>
16
+ <li>
17
+ <%= link_to "Posts", posts_url %>
18
+ <ul>
19
+ <li><%= link_to "New post", new_post_url %></li>
20
+ </ul>
21
+ </li>
22
+ </ul>
23
+
24
+ So, at every page we have same links. But in good form we should mark
25
+ current user location by changing visual appearance of current and parent navigation
26
+ links. For example, if user opens new post page, "New post" should be displayed
27
+ as regular text, and "Posts" should become bold.
28
+
29
+ Solution:
30
+
31
+ posts_controller.rb
32
+
33
+ class PostsController < ApplicationController
34
+ end
35
+
36
+ application_helper.rb
37
+
38
+ module ApplicationHelper
39
+ def navigation_link(label, active, chosen, url)
40
+ stateful_link(
41
+ active,
42
+ chosen,
43
+ :active => proc { label ),
44
+ :chosen => proc { content_tag :b, link_to(label, url) },
45
+ :inactive => proc { link_to label, url }
46
+ )
47
+ end
48
+ end
49
+
50
+ layouts/application.html.erb
51
+
52
+ <ul>
53
+ <li>
54
+ <%= navigation_link("Posts", "posts/index", "posts/*", posts_url) %>
55
+ <ul>
56
+ <%= navigation_link("New post", ["posts/new", "posts/create"], nil, new_post_url) %>
57
+ </ul>
58
+ </li>
59
+ </ul>
60
+
61
+ See docs for details.
data/Rakefile ADDED
@@ -0,0 +1,27 @@
1
+ # encoding: UTF-8
2
+ require 'rake'
3
+ require 'rspec/core'
4
+ require 'rspec/core/rake_task'
5
+
6
+ Rspec::Core::RakeTask.new(:spec)
7
+ task :default => :spec
8
+
9
+ begin
10
+ require "jeweler"
11
+ Jeweler::Tasks.new do |gem|
12
+ gem.name = "stateful_link"
13
+ gem.summary = "Helper to generate stateful navigation links."
14
+ gem.description = "Helper to generate stateful navigation links."
15
+ gem.files = FileList["[A-Z]*", "lib/**/*"]
16
+ gem.version = "0.0.1"
17
+ gem.email = "gzigzigzeo@gmail.com"
18
+ gem.authors = ["Victor Sokolov"]
19
+ gem.homepage = "http://github.com/gzigzigzeo/stateful_link"
20
+
21
+ gem.add_dependency "rails", ">= 3.0.0"
22
+ end
23
+
24
+ Jeweler::GemcutterTasks.new
25
+ rescue LoadError
26
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
27
+ end
@@ -0,0 +1,100 @@
1
+ module StatefulLink
2
+ module Helper#:doc:
3
+ # Returns true if current controller and action names equals to any of passed.
4
+ # Asterik as action name matches all controller's action.
5
+ #
6
+ # Examples:
7
+ # <%= "we are in PostsController::index" if action_any_of?("posts#index") %>
8
+ #
9
+ # <%= "we are not in PostsController::index" unless action_any_of?("posts#index") %>
10
+ #
11
+ # <% if action_any_of?("posts#index", "messages#index") %>
12
+ # we are in PostsController or in MessagesController
13
+ # <% end %>
14
+ #
15
+ def action_any_of?(*actions)
16
+ actions.any? do |sub_ca|
17
+ sub_controller, sub_action = extract_controller_and_action(sub_ca)
18
+ controller.controller_path == sub_controller && (controller.action_name == sub_action || sub_action == '')
19
+ end
20
+ end
21
+
22
+ # Returns link state related to current controller and action: :inactive, :active or :chosen.
23
+ # A list of active actions is the first argument, chosen actions are the second argument.
24
+ #
25
+ # Examples:
26
+ # # :active for PostsController::index, :chosen for PostsController::* (except :index),
27
+ # # :inactive otherwise.
28
+ # action_state("posts#index", "posts#")
29
+ #
30
+ # # :active for PostsController::new and PostsController::create, :inactive otherwise.
31
+ # action_state(["posts#new", "posts#create"])
32
+ #
33
+ # # :active for PostsController::index, :chosen for MessagesController::* and
34
+ # # PostsController::* (except :index), :inactive otherwise.
35
+ # action_state("posts#index", ["posts#", "messages#"])
36
+ #
37
+ def action_state(active, chosen = nil)
38
+ active = active.is_a?(String) ? [active] : active
39
+ chosen = chosen.is_a?(String) ? [chosen] : chosen
40
+
41
+ if action_any_of?(*active)
42
+ :active
43
+ else
44
+ if !chosen.nil? && action_any_of?(*chosen)
45
+ :chosen
46
+ else
47
+ :inactive
48
+ end
49
+ end
50
+ end
51
+
52
+ # Extracts controller and action names from a string.
53
+ #
54
+ # Examples:
55
+ #
56
+ # extract_controller_and_action("posts#index") # ["posts", "index"]
57
+ # extract_controller_and_action("admin/posts#index") # ["admin/posts", "index"]
58
+ # extract_controller_and_action("admin/posts#index") # raises ArgumentError
59
+ #
60
+ def extract_controller_and_action(ca)
61
+ raise ArgumentError, "Pass the string" if ca.nil?
62
+ slash_pos = ca.rindex('#')
63
+ raise ArgumentError, "Invalid action: #{ca}" if slash_pos.nil?
64
+ controller = ca[0, slash_pos]
65
+ action = ca[slash_pos+1..-1] || ""
66
+ raise ArgumentError, "Invalid action or controller" if controller.nil?
67
+
68
+ [controller, action]
69
+ end
70
+
71
+ # Generates stateful link to something.
72
+ #
73
+ # Options:
74
+ # :inactive - template of inactive state
75
+ # :active - template of active state
76
+ # :chosen - template of chosen state
77
+ # :state - block to determine state (action_state called if none)
78
+ #
79
+ # Any option may be proc.
80
+ #
81
+ # Example:
82
+ # stateful_link_to("foos#index", "bars#index",
83
+ # :active => "<li class='active'>Good!</li>",
84
+ # :chosen => "<li class='chosen'>#{link_to(...)}</li>"
85
+ # )
86
+ #
87
+ def stateful_link_to(*args)
88
+ options = args.extract_options!
89
+ active = args.first
90
+ chosen = args.second
91
+ state = options[:state] || proc { action_state(active, chosen) }
92
+ raise ArgumentError, ":state should be proc" unless state.is_a?(Proc)
93
+ state = instance_exec(&state)
94
+ state = :active if state == true
95
+ state = :inactive if state == false
96
+ current = options[state]
97
+ current.is_a?(Proc) ? instance_exec(&current) : current
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,7 @@
1
+ module StatefulLink
2
+ class Railtie < ::Rails::Railtie
3
+ config.to_prepare do
4
+ ApplicationController.helper(StatefulLink::Helper)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ module StatefulLink
2
+ require 'stateful_link/railtie' if defined?(Rails)
3
+ require 'stateful_link/helper'
4
+ end
@@ -0,0 +1,5 @@
1
+ class ApplicationController < ActionController::Base
2
+ protect_from_forgery
3
+
4
+ def index; end
5
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,45 @@
1
+ require File.expand_path('../boot', __FILE__)
2
+
3
+ require "active_model/railtie"
4
+ require "active_record/railtie"
5
+ require "action_controller/railtie"
6
+ require "action_view/railtie"
7
+ require "action_mailer/railtie"
8
+
9
+ Bundler.require
10
+ require "stateful_link"
11
+
12
+ module Dummy
13
+ class Application < Rails::Application
14
+ # Settings in config/environments/* take precedence over those specified here.
15
+ # Application configuration should go into files in config/initializers
16
+ # -- all .rb files in that directory are automatically loaded.
17
+
18
+ # Custom directories with classes and modules you want to be autoloadable.
19
+ # config.autoload_paths += %W(#{config.root}/extras)
20
+
21
+ # Only load the plugins named here, in the order given (default is alphabetical).
22
+ # :all can be used as a placeholder for all plugins not explicitly named.
23
+ # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
24
+
25
+ # Activate observers that should always be running.
26
+ # config.active_record.observers = :cacher, :garbage_collector, :forum_observer
27
+
28
+ # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
29
+ # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
30
+ # config.time_zone = 'Central Time (US & Canada)'
31
+
32
+ # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
33
+ # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
34
+ # config.i18n.default_locale = :de
35
+
36
+ # JavaScript files you want as :defaults (application.js is always included).
37
+ # config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
38
+
39
+ # Configure the default encoding used in templates for Ruby 1.9.
40
+ config.encoding = "utf-8"
41
+
42
+ # Configure sensitive parameters which will be filtered from the log file.
43
+ config.filter_parameters += [:password]
44
+ end
45
+ end
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ gemfile = File.expand_path('../../../../Gemfile', __FILE__)
3
+
4
+ if File.exist?(gemfile)
5
+ ENV['BUNDLE_GEMFILE'] = gemfile
6
+ require 'bundler'
7
+ Bundler.setup
8
+ end
9
+
10
+ $:.unshift File.expand_path('../../../../lib', __FILE__)
@@ -0,0 +1,5 @@
1
+ # Load the rails application
2
+ require File.expand_path('../application', __FILE__)
3
+
4
+ # Initialize the rails application
5
+ Dummy::Application.initialize!
@@ -0,0 +1,26 @@
1
+ Dummy::Application.configure do
2
+ # Settings specified here will take precedence over those in config/environment.rb
3
+
4
+ # In the development environment your application's code is reloaded on
5
+ # every request. This slows down response time but is perfect for development
6
+ # since you don't have to restart the webserver when you make code changes.
7
+ config.cache_classes = false
8
+
9
+ # Log error messages when you accidentally call methods on nil.
10
+ config.whiny_nils = true
11
+
12
+ # Show full error reports and disable caching
13
+ config.consider_all_requests_local = true
14
+ config.action_view.debug_rjs = true
15
+ config.action_controller.perform_caching = false
16
+
17
+ # Don't care if the mailer can't send
18
+ config.action_mailer.raise_delivery_errors = false
19
+
20
+ # Print deprecation notices to the Rails logger
21
+ config.active_support.deprecation = :log
22
+
23
+ # Only use best-standards-support built into browsers
24
+ config.action_dispatch.best_standards_support = :builtin
25
+ end
26
+
@@ -0,0 +1,49 @@
1
+ Dummy::Application.configure do
2
+ # Settings specified here will take precedence over those in config/environment.rb
3
+
4
+ # The production environment is meant for finished, "live" apps.
5
+ # Code is not reloaded between requests
6
+ config.cache_classes = true
7
+
8
+ # Full error reports are disabled and caching is turned on
9
+ config.consider_all_requests_local = false
10
+ config.action_controller.perform_caching = true
11
+
12
+ # Specifies the header that your server uses for sending files
13
+ config.action_dispatch.x_sendfile_header = "X-Sendfile"
14
+
15
+ # For nginx:
16
+ # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'
17
+
18
+ # If you have no front-end server that supports something like X-Sendfile,
19
+ # just comment this out and Rails will serve the files
20
+
21
+ # See everything in the log (default is :info)
22
+ # config.log_level = :debug
23
+
24
+ # Use a different logger for distributed setups
25
+ # config.logger = SyslogLogger.new
26
+
27
+ # Use a different cache store in production
28
+ # config.cache_store = :mem_cache_store
29
+
30
+ # Disable Rails's static asset server
31
+ # In production, Apache or nginx will already do this
32
+ config.serve_static_assets = false
33
+
34
+ # Enable serving of images, stylesheets, and javascripts from an asset server
35
+ # config.action_controller.asset_host = "http://assets.example.com"
36
+
37
+ # Disable delivery errors, bad email addresses will be ignored
38
+ # config.action_mailer.raise_delivery_errors = false
39
+
40
+ # Enable threaded mode
41
+ # config.threadsafe!
42
+
43
+ # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
44
+ # the I18n.default_locale when a translation can not be found)
45
+ config.i18n.fallbacks = true
46
+
47
+ # Send deprecation notices to registered listeners
48
+ config.active_support.deprecation = :notify
49
+ end
@@ -0,0 +1,35 @@
1
+ Dummy::Application.configure do
2
+ # Settings specified here will take precedence over those in config/environment.rb
3
+
4
+ # The test environment is used exclusively to run your application's
5
+ # test suite. You never need to work with it otherwise. Remember that
6
+ # your test database is "scratch space" for the test suite and is wiped
7
+ # and recreated between test runs. Don't rely on the data there!
8
+ config.cache_classes = true
9
+
10
+ # Log error messages when you accidentally call methods on nil.
11
+ config.whiny_nils = true
12
+
13
+ # Show full error reports and disable caching
14
+ config.consider_all_requests_local = true
15
+ config.action_controller.perform_caching = false
16
+
17
+ # Raise exceptions instead of rendering exception templates
18
+ config.action_dispatch.show_exceptions = false
19
+
20
+ # Disable request forgery protection in test environment
21
+ config.action_controller.allow_forgery_protection = false
22
+
23
+ # Tell Action Mailer not to deliver emails to the real world.
24
+ # The :test delivery method accumulates sent emails in the
25
+ # ActionMailer::Base.deliveries array.
26
+ config.action_mailer.delivery_method = :test
27
+
28
+ # Use SQL instead of Active Record's schema dumper when creating the test database.
29
+ # This is necessary if your schema can't be completely dumped by the schema dumper,
30
+ # like if you have constraints or database-specific column types
31
+ # config.active_record.schema_format = :sql
32
+
33
+ # Print deprecation notices to the stderr
34
+ config.active_support.deprecation = :stderr
35
+ end
@@ -0,0 +1,7 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
4
+ # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
5
+
6
+ # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
7
+ # Rails.backtrace_cleaner.remove_silencers!
@@ -0,0 +1,10 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new inflection rules using the following format
4
+ # (all these examples are active by default):
5
+ # ActiveSupport::Inflector.inflections do |inflect|
6
+ # inflect.plural /^(ox)$/i, '\1en'
7
+ # inflect.singular /^(ox)en/i, '\1'
8
+ # inflect.irregular 'person', 'people'
9
+ # inflect.uncountable %w( fish sheep )
10
+ # end
@@ -0,0 +1,5 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new mime types for use in respond_to blocks:
4
+ # Mime::Type.register "text/richtext", :rtf
5
+ # Mime::Type.register_alias "text/html", :iphone
@@ -0,0 +1,7 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Your secret key for verifying the integrity of signed cookies.
4
+ # If you change this key, all old signed cookies will become invalid!
5
+ # Make sure the secret is at least 30 characters and all random,
6
+ # no regular words or you'll be exposed to dictionary attacks.
7
+ Dummy::Application.config.secret_token = '811de66db7d89979e5bc3418c1f9831e2eb750ca7dff2ef4ccec144fc41b36195b7e7e21d67347d479b7e177cc6d64287f9e914cfe9dfd39400376473eae0f78'
@@ -0,0 +1,8 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ Dummy::Application.config.session_store :cookie_store, :key => '_dummy_session'
4
+
5
+ # Use the database for sessions instead of the cookie-based default,
6
+ # which shouldn't be used to store highly confidential information
7
+ # (create the session table with "rake db:sessions:create")
8
+ # Dummy::Application.config.session_store :active_record_store
@@ -0,0 +1,60 @@
1
+ Dummy::Application.routes.draw do
2
+ # The priority is based upon order of creation:
3
+ # first created -> highest priority.
4
+
5
+ # Sample of regular route:
6
+ # match 'products/:id' => 'catalog#view'
7
+ # Keep in mind you can assign values other than :controller and :action
8
+
9
+ # Sample of named route:
10
+ # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
11
+ # This route can be invoked with purchase_url(:id => product.id)
12
+
13
+ # Sample resource route (maps HTTP verbs to controller actions automatically):
14
+ # resources :products
15
+
16
+ # Sample resource route with options:
17
+ # resources :products do
18
+ # member do
19
+ # get 'short'
20
+ # post 'toggle'
21
+ # end
22
+ #
23
+ # collection do
24
+ # get 'sold'
25
+ # end
26
+ # end
27
+
28
+ # Sample resource route with sub-resources:
29
+ # resources :products do
30
+ # resources :comments, :sales
31
+ # resource :seller
32
+ # end
33
+
34
+ # Sample resource route with more complex sub-resources
35
+ # resources :products do
36
+ # resources :comments
37
+ # resources :sales do
38
+ # get 'recent', :on => :collection
39
+ # end
40
+ # end
41
+
42
+ # Sample resource route within a namespace:
43
+ # namespace :admin do
44
+ # # Directs /admin/products/* to Admin::ProductsController
45
+ # # (app/controllers/admin/products_controller.rb)
46
+ # resources :products
47
+ # end
48
+
49
+ # You can have the root of your site routed with "root"
50
+ # just remember to delete public/index.html.
51
+ # root :to => "welcome#index"
52
+
53
+ # See how all your routes lay out with "rake routes"
54
+
55
+ # This is a legacy wild controller route that's not recommended for RESTful applications.
56
+ # Note: This route will make all actions in every controller accessible via GET requests.
57
+ # match ':controller(/:action(/:id(.:format)))'
58
+
59
+ root :to => "application#index"
60
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe StatefulLink::Helper do
4
+ before(:each) do
5
+ controller.controller_path = 'foos'
6
+ controller.action_name = 'bar'
7
+ end
8
+
9
+ it "should extract controller and action" do
10
+ helper.extract_controller_and_action("friendships#index").should == ['friendships', 'index']
11
+ helper.extract_controller_and_action("friendships#").should == ['friendships', '']
12
+ end
13
+
14
+ it "action_any_of should work" do
15
+ helper.action_any_of?("bars#index").should be_false
16
+ helper.action_any_of?("foos#bar").should be_true
17
+ helper.action_any_of?("bars#index", "foos#bar").should be_true
18
+ end
19
+
20
+ it "action_state should work" do
21
+ helper.action_state("bars#index", "foos#bar").should == :chosen
22
+ helper.action_state("bars#index", ["foos#", "foobars#index"]).should == :chosen
23
+ helper.action_state("foos#bar", "tests#index").should == :active
24
+ helper.action_state("foos#bar").should == :active
25
+ end
26
+
27
+ it "should generate stateful links" do
28
+ helper.stateful_link_to(
29
+ "foos#bar",
30
+ :active => "1",
31
+ :inactive => "2",
32
+ :chosen => "3"
33
+ ).should == "1"
34
+
35
+ helper.stateful_link_to(
36
+ "bars#foo",
37
+ ["foos#bar", "foobars#*"],
38
+ :active => "1",
39
+ :inactive => "2",
40
+ :chosen => proc { root_path }
41
+ ).should == root_path
42
+
43
+ helper.stateful_link_to(
44
+ :active => "1",
45
+ :inactive => "2",
46
+ :chosen => "3",
47
+ :state => proc { :active }
48
+ ).should == "1"
49
+
50
+ helper.stateful_link_to(
51
+ :active => "1",
52
+ :inactive => "2",
53
+ :chosen => "3",
54
+ :state => proc { false }
55
+ ).should == "2"
56
+ end
57
+ end
@@ -0,0 +1,33 @@
1
+ # Configure Rails Envinronment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
5
+ require "rails/test_help"
6
+ require "rspec/rails"
7
+
8
+ ActionMailer::Base.delivery_method = :test
9
+ ActionMailer::Base.perform_deliveries = true
10
+ ActionMailer::Base.default_url_options[:host] = "test.com"
11
+
12
+ Rails.backtrace_cleaner.remove_silencers!
13
+
14
+ # Configure capybara for integration testing
15
+ require "capybara/rails"
16
+ Capybara.default_driver = :rack_test
17
+ Capybara.default_selector = :css
18
+
19
+ # Run any available migration
20
+ ActiveRecord::Migrator.migrate File.expand_path("../dummy/db/migrate/", __FILE__)
21
+
22
+ # Load support files
23
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
24
+
25
+ Rspec.configure do |config|
26
+ # Remove this line if you don't want Rspec's should and should_not
27
+ # methods or matchers
28
+ require 'rspec/expectations'
29
+ config.include Rspec::Matchers
30
+
31
+ # == Mock Framework
32
+ config.mock_with :rspec
33
+ end
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stateful_link
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Victor Sokolov
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-11-11 00:00:00 +03:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rails
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 7
30
+ segments:
31
+ - 3
32
+ - 0
33
+ - 0
34
+ version: 3.0.0
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ description: Helper to generate stateful navigation links.
38
+ email: gzigzigzeo@gmail.com
39
+ executables: []
40
+
41
+ extensions: []
42
+
43
+ extra_rdoc_files:
44
+ - README.rdoc
45
+ files:
46
+ - Gemfile
47
+ - Gemfile.lock
48
+ - MIT-LICENSE
49
+ - README.rdoc
50
+ - Rakefile
51
+ - lib/stateful_link.rb
52
+ - lib/stateful_link/helper.rb
53
+ - lib/stateful_link/railtie.rb
54
+ - spec/dummy/app/controllers/application_controller.rb
55
+ - spec/dummy/app/helpers/application_helper.rb
56
+ - spec/dummy/config/application.rb
57
+ - spec/dummy/config/boot.rb
58
+ - spec/dummy/config/environment.rb
59
+ - spec/dummy/config/environments/development.rb
60
+ - spec/dummy/config/environments/production.rb
61
+ - spec/dummy/config/environments/test.rb
62
+ - spec/dummy/config/initializers/backtrace_silencers.rb
63
+ - spec/dummy/config/initializers/inflections.rb
64
+ - spec/dummy/config/initializers/mime_types.rb
65
+ - spec/dummy/config/initializers/secret_token.rb
66
+ - spec/dummy/config/initializers/session_store.rb
67
+ - spec/dummy/config/routes.rb
68
+ - spec/helpers/stateful_link_spec.rb
69
+ - spec/spec_helper.rb
70
+ has_rdoc: true
71
+ homepage: http://github.com/gzigzigzeo/stateful_link
72
+ licenses: []
73
+
74
+ post_install_message:
75
+ rdoc_options:
76
+ - --charset=UTF-8
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ hash: 3
94
+ segments:
95
+ - 0
96
+ version: "0"
97
+ requirements: []
98
+
99
+ rubyforge_project:
100
+ rubygems_version: 1.3.7
101
+ signing_key:
102
+ specification_version: 3
103
+ summary: Helper to generate stateful navigation links.
104
+ test_files:
105
+ - spec/dummy/app/controllers/application_controller.rb
106
+ - spec/dummy/app/helpers/application_helper.rb
107
+ - spec/dummy/config/application.rb
108
+ - spec/dummy/config/boot.rb
109
+ - spec/dummy/config/environment.rb
110
+ - spec/dummy/config/environments/development.rb
111
+ - spec/dummy/config/environments/production.rb
112
+ - spec/dummy/config/environments/test.rb
113
+ - spec/dummy/config/initializers/backtrace_silencers.rb
114
+ - spec/dummy/config/initializers/inflections.rb
115
+ - spec/dummy/config/initializers/mime_types.rb
116
+ - spec/dummy/config/initializers/secret_token.rb
117
+ - spec/dummy/config/initializers/session_store.rb
118
+ - spec/dummy/config/routes.rb
119
+ - spec/helpers/stateful_link_spec.rb
120
+ - spec/spec_helper.rb