google_drive-persistent_session 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 +5 -5
- data/README.md +1 -1
- data/google_drive-persistent_session.gemspec +4 -3
- data/lib/google_drive/persistent_session.rb +4 -115
- data/lib/google_drive/persistent_session/credential_storage.rb +27 -0
- data/lib/google_drive/persistent_session/file_store_ext.rb +10 -0
- data/lib/google_drive/persistent_session/persistent_session.rb +81 -0
- data/lib/google_drive/persistent_session/version.rb +5 -0
- metadata +24 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9a1a8c546ac3cd9ba880dc7068a27e955eab85b790edbbfbde8b40e1a1cd9c4d
|
4
|
+
data.tar.gz: 321e034033e5c35b3c7bb47e1ecdc31731fb5c5b8ed6e5a8594abe9d6da7598e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b7f6a6dfa29a22a5617e29093e5131e27cf85fe4b6c44f3df3458bbd194e1d05c3a23fe69b9e2f54f3dbfb5f48d22b80902fd5211f8d91ef56d8da6e6375194
|
7
|
+
data.tar.gz: a3c9cdcfdc3b5bb177c7c94e75e37ddad43ef9decb592c301f5ee2774205fd839874c4edfb8da37ac143956184ce5b6041322f05b64380fc3b6f371be5236ee8
|
data/README.md
CHANGED
@@ -23,7 +23,7 @@ Or install it yourself as:
|
|
23
23
|
```ruby
|
24
24
|
require 'google_drive/persistent_session'
|
25
25
|
|
26
|
-
#GoogleDrive::
|
26
|
+
#GoogleDrive::CredentialStorage.store = Google::APIClient::FileStore.new('~/.google_drive-oauth2.json')
|
27
27
|
|
28
28
|
session = GoogleDrive::PersistentSession.login
|
29
29
|
|
@@ -1,12 +1,13 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'google_drive/persistent_session/version'
|
4
5
|
|
5
6
|
Gem::Specification.new do |spec|
|
6
7
|
spec.name = 'google_drive-persistent_session'
|
7
|
-
spec.version =
|
8
|
+
spec.version = GoogleDrive::PersistentSession::VERSION
|
8
9
|
spec.authors = ['Genki Sugawara']
|
9
|
-
spec.email = ['
|
10
|
+
spec.email = ['sugawara@winebarrel.jp']
|
10
11
|
spec.summary = %q{Persist credential for google-drive-ruby.}
|
11
12
|
spec.description = %q{Persist credential for google-drive-ruby.}
|
12
13
|
spec.homepage = 'https://github.com/winebarrel/google_drive-persistent_session'
|
@@ -17,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
17
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
19
|
spec.require_paths = ['lib']
|
19
20
|
|
20
|
-
spec.add_dependency 'google_drive', '>=
|
21
|
+
spec.add_dependency 'google_drive', '>= 3.0.7'
|
21
22
|
spec.add_dependency 'highline'
|
22
23
|
spec.add_development_dependency 'bundler'
|
23
24
|
spec.add_development_dependency 'rake'
|
@@ -1,120 +1,9 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'forwardable'
|
3
|
-
require 'google/api_client'
|
4
|
-
require 'google/api_client/auth/file_storage'
|
5
3
|
require 'google_drive'
|
6
4
|
require 'highline'
|
7
5
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
def_delegator :@highline, :ask
|
13
|
-
|
14
|
-
THREAD_KEY = "#{self.to_s}::THREAD_KEY"
|
15
|
-
|
16
|
-
DEFAULE_CREDENTIAL_STORE_FILE = '~/.google_drive-oauth2.json'
|
17
|
-
@credential_store_file = ::File.expand_path(DEFAULE_CREDENTIAL_STORE_FILE)
|
18
|
-
|
19
|
-
class << self
|
20
|
-
attr_accessor :credential_store_file
|
21
|
-
|
22
|
-
def login
|
23
|
-
self.new
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def initialize
|
28
|
-
@highline = HighLine.new
|
29
|
-
ensure_login
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def ensure_login
|
35
|
-
unless is_credential_stored?
|
36
|
-
create_credential_store_file
|
37
|
-
end
|
38
|
-
|
39
|
-
credential = file_storage.load_credentials
|
40
|
-
|
41
|
-
if !credential.access_token
|
42
|
-
fetch_access_token(credential)
|
43
|
-
elsif expired?(credential)
|
44
|
-
refresh(credential)
|
45
|
-
end
|
46
|
-
|
47
|
-
unless session
|
48
|
-
login_with_oauth(credential.access_token)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def is_credential_stored?
|
53
|
-
::File.exist?(self.class.credential_store_file)
|
54
|
-
end
|
55
|
-
|
56
|
-
def expired?(credential)
|
57
|
-
credential.issued_at + credential.expires_in <= Time.new
|
58
|
-
end
|
59
|
-
|
60
|
-
def create_credential_store_file
|
61
|
-
client_id = ask('Enter CLIENT ID: ')
|
62
|
-
client_secret = ask('Enter CLIENT SECRET: ') {|q| q.echo = false }
|
63
|
-
puts # line break
|
64
|
-
|
65
|
-
credential = Signet::OAuth2::Client.new(
|
66
|
-
:client_id => client_id,
|
67
|
-
:client_secret => client_secret,
|
68
|
-
:refresh_token => ''
|
69
|
-
)
|
70
|
-
|
71
|
-
file_storage.write_credentials(credential)
|
72
|
-
FileUtils.chmod(0600, credential_store_file)
|
73
|
-
end
|
74
|
-
|
75
|
-
def fetch_access_token(credential)
|
76
|
-
credential.scope = %w(
|
77
|
-
https://www.googleapis.com/auth/drive
|
78
|
-
https://spreadsheets.google.com/feeds/
|
79
|
-
).join(' ')
|
80
|
-
|
81
|
-
credential.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'
|
82
|
-
credential.grant_type = 'authorization_code'
|
83
|
-
|
84
|
-
message = "1. Open this page:\n%s\n\n" % credential.authorization_uri
|
85
|
-
message << "2. Enter the authorization code shown in the page: "
|
86
|
-
credential.code = ask(message)
|
87
|
-
|
88
|
-
credential.fetch_access_token!
|
89
|
-
file_storage.write_credentials(credential)
|
90
|
-
login_with_oauth(credential.access_token)
|
91
|
-
end
|
92
|
-
|
93
|
-
def refresh(credential)
|
94
|
-
credential.refresh!
|
95
|
-
file_storage.write_credentials(credential)
|
96
|
-
login_with_oauth(credential.access_token)
|
97
|
-
end
|
98
|
-
|
99
|
-
def session
|
100
|
-
Thread.current[THREAD_KEY]
|
101
|
-
end
|
102
|
-
|
103
|
-
def login_with_oauth(access_token)
|
104
|
-
Thread.current[THREAD_KEY] = GoogleDrive.login_with_oauth(access_token)
|
105
|
-
end
|
106
|
-
|
107
|
-
def file_storage
|
108
|
-
@file_storage ||= Google::APIClient::FileStorage.new(credential_store_file)
|
109
|
-
end
|
110
|
-
|
111
|
-
def credential_store_file
|
112
|
-
self.class.credential_store_file
|
113
|
-
end
|
114
|
-
|
115
|
-
def method_missing(method_name, *args , &block)
|
116
|
-
ensure_login
|
117
|
-
session.send(method_name, *args, &block)
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
6
|
+
require 'google_drive/persistent_session/version'
|
7
|
+
require 'google_drive/persistent_session/file_store_ext'
|
8
|
+
require 'google_drive/persistent_session/credential_storage'
|
9
|
+
require 'google_drive/persistent_session/persistent_session'
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'google/api_client/auth/storage'
|
2
|
+
|
3
|
+
module GoogleDrive::CredentialStorage
|
4
|
+
DEFAULE_FILE_STORE_PATH = '~/.google_drive-oauth2.json'
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def store
|
8
|
+
@store ||= Google::APIClient::FileStore.new(::File.expand_path(DEFAULE_FILE_STORE_PATH))
|
9
|
+
end
|
10
|
+
|
11
|
+
def store=(value)
|
12
|
+
@store = value
|
13
|
+
end
|
14
|
+
end # of class methods
|
15
|
+
|
16
|
+
def store
|
17
|
+
GoogleDrive::CredentialStorage.store
|
18
|
+
end
|
19
|
+
|
20
|
+
def credential_stored?
|
21
|
+
not store.load_credentials.nil?
|
22
|
+
end
|
23
|
+
|
24
|
+
def storage
|
25
|
+
@storage ||= Google::APIClient::Storage.new(store)
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'google/api_client/auth/storages/file_store'
|
2
|
+
|
3
|
+
class Google::APIClient::FileStore
|
4
|
+
alias write_credentials_orig write_credentials
|
5
|
+
|
6
|
+
def write_credentials(credentials_hash)
|
7
|
+
write_credentials_orig(credentials_hash)
|
8
|
+
FileUtils.chmod(0600, path)
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
class GoogleDrive::PersistentSession
|
2
|
+
extend Forwardable
|
3
|
+
include GoogleDrive::CredentialStorage
|
4
|
+
|
5
|
+
def_delegator :@highline, :ask
|
6
|
+
|
7
|
+
THREAD_KEY = "#{self.to_s}::THREAD_KEY"
|
8
|
+
|
9
|
+
def self.login
|
10
|
+
self.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@highline = HighLine.new
|
15
|
+
ensure_login
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def ensure_login
|
21
|
+
store_credential unless credential_stored?
|
22
|
+
credential = storage.authorize
|
23
|
+
|
24
|
+
if credential.expired?
|
25
|
+
refresh(credential)
|
26
|
+
end
|
27
|
+
|
28
|
+
unless session
|
29
|
+
login_with_oauth(credential.access_token)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def store_credential
|
34
|
+
client_id = ask('Enter CLIENT ID: ')
|
35
|
+
client_secret = ask('Enter CLIENT SECRET: ') {|q| q.echo = false }
|
36
|
+
puts # line break
|
37
|
+
|
38
|
+
credential = Google::Auth::UserRefreshCredentials.new(
|
39
|
+
:client_id => client_id,
|
40
|
+
:client_secret => client_secret,
|
41
|
+
:scope => [
|
42
|
+
'https://www.googleapis.com/auth/drive',
|
43
|
+
'https://spreadsheets.google.com/feeds/'
|
44
|
+
],
|
45
|
+
:redirect_uri => 'urn:ietf:wg:oauth:2.0:oob',
|
46
|
+
:grant_type => 'authorization_code'
|
47
|
+
)
|
48
|
+
|
49
|
+
fetch_access_token(credential)
|
50
|
+
storage.write_credentials(credential)
|
51
|
+
end
|
52
|
+
|
53
|
+
def fetch_access_token(credential)
|
54
|
+
message = "1. Open this page:\n%s\n\n" % credential.authorization_uri
|
55
|
+
message << "2. Enter the authorization code shown in the page: "
|
56
|
+
credential.code = ask(message)
|
57
|
+
|
58
|
+
credential.fetch_access_token!
|
59
|
+
storage.write_credentials(credential)
|
60
|
+
login_with_oauth(credential.access_token)
|
61
|
+
end
|
62
|
+
|
63
|
+
def refresh(credential)
|
64
|
+
credential.refresh!
|
65
|
+
storage.write_credentials(credential)
|
66
|
+
login_with_oauth(credential.access_token)
|
67
|
+
end
|
68
|
+
|
69
|
+
def session
|
70
|
+
Thread.current[THREAD_KEY]
|
71
|
+
end
|
72
|
+
|
73
|
+
def login_with_oauth(access_token)
|
74
|
+
Thread.current[THREAD_KEY] = GoogleDrive.login_with_oauth(access_token)
|
75
|
+
end
|
76
|
+
|
77
|
+
def method_missing(method_name, *args , &block)
|
78
|
+
ensure_login
|
79
|
+
session.send(method_name, *args, &block)
|
80
|
+
end
|
81
|
+
end
|
metadata
CHANGED
@@ -1,107 +1,110 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google_drive-persistent_session
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Genki Sugawara
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google_drive
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 3.0.7
|
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
|
-
version:
|
26
|
+
version: 3.0.7
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: highline
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
description: Persist credential for google-drive-ruby.
|
70
70
|
email:
|
71
|
-
-
|
71
|
+
- sugawara@winebarrel.jp
|
72
72
|
executables: []
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
-
- .gitignore
|
76
|
+
- ".gitignore"
|
77
77
|
- Gemfile
|
78
78
|
- LICENSE.txt
|
79
79
|
- README.md
|
80
80
|
- Rakefile
|
81
81
|
- google_drive-persistent_session.gemspec
|
82
82
|
- lib/google_drive/persistent_session.rb
|
83
|
+
- lib/google_drive/persistent_session/credential_storage.rb
|
84
|
+
- lib/google_drive/persistent_session/file_store_ext.rb
|
85
|
+
- lib/google_drive/persistent_session/persistent_session.rb
|
86
|
+
- lib/google_drive/persistent_session/version.rb
|
83
87
|
homepage: https://github.com/winebarrel/google_drive-persistent_session
|
84
88
|
licenses:
|
85
89
|
- MIT
|
86
90
|
metadata: {}
|
87
|
-
post_install_message:
|
91
|
+
post_install_message:
|
88
92
|
rdoc_options: []
|
89
93
|
require_paths:
|
90
94
|
- lib
|
91
95
|
required_ruby_version: !ruby/object:Gem::Requirement
|
92
96
|
requirements:
|
93
|
-
- -
|
97
|
+
- - ">="
|
94
98
|
- !ruby/object:Gem::Version
|
95
99
|
version: '0'
|
96
100
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
101
|
requirements:
|
98
|
-
- -
|
102
|
+
- - ">="
|
99
103
|
- !ruby/object:Gem::Version
|
100
104
|
version: '0'
|
101
105
|
requirements: []
|
102
|
-
|
103
|
-
|
104
|
-
signing_key:
|
106
|
+
rubygems_version: 3.1.4
|
107
|
+
signing_key:
|
105
108
|
specification_version: 4
|
106
109
|
summary: Persist credential for google-drive-ruby.
|
107
110
|
test_files: []
|