userbin 0.4.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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +87 -111
  3. data/lib/userbin.rb +18 -39
  4. data/lib/userbin/configuration.rb +14 -16
  5. data/lib/userbin/errors.rb +5 -0
  6. data/lib/userbin/helpers.rb +83 -0
  7. data/lib/userbin/jwt.rb +40 -0
  8. data/lib/userbin/models/base.rb +24 -0
  9. data/lib/userbin/models/challenge.rb +4 -0
  10. data/lib/userbin/models/session.rb +11 -0
  11. data/lib/userbin/models/user.rb +9 -0
  12. data/lib/userbin/request.rb +99 -0
  13. data/lib/userbin/utils.rb +28 -0
  14. data/lib/userbin/version.rb +1 -1
  15. data/spec/configuration_spec.rb +8 -0
  16. data/spec/fixtures/vcr_cassettes/session_create.yml +47 -0
  17. data/spec/fixtures/vcr_cassettes/session_refresh.yml +47 -0
  18. data/spec/fixtures/vcr_cassettes/session_verify.yml +47 -0
  19. data/spec/fixtures/vcr_cassettes/user_find.yml +44 -0
  20. data/spec/fixtures/vcr_cassettes/user_find_non_existing.yml +42 -0
  21. data/spec/fixtures/vcr_cassettes/user_import.yml +46 -0
  22. data/spec/fixtures/vcr_cassettes/user_update.yml +47 -0
  23. data/spec/helpers_spec.rb +38 -0
  24. data/spec/jwt_spec.rb +67 -0
  25. data/spec/models/session_spec.rb +33 -0
  26. data/spec/models/user_spec.rb +43 -0
  27. data/spec/spec_helper.rb +11 -0
  28. data/spec/utils_spec.rb +36 -0
  29. metadata +128 -36
  30. data/lib/userbin/authentication.rb +0 -132
  31. data/lib/userbin/basic_auth.rb +0 -31
  32. data/lib/userbin/current.rb +0 -17
  33. data/lib/userbin/events.rb +0 -40
  34. data/lib/userbin/rails/auth_helpers.rb +0 -22
  35. data/lib/userbin/railtie.rb +0 -14
  36. data/lib/userbin/session.rb +0 -26
  37. data/lib/userbin/userbin.rb +0 -104
  38. data/spec/session_spec.rb +0 -40
  39. data/spec/userbin_spec.rb +0 -102
