google_drive 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/google_drive.rb +13 -6
- data/lib/google_drive/basic_fetcher.rb +48 -0
- data/lib/google_drive/client_login_fetcher.rb +3 -28
- data/lib/google_drive/collection.rb +1 -2
- data/lib/google_drive/oauth2_fetcher.rb +10 -33
- data/lib/google_drive/session.rb +12 -7
- data/lib/google_drive/spreadsheet.rb +8 -0
- data/lib/google_drive/worksheet.rb +3 -3
- metadata +5 -19
data/lib/google_drive.rb
CHANGED
@@ -20,6 +20,13 @@ module GoogleDrive
|
|
20
20
|
|
21
21
|
# Authenticates with given OAuth1 or OAuth2 token.
|
22
22
|
#
|
23
|
+
# +access_token+ can be either OAuth2 access_token string, OAuth2::AccessToken or OAuth::AccessToken.
|
24
|
+
#
|
25
|
+
# +proxy+ can be nil or return value of Net::HTTP.Proxy. If +proxy+ is specified, all
|
26
|
+
# HTTP access in the session uses the proxy. If +proxy+ is nil, it uses the proxy
|
27
|
+
# specified by http_proxy environment variable if available. Otherwise it performs direct
|
28
|
+
# access.
|
29
|
+
#
|
23
30
|
# OAuth2 code example:
|
24
31
|
#
|
25
32
|
# client = OAuth2::Client.new(
|
@@ -36,14 +43,14 @@ module GoogleDrive
|
|
36
43
|
# # Redirect the user to auth_url and get authorization code from redirect URL.
|
37
44
|
# auth_token = client.auth_code.get_token(
|
38
45
|
# authorization_code, :redirect_uri => "http://example.com/")
|
39
|
-
# session = GoogleDrive.login_with_oauth(auth_token)
|
46
|
+
# session = GoogleDrive.login_with_oauth(auth_token.token)
|
40
47
|
#
|
41
48
|
# Or, from existing refresh token:
|
42
49
|
#
|
43
|
-
#
|
50
|
+
# auth_token = OAuth2::AccessToken.from_hash(client,
|
44
51
|
# {:refresh_token => refresh_token, :expires_at => expires_at})
|
45
|
-
#
|
46
|
-
# session = GoogleDrive.login_with_oauth(
|
52
|
+
# auth_token = auth_token.refresh!
|
53
|
+
# session = GoogleDrive.login_with_oauth(auth_token.token)
|
47
54
|
#
|
48
55
|
# If your app is not a Web app, use "urn:ietf:wg:oauth:2.0:oob" as redirect_url. Then
|
49
56
|
# authorization code is shown after authorization.
|
@@ -68,8 +75,8 @@ module GoogleDrive
|
|
68
75
|
# - http://code.google.com/apis/accounts/docs/OAuth2.html
|
69
76
|
# - http://oauth.rubyforge.org/
|
70
77
|
# - http://code.google.com/apis/accounts/docs/OAuth.html
|
71
|
-
def self.login_with_oauth(
|
72
|
-
return Session.login_with_oauth(
|
78
|
+
def self.login_with_oauth(access_token, proxy = nil)
|
79
|
+
return Session.login_with_oauth(access_token, proxy)
|
73
80
|
end
|
74
81
|
|
75
82
|
# Restores session using return value of auth_tokens method of previous session.
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# Author: Hiroshi Ichikawa <http://gimite.net/>
|
2
|
+
# The license of this source is "New BSD Licence"
|
3
|
+
|
4
|
+
require "net/https"
|
5
|
+
require "uri"
|
6
|
+
Net::HTTP.version_1_2
|
7
|
+
|
8
|
+
|
9
|
+
module GoogleDrive
|
10
|
+
|
11
|
+
class BasicFetcher #:nodoc:
|
12
|
+
|
13
|
+
def initialize(proxy)
|
14
|
+
if proxy
|
15
|
+
@proxy = proxy
|
16
|
+
elsif ENV["http_proxy"] && !ENV["http_proxy"].empty?
|
17
|
+
proxy_url = URI.parse(ENV["http_proxy"])
|
18
|
+
@proxy = Net::HTTP.Proxy(proxy_url.host, proxy_url.port)
|
19
|
+
else
|
20
|
+
@proxy = Net::HTTP
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def request_raw(method, url, data, extra_header, auth)
|
25
|
+
uri = URI.parse(url)
|
26
|
+
http = @proxy.new(uri.host, uri.port)
|
27
|
+
http.use_ssl = true
|
28
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
29
|
+
http.start() do
|
30
|
+
path = uri.path + (uri.query ? "?#{uri.query}" : "")
|
31
|
+
header = auth_header(auth).merge(extra_header)
|
32
|
+
if method == :delete || method == :get
|
33
|
+
return http.__send__(method, path, header)
|
34
|
+
else
|
35
|
+
return http.__send__(method, path, data, header)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def auth_header(auth)
|
43
|
+
return {}
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -1,45 +1,20 @@
|
|
1
1
|
# Author: Hiroshi Ichikawa <http://gimite.net/>
|
2
2
|
# The license of this source is "New BSD Licence"
|
3
3
|
|
4
|
-
require "
|
5
|
-
require "uri"
|
6
|
-
Net::HTTP.version_1_2
|
4
|
+
require "google_drive/basic_fetcher"
|
7
5
|
|
8
6
|
|
9
7
|
module GoogleDrive
|
10
8
|
|
11
|
-
class ClientLoginFetcher #:nodoc:
|
9
|
+
class ClientLoginFetcher < BasicFetcher #:nodoc:
|
12
10
|
|
13
11
|
def initialize(auth_tokens, proxy)
|
12
|
+
super(proxy)
|
14
13
|
@auth_tokens = auth_tokens
|
15
|
-
if proxy
|
16
|
-
@proxy = proxy
|
17
|
-
elsif ENV["http_proxy"] && !ENV["http_proxy"].empty?
|
18
|
-
proxy_url = URI.parse(ENV["http_proxy"])
|
19
|
-
@proxy = Net::HTTP.Proxy(proxy_url.host, proxy_url.port)
|
20
|
-
else
|
21
|
-
@proxy = Net::HTTP
|
22
|
-
end
|
23
14
|
end
|
24
15
|
|
25
16
|
attr_accessor(:auth_tokens)
|
26
17
|
|
27
|
-
def request_raw(method, url, data, extra_header, auth)
|
28
|
-
uri = URI.parse(url)
|
29
|
-
http = @proxy.new(uri.host, uri.port)
|
30
|
-
http.use_ssl = true
|
31
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
32
|
-
http.start() do
|
33
|
-
path = uri.path + (uri.query ? "?#{uri.query}" : "")
|
34
|
-
header = auth_header(auth).merge(extra_header)
|
35
|
-
if method == :delete || method == :get
|
36
|
-
return http.__send__(method, path, header)
|
37
|
-
else
|
38
|
-
return http.__send__(method, path, data, header)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
18
|
private
|
44
19
|
|
45
20
|
def auth_header(auth)
|
@@ -1,47 +1,24 @@
|
|
1
1
|
# Author: Hiroshi Ichikawa <http://gimite.net/>
|
2
2
|
# The license of this source is "New BSD Licence"
|
3
3
|
|
4
|
-
require "
|
5
|
-
require "oauth2"
|
4
|
+
require "google_drive/basic_fetcher"
|
6
5
|
|
7
6
|
|
8
7
|
module GoogleDrive
|
9
8
|
|
10
|
-
class OAuth2Fetcher #:nodoc:
|
9
|
+
class OAuth2Fetcher < BasicFetcher #:nodoc:
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
@raw_res = raw_res
|
16
|
-
end
|
17
|
-
|
18
|
-
def code
|
19
|
-
return @raw_res.status.to_s()
|
20
|
-
end
|
21
|
-
|
22
|
-
def body
|
23
|
-
return @raw_res.body
|
24
|
-
end
|
25
|
-
|
26
|
-
def [](name)
|
27
|
-
return @raw_res.headers[name]
|
28
|
-
end
|
29
|
-
|
11
|
+
def initialize(auth_token, proxy)
|
12
|
+
super(proxy)
|
13
|
+
@auth_token = auth_token
|
30
14
|
end
|
31
15
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
def request_raw(method, url, data, extra_header, auth)
|
37
|
-
if method == :delete || method == :get
|
38
|
-
raw_res = @oauth2_token.request(method, url, {:headers => extra_header})
|
39
|
-
else
|
40
|
-
raw_res = @oauth2_token.request(method, url, {:headers => extra_header, :body => data})
|
41
|
-
end
|
42
|
-
return Response.new(raw_res)
|
16
|
+
private
|
17
|
+
|
18
|
+
def auth_header(auth)
|
19
|
+
return {"Authorization" => "Bearer %s" % @auth_token}
|
43
20
|
end
|
44
|
-
|
21
|
+
|
45
22
|
end
|
46
23
|
|
47
24
|
end
|
data/lib/google_drive/session.rb
CHANGED
@@ -6,6 +6,8 @@ require "stringio"
|
|
6
6
|
|
7
7
|
require "rubygems"
|
8
8
|
require "nokogiri"
|
9
|
+
require "oauth"
|
10
|
+
require "oauth2"
|
9
11
|
|
10
12
|
require "google_drive/util"
|
11
13
|
require "google_drive/client_login_fetcher"
|
@@ -38,15 +40,18 @@ module GoogleDrive
|
|
38
40
|
end
|
39
41
|
|
40
42
|
# The same as GoogleDrive.login_with_oauth.
|
41
|
-
def self.login_with_oauth(
|
42
|
-
case
|
43
|
+
def self.login_with_oauth(access_token, proxy = nil)
|
44
|
+
case access_token
|
43
45
|
when OAuth::AccessToken
|
44
|
-
|
46
|
+
raise(GoogleDrive::Error, "proxy is not supported with OAuth1.") if proxy
|
47
|
+
fetcher = OAuth1Fetcher.new(access_token)
|
45
48
|
when OAuth2::AccessToken
|
46
|
-
fetcher = OAuth2Fetcher.new(
|
49
|
+
fetcher = OAuth2Fetcher.new(access_token.token, proxy)
|
50
|
+
when String
|
51
|
+
fetcher = OAuth2Fetcher.new(access_token, proxy)
|
47
52
|
else
|
48
53
|
raise(GoogleDrive::Error,
|
49
|
-
"
|
54
|
+
"access_token is neither String, OAuth2::Token nor OAuth::Token: %p" % access_token)
|
50
55
|
end
|
51
56
|
return Session.new(nil, fetcher)
|
52
57
|
end
|
@@ -241,7 +246,7 @@ module GoogleDrive
|
|
241
246
|
# Looks like a URL of human-readable collection page. Converts to collection feed URL.
|
242
247
|
url = "#{DOCS_BASE_URL}/folder%3A#{$1}"
|
243
248
|
end
|
244
|
-
return Collection.new(self, url)
|
249
|
+
return Collection.new(self, to_v3_url(url))
|
245
250
|
end
|
246
251
|
|
247
252
|
# Creates new spreadsheet and returns the new GoogleDrive::Spreadsheet.
|
@@ -307,7 +312,7 @@ module GoogleDrive
|
|
307
312
|
# session.upload_from_file("/path/to/hoge.tsv", "Hoge")
|
308
313
|
# session.upload_from_file("/path/to/hoge.csv", "Hoge")
|
309
314
|
# session.upload_from_file("/path/to/hoge", "Hoge", :content_type => "text/tab-separated-values")
|
310
|
-
# session.upload_from_file("/path/to/hoge", "Hoge", :content_type => "text/
|
315
|
+
# session.upload_from_file("/path/to/hoge", "Hoge", :content_type => "text/csv")
|
311
316
|
def upload_from_file(path, title = nil, params = {})
|
312
317
|
file_name = ::File.basename(path)
|
313
318
|
params = {:file_name => file_name}.merge(params)
|
@@ -154,6 +154,14 @@ module GoogleDrive
|
|
154
154
|
end
|
155
155
|
end
|
156
156
|
|
157
|
+
def download_to_io(io, params = {})
|
158
|
+
# General downloading API doesn't work for spreadsheets because it requires a different
|
159
|
+
# authorization token, and it has a bug that it downloads PDF when text/html is
|
160
|
+
# requested.
|
161
|
+
raise(NotImplementedError,
|
162
|
+
"Use export_as_file or export_as_string instead for GoogleDrive::Spreadsheet.")
|
163
|
+
end
|
164
|
+
|
157
165
|
# Returns worksheets of the spreadsheet as array of GoogleDrive::Worksheet.
|
158
166
|
def worksheets
|
159
167
|
doc = @session.request(:get, @worksheets_feed_url)
|
@@ -272,7 +272,7 @@ module GoogleDrive
|
|
272
272
|
"&min-col=#{cols.min}&max-col=#{cols.max}")
|
273
273
|
doc = @session.request(:get, url)
|
274
274
|
|
275
|
-
doc.css("entry")
|
275
|
+
for entry in doc.css("entry")
|
276
276
|
row = entry.css("gs|cell")[0]["row"].to_i()
|
277
277
|
col = entry.css("gs|cell")[0]["col"].to_i()
|
278
278
|
cell_entries[[row, col]] = entry
|
@@ -280,7 +280,7 @@ module GoogleDrive
|
|
280
280
|
|
281
281
|
# Updates cell values using batch operation.
|
282
282
|
# If the data is large, we split it into multiple operations, otherwise batch may fail.
|
283
|
-
@modified.each_slice(
|
283
|
+
@modified.each_slice(25) do |chunk|
|
284
284
|
|
285
285
|
xml = <<-EOS
|
286
286
|
<feed xmlns="http://www.w3.org/2005/Atom"
|
@@ -310,7 +310,7 @@ module GoogleDrive
|
|
310
310
|
|
311
311
|
batch_url = concat_url(@cells_feed_url, "/batch")
|
312
312
|
result = @session.request(:post, batch_url, :data => xml)
|
313
|
-
result.css("atom|entry")
|
313
|
+
for entry in result.css("atom|entry")
|
314
314
|
interrupted = entry.css("batch|interrupted")[0]
|
315
315
|
if interrupted
|
316
316
|
raise(GoogleDrive::Error, "Update has failed: %s" %
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google_drive
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
@@ -87,22 +87,6 @@ dependencies:
|
|
87
87
|
- - ! '>='
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: 0.8.0
|
90
|
-
- !ruby/object:Gem::Dependency
|
91
|
-
name: debugger
|
92
|
-
requirement: !ruby/object:Gem::Requirement
|
93
|
-
none: false
|
94
|
-
requirements:
|
95
|
-
- - ! '>='
|
96
|
-
- !ruby/object:Gem::Version
|
97
|
-
version: '0'
|
98
|
-
type: :development
|
99
|
-
prerelease: false
|
100
|
-
version_requirements: !ruby/object:Gem::Requirement
|
101
|
-
none: false
|
102
|
-
requirements:
|
103
|
-
- - ! '>='
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
version: '0'
|
106
90
|
description: A library to read/write files/spreadsheets in Google Drive/Docs.
|
107
91
|
email:
|
108
92
|
- gimite+github@gmail.com
|
@@ -131,11 +115,13 @@ files:
|
|
131
115
|
- lib/google_drive/authentication_error.rb
|
132
116
|
- lib/google_drive/util.rb
|
133
117
|
- lib/google_drive/list.rb
|
118
|
+
- lib/google_drive/basic_fetcher.rb
|
134
119
|
- lib/google_drive/record.rb
|
135
120
|
- doc_src/google_drive/acl.rb
|
136
121
|
- doc_src/google_drive/acl_entry.rb
|
137
122
|
homepage: https://github.com/gimite/google-drive-ruby
|
138
|
-
licenses:
|
123
|
+
licenses:
|
124
|
+
- New BSD
|
139
125
|
post_install_message:
|
140
126
|
rdoc_options:
|
141
127
|
- --main
|