google-spreadsheet-ruby 0.1.6 → 0.1.7

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.
Files changed (2) hide show
  1. data/lib/google_spreadsheet.rb +226 -8
  2. metadata +8 -8
@@ -290,7 +290,7 @@ module GoogleSpreadsheet
290
290
  def login(mail, password)
291
291
  if !@fetcher.is_a?(ClientLoginFetcher)
292
292
  raise(GoogleSpreadsheet::Error,
293
- "Cannot call login for session created by login_with_oauth or login_with_oauth2.")
293
+ "Cannot call login for session created by login_with_oauth.")
294
294
  end
295
295
  begin
296
296
  @fetcher.auth_tokens = {
@@ -308,7 +308,7 @@ module GoogleSpreadsheet
308
308
  if !@fetcher.is_a?(ClientLoginFetcher)
309
309
  raise(GoogleSpreadsheet::Error,
310
310
  "Cannot call auth_tokens for session created by " +
311
- "login_with_oauth or login_with_oauth2.")
311
+ "login_with_oauth.")
312
312
  end
313
313
  return @fetcher.auth_tokens
314
314
  end
@@ -443,6 +443,10 @@ module GoogleSpreadsheet
443
443
  return convert_response(response, response_type)
444
444
  end
445
445
  end
446
+
447
+ def inspect
448
+ return '#<%p:0x%x>' % [self.class, self.object_id]
449
+ end
446
450
 
447
451
  private
448
452
 
@@ -651,6 +655,14 @@ module GoogleSpreadsheet
651
655
  end
652
656
  return result.freeze()
653
657
  end
658
+
659
+ # Returns a GoogleSpreadsheet::Worksheet with the given title in the spreadsheet.
660
+ #
661
+ # Returns nil if not found. Returns the first one when multiple worksheets with the
662
+ # title are found.
663
+ def worksheet_by_title(title)
664
+ return self.worksheets.find(){ |ws| ws.title == title }
665
+ end
654
666
 
655
667
  # Adds a new worksheet to the spreadsheet. Returns added GoogleSpreadsheet::Worksheet.
656
668
  def add_worksheet(title, max_rows = 100, max_cols = 20)
@@ -679,6 +691,12 @@ module GoogleSpreadsheet
679
691
  doc = @session.request(:get, self.tables_feed_url)
680
692
  return doc.css('entry').map(){ |e| Table.new(@session, e) }.freeze()
681
693
  end
694
+
695
+ def inspect
696
+ fields = {:worksheets_feed_url => self.worksheets_feed_url}
697
+ fields[:title] = @title if @title
698
+ return '#<%p %s>' % [self.class, fields.map(){ |k, v| "%s=%p" % [k, v] }.join(", ")]
699
+ end
682
700
 
683
701
  end
684
702
 
@@ -780,6 +798,7 @@ module GoogleSpreadsheet
780
798
 
781
799
  end
782
800
 
801
+ # A worksheet (i.e. a tab) in a spreadsheet.
783
802
  # Use GoogleSpreadsheet::Spreadsheet#worksheets to get GoogleSpreadsheet::Worksheet object.
784
803
  class Worksheet
785
804
 
@@ -794,6 +813,7 @@ module GoogleSpreadsheet
794
813
  @cells = nil
795
814
  @input_values = nil
796
815
  @modified = Set.new()
816
+ @list = nil
797
817
  end
798
818
 
799
819
  # URL of cell-based feed of the worksheet.
@@ -848,8 +868,9 @@ module GoogleSpreadsheet
848
868
 
849
869
  # Returns the value or the formula of the cell. Top-left cell is [1, 1].
850
870
  #
851
- # If user input "=A1+B1" to cell [1, 3], worksheet[1, 3] is "3" for example and
852
- # worksheet.input_value(1, 3) is "=RC[-2]+RC[-1]".
871
+ # If user input "=A1+B1" to cell [1, 3]:
872
+ # worksheet[1, 3] #=> "3" for example
873
+ # worksheet.input_value(1, 3) #=> "=RC[-2]+RC[-1]"
853
874
  def input_value(row, col)
854
875
  reload() if !@cells
855
876
  return @input_values[[row, col]] || ""
@@ -858,13 +879,13 @@ module GoogleSpreadsheet
858
879
  # Row number of the bottom-most non-empty row.
859
880
  def num_rows
860
881
  reload() if !@cells
861
- return @cells.keys.map(){ |r, c| r }.max || 0
882
+ return @input_values.select(){ |(r, c), v| !v.empty? }.map(){ |(r, c), v| r }.max || 0
862
883
  end
863
884
 
864
885
  # Column number of the right-most non-empty column.
865
886
  def num_cols
866
887
  reload() if !@cells
867
- return @cells.keys.map(){ |r, c| c }.max || 0
888
+ return @input_values.select(){ |(r, c), v| !v.empty? }.map(){ |(r, c), v| c }.max || 0
868
889
  end