@@ -0,0 +1,46 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://secretkey:@secure.userbin.com/v1/users/import
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"users":[{"email":"10@example.com","username":"10"},{"email":"20@example.com","username":"20"}]}'
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.9.0
12
+ Content-Type:
13
+ - application/json
14
+ Accept-Encoding:
15
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
16
+ Accept:
17
+ - '*/*'
18
+ response:
19
+ status:
20
+ code: 201
21
+ message: Created
22
+ headers:
23
+ Date:
24
+ - Thu, 24 Apr 2014 16:19:14 GMT
25
+ Status:
26
+ - 201 Created
27
+ Connection:
28
+ - close
29
+ Content-Type:
30
+ - application/json
31
+ Content-Length:
32
+ - '85'
33
+ Set-Cookie:
34
+ - _ubt=; expires=Thu, 01-Jan-1970 00:00:00 GMT
35
+ X-Ua-Compatible:
36
+ - IE=Edge
37
+ Etag:
38
+ - '"e6928187afa7cffb7f793a998b7a1c91"'
39
+ Cache-Control:
40
+ - max-age=0, private, must-revalidate
41
+ body:
42
+ encoding: UTF-8
43
+ string: '[{"id":"fqnvfRSmxa6wqx3c6xmzDqDZrJCvtZ5P"},{"id":"4n9pcvrCSig2iVcZbk7pAMsjngzX9fgv"}]'
44
+ http_version:
45
+ recorded_at: Thu, 24 Apr 2014 16:19:14 GMT
46
+ recorded_with: VCR 2.9.0
@@ -0,0 +1,47 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: put
5
+ uri: https://secretkey:@secure.userbin.com/v1/users/AKfwtfrAzdDKp55aty8o14MoudkaS9BL
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"id":"AKfwtfrAzdDKp55aty8o14MoudkaS9BL","email":"updated@example.com","created_at":"2014-04-27
9
+ 22:10:22 +0200"}'
10
+ headers:
11
+ User-Agent:
12
+ - Faraday v0.9.0
13
+ Content-Type:
14
+ - application/json
15
+ Accept-Encoding:
16
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
17
+ Accept:
18
+ - '*/*'
19
+ response:
20
+ status:
21
+ code: 200
22
+ message: OK
23
+ headers:
24
+ Date:
25
+ - Sun, 27 Apr 2014 20:10:22 GMT
26
+ Status:
27
+ - 200 OK
28
+ Connection:
29
+ - close
30
+ Content-Type:
31
+ - application/json
32
+ Content-Length:
33
+ - '252'
34
+ Set-Cookie:
35
+ - _ubt=; expires=Thu, 01-Jan-1970 00:00:00 GMT
36
+ X-Ua-Compatible:
37
+ - IE=Edge
38
+ Etag:
39
+ - '"de56261eb3d3bef170cc8e837af079fd"'
40
+ Cache-Control:
41
+ - max-age=0, private, must-revalidate
42
+ body:
43
+ encoding: UTF-8
44
+ string: '{"id":"AKfwtfrAzdDKp55aty8o14MoudkaS9BL","created_at":"2014-04-27T20:10:22Z","updated_at":"2014-04-27T20:10:22Z","email":"updated@example.com","username":"updated@example.com","name":null,"first_name":null,"last_name":null,"image":null,"status":"ACTIVE","identities":[]}'
45
+ http_version:
46
+ recorded_at: Sun, 27 Apr 2014 20:10:22 GMT
47
+ recorded_with: VCR 2.9.0
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Userbin helpers' do
4
+ let(:token) { 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImlhdCI6MTM5ODIzOTIwMywiZXhwIjoxMzk4MjQyODAzfQ.eyJ1c2VyX2lkIjoiZUF3djVIdGRiU2s4Yk1OWVpvanNZdW13UXlLcFhxS3IifQ.Apa7EmT5T1sOYz4Af0ERTDzcnUvSalailNJbejZ2ddQ' }
5
+
6
+ it 'creates a session' do
7
+ Userbin::Session.should_receive(:post).
8
+ with("users/user%201234/sessions", user: {email: 'valid@example.com'}).
9
+ and_return(Userbin::Session.new(token: token))
10
+ Userbin.authenticate(nil, 'user 1234', properties: {email: 'valid@example.com'})
11
+ end
12
+
13
+ it 'refreshes, and does not create a session' do
14
+ Userbin::Session.should_not_receive(:create)
15
+ Userbin::Session.any_instance.should_receive(:refresh).
16
+ and_return(Userbin::Session.new(token: token))
17
+ opts = {
18
+ user_id: '1234',
19
+ properties: {
20
+ email: 'valid@example.com'
21
+ },
22
+ context: {
23
+ ip: '8.8.8.8',
24
+ user_agent: 'Mozilla'
25
+ }
26
+ }
27
+ Userbin.authenticate(token, opts)
28
+ end
29
+
30
+ it 'deauthenticates with context' do
31
+ Userbin::Session.should_receive(:destroy_existing)
32
+
33
+ jwt = Userbin::JWT.new(token)
34
+ jwt.merge!(context: { ip: '8.8.8.8', user_agent: 'Mozilla' })
35
+
36
+ Userbin.deauthenticate(jwt.to_token)
37
+ end
38
+ end
data/spec/jwt_spec.rb ADDED
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+ require 'timecop'
3
+
4
+ describe 'Userbin::JWT' do
5
+ let(:token) { 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImlhdCI6MTM5ODIzOTIwMywiZXhwIjoxMzk4MjQyODAzfQ.eyJ1c2VyX2lkIjoiZUF3djVIdGRiU2s4Yk1OWVpvanNZdW13UXlLcFhxS3IifQ.Apa7EmT5T1sOYz4Af0ERTDzcnUvSalailNJbejZ2ddQ' }
6
+
7
+ context 'valid JWT' do
8
+ it 'returns a payload' do
9
+ payload = Userbin::JWT.new(token).to_json
10
+ payload['user_id'].should == 'eAwv5HtdbSk8bMNYZojsYumwQyKpXqKr'
11
+ end
12
+
13
+ it 'verifies that JWT has expired' do
14
+ new_time = Time.utc(2014, 4, 23, 8, 46, 44)
15
+ Timecop.freeze(new_time) do
16
+ Userbin::JWT.new(token).expired?.should be_true
17
+ end
18
+ end
19
+
20
+ it 'verifies that JWT has not expired' do
21
+ new_time = Time.utc(2014, 4, 23, 8, 46, 43)
22
+ Timecop.freeze(new_time) do
23
+ Userbin::JWT.new(token).expired?.should be_false
24
+ end
25
+ end
26
+ end
27
+
28
+ context 'invalid JWT' do
29
+ let(:token) { 'eyJ0eXhtWWNTU3pEUHp6WFF2WmZp26mn7Kkl6UgE' }
30
+
31
+ it 'throws error' do
32
+ expect {
33
+ payload = Userbin::JWT.new(token).to_json
34
+ }.to raise_error(Userbin::SecurityError)
35
+ end
36
+ end
37
+
38
+ context 'nil JWT' do
39
+ let(:token) { nil }
40
+
41
+ it 'throws error' do
42
+ token = nil
43
+ expect {
44
+ payload = Userbin::JWT.new(token).to_json
45
+ }.to raise_error(Userbin::SecurityError)
46
+ end
47
+ end
48
+
49
+ context '#to_token' do
50
+ it 'returns the same token' do
51
+ Userbin::JWT.new(token).to_token.should == token
52
+ end
53
+ end
54
+
55
+ context '#merge' do
56
+ it 'merges payload' do
57
+ jwt = Userbin::JWT.new(token)
58
+ jwt.merge!(context: { ip: '8.8.8.8' })
59
+
60
+ merged_token = jwt.to_token
61
+ merged_token.should_not == token
62
+ Userbin::JWT.new(merged_token).
63
+ to_json['context']['ip'].should == '8.8.8.8'
64
+ end
65
+ end
66
+
67
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Userbin::Session' do
4
+
5
+ let(:session_token) { 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImlzcyI6InVzZXItMjQxMiIsInN1YiI6IlMyb2R4UmVabkdxaHF4UGFRN1Y3a05rTG9Ya0daUEZ6IiwiYXVkIjoiODAwMDAwMDAwMDAwMDAwIiwiZXhwIjoxMzk5NDc5Njc1LCJpYXQiOjEzOTk0Nzk2NjUsImp0aSI6MH0.eyJjaGFsbGVuZ2UiOnsiaWQiOiJUVENqd3VyM3lwbTRUR1ZwWU43cENzTXFxOW9mWEVBSCIsInR5cGUiOiJvdHBfYXV0aGVudGljYXRvciJ9fQ.LT9mUzJEbsizbFxcpMo3zbms0aCDBzfgMbveMGSi1-s' }
6
+
7
+ it 'creates a session' do
8
+ VCR.use_cassette('session_create') do
9
+ user_id = 'user-2412'
10
+ session = Userbin::Session.post(
11
+ "users/#{user_id}/sessions", user: {email: 'valid@example.com'})
12
+ Userbin::JWT.new(session.token).header['iss'].should == user_id
13
+ end
14
+ end
15
+
16
+ it 'refreshes a session' do
17
+ VCR.use_cassette('session_refresh') do
18
+ session = Userbin::Session.new(token: session_token)
19
+ session = session.refresh(user: {name: 'New Name'})
20
+
21
+ session.token.should_not == session_token
22
+ end
23
+ end
24
+
25
+ it 'verifies a session' do
26
+ VCR.use_cassette('session_verify') do
27
+ Userbin::JWT.new(session_token).payload['challenge'].should_not be_nil
28
+ session = Userbin::Session.new(token: session_token)
29
+ session = session.verify(response: '017010')
30
+ Userbin::JWT.new(session.token).payload['challenge'].should be_nil
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Userbin::User' do
4
+ it 'retrieves a user' do
5
+ VCR.use_cassette('user_find') do
6
+ user = Userbin::User.find('9RA2j3cYDxt8gefQUduKnxUxRRGy6Rz4')
7
+ user.email.should == 'brissmyr@gmail.com'
8
+ end
9
+ end
10
+
11
+ it 'handles non-existing user' do
12
+ VCR.use_cassette('user_find_non_existing') do
13
+ error = nil
14
+ begin
15
+ user = Userbin::User.find('non_existing')
16
+ rescue Userbin::Error => e
17
+ error = e
18
+ end
19
+ error.to_s.should match /Not found/
20
+ end
21
+ end
22
+
23
+ it 'updates a user' do
24
+ VCR.use_cassette('user_update') do
25
+ user = Userbin::User.new(id: 'AKfwtfrAzdDKp55aty8o14MoudkaS9BL')
26
+ user.email = 'updated@example.com'
27
+ user.created_at = Time.now
28
+ user.save
29
+ end
30
+ end
31
+
32
+ it 'imports users' do
33
+ VCR.use_cassette('user_import') do
34
+ users = Userbin::User.import(
35
+ users: [
36
+ { email: '10@example.com', username: '10' },
37
+ { email: '20@example.com', username: '20' }
38
+ ]
39
+ )
40
+ users.count.should == 2
41
+ end
42
+ end
43
+ end
data/spec/spec_helper.rb CHANGED
@@ -2,7 +2,18 @@ require 'rubygems'
2
2
  require 'bundler/setup'
3
3
  require 'rack'
4
4
  require 'userbin'
5
+ require 'vcr'
5
6
  require 'webmock/rspec'
7
+ require 'pry'
8
+
9
+ VCR.configure do |config|
10
+ config.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
11
+ config.hook_into :webmock
12
+ end
13
+
14
+ Userbin.configure do |config|
15
+ config.api_secret = 'secretkey'
16
+ end
6
17
 
7
18
  RSpec.configure do |config|
8
19
  end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Userbin utils' do
4
+ describe 'ContextHeaders middleware' do
5
+ before do
6
+ Userbin::User.use_api(api = Her::API.new)
7
+ @user = api.setup do |c|
8
+ c.use Userbin::Request::Middleware::ContextHeaders
9
+ c.use Her::Middleware::FirstLevelParseJSON
10
+ c.adapter :test do |stub|
11
+ stub.post('/users') do |env|
12
+ @env = env
13
+ [200, {}, [].to_json]
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ let(:env) do
20
+ Rack::MockRequest.env_for('/',
21
+ "HTTP_USER_AGENT" => "Mozilla", "REMOTE_ADDR" => "8.8.8.8")
22
+ end
23
+
24
+ it 'handles non-existing context headers' do
25
+ Userbin::User.create()
26
+ end
27
+
28
+ it 'sets context headers from env' do
29
+ Userbin.with_context(ip: '8.8.8.8', user_agent: 'Mozilla') do
30
+ Userbin::User.create()
31
+ @env['request_headers']['X-Userbin-Ip'].should == '8.8.8.8'
32
+ @env['request_headers']['X-Userbin-User-Agent'].should == 'Mozilla'
33
+ end
34
+ end
35
+ end
36
+ end
metadata CHANGED
@@ -1,122 +1,203 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: userbin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-17 00:00:00.000000000 Z
11
+ date: 2014-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: her
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: 0.6.8
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.6.8
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday_middleware
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.1
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: multi_json
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - ~>
45
+ - - "~>"
32
46
  - !ruby/object:Gem::Version
33
47
  version: '1.0'
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - ~>
52
+ - - "~>"
39
53
  - !ruby/object:Gem::Version
40
54
  version: '1.0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: jwt
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - ~>
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.1.11
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.1.11
69
+ - !ruby/object:Gem::Dependency
70
+ name: request_store
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.0.5
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.0.5
83
+ - !ruby/object:Gem::Dependency
84
+ name: activesupport
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
46
88
  - !ruby/object:Gem::Version
47
- version: 0.1.8
89
+ version: '3'
48
90
  type: :runtime
49
91
  prerelease: false
50
92
  version_requirements: !ruby/object:Gem::Requirement
51
93
  requirements:
52
- - - ~>
94
+ - - ">="
53
95
  - !ruby/object:Gem::Version
54
- version: 0.1.8
96
+ version: '3'
55
97
  - !ruby/object:Gem::Dependency
56
98
  name: rspec
57
99
  requirement: !ruby/object:Gem::Requirement
58
100
  requirements:
59
- - - '>='
101
+ - - ">="
60
102
  - !ruby/object:Gem::Version
61
103
  version: '0'
62
104
  type: :development
63
105
  prerelease: false
64
106
  version_requirements: !ruby/object:Gem::Requirement
65
107
  requirements:
66
- - - '>='
108
+ - - ">="
67
109
  - !ruby/object:Gem::Version
68
110
  version: '0'
69
111
  - !ruby/object:Gem::Dependency
70
112
  name: rack
71
113
  requirement: !ruby/object:Gem::Requirement
72
114
  requirements:
73
- - - '>='
115
+ - - ">="
74
116
  - !ruby/object:Gem::Version
75
117
  version: '0'
76
118
  type: :development
77
119
  prerelease: false
78
120
  version_requirements: !ruby/object:Gem::Requirement
79
121
  requirements:
80
- - - '>='
122
+ - - ">="
81
123
  - !ruby/object:Gem::Version
82
124
  version: '0'
83
125
  - !ruby/object:Gem::Dependency
84
126
  name: webmock
85
127
  requirement: !ruby/object:Gem::Requirement
86
128
  requirements:
87
- - - '>='
129
+ - - ">="
88
130
  - !ruby/object:Gem::Version
89
131
  version: '0'
90
132
  type: :development
91
133
  prerelease: false
92
134
  version_requirements: !ruby/object:Gem::Requirement
93
135
  requirements:
94
- - - '>='
136
+ - - ">="
95
137
  - !ruby/object:Gem::Version
96
138
  version: '0'
97
- description: Drop-in user login for mobile and web apps. Add a full user authentication
98
- stack to your application in minutes. Userbin is easily customized to fit your current
99
- design and infrastructure.
139
+ - !ruby/object:Gem::Dependency
140
+ name: vcr
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: timecop
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description: Secure your application with multi-factor authentication, user activity
168
+ monitoring, and real-time threat protection.
100
169
  email: johan@userbin.com
101
170
  executables: []
102
171
  extensions: []
103
172
  extra_rdoc_files: []
104
173
  files:
105
- - lib/userbin/authentication.rb
106
- - lib/userbin/basic_auth.rb
174
+ - README.md
175
+ - lib/userbin.rb
107
176
  - lib/userbin/configuration.rb
108
- - lib/userbin/current.rb
109
- - lib/userbin/events.rb
110
- - lib/userbin/rails/auth_helpers.rb
111
- - lib/userbin/railtie.rb
112
- - lib/userbin/session.rb
113
- - lib/userbin/userbin.rb
177
+ - lib/userbin/errors.rb
178
+ - lib/userbin/helpers.rb
179
+ - lib/userbin/jwt.rb
180
+ - lib/userbin/models/base.rb
181
+ - lib/userbin/models/challenge.rb
182
+ - lib/userbin/models/session.rb
183
+ - lib/userbin/models/user.rb
184
+ - lib/userbin/request.rb
185
+ - lib/userbin/utils.rb
114
186
  - lib/userbin/version.rb
115
- - lib/userbin.rb
116
- - README.md
117
- - spec/session_spec.rb
187
+ - spec/configuration_spec.rb
188
+ - spec/fixtures/vcr_cassettes/session_create.yml
189
+ - spec/fixtures/vcr_cassettes/session_refresh.yml
190
+ - spec/fixtures/vcr_cassettes/session_verify.yml
191
+ - spec/fixtures/vcr_cassettes/user_find.yml
192
+ - spec/fixtures/vcr_cassettes/user_find_non_existing.yml
193
+ - spec/fixtures/vcr_cassettes/user_import.yml
194
+ - spec/fixtures/vcr_cassettes/user_update.yml
195
+ - spec/helpers_spec.rb
196
+ - spec/jwt_spec.rb
197
+ - spec/models/session_spec.rb
198
+ - spec/models/user_spec.rb
118
199
  - spec/spec_helper.rb
119
- - spec/userbin_spec.rb
200
+ - spec/utils_spec.rb
120
201
  homepage: https://userbin.com
121
202
  licenses:
122
203
  - MIT
@@ -127,21 +208,32 @@ require_paths:
127
208
  - lib
128
209
  required_ruby_version: !ruby/object:Gem::Requirement
129
210
  requirements:
130
- - - '>='
211
+ - - ">="
131
212
  - !ruby/object:Gem::Version
132
213
  version: '0'
133
214
  required_rubygems_version: !ruby/object:Gem::Requirement
134
215
  requirements:
135
- - - '>='
216
+ - - ">="
136
217
  - !ruby/object:Gem::Version
137
218
  version: '0'
138
219
  requirements: []
139
220
  rubyforge_project:
140
- rubygems_version: 2.0.6
221
+ rubygems_version: 2.2.2
141
222
  signing_key:
142
223
  specification_version: 4
143
224
  summary: Userbin
144
225
  test_files:
145
- - spec/session_spec.rb
226
+ - spec/configuration_spec.rb
227
+ - spec/fixtures/vcr_cassettes/session_create.yml
228
+ - spec/fixtures/vcr_cassettes/session_refresh.yml
229
+ - spec/fixtures/vcr_cassettes/session_verify.yml
230
+ - spec/fixtures/vcr_cassettes/user_find.yml
231
+ - spec/fixtures/vcr_cassettes/user_find_non_existing.yml
232
+ - spec/fixtures/vcr_cassettes/user_import.yml
233
+ - spec/fixtures/vcr_cassettes/user_update.yml
234
+ - spec/helpers_spec.rb
235
+ - spec/jwt_spec.rb
236
+ - spec/models/session_spec.rb
237
+ - spec/models/user_spec.rb
146
238
  - spec/spec_helper.rb
147
- - spec/userbin_spec.rb
239
+ - spec/utils_spec.rb