google_drive 2.0.2 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -23
- data/lib/google_drive.rb +8 -141
- data/lib/google_drive/session.rb +93 -1
- data/lib/google_drive/worksheet.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6fa325ec359ec66d6e6ee9260d96d204249c8b62
|
4
|
+
data.tar.gz: cc7719032cb68583fd38f69ad59b11a7c5a4f494
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23434caab95532f6739a88ebba51e2a9aadcf16131dbd28a5df23795ef3d7cb86b9fb4d0778acec63d4a28e94f2b4eb867e1761e4dd4226849b731661113beb9
|
7
|
+
data.tar.gz: 8ed3cf51a8f2799f7abb45e61271fa7f2b78129e51e4604edbc3fdd0e409b83a6e7037c9bb6fdc0ebc3494e0f98066b65103859353ca9bf91084443637cdf0cd
|
data/README.md
CHANGED
@@ -37,35 +37,18 @@ $ sudo gem install google_drive
|
|
37
37
|
|
38
38
|
## How to use
|
39
39
|
|
40
|
-
|
41
|
-
page](https://developers.google.com/drive/v3/web/about-auth) to get a client
|
42
|
-
ID and client secret for OAuth. Set "Application type" to "Other" in the form
|
43
|
-
to create a client ID if you use GoogleDrive.saved_session method as in the
|
44
|
-
example below.
|
45
|
-
|
46
|
-
Next, create a file config.json which contains the client ID and crient secret
|
47
|
-
you got above, which looks like:
|
48
|
-
|
49
|
-
```json
|
50
|
-
{
|
51
|
-
"client_id": "xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
|
52
|
-
"client_secret": "xxxxxxxxxxxxxxxxxxxxxxxx"
|
53
|
-
}
|
54
|
-
```
|
40
|
+
### Authorization
|
55
41
|
|
56
|
-
|
57
|
-
belonging to the the user who generated the token. To set permissions more
|
58
|
-
specifically, you may want to consider using a service account. [See full docs
|
59
|
-
in the login_with_oauth method.](https://github.com/gimite/google-drive-ruby/blob/lib/google_drive.rb)
|
42
|
+
Follow one of the options in [Authorization](https://github.com/gimite/google-drive-ruby/doc/authorization.md) to construct a session object. The example code below assumes "On behalf of you" option.
|
60
43
|
|
61
|
-
### Example to read/write files in Google Drive
|
44
|
+
### Example to read/write files in Google Drive
|
62
45
|
|
63
46
|
```ruby
|
64
47
|
require "google_drive"
|
65
48
|
|
66
49
|
# Creates a session. This will prompt the credential via command line for the
|
67
50
|
# first time and save it to config.json file for later usages.
|
68
|
-
session = GoogleDrive.
|
51
|
+
session = GoogleDrive::Session.from_config("config.json")
|
69
52
|
|
70
53
|
# Gets list of remote files.
|
71
54
|
session.files.each do |file|
|
@@ -83,14 +66,14 @@ file.download_to_file("/path/to/hello.txt")
|
|
83
66
|
file.update_from_file("/path/to/hello.txt")
|
84
67
|
```
|
85
68
|
|
86
|
-
### Example to read/write spreadsheets
|
69
|
+
### Example to read/write spreadsheets
|
87
70
|
|
88
71
|
```ruby
|
89
72
|
require "google_drive"
|
90
73
|
|
91
74
|
# Creates a session. This will prompt the credential via command line for the
|
92
75
|
# first time and save it to config.json file for later usages.
|
93
|
-
session = GoogleDrive.
|
76
|
+
session = GoogleDrive::Session.from_config("config.json")
|
94
77
|
|
95
78
|
# First worksheet of
|
96
79
|
# https://docs.google.com/spreadsheet/ccc?key=pz7XtlQC-PYx-jrVMJErTcg
|
data/lib/google_drive.rb
CHANGED
@@ -7,157 +7,24 @@ require 'googleauth'
|
|
7
7
|
require 'google_drive/session'
|
8
8
|
|
9
9
|
module GoogleDrive
|
10
|
-
#
|
11
|
-
#
|
12
|
-
# +access_token+ can be either OAuth2 access_token string, OAuth2::AccessToken
|
13
|
-
# or credentials generated by googleauth library.
|
14
|
-
#
|
15
|
-
# OAuth2 code example for Web apps:
|
16
|
-
#
|
17
|
-
# require "googleauth"
|
18
|
-
#
|
19
|
-
# credentials = Google::Auth::UserRefreshCredentials.new(
|
20
|
-
# client_id: "YOUR CLIENT ID",
|
21
|
-
# client_secret: "YOUR CLIENT SECRET",
|
22
|
-
# scope: [
|
23
|
-
# "https://www.googleapis.com/auth/drive",
|
24
|
-
# "https://spreadsheets.google.com/feeds/",
|
25
|
-
# ],
|
26
|
-
# redirect_uri: "http://example.com/redirect")
|
27
|
-
# auth_url = credentials.authorization_uri
|
28
|
-
# # Redirect the user to auth_url and get authorization code from redirect URL.
|
29
|
-
# credentials.code = authorization_code
|
30
|
-
# credentials.fetch_access_token!
|
31
|
-
# session = GoogleDrive.login_with_oauth(credentials)
|
32
|
-
#
|
33
|
-
# credentials.access_token expires in 1 hour. If you want to restore a session afterwards, you can store
|
34
|
-
# credentials.refresh_token somewhere after auth.fetch_access_token! above, and use this code:
|
35
|
-
#
|
36
|
-
# require "googleauth"
|
37
|
-
#
|
38
|
-
# credentials = Google::Auth::UserRefreshCredentials.new(
|
39
|
-
# client_id: "YOUR CLIENT ID",
|
40
|
-
# client_secret: "YOUR CLIENT SECRET",
|
41
|
-
# scope: [
|
42
|
-
# "https://www.googleapis.com/auth/drive",
|
43
|
-
# "https://spreadsheets.google.com/feeds/",
|
44
|
-
# ],
|
45
|
-
# redirect_uri: "http://example.com/redirect")
|
46
|
-
# credentials.refresh_token = refresh_token
|
47
|
-
# credentials.fetch_access_token!
|
48
|
-
# session = GoogleDrive.login_with_oauth(credentials.access_token)
|
49
|
-
#
|
50
|
-
# For command-line apps, it would be easier to use saved_session method instead.
|
51
|
-
#
|
52
|
-
# To use service account authentication:
|
53
|
-
#
|
54
|
-
# 1. Go to the Credentials tab for your project in the Google API console: https://console.developers.google.com/apis/credentials
|
55
|
-
# 2. Create a service account key, and download the keys as JSON. (This address ends in iam.gserviceaccount.com.)
|
56
|
-
# 3. Share the Drive folders or files with the client_email address in the JSON you downloaded.
|
57
|
-
# 3. Set a GOOGLE_CLIENT_EMAIL environmental variable based on the client_email.
|
58
|
-
# 4. Set a GOOGLE_PRIVATE_KEY environmental variable based on the private_key in the JSON. Be careful to preserve newlines.
|
59
|
-
# 5. Create a GoogleDrive session from these environmental variables:
|
60
|
-
#
|
61
|
-
# session = GoogleDrive.login_with_oauth(Google::Auth::ServiceAccountCredentials.from_env(
|
62
|
-
# 'https://www.googleapis.com/auth/drive'
|
63
|
-
# ))
|
64
|
-
# The scope can be adjusted to be as broad or specific as necessary.
|
65
|
-
# The full list of scopes is available here: https://developers.google.com/drive/v2/web/scopes.
|
66
|
-
#
|
10
|
+
# Equivalent of either GoogleDrive::Session.from_credentials or
|
11
|
+
# GoogleDrive::Session.from_access_token.
|
67
12
|
def self.login_with_oauth(client_or_access_token, proxy = nil)
|
68
13
|
Session.new(client_or_access_token, proxy)
|
69
14
|
end
|
70
15
|
|
71
|
-
#
|
72
|
-
#
|
73
|
-
# Follow the following steps to use this method:
|
74
|
-
#
|
75
|
-
# First, follow "Create a client ID and client secret" in
|
76
|
-
# {this page}[https://developers.google.com/drive/web/auth/web-server] to get a client ID
|
77
|
-
# and client secret for OAuth. Set "Application type" to "Other" in the form to create a
|
78
|
-
# client ID if you use GoogleDrive.saved_session method as in the example below.
|
79
|
-
#
|
80
|
-
# Next, create a file config.json which contains the client ID and client secret you got
|
81
|
-
# above, which looks like:
|
82
|
-
#
|
83
|
-
# {
|
84
|
-
# "client_id": "xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
|
85
|
-
# "client_secret": "xxxxxxxxxxxxxxxxxxxxxxxx"
|
86
|
-
# }
|
87
|
-
#
|
88
|
-
# Then you can construct a GoogleDrive::Session by:
|
89
|
-
#
|
90
|
-
# session = GoogleDrive.saved_session("config.json")
|
91
|
-
#
|
92
|
-
# This will prompt the credential via command line for the first time and save it to
|
93
|
-
# config.json file for later usages.
|
94
|
-
#
|
95
|
-
# +path+ defaults to ENV["HOME"] + "/.ruby_google_drive.token".
|
96
|
-
#
|
97
|
-
# If the file doesn't exist or client ID/secret are not given in the file, the default client
|
98
|
-
# ID/secret embedded in the library is used.
|
99
|
-
#
|
100
|
-
# You can also provide a config object that must respond to:
|
101
|
-
# client_id
|
102
|
-
# client_secret
|
103
|
-
# refesh_token
|
104
|
-
# refresh_token=
|
105
|
-
# scope
|
106
|
-
# scope=
|
107
|
-
# save
|
16
|
+
# Alias of GoogleDrive::Session.from_config.
|
108
17
|
def self.saved_session(
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
Config.new(path_or_config)
|
114
|
-
when nil
|
115
|
-
Config.new(ENV['HOME'] + '/.ruby_google_drive.token')
|
116
|
-
else
|
117
|
-
path_or_config
|
118
|
-
end
|
119
|
-
|
120
|
-
config.scope ||= [
|
121
|
-
'https://www.googleapis.com/auth/drive',
|
122
|
-
'https://spreadsheets.google.com/feeds/'
|
123
|
-
]
|
124
|
-
|
125
|
-
if client_id && client_secret
|
126
|
-
config.client_id = client_id
|
127
|
-
config.client_secret = client_secret
|
128
|
-
end
|
129
|
-
if !config.client_id && !config.client_secret
|
130
|
-
config.client_id = '452925651630-egr1f18o96acjjvphpbbd1qlsevkho1d.apps.googleusercontent.com'
|
131
|
-
config.client_secret = '1U3-Krii5x1oLPrwD5zgn-ry'
|
132
|
-
elsif !config.client_id || !config.client_secret
|
133
|
-
fail(ArgumentError, 'client_id and client_secret must be both specified or both omitted')
|
134
|
-
end
|
135
|
-
|
18
|
+
config = ENV['HOME'] + '/.ruby_google_drive.token',
|
19
|
+
proxy = nil,
|
20
|
+
client_id = nil,
|
21
|
+
client_secret = nil)
|
136
22
|
if proxy
|
137
23
|
fail(
|
138
24
|
ArgumentError,
|
139
25
|
'Specifying a proxy object is no longer supported. Set ENV["http_proxy"] instead.')
|
140
26
|
end
|
141
27
|
|
142
|
-
|
143
|
-
client_id: config.client_id,
|
144
|
-
client_secret: config.client_secret,
|
145
|
-
scope: config.scope,
|
146
|
-
redirect_uri: 'urn:ietf:wg:oauth:2.0:oob')
|
147
|
-
|
148
|
-
if config.refresh_token
|
149
|
-
credentials.refresh_token = config.refresh_token
|
150
|
-
credentials.fetch_access_token!
|
151
|
-
else
|
152
|
-
$stderr.print("\n1. Open this page:\n%s\n\n" % credentials.authorization_uri)
|
153
|
-
$stderr.print('2. Enter the authorization code shown in the page: ')
|
154
|
-
credentials.code = $stdin.gets.chomp
|
155
|
-
credentials.fetch_access_token!
|
156
|
-
config.refresh_token = credentials.refresh_token
|
157
|
-
end
|
158
|
-
|
159
|
-
config.save
|
160
|
-
|
161
|
-
GoogleDrive.login_with_oauth(credentials)
|
28
|
+
Session.from_config(config, client_id: client_id, client_secret: client_secret)
|
162
29
|
end
|
163
30
|
end
|
data/lib/google_drive/session.rb
CHANGED
@@ -26,7 +26,12 @@ module GoogleDrive
|
|
26
26
|
include(Util)
|
27
27
|
extend(Util)
|
28
28
|
|
29
|
-
|
29
|
+
DEFAULT_SCOPE = [
|
30
|
+
'https://www.googleapis.com/auth/drive',
|
31
|
+
'https://spreadsheets.google.com/feeds/'
|
32
|
+
]
|
33
|
+
|
34
|
+
# Equivalent of either from_credentials or from_access_token.
|
30
35
|
def self.login_with_oauth(credentials_or_access_token, proxy = nil)
|
31
36
|
Session.new(credentials_or_access_token, proxy)
|
32
37
|
end
|
@@ -36,6 +41,93 @@ module GoogleDrive
|
|
36
41
|
Session.new(nil)
|
37
42
|
end
|
38
43
|
|
44
|
+
# Constructs a GoogleDrive::Session object from OAuth2 credentials such as
|
45
|
+
# Google::Auth::UserRefreshCredentials.
|
46
|
+
#
|
47
|
+
# See https://github.com/gimite/google-drive-ruby/doc/authorization.md for a usage example.
|
48
|
+
def self.from_credentials(credentials)
|
49
|
+
Session.new(credentials)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Constructs a GoogleDrive::Session object from OAuth2 access token string.
|
53
|
+
def self.from_access_token(access_token)
|
54
|
+
Session.new(access_token)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Constructs a GoogleDrive::Session object from a service account key JSON.
|
58
|
+
#
|
59
|
+
# You can pass either the path to a JSON file, or an IO-like object with the JSON.
|
60
|
+
#
|
61
|
+
# See https://github.com/gimite/google-drive-ruby/doc/authorization.md for a usage example.
|
62
|
+
def self.from_service_account_key(json_key_path_or_io, scope = DEFAULT_SCOPE)
|
63
|
+
if json_key_path_or_io.is_a?(String)
|
64
|
+
open(json_key_path_or_io) do |f|
|
65
|
+
from_service_account_key(f, scope)
|
66
|
+
end
|
67
|
+
else
|
68
|
+
credentials = Google::Auth::ServiceAccountCredentials.make_creds(
|
69
|
+
json_key_io: json_key_path_or_io, scope: scope)
|
70
|
+
Session.new(credentials)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Returns GoogleDrive::Session constructed from a config JSON file at +config+.
|
75
|
+
#
|
76
|
+
# +config+ is the path to the config file.
|
77
|
+
#
|
78
|
+
# This will prompt the credential via command line for the first time and save it to
|
79
|
+
# +config+ for later usages.
|
80
|
+
#
|
81
|
+
# See https://github.com/gimite/google-drive-ruby/doc/authorization.md for a usage example.
|
82
|
+
#
|
83
|
+
# You can also provide a config object that must respond to:
|
84
|
+
# client_id
|
85
|
+
# client_secret
|
86
|
+
# refesh_token
|
87
|
+
# refresh_token=
|
88
|
+
# scope
|
89
|
+
# scope=
|
90
|
+
# save
|
91
|
+
def self.from_config(config, options = {})
|
92
|
+
if config.is_a?(String)
|
93
|
+
config = Config.new(config)
|
94
|
+
end
|
95
|
+
|
96
|
+
config.scope ||= DEFAULT_SCOPE
|
97
|
+
|
98
|
+
if options[:client_id] && options[:client_secret]
|
99
|
+
config.client_id = options[:client_id]
|
100
|
+
config.client_secret = options[:client_secret]
|
101
|
+
end
|
102
|
+
if !config.client_id && !config.client_secret
|
103
|
+
config.client_id = '452925651630-egr1f18o96acjjvphpbbd1qlsevkho1d.apps.googleusercontent.com'
|
104
|
+
config.client_secret = '1U3-Krii5x1oLPrwD5zgn-ry'
|
105
|
+
elsif !config.client_id || !config.client_secret
|
106
|
+
fail(ArgumentError, 'client_id and client_secret must be both specified or both omitted')
|
107
|
+
end
|
108
|
+
|
109
|
+
credentials = Google::Auth::UserRefreshCredentials.new(
|
110
|
+
client_id: config.client_id,
|
111
|
+
client_secret: config.client_secret,
|
112
|
+
scope: config.scope,
|
113
|
+
redirect_uri: 'urn:ietf:wg:oauth:2.0:oob')
|
114
|
+
|
115
|
+
if config.refresh_token
|
116
|
+
credentials.refresh_token = config.refresh_token
|
117
|
+
credentials.fetch_access_token!
|
118
|
+
else
|
119
|
+
$stderr.print("\n1. Open this page:\n%s\n\n" % credentials.authorization_uri)
|
120
|
+
$stderr.print('2. Enter the authorization code shown in the page: ')
|
121
|
+
credentials.code = $stdin.gets.chomp
|
122
|
+
credentials.fetch_access_token!
|
123
|
+
config.refresh_token = credentials.refresh_token
|
124
|
+
end
|
125
|
+
|
126
|
+
config.save
|
127
|
+
|
128
|
+
Session.new(credentials)
|
129
|
+
end
|
130
|
+
|
39
131
|
def initialize(credentials_or_access_token, proxy = nil)
|
40
132
|
if proxy
|
41
133
|
fail(
|
@@ -257,7 +257,7 @@ module GoogleDrive
|
|
257
257
|
self.max_rows += rows.size
|
258
258
|
num_rows.downto(row_num) do |r|
|
259
259
|
(1..num_cols).each do |c|
|
260
|
-
self[r + rows.size, c] = self
|
260
|
+
self[r + rows.size, c] = self.input_value(r, c)
|
261
261
|
end
|
262
262
|
end
|
263
263
|
|
@@ -285,7 +285,7 @@ module GoogleDrive
|
|
285
285
|
end
|
286
286
|
for r in row_num..(self.max_rows - rows)
|
287
287
|
for c in 1..num_cols
|
288
|
-
self[r, c] = self
|
288
|
+
self[r, c] = self.input_value(r + rows, c)
|
289
289
|
end
|
290
290
|
end
|
291
291
|
self.max_rows -= rows
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google_drive
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hiroshi Ichikawa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|