access_token_wrapper 0.1.0 → 0.2.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/.gitignore +1 -0
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +34 -0
- data/Rakefile +17 -0
- data/access_token_wrapper.gemspec +1 -0
- data/lib/access_token_wrapper.rb +1 -29
- data/lib/access_token_wrapper/base.rb +37 -0
- data/lib/access_token_wrapper/version.rb +1 -1
- data/test/base_test.rb +91 -0
- data/test/test_helper.rb +3 -0
- metadata +26 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97e4602f04e6cfbc043882a7aa5a0859c59b8ee6
|
4
|
+
data.tar.gz: 748826f2514ec5124d06e6888f659ac6d118e210
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0874f0e738ed1ed9cf360805caf45b97eea88e17aa5795ae4b07658a5caecfbc7bacf6dc0985281d2214982d2dfac96c1ad3c5e2c71f26c7b4319071846daab8'
|
7
|
+
data.tar.gz: 3c6472be726db31508ae06ee6e7a84d6568f9364dc54cb9103d0eae8bbe41d8b1c053705f61632bfd23981d6a846e8bffb9f530a1ad08a0bf623c7fc05016355
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
pkg
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
## 0.2.0 (2018-01-16)
|
2
|
+
- [FEATURE] The library now checks the expires_at date of the token before attempting an API call.
|
3
|
+
- [BREAKING] The refresh callback now only optionally contains an exception, when an exception is raised, if the refresh is due to the expires_at field (which should be the majority of the time) it will be `nil`
|
4
|
+
|
5
|
+
## 0.1.0 (2017-09-20)
|
6
|
+
- [BREAKING] `AccessTokenWrapper::Base#token` was renamed to `#raw_token`.
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
access_token_wrapper (0.2.0)
|
5
|
+
oauth2
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
faraday (0.12.2)
|
11
|
+
multipart-post (>= 1.2, < 3)
|
12
|
+
jwt (1.5.6)
|
13
|
+
multi_json (1.12.2)
|
14
|
+
multi_xml (0.6.0)
|
15
|
+
multipart-post (2.0.0)
|
16
|
+
oauth2 (1.4.0)
|
17
|
+
faraday (>= 0.8, < 0.13)
|
18
|
+
jwt (~> 1.0)
|
19
|
+
multi_json (~> 1.3)
|
20
|
+
multi_xml (~> 0.5)
|
21
|
+
rack (>= 1.2, < 3)
|
22
|
+
rack (2.0.3)
|
23
|
+
rake (12.3.0)
|
24
|
+
|
25
|
+
PLATFORMS
|
26
|
+
ruby
|
27
|
+
|
28
|
+
DEPENDENCIES
|
29
|
+
access_token_wrapper!
|
30
|
+
bundler (~> 1.3)
|
31
|
+
rake
|
32
|
+
|
33
|
+
BUNDLED WITH
|
34
|
+
1.16.1
|
data/Rakefile
CHANGED
@@ -1 +1,18 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
+
require 'rake/testtask'
|
3
|
+
|
4
|
+
task default: [:test]
|
5
|
+
|
6
|
+
Rake::TestTask.new do |t|
|
7
|
+
t.libs << 'test'
|
8
|
+
t.pattern = "test/**/*_test.rb"
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Open an irb session"
|
12
|
+
task :console do
|
13
|
+
require 'irb'
|
14
|
+
require 'irb/completion'
|
15
|
+
require 'access_token_wrapper'
|
16
|
+
ARGV.clear
|
17
|
+
IRB.start
|
18
|
+
end
|
@@ -18,6 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
spec.add_dependency "oauth2"
|
21
22
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
23
|
spec.add_development_dependency "rake"
|
23
24
|
end
|
data/lib/access_token_wrapper.rb
CHANGED
@@ -1,29 +1 @@
|
|
1
|
-
require "access_token_wrapper/
|
2
|
-
|
3
|
-
module AccessTokenWrapper
|
4
|
-
class Base
|
5
|
-
NON_ERROR_CODES = [402, 404, 422, 414, 429, 500, 503]
|
6
|
-
attr_reader :raw_token
|
7
|
-
|
8
|
-
def initialize(raw_token, &callback)
|
9
|
-
@raw_token = raw_token
|
10
|
-
@callback = callback
|
11
|
-
end
|
12
|
-
|
13
|
-
def method_missing(method, *args, &block)
|
14
|
-
@raw_token.send(method, *args, &block)
|
15
|
-
rescue OAuth2::Error => exception
|
16
|
-
if NON_ERROR_CODES.include?(exception.response.status)
|
17
|
-
raise exception
|
18
|
-
else
|
19
|
-
@raw_token = @raw_token.refresh!
|
20
|
-
@callback.call(@raw_token, exception)
|
21
|
-
@raw_token.send(method, *args, &block)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def respond_to_missing?(method_name, include_private = false)
|
26
|
-
@raw_token.respond_to?(method_name, include_private) || super
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
1
|
+
require "access_token_wrapper/base"
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module AccessTokenWrapper
|
2
|
+
class Base
|
3
|
+
NON_ERROR_CODES = [402, 404, 422, 414, 429, 500, 503]
|
4
|
+
EXPIRY_GRACE_SEC = 30
|
5
|
+
attr_reader :raw_token
|
6
|
+
|
7
|
+
def initialize(raw_token, &callback)
|
8
|
+
@raw_token = raw_token
|
9
|
+
@callback = callback
|
10
|
+
end
|
11
|
+
|
12
|
+
def method_missing(method_name, *args, &block)
|
13
|
+
refresh_token! if token_expiring?
|
14
|
+
@raw_token.send(method_name, *args, &block)
|
15
|
+
rescue OAuth2::Error => exception
|
16
|
+
if NON_ERROR_CODES.include?(exception.response.status)
|
17
|
+
raise exception
|
18
|
+
else
|
19
|
+
refresh_token!(exception)
|
20
|
+
@raw_token.send(method_name, *args, &block)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def refresh_token!(exception = nil)
|
25
|
+
@raw_token = @raw_token.refresh!
|
26
|
+
@callback.call(@raw_token, exception)
|
27
|
+
end
|
28
|
+
|
29
|
+
def token_expiring?
|
30
|
+
@raw_token.expires_at < (Time.now.to_i + EXPIRY_GRACE_SEC)
|
31
|
+
end
|
32
|
+
|
33
|
+
def respond_to_missing?(method_name, include_private = false)
|
34
|
+
@raw_token.respond_to?(method_name, include_private) || super
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/test/base_test.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class AccessTokenWrapperTest < Minitest::Test
|
4
|
+
class FakeToken
|
5
|
+
attr_reader :refreshed
|
6
|
+
|
7
|
+
def initialize(options = {})
|
8
|
+
@has_run = nil
|
9
|
+
@options = options
|
10
|
+
end
|
11
|
+
|
12
|
+
def get(*)
|
13
|
+
""
|
14
|
+
end
|
15
|
+
|
16
|
+
def expires_at
|
17
|
+
@options[:expires_at] || Time.now.to_i + 3600
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_and_raise(code)
|
21
|
+
if @has_run
|
22
|
+
""
|
23
|
+
else
|
24
|
+
@has_run = true
|
25
|
+
raise OAuth2::Error, OpenStruct.new(status: code, parsed: { 'error' => code }, body: '')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def refresh!
|
30
|
+
@refreshed = true
|
31
|
+
self
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def described_class
|
36
|
+
AccessTokenWrapper::Base
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_doesnt_run_block_if_no_exception
|
40
|
+
@run = false
|
41
|
+
|
42
|
+
token = described_class.new(FakeToken.new) do |new_token, exception|
|
43
|
+
@run = true
|
44
|
+
end
|
45
|
+
|
46
|
+
token.get('/')
|
47
|
+
assert !@run
|
48
|
+
assert !token.refreshed
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_runs_refresh_block_if_exception
|
52
|
+
@run = false
|
53
|
+
|
54
|
+
token = described_class.new(FakeToken.new) do |new_token, exception|
|
55
|
+
@run = true
|
56
|
+
end
|
57
|
+
|
58
|
+
token.get_and_raise(401)
|
59
|
+
assert @run
|
60
|
+
assert token.refreshed
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
def test_runs_refresh_block_if_expiring
|
65
|
+
@run = false
|
66
|
+
|
67
|
+
token = described_class.new(FakeToken.new(expires_at: Time.now.to_i - 1)) do |new_token, exception|
|
68
|
+
@run = true
|
69
|
+
end
|
70
|
+
|
71
|
+
token.get('/')
|
72
|
+
assert @run
|
73
|
+
assert token.refreshed
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_doesnt_run_block_if_non_auth_exception
|
77
|
+
@run = false
|
78
|
+
|
79
|
+
token = described_class.new(FakeToken.new) do |new_token, exception|
|
80
|
+
@run = true
|
81
|
+
end
|
82
|
+
|
83
|
+
begin
|
84
|
+
token.get_and_raise(429)
|
85
|
+
rescue OAuth2::Error
|
86
|
+
end
|
87
|
+
|
88
|
+
assert !@run
|
89
|
+
assert !token.refreshed
|
90
|
+
end
|
91
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: access_token_wrapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bradley Priest
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: oauth2
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -46,13 +60,19 @@ executables: []
|
|
46
60
|
extensions: []
|
47
61
|
extra_rdoc_files: []
|
48
62
|
files:
|
63
|
+
- ".gitignore"
|
64
|
+
- CHANGELOG.md
|
49
65
|
- Gemfile
|
66
|
+
- Gemfile.lock
|
50
67
|
- LICENSE.txt
|
51
68
|
- README.md
|
52
69
|
- Rakefile
|
53
70
|
- access_token_wrapper.gemspec
|
54
71
|
- lib/access_token_wrapper.rb
|
72
|
+
- lib/access_token_wrapper/base.rb
|
55
73
|
- lib/access_token_wrapper/version.rb
|
74
|
+
- test/base_test.rb
|
75
|
+
- test/test_helper.rb
|
56
76
|
homepage: ''
|
57
77
|
licenses:
|
58
78
|
- MIT
|
@@ -73,9 +93,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
73
93
|
version: '0'
|
74
94
|
requirements: []
|
75
95
|
rubyforge_project:
|
76
|
-
rubygems_version: 2.
|
96
|
+
rubygems_version: 2.6.13
|
77
97
|
signing_key:
|
78
98
|
specification_version: 4
|
79
99
|
summary: Wrapper for OAuth2::Token to automatically refresh the expiry token when
|
80
100
|
expired.
|
81
|
-
test_files:
|
101
|
+
test_files:
|
102
|
+
- test/base_test.rb
|
103
|
+
- test/test_helper.rb
|