869
890
 
870
891
  # Number of rows including empty rows.
@@ -926,7 +947,7 @@ module GoogleSpreadsheet
926
947
  end
927
948
 
928
949
  # Reloads content of the worksheets from the server.
929
- # Note that changes you made by []= is discarded if you haven't called save().
950
+ # Note that changes you made by []= etc. is discarded if you haven't called save().
930
951
  def reload()
931
952
  doc = @session.request(:get, @cells_feed_url)
932
953
  @max_rows = doc.css('gs|rowCount').text.to_i
@@ -941,7 +962,6 @@ module GoogleSpreadsheet
941
962
  col = cell["col"].to_i()
942
963
  @cells[[row, col]] = cell.inner_text
943
964
  @input_values[[row, col]] = cell["inputValue"]
944
-
945
965
  end
946
966
  @modified.clear()
947
967
  @meta_modified = false
@@ -1110,8 +1130,206 @@ module GoogleSpreadsheet
1110
1130
  return entry.css(
1111
1131
  "link[@rel='http://schemas.google.com/spreadsheets/2006#listfeed']").first['href']
1112
1132
  end
1133
+
1134
+ # Provides access to cells using column names, assuming the first row contains column
1135
+ # names. Returned object is GoogleSpreadsheet::List which you can use mostly as
1136
+ # Array of Hash.
1137
+ #
1138
+ # e.g. Assuming the first row is ["x", "y"]:
1139
+ # worksheet.list[0]["x"] #=> "1" # i.e. worksheet[2, 1]
1140
+ # worksheet.list[0]["y"] #=> "2" # i.e. worksheet[2, 2]
1141
+ # worksheet.list[1]["x"] = "3" # i.e. worksheet[3, 1] = "3"
1142
+ # worksheet.list[1]["y"] = "4" # i.e. worksheet[3, 2] = "4"
1143
+ # worksheet.list.push({"x" => "5", "y" => "6"})
1144
+ #
1145
+ # Note that update is not sent to the server until you call save().
1146
+ def list
1147
+ return @list ||= List.new(self)
1148
+ end
1149
+
1150
+ def inspect
1151
+ fields = {:worksheet_feed_url => self.worksheet_feed_url}
1152
+ fields[:title] = @title if @title
1153
+ return '#<%p %s>' % [self.class, fields.map(){ |k, v| "%s=%p" % [k, v] }.join(", ")]
1154
+ end
1113
1155
 
1114
1156
  end
1115
1157
 
1158
+
1159
+ # Provides access to cells using column names.
1160
+ # Use GoogleSpreadsheet::Worksheet#list to get GoogleSpreadsheet::List object.
1161
+ #--
1162
+ # This is implemented as wrapper of GoogleSpreadsheet::Worksheet i.e. using cells
1163
+ # feed, not list feed. In this way, we can easily provide consistent API as
1164
+ # GoogleSpreadsheet::Worksheet using save()/reload().
1165
+ class List
1166
+
1167
+ include(Enumerable)
1168
+
1169
+ def initialize(worksheet) #:nodoc:
1170
+ @worksheet = worksheet
1171
+ end
1172
+
1173
+ # Number of non-empty rows in the worksheet excluding the first row.
1174
+ def size
1175
+ return @worksheet.num_rows - 1
1176
+ end
1177
+
1178
+ # Returns Hash-like object (GoogleSpreadsheet::ListRow) for the row with the
1179
+ # index. Keys of the object are colum names (the first row).
1180
+ # The second row has index 0.
1181
+ #
1182
+ # Note that updates to the returned object are not sent to the server until
1183
+ # you call GoogleSpreadsheet::Worksheet#save().
1184
+ def [](index)
1185
+ return ListRow.new(self, index)
1186
+ end
1187
+
1188
+ # Updates the row with the index with the given Hash object.
1189
+ # Keys of +hash+ are colum names (the first row).
1190
+ # The second row has index 0.
1191
+ #
1192
+ # Note that update is not sent to the server until
1193
+ # you call GoogleSpreadsheet::Worksheet#save().
1194
+ def []=(index, hash)
1195
+ self[index].replace(hash)
1196
+ end
1197
+
1198
+ # Iterates over Hash-like object (GoogleSpreadsheet::ListRow) for each row
1199
+ # (except for the first row).
1200
+ # Keys of the object are colum names (the first row).
1201
+ def each(&block)
1202
+ for i in 0...self.size
1203
+ yield(self[i])
1204
+ end
1205
+ end
1206
+
1207
+ # Column names i.e. the contents of the first row.
1208
+ # Duplicates are removed.
1209
+ def keys
1210
+ return (1..@worksheet.num_cols).map(){ |i| @worksheet[1, i] }.uniq()
1211
+ end
1212
+
1213
+ # Updates column names i.e. the contents of the first row.
1214
+ #
1215
+ # Note that update is not sent to the server until
1216
+ # you call GoogleSpreadsheet::Worksheet#save().
1217
+ def keys=(ary)
1218
+ for i in 1..ary.size
1219
+ @worksheet[1, i] = ary[i - 1]
1220
+ end
1221
+ for i in (ary.size + 1)..@worksheet.num_cols
1222
+ @worksheet[1, i] = ""
1223
+ end
1224
+ end
1225
+
1226
+ # Adds a new row to the bottom.
1227
+ # Keys of +hash+ are colum names (the first row).
1228
+ # Returns GoogleSpreadsheet::ListRow for the new row.
1229
+ #
1230
+ # Note that update is not sent to the server until
1231
+ # you call GoogleSpreadsheet::Worksheet#save().
1232
+ def push(hash)
1233
+ row = self[self.size]
1234
+ row.update(hash)
1235
+ return row
1236
+ end
1237
+
1238
+ # Returns all rows (except for the first row) as Array of Hash.
1239
+ # Keys of Hash objects are colum names (the first row).
1240
+ def to_hash_array()
1241
+ return self.map(){ |r| r.to_hash() }
1242
+ end
1243
+
1244
+ def get(index, key) #:nodoc:
1245
+ return @worksheet[index + 2, key_to_col(key)]
1246
+ end
1247
+
1248
+ def set(index, key, value) #:nodoc:
1249
+ @worksheet[index + 2, key_to_col(key)] = value
1250
+ end
1251
+
1252
+ private
1253
+
1254
+ def key_to_col(key)
1255
+ key = key.to_s()
1256
+ col = (1..@worksheet.num_cols).find(){ |c| @worksheet[1, c] == key }
1257
+ raise(GoogleSpreadsheet::Error, "colunm doesn't exist: %p" % key) if !col
1258
+ return col
1259
+ end
1260
+
1261
+ end
1116
1262
 
