google_drive 1.0.5 → 1.0.6
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 +1 -1
- data/lib/google_drive.rb +20 -4
- data/lib/google_drive/list.rb +21 -17
- data/lib/google_drive/list_row.rb +22 -18
- data/lib/google_drive/worksheet.rb +65 -0
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63bf6efd4050300790543c7ed135632f86e61432
|
4
|
+
data.tar.gz: 481431da22d9bbebbf0a44067eaef26e7b05dc57
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff5e59d1b8b1a3bfcc59a6bda70d03b71f179d896e9dcb7c7cac836ce674569929a06dcfc5e792f19fac1d23398c4b043a64951b3597544acaae42a351a652d9
|
7
|
+
data.tar.gz: 77f7e1b096e71e4cfe7f3c4cb745f0efa9ce202fd41bfbbb38fb52a341ac7d4d1b3af55927d9cef7ec3eadf79ac41d7b5cef9a7a269af83554c2707308625835
|
data/README.rdoc
CHANGED
@@ -17,7 +17,7 @@ Ver. 1.0.x is not 100% backward compatible with 0.3.x. Some methods have been re
|
|
17
17
|
|
18
18
|
= How to use
|
19
19
|
|
20
|
-
First, follow
|
20
|
+
First, follow Step 1 and 2 of "Authorizing requests with OAuth 2.0" in {this page}[https://developers.google.com/drive/v3/web/about-auth] to get a client ID and client secret for OAuth. Set "Application type" to "Other" in the form to create a client ID if you use GoogleDrive.saved_session method as in the example below.
|
21
21
|
|
22
22
|
Next, create a file config.json which contains the client ID and crient secret you got above, which looks like:
|
23
23
|
|
data/lib/google_drive.rb
CHANGED
@@ -17,8 +17,8 @@ module GoogleDrive
|
|
17
17
|
# require "google/api_client"
|
18
18
|
# client = Google::APIClient.new
|
19
19
|
# auth = client.authorization
|
20
|
-
# # Follow
|
21
|
-
# # https://developers.google.com/drive/web/auth
|
20
|
+
# # Follow Step 1 and 2 of “Authorizing requests with OAuth 2.0” in
|
21
|
+
# # https://developers.google.com/drive/v3/web/about-auth to get a client ID and client secret.
|
22
22
|
# auth.client_id = "YOUR CLIENT ID"
|
23
23
|
# auth.client_secret = "YOUR CLIENT SECRET"
|
24
24
|
# auth.scope =
|
@@ -105,9 +105,25 @@ module GoogleDrive
|
|
105
105
|
#
|
106
106
|
# If the file doesn't exist or client ID/secret are not given in the file, the default client
|
107
107
|
# ID/secret embedded in the library is used.
|
108
|
+
#
|
109
|
+
# You can also provide a config object that must respond to:
|
110
|
+
# client_id
|
111
|
+
# client_secret
|
112
|
+
# refesh_token
|
113
|
+
# refresh_token=
|
114
|
+
# scope
|
115
|
+
# scope=
|
116
|
+
# save
|
108
117
|
def self.saved_session(
|
109
|
-
|
110
|
-
config =
|
118
|
+
path_or_config = nil, proxy = nil, client_id = nil, client_secret = nil)
|
119
|
+
config = case path_or_config
|
120
|
+
when String
|
121
|
+
Config.new(path_or_config)
|
122
|
+
when nil
|
123
|
+
Config.new(ENV['HOME'] + '/.ruby_google_drive.token')
|
124
|
+
else
|
125
|
+
path_or_config
|
126
|
+
end
|
111
127
|
|
112
128
|
config.scope ||= [
|
113
129
|
'https://www.googleapis.com/auth/drive',
|
data/lib/google_drive/list.rb
CHANGED
@@ -15,18 +15,18 @@ module GoogleDrive
|
|
15
15
|
# feed, not list feed. In this way, we can easily provide consistent API as
|
16
16
|
# GoogleDrive::Worksheet using save()/reload().
|
17
17
|
class List
|
18
|
-
|
18
|
+
|
19
19
|
include(Enumerable)
|
20
|
-
|
20
|
+
|
21
21
|
def initialize(worksheet) #:nodoc:
|
22
22
|
@worksheet = worksheet
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
# Number of non-empty rows in the worksheet excluding the first row.
|
26
26
|
def size
|
27
27
|
return @worksheet.num_rows - 1
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
# Returns Hash-like object (GoogleDrive::ListRow) for the row with the
|
31
31
|
# index. Keys of the object are colum names (the first row).
|
32
32
|
# The second row has index 0.
|
@@ -36,7 +36,7 @@ module GoogleDrive
|
|
36
36
|
def [](index)
|
37
37
|
return ListRow.new(self, index)
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
# Updates the row with the index with the given Hash object.
|
41
41
|
# Keys of +hash+ are colum names (the first row).
|
42
42
|
# The second row has index 0.
|
@@ -46,7 +46,7 @@ module GoogleDrive
|
|
46
46
|
def []=(index, hash)
|
47
47
|
self[index].replace(hash)
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
# Iterates over Hash-like object (GoogleDrive::ListRow) for each row
|
51
51
|
# (except for the first row).
|
52
52
|
# Keys of the object are colum names (the first row).
|
@@ -55,13 +55,13 @@ module GoogleDrive
|
|
55
55
|
yield(self[i])
|
56
56
|
end
|
57
57
|
end
|
58
|
-
|
58
|
+
|
59
59
|
# Column names i.e. the contents of the first row.
|
60
60
|
# Duplicates are removed.
|
61
61
|
def keys
|
62
62
|
return (1..@worksheet.num_cols).map(){ |i| @worksheet[1, i] }.uniq()
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
# Updates column names i.e. the contents of the first row.
|
66
66
|
#
|
67
67
|
# Note that update is not sent to the server until
|
@@ -74,7 +74,7 @@ module GoogleDrive
|
|
74
74
|
@worksheet[1, i] = ""
|
75
75
|
end
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
# Adds a new row to the bottom.
|
79
79
|
# Keys of +hash+ are colum names (the first row).
|
80
80
|
# Returns GoogleDrive::ListRow for the new row.
|
@@ -86,34 +86,38 @@ module GoogleDrive
|
|
86
86
|
row.update(hash)
|
87
87
|
return row
|
88
88
|
end
|
89
|
-
|
89
|
+
|
90
90
|
# Returns all rows (except for the first row) as Array of Hash.
|
91
91
|
# Keys of Hash objects are colum names (the first row).
|
92
92
|
def to_hash_array()
|
93
93
|
return self.map(){ |r| r.to_hash() }
|
94
94
|
end
|
95
|
-
|
95
|
+
|
96
96
|
def get(index, key) #:nodoc:
|
97
97
|
return @worksheet[index + 2, key_to_col(key)]
|
98
98
|
end
|
99
|
-
|
99
|
+
|
100
100
|
def numeric_value(index, key) #:nodoc:
|
101
101
|
return @worksheet.numeric_value(index + 2, key_to_col(key))
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
|
+
def input_value(index, key) #:nodoc:
|
105
|
+
return @worksheet.input_value(index + 2, key_to_col(key))
|
106
|
+
end
|
107
|
+
|
104
108
|
def set(index, key, value) #:nodoc:
|
105
109
|
@worksheet[index + 2, key_to_col(key)] = value
|
106
110
|
end
|
107
|
-
|
111
|
+
|
108
112
|
private
|
109
|
-
|
113
|
+
|
110
114
|
def key_to_col(key)
|
111
115
|
key = key.to_s()
|
112
116
|
col = (1..@worksheet.num_cols).find(){ |c| @worksheet[1, c] == key }
|
113
117
|
raise(GoogleDrive::Error, "Column doesn't exist: %p" % key) if !col
|
114
118
|
return col
|
115
119
|
end
|
116
|
-
|
120
|
+
|
117
121
|
end
|
118
|
-
|
122
|
+
|
119
123
|
end
|
@@ -11,59 +11,63 @@ module GoogleDrive
|
|
11
11
|
|
12
12
|
# Hash-like object returned by GoogleDrive::List#[].
|
13
13
|
class ListRow
|
14
|
-
|
14
|
+
|
15
15
|
include(Enumerable)
|
16
16
|
extend(Forwardable)
|
17
|
-
|
17
|
+
|
18
18
|
def_delegators(:to_hash,
|
19
19
|
:keys, :values, :each_key, :each_value, :each, :each_pair, :hash,
|
20
20
|
:assoc, :fetch, :flatten, :key, :invert, :size, :length, :rassoc,
|
21
21
|
:merge, :reject, :select, :sort, :to_a, :values_at)
|
22
|
-
|
22
|
+
|
23
23
|
def initialize(list, index) #:nodoc:
|
24
24
|
@list = list
|
25
25
|
@index = index
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
def [](key)
|
29
29
|
return @list.get(@index, key)
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
def numeric_value(key)
|
33
33
|
return @list.numeric_value(@index, key)
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
|
+
def input_value(key)
|
37
|
+
return @list.input_value(@index, key)
|
38
|
+
end
|
39
|
+
|
36
40
|
def []=(key, value)
|
37
41
|
@list.set(@index, key, value)
|
38
42
|
end
|
39
|
-
|
43
|
+
|
40
44
|
def has_key?(key)
|
41
45
|
return @list.keys.include?(key)
|
42
46
|
end
|
43
|
-
|
47
|
+
|
44
48
|
alias include? has_key?
|
45
49
|
alias key? has_key?
|
46
50
|
alias member? has_key?
|
47
|
-
|
51
|
+
|
48
52
|
def update(hash)
|
49
53
|
for k, v in hash
|
50
54
|
self[k] = v
|
51
55
|
end
|
52
56
|
end
|
53
|
-
|
57
|
+
|
54
58
|
alias merge! update
|
55
|
-
|
59
|
+
|
56
60
|
def replace(hash)
|
57
61
|
clear()
|
58
62
|
update(hash)
|
59
63
|
end
|
60
|
-
|
64
|
+
|
61
65
|
def clear()
|
62
66
|
for key in @list.keys
|
63
67
|
self[key] = ""
|
64
68
|
end
|
65
69
|
end
|
66
|
-
|
70
|
+
|
67
71
|
def to_hash()
|
68
72
|
result = {}
|
69
73
|
for key in @list.keys
|
@@ -71,18 +75,18 @@ module GoogleDrive
|
|
71
75
|
end
|
72
76
|
return result
|
73
77
|
end
|
74
|
-
|
78
|
+
|
75
79
|
def ==(other)
|
76
80
|
return self.class == other.class && self.to_hash() == other.to_hash()
|
77
81
|
end
|
78
|
-
|
82
|
+
|
79
83
|
alias === ==
|
80
84
|
alias eql? ==
|
81
|
-
|
85
|
+
|
82
86
|
def inspect
|
83
87
|
return "\#<%p %p>" % [self.class, to_hash()]
|
84
88
|
end
|
85
|
-
|
89
|
+
|
86
90
|
end
|
87
|
-
|
91
|
+
|
88
92
|
end
|
@@ -116,6 +116,7 @@ module GoogleDrive
|
|
116
116
|
def []=(*args)
|
117
117
|
(row, col) = parse_cell_args(args[0...-1])
|
118
118
|
value = args[-1].to_s()
|
119
|
+
validate_cell_value(value)
|
119
120
|
reload_cells() if !@cells
|
120
121
|
@cells[[row, col]] = value
|
121
122
|
@input_values[[row, col]] = value
|
@@ -244,6 +245,64 @@ module GoogleDrive
|
|
244
245
|
return result.freeze()
|
245
246
|
end
|
246
247
|
|
248
|
+
# Inserts rows.
|
249
|
+
#
|
250
|
+
# e.g.
|
251
|
+
# # Inserts 2 empty rows before row 3.
|
252
|
+
# worksheet.insert_rows(3, 2)
|
253
|
+
# # Inserts 2 rows with values before row 3.
|
254
|
+
# worksheet.insert_rows(3, [["a, "b"], ["c, "d"]])
|
255
|
+
#
|
256
|
+
# Note that this method is implemented by shifting all cells below the row.
|
257
|
+
# Its behavior is different from inserting rows on the web interface if the
|
258
|
+
# worksheet contains inter-cell reference.
|
259
|
+
def insert_rows(row_num, rows)
|
260
|
+
|
261
|
+
if rows.is_a?(Integer)
|
262
|
+
rows = Array.new(rows, [])
|
263
|
+
end
|
264
|
+
|
265
|
+
# Shifts all cells below the row.
|
266
|
+
self.max_rows += rows.size
|
267
|
+
r = self.num_rows
|
268
|
+
while r >= row_num
|
269
|
+
for c in 1..self.num_cols
|
270
|
+
self[r + rows.size, c] = self[r, c]
|
271
|
+
end
|
272
|
+
r -= 1
|
273
|
+
end
|
274
|
+
|
275
|
+
# Fills in the inserted rows.
|
276
|
+
num_cols = self.num_cols
|
277
|
+
rows.each_with_index() do |row, r|
|
278
|
+
for c in 0...[row.size, num_cols].max
|
279
|
+
self[row_num + r, 1 + c] = row[c] || ""
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
end
|
284
|
+
|
285
|
+
# Deletes rows.
|
286
|
+
#
|
287
|
+
# e.g.
|
288
|
+
# # Deletes 2 rows starting from row 3 (i.e., deletes row 3 and 4).
|
289
|
+
# worksheet.delete_rows(3, 2)
|
290
|
+
#
|
291
|
+
# Note that this method is implemented by shifting all cells below the row.
|
292
|
+
# Its behavior is different from deleting rows on the web interface if the
|
293
|
+
# worksheet contains inter-cell reference.
|
294
|
+
def delete_rows(row_num, rows)
|
295
|
+
if row_num + rows - 1 > self.max_rows
|
296
|
+
raise(ArgumentError, "The row number is out of range")
|
297
|
+
end
|
298
|
+
for r in row_num..(self.max_rows - rows)
|
299
|
+
for c in 1..self.num_cols
|
300
|
+
self[r, c] = self[r + rows, c]
|
301
|
+
end
|
302
|
+
end
|
303
|
+
self.max_rows -= rows
|
304
|
+
end
|
305
|
+
|
247
306
|
# Reloads content of the worksheets from the server.
|
248
307
|
# Note that changes you made by []= etc. is discarded if you haven't called save().
|
249
308
|
def reload()
|
@@ -471,6 +530,12 @@ module GoogleDrive
|
|
471
530
|
end
|
472
531
|
end
|
473
532
|
|
533
|
+
def validate_cell_value(value)
|
534
|
+
if value.include?("\x1a")
|
535
|
+
raise(ArgumentError, "Contains invalid character \\x1a for xml: %p" % value)
|
536
|
+
end
|
537
|
+
end
|
538
|
+
|
474
539
|
end
|
475
540
|
|
476
541
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google_drive
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hiroshi Ichikawa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -112,6 +112,20 @@ dependencies:
|
|
112
112
|
- - ">="
|
113
113
|
- !ruby/object:Gem::Version
|
114
114
|
version: 0.8.0
|
115
|
+
- !ruby/object:Gem::Dependency
|
116
|
+
name: rspec-mocks
|
117
|
+
requirement: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: 3.4.0
|
122
|
+
type: :development
|
123
|
+
prerelease: false
|
124
|
+
version_requirements: !ruby/object:Gem::Requirement
|
125
|
+
requirements:
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: 3.4.0
|
115
129
|
description: A library to read/write files/spreadsheets in Google Drive/Docs.
|
116
130
|
email:
|
117
131
|
- gimite+github@gmail.com
|
@@ -161,7 +175,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
175
|
version: '0'
|
162
176
|
requirements: []
|
163
177
|
rubyforge_project:
|
164
|
-
rubygems_version: 2.
|
178
|
+
rubygems_version: 2.5.1
|
165
179
|
signing_key:
|
166
180
|
specification_version: 4
|
167
181
|
summary: A library to read/write files/spreadsheets in Google Drive/Docs.
|