switch_user 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -3,3 +3,4 @@ pkg/*
3
3
  .bundle
4
4
  .rvmrc
5
5
  Gemfile.lock
6
+ log/*.log
data/README.md CHANGED
@@ -12,7 +12,9 @@ switch_user is very useful in such use cases
12
12
 
13
13
  ## Example
14
14
 
15
- Visit here: [http://switch-user-example.heroku.com/][1], switch the current user in the select box.
15
+ Visit here: <http://switch-user-example.heroku.com>, switch the current user in the select box.
16
+
17
+ And source code here: <https://github.com/flyerhzm/switch_user_example>
16
18
 
17
19
  ## Install
18
20
 
@@ -57,7 +59,7 @@ If you have a wildcard route in your Rails 3 project, add a route before the wil
57
59
  By default, you can switch between Guest and all users in users table, you don't need to do anything. The following is the default configuration.
58
60
 
59
61
  SwitchUser.setup do |config|
60
- # provider may be :devise, :authlogic, :restful_authentication or :sorcery
62
+ # provider may be :devise, :authlogic, :clearance, :restful_authentication or :sorcery
61
63
  config.provider = :devise
62
64
 
63
65
  # available_users is a hash,
@@ -126,5 +128,3 @@ If you want to redirect user to "/dashboard" page
126
128
  Copyright © 2010 - 2012 Richard Huang (flyerhzm@gmail.com), released under the MIT license
127
129
 
128
130
  [0]: https://github.com/tablatom/hobo
129
- [1]: http://switch-user-example.heroku.com/
130
-
@@ -19,18 +19,15 @@ class SwitchUserController < ApplicationController
19
19
  end
20
20
 
21
21
  def available?
22
- SwitchUser.controller_guard.call(provider.current_user, request)
22
+ SwitchUser.controller_guard(provider.current_user, request)
23
23
  end
24
24
 
25
25
  def handle_request(params)
26
26
  if params[:scope_identifier].blank?
27
27
  provider.logout_all
28
28
  else
29
- params[:scope_identifier] =~ /^([^_]+)_(.*)$/
30
- scope, identifier = $1, $2
31
-
32
- user = SwitchUser::UserLoader.new(scope, identifier).load
33
- provider.login_exclusive(user, :scope => scope)
29
+ loader = SwitchUser::UserLoader.prepare(params)
30
+ provider.login_exclusive(loader.user, :scope => loader.scope)
34
31
  end
35
32
  end
36
33
 
@@ -39,7 +39,7 @@ module SwitchUserHelper
39
39
 
40
40
  def available?
41
41
  user = provider.current_users_without_scope.first
42
- SwitchUser.view_guard.call(user, request)
42
+ SwitchUser.view_guard(user, request)
43
43
  end
44
44
 
45
45
  def provider
data/lib/switch_user.rb CHANGED
@@ -11,9 +11,10 @@ module SwitchUser
11
11
  mattr_accessor :available_users
12
12
  mattr_accessor :available_users_identifiers
13
13
  mattr_accessor :available_users_names
14
- mattr_accessor :controller_guard
15
- mattr_accessor :view_guard
14
+ mattr_writer :controller_guard
15
+ mattr_writer :view_guard
16
16
  mattr_accessor :redirect_path
17
+ mattr_accessor :session_key
17
18
 
18
19
  def self.setup
19
20
  yield self
@@ -27,6 +28,14 @@ module SwitchUser
27
28
  available_users.keys
28
29
  end
29
30
 
31
+ def self.controller_guard(*args)
32
+ call_guard(@@controller_guard, args)
33
+ end
34
+
35
+ def self.view_guard(*args)
36
+ call_guard(@@view_guard, args)
37
+ end
38
+
30
39
  private
31
40
 
32
41
  def self.reset_config
@@ -37,6 +46,12 @@ module SwitchUser
37
46
  self.controller_guard = lambda { |current_user, request| Rails.env.development? }
38
47
  self.view_guard = lambda { |current_user, request| Rails.env.development? }
39
48
  self.redirect_path = lambda { |request, params| request.env["HTTP_REFERER"] ? :back : root_path }
49
+ self.session_key = :user_id
50
+ end
51
+
52
+ def self.call_guard(guard, args)
53
+ arity = guard.arity
54
+ guard.call(*args[0...arity])
40
55
  end
41
56
 
42
57
  reset_config
@@ -1,8 +1,11 @@
1
1
  module SwitchUser
2
2
  module Provider
3
3
  autoload :Authlogic, "switch_user/provider/authlogic"
4
+ autoload :Clearance, "switch_user/provider/clearance"
4
5
  autoload :Devise, "switch_user/provider/devise"
5
6
  autoload :RestfulAuthentication, "switch_user/provider/restful_authentication"
6
7
  autoload :Sorcery, "switch_user/provider/sorcery"
8
+ autoload :Dummy, "switch_user/provider/dummy"
9
+ autoload :Session, "switch_user/provider/session"
7
10
  end
8
11
  end
@@ -0,0 +1,23 @@
1
+ require 'switch_user/provider/base'
2
+
3
+ module SwitchUser
4
+ module Provider
5
+ class Clearance < Base
6
+ def initialize(controller)
7
+ @controller = controller
8
+ end
9
+
10
+ def login(user, scope = nil)
11
+ @controller.sign_in(user)
12
+ end
13
+
14
+ def logout(scope = nil)
15
+ @controller.sign_out
16
+ end
17
+
18
+ def current_user(scope = nil)
19
+ @controller.current_user
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require 'switch_user/provider/base'
2
+
3
+ module SwitchUser
4
+ module Provider
5
+ class Dummy < Base
6
+ def initialize(controller)
7
+ @user = nil
8
+ end
9
+
10
+ def login(user, scope = nil)
11
+ @user = user
12
+ end
13
+
14
+ def logout(scope = nil)
15
+ @user = nil
16
+ end
17
+
18
+ def current_user(scope = nil)
19
+ @user
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,29 @@
1
+ require 'switch_user/provider/base'
2
+
3
+ module SwitchUser
4
+ module Provider
5
+ class Session < Base
6
+ def initialize(controller)
7
+ @controller = controller
8
+ end
9
+
10
+ def login(user, scope = nil)
11
+ @controller.session[session_key] = user.id
12
+ end
13
+
14
+ def logout(scope = nil)
15
+ @controller.session.delete(session_key)
16
+ end
17
+
18
+ def current_user(scope = nil)
19
+ @controller.current_user
20
+ end
21
+
22
+ private
23
+
24
+ def session_key
25
+ SwitchUser.session_key
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,8 +1,10 @@
1
1
  if defined?(Rails)
2
2
  if defined? Rails::Engine
3
- class Engine < Rails::Engine
4
- config.to_prepare do
5
- ActionView::Base.send :include, SwitchUserHelper
3
+ module SwitchUser
4
+ class Engine < Rails::Engine
5
+ config.to_prepare do
6
+ ActionView::Base.send :include, SwitchUserHelper
7
+ end
6
8
  end
7
9
  end
8
10
  else
@@ -3,19 +3,31 @@ module SwitchUser
3
3
  attr_reader :scope
4
4
  attr_accessor :id
5
5
 
6
+ def self.prepare(*args)
7
+ options = args.extract_options!
8
+
9
+ if options[:scope_identifier]
10
+ options[:scope_identifier] =~ /^(.*)_([^_]+)$/
11
+ scope, id = $1, $2
12
+ else
13
+ scope, id = args
14
+ end
15
+ new(scope, id)
16
+ end
17
+
6
18
  def initialize(scope, id)
7
19
  self.scope = scope
8
20
  self.id = id
9
21
  end
10
22
 
11
- def load
12
- user_class.send(finder, id)
23
+ def user
24
+ user_class.where(column_name => id).first
13
25
  end
14
26
 
15
27
  private
16
28
 
17
29
  def scope=(scope)
18
- if SwitchUser.available_scopes.include?(scope.to_sym)
30
+ if scope && SwitchUser.available_scopes.include?(scope.to_sym)
19
31
  @scope = scope
20
32
  else
21
33
  raise InvalidScope
@@ -26,10 +38,8 @@ module SwitchUser
26
38
  scope.classify.constantize
27
39
  end
28
40
 
29
- def finder
30
- column_name = SwitchUser.available_users_identifiers[scope.to_sym]
31
-
32
- "find_by_#{column_name}"
41
+ def column_name
42
+ SwitchUser.available_users_identifiers[scope.to_sym]
33
43
  end
34
44
  end
35
45
  end
@@ -1,3 +1,3 @@
1
1
  module SwitchUser
2
- VERSION = "0.9.0"
2
+ VERSION = "0.9.1"
3
3
  end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'switch_user'
3
+ require 'switch_user_controller'
4
+
5
+ describe SwitchUserController, :type => :controller do
6
+ before do
7
+ SwitchUser.provider = :dummy
8
+ end
9
+
10
+ it "redirects the user to the specified location" do
11
+ SwitchUser.redirect_path = lambda {|_,_| "/path"}
12
+ controller.stub(:available? => true)
13
+ get :set_current_user, :scope_identifier => "user_1"
14
+
15
+ response.should redirect_to("/path")
16
+ end
17
+
18
+ it "denies access according to the guard block" do
19
+ SwitchUser.controller_guard = lambda {|_,_| false }
20
+ get :set_current_user
21
+
22
+ response.should be_forbidden
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'switch_user/provider/clearance'
3
+
4
+ class ClearanceController
5
+ def sign_in(user)
6
+ @user = user
7
+ end
8
+
9
+ def sign_out
10
+ @user = nil
11
+ end
12
+
13
+ def current_user
14
+ @user
15
+ end
16
+ end
17
+
18
+ describe SwitchUser::Provider::Clearance do
19
+ let(:controller) { ClearanceController.new }
20
+ let(:provider) { SwitchUser::Provider::Clearance.new(controller) }
21
+
22
+ it_behaves_like "a provider"
23
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'switch_user/provider/session'
3
+
4
+ class SessionController
5
+ def session
6
+ @session_hash ||= {}
7
+ end
8
+
9
+ def current_user
10
+ User.find_by_id(session[:uid]) if session[:uid]
11
+ end
12
+ end
13
+
14
+ describe SwitchUser::Provider::Session do
15
+ before do
16
+ user.stub(:id => 100)
17
+ User.stub(:find_by_id).with(100).and_return(user)
18
+ SwitchUser.session_key = :uid
19
+ end
20
+ let(:controller) { SessionController.new }
21
+ let(:provider) { SwitchUser::Provider::Session.new(controller) }
22
+
23
+ it_behaves_like "a provider"
24
+ end
data/spec/spec_helper.rb CHANGED
@@ -1 +1,12 @@
1
1
  require 'support/provider'
2
+ require 'support/application'
3
+ require 'rspec/rails'
4
+
5
+ RSpec.configure do |config|
6
+ config.filter_run :focus => true
7
+ config.run_all_when_everything_filtered = true
8
+ end
9
+
10
+ class ApplicationController < ActionController::Base
11
+
12
+ end
@@ -0,0 +1,7 @@
1
+ require "rails"
2
+ require "rails/all"
3
+
4
+ class MyApp < Rails::Application
5
+ config.active_support.deprecation = :log
6
+ end
7
+ MyApp.initialize!
@@ -2,35 +2,59 @@ require 'spec_helper'
2
2
  require 'switch_user/user_loader'
3
3
 
4
4
  class User
5
- def self.find_by_id(id)
5
+ def self.where(*)
6
+ []
6
7
  end
7
8
  end
8
9
 
9
10
  describe SwitchUser::UserLoader do
10
11
  let(:user) { stub(:user) }
12
+ let(:user_result) { [user] }
11
13
 
12
14
  it "raises an exception if we are passed an invalid scope" do
13
15
  expect { SwitchUser::UserLoader.new("useeer", 1) }.to raise_error(SwitchUser::InvalidScope)
14
16
  end
15
17
 
16
- it "loads a user" do
17
- User.stub(:find_by_id).with(1).and_return(user)
18
+ describe ".user" do
19
+ before do
20
+ SwitchUser.available_users_identifiers = {:user => :id}
21
+ User.stub(:where).with(:id => "1").and_return(user_result)
22
+ end
23
+ it "can be loaded from a scope and identifier" do
24
+ loaded_user = SwitchUser::UserLoader.prepare("user","1").user
25
+
26
+ loaded_user.should == user
27
+ end
28
+ it "can be loaded by a passing an unprocessed scope identifier" do
29
+ loaded_user = SwitchUser::UserLoader.prepare(:scope_identifier => "user_1").user
30
+
31
+ loaded_user.should == user
32
+ end
33
+ it "raises an error for an invalid scope" do
34
+ expect {
35
+ loaded_user = SwitchUser::UserLoader.prepare(nil, "1")
36
+ }.to raise_error(SwitchUser::InvalidScope)
37
+ end
38
+ end
39
+
40
+ it "returns a user" do
41
+ User.stub(:where).with(:id => 1).and_return(user_result)
18
42
 
19
43
  loader = SwitchUser::UserLoader.new("user", 1)
20
44
 
21
- loader.load.should == user
45
+ loader.user.should == user
22
46
  end
23
47
 
24
48
  it "returns nil if no user is found" do
25
49
  loader = SwitchUser::UserLoader.new("user", 2)
26
- loader.load.should == nil
50
+ loader.user.should == nil
27
51
  end
28
52
 
29
53
  it "loads a user with an alternate identifier column" do
30
- User.stub(:find_by_email).with(2).and_return(user)
54
+ User.stub(:where).with(:email => 2).and_return(user_result)
31
55
  SwitchUser.available_users_identifiers = {:user => :email}
32
56
 
33
57
  loader = SwitchUser::UserLoader.new("user", 2)
34
- loader.load.should == user
58
+ loader.user.should == user
35
59
  end
36
60
  end
@@ -2,10 +2,6 @@ require 'spec_helper'
2
2
  require 'switch_user'
3
3
 
4
4
  describe SwitchUser do
5
- it "has a default provider" do
6
- SwitchUser.provider.should == :devise
7
- end
8
-
9
5
  describe "#available_scopes" do
10
6
  it "returns a list of available scopes" do
11
7
  SwitchUser.available_scopes.should == [:user]
@@ -23,4 +19,21 @@ describe SwitchUser do
23
19
  SwitchUser.provider_class.should == SwitchUser::Provider::Devise
24
20
  end
25
21
  end
22
+
23
+ describe "guards" do
24
+ it "can have a 1 argument lambda" do
25
+ a = 0
26
+ SwitchUser.controller_guard = lambda {|p1| a = p1 }
27
+ SwitchUser.controller_guard(1,2,3)
28
+
29
+ a.should == 1
30
+ end
31
+ it "can have a 3 argument lambda" do
32
+ a = 0
33
+ SwitchUser.view_guard = lambda {|p1,p2,p3| a = p3 }
34
+ SwitchUser.view_guard(1,2,3)
35
+
36
+ a.should == 3
37
+ end
38
+ end
26
39
  end
data/switch_user.gemspec CHANGED
@@ -14,9 +14,12 @@ Gem::Specification.new do |s|
14
14
  s.required_rubygems_version = ">= 1.3.6"
15
15
  s.rubyforge_project = "switch_user"
16
16
 
17
- s.add_dependency "activesupport"
17
+ s.add_development_dependency "activesupport"
18
18
  s.add_development_dependency "bundler", ">= 1.0.0"
19
- s.add_development_dependency "rspec", "~> 2.11.0"
19
+ s.add_development_dependency "actionpack"
20
+ s.add_development_dependency "railties"
21
+ s.add_development_dependency "rspec-rails", "~> 2.11.0"
22
+ s.add_development_dependency "tzinfo"
20
23
 
21
24
  s.files = `git ls-files`.split("\n")
22
25
  s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: switch_user
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-10-31 00:00:00.000000000 Z
13
+ date: 2012-12-21 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -20,7 +20,7 @@ dependencies:
20
20
  - - ! '>='
21
21
  - !ruby/object:Gem::Version
22
22
  version: '0'
23
- type: :runtime
23
+ type: :development
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  none: false
@@ -45,7 +45,39 @@ dependencies:
45
45
  - !ruby/object:Gem::Version
46
46
  version: 1.0.0
47
47
  - !ruby/object:Gem::Dependency
48
- name: rspec
48
+ name: actionpack
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ - !ruby/object:Gem::Dependency
64
+ name: railties
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ - !ruby/object:Gem::Dependency
80
+ name: rspec-rails
49
81
  requirement: !ruby/object:Gem::Requirement
50
82
  none: false
51
83
  requirements:
@@ -60,6 +92,22 @@ dependencies:
60
92
  - - ~>
61
93
  - !ruby/object:Gem::Version
62
94
  version: 2.11.0
95
+ - !ruby/object:Gem::Dependency
96
+ name: tzinfo
97
+ requirement: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
63
111
  description: Easily switch current user to speed up development
64
112
  email:
65
113
  - flyerhzm@gmail.com
@@ -80,18 +128,25 @@ files:
80
128
  - lib/switch_user/provider.rb
81
129
  - lib/switch_user/provider/authlogic.rb
82
130
  - lib/switch_user/provider/base.rb
131
+ - lib/switch_user/provider/clearance.rb
83
132
  - lib/switch_user/provider/devise.rb
133
+ - lib/switch_user/provider/dummy.rb
84
134
  - lib/switch_user/provider/restful_authentication.rb
135
+ - lib/switch_user/provider/session.rb
85
136
  - lib/switch_user/provider/sorcery.rb
86
137
  - lib/switch_user/rails.rb
87
138
  - lib/switch_user/user_loader.rb
88
139
  - lib/switch_user/version.rb
89
140
  - rails/init.rb
141
+ - spec/controllers/switch_user_controller_spec.rb
90
142
  - spec/provider/authlogic_spec.rb
143
+ - spec/provider/clearance_spec.rb
91
144
  - spec/provider/devise_spec.rb
92
- - spec/provider/restful_authrentication_spec.rb
145
+ - spec/provider/restful_authentication_spec.rb
146
+ - spec/provider/session_spec.rb
93
147
  - spec/provider/sorcery_spec.rb
94
148
  - spec/spec_helper.rb
149
+ - spec/support/application.rb
95
150
  - spec/support/provider.rb
96
151
  - spec/switch_user/user_loader_spec.rb
97
152
  - spec/switch_user_spec.rb