switch_user 0.9.5 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +6 -0
- data/CHANGELOG.md +126 -0
- data/README.md +14 -6
- data/app/controllers/switch_user_controller.rb +1 -1
- data/lib/switch_user.rb +2 -2
- data/lib/switch_user/data_source.rb +42 -24
- data/lib/switch_user/provider/devise.rb +1 -1
- data/lib/switch_user/provider/sorcery.rb +16 -0
- data/lib/switch_user/user_set.rb +2 -2
- data/lib/switch_user/version.rb +1 -1
- data/spec/controllers/switch_user_controller_spec.rb +15 -15
- data/spec/integration/switch_user_spec.rb +13 -9
- data/spec/provider/authlogic_spec.rb +1 -1
- data/spec/provider/clearance_spec.rb +1 -1
- data/spec/provider/devise_spec.rb +29 -12
- data/spec/provider/dummy_spec.rb +1 -1
- data/spec/provider/restful_authentication_spec.rb +1 -1
- data/spec/provider/session_spec.rb +1 -1
- data/spec/provider/sorcery_spec.rb +2 -1
- data/spec/provider_spec.rb +2 -2
- data/spec/spec_helper.rb +5 -0
- data/spec/support/application.rb +0 -1
- data/spec/support/provider.rb +11 -11
- data/spec/switch_user/data_source_spec.rb +67 -29
- data/spec/switch_user/lambda_guard_spec.rb +5 -5
- data/spec/switch_user/user_loader_spec.rb +11 -11
- data/spec/switch_user/user_set_spec.rb +13 -13
- data/spec/switch_user_spec.rb +3 -3
- data/switch_user.gemspec +2 -1
- metadata +23 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea596325fc5e142d307dd24c245ec8e80528fddc
|
4
|
+
data.tar.gz: 32f79b7b8d3d67b364c3973d01efc8a0c308ed06
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f85b9832f7b1efd694ce7be400f3668089db86b7f8f0b8ff7cdcfa59e116824bd84e91ad8feecebb51d3f554c9fbd30bcfbc03ef8a567422a234927751508bbb
|
7
|
+
data.tar.gz: f2ccfc25f69f7f6671c936515a6c4990fd1ef64a6058486234deae968c97dc904abcd905dde65f6e7baedda922817845f06f5eb0926a1b860a02b396b6be2dc6
|
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
# Next Release
|
2
|
+
|
3
|
+
## 4.14.8
|
4
|
+
|
5
|
+
* compatible with `composite_primary_keys` gem
|
6
|
+
|
7
|
+
## 4.14.7
|
8
|
+
|
9
|
+
* Fix AR 4.2 SingularAssociation#reader result can be nil
|
10
|
+
* `perform_out_of_channel_notifications` should always be triggered
|
11
|
+
|
12
|
+
## 4.14.6
|
13
|
+
|
14
|
+
* Fix false positive with `belongs_to` -> `belongs_to` for active\_record 4.2
|
15
|
+
* Activate active\_record hacks only when Bullet already start
|
16
|
+
|
17
|
+
## 4.14.5
|
18
|
+
|
19
|
+
* Don't execute query when running `to_sql`
|
20
|
+
* Send backtrace to `uniform_notifier`
|
21
|
+
* Fix sse response check
|
22
|
+
* Dynamically delegate available notifiers to UniformNotifier
|
23
|
+
|
24
|
+
## 4.14.4
|
25
|
+
|
26
|
+
* Fix false N + 1 warnings on Rails 4.2
|
27
|
+
|
28
|
+
## 4.14.3
|
29
|
+
|
30
|
+
* Fix false positive on create
|
31
|
+
|
32
|
+
## 4.14.2
|
33
|
+
|
34
|
+
* Hotfix nil object when `add_impossible_object`
|
35
|
+
|
36
|
+
## 4.14.1
|
37
|
+
|
38
|
+
* Fix `has_one` then `has_many` associations in rails 4.2
|
39
|
+
* Append js and dom to html body in proper position
|
40
|
+
|
41
|
+
## 4.14.0 (10/03/2014)
|
42
|
+
|
43
|
+
* Support rails 4.2
|
44
|
+
* Polish notification output
|
45
|
+
* Fix warning: `*' interpreted as argument prefix
|
46
|
+
|
47
|
+
## 4.13.0 (07/19/2014)
|
48
|
+
|
49
|
+
* Support include? call on ar associations
|
50
|
+
|
51
|
+
## 4.12.0 (07/13/2014)
|
52
|
+
|
53
|
+
* Fix false n+1 queries caused by inversed objects.
|
54
|
+
* Replace .id with .primary_key_value
|
55
|
+
* Rename bullet_ar_key to bullet_key
|
56
|
+
* Fix rails sse detect
|
57
|
+
* Fix bullet using in test environment
|
58
|
+
* Memoize whoami
|
59
|
+
|
60
|
+
## 4.11.0 (06/24/2014)
|
61
|
+
|
62
|
+
* Support empty? call on ar associations
|
63
|
+
* Skip detecting if object is a new record
|
64
|
+
|
65
|
+
## 4.10.0 (06/06/2014)
|
66
|
+
|
67
|
+
* Handle join query smarter
|
68
|
+
* Support mongoid 4.0
|
69
|
+
* Thread safe
|
70
|
+
* Add debug mode
|
71
|
+
|
72
|
+
## 4.9.0 (04/30/2014)
|
73
|
+
|
74
|
+
* Add Bullet.stacktrace_includes option
|
75
|
+
* Applied keyword argument fixes on Ruby 2.2.0
|
76
|
+
* Add bugsnag notifier
|
77
|
+
* Support rails 4.1.0
|
78
|
+
|
79
|
+
## 4.8.0 (02/16/2014)
|
80
|
+
|
81
|
+
* Support rails 4.1.0.beta1
|
82
|
+
* Update specs to be RSpec 3.0 compatible
|
83
|
+
* Update latest minor version activerecord and mongoid on travis
|
84
|
+
|
85
|
+
## 4.7.0 (11/03/2013)
|
86
|
+
|
87
|
+
* Add coverall support
|
88
|
+
* Add helper to profile code outside a request
|
89
|
+
* Add activesupport dependency
|
90
|
+
* Add Bullet.raise notification
|
91
|
+
* Add Bullet.add_footer notification
|
92
|
+
* Fix activerecord4 warnings in test code
|
93
|
+
|
94
|
+
## 4.6.0 (04/18/2013)
|
95
|
+
|
96
|
+
* Fix Bullet::Rack to support sinatra
|
97
|
+
|
98
|
+
## 4.5.0 (03/24/2013)
|
99
|
+
|
100
|
+
* Add api way to access captured associatioin
|
101
|
+
* Allow disable n_plus_one_query, unused_eager_loading and counter_cache respectively
|
102
|
+
* Add whitelist
|
103
|
+
|
104
|
+
## 4.4.0 (03/15/2013)
|
105
|
+
|
106
|
+
* Remove disable_browser_cache option
|
107
|
+
* Compatible with Rails 4.0.0.beta1
|
108
|
+
|
109
|
+
## 4.3.0 (12/28/2012)
|
110
|
+
|
111
|
+
* Fix content-length for non ascii html
|
112
|
+
* Add mongoid 2.5.x support
|
113
|
+
|
114
|
+
## 4.2.0 (09/29/2012)
|
115
|
+
|
116
|
+
* Add Bullet::Dependency to check AR and mongoid version
|
117
|
+
* Add Rails 4 support
|
118
|
+
* Add airbrake notifier support
|
119
|
+
|
120
|
+
## 4.1.0 (05/30/2012)
|
121
|
+
|
122
|
+
* Add mongoid 3 support
|
123
|
+
|
124
|
+
## 4.0.0 (05/09/2012)
|
125
|
+
|
126
|
+
* Add mongoid support
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# switch_user
|
2
2
|
|
3
|
+
[![Build Status](https://secure.travis-ci.org/flyerhzm/switch_user.png)](http://travis-ci.org/flyerhzm/switch_user)
|
4
|
+
|
3
5
|
Inspired from [hobo][0], switch_user provides a convenient way to switch current user without needing to log out and log in manually.
|
4
6
|
|
5
7
|
## Use Case
|
@@ -45,9 +47,9 @@ If there are too many users (on production), the switch_user_select is not a goo
|
|
45
47
|
If you have a wildcard route in your project, add a route before the wildcard route.
|
46
48
|
```ruby
|
47
49
|
# config/routes.rb
|
48
|
-
|
49
|
-
# wildcard route that will
|
50
|
-
|
50
|
+
get 'switch_user' => 'switch_user#set_current_user'
|
51
|
+
# wildcard route that will get
|
52
|
+
get ':id' => 'pages#show'
|
51
53
|
```
|
52
54
|
## Configuration
|
53
55
|
|
@@ -138,7 +140,7 @@ This example would allow an admin user to user switch_user, but would only let y
|
|
138
140
|
### How it works
|
139
141
|
|
140
142
|
Click the checkbox next to switch_user_select menu to remember that user for this session. Once this
|
141
|
-
has been checked, that user is passed in as the 3rd option to the view and controller guards.
|
143
|
+
has been checked, that user is passed in as the 3rd option to the view and controller guards.
|
142
144
|
This allows you to check against current_user as well as that original_user to see if the
|
143
145
|
switch_user action should be allowed.
|
144
146
|
|
@@ -146,8 +148,14 @@ switch_user action should be allowed.
|
|
146
148
|
|
147
149
|
This feature should be used with extreme caution because of the security implications. This is especially true in a production environment.
|
148
150
|
|
151
|
+
## Contributing
|
152
|
+
|
153
|
+
#### Run tests
|
154
|
+
|
155
|
+
`bundle exec rspec spec`
|
156
|
+
|
149
157
|
## Credit
|
150
158
|
|
151
|
-
Copyright © 2010 -
|
159
|
+
Copyright © 2010 - 2015 Richard Huang (flyerhzm@gmail.com), released under the MIT license
|
152
160
|
|
153
|
-
[0]: https://github.com/tablatom/hobo
|
161
|
+
[0]: https://github.com/tablatom/hobo
|
@@ -19,7 +19,7 @@ class SwitchUserController < ApplicationController
|
|
19
19
|
private
|
20
20
|
|
21
21
|
def developer_modes_only
|
22
|
-
|
22
|
+
raise ActionController::RoutingError.new('Do not try to hack us.') unless available?
|
23
23
|
end
|
24
24
|
|
25
25
|
def available?
|
data/lib/switch_user.rb
CHANGED
@@ -38,7 +38,7 @@ module SwitchUser
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def self.all_users
|
41
|
-
data_sources.
|
41
|
+
data_sources.all
|
42
42
|
end
|
43
43
|
|
44
44
|
def self.data_sources
|
@@ -47,7 +47,7 @@ module SwitchUser
|
|
47
47
|
name = available_users_names.fetch(scope)
|
48
48
|
DataSource.new(loader, scope, identifier, name)
|
49
49
|
end
|
50
|
-
sources.unshift(GuestDataSource.new
|
50
|
+
sources.unshift(GuestDataSource.new) if helper_with_guest
|
51
51
|
DataSources.new(sources)
|
52
52
|
end
|
53
53
|
|
@@ -1,50 +1,55 @@
|
|
1
1
|
module SwitchUser
|
2
|
-
|
3
|
-
|
4
|
-
loader.call.map {|u| Record.new(u, self) }
|
5
|
-
end
|
6
|
-
end
|
2
|
+
class DataSources
|
3
|
+
attr_reader :sources
|
7
4
|
|
8
|
-
|
9
|
-
|
10
|
-
scope_id == other_scope_id
|
5
|
+
def initialize(sources)
|
6
|
+
@sources = sources
|
11
7
|
end
|
12
8
|
|
13
|
-
def
|
14
|
-
|
9
|
+
def all
|
10
|
+
sources.flat_map { |source| source.all }
|
15
11
|
end
|
16
12
|
|
17
|
-
def scope_id
|
13
|
+
def find_scope_id(scope_id)
|
14
|
+
sources.map {|source| source.find_scope_id(scope_id) }.compact.first
|
18
15
|
end
|
19
16
|
end
|
20
17
|
|
21
|
-
class
|
22
|
-
|
18
|
+
class DataSource
|
19
|
+
attr_reader :loader, :scope, :identifier, :name
|
20
|
+
|
21
|
+
def initialize(loader, scope, identifier, name)
|
22
|
+
@loader = loader
|
23
|
+
@scope = scope
|
24
|
+
@identifier = identifier
|
23
25
|
@name = name
|
24
26
|
end
|
25
27
|
|
26
|
-
def
|
27
|
-
|
28
|
+
def all
|
29
|
+
loader.call.select(identifier, name).map { |user| Record.new(user, self) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def find_scope_id(scope_id)
|
33
|
+
user = loader.call.find_by identifier => scope_id.delete("#{scope}_")
|
34
|
+
Record.new(user, self)
|
28
35
|
end
|
29
36
|
end
|
30
37
|
|
31
|
-
|
38
|
+
class GuestDataSource
|
32
39
|
def users
|
33
|
-
|
40
|
+
[ GuestRecord.new ]
|
34
41
|
end
|
35
42
|
|
36
43
|
def find_scope_id(scope_id)
|
37
|
-
users.flat_map.detect {|u| u.scope_id == scope_id }
|
38
44
|
end
|
39
45
|
end
|
40
46
|
|
41
|
-
Record
|
42
|
-
|
43
|
-
scope_id == other_scope_id
|
44
|
-
end
|
47
|
+
class Record
|
48
|
+
attr_reader :user, :source
|
45
49
|
|
46
|
-
def
|
47
|
-
|
50
|
+
def initialize(user, source)
|
51
|
+
@user = user
|
52
|
+
@source = source
|
48
53
|
end
|
49
54
|
|
50
55
|
def label
|
@@ -54,5 +59,18 @@ module SwitchUser
|
|
54
59
|
def scope
|
55
60
|
source.scope
|
56
61
|
end
|
62
|
+
|
63
|
+
def scope_id
|
64
|
+
"#{source.scope}_#{user.send(source.identifier)}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class GuestRecord
|
69
|
+
def label
|
70
|
+
"Guest"
|
71
|
+
end
|
72
|
+
|
73
|
+
def scope_id
|
74
|
+
end
|
57
75
|
end
|
58
76
|
end
|
@@ -10,7 +10,23 @@ module SwitchUser
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def logout(scope = nil)
|
13
|
+
if SwitchUser.switch_back
|
14
|
+
save_original_user_identifier
|
15
|
+
end
|
16
|
+
|
13
17
|
@controller.logout
|
18
|
+
|
19
|
+
restore_original_user_identifier
|
20
|
+
end
|
21
|
+
|
22
|
+
def save_original_user_identifier
|
23
|
+
@original_user_scope_identifier = @controller.session[:original_user_scope_identifier]
|
24
|
+
end
|
25
|
+
|
26
|
+
def restore_original_user_identifier
|
27
|
+
if @original_user_scope_identifier
|
28
|
+
@controller.session[:original_user_scope_identifier] = @original_user_scope_identifier
|
29
|
+
end
|
14
30
|
end
|
15
31
|
|
16
32
|
def current_user(scope = nil)
|
data/lib/switch_user/user_set.rb
CHANGED
@@ -48,10 +48,10 @@ module SwitchUser
|
|
48
48
|
if scoped.respond_to?(:scoped)
|
49
49
|
scoped
|
50
50
|
else
|
51
|
-
user_class.scoped
|
51
|
+
user_class.respond_to?(:scoped) ? user_class.scoped : user_class.all
|
52
52
|
end
|
53
53
|
else
|
54
|
-
user_class.scoped
|
54
|
+
user_class.respond_to?(:scoped) ? user_class.scoped : user_class.all
|
55
55
|
end
|
56
56
|
end
|
57
57
|
class Record < Struct.new(:id, :label, :scope)
|
data/lib/switch_user/version.rb
CHANGED
@@ -2,30 +2,30 @@ require 'spec_helper'
|
|
2
2
|
require 'switch_user'
|
3
3
|
require 'switch_user_controller'
|
4
4
|
|
5
|
-
describe SwitchUserController, :type => :controller do
|
5
|
+
RSpec.describe SwitchUserController, :type => :controller do
|
6
6
|
before do
|
7
7
|
SwitchUser.provider = :dummy
|
8
8
|
end
|
9
9
|
|
10
|
-
let(:admin) {
|
11
|
-
let(:provider) {
|
10
|
+
let(:admin) { double(:admin, :admin? => true) }
|
11
|
+
let(:provider) { double(:provider,
|
12
12
|
:original_user => admin,
|
13
13
|
:current_user => nil)
|
14
14
|
}
|
15
15
|
describe "#set_current_user" do
|
16
16
|
it "redirects the user to the specified location" do
|
17
17
|
SwitchUser.redirect_path = lambda {|_,_| "/path"}
|
18
|
-
controller.
|
18
|
+
allow(controller).to receive(:available?).and_return(true)
|
19
19
|
get :set_current_user, :scope_identifier => "user_1"
|
20
20
|
|
21
|
-
response.
|
21
|
+
expect(response).to redirect_to("/path")
|
22
22
|
end
|
23
23
|
|
24
24
|
it "denies access according to the guard block" do
|
25
25
|
SwitchUser.controller_guard = lambda {|_,_,_| false }
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
expect {
|
27
|
+
get :set_current_user
|
28
|
+
}.to raise_error(ActionController::RoutingError)
|
29
29
|
end
|
30
30
|
|
31
31
|
describe "requests with a privileged original_user" do
|
@@ -35,35 +35,35 @@ describe SwitchUserController, :type => :controller do
|
|
35
35
|
}
|
36
36
|
end
|
37
37
|
it "allows access using the original_user param" do
|
38
|
-
controller.
|
38
|
+
allow(controller).to receive(:provider).and_return(provider)
|
39
39
|
|
40
|
-
provider.
|
40
|
+
expect(provider).to receive(:logout_all)
|
41
41
|
|
42
42
|
get :set_current_user
|
43
43
|
|
44
|
-
response.
|
44
|
+
expect(response).to be_redirect
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
49
|
describe "#remember_user" do
|
50
50
|
before do
|
51
|
-
controller.
|
51
|
+
allow(controller).to receive(:provider).and_return(provider)
|
52
52
|
SwitchUser.switch_back = true
|
53
53
|
end
|
54
54
|
it "can remember the current user" do
|
55
|
-
provider.
|
55
|
+
expect(provider).to receive(:remember_current_user).with(true)
|
56
56
|
|
57
57
|
get :remember_user, :remember => "true"
|
58
58
|
end
|
59
59
|
it "can forget the current user" do
|
60
|
-
provider.
|
60
|
+
expect(provider).to receive(:remember_current_user).with(false)
|
61
61
|
|
62
62
|
get :remember_user, :remember => "false"
|
63
63
|
end
|
64
64
|
it "does nothing if switch_back is not enabled" do
|
65
65
|
SwitchUser.switch_back = false
|
66
|
-
provider.
|
66
|
+
expect(provider).not_to receive(:remember_current_user)
|
67
67
|
|
68
68
|
get :remember_user, :remember => "true"
|
69
69
|
end
|
@@ -1,26 +1,29 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe "Using SwitchUser", :type => :request do
|
3
|
+
RSpec.describe "Using SwitchUser", :type => :request do
|
4
4
|
let(:user) { User.create!(:email => "foo@bar.com", :admin => true) }
|
5
5
|
let(:other_user) { User.create!(:email => "other@bar.com", :admin => false) }
|
6
|
+
|
6
7
|
before do
|
7
8
|
SwitchUser.reset_config
|
8
9
|
SwitchUser.provider = :session
|
9
10
|
SwitchUser.controller_guard = lambda { |current_user, request| Rails.env.test? }
|
10
11
|
SwitchUser.redirect_path = lambda {|_,_| "/dummys/open"}
|
11
12
|
end
|
13
|
+
|
12
14
|
it "signs a user in using switch_user" do
|
13
15
|
# can't access protected url
|
14
16
|
get "/dummy/protected"
|
15
|
-
response.
|
17
|
+
expect(response).to be_redirect
|
16
18
|
|
17
19
|
get "/switch_user?scope_identifier=user_#{other_user.id}"
|
18
|
-
response.
|
20
|
+
expect(response).to be_redirect
|
19
21
|
|
20
22
|
# now that we are logged in via switch_user we can access
|
21
23
|
get "/dummy/protected"
|
22
|
-
response.
|
24
|
+
expect(response).to be_success
|
23
25
|
end
|
26
|
+
|
24
27
|
context "using switch_back" do
|
25
28
|
before do
|
26
29
|
SwitchUser.switch_back = true
|
@@ -28,6 +31,7 @@ describe "Using SwitchUser", :type => :request do
|
|
28
31
|
current_user && current_user.admin? || original_user && original_user.admin?
|
29
32
|
}
|
30
33
|
end
|
34
|
+
|
31
35
|
it "can switch back to a different user" do
|
32
36
|
# login
|
33
37
|
post "/login", :id => user.id
|
@@ -35,23 +39,23 @@ describe "Using SwitchUser", :type => :request do
|
|
35
39
|
|
36
40
|
# have SwitchUser remember us
|
37
41
|
get "/switch_user/remember_user", :remember => true
|
38
|
-
session["original_user_scope_identifier"].
|
42
|
+
expect(session["original_user_scope_identifier"]).to be_present
|
39
43
|
|
40
44
|
# check that we can switch to another user
|
41
45
|
get "/switch_user?scope_identifier=user_#{other_user.id}"
|
42
|
-
session["user_id"].
|
46
|
+
expect(session["user_id"]).to eq other_user.id
|
43
47
|
|
44
48
|
# logout
|
45
49
|
get "/logout"
|
46
|
-
session["user_id"].
|
50
|
+
expect(session["user_id"]).to be_nil
|
47
51
|
|
48
52
|
# check that we can still switch to another user
|
49
53
|
get "/switch_user?scope_identifier=user_#{user.id}"
|
50
|
-
session["user_id"].
|
54
|
+
expect(session["user_id"]).to eq user.id
|
51
55
|
|
52
56
|
# check that we can be un-remembered
|
53
57
|
get "/switch_user/remember_user", :remember => false
|
54
|
-
session["original_user"].
|
58
|
+
expect(session["original_user"]).to be_nil
|
55
59
|
end
|
56
60
|
end
|
57
61
|
end
|
@@ -29,7 +29,7 @@ class AuthlogicController < TestController
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
describe SwitchUser::Provider::Authlogic do
|
32
|
+
RSpec.describe SwitchUser::Provider::Authlogic do
|
33
33
|
let(:controller) { AuthlogicController.new }
|
34
34
|
let(:provider) { SwitchUser::Provider::Authlogic.new(controller) }
|
35
35
|
|
@@ -15,7 +15,7 @@ class ClearanceController < TestController
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
describe SwitchUser::Provider::Clearance do
|
18
|
+
RSpec.describe SwitchUser::Provider::Clearance do
|
19
19
|
let(:controller) { ClearanceController.new }
|
20
20
|
let(:provider) { SwitchUser::Provider::Clearance.new(controller) }
|
21
21
|
|
@@ -1,6 +1,17 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'switch_user/provider/devise'
|
3
3
|
|
4
|
+
class FakeWardenSessionSerializer
|
5
|
+
attr_accessor :user_hash
|
6
|
+
|
7
|
+
|
8
|
+
def store(user, scope)
|
9
|
+
return unless user
|
10
|
+
user_hash[scope] = user
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
4
15
|
class FakeWarden
|
5
16
|
attr_reader :user_hash
|
6
17
|
|
@@ -13,6 +24,12 @@ class FakeWarden
|
|
13
24
|
@user_hash[scope] = user
|
14
25
|
end
|
15
26
|
|
27
|
+
def session_serializer
|
28
|
+
serializer = FakeWardenSessionSerializer.new
|
29
|
+
serializer.user_hash = @user_hash
|
30
|
+
serializer
|
31
|
+
end
|
32
|
+
|
16
33
|
def user(scope)
|
17
34
|
@user_hash[scope]
|
18
35
|
end
|
@@ -32,55 +49,55 @@ class DeviseController < TestController
|
|
32
49
|
end
|
33
50
|
end
|
34
51
|
|
35
|
-
describe SwitchUser::Provider::Devise do
|
52
|
+
RSpec.describe SwitchUser::Provider::Devise do
|
36
53
|
let(:controller) { DeviseController.new }
|
37
54
|
let(:provider) { SwitchUser::Provider::Devise.new(controller) }
|
38
|
-
let(:user) {
|
55
|
+
let(:user) { double(:user) }
|
39
56
|
|
40
57
|
it_behaves_like "a provider"
|
41
58
|
|
42
59
|
it "can use alternate scopes" do
|
43
|
-
user =
|
60
|
+
user = double(:user)
|
44
61
|
provider.login(user, :admin)
|
45
62
|
|
46
|
-
provider.current_user(:admin).
|
63
|
+
expect(provider.current_user(:admin)).to eq user
|
47
64
|
end
|
48
65
|
|
49
66
|
describe "#login_exclusive" do
|
50
67
|
before do
|
51
|
-
SwitchUser.
|
68
|
+
allow(SwitchUser).to receive(:available_users).and_return({:user => nil, :admin => nil})
|
52
69
|
provider.login(user, :admin)
|
53
70
|
provider.login_exclusive(user, :scope => "user")
|
54
71
|
end
|
55
72
|
|
56
73
|
it "logs the user in" do
|
57
|
-
provider.current_user.
|
74
|
+
expect(provider.current_user).to eq user
|
58
75
|
end
|
59
76
|
|
60
77
|
it "logs out other scopes" do
|
61
|
-
provider.current_user(:admin).
|
78
|
+
expect(provider.current_user(:admin)).to be_nil
|
62
79
|
end
|
63
80
|
end
|
64
81
|
|
65
82
|
describe "#logout_all" do
|
66
83
|
it "logs out users under all scopes" do
|
67
|
-
SwitchUser.
|
84
|
+
allow(SwitchUser).to receive(:available_users).and_return({:user => nil, :admin => nil})
|
68
85
|
provider.login(user, :admin)
|
69
86
|
provider.login(user, :user)
|
70
87
|
|
71
88
|
provider.logout_all
|
72
89
|
|
73
|
-
provider.current_user(:admin).
|
74
|
-
provider.current_user(:user).
|
90
|
+
expect(provider.current_user(:admin)).to be_nil
|
91
|
+
expect(provider.current_user(:user)).to be_nil
|
75
92
|
end
|
76
93
|
end
|
77
94
|
|
78
95
|
describe "#all_current_users" do
|
79
96
|
it "pulls users from an alternate scope" do
|
80
|
-
SwitchUser.
|
97
|
+
allow(SwitchUser).to receive(:available_users).and_return({:user => nil, :admin => nil})
|
81
98
|
provider.login(user, :admin)
|
82
99
|
|
83
|
-
provider.current_users_without_scope.
|
100
|
+
expect(provider.current_users_without_scope).to eq [user]
|
84
101
|
end
|
85
102
|
end
|
86
103
|
end
|
data/spec/provider/dummy_spec.rb
CHANGED
@@ -4,7 +4,7 @@ require 'switch_user/provider/dummy'
|
|
4
4
|
class SessionController < TestController
|
5
5
|
end
|
6
6
|
|
7
|
-
describe SwitchUser::Provider::Session do
|
7
|
+
RSpec.describe SwitchUser::Provider::Session do
|
8
8
|
let(:controller) { SessionController.new }
|
9
9
|
let(:provider) { SwitchUser::Provider::Dummy.new(controller) }
|
10
10
|
|
@@ -9,7 +9,7 @@ class RestfulAuthenticationController < TestController
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
describe SwitchUser::Provider::RestfulAuthentication do
|
12
|
+
RSpec.describe SwitchUser::Provider::RestfulAuthentication do
|
13
13
|
let(:controller) { RestfulAuthenticationController.new }
|
14
14
|
let(:provider) { SwitchUser::Provider::RestfulAuthentication.new(controller) }
|
15
15
|
|
@@ -4,6 +4,7 @@ require 'switch_user/provider/sorcery'
|
|
4
4
|
class SorceryController < TestController
|
5
5
|
def logout
|
6
6
|
@user = nil
|
7
|
+
reset_session
|
7
8
|
end
|
8
9
|
|
9
10
|
def auto_login(user)
|
@@ -15,7 +16,7 @@ class SorceryController < TestController
|
|
15
16
|
end
|
16
17
|
end
|
17
18
|
|
18
|
-
describe SwitchUser::Provider::Sorcery do
|
19
|
+
RSpec.describe SwitchUser::Provider::Sorcery do
|
19
20
|
let(:controller) { SorceryController.new }
|
20
21
|
let(:provider) { SwitchUser::Provider::Sorcery.new(controller) }
|
21
22
|
|
data/spec/provider_spec.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
module SwitchUser
|
4
|
-
describe Provider do
|
4
|
+
RSpec.describe Provider do
|
5
5
|
it "initializes the provider" do
|
6
6
|
SwitchUser.provider = :dummy
|
7
|
-
Provider.init(
|
7
|
+
expect(Provider.init(double(:controller))).to be_a(Provider::Dummy)
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -10,10 +10,15 @@ RSpec.configure do |config|
|
|
10
10
|
config.filter_run :focus => true
|
11
11
|
config.run_all_when_everything_filtered = true
|
12
12
|
config.use_transactional_fixtures = true
|
13
|
+
config.expose_dsl_globally = false
|
13
14
|
end
|
14
15
|
|
15
16
|
class TestController
|
16
17
|
def session
|
17
18
|
@session_hash ||= {}
|
18
19
|
end
|
20
|
+
|
21
|
+
def reset_session
|
22
|
+
@session_hash = {}
|
23
|
+
end
|
19
24
|
end
|
data/spec/support/application.rb
CHANGED
data/spec/support/provider.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
shared_examples_for "a provider" do
|
1
|
+
RSpec.shared_examples_for "a provider" do
|
2
2
|
let(:user) { User.create! }
|
3
3
|
let(:other_user) { User.create! }
|
4
4
|
|
5
5
|
it "can log a user in" do
|
6
6
|
provider.login(user)
|
7
7
|
|
8
|
-
provider.current_user.
|
8
|
+
expect(provider.current_user).to eq user
|
9
9
|
end
|
10
10
|
|
11
11
|
it "can log a user out" do
|
@@ -13,39 +13,39 @@ shared_examples_for "a provider" do
|
|
13
13
|
|
14
14
|
provider.logout
|
15
15
|
|
16
|
-
provider.current_user.
|
16
|
+
expect(provider.current_user).to eq nil
|
17
17
|
end
|
18
18
|
|
19
19
|
it "responds to login_exclusive" do
|
20
|
-
provider.
|
20
|
+
expect(provider).to respond_to(:login_exclusive)
|
21
21
|
end
|
22
22
|
|
23
23
|
it "responds to login_exclusive" do
|
24
|
-
provider.
|
24
|
+
expect(provider).to respond_to(:login_inclusive)
|
25
25
|
end
|
26
26
|
|
27
27
|
it "knows if there are any users logged in" do
|
28
28
|
provider.login(user)
|
29
29
|
|
30
|
-
provider.current_users_without_scope.
|
30
|
+
expect(provider.current_users_without_scope).to eq [user]
|
31
31
|
end
|
32
32
|
|
33
33
|
it "can lock the original user, allowing us to change current_user" do
|
34
34
|
provider.login(user)
|
35
35
|
provider.remember_current_user(true)
|
36
|
-
provider.
|
36
|
+
provider.login_exclusive(other_user, scope: "user")
|
37
37
|
|
38
|
-
provider.original_user.
|
39
|
-
provider.current_user.
|
38
|
+
expect(provider.original_user).to eq user
|
39
|
+
expect(provider.current_user).to eq other_user
|
40
40
|
end
|
41
41
|
|
42
42
|
it "can forget the original_user" do
|
43
43
|
provider.login(user)
|
44
44
|
provider.remember_current_user(true)
|
45
45
|
|
46
|
-
provider.original_user.
|
46
|
+
expect(provider.original_user).to eq user
|
47
47
|
provider.remember_current_user(false)
|
48
48
|
|
49
|
-
provider.original_user.
|
49
|
+
expect(provider.original_user).to eq nil
|
50
50
|
end
|
51
51
|
end
|
@@ -1,49 +1,87 @@
|
|
1
1
|
require 'switch_user/data_source'
|
2
2
|
|
3
3
|
module SwitchUser
|
4
|
-
describe
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
RSpec.describe DataSources do
|
5
|
+
describe '#all' do
|
6
|
+
it 'aggregates multiple data_sources' do
|
7
|
+
user = double(:user)
|
8
|
+
s1 = double(:s1, :all => [user])
|
9
|
+
source = DataSources.new([s1, s1])
|
8
10
|
|
9
|
-
|
11
|
+
expect(source.all).to eq [user, user]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#find_scope_id' do
|
16
|
+
it 'can find a corresponding record across data sources' do
|
17
|
+
user = double(:user)
|
18
|
+
s1 = double(:s1, :find_scope_id => nil)
|
19
|
+
s2 = double(:s2, :find_scope_id => user)
|
20
|
+
source = DataSources.new([s1, s2])
|
21
|
+
|
22
|
+
expect(source.find_scope_id("user_10")).to eq user
|
23
|
+
end
|
10
24
|
end
|
11
25
|
end
|
12
26
|
|
13
|
-
describe
|
14
|
-
it
|
15
|
-
|
16
|
-
s1 = double(:s1, :users => [user])
|
17
|
-
source = DataSources.new([s1,s1])
|
27
|
+
RSpec.describe DataSource do
|
28
|
+
pending # it's tested in integration test, need to find a good way to test it here.
|
29
|
+
end
|
18
30
|
|
19
|
-
|
31
|
+
RSpec.describe GuestDataSource do
|
32
|
+
let(:source) { GuestDataSource.new }
|
33
|
+
|
34
|
+
describe '#users' do
|
35
|
+
it 'gets a GuestRecord' do
|
36
|
+
expect(source.users.size).to eq 1
|
37
|
+
expect(source.users.first).to be_instance_of GuestRecord
|
38
|
+
end
|
20
39
|
end
|
21
40
|
|
22
|
-
describe
|
23
|
-
it
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
41
|
+
describe '#find_scope_id' do
|
42
|
+
it 'gets nil' do
|
43
|
+
expect(source.find_scope_id('')).to be_nil
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
28
47
|
|
29
|
-
|
48
|
+
RSpec.describe Record do
|
49
|
+
let(:source) { DataSource.new({}, :user, :id, :email) }
|
50
|
+
let(:user) { double(:user, id: '1', email: 'flyerhzm@gmail.com') }
|
51
|
+
let(:record) { Record.new(user, source) }
|
52
|
+
|
53
|
+
describe '#label' do
|
54
|
+
it 'gets user email' do
|
55
|
+
expect(record.label).to eq 'flyerhzm@gmail.com'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '#scope' do
|
60
|
+
it 'gets user' do
|
61
|
+
expect(record.scope).to eq :user
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '#scope_id' do
|
66
|
+
it 'gets scope and id' do
|
67
|
+
expect(record.scope_id).to eq 'user_1'
|
30
68
|
end
|
31
69
|
end
|
32
70
|
end
|
33
71
|
|
34
|
-
describe
|
35
|
-
|
36
|
-
id1 = "user_100"
|
37
|
-
id2 = "user_101"
|
38
|
-
id3 = "staff_100"
|
39
|
-
user = double(:user, :id => 100, :email => "test@example.com")
|
40
|
-
source = DataSource.new(nil, :user, :id, :email)
|
72
|
+
RSpec.describe GuestRecord do
|
73
|
+
let(:record) { GuestRecord.new }
|
41
74
|
|
42
|
-
|
75
|
+
describe '#label' do
|
76
|
+
it 'gets Guest' do
|
77
|
+
expect(record.label).to eq 'Guest'
|
78
|
+
end
|
79
|
+
end
|
43
80
|
|
44
|
-
|
45
|
-
|
46
|
-
|
81
|
+
describe '#scope_id' do
|
82
|
+
it 'gets nil' do
|
83
|
+
expect(record.scope_id).to be_nil
|
84
|
+
end
|
47
85
|
end
|
48
86
|
end
|
49
87
|
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
module SwitchUser
|
4
|
-
describe LambdaGuard do
|
4
|
+
RSpec.describe LambdaGuard do
|
5
5
|
describe "#controller_available?" do
|
6
6
|
it "calls the controller_guard proc" do
|
7
|
-
controller =
|
8
|
-
provider =
|
7
|
+
controller = double.as_null_object
|
8
|
+
provider = double.as_null_object
|
9
9
|
guard = SwitchUser::LambdaGuard.new(controller, provider)
|
10
10
|
|
11
11
|
SwitchUser.controller_guard = lambda {|a| a }
|
12
|
-
guard.
|
12
|
+
expect(guard).to be_controller_available
|
13
13
|
|
14
14
|
SwitchUser.controller_guard = lambda {|a| !a }
|
15
|
-
guard.
|
15
|
+
expect(guard).not_to be_controller_available
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'switch_user/user_loader'
|
3
3
|
|
4
|
-
describe SwitchUser::UserLoader do
|
5
|
-
let(:user) {
|
4
|
+
RSpec.describe SwitchUser::UserLoader do
|
5
|
+
let(:user) { double(:user) }
|
6
6
|
let(:user_result) { [user] }
|
7
7
|
|
8
8
|
it "raises an exception if we are passed an invalid scope" do
|
@@ -12,17 +12,17 @@ describe SwitchUser::UserLoader do
|
|
12
12
|
describe ".user" do
|
13
13
|
before do
|
14
14
|
SwitchUser.available_users_identifiers = {:user => :id}
|
15
|
-
User.
|
15
|
+
allow(User).to receive(:where).with(:id => "1").and_return(user_result)
|
16
16
|
end
|
17
17
|
it "can be loaded from a scope and identifier" do
|
18
18
|
loaded_user = SwitchUser::UserLoader.prepare("user","1").user
|
19
19
|
|
20
|
-
loaded_user.
|
20
|
+
expect(loaded_user).to eq user
|
21
21
|
end
|
22
22
|
it "can be loaded by a passing an unprocessed scope identifier" do
|
23
23
|
loaded_user = SwitchUser::UserLoader.prepare(:scope_identifier => "user_1").user
|
24
24
|
|
25
|
-
loaded_user.
|
25
|
+
expect(loaded_user).to eq user
|
26
26
|
end
|
27
27
|
it "raises an error for an invalid scope" do
|
28
28
|
expect {
|
@@ -32,25 +32,25 @@ describe SwitchUser::UserLoader do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
it "returns a user" do
|
35
|
-
User.
|
35
|
+
allow(User).to receive(:where).with(:id => 1).and_return(user_result)
|
36
36
|
|
37
37
|
loader = SwitchUser::UserLoader.new("user", 1)
|
38
38
|
|
39
|
-
loader.user.
|
39
|
+
expect(loader.user).to eq user
|
40
40
|
end
|
41
41
|
|
42
42
|
it "returns nil if no user is found" do
|
43
43
|
loader = SwitchUser::UserLoader.new("user", 3)
|
44
44
|
|
45
|
-
User.find_by_id(3).
|
46
|
-
loader.user.
|
45
|
+
expect(User.find_by_id(3)).to be_nil
|
46
|
+
expect(loader.user).to eq nil
|
47
47
|
end
|
48
48
|
|
49
49
|
it "loads a user with an alternate identifier column" do
|
50
|
-
User.
|
50
|
+
allow(User).to receive(:where).with(:email => 2).and_return(user_result)
|
51
51
|
SwitchUser.available_users_identifiers = {:user => :email}
|
52
52
|
|
53
53
|
loader = SwitchUser::UserLoader.new("user", 2)
|
54
|
-
loader.user.
|
54
|
+
expect(loader.user).to eq user
|
55
55
|
end
|
56
56
|
end
|
@@ -2,33 +2,33 @@ require 'spec_helper'
|
|
2
2
|
require 'switch_user/user_set'
|
3
3
|
|
4
4
|
module SwitchUser
|
5
|
-
describe UserSet do
|
5
|
+
RSpec.describe UserSet do
|
6
6
|
let!(:user) { User.create(:email => "test@example.com") }
|
7
|
-
let(:set) { UserSet.new(:user, :id, :email, lambda { User.
|
7
|
+
let(:set) { UserSet.new(:user, :id, :email, lambda { User.all }) }
|
8
8
|
after { User.delete_all }
|
9
9
|
it "returns an object that knows it's scope, id and label" do
|
10
10
|
found_user = set[user.id]
|
11
11
|
|
12
|
-
found_user.id.
|
13
|
-
found_user.scope.
|
14
|
-
found_user.label.
|
12
|
+
expect(found_user.id).to eq user.id
|
13
|
+
expect(found_user.scope).to eq :user
|
14
|
+
expect(found_user.label).to eq "test@example.com"
|
15
15
|
end
|
16
16
|
it "returns all available users for a scope" do
|
17
|
-
set.users.
|
17
|
+
expect(set.users).to eq [user]
|
18
18
|
end
|
19
19
|
it "chains the where on to the provided scope" do
|
20
20
|
set = UserSet.new(:user, :id, :email, lambda { User.all })
|
21
|
-
set.find_user(user.id).label.
|
21
|
+
expect(set.find_user(user.id).label).to eq user.email
|
22
22
|
end
|
23
23
|
end
|
24
|
-
describe UserSet::Record do
|
24
|
+
RSpec.describe UserSet::Record do
|
25
25
|
it "correctly configures the record using the set" do
|
26
|
-
user =
|
27
|
-
set =
|
26
|
+
user = double(:user, :id => 100, :email => "test@example.com")
|
27
|
+
set = double(:set, :identifier => :id, :label => :email, :scope => :user)
|
28
28
|
record = UserSet::Record.build(user, set)
|
29
|
-
record.id.
|
30
|
-
record.label.
|
31
|
-
record.scope.
|
29
|
+
expect(record.id).to eq 100
|
30
|
+
expect(record.label).to eq "test@example.com"
|
31
|
+
expect(record.scope).to eq :user
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
data/spec/switch_user_spec.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'switch_user'
|
3
3
|
|
4
|
-
describe SwitchUser do
|
4
|
+
RSpec.describe SwitchUser do
|
5
5
|
describe "#available_scopes" do
|
6
6
|
it "returns a list of available scopes" do
|
7
|
-
SwitchUser.available_scopes.
|
7
|
+
expect(SwitchUser.available_scopes).to eq [:user]
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
@@ -12,7 +12,7 @@ describe SwitchUser do
|
|
12
12
|
it "sets the provider" do
|
13
13
|
# ensure we aren't breaking existing functionality
|
14
14
|
SwitchUser.provider = :sorcery
|
15
|
-
SwitchUser.provider.
|
15
|
+
expect(SwitchUser.provider).to eq :sorcery
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
data/switch_user.gemspec
CHANGED
@@ -18,7 +18,8 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.add_development_dependency "bundler", ">= 1.0.0"
|
19
19
|
s.add_development_dependency "actionpack"
|
20
20
|
s.add_development_dependency "railties"
|
21
|
-
s.add_development_dependency "rspec
|
21
|
+
s.add_development_dependency "rspec"
|
22
|
+
s.add_development_dependency "rspec-rails"
|
22
23
|
s.add_development_dependency "tzinfo"
|
23
24
|
s.add_development_dependency "sqlite3"
|
24
25
|
s.add_development_dependency "activerecord"
|
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.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Huang
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-06-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -67,20 +67,34 @@ dependencies:
|
|
67
67
|
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: rspec
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
70
84
|
- !ruby/object:Gem::Dependency
|
71
85
|
name: rspec-rails
|
72
86
|
requirement: !ruby/object:Gem::Requirement
|
73
87
|
requirements:
|
74
|
-
- - "
|
88
|
+
- - ">="
|
75
89
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
90
|
+
version: '0'
|
77
91
|
type: :development
|
78
92
|
prerelease: false
|
79
93
|
version_requirements: !ruby/object:Gem::Requirement
|
80
94
|
requirements:
|
81
|
-
- - "
|
95
|
+
- - ">="
|
82
96
|
- !ruby/object:Gem::Version
|
83
|
-
version:
|
97
|
+
version: '0'
|
84
98
|
- !ruby/object:Gem::Dependency
|
85
99
|
name: tzinfo
|
86
100
|
requirement: !ruby/object:Gem::Requirement
|
@@ -160,6 +174,8 @@ extra_rdoc_files: []
|
|
160
174
|
files:
|
161
175
|
- ".gitignore"
|
162
176
|
- ".rspec"
|
177
|
+
- ".travis.yml"
|
178
|
+
- CHANGELOG.md
|
163
179
|
- Gemfile
|
164
180
|
- LICENSE
|
165
181
|
- README.md
|
@@ -227,7 +243,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
227
243
|
version: 1.3.6
|
228
244
|
requirements: []
|
229
245
|
rubyforge_project: switch_user
|
230
|
-
rubygems_version: 2.
|
246
|
+
rubygems_version: 2.4.7
|
231
247
|
signing_key:
|
232
248
|
specification_version: 4
|
233
249
|
summary: Easily switch current user to speed up development
|