google_drive 1.0.4 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|