gimite-google-spreadsheet-ruby 0.0.4 → 0.0.5
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.
- data/lib/google_spreadsheet.rb +128 -7
- metadata +2 -2
data/lib/google_spreadsheet.rb
CHANGED
@@ -236,7 +236,7 @@ module GoogleSpreadsheet
|
|
236
236
|
# session.worksheet_by_url(
|
237
237
|
# "http://spreadsheets.google.com/feeds/cells/pz7XtlQC-PYxNmbBVgyiNWg/od6/private/full")
|
238
238
|
def worksheet_by_url(url)
|
239
|
-
return Worksheet.new(self, url)
|
239
|
+
return Worksheet.new(self, nil, url)
|
240
240
|
end
|
241
241
|
|
242
242
|
end
|
@@ -260,16 +260,30 @@ module GoogleSpreadsheet
|
|
260
260
|
# GoogleSpreadsheet::Session#spreadsheets.
|
261
261
|
attr_reader(:title)
|
262
262
|
|
263
|
+
# Key of the spreadsheet.
|
264
|
+
def key
|
265
|
+
if !(@worksheets_feed_url =~
|
266
|
+
%r{http://spreadsheets.google.com/feeds/worksheets/(.*)/private/full})
|
267
|
+
raise(GoogleSpreadsheet::Error,
|
268
|
+
"worksheets feed URL is in unknown format: #{@worksheets_feed_url}")
|
269
|
+
end
|
270
|
+
return $1
|
271
|
+
end
|
272
|
+
|
273
|
+
# Tables feed URL of the spreadsheet.
|
274
|
+
def tables_feed_url
|
275
|
+
return "http://spreadsheets.google.com/feeds/#{self.key}/tables"
|
276
|
+
end
|
277
|
+
|
263
278
|
# Returns worksheets of the spreadsheet as array of GoogleSpreadsheet::Worksheet.
|
264
279
|
def worksheets
|
265
280
|
doc = @session.get(@worksheets_feed_url)
|
266
281
|
result = []
|
267
282
|
for entry in doc.search("entry")
|
268
283
|
title = entry.search("title").text
|
269
|
-
|
270
284
|
url = entry.search(
|
271
285
|
"link[@rel='http://schemas.google.com/spreadsheets/2006#cellsfeed']")[0]["href"]
|
272
|
-
result.push(Worksheet.new(@session, url, title))
|
286
|
+
result.push(Worksheet.new(@session, self, url, title))
|
273
287
|
end
|
274
288
|
return result.freeze()
|
275
289
|
end
|
@@ -287,27 +301,90 @@ module GoogleSpreadsheet
|
|
287
301
|
doc = @session.post(@worksheets_feed_url, xml)
|
288
302
|
url = doc.search(
|
289
303
|
"link[@rel='http://schemas.google.com/spreadsheets/2006#cellsfeed']")[0]["href"]
|
290
|
-
return Worksheet.new(@session, url, title)
|
304
|
+
return Worksheet.new(@session, self, url, title)
|
305
|
+
end
|
306
|
+
|
307
|
+
# Returns list of tables in the spreadsheet.
|
308
|
+
def tables
|
309
|
+
doc = @session.get(self.tables_feed_url)
|
310
|
+
return doc.search("entry").map(){ |e| Table.new(@session, e) }.freeze()
|
291
311
|
end
|
292
312
|
|
293
313
|
end
|
294
314
|
|
315
|
+
# Use GoogleSpreadsheet::Worksheet#add_table to create table.
|
316
|
+
# Use GoogleSpreadsheet::Worksheet#tables to get GoogleSpreadsheet::Table objects.
|
317
|
+
class Table
|
318
|
+
|
319
|
+
include(Util)
|
320
|
+
|
321
|
+
def initialize(session, entry) #:nodoc:
|
322
|
+
@columns = {}
|
323
|
+
@worksheet_title = entry.search("gs:worksheet")[0]["name"]
|
324
|
+
@records_url = entry.search("content")[0]["src"]
|
325
|
+
@session = session
|
326
|
+
end
|
327
|
+
|
328
|
+
# Title of the worksheet the table belongs to.
|
329
|
+
attr_reader(:worksheet_title)
|
330
|
+
|
331
|
+
# Adds a record.
|
332
|
+
def add_record(values)
|
333
|
+
fields = ""
|
334
|
+
values.each do |name, value|
|
335
|
+
fields += "<gs:field name='#{h(name)}'>#{h(value)}</gs:field>"
|
336
|
+
end
|
337
|
+
xml =<<-EOS
|
338
|
+
<entry
|
339
|
+
xmlns="http://www.w3.org/2005/Atom"
|
340
|
+
xmlns:gs="http://schemas.google.com/spreadsheets/2006">
|
341
|
+
#{fields}
|
342
|
+
</entry>
|
343
|
+
EOS
|
344
|
+
@session.post(@records_url, xml)
|
345
|
+
end
|
346
|
+
|
347
|
+
# Returns records in the table.
|
348
|
+
def records
|
349
|
+
doc = @session.get(@records_url)
|
350
|
+
return doc.search("entry").map(){ |e| Record.new(@session, e) }
|
351
|
+
end
|
352
|
+
|
353
|
+
end
|
354
|
+
|
355
|
+
# Use GoogleSpreadsheet::Table#records to get GoogleSpreadsheet::Record objects.
|
356
|
+
class Record < Hash
|
357
|
+
|
358
|
+
def initialize(session, entry) #:nodoc:
|
359
|
+
@session = session
|
360
|
+
for field in entry.search('gs:field')
|
361
|
+
self[field["name"]] = field.inner_text
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
def inspect #:nodoc:
|
366
|
+
content = self.map(){ |k, v| "%p => %p" % [k, v] }.join(", ")
|
367
|
+
return "\#<%p:{%s}>" % [self.class, content]
|
368
|
+
end
|
369
|
+
|
370
|
+
end
|
295
371
|
|
296
372
|
# Use GoogleSpreadsheet::Spreadsheet#worksheets to get GoogleSpreadsheet::Worksheet object.
|
297
373
|
class Worksheet
|
298
374
|
|
299
375
|
include(Util)
|
300
376
|
|
301
|
-
def initialize(session, cells_feed_url, title = nil) #:nodoc:
|
377
|
+
def initialize(session, spreadsheet, cells_feed_url, title = nil) #:nodoc:
|
302
378
|
@session = session
|
379
|
+
@spreadsheet = spreadsheet
|
303
380
|
@cells_feed_url = cells_feed_url
|
304
381
|
@title = title
|
305
|
-
|
382
|
+
|
306
383
|
@cells = nil
|
307
384
|
@input_values = nil
|
308
385
|
@modified = Set.new()
|
309
386
|
end
|
310
|
-
|
387
|
+
|
311
388
|
# URL of cell-based feed of the worksheet.
|
312
389
|
attr_reader(:cells_feed_url)
|
313
390
|
|
@@ -324,6 +401,19 @@ module GoogleSpreadsheet
|
|
324
401
|
return "http://spreadsheets.google.com/feeds/worksheets/#{$1}/private/full/#{$2}"
|
325
402
|
end
|
326
403
|
|
404
|
+
# GoogleSpreadsheet::Spreadsheet which this worksheet belongs to.
|
405
|
+
def spreadsheet
|
406
|
+
if !@spreadsheet
|
407
|
+
if !(@cells_feed_url =~
|
408
|
+
%r{^http://spreadsheets.google.com/feeds/cells/(.*)/(.*)/private/full$})
|
409
|
+
raise(GoogleSpreadsheet::Error,
|
410
|
+
"cells feed URL is in unknown format: #{@cells_feed_url}")
|
411
|
+
end
|
412
|
+
@spreadsheet = @session.spreadsheet_by_key($1)
|
413
|
+
end
|
414
|
+
return @spreadsheet
|
415
|
+
end
|
416
|
+
|
327
417
|
# Returns content of the cell as String. Top-left cell is [1, 1].
|
328
418
|
def [](row, col)
|
329
419
|
return self.cells[[row, col]] || ""
|
@@ -548,6 +638,37 @@ module GoogleSpreadsheet
|
|
548
638
|
return !@modified.empty?
|
549
639
|
end
|
550
640
|
|
641
|
+
# Creates table for the worksheet and returns GoogleSpreadsheet::Table.
|
642
|
+
# See this document for details:
|
643
|
+
# http://code.google.com/intl/en/apis/spreadsheets/docs/3.0/developers_guide_protocol.html#TableFeeds
|
644
|
+
def add_table(table_title, summary, columns)
|
645
|
+
column_xml = ""
|
646
|
+
columns.each do |index, name|
|
647
|
+
column_xml += "<gs:column index='#{h(index)}' name='#{h(name)}'/>\n"
|
648
|
+
end
|
649
|
+
|
650
|
+
xml = <<-"EOS"
|
651
|
+
<entry xmlns="http://www.w3.org/2005/Atom"
|
652
|
+
xmlns:gs="http://schemas.google.com/spreadsheets/2006">
|
653
|
+
<title type='text'>#{h(table_title)}</title>
|
654
|
+
<summary type='text'>#{h(summary)}</summary>
|
655
|
+
<gs:worksheet name='#{h(self.title)}' />
|
656
|
+
<gs:header row='1' />
|
657
|
+
<gs:data numRows='0' startRow='2'>
|
658
|
+
#{column_xml}
|
659
|
+
</gs:data>
|
660
|
+
</entry>
|
661
|
+
EOS
|
662
|
+
|
663
|
+
result = @session.post(self.spreadsheet.tables_feed_url, xml)
|
664
|
+
return Table.new(@session, result)
|
665
|
+
end
|
666
|
+
|
667
|
+
# Returns list of tables for the workwheet.
|
668
|
+
def tables
|
669
|
+
return self.spreadsheet.tables.select(){ |t| t.worksheet_title == self.title }
|
670
|
+
end
|
671
|
+
|
551
672
|
end
|
552
673
|
|
553
674
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gimite-google-spreadsheet-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hiroshi Ichikawa
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-13 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|