1263
+ # Hash-like object returned by GoogleSpreadsheet::List#[].
1264
+ class ListRow
1265
+
1266
+ include(Enumerable)
1267
+ extend(Forwardable)
1268
+
1269
+ def_delegators(:to_hash,
1270
+ :keys, :values, :each_key, :each_value, :each, :each_pair, :hash,
1271
+ :assoc, :fetch, :flatten, :key, :invert, :size, :length, :rassoc,
1272
+ :merge, :reject, :select, :sort, :to_a, :values_at)
1273
+
1274
+ def initialize(list, index) #:nodoc:
1275
+ @list = list
1276
+ @index = index
1277
+ end
1278
+
1279
+ def [](key)
1280
+ return @list.get(@index, key)
1281
+ end
1282
+
1283
+ def []=(key, value)
1284
+ @list.set(@index, key, value)
1285
+ end
1286
+
1287
+ def has_key?(key)
1288
+ return @list.keys.include?(key)
1289
+ end
1290
+
1291
+ alias include? has_key?
1292
+ alias key? has_key?
1293
+ alias member? has_key?
1294
+
1295
+ def update(hash)
1296
+ for k, v in hash
1297
+ self[k] = v
1298
+ end
1299
+ end
1300
+
1301
+ alias merge! update
1302
+
1303
+ def replace(hash)
1304
+ clear()
1305
+ update(hash)
1306
+ end
1307
+
1308
+ def clear()
1309
+ for key in @list.keys
1310
+ self[key] = ""
1311
+ end
1312
+ end
1313
+
1314
+ def to_hash()
1315
+ result = {}
1316
+ for key in @list.keys
1317
+ result[key] = self[key]
1318
+ end
1319
+ return result
1320
+ end
1321
+
1322
+ def ==(other)
1323
+ return self.class == other.class && self.to_hash() == other.to_hash()
1324
+ end
1325
+
1326
+ alias === ==
1327
+ alias eql? ==
1328
+
1329
+ def inspect
1330
+ return "\#<%p %p>" % [self.class, to_hash()]
1331
+ end
1332
+
1333
+ end
1334
+
1117
1335
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-spreadsheet-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-27 00:00:00.000000000 Z
12
+ date: 2012-02-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
16
- requirement: &81815340 !ruby/object:Gem::Requirement
16
+ requirement: &75716330 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.4.3.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *81815340
24
+ version_requirements: *75716330
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: oauth
27
- requirement: &81815050 !ruby/object:Gem::Requirement
27
+ requirement: &75715910 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.3.6
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *81815050
35
+ version_requirements: *75715910
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: oauth2
38
- requirement: &81814770 !ruby/object:Gem::Requirement
38
+ requirement: &75715490 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: 0.5.0
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *81814770
46
+ version_requirements: *75715490
47
47
  description: This is a library to read/write Google Spreadsheet.
48
48
  email:
49
49
  - gimite+github@gmail.com