google_drive2 3.0.8
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 +7 -0
- data/README.md +136 -0
- data/lib/google_drive/access_token_credentials.rb +19 -0
- data/lib/google_drive/acl.rb +111 -0
- data/lib/google_drive/acl_entry.rb +181 -0
- data/lib/google_drive/api_client_fetcher.rb +59 -0
- data/lib/google_drive/authentication_error.rb +10 -0
- data/lib/google_drive/collection.rb +207 -0
- data/lib/google_drive/config.rb +36 -0
- data/lib/google_drive/error.rb +8 -0
- data/lib/google_drive/file.rb +266 -0
- data/lib/google_drive/list.rb +125 -0
- data/lib/google_drive/list_row.rb +89 -0
- data/lib/google_drive/response_code_error.rb +23 -0
- data/lib/google_drive/session.rb +733 -0
- data/lib/google_drive/spreadsheet.rb +135 -0
- data/lib/google_drive/util.rb +243 -0
- data/lib/google_drive/worksheet.rb +770 -0
- data/lib/google_drive.rb +35 -0
- metadata +196 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4abb83f41fbf856832cb27e8fbdb51f11ef889111f1270486b71f26a0621fb05
|
4
|
+
data.tar.gz: 6143e95fd466821eae41bb017b8e119cd901fe7992de05470fab4ddd871f3ab9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2dcc26743a2a00658af5b8d38c9172e09af0b63c1ddbc8c32171f52f5a0f85438dc08961234365f3529d2ca92ec0a3cbbbd7b763e0e331cd8b787d51db85a64a
|
7
|
+
data.tar.gz: 1f7e58c9bde943005f1c4b4c9a7da9589dadeeeab533f85f25253ea041a65e799ee2350c35290e0750ce9d738e9163a664865d589ea3625daddbf4c5b4fb476e
|
data/README.md
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
# google-drive-ruby [](https://travis-ci.org/gimite/google-drive-ruby)
|
2
|
+
|
3
|
+
This is a Ruby library to read/write files/spreadsheets in Google Drive/Docs.
|
4
|
+
|
5
|
+
NOTE: This is NOT a library to create Google Drive App.
|
6
|
+
|
7
|
+
|
8
|
+
* [Migration from ver. 2.x.x or before](#migration)
|
9
|
+
* [How to install](#install)
|
10
|
+
* [How to use](#use)
|
11
|
+
* [API documentation](http://www.rubydoc.info/gems/google_drive)
|
12
|
+
* [Authorization](https://github.com/gimite/google-drive-ruby/blob/master/doc/authorization.md)
|
13
|
+
* [Github](http://github.com/gimite/google-drive-ruby)
|
14
|
+
* [License](#license)
|
15
|
+
* [Supported environments](#environments)
|
16
|
+
* [Author](#author)
|
17
|
+
|
18
|
+
|
19
|
+
## <a name="migration">Migration from ver. 2.x.x or before</a>
|
20
|
+
|
21
|
+
There are some incompatible API changes. See
|
22
|
+
[MIGRATING.md](https://github.com/gimite/google-drive-ruby/blob/master/MIGRATING.md).
|
23
|
+
|
24
|
+
|
25
|
+
## <a name="install">How to install</a>
|
26
|
+
|
27
|
+
Add this line to your application's Gemfile:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
gem 'google_drive'
|
31
|
+
```
|
32
|
+
|
33
|
+
And then execute:
|
34
|
+
|
35
|
+
```
|
36
|
+
$ bundle
|
37
|
+
```
|
38
|
+
|
39
|
+
Or install it yourself as:
|
40
|
+
|
41
|
+
```
|
42
|
+
$ gem install google_drive
|
43
|
+
```
|
44
|
+
|
45
|
+
If you need system wide installation, execute below:
|
46
|
+
|
47
|
+
```
|
48
|
+
$ sudo gem install google_drive
|
49
|
+
```
|
50
|
+
|
51
|
+
## <a name="use">How to use</a>
|
52
|
+
|
53
|
+
### Authorization
|
54
|
+
|
55
|
+
Follow one of the options in [Authorization](https://github.com/gimite/google-drive-ruby/blob/master/doc/authorization.md) to construct a session object. The example code below assumes "On behalf of you" option.
|
56
|
+
|
57
|
+
### Example to read/write files in Google Drive
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
require "google_drive"
|
61
|
+
|
62
|
+
# Creates a session. This will prompt the credential via command line for the
|
63
|
+
# first time and save it to config.json file for later usages.
|
64
|
+
# See this document to learn how to create config.json:
|
65
|
+
# https://github.com/gimite/google-drive-ruby/blob/master/doc/authorization.md
|
66
|
+
session = GoogleDrive::Session.from_config("config.json")
|
67
|
+
|
68
|
+
# Gets list of remote files.
|
69
|
+
session.files.each do |file|
|
70
|
+
p file.title
|
71
|
+
end
|
72
|
+
|
73
|
+
# Uploads a local file.
|
74
|
+
session.upload_from_file("/path/to/hello.txt", "hello.txt", convert: false)
|
75
|
+
|
76
|
+
# Downloads to a local file.
|
77
|
+
file = session.file_by_title("hello.txt")
|
78
|
+
file.download_to_file("/path/to/hello.txt")
|
79
|
+
|
80
|
+
# Updates content of the remote file.
|
81
|
+
file.update_from_file("/path/to/hello.txt")
|
82
|
+
```
|
83
|
+
|
84
|
+
### Example to read/write spreadsheets
|
85
|
+
|
86
|
+
```ruby
|
87
|
+
require "google_drive"
|
88
|
+
|
89
|
+
# Creates a session. This will prompt the credential via command line for the
|
90
|
+
# first time and save it to config.json file for later usages.
|
91
|
+
# See this document to learn how to create config.json:
|
92
|
+
# https://github.com/gimite/google-drive-ruby/blob/master/doc/authorization.md
|
93
|
+
session = GoogleDrive::Session.from_config("config.json")
|
94
|
+
|
95
|
+
# First worksheet of
|
96
|
+
# https://docs.google.com/spreadsheet/ccc?key=pz7XtlQC-PYx-jrVMJErTcg
|
97
|
+
# Or https://docs.google.com/a/someone.com/spreadsheets/d/pz7XtlQC-PYx-jrVMJErTcg/edit?usp=drive_web
|
98
|
+
ws = session.spreadsheet_by_key("pz7XtlQC-PYx-jrVMJErTcg").worksheets[0]
|
99
|
+
|
100
|
+
# Gets content of A2 cell.
|
101
|
+
p ws[2, 1] #==> "hoge"
|
102
|
+
|
103
|
+
# Changes content of cells.
|
104
|
+
# Changes are not sent to the server until you call ws.save().
|
105
|
+
ws[2, 1] = "foo"
|
106
|
+
ws[2, 2] = "bar"
|
107
|
+
ws.save
|
108
|
+
|
109
|
+
# Dumps all cells.
|
110
|
+
(1..ws.num_rows).each do |row|
|
111
|
+
(1..ws.num_cols).each do |col|
|
112
|
+
p ws[row, col]
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# Yet another way to do so.
|
117
|
+
p ws.rows #==> [["fuga", ""], ["foo", "bar]]
|
118
|
+
|
119
|
+
# Reloads the worksheet to get changes by other clients.
|
120
|
+
ws.reload
|
121
|
+
```
|
122
|
+
|
123
|
+
|
124
|
+
## <a name="license">License</a>
|
125
|
+
|
126
|
+
New BSD Licence.
|
127
|
+
|
128
|
+
|
129
|
+
## <a name="environments">Supported environments</a>
|
130
|
+
|
131
|
+
Ruby 2.0.0 or later. Checked with Ruby 2.4.1.
|
132
|
+
|
133
|
+
|
134
|
+
## <a name="author">Author</a>
|
135
|
+
|
136
|
+
[Hiroshi Ichikawa](http://gimite.net/en/index.php?Contact)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module GoogleDrive
|
2
|
+
# A simple credentials class using an existing OAuth2 access_token.
|
3
|
+
#
|
4
|
+
# Based on:
|
5
|
+
# https://github.com/google/google-api-ruby-client/issues/296
|
6
|
+
#
|
7
|
+
# @api private
|
8
|
+
class AccessTokenCredentials
|
9
|
+
attr_reader :access_token
|
10
|
+
|
11
|
+
def initialize(access_token)
|
12
|
+
@access_token = access_token
|
13
|
+
end
|
14
|
+
|
15
|
+
def apply!(headers)
|
16
|
+
headers['Authorization'] = "Bearer #{@access_token}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,111 @@
|
|
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/acl_entry'
|
7
|
+
|
8
|
+
module GoogleDrive
|
9
|
+
# ACL (access control list) of a spreadsheet.
|
10
|
+
#
|
11
|
+
# Use GoogleDrive::Spreadsheet#acl to get GoogleDrive::Acl object.
|
12
|
+
# See GoogleDrive::Spreadsheet#acl for usage example.
|
13
|
+
#
|
14
|
+
# This code is based on https://github.com/guyboertje/gdata-spreadsheet-ruby .
|
15
|
+
class Acl
|
16
|
+
include(Util)
|
17
|
+
include(Enumerable)
|
18
|
+
extend(Forwardable)
|
19
|
+
|
20
|
+
# @api private
|
21
|
+
def initialize(session, file)
|
22
|
+
@session = session
|
23
|
+
@file = file
|
24
|
+
api_permissions = @session.drive_service.list_permissions(
|
25
|
+
@file.id, fields: '*', supports_all_drives: true
|
26
|
+
)
|
27
|
+
@entries =
|
28
|
+
api_permissions.permissions.map { |perm| AclEntry.new(perm, self) }
|
29
|
+
end
|
30
|
+
|
31
|
+
def_delegators(:@entries, :size, :[], :each)
|
32
|
+
|
33
|
+
# Adds a new entry. +entry+ is either a GoogleDrive::AclEntry or a Hash with
|
34
|
+
# keys +:type+, +:email_address+, +:domain+, +:role+ and
|
35
|
+
# +:allow_file_discovery+. See GoogleDrive::AclEntry#type and
|
36
|
+
# GoogleDrive::AclEntry#role for the document of the fields.
|
37
|
+
#
|
38
|
+
# Also you can pass the second hash argument +options+, which specifies
|
39
|
+
# optional query parameters for the API.
|
40
|
+
# Possible keys of +options+ are,
|
41
|
+
# * :email_message -- A custom message to include in notification emails
|
42
|
+
# * :send_notification_email -- Whether to send notification emails
|
43
|
+
# when sharing to users or groups. (Default: true)
|
44
|
+
# * :transfer_ownership -- Whether to transfer ownership to the specified
|
45
|
+
# user and downgrade the current owner to a writer. This parameter is
|
46
|
+
# required as an acknowledgement of the side effect. (Default: false)
|
47
|
+
#
|
48
|
+
# e.g.
|
49
|
+
# # A specific user can read or write.
|
50
|
+
# spreadsheet.acl.push(
|
51
|
+
# {type: "user", email_address: "example2@gmail.com", role: "reader"})
|
52
|
+
# spreadsheet.acl.push(
|
53
|
+
# {type: "user", email_address: "example3@gmail.com", role: "writer"})
|
54
|
+
# # Share with a Google Apps domain.
|
55
|
+
# spreadsheet.acl.push(
|
56
|
+
# {type: "domain", domain: "gimite.net", role: "reader"})
|
57
|
+
# # Publish on the Web.
|
58
|
+
# spreadsheet.acl.push(
|
59
|
+
# {type: "anyone", role: "reader"})
|
60
|
+
# # Anyone who knows the link can read.
|
61
|
+
# spreadsheet.acl.push(
|
62
|
+
# {type: "anyone", allow_file_discovery: false, role: "reader"})
|
63
|
+
# # Set ACL without sending notification emails
|
64
|
+
# spreadsheet.acl.push(
|
65
|
+
# {type: "user", email_address: "example2@gmail.com", role: "reader"},
|
66
|
+
# {send_notification_email: false})
|
67
|
+
#
|
68
|
+
# See here for parameter detais:
|
69
|
+
# https://developers.google.com/drive/v3/reference/permissions/create
|
70
|
+
def push(params_or_entry, options = {})
|
71
|
+
entry = params_or_entry.is_a?(AclEntry) ?
|
72
|
+
params_or_entry : AclEntry.new(params_or_entry)
|
73
|
+
api_permission = @session.drive_service.create_permission(
|
74
|
+
@file.id,
|
75
|
+
entry.params,
|
76
|
+
**{ fields: '*', supports_all_drives: true }.merge(options)
|
77
|
+
)
|
78
|
+
new_entry = AclEntry.new(api_permission, self)
|
79
|
+
@entries.push(new_entry)
|
80
|
+
new_entry
|
81
|
+
end
|
82
|
+
|
83
|
+
# Deletes an ACL entry.
|
84
|
+
#
|
85
|
+
# e.g.
|
86
|
+
# spreadsheet.acl.delete(spreadsheet.acl[1])
|
87
|
+
def delete(entry)
|
88
|
+
@session.drive_service.delete_permission(
|
89
|
+
@file.id, entry.id, supports_all_drives: true
|
90
|
+
)
|
91
|
+
@entries.delete(entry)
|
92
|
+
end
|
93
|
+
|
94
|
+
# @api private
|
95
|
+
def update_role(entry)
|
96
|
+
api_permission = @session.drive_service.update_permission(
|
97
|
+
@file.id,
|
98
|
+
entry.id,
|
99
|
+
{ role: entry.role },
|
100
|
+
fields: '*',
|
101
|
+
supports_all_drives: true
|
102
|
+
)
|
103
|
+
entry.api_permission = api_permission
|
104
|
+
entry
|
105
|
+
end
|
106
|
+
|
107
|
+
def inspect
|
108
|
+
format("\#<%p %p>", self.class, @entries)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,181 @@
|
|
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 GoogleDrive
|
8
|
+
# An entry of an ACL (access control list) of a spreadsheet.
|
9
|
+
#
|
10
|
+
# Use GoogleDrive::Acl#[] to get GoogleDrive::AclEntry object.
|
11
|
+
#
|
12
|
+
# This code is based on https://github.com/guyboertje/gdata-spreadsheet-ruby .
|
13
|
+
class AclEntry
|
14
|
+
include(Util)
|
15
|
+
|
16
|
+
# +params_or_api_permission+ is a Hash object with keys
|
17
|
+
# +:type+, +:email_address+, +:domain+, +:role+ and +:allow_file_discovery+.
|
18
|
+
# See GoogleDrive::Acl#push for description of the parameters.
|
19
|
+
def initialize(params_or_api_permission, acl = nil)
|
20
|
+
@acl = acl
|
21
|
+
if acl
|
22
|
+
@api_permission = params_or_api_permission
|
23
|
+
@params = nil
|
24
|
+
delegate_api_methods(self, @api_permission)
|
25
|
+
else
|
26
|
+
@api_permission = nil
|
27
|
+
@params = convert_params(params_or_api_permission)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
attr_reader(:acl)
|
32
|
+
|
33
|
+
# @api private
|
34
|
+
attr_reader(:params)
|
35
|
+
|
36
|
+
# @api private
|
37
|
+
attr_accessor(:api_permission)
|
38
|
+
|
39
|
+
# The role given to the scope. One of:
|
40
|
+
# - "owner": The owner.
|
41
|
+
# - "writer": With read/write access.
|
42
|
+
# - "reader": With read-only access.
|
43
|
+
def role
|
44
|
+
@params ? @params[:role] : @api_permission.role
|
45
|
+
end
|
46
|
+
|
47
|
+
# Type of the scope. One of:
|
48
|
+
#
|
49
|
+
# - "user": a Google account specified by the email_address field.
|
50
|
+
# - "group": a Google Group specified by the email_address field.
|
51
|
+
# - "domain": a Google Apps domain specified by the domain field.
|
52
|
+
# - "anyone": Publicly shared with all users.
|
53
|
+
def type
|
54
|
+
@params ? @params[:type] : @api_permission.type
|
55
|
+
end
|
56
|
+
|
57
|
+
alias scope_type type
|
58
|
+
|
59
|
+
def additional_roles
|
60
|
+
@params ? @params[:additionalRoles] : @api_permission.additional_roles
|
61
|
+
end
|
62
|
+
|
63
|
+
def id
|
64
|
+
@params ? @params[:id] : @api_permission.id
|
65
|
+
end
|
66
|
+
|
67
|
+
# Email address of the user or the group.
|
68
|
+
def email_address
|
69
|
+
@params ? @params[:email_address] : @api_permission.email_address
|
70
|
+
end
|
71
|
+
|
72
|
+
# The Google Apps domain name.
|
73
|
+
def domain
|
74
|
+
@params ? @params[:domain] : @api_permission.domain
|
75
|
+
end
|
76
|
+
|
77
|
+
def value
|
78
|
+
if @params
|
79
|
+
case @params[:type]
|
80
|
+
when 'user', 'group'
|
81
|
+
@params[:email_address]
|
82
|
+
when 'domain'
|
83
|
+
@params[:domain]
|
84
|
+
end
|
85
|
+
else
|
86
|
+
case @api_permission.type
|
87
|
+
when 'user', 'group'
|
88
|
+
@api_permission.email_address
|
89
|
+
when 'domain'
|
90
|
+
@api_permission.domain
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
alias scope value
|
96
|
+
|
97
|
+
# If +false+, the file is shared only with people who know the link.
|
98
|
+
# Only used for type "anyone".
|
99
|
+
def allow_file_discovery
|
100
|
+
@params ?
|
101
|
+
@params[:allow_file_discovery] : @api_permission.allow_file_discovery
|
102
|
+
end
|
103
|
+
|
104
|
+
# If +true+, the file is shared only with people who know the link.
|
105
|
+
# Only used for type "anyone".
|
106
|
+
def with_link
|
107
|
+
allow_file_discovery == false
|
108
|
+
end
|
109
|
+
|
110
|
+
alias with_key with_link
|
111
|
+
|
112
|
+
# Changes the role of the scope.
|
113
|
+
#
|
114
|
+
# e.g.
|
115
|
+
# spreadsheet.acl[1].role = "writer"
|
116
|
+
def role=(role)
|
117
|
+
if @params
|
118
|
+
@params[:role] = role
|
119
|
+
else
|
120
|
+
@api_permission.role = role
|
121
|
+
@acl.update_role(self)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def inspect
|
126
|
+
case type
|
127
|
+
when 'user', 'group'
|
128
|
+
format(
|
129
|
+
"\#<%p type=%p, email_address=%p, role=%p>",
|
130
|
+
self.class, type, email_address, role
|
131
|
+
)
|
132
|
+
when 'domain'
|
133
|
+
format(
|
134
|
+
"\#<%p type=%p, domain=%p, role=%p>",
|
135
|
+
self.class, type, domain, role
|
136
|
+
)
|
137
|
+
when 'anyone'
|
138
|
+
format(
|
139
|
+
"\#<%p type=%p, role=%p, allow_file_discovery=%p>",
|
140
|
+
self.class, type, role, allow_file_discovery
|
141
|
+
)
|
142
|
+
else
|
143
|
+
format("\#<%p type=%p, role=%p>", self.class, type, role)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
private
|
148
|
+
|
149
|
+
# Normalizes the key to Symbol, and converts parameters in the old version.
|
150
|
+
def convert_params(orig_params)
|
151
|
+
new_params = {}
|
152
|
+
value = nil
|
153
|
+
orig_params.each do |k, v|
|
154
|
+
k = k.to_s
|
155
|
+
case k
|
156
|
+
when 'scope_type'
|
157
|
+
new_params[:type] = (v == 'default' ? 'anyone' : v)
|
158
|
+
when 'scope'
|
159
|
+
new_params[:value] = v
|
160
|
+
when 'with_key', 'withLink'
|
161
|
+
new_params[:allow_file_discovery] = !v
|
162
|
+
when 'value'
|
163
|
+
value = v
|
164
|
+
else
|
165
|
+
new_params[k.intern] = v
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
if value
|
170
|
+
case new_params[:type]
|
171
|
+
when 'user', 'group'
|
172
|
+
new_params[:email_address] = value
|
173
|
+
when 'domain'
|
174
|
+
new_params[:domain] = value
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
new_params
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
@@ -0,0 +1,59 @@
|
|
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
|
+
require 'google/apis/drive_v3'
|
7
|
+
require 'google/apis/sheets_v4'
|
8
|
+
Net::HTTP.version_1_2
|
9
|
+
|
10
|
+
module GoogleDrive
|
11
|
+
class ApiClientFetcher
|
12
|
+
class Response
|
13
|
+
def initialize(code, body)
|
14
|
+
@code = code
|
15
|
+
@body = body
|
16
|
+
end
|
17
|
+
|
18
|
+
attr_reader(:code, :body)
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(authorization, client_options, request_options)
|
22
|
+
@drive = Google::Apis::DriveV3::DriveService.new
|
23
|
+
@sheets = Google::Apis::SheetsV4::SheetsService.new
|
24
|
+
|
25
|
+
[@drive, @sheets].each do |service|
|
26
|
+
service.authorization = authorization
|
27
|
+
|
28
|
+
# Make the timeout virtually infinite because some of the operations
|
29
|
+
# (e.g., uploading a large file) can take very long.
|
30
|
+
# This value is the maximal allowed timeout in seconds on JRuby.
|
31
|
+
t = (2**31 - 1) / 1000
|
32
|
+
service.client_options.open_timeout_sec = t
|
33
|
+
service.client_options.read_timeout_sec = t
|
34
|
+
service.client_options.send_timeout_sec = t
|
35
|
+
|
36
|
+
if client_options
|
37
|
+
service.client_options.members.each do |name|
|
38
|
+
if !client_options[name].nil?
|
39
|
+
service.client_options[name] = client_options[name]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
if request_options
|
45
|
+
service.request_options = service.request_options.merge(request_options)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
attr_reader(:drive)
|
51
|
+
attr_reader(:sheets)
|
52
|
+
|
53
|
+
def request_raw(method, url, data, extra_header, _auth)
|
54
|
+
options = @drive.request_options.merge(header: extra_header)
|
55
|
+
body = @drive.http(method, url, body: data, options: options)
|
56
|
+
Response.new('200', body)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# Author: Hiroshi Ichikawa <http://gimite.net/>
|
2
|
+
# The license of this source is "New BSD Licence"
|
3
|
+
|
4
|
+
require 'google_drive/response_code_error'
|
5
|
+
|
6
|
+
module GoogleDrive
|
7
|
+
# Raised when GoogleDrive.login has failed.
|
8
|
+
class AuthenticationError < GoogleDrive::ResponseCodeError
|
9
|
+
end
|
10
|
+
end
|