google_drive 0.3.11 → 1.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -7
- data/README.rdoc +27 -10
- data/lib/google_drive/acl.rb +40 -58
- data/lib/google_drive/acl_entry.rb +76 -56
- data/lib/google_drive/api_client_fetcher.rb +49 -0
- data/lib/google_drive/collection.rb +69 -71
- data/lib/google_drive/file.rb +171 -128
- data/lib/google_drive/session.rb +234 -268
- data/lib/google_drive/spreadsheet.rb +19 -163
- data/lib/google_drive/util.rb +126 -17
- data/lib/google_drive/worksheet.rb +108 -80
- data/lib/google_drive.rb +63 -57
- data/lib/google_drive_v1/acl.rb +115 -0
- data/lib/google_drive_v1/acl_entry.rb +100 -0
- data/lib/google_drive_v1/api_client_fetcher.rb +47 -0
- data/lib/google_drive_v1/authentication_error.rb +14 -0
- data/lib/{google_drive → google_drive_v1}/basic_fetcher.rb +1 -1
- data/lib/{google_drive → google_drive_v1}/client_login_fetcher.rb +2 -2
- data/lib/google_drive_v1/collection.rb +167 -0
- data/lib/google_drive_v1/error.rb +12 -0
- data/lib/google_drive_v1/file.rb +258 -0
- data/lib/google_drive_v1/list.rb +119 -0
- data/lib/google_drive_v1/list_row.rb +88 -0
- data/lib/{google_drive → google_drive_v1}/oauth1_fetcher.rb +1 -1
- data/lib/{google_drive → google_drive_v1}/oauth2_fetcher.rb +2 -2
- data/lib/google_drive_v1/record.rb +31 -0
- data/lib/google_drive_v1/session.rb +522 -0
- data/lib/google_drive_v1/spreadsheet.rb +248 -0
- data/lib/google_drive_v1/table.rb +60 -0
- data/lib/google_drive_v1/util.rb +73 -0
- data/lib/google_drive_v1/worksheet.rb +498 -0
- data/lib/google_drive_v1.rb +148 -0
- metadata +112 -77
- data/doc_src/google_drive/acl_entry.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
5
|
-
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 76b903fb2d84303774103ab6da528579367ce8a5
|
4
|
+
data.tar.gz: 04f591af34df950ba24d46a0ba0f6e099447f291
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e5253faaa7c32a502d296354cc1aa1728c79136d009f45fb05801c21b490b4f6ec81c6995d3486c5742b9ecf96f7408ced12d08b3b46d2c9a729ba1d3379a148
|
7
|
+
data.tar.gz: f52470706946884dd09e400b8fff2bd22af076947083910f58b92177566a80c96c8a9c833307c6f4ce9bc181ed7f6fa69723eff4a4e23faa31c0c91dd91a9c60
|
data/README.rdoc
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
This is a Ruby 1.9/2.0 library to read/write files/spreadsheets in Google Drive/Docs.
|
1
|
+
This is a Ruby 1.8/1.9/2.0 library to read/write files/spreadsheets in Google Drive/Docs.
|
2
2
|
|
3
3
|
NOTE: This is NOT a library to create Google Drive App.
|
4
4
|
|
@@ -10,15 +10,31 @@ NOTE: This is NOT a library to create Google Drive App.
|
|
10
10
|
|
11
11
|
= How to use
|
12
12
|
|
13
|
+
First, follow "Create a client ID and client secret" in {this page}[https://developers.google.com/drive/web/auth/web-server] to get a client ID and client secret for OAuth.
|
14
|
+
|
13
15
|
Example to read/write files in Google Drive:
|
14
16
|
|
15
17
|
require "rubygems"
|
18
|
+
require "google/api_client"
|
16
19
|
require "google_drive"
|
17
|
-
|
18
|
-
#
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
|
21
|
+
# Authorizes with OAuth and gets an access token.
|
22
|
+
client = Google::APIClient.new
|
23
|
+
auth = client.authorization
|
24
|
+
auth.client_id = "YOUR CLIENT ID"
|
25
|
+
auth.client_secret = "YOUR CLIENT SECRET"
|
26
|
+
auth.scope =
|
27
|
+
"https://www.googleapis.com/auth/drive " +
|
28
|
+
"https://spreadsheets.google.com/feeds/"
|
29
|
+
auth.redirect_uri = "urn:ietf:wg:oauth:2.0:oob"
|
30
|
+
print("1. Open this page:\n%s\n\n" % auth.authorization_uri)
|
31
|
+
print("2. Enter the authorization code shown in the page: ")
|
32
|
+
auth.code = $stdin.gets.chomp
|
33
|
+
auth.fetch_access_token!
|
34
|
+
access_token = auth.access_token
|
35
|
+
|
36
|
+
# Creates a session.
|
37
|
+
session = GoogleDrive.login_with_oauth(access_token)
|
22
38
|
|
23
39
|
# Gets list of remote files.
|
24
40
|
for file in session.files
|
@@ -38,12 +54,13 @@ Example to read/write files in Google Drive:
|
|
38
54
|
Example to read/write spreadsheets:
|
39
55
|
|
40
56
|
require "rubygems"
|
57
|
+
require "google/api_client"
|
41
58
|
require "google_drive"
|
59
|
+
|
60
|
+
# Same as the code above to get access_token...
|
42
61
|
|
43
|
-
#
|
44
|
-
|
45
|
-
# GoogleDrive.login_with_oauth for details.
|
46
|
-
session = GoogleDrive.login("username@gmail.com", "mypassword")
|
62
|
+
# Creates a session.
|
63
|
+
session = GoogleDrive.login(access_token)
|
47
64
|
|
48
65
|
# First worksheet of
|
49
66
|
# https://docs.google.com/spreadsheet/ccc?key=pz7XtlQC-PYx-jrVMJErTcg
|
data/lib/google_drive/acl.rb
CHANGED
@@ -18,15 +18,16 @@ module GoogleDrive
|
|
18
18
|
include(Util)
|
19
19
|
extend(Forwardable)
|
20
20
|
|
21
|
-
def initialize(session,
|
21
|
+
def initialize(session, file) #:nodoc:
|
22
22
|
@session = session
|
23
|
-
@
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
@file = file
|
24
|
+
api_result = @session.execute!(
|
25
|
+
:api_method => @session.drive.permissions.list,
|
26
|
+
:parameters => { "fileId" => @file.id })
|
27
|
+
@entries = api_result.data.items.map(){ |i| AclEntry.new(i, self) }
|
27
28
|
end
|
28
29
|
|
29
|
-
def_delegators(:@
|
30
|
+
def_delegators(:@entries, :size, :[], :each)
|
30
31
|
|
31
32
|
# Adds a new entry. +entry+ is either a GoogleDrive::AclEntry or a Hash with keys
|
32
33
|
# :scope_type, :scope and :role. See GoogleDrive::AclEntry#scope_type and
|
@@ -37,27 +38,28 @@ module GoogleDrive
|
|
37
38
|
# e.g.
|
38
39
|
# # A specific user can read or write.
|
39
40
|
# spreadsheet.acl.push(
|
40
|
-
# {:
|
41
|
+
# {:type => "user", :value => "example2@gmail.com", :role => "reader"})
|
41
42
|
# spreadsheet.acl.push(
|
42
|
-
# {:
|
43
|
+
# {:type => "user", :value => "example3@gmail.com", :role => "writer"})
|
43
44
|
# # Publish on the Web.
|
44
45
|
# spreadsheet.acl.push(
|
45
|
-
# {:
|
46
|
+
# {:type => "anyone", :role => "reader"})
|
46
47
|
# # Anyone who knows the link can read.
|
47
48
|
# spreadsheet.acl.push(
|
48
|
-
# {:
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
49
|
+
# {:type => "anyone", :withLink => true, :role => "reader"})
|
50
|
+
#
|
51
|
+
# See here for parameter detais:
|
52
|
+
# https://developers.google.com/drive/v2/reference/permissions/insert
|
53
|
+
def push(params_or_entry)
|
54
|
+
entry = params_or_entry.is_a?(AclEntry) ? params_or_entry : AclEntry.new(params_or_entry)
|
55
|
+
new_permission = @session.drive.permissions.insert.request_schema.new(entry.params)
|
56
|
+
api_result = @session.execute!(
|
57
|
+
:api_method => @session.drive.permissions.insert,
|
58
|
+
:body_object => new_permission,
|
59
|
+
:parameters => { "fileId" => @file.id })
|
60
|
+
new_entry = AclEntry.new(api_result.data, self)
|
61
|
+
@entries.push(new_entry)
|
62
|
+
return new_entry
|
61
63
|
end
|
62
64
|
|
63
65
|
# Deletes an ACL entry.
|
@@ -65,49 +67,29 @@ module GoogleDrive
|
|
65
67
|
# e.g.
|
66
68
|
# spreadsheet.acl.delete(spreadsheet.acl[1])
|
67
69
|
def delete(entry)
|
68
|
-
|
69
|
-
|
70
|
-
|
70
|
+
@session.execute!(
|
71
|
+
:api_method => @session.drive.permissions.delete,
|
72
|
+
:parameters => {
|
73
|
+
"fileId" => @file.id,
|
74
|
+
"permissionId" => entry.id,
|
75
|
+
})
|
76
|
+
@entries.delete(entry)
|
71
77
|
end
|
72
78
|
|
73
79
|
def update_role(entry) #:nodoc:
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
:
|
78
|
-
|
79
|
-
|
80
|
+
api_result = @session.execute!(
|
81
|
+
:api_method => @session.drive.permissions.update,
|
82
|
+
:body_object => entry.api_permission,
|
83
|
+
:parameters => {
|
84
|
+
"fileId" => @file.id,
|
85
|
+
"permissionId" => entry.id,
|
86
|
+
})
|
87
|
+
entry.api_permission = api_result.data
|
80
88
|
return entry
|
81
|
-
|
82
89
|
end
|
83
90
|
|
84
91
|
def inspect
|
85
|
-
return "\#<%p %p>" % [self.class, @
|
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
|
-
|
92
|
+
return "\#<%p %p>" % [self.class, @entries]
|
111
93
|
end
|
112
94
|
|
113
95
|
end
|
@@ -15,83 +15,103 @@ module GoogleDrive
|
|
15
15
|
|
16
16
|
include(Util)
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
30
|
-
@params[name] = value
|
18
|
+
# +params_or_api_permission+ is a Hash object with keys +:type+, +:value+, +:role+ and +:withLink+.
|
19
|
+
# See GoogleDrive::Acl#push for description of the parameters.
|
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)
|
26
|
+
else
|
27
|
+
@api_permission = nil
|
28
|
+
@params = convert_params(params_or_api_permission)
|
31
29
|
end
|
32
30
|
end
|
33
31
|
|
34
|
-
|
32
|
+
attr_reader(:acl)
|
33
|
+
attr_reader(:params) #:nodoc:
|
34
|
+
attr_accessor(:api_permission) #:nodoc:
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
# The role given to the scope. One of:
|
37
|
+
# - "owner": The owner.
|
38
|
+
# - "writer": With read/write access.
|
39
|
+
# - "reader": With read-only access.
|
40
|
+
def role
|
41
|
+
return @params ? @params["role"] : @api_permission.role
|
42
|
+
end
|
43
|
+
|
44
|
+
# Type of the scope. One of:
|
45
|
+
#
|
46
|
+
# - "user": value is a user's email address.
|
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
|
53
|
+
|
54
|
+
alias scope_type type
|
55
|
+
|
56
|
+
def additional_roles
|
57
|
+
return @params ? @params["additionalRoles"] : @api_permission.additional_roles
|
40
58
|
end
|
41
59
|
|
42
|
-
def
|
43
|
-
|
44
|
-
"WARNING: GoogleDrive::AclEntry\#edit_url is deprecated and will be removed in the next version.")
|
45
|
-
return self.edit_url_internal
|
60
|
+
def id
|
61
|
+
return @params ? @params["id"] : @api_permission.id
|
46
62
|
end
|
47
63
|
|
48
|
-
|
49
|
-
|
64
|
+
# The value of the scope. See type.
|
65
|
+
def value
|
66
|
+
return @params ? @params["value"] : @api_permission.value
|
50
67
|
end
|
51
68
|
|
69
|
+
alias scope value
|
70
|
+
|
71
|
+
# If +true+, the file is shared only with people who know the link.
|
72
|
+
def with_link
|
73
|
+
return @params ? @params["withLink"] : @api_permission.with_link
|
74
|
+
end
|
75
|
+
|
76
|
+
alias with_key with_link
|
77
|
+
|
52
78
|
# Changes the role of the scope.
|
53
79
|
#
|
54
80
|
# e.g.
|
55
81
|
# spreadsheet.acl[1].role = "writer"
|
56
82
|
def role=(role)
|
57
|
-
@params
|
58
|
-
|
83
|
+
if @params
|
84
|
+
@params["role"] = role
|
85
|
+
else
|
86
|
+
@api_permission.role = role
|
87
|
+
@acl.update_role(self)
|
88
|
+
end
|
59
89
|
end
|
60
90
|
|
61
91
|
def inspect
|
62
|
-
return "\#<%p
|
63
|
-
[self.class,
|
92
|
+
return "\#<%p type=%p, name=%p, role=%p>" %
|
93
|
+
[self.class, self.type, self.name, self.role]
|
64
94
|
end
|
65
95
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
96
|
+
private
|
97
|
+
|
98
|
+
# Normalizes the key to String, and converts parameters in the old version.
|
99
|
+
def convert_params(orig_params)
|
100
|
+
new_params = {}
|
101
|
+
for k, v in orig_params
|
102
|
+
k = k.to_s()
|
103
|
+
case k
|
104
|
+
when "scope_type"
|
105
|
+
new_params["type"] = (v == "default" ? "anyone" : v)
|
106
|
+
when "scope"
|
107
|
+
new_params["value"] = v
|
108
|
+
when "with_key"
|
109
|
+
new_params["withLink"] = v
|
110
|
+
else
|
111
|
+
new_params[k] = v
|
112
|
+
end
|
80
113
|
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
|
-
|
114
|
+
return new_params
|
95
115
|
end
|
96
116
|
|
97
117
|
end
|
@@ -0,0 +1,49 @@
|
|
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 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
|
+
attr_reader(:client_response)
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize(client)
|
32
|
+
@client = client
|
33
|
+
@drive = @client.discovered_api("drive", "v2")
|
34
|
+
end
|
35
|
+
|
36
|
+
attr_reader(:client, :drive)
|
37
|
+
|
38
|
+
def request_raw(method, url, data, extra_header, auth)
|
39
|
+
client_response = @client.execute(
|
40
|
+
:http_method => method,
|
41
|
+
:uri => url,
|
42
|
+
:body => data,
|
43
|
+
:headers => extra_header)
|
44
|
+
return Response.new(client_response)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -13,107 +13,97 @@ module GoogleDrive
|
|
13
13
|
class Collection < GoogleDrive::File
|
14
14
|
|
15
15
|
include(Util)
|
16
|
-
|
17
|
-
ROOT_URL = "#{DOCS_BASE_URL}/folder%3Aroot" #:nodoc:
|
18
16
|
|
19
17
|
alias collection_feed_url document_feed_url
|
20
18
|
|
21
|
-
def contents_url
|
22
|
-
if self.root?
|
23
|
-
# The root collection doesn't have document feed.
|
24
|
-
return concat_url(ROOT_URL, "/contents")
|
25
|
-
else
|
26
|
-
return self.document_feed_entry_internal.css(
|
27
|
-
"content[type='application/atom+xml;type=feed']")[0]["src"]
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# Title of the collection.
|
32
|
-
#
|
33
|
-
# Set <tt>params[:reload]</tt> to true to force reloading the title.
|
34
|
-
def title(params = {})
|
35
|
-
if self.root?
|
36
|
-
# The root collection doesn't have document feed.
|
37
|
-
return nil
|
38
|
-
else
|
39
|
-
return super
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def resource_id
|
44
|
-
return self.root? ? nil : super
|
45
|
-
end
|
46
|
-
|
47
19
|
# Adds the given GoogleDrive::File to the collection.
|
48
20
|
def add(file)
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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
|
+
})
|
57
31
|
return nil
|
58
32
|
end
|
59
33
|
|
60
34
|
# Creates a sub-collection with given title. Returns GoogleDrive::Collection object.
|
61
35
|
def create_subcollection(title)
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
:post, contents_url, :data => xml, :header => header, :auth => :writely)
|
72
|
-
return @session.entry_element_to_file(doc)
|
36
|
+
file = @session.drive.files.insert.request_schema.new({
|
37
|
+
"title" => title,
|
38
|
+
"mimeType" => "application/vnd.google-apps.folder",
|
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)
|
73
45
|
end
|
74
46
|
|
75
47
|
# Removes the given GoogleDrive::File from the collection.
|
76
48
|
def remove(file)
|
77
|
-
|
78
|
-
|
49
|
+
@session.execute!(
|
50
|
+
:api_method => @session.drive.children.delete,
|
51
|
+
:parameters => {
|
52
|
+
"folderId" => self.id,
|
53
|
+
"childId" => file.id,
|
54
|
+
})
|
55
|
+
return nil
|
79
56
|
end
|
80
57
|
|
81
58
|
# Returns true if this is a root collection
|
82
59
|
def root?
|
83
|
-
self.
|
60
|
+
return self.api_file.parents.empty?
|
84
61
|
end
|
85
62
|
|
86
63
|
# Returns all the files (including spreadsheets, documents, subcollections) in the collection.
|
87
64
|
#
|
88
|
-
# You can specify
|
89
|
-
# https://developers.google.com/
|
65
|
+
# You can specify parameters documented at
|
66
|
+
# https://developers.google.com/drive/v2/reference/files/list
|
90
67
|
#
|
91
68
|
# e.g.
|
92
69
|
#
|
93
70
|
# # Gets all the files in collection, including subcollections.
|
94
71
|
# collection.files
|
95
|
-
#
|
96
72
|
# # Gets only files with title "hoge".
|
97
|
-
# collection.files("
|
98
|
-
|
99
|
-
|
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)
|
100
81
|
end
|
101
82
|
|
102
83
|
alias contents files
|
103
84
|
|
104
85
|
# Returns all the spreadsheets in the collection.
|
105
|
-
|
106
|
-
|
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)
|
107
91
|
end
|
108
92
|
|
109
93
|
# Returns all the Google Docs documents in the collection.
|
110
|
-
|
111
|
-
|
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)
|
112
99
|
end
|
113
100
|
|
114
101
|
# Returns all its subcollections.
|
115
|
-
|
116
|
-
|
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)
|
117
107
|
end
|
118
108
|
|
119
109
|
# Returns a file (can be a spreadsheet, document, subcollection or other files) in the
|
@@ -132,7 +122,12 @@ module GoogleDrive
|
|
132
122
|
#
|
133
123
|
# If given an Array, does a recursive subcollection traversal.
|
134
124
|
def subcollection_by_title(title)
|
135
|
-
return file_by_title_with_type(title, "folder")
|
125
|
+
return file_by_title_with_type(title, "application/vnd.google-apps.folder")
|
126
|
+
end
|
127
|
+
|
128
|
+
# Returns URL of the deprecated contents feed.
|
129
|
+
def contents_url
|
130
|
+
self.document_feed_url + "/contents"
|
136
131
|
end
|
137
132
|
|
138
133
|
protected
|
@@ -147,19 +142,22 @@ module GoogleDrive
|
|
147
142
|
return parent && parent.file_by_title_with_type(rel_path[-1], type)
|
148
143
|
end
|
149
144
|
else
|
150
|
-
return files_with_type(type, "
|
145
|
+
return files_with_type(type, "q" => ["title = ?", title], "maxResults" => 1)[0]
|
151
146
|
end
|
152
147
|
end
|
153
148
|
|
154
149
|
private
|
155
150
|
|
156
|
-
def files_with_type(type, params = {})
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
151
|
+
def files_with_type(type, params = {}, &block)
|
152
|
+
params = convert_params(params)
|
153
|
+
query = construct_and_query([
|
154
|
+
["? in parents", self.id],
|
155
|
+
type ? ["mimeType = ?", type] : nil,
|
156
|
+
params["q"],
|
157
|
+
])
|
158
|
+
params = params.merge({"q" => query})
|
159
|
+
# This is faster than calling children.list and then files.get for each file.
|
160
|
+
return @session.files(params, &block)
|
163
161
|
end
|
164
162
|
|
165
163
|
end
|