google_drive 1.0.6 → 2.0.0.pre1
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 +4 -4
- data/README.rdoc +3 -7
- data/doc_src/google_drive/acl.rb +13 -17
- data/lib/google_drive.rb +130 -160
- data/lib/google_drive/acl.rb +77 -93
- data/lib/google_drive/acl_entry.rb +149 -105
- data/lib/google_drive/api_client_fetcher.rb +22 -41
- data/lib/google_drive/authentication_error.rb +4 -8
- data/lib/google_drive/collection.rb +127 -149
- data/lib/google_drive/config.rb +23 -25
- data/lib/google_drive/error.rb +3 -3
- data/lib/google_drive/file.rb +215 -273
- data/lib/google_drive/list.rb +108 -113
- data/lib/google_drive/list_row.rb +65 -70
- data/lib/google_drive/response_code_error.rb +11 -16
- data/lib/google_drive/session.rb +412 -444
- data/lib/google_drive/spreadsheet.rb +62 -67
- data/lib/google_drive/util.rb +200 -160
- data/lib/google_drive/worksheet.rb +453 -469
- metadata +60 -22
@@ -5,127 +5,171 @@
|
|
5
5
|
# The license of this source is "New BSD Licence"
|
6
6
|
|
7
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
|
8
30
|
|
9
|
-
|
10
|
-
|
11
|
-
|
31
|
+
attr_reader(:acl)
|
32
|
+
attr_reader(:params) #:nodoc:
|
33
|
+
attr_accessor(:api_permission) #:nodoc:
|
34
|
+
|
35
|
+
# The role given to the scope. One of:
|
36
|
+
# - "owner": The owner.
|
37
|
+
# - "writer": With read/write access.
|
38
|
+
# - "reader": With read-only access.
|
39
|
+
def role
|
40
|
+
@params ? @params[:role] : @api_permission.role
|
41
|
+
end
|
42
|
+
|
43
|
+
# Type of the scope. One of:
|
12
44
|
#
|
13
|
-
#
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
def initialize(params_or_api_permission, acl = nil)
|
21
|
-
@acl = acl
|
22
|
-
if acl
|
23
|
-
@api_permission = params_or_api_permission
|
24
|
-
@params = nil
|
25
|
-
delegate_api_methods(self, @api_permission, ["value"])
|
26
|
-
else
|
27
|
-
@api_permission = nil
|
28
|
-
@params = convert_params(params_or_api_permission)
|
29
|
-
end
|
30
|
-
end
|
45
|
+
# - "user": a Google account specified by the email_address field.
|
46
|
+
# - "group": a Google Group specified by the email_address field.
|
47
|
+
# - "domain": a Google Apps domain specified by the domain field.
|
48
|
+
# - "anyone": Publicly shared with all users.
|
49
|
+
def type
|
50
|
+
@params ? @params[:type] : @api_permission.type
|
51
|
+
end
|
31
52
|
|
32
|
-
|
33
|
-
attr_reader(:params) #:nodoc:
|
34
|
-
attr_accessor(:api_permission) #:nodoc:
|
53
|
+
alias_method :scope_type, :type
|
35
54
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
# - "reader": With read-only access.
|
40
|
-
def role
|
41
|
-
return @params ? @params["role"] : @api_permission.role
|
42
|
-
end
|
55
|
+
def additional_roles
|
56
|
+
@params ? @params[:additionalRoles] : @api_permission.additional_roles
|
57
|
+
end
|
43
58
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
# - "group": value is a Google Group email address.
|
48
|
-
# - "domain": value is a Google Apps domain.
|
49
|
-
# - "anyone": Publicly shared with all users. value is +nil+.
|
50
|
-
def type
|
51
|
-
return @params ? @params["type"] : @api_permission.type
|
52
|
-
end
|
59
|
+
def id
|
60
|
+
@params ? @params[:id] : @api_permission.id
|
61
|
+
end
|
53
62
|
|
54
|
-
|
63
|
+
# Email address of the user or the group.
|
64
|
+
def email_address
|
65
|
+
@params ? @params[:email_address] : @api_permission.email_address
|
66
|
+
end
|
55
67
|
|
56
|
-
|
57
|
-
|
58
|
-
|
68
|
+
# The Google Apps domain name.
|
69
|
+
def domain
|
70
|
+
@params ? @params[:domain] : @api_permission.domain
|
71
|
+
end
|
59
72
|
|
60
|
-
|
61
|
-
|
73
|
+
def value
|
74
|
+
if @params
|
75
|
+
case @params[:type]
|
76
|
+
when 'user', 'group'
|
77
|
+
@params[:email_address]
|
78
|
+
when 'domain'
|
79
|
+
@params[:domain]
|
80
|
+
else
|
81
|
+
nil
|
62
82
|
end
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
return @api_permission.email_address
|
72
|
-
when "domain"
|
73
|
-
return @api_permission.domain
|
74
|
-
else
|
75
|
-
return nil
|
76
|
-
end
|
77
|
-
end
|
83
|
+
else
|
84
|
+
case @api_permission.type
|
85
|
+
when 'user', 'group'
|
86
|
+
@api_permission.email_address
|
87
|
+
when 'domain'
|
88
|
+
@api_permission.domain
|
89
|
+
else
|
90
|
+
nil
|
78
91
|
end
|
92
|
+
end
|
93
|
+
end
|
79
94
|
|
80
|
-
|
95
|
+
alias_method :scope, :value
|
81
96
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
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 ? @params[:allow_file_discovery] : @api_permission.allow_file_discovery
|
101
|
+
end
|
86
102
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
# spreadsheet.acl[1].role = "writer"
|
93
|
-
def role=(role)
|
94
|
-
if @params
|
95
|
-
@params["role"] = role
|
96
|
-
else
|
97
|
-
@api_permission.role = role
|
98
|
-
@acl.update_role(self)
|
99
|
-
end
|
100
|
-
end
|
103
|
+
# If +true+, the file is shared only with people who know the link.
|
104
|
+
# Only used for type "anyone".
|
105
|
+
def with_link
|
106
|
+
allow_file_discovery == false
|
107
|
+
end
|
101
108
|
|
102
|
-
|
103
|
-
return "\#<%p type=%p, name=%p, role=%p>" %
|
104
|
-
[self.class, self.type, self.name, self.role]
|
105
|
-
end
|
109
|
+
alias_method :with_key, :with_link
|
106
110
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
when "with_key"
|
120
|
-
new_params["withLink"] = v
|
121
|
-
else
|
122
|
-
new_params[k] = v
|
123
|
-
end
|
124
|
-
end
|
125
|
-
return new_params
|
126
|
-
end
|
111
|
+
# Changes the role of the scope.
|
112
|
+
#
|
113
|
+
# e.g.
|
114
|
+
# spreadsheet.acl[1].role = "writer"
|
115
|
+
def role=(role)
|
116
|
+
if @params
|
117
|
+
@params[:role] = role
|
118
|
+
else
|
119
|
+
@api_permission.role = role
|
120
|
+
@acl.update_role(self)
|
121
|
+
end
|
122
|
+
end
|
127
123
|
|
124
|
+
def inspect
|
125
|
+
case type
|
126
|
+
when 'user', 'group'
|
127
|
+
"\#<%p type=%p, email_address=%p, role=%p>" %
|
128
|
+
[self.class, type, email_address, role]
|
129
|
+
when 'domain'
|
130
|
+
"\#<%p type=%p, domain=%p, role=%p>" %
|
131
|
+
[self.class, type, domain, role]
|
132
|
+
when 'anyone'
|
133
|
+
"\#<%p type=%p, role=%p, allow_file_discovery=%p>" %
|
134
|
+
[self.class, type, role, allow_file_discovery]
|
135
|
+
else
|
136
|
+
"\#<%p type=%p, role=%p>" %
|
137
|
+
[self.class, type, role]
|
138
|
+
end
|
128
139
|
end
|
129
140
|
|
130
|
-
|
141
|
+
private
|
142
|
+
|
143
|
+
# Normalizes the key to Symbol, and converts parameters in the old version.
|
144
|
+
def convert_params(orig_params)
|
145
|
+
new_params = {}
|
146
|
+
value = nil
|
147
|
+
orig_params.each do |k, v|
|
148
|
+
k = k.to_s
|
149
|
+
case k
|
150
|
+
when 'scope_type'
|
151
|
+
new_params[:type] = (v == 'default' ? 'anyone' : v)
|
152
|
+
when 'scope'
|
153
|
+
new_params[:value] = v
|
154
|
+
when 'with_key', 'withLink'
|
155
|
+
new_params[:allow_file_discovery] = !v
|
156
|
+
when 'value'
|
157
|
+
value = v
|
158
|
+
else
|
159
|
+
new_params[k.intern] = v
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
if value
|
164
|
+
case new_params[:type]
|
165
|
+
when 'user', 'group'
|
166
|
+
new_params[:email_address] = value
|
167
|
+
when 'domain'
|
168
|
+
new_params[:domain] = value
|
169
|
+
end
|
170
|
+
end
|
131
171
|
|
172
|
+
new_params
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
@@ -1,52 +1,33 @@
|
|
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
|
4
|
+
require 'net/https'
|
5
|
+
require 'uri'
|
6
|
+
require 'google/apis/drive_v3'
|
6
7
|
Net::HTTP.version_1_2
|
7
8
|
|
8
|
-
|
9
9
|
module GoogleDrive
|
10
|
+
class ApiClientFetcher
|
11
|
+
class Response
|
12
|
+
def initialize(code, body)
|
13
|
+
@code = code
|
14
|
+
@body = body
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader(:code, :body)
|
18
|
+
end
|
10
19
|
|
11
|
-
|
12
|
-
|
13
|
-
|
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
|
-
attr_reader(:client_response)
|
28
|
-
|
29
|
-
end
|
20
|
+
def initialize(authorization)
|
21
|
+
@drive = Google::Apis::DriveV3::DriveService.new
|
22
|
+
@drive.authorization = authorization
|
23
|
+
end
|
30
24
|
|
31
|
-
|
32
|
-
@client = client
|
33
|
-
# Sets virtually infinite default timeout because some operations (e.g., uploading
|
34
|
-
# a large files/spreadsheets) can take very long.
|
35
|
-
@client.connection.options[:timeout] ||= 100000000
|
36
|
-
@drive = @client.discovered_api("drive", "v2")
|
37
|
-
end
|
25
|
+
attr_reader(:drive)
|
38
26
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
:http_method => method,
|
44
|
-
:uri => url,
|
45
|
-
:body => data,
|
46
|
-
:headers => extra_header)
|
47
|
-
return Response.new(client_response)
|
48
|
-
end
|
49
|
-
|
27
|
+
def request_raw(method, url, data, extra_header, _auth)
|
28
|
+
options = Google::Apis::RequestOptions.default.merge(header: extra_header)
|
29
|
+
body = @drive.http(method, url, body: data, options: options)
|
30
|
+
Response.new('200', body)
|
50
31
|
end
|
51
|
-
|
32
|
+
end
|
52
33
|
end
|
@@ -1,14 +1,10 @@
|
|
1
1
|
# Author: Hiroshi Ichikawa <http://gimite.net/>
|
2
2
|
# The license of this source is "New BSD Licence"
|
3
3
|
|
4
|
-
require
|
5
|
-
|
4
|
+
require 'google_drive/response_code_error'
|
6
5
|
|
7
6
|
module GoogleDrive
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
end
|
13
|
-
|
7
|
+
# Raised when GoogleDrive.login has failed.
|
8
|
+
class AuthenticationError < GoogleDrive::ResponseCodeError
|
9
|
+
end
|
14
10
|
end
|
@@ -1,165 +1,143 @@
|
|
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
|
6
|
-
require
|
7
|
-
|
4
|
+
require 'google_drive/util'
|
5
|
+
require 'google_drive/error'
|
6
|
+
require 'google_drive/spreadsheet'
|
8
7
|
|
9
8
|
module GoogleDrive
|
9
|
+
# Use GoogleDrive::Session#root_collection, GoogleDrive::Collection#subcollections,
|
10
|
+
# or GoogleDrive::Session#collection_by_url to get GoogleDrive::Collection object.
|
11
|
+
class Collection < GoogleDrive::File
|
12
|
+
include(Util)
|
10
13
|
|
11
|
-
|
12
|
-
# or GoogleDrive::Session#collection_by_url to get GoogleDrive::Collection object.
|
13
|
-
class Collection < GoogleDrive::File
|
14
|
-
|
15
|
-
include(Util)
|
16
|
-
|
17
|
-
alias collection_feed_url document_feed_url
|
18
|
-
|
19
|
-
# Adds the given GoogleDrive::File to the collection.
|
20
|
-
def add(file)
|
21
|
-
new_child = @session.drive.children.insert.request_schema.new({
|
22
|
-
"id" => file.id,
|
23
|
-
})
|
24
|
-
@session.execute!(
|
25
|
-
:api_method => @session.drive.children.insert,
|
26
|
-
:body_object => new_child,
|
27
|
-
:parameters => {
|
28
|
-
"folderId" => self.id,
|
29
|
-
"childId" => file.id,
|
30
|
-
})
|
31
|
-
return nil
|
32
|
-
end
|
14
|
+
alias_method :collection_feed_url, :document_feed_url
|
33
15
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
"parents" => [{"id" => self.id}],
|
40
|
-
})
|
41
|
-
api_result = @session.execute!(
|
42
|
-
:api_method => @session.drive.files.insert,
|
43
|
-
:body_object => file)
|
44
|
-
return @session.wrap_api_file(api_result.data)
|
45
|
-
end
|
16
|
+
# Adds the given GoogleDrive::File to the collection.
|
17
|
+
def add(file)
|
18
|
+
@session.drive.update_file(file.id, add_parents: self.id, fields: '')
|
19
|
+
nil
|
20
|
+
end
|
46
21
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
:parameters => {
|
52
|
-
"folderId" => self.id,
|
53
|
-
"childId" => file.id,
|
54
|
-
})
|
55
|
-
return nil
|
56
|
-
end
|
22
|
+
# Removes the given GoogleDrive::File from the collection.
|
23
|
+
def remove(file)
|
24
|
+
@session.drive.update_file(file.id, remove_parents: self.id, fields: '')
|
25
|
+
end
|
57
26
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
27
|
+
# Creates a sub-collection with given title. Returns GoogleDrive::Collection object.
|
28
|
+
def create_subcollection(title)
|
29
|
+
file_metadata = {
|
30
|
+
name: title,
|
31
|
+
mime_type: 'application/vnd.google-apps.folder',
|
32
|
+
parents: [self.id],
|
33
|
+
}
|
34
|
+
file = @session.drive.create_file(file_metadata, fields: '*')
|
35
|
+
@session.wrap_api_file(file)
|
36
|
+
end
|
62
37
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
#
|
68
|
-
# e.g.
|
69
|
-
#
|
70
|
-
# # Gets all the files in collection, including subcollections.
|
71
|
-
# collection.files
|
72
|
-
# # Gets only files with title "hoge".
|
73
|
-
# collection.files("q" => "title = 'hoge'")
|
74
|
-
# # Same as above with a placeholder.
|
75
|
-
# collection.files("q" => ["title = ?", "hoge"])
|
76
|
-
#
|
77
|
-
# By default, it returns the first 100 files. See document of GoogleDrive::Session#files method
|
78
|
-
# for how to get all files.
|
79
|
-
def files(params = {}, &block)
|
80
|
-
return files_with_type(nil, params, &block)
|
81
|
-
end
|
38
|
+
# Returns true if this is a root collection
|
39
|
+
def root?
|
40
|
+
!api_file.parents || api_file.parents.empty?
|
41
|
+
end
|
82
42
|
|
83
|
-
|
43
|
+
# Returns all the files (including spreadsheets, documents, subcollections) in the collection.
|
44
|
+
#
|
45
|
+
# You can specify parameters documented at
|
46
|
+
# https://developers.google.com/drive/v2/reference/files/list
|
47
|
+
#
|
48
|
+
# e.g.
|
49
|
+
#
|
50
|
+
# # Gets all the files in collection, including subcollections.
|
51
|
+
# collection.files
|
52
|
+
# # Gets only files with title "hoge".
|
53
|
+
# collection.files("q" => "title = 'hoge'")
|
54
|
+
# # Same as above with a placeholder.
|
55
|
+
# collection.files("q" => ["title = ?", "hoge"])
|
56
|
+
#
|
57
|
+
# By default, it returns the first 100 files. See document of GoogleDrive::Session#files method
|
58
|
+
# for how to get all files.
|
59
|
+
def files(params = {}, &block)
|
60
|
+
files_with_type(nil, params, &block)
|
61
|
+
end
|
84
62
|
|
85
|
-
|
86
|
-
#
|
87
|
-
# By default, it returns the first 100 spreadsheets. See document of GoogleDrive::Session#files method
|
88
|
-
# for how to get all spreadsheets.
|
89
|
-
def spreadsheets(params = {}, &block)
|
90
|
-
return files_with_type("application/vnd.google-apps.spreadsheet", params, &block)
|
91
|
-
end
|
92
|
-
|
93
|
-
# Returns all the Google Docs documents in the collection.
|
94
|
-
#
|
95
|
-
# By default, it returns the first 100 documents. See document of GoogleDrive::Session#files method
|
96
|
-
# for how to get all documents.
|
97
|
-
def documents(params = {}, &block)
|
98
|
-
return files_with_type("application/vnd.google-apps.document", params, &block)
|
99
|
-
end
|
100
|
-
|
101
|
-
# Returns all its subcollections.
|
102
|
-
#
|
103
|
-
# By default, it returns the first 100 subcollections. See document of GoogleDrive::Session#files method
|
104
|
-
# for how to get all subcollections.
|
105
|
-
def subcollections(params = {}, &block)
|
106
|
-
return files_with_type("application/vnd.google-apps.folder", params, &block)
|
107
|
-
end
|
108
|
-
|
109
|
-
# Returns a file (can be a spreadsheet, document, subcollection or other files) in the
|
110
|
-
# collection which exactly matches +title+ as GoogleDrive::File.
|
111
|
-
# Returns nil if not found. If multiple collections with the +title+ are found, returns
|
112
|
-
# one of them.
|
113
|
-
#
|
114
|
-
# If given an Array, does a recursive subcollection traversal.
|
115
|
-
def file_by_title(title)
|
116
|
-
return file_by_title_with_type(title, nil)
|
117
|
-
end
|
118
|
-
|
119
|
-
# Returns its subcollection whose title exactly matches +title+ as GoogleDrive::Collection.
|
120
|
-
# Returns nil if not found. If multiple collections with the +title+ are found, returns
|
121
|
-
# one of them.
|
122
|
-
#
|
123
|
-
# If given an Array, does a recursive subcollection traversal.
|
124
|
-
def subcollection_by_title(title)
|
125
|
-
return file_by_title_with_type(title, "application/vnd.google-apps.folder")
|
126
|
-
end
|
63
|
+
alias_method :contents, :files
|
127
64
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
65
|
+
# Returns all the spreadsheets in the collection.
|
66
|
+
#
|
67
|
+
# By default, it returns the first 100 spreadsheets. See document of GoogleDrive::Session#files method
|
68
|
+
# for how to get all spreadsheets.
|
69
|
+
def spreadsheets(params = {}, &block)
|
70
|
+
files_with_type('application/vnd.google-apps.spreadsheet', params, &block)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Returns all the Google Docs documents in the collection.
|
74
|
+
#
|
75
|
+
# By default, it returns the first 100 documents. See document of GoogleDrive::Session#files method
|
76
|
+
# for how to get all documents.
|
77
|
+
def documents(params = {}, &block)
|
78
|
+
files_with_type('application/vnd.google-apps.document', params, &block)
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns all its subcollections.
|
82
|
+
#
|
83
|
+
# By default, it returns the first 100 subcollections. See document of GoogleDrive::Session#files method
|
84
|
+
# for how to get all subcollections.
|
85
|
+
def subcollections(params = {}, &block)
|
86
|
+
files_with_type('application/vnd.google-apps.folder', params, &block)
|
87
|
+
end
|
88
|
+
|
89
|
+
# Returns a file (can be a spreadsheet, document, subcollection or other files) in the
|
90
|
+
# collection which exactly matches +title+ as GoogleDrive::File.
|
91
|
+
# Returns nil if not found. If multiple collections with the +title+ are found, returns
|
92
|
+
# one of them.
|
93
|
+
#
|
94
|
+
# If given an Array, does a recursive subcollection traversal.
|
95
|
+
def file_by_title(title)
|
96
|
+
file_by_title_with_type(title, nil)
|
97
|
+
end
|
98
|
+
|
99
|
+
# Returns its subcollection whose title exactly matches +title+ as GoogleDrive::Collection.
|
100
|
+
# Returns nil if not found. If multiple collections with the +title+ are found, returns
|
101
|
+
# one of them.
|
102
|
+
#
|
103
|
+
# If given an Array, does a recursive subcollection traversal.
|
104
|
+
def subcollection_by_title(title)
|
105
|
+
file_by_title_with_type(title, 'application/vnd.google-apps.folder')
|
106
|
+
end
|
107
|
+
|
108
|
+
# Returns URL of the deprecated contents feed.
|
109
|
+
def contents_url
|
110
|
+
document_feed_url + '/contents'
|
111
|
+
end
|
112
|
+
|
113
|
+
protected
|
114
|
+
|
115
|
+
def file_by_title_with_type(title, type)
|
116
|
+
if title.is_a?(Array)
|
117
|
+
rel_path = title
|
118
|
+
if rel_path.empty?
|
119
|
+
return self
|
120
|
+
else
|
121
|
+
parent = subcollection_by_title(rel_path[0...-1])
|
122
|
+
return parent && parent.file_by_title_with_type(rel_path[-1], type)
|
161
123
|
end
|
162
|
-
|
124
|
+
else
|
125
|
+
files_with_type(type, q: ['name = ?', title], page_size: 1)[0]
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
private
|
130
|
+
|
131
|
+
def files_with_type(type, params = {}, &block)
|
132
|
+
params = convert_params(params)
|
133
|
+
query = construct_and_query([
|
134
|
+
['? in parents', id],
|
135
|
+
type ? ['mimeType = ?', type] : nil,
|
136
|
+
params[:q]
|
137
|
+
])
|
138
|
+
params = params.merge(q: query)
|
139
|
+
# This is faster than calling children.list and then files.get for each file.
|
140
|
+
@session.files(params, &block)
|
163
141
|
end
|
164
|
-
|
142
|
+
end
|
165
143
|
end
|