switch_user 0.9.5 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
[](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
|