google_drive 1.0.4 → 1.0.5
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 -13
- data/README.rdoc +15 -18
- data/lib/google_drive.rb +66 -59
- data/lib/google_drive/config.rb +37 -0
- data/lib/google_drive/error.rb +0 -4
- data/lib/google_drive/session.rb +18 -17
- metadata +28 -47
- data/lib/google_drive_v0.rb +0 -148
- data/lib/google_drive_v0/acl.rb +0 -115
- data/lib/google_drive_v0/acl_entry.rb +0 -100
- data/lib/google_drive_v0/api_client_fetcher.rb +0 -47
- data/lib/google_drive_v0/authentication_error.rb +0 -14
- data/lib/google_drive_v0/basic_fetcher.rb +0 -50
- data/lib/google_drive_v0/client_login_fetcher.rb +0 -31
- data/lib/google_drive_v0/collection.rb +0 -167
- data/lib/google_drive_v0/error.rb +0 -12
- data/lib/google_drive_v0/file.rb +0 -258
- data/lib/google_drive_v0/list.rb +0 -119
- data/lib/google_drive_v0/list_row.rb +0 -88
- data/lib/google_drive_v0/oauth1_fetcher.rb +0 -26
- data/lib/google_drive_v0/oauth2_fetcher.rb +0 -24
- data/lib/google_drive_v0/record.rb +0 -31
- data/lib/google_drive_v0/session.rb +0 -522
- data/lib/google_drive_v0/spreadsheet.rb +0 -248
- data/lib/google_drive_v0/table.rb +0 -60
- data/lib/google_drive_v0/util.rb +0 -73
- data/lib/google_drive_v0/worksheet.rb +0 -498
data/lib/google_drive_v0.rb
DELETED
@@ -1,148 +0,0 @@
|
|
1
|
-
# Author: Hiroshi Ichikawa <http://gimite.net/>
|
2
|
-
# The license of this source is "New BSD Licence"
|
3
|
-
|
4
|
-
require "rubygems"
|
5
|
-
require "google/api_client"
|
6
|
-
require "json"
|
7
|
-
|
8
|
-
require "google_drive_v0/session"
|
9
|
-
|
10
|
-
|
11
|
-
module GoogleDriveV0
|
12
|
-
|
13
|
-
# Authenticates with given +mail+ and +password+, and returns GoogleDriveV0::Session
|
14
|
-
# if succeeds. Raises GoogleDriveV0::AuthenticationError if fails.
|
15
|
-
# Google Apps account is supported.
|
16
|
-
#
|
17
|
-
# +proxy+ is deprecated, and will be removed in the next version.
|
18
|
-
def self.login(mail, password, proxy = nil)
|
19
|
-
return Session.login(mail, password, proxy)
|
20
|
-
end
|
21
|
-
|
22
|
-
# Authenticates with given OAuth2 token.
|
23
|
-
#
|
24
|
-
# +access_token+ can be either OAuth2 access_token string or OAuth2::AccessToken.
|
25
|
-
# Specifying OAuth::AccessToken is deprecated, and will not work in the next version.
|
26
|
-
#
|
27
|
-
# +proxy+ is deprecated, and will be removed in the next version.
|
28
|
-
#
|
29
|
-
# OAuth2 code example:
|
30
|
-
#
|
31
|
-
# client = OAuth2::Client.new(
|
32
|
-
# your_client_id, your_client_secret,
|
33
|
-
# :site => "https://accounts.google.com",
|
34
|
-
# :token_url => "/o/oauth2/token",
|
35
|
-
# :authorize_url => "/o/oauth2/auth")
|
36
|
-
# auth_url = client.auth_code.authorize_url(
|
37
|
-
# :redirect_uri => "http://example.com/",
|
38
|
-
# :scope =>
|
39
|
-
# "https://docs.google.com/feeds/ " +
|
40
|
-
# "https://docs.googleusercontent.com/ " +
|
41
|
-
# "https://spreadsheets.google.com/feeds/")
|
42
|
-
# # Redirect the user to auth_url and get authorization code from redirect URL.
|
43
|
-
# auth_token = client.auth_code.get_token(
|
44
|
-
# authorization_code, :redirect_uri => "http://example.com/")
|
45
|
-
# session = GoogleDriveV0.login_with_oauth(auth_token.token)
|
46
|
-
#
|
47
|
-
# Or, from existing refresh token:
|
48
|
-
#
|
49
|
-
# auth_token = OAuth2::AccessToken.from_hash(client,
|
50
|
-
# {:refresh_token => refresh_token, :expires_at => expires_at})
|
51
|
-
# auth_token = auth_token.refresh!
|
52
|
-
# session = GoogleDriveV0.login_with_oauth(auth_token.token)
|
53
|
-
#
|
54
|
-
# If your app is not a Web app, use "urn:ietf:wg:oauth:2.0:oob" as redirect_url. Then
|
55
|
-
# authorization code is shown after authorization.
|
56
|
-
#
|
57
|
-
# See these documents for details:
|
58
|
-
#
|
59
|
-
# - https://github.com/intridea/oauth2
|
60
|
-
# - http://code.google.com/apis/accounts/docs/OAuth2.html
|
61
|
-
# - http://oauth.rubyforge.org/
|
62
|
-
# - http://code.google.com/apis/accounts/docs/OAuth.html
|
63
|
-
def self.login_with_oauth(access_token, proxy = nil)
|
64
|
-
return Session.login_with_oauth(access_token, proxy)
|
65
|
-
end
|
66
|
-
|
67
|
-
# Restores session using return value of auth_tokens method of previous session.
|
68
|
-
#
|
69
|
-
# See GoogleDriveV0.login for description of parameter +proxy+.
|
70
|
-
def self.restore_session(auth_tokens, proxy = nil)
|
71
|
-
return Session.restore_session(auth_tokens, proxy)
|
72
|
-
end
|
73
|
-
|
74
|
-
# Restores GoogleDriveV0::Session from +path+ and returns it.
|
75
|
-
# If +path+ doesn't exist or authentication has failed, prompts the user to authorize the access,
|
76
|
-
# stores the session to +path+ and returns it.
|
77
|
-
#
|
78
|
-
# +path+ defaults to ENV["HOME"] + "/.ruby_google_drive.token".
|
79
|
-
#
|
80
|
-
# You can specify your own OAuth +client_id+ and +client_secret+. Otherwise the default one is used.
|
81
|
-
def self.saved_session(path = nil, proxy = nil, client_id = nil, client_secret = nil)
|
82
|
-
|
83
|
-
if proxy
|
84
|
-
raise(
|
85
|
-
ArgumentError,
|
86
|
-
"Specifying a proxy object is no longer supported. Set ENV[\"http_proxy\"] instead.")
|
87
|
-
end
|
88
|
-
|
89
|
-
if !client_id && !client_secret
|
90
|
-
client_id = "452925651630-egr1f18o96acjjvphpbbd1qlsevkho1d.apps.googleusercontent.com"
|
91
|
-
client_secret = "1U3-Krii5x1oLPrwD5zgn-ry"
|
92
|
-
elsif !client_id || !client_secret
|
93
|
-
raise(ArgumentError, "client_id and client_secret must be both specified or both omitted")
|
94
|
-
end
|
95
|
-
|
96
|
-
path ||= ENV["HOME"] + "/.ruby_google_drive.token"
|
97
|
-
if ::File.exist?(path)
|
98
|
-
lines = ::File.readlines(path)
|
99
|
-
case lines.size
|
100
|
-
when 1
|
101
|
-
token_data = JSON.parse(lines[0].chomp())
|
102
|
-
when 2
|
103
|
-
# Old format.
|
104
|
-
token_data = nil
|
105
|
-
else
|
106
|
-
raise(ArgumentError, "Not a token file: %s" % path)
|
107
|
-
end
|
108
|
-
else
|
109
|
-
token_data = nil
|
110
|
-
end
|
111
|
-
|
112
|
-
client = Google::APIClient.new(
|
113
|
-
:application_name => "google_drive Ruby library",
|
114
|
-
:application_version => "0.3.11"
|
115
|
-
)
|
116
|
-
auth = client.authorization
|
117
|
-
auth.client_id = client_id
|
118
|
-
auth.client_secret = client_secret
|
119
|
-
auth.scope =
|
120
|
-
"https://www.googleapis.com/auth/drive " +
|
121
|
-
"https://spreadsheets.google.com/feeds/ " +
|
122
|
-
"https://docs.google.com/feeds/ " +
|
123
|
-
"https://docs.googleusercontent.com/"
|
124
|
-
auth.redirect_uri = "urn:ietf:wg:oauth:2.0:oob"
|
125
|
-
|
126
|
-
if token_data
|
127
|
-
|
128
|
-
auth.refresh_token = token_data["refresh_token"]
|
129
|
-
auth.fetch_access_token!()
|
130
|
-
|
131
|
-
else
|
132
|
-
|
133
|
-
$stderr.print("\n1. Open this page:\n%s\n\n" % auth.authorization_uri)
|
134
|
-
$stderr.print("2. Enter the authorization code shown in the page: ")
|
135
|
-
auth.code = $stdin.gets().chomp()
|
136
|
-
auth.fetch_access_token!()
|
137
|
-
token_data = {"refresh_token" => auth.refresh_token}
|
138
|
-
open(path, "w", 0600) do |f|
|
139
|
-
f.puts(JSON.dump(token_data))
|
140
|
-
end
|
141
|
-
|
142
|
-
end
|
143
|
-
|
144
|
-
return GoogleDriveV0.login_with_oauth(auth.access_token)
|
145
|
-
|
146
|
-
end
|
147
|
-
|
148
|
-
end
|
data/lib/google_drive_v0/acl.rb
DELETED
@@ -1,115 +0,0 @@
|
|
1
|
-
# Author: Guy Boertje <https://github.com/guyboertje>
|
2
|
-
# Author: David R. Albrecht <https://github.com/eldavido>
|
3
|
-
# Author: Hiroshi Ichikawa <http://gimite.net/>
|
4
|
-
# The license of this source is "New BSD Licence"
|
5
|
-
|
6
|
-
require "google_drive_v0/acl_entry"
|
7
|
-
|
8
|
-
module GoogleDriveV0
|
9
|
-
|
10
|
-
# ACL (access control list) of a spreadsheet.
|
11
|
-
#
|
12
|
-
# Use GoogleDriveV0::Spreadsheet#acl to get GoogleDriveV0::Acl object.
|
13
|
-
# See GoogleDriveV0::Spreadsheet#acl for usage example.
|
14
|
-
#
|
15
|
-
# This code is based on https://github.com/guyboertje/gdata-spreadsheet-ruby .
|
16
|
-
class Acl
|
17
|
-
|
18
|
-
include(Util)
|
19
|
-
extend(Forwardable)
|
20
|
-
|
21
|
-
def initialize(session, acls_feed_url) #:nodoc:
|
22
|
-
@session = session
|
23
|
-
@acls_feed_url = acls_feed_url
|
24
|
-
header = {"GData-Version" => "3.0"}
|
25
|
-
doc = @session.request(:get, @acls_feed_url, :header => header, :auth => :writely)
|
26
|
-
@acls = doc.css("entry").map(){ |e| AclEntry.new(entry_to_params(e)) }
|
27
|
-
end
|
28
|
-
|
29
|
-
def_delegators(:@acls, :size, :[], :each)
|
30
|
-
|
31
|
-
# Adds a new entry. +entry+ is either a GoogleDriveV0::AclEntry or a Hash with keys
|
32
|
-
# :scope_type, :scope and :role. See GoogleDriveV0::AclEntry#scope_type and
|
33
|
-
# GoogleDriveV0::AclEntry#role for the document of the fields.
|
34
|
-
#
|
35
|
-
# NOTE: This sends email to the new people.
|
36
|
-
#
|
37
|
-
# e.g.
|
38
|
-
# # A specific user can read or write.
|
39
|
-
# spreadsheet.acl.push(
|
40
|
-
# {:scope_type => "user", :scope => "example2@gmail.com", :role => "reader"})
|
41
|
-
# spreadsheet.acl.push(
|
42
|
-
# {:scope_type => "user", :scope => "example3@gmail.com", :role => "writer"})
|
43
|
-
# # Publish on the Web.
|
44
|
-
# spreadsheet.acl.push(
|
45
|
-
# {:scope_type => "default", :role => "reader"})
|
46
|
-
# # Anyone who knows the link can read.
|
47
|
-
# spreadsheet.acl.push(
|
48
|
-
# {:scope_type => "default", :with_key => true, :role => "reader"})
|
49
|
-
def push(entry)
|
50
|
-
|
51
|
-
entry = AclEntry.new(entry) if entry.is_a?(Hash)
|
52
|
-
|
53
|
-
header = {"GData-Version" => "3.0", "Content-Type" => "application/atom+xml;charset=utf-8"}
|
54
|
-
doc = @session.request(
|
55
|
-
:post, @acls_feed_url, :data => entry.to_xml(), :header => header, :auth => :writely)
|
56
|
-
|
57
|
-
entry.params = entry_to_params(doc.root)
|
58
|
-
@acls.push(entry)
|
59
|
-
return entry
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
# Deletes an ACL entry.
|
64
|
-
#
|
65
|
-
# e.g.
|
66
|
-
# spreadsheet.acl.delete(spreadsheet.acl[1])
|
67
|
-
def delete(entry)
|
68
|
-
header = {"GData-Version" => "3.0"}
|
69
|
-
@session.request(:delete, entry.edit_url_internal, :header => header, :auth => :writely)
|
70
|
-
@acls.delete(entry)
|
71
|
-
end
|
72
|
-
|
73
|
-
def update_role(entry) #:nodoc:
|
74
|
-
|
75
|
-
header = {"GData-Version" => "3.0", "Content-Type" => "application/atom+xml;charset=utf-8"}
|
76
|
-
doc = @session.request(
|
77
|
-
:put, entry.edit_url_internal, :data => entry.to_xml(), :header => header, :auth => :writely)
|
78
|
-
|
79
|
-
entry.params = entry_to_params(doc.root)
|
80
|
-
return entry
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
def inspect
|
85
|
-
return "\#<%p %p>" % [self.class, @acls]
|
86
|
-
end
|
87
|
-
|
88
|
-
private
|
89
|
-
|
90
|
-
def entry_to_params(entry)
|
91
|
-
|
92
|
-
if !entry.css("gAcl|withKey").empty?
|
93
|
-
with_key = true
|
94
|
-
role = entry.css("gAcl|withKey gAcl|role")[0]["value"]
|
95
|
-
else
|
96
|
-
with_key = false
|
97
|
-
role = entry.css("gAcl|role")[0]["value"]
|
98
|
-
end
|
99
|
-
|
100
|
-
return {
|
101
|
-
:acl => self,
|
102
|
-
:scope_type => entry.css("gAcl|scope")[0]["type"],
|
103
|
-
:scope => entry.css("gAcl|scope")[0]["value"],
|
104
|
-
:with_key => with_key,
|
105
|
-
:role => role,
|
106
|
-
:title => entry.css("title").text,
|
107
|
-
:edit_url => entry.css("link[rel='edit']")[0]["href"],
|
108
|
-
:etag => entry["etag"],
|
109
|
-
}
|
110
|
-
|
111
|
-
end
|
112
|
-
|
113
|
-
end
|
114
|
-
|
115
|
-
end
|
@@ -1,100 +0,0 @@
|
|
1
|
-
# Author: Guy Boertje <https://github.com/guyboertje>
|
2
|
-
# Author: David R. Albrecht <https://github.com/eldavido>
|
3
|
-
# Author: Hiroshi Ichikawa <http://gimite.net/>
|
4
|
-
# Author: Phuogn Nguyen <https://github.com/phuongnd08>
|
5
|
-
# The license of this source is "New BSD Licence"
|
6
|
-
|
7
|
-
module GoogleDriveV0
|
8
|
-
|
9
|
-
# An entry of an ACL (access control list) of a spreadsheet.
|
10
|
-
#
|
11
|
-
# Use GoogleDriveV0::Acl#[] to get GoogleDriveV0::AclEntry object.
|
12
|
-
#
|
13
|
-
# This code is based on https://github.com/guyboertje/gdata-spreadsheet-ruby .
|
14
|
-
class AclEntry
|
15
|
-
|
16
|
-
include(Util)
|
17
|
-
|
18
|
-
PARAM_NAMES = [:acl, :scope_type, :scope, :with_key, :role, :title, :edit_url, :etag] #:nodoc:
|
19
|
-
|
20
|
-
# +params+ is a Hash object with keys +:scope_type+, +:scope+ and +:role+.
|
21
|
-
# See scope_type and role for the document of the fields.
|
22
|
-
def initialize(params)
|
23
|
-
@params = {:role => "reader"}
|
24
|
-
for name, value in params
|
25
|
-
if !name.is_a?(Symbol)
|
26
|
-
raise(ArgumentError, "Key must be Symbol, but is %p" % name)
|
27
|
-
elsif !PARAM_NAMES.include?(name)
|
28
|
-
raise(ArgumentError, "Invalid key: %p" % name)
|
29
|
-
end
|
30
|
-
@params[name] = value
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
attr_accessor(:params) #:nodoc:
|
35
|
-
|
36
|
-
PARAM_NAMES.each() do |name|
|
37
|
-
define_method(name) do
|
38
|
-
return @params[name]
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def edit_url
|
43
|
-
warn(
|
44
|
-
"WARNING: GoogleDriveV0::AclEntry\#edit_url is deprecated and will be removed in the next version.")
|
45
|
-
return self.edit_url_internal
|
46
|
-
end
|
47
|
-
|
48
|
-
def edit_url_internal #:nodoc:
|
49
|
-
return @params[:edit_url]
|
50
|
-
end
|
51
|
-
|
52
|
-
# Changes the role of the scope.
|
53
|
-
#
|
54
|
-
# e.g.
|
55
|
-
# spreadsheet.acl[1].role = "writer"
|
56
|
-
def role=(role)
|
57
|
-
@params[:role] = role
|
58
|
-
@params[:acl].update_role(self)
|
59
|
-
end
|
60
|
-
|
61
|
-
def inspect
|
62
|
-
return "\#<%p scope_type=%p, scope=%p, with_key=%p, role=%p>" %
|
63
|
-
[self.class, @params[:scope_type], @params[:scope], @params[:with_key], @params[:role]]
|
64
|
-
end
|
65
|
-
|
66
|
-
def to_xml() #:nodoc:
|
67
|
-
|
68
|
-
etag_attr = self.etag ? "gd:etag='#{h(self.etag)}'" : ""
|
69
|
-
value_attr = self.scope ? "value='#{h(self.scope)}'" : ""
|
70
|
-
if self.with_key
|
71
|
-
role_tag = <<-EOS
|
72
|
-
<gAcl:withKey key='[ACL KEY]'>
|
73
|
-
<gAcl:role value='#{h(self.role)}'/>
|
74
|
-
</gAcl:withKey>
|
75
|
-
EOS
|
76
|
-
else
|
77
|
-
role_tag = <<-EOS
|
78
|
-
<gAcl:role value='#{h(self.role)}'/>
|
79
|
-
EOS
|
80
|
-
end
|
81
|
-
|
82
|
-
return <<-EOS
|
83
|
-
<entry
|
84
|
-
xmlns='http://www.w3.org/2005/Atom'
|
85
|
-
xmlns:gAcl='http://schemas.google.com/acl/2007'
|
86
|
-
xmlns:gd='http://schemas.google.com/g/2005'
|
87
|
-
#{etag_attr}>
|
88
|
-
<category scheme='http://schemas.google.com/g/2005#kind'
|
89
|
-
term='http://schemas.google.com/acl/2007#accessRule'/>
|
90
|
-
#{role_tag}
|
91
|
-
<gAcl:scope type='#{h(self.scope_type)}' #{value_attr}/>
|
92
|
-
</entry>
|
93
|
-
EOS
|
94
|
-
|
95
|
-
end
|
96
|
-
|
97
|
-
end
|
98
|
-
|
99
|
-
end
|
100
|
-
|
@@ -1,47 +0,0 @@
|
|
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 GoogleDriveV0
|
10
|
-
|
11
|
-
class ApiClientFetcher
|
12
|
-
|
13
|
-
class Response
|
14
|
-
|
15
|
-
def initialize(client_response)
|
16
|
-
@client_response = client_response
|
17
|
-
end
|
18
|
-
|
19
|
-
def code
|
20
|
-
return @client_response.status.to_s()
|
21
|
-
end
|
22
|
-
|
23
|
-
def body
|
24
|
-
return @client_response.body
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
def initialize(client)
|
30
|
-
@client = client
|
31
|
-
end
|
32
|
-
|
33
|
-
attr_reader(:client)
|
34
|
-
|
35
|
-
def request_raw(method, url, data, extra_header, auth)
|
36
|
-
p [method, url, data, extra_header, auth]
|
37
|
-
client_response = @client.execute(
|
38
|
-
:http_method => method,
|
39
|
-
:uri => url,
|
40
|
-
:body => data,
|
41
|
-
:headers => extra_header)
|
42
|
-
return Response.new(client_response)
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
# Author: Hiroshi Ichikawa <http://gimite.net/>
|
2
|
-
# The license of this source is "New BSD Licence"
|
3
|
-
|
4
|
-
require "google_drive_v0/error"
|
5
|
-
|
6
|
-
|
7
|
-
module GoogleDriveV0
|
8
|
-
|
9
|
-
# Raised when GoogleDriveV0.login has failed.
|
10
|
-
class AuthenticationError < GoogleDriveV0::Error
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
@@ -1,50 +0,0 @@
|
|
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 GoogleDriveV0
|
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
|
-
# No timeout. It can take long e.g., when it tries to fetch a large file.
|
30
|
-
http.read_timeout = nil
|
31
|
-
http.start() do
|
32
|
-
path = uri.path + (uri.query ? "?#{uri.query}" : "")
|
33
|
-
header = auth_header(auth).merge(extra_header)
|
34
|
-
if method == :delete || method == :get
|
35
|
-
return http.__send__(method, path, header)
|
36
|
-
else
|
37
|
-
return http.__send__(method, path, data, header)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
def auth_header(auth)
|
45
|
-
return {}
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|