google-spreadsheet-ruby 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/google_spreadsheet.rb +127 -111
  2. metadata +6 -6
@@ -8,18 +8,22 @@ require "open-uri"
8
8
  require "cgi"
9
9
  require "uri"
10
10
  require "rubygems"
11
- require 'nokogiri'
12
-
11
+ require "nokogiri"
13
12
  require "oauth"
14
13
  Net::HTTP.version_1_2
15
14
 
16
15
  module GoogleSpreadsheet
17
-
16
+
18
17
  # Authenticates with given +mail+ and +password+, and returns GoogleSpreadsheet::Session
19
18
  # if succeeds. Raises GoogleSpreadsheet::AuthenticationError if fails.
20
19
  # Google Apps account is supported.
21
- def self.login(mail, password)
22
- return Session.login(mail, password)
20
+ #
21
+ # +proxy+ can be nil or return value of Net::HTTP.Proxy. If +proxy+ is specified, all
22
+ # HTTP access in the session uses the proxy. If +proxy+ is nil, it uses the proxy
23
+ # specified by http_proxy environment variable if available. Otherwise it performs direct
24
+ # access.
25
+ def self.login(mail, password, proxy = nil)
26
+ return Session.login(mail, password, proxy)
23
27
  end
24
28
 
25
29
  # Authenticates with given OAuth token.
@@ -48,8 +52,10 @@ module GoogleSpreadsheet
48
52
  # If +path+ doesn't exist or authentication has failed, prompts mail and password on console,
49
53
  # authenticates with them, stores the session to +path+ and returns it.
50
54
  #
55
+ # See login for description of parameter +proxy+.
56
+ #
51
57
  # This method requires Highline library: http://rubyforge.org/projects/highline/
52
- def self.saved_session(path = ENV["HOME"] + "/.ruby_google_spreadsheet.token")
58
+ def self.saved_session(path = ENV["HOME"] + "/.ruby_google_spreadsheet.token", proxy = nil)
53
59
  tokens = {}
54
60
  if File.exist?(path)
55
61
  open(path) do |f|
@@ -59,7 +65,7 @@ module GoogleSpreadsheet
59
65
  end
60
66
  end
61
67
  end
62
- session = Session.new(tokens)
68
+ session = Session.new(tokens, nil, proxy)
63
69
  session.on_auth_fail = proc() do
64
70
  begin
65
71
  require "highline"
@@ -85,45 +91,45 @@ module GoogleSpreadsheet
85
91
  end
86
92
  return session
87
93
  end
88
-
89
-
94
+
95
+
90
96
  module Util #:nodoc:
91
-
97
+
92
98
  module_function
93
-
99
+
94
100
  def encode_query(params)
95
101
  return params.map(){ |k, v| CGI.escape(k) + "=" + CGI.escape(v) }.join("&")
96
102
  end
97
-
103
+
98
104
  def h(str)
99
105
  return CGI.escapeHTML(str.to_s())
100
106
  end
101
-
107
+
102
108
  end
103
-
104
-
109
+
110
+
105
111
  # Raised when spreadsheets.google.com has returned error.
106
112
  class Error < RuntimeError
107
-
113
+
108
114
  end
109
-
110
-
115
+
116
+
111
117
  # Raised when GoogleSpreadsheet.login has failed.
112
118
  class AuthenticationError < GoogleSpreadsheet::Error
113
-
119
+
114
120
  end
115
-
116
-
121
+
122
+
117
123
  # Use GoogleSpreadsheet.login or GoogleSpreadsheet.saved_session to get
118
124
  # GoogleSpreadsheet::Session object.
119
125
  class Session
120
-
126
+
121
127
  include(Util)
122
128
  extend(Util)
123
-
129
+
124
130
  # The same as GoogleSpreadsheet.login.
125
- def self.login(mail, password)
126
- session = Session.new()
131
+ def self.login(mail, password, proxy = nil)
132
+ session = Session.new(nil, nil, proxy)
127
133
  session.login(mail, password)
128
134
  return session
129
135
  end
@@ -134,9 +140,19 @@ module GoogleSpreadsheet
134
140
  end
135
141
 
136
142
  # Restores session using return value of auth_tokens method of previous session.
137
- def initialize(auth_tokens = nil, oauth_token = nil)
143
+ #
144
+ # See GoogleSpreadsheet.login for description of parameter +proxy+.
145
+ def initialize(auth_tokens = nil, oauth_token = nil, proxy = nil)
138
146
  @oauth_token = oauth_token
139
147
  @auth_tokens = auth_tokens || {}
148
+ if proxy
149
+ @proxy = proxy
150
+ elsif ENV["http_proxy"] && !ENV["http_proxy"].empty?
151
+ proxy_url = URI.parse(ENV["http_proxy"])
152
+ @proxy = Net::HTTP.Proxy(proxy_url.host, proxy_url.port)
153
+ else
154
+ @proxy = Net::HTTP
155
+ end
140
156
  end
141
157
 
142
158
  # Authenticates with given +mail+ and +password+, and updates current session object
@@ -152,19 +168,19 @@ module GoogleSpreadsheet
152
168
  raise(AuthenticationError, "authentication failed for #{mail}: #{ex.message}")
153
169
  end
154
170
  end
155
-
171
+
156
172
  # Authentication tokens.
157
173
  attr_reader(:auth_tokens)
158
-
174
+
159
175
  # Authentication token.
160
176
  def auth_token(auth = :wise)
161
177
  return @auth_tokens[auth]
162
178
  end
163
-
179
+
164
180
  # Proc or Method called when authentication has failed.
165
181
  # When this function returns +true+, it tries again.
166
182
  attr_accessor :on_auth_fail
167
-
183
+
168
184
  def auth_header(auth) #:nodoc:
169
185
  token = auth == :none ? nil : @auth_tokens[auth]
170
186
  if token
@@ -193,7 +209,7 @@ module GoogleSpreadsheet
193
209
  end
194
210
  return result
195
211
  end
196
-
212
+
197
213
  # Returns GoogleSpreadsheet::Spreadsheet with given +key+.
198
214
  #
199
215
  # e.g.
@@ -203,7 +219,7 @@ module GoogleSpreadsheet
203
219
  url = "https://spreadsheets.google.com/feeds/worksheets/#{key}/private/full"
204
220
  return Spreadsheet.new(self, url)
205
221
  end
206
-
222
+
207
223
  # Returns GoogleSpreadsheet::Spreadsheet with given +url+. You must specify either of:
208
224
  # - URL of the page you open to access the spreadsheet in your browser
209
225
  # - URL of worksheet-based feed of the spreadseet
@@ -224,7 +240,7 @@ module GoogleSpreadsheet
224
240
  # Assumes the URL is worksheets feed URL.
225
241
  return Spreadsheet.new(self, url)
226
242
  end
227
-
243
+
228
244
  # Returns GoogleSpreadsheet::Worksheet with given +url+.
229
245
  # You must specify URL of cell-based feed of the worksheet.
230
246
  #
@@ -234,7 +250,7 @@ module GoogleSpreadsheet
234
250
  def worksheet_by_url(url)
235
251
  return Worksheet.new(self, nil, url)
236
252
  end
237
-
253
+
238
254
  # Creates new spreadsheet and returns the new GoogleSpreadsheet::Spreadsheet.
239
255
  #
240
256
  # e.g.
@@ -255,7 +271,7 @@ module GoogleSpreadsheet
255
271
  "link[@rel='http://schemas.google.com/spreadsheets/2006#worksheetsfeed']").first['href']
256
272
  return Spreadsheet.new(self, ss_url, title)
257
273
  end
258
-
274
+
259
275
  def request(method, url, params = {}) #:nodoc:
260
276
  # Always uses HTTPS.
261
277
  url = url.gsub(%r{^http://}, "https://")
@@ -269,7 +285,7 @@ module GoogleSpreadsheet
269
285
  extra_header = {}
270
286
  end
271
287
  response_type = params[:response_type] || :xml
272
-
288
+
273
289
  while true
274
290
  response = request_raw(method, url, data, extra_header, auth)
275
291
  if response.code == "401" && @on_auth_fail && @on_auth_fail.call()
@@ -284,9 +300,9 @@ module GoogleSpreadsheet
284
300
  return convert_response(response, response_type)
285
301
  end
286
302
  end
287
-
303
+
288
304
  private
289
-
305
+
290
306
  def request_raw(method, url, data, extra_header, auth)
291
307
  if @oauth_token
292
308
  if method == :delete || method == :get
@@ -296,7 +312,7 @@ module GoogleSpreadsheet
296
312
  end
297
313
  else
298
314
  uri = URI.parse(url)
299
- http = Net::HTTP.new(uri.host, uri.port)
315
+ http = @proxy.new(uri.host, uri.port)
300
316
  http.use_ssl = true
301
317
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
302
318
  http.start() do
@@ -310,7 +326,7 @@ module GoogleSpreadsheet
310
326
  end
311
327
  end
312
328
  end
313
-
329
+
314
330
  def convert_response(response, response_type)
315
331
  case response_type
316
332
  when :xml
@@ -321,7 +337,7 @@ module GoogleSpreadsheet
321
337
  raise("unknown params[:response_type]: %s" % response_type)
322
338
  end
323
339
  end
324
-
340
+
325
341
  def authenticate(mail, password, auth)
326
342
  params = {
327
343
  "accountType" => "HOSTED_OR_GOOGLE",
@@ -336,28 +352,28 @@ module GoogleSpreadsheet
336
352
  :data => encode_query(params), :auth => :none, :header => header, :response_type => :raw)
337
353
  @auth_tokens[auth] = response.slice(/^Auth=(.*)$/, 1)
338
354
  end
339
-
355
+
340
356
  end
341
-
342
-
357
+
358
+
343
359
  # Use methods in GoogleSpreadsheet::Session to get GoogleSpreadsheet::Spreadsheet object.
344
360
  class Spreadsheet
345
-
361
+
346
362
  include(Util)
347
-
363
+
348
364
  def initialize(session, worksheets_feed_url, title = nil) #:nodoc:
349
365
  @session = session
350
366
  @worksheets_feed_url = worksheets_feed_url
351
367
  @title = title
352
368
  end
353
-
369
+
354
370
  # URL of worksheet-based feed of the spreadsheet.
355
371
  attr_reader(:worksheets_feed_url)
356
-
372
+
357
373
  # Title of the spreadsheet. So far only available if you get this object by
358
374
  # GoogleSpreadsheet::Session#spreadsheets.
359
375
  attr_reader(:title)
360
-
376
+
361
377
  # Key of the spreadsheet.
362
378
  def key
363
379
  if !(@worksheets_feed_url =~
@@ -367,7 +383,7 @@ module GoogleSpreadsheet
367
383
  end
368
384
  return $1
369
385
  end
370
-
386
+
371
387
  # Tables feed URL of the spreadsheet.
372
388
  def tables_feed_url
373
389
  return "https://spreadsheets.google.com/feeds/#{self.key}/tables"
@@ -383,7 +399,7 @@ module GoogleSpreadsheet
383
399
  new_name ||= (@title ? "Copy of " + @title : "Untitled")
384
400
  get_url = "https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=#{key}&exportFormat=ods"
385
401
  ods = @session.request(:get, get_url, :response_type => :raw)
386
-
402
+
387
403
  url = "https://docs.google.com/feeds/documents/private/full"
388
404
  header = {
389
405
  "Content-Type" => "application/x-vnd.oasis.opendocument.spreadsheet",
@@ -394,7 +410,7 @@ module GoogleSpreadsheet
394
410
  "link[@rel='http://schemas.google.com/spreadsheets/2006#worksheetsfeed']").first['href']
395
411
  return Spreadsheet.new(@session, ss_url, title)
396
412
  end
397
-
413
+
398
414
  # If +permanent+ is +false+, moves the spreadsheet to the trash.
399
415
  # If +permanent+ is +true+, deletes the spreadsheet permanently.
400
416
  def delete(permanent = false)
@@ -402,7 +418,7 @@ module GoogleSpreadsheet
402
418
  self.document_feed_url + (permanent ? "?delete=true" : ""),
403
419
  :auth => :writely, :header => {"If-Match" => "*"})
404
420
  end
405
-
421
+
406
422
  # Renames title of the spreadsheet.
407
423
  def rename(title)
408
424
  doc = @session.request(:get, self.document_feed_url)
@@ -420,7 +436,7 @@ module GoogleSpreadsheet
420
436
 
421
437
  @session.request(:put, edit_url, :data => xml)
422
438
  end
423
-
439
+
424
440
  # Returns worksheets of the spreadsheet as array of GoogleSpreadsheet::Worksheet.
425
441
  def worksheets
426
442
  doc = @session.request(:get, @worksheets_feed_url)
@@ -433,7 +449,7 @@ module GoogleSpreadsheet
433
449
  end
434
450
  return result.freeze()
435
451
  end
436
-
452
+
437
453
  # Adds a new worksheet to the spreadsheet. Returns added GoogleSpreadsheet::Worksheet.
438
454
  def add_worksheet(title, max_rows = 100, max_cols = 20)
439
455
  xml = <<-"EOS"
@@ -449,19 +465,19 @@ module GoogleSpreadsheet
449
465
  "link[@rel='http://schemas.google.com/spreadsheets/2006#cellsfeed']").first['href']
450
466
  return Worksheet.new(@session, self, url, title)
451
467
  end
452
-
468
+
453
469
  # Returns list of tables in the spreadsheet.
454
470
  def tables
455
471
  doc = @session.request(:get, self.tables_feed_url)
456
472
  return doc.css('entry').map(){ |e| Table.new(@session, e) }.freeze()
457
473
  end
458
-
474
+
459
475
  end
460
-
476
+
461
477
  # Use GoogleSpreadsheet::Worksheet#add_table to create table.
462
478
  # Use GoogleSpreadsheet::Worksheet#tables to get GoogleSpreadsheet::Table objects.
463
479
  class Table
464
-
480
+
465
481
  include(Util)
466
482
 
467
483
  def initialize(session, entry) #:nodoc:
@@ -471,7 +487,7 @@ module GoogleSpreadsheet
471
487
  @edit_url = entry.css("link[@rel='edit']")[0]['href']
472
488
  @session = session
473
489
  end
474
-
490
+
475
491
  # Title of the worksheet the table belongs to.
476
492
  attr_reader(:worksheet_title)
477
493
 
@@ -490,49 +506,49 @@ module GoogleSpreadsheet
490
506
  EOS
491
507
  @session.request(:post, @records_url, :data => xml)
492
508
  end
493
-
509
+
494
510
  # Returns records in the table.
495
511
  def records
496
512
  doc = @session.request(:get, @records_url)
497
513
  return doc.css('entry').map(){ |e| Record.new(@session, e) }
498
514
  end
499
-
515
+
500
516
  # Deletes this table. Deletion takes effect right away without calling save().
501
517
  def delete
502
518
  @session.request(:delete, @edit_url, :header => {"If-Match" => "*"})
503
519
  end
504
-
520
+
505
521
  end
506
-
522
+
507
523
  # Use GoogleSpreadsheet::Table#records to get GoogleSpreadsheet::Record objects.
508
524
  class Record < Hash
509
525
  include(Util)
510
-
526
+
511
527
  def initialize(session, entry) #:nodoc:
512
528
  @session = session
513
529
  entry.css('gs|field').each() do |field|
514
530
  self[field["name"]] = field.inner_text
515
531
  end
516
532
  end
517
-
533
+
518
534
  def inspect #:nodoc:
519
535
  content = self.map(){ |k, v| "%p => %p" % [k, v] }.join(", ")
520
536
  return "\#<%p:{%s}>" % [self.class, content]
521
537
  end
522
-
538
+
523
539
  end
524
-
540
+
525
541
  # Use GoogleSpreadsheet::Spreadsheet#worksheets to get GoogleSpreadsheet::Worksheet object.
526
542
  class Worksheet
527
-
543
+
528
544
  include(Util)
529
-
545
+
530
546
  def initialize(session, spreadsheet, cells_feed_url, title = nil) #:nodoc:
531
547
  @session = session
532
548
  @spreadsheet = spreadsheet
533
549
  @cells_feed_url = cells_feed_url
534
550
  @title = title
535
-
551
+
536
552
  @cells = nil
537
553
  @input_values = nil
538
554
  @modified = Set.new()
@@ -540,7 +556,7 @@ module GoogleSpreadsheet
540
556
 
541
557
  # URL of cell-based feed of the worksheet.
542
558
  attr_reader(:cells_feed_url)
543
-
559
+
544
560
  # URL of worksheet feed URL of the worksheet.
545
561
  def worksheet_feed_url
546
562
  # I don't know good way to get worksheet feed URL from cells feed URL.
@@ -553,7 +569,7 @@ module GoogleSpreadsheet
553
569
  end
554
570
  return "https://spreadsheets.google.com/feeds/worksheets/#{$1}/private/full/#{$2}"
555
571
  end
556
-
572
+
557
573
  # GoogleSpreadsheet::Spreadsheet which this worksheet belongs to.
558
574
  def spreadsheet
559
575
  if !@spreadsheet
@@ -566,12 +582,12 @@ module GoogleSpreadsheet
566
582
  end
567
583
  return @spreadsheet
568
584
  end
569
-
585
+
570
586
  # Returns content of the cell as String. Top-left cell is [1, 1].
571
587
  def [](row, col)
572
588
  return self.cells[[row, col]] || ""
573
589
  end
574
-
590
+
575
591
  # Updates content of the cell.
576
592
  # Note that update is not sent to the server until you call save().
577
593
  # Top-left cell is [1, 1].
@@ -587,7 +603,7 @@ module GoogleSpreadsheet
587
603
  self.max_rows = row if row > @max_rows
588
604
  self.max_cols = col if col > @max_cols
589
605
  end
590
-
606
+
591
607
  # Returns the value or the formula of the cell. Top-left cell is [1, 1].
592
608
  #
593
609
  # If user input "=A1+B1" to cell [1, 3], worksheet[1, 3] is "3" for example and
@@ -596,25 +612,25 @@ module GoogleSpreadsheet
596
612
  reload() if !@cells
597
613
  return @input_values[[row, col]] || ""
598
614
  end
599
-
615
+
600
616
  # Row number of the bottom-most non-empty row.
601
617
  def num_rows
602
618
  reload() if !@cells
603
619
  return @cells.keys.map(){ |r, c| r }.max || 0
604
620
  end
605
-
621
+
606
622
  # Column number of the right-most non-empty column.
607
623
  def num_cols
608
624
  reload() if !@cells
609
625
  return @cells.keys.map(){ |r, c| c }.max || 0
610
626
  end
611
-
627
+
612
628
  # Number of rows including empty rows.
613
629
  def max_rows
614
630
  reload() if !@cells
615
631
  return @max_rows
616
632
  end
617
-
633
+
618
634
  # Updates number of rows.
619
635
  # Note that update is not sent to the server until you call save().
620
636
  def max_rows=(rows)
@@ -622,13 +638,13 @@ module GoogleSpreadsheet
622
638
  @max_rows = rows
623
639
  @meta_modified = true
624
640
  end
625
-
641
+
626
642
  # Number of columns including empty columns.
627
643
  def max_cols
628
644
  reload() if !@cells
629
645
  return @max_cols
630
646
  end
631
-
647
+
632
648
  # Updates number of columns.
633
649
  # Note that update is not sent to the server until you call save().
634
650
  def max_cols=(cols)
@@ -636,13 +652,13 @@ module GoogleSpreadsheet
636
652
  @max_cols = cols
637
653
  @meta_modified = true
638
654
  end
639
-
655
+
640
656
  # Title of the worksheet (shown as tab label in Web interface).
641
657
  def title
642
658
  reload() if !@title
643
659
  return @title
644
660
  end
645
-
661
+
646
662
  # Updates title of the worksheet.
647
663
  # Note that update is not sent to the server until you call save().
648
664
  def title=(title)
@@ -650,12 +666,12 @@ module GoogleSpreadsheet
650
666
  @title = title
651
667
  @meta_modified = true
652
668
  end
653
-
669
+
654
670
  def cells #:nodoc:
655
671
  reload() if !@cells
656
672
  return @cells
657
673
  end
658
-
674
+
659
675
  # An array of spreadsheet rows. Each row contains an array of
660
676
  # columns. Note that resulting array is 0-origin so
661
677
  # worksheet.rows[0][0] == worksheet[1, 1].
@@ -666,7 +682,7 @@ module GoogleSpreadsheet
666
682
  end
667
683
  return result.freeze()
668
684
  end
669
-
685
+
670
686
  # Reloads content of the worksheets from the server.
671
687
  # Note that changes you made by []= is discarded if you haven't called save().
672
688
  def reload()
@@ -674,7 +690,7 @@ module GoogleSpreadsheet
674
690
  @max_rows = doc.css('gs|rowCount').text.to_i
675
691
  @max_cols = doc.css('gs|colCount').text.to_i
676
692
  @title = doc.css('feed > title')[0].text
677
-
693
+
678
694
  @cells = {}
679
695
  @input_values = {}
680
696
  doc.css('feed > entry').each() do |entry|
@@ -683,19 +699,19 @@ module GoogleSpreadsheet
683
699
  col = cell["col"].to_i()
684
700
  @cells[[row, col]] = cell.inner_text
685
701
  @input_values[[row, col]] = cell["inputValue"]
686
-
702
+
687
703
  end
688
704
  @modified.clear()
689
705
  @meta_modified = false
690
706
  return true
691
707
  end
692
-
708
+
693
709
  # Saves your changes made by []=, etc. to the server.
694
710
  def save()
695
711
  sent = false
696
-
712
+
697
713
  if @meta_modified
698
-
714
+
699
715
  ws_doc = @session.request(:get, self.worksheet_feed_url)
700
716
  edit_url = ws_doc.css("link[@rel='edit']").first['href']
701
717
  xml = <<-"EOS"
@@ -706,16 +722,16 @@ module GoogleSpreadsheet
706
722
  <gs:colCount>#{h(self.max_cols)}</gs:colCount>
707
723
  </entry>
708
724
  EOS
709
-
725
+
710
726
  @session.request(:put, edit_url, :data => xml)
711
-
727
+
712
728
  @meta_modified = false
713
729
  sent = true
714
-
730
+
715
731
  end
716
-
732
+
717
733
  if !@modified.empty?
718
-
734
+
719
735
  # Gets id and edit URL for each cell.
720
736
  # Note that return-empty=true is required to get those info for empty cells.
721
737
  cell_entries = {}
@@ -730,11 +746,11 @@ module GoogleSpreadsheet
730
746
  col = entry.css('gs|cell').first['col'].to_i
731
747
  cell_entries[[row, col]] = entry
732
748
  end
733
-
749
+
734
750
  # Updates cell values using batch operation.
735
751
  # If the data is large, we split it into multiple operations, otherwise batch may fail.
736
752
  @modified.each_slice(250) do |chunk|
737
-
753
+
738
754
  xml = <<-EOS
739
755
  <feed xmlns="http://www.w3.org/2005/Atom"
740
756
  xmlns:batch="http://schemas.google.com/gdata/batch"
@@ -760,7 +776,7 @@ module GoogleSpreadsheet
760
776
  xml << <<-"EOS"
761
777
  </feed>
762
778
  EOS
763
-
779
+
764
780
  result = @session.request(:post, "#{@cells_feed_url}/batch", :data => xml)
765
781
  result.css('atom|entry').each() do |entry|
766
782
  interrupted = entry.css('batch|interrupted').first
@@ -773,41 +789,41 @@ module GoogleSpreadsheet
773
789
  [entry.css('atom|id').text, entry.css('batch|status').first['reason']])
774
790
  end
775
791
  end
776
-
792
+
777
793
  end
778
-
794
+
779
795
  @modified.clear()
780
796
  sent = true
781
-
797
+
782
798
  end
783
799
  return sent
784
800
  end
785
-
801
+
786
802
  # Calls save() and reload().
787
803
  def synchronize()
788
804
  save()
789
805
  reload()
790
806
  end
791
-
807
+
792
808
  # Deletes this worksheet. Deletion takes effect right away without calling save().
793
809
  def delete()
794
810
  ws_doc = @session.request(:get, self.worksheet_feed_url)
795
811
  edit_url = ws_doc.css("link[@rel='edit']").first['href']
796
812
  @session.request(:delete, edit_url)
797
813
  end
798
-
814
+
799
815
  # Returns true if you have changes made by []= which haven't been saved.
800
816
  def dirty?
801
817
  return !@modified.empty?
802
818
  end
803
-
819
+
804
820
  # Creates table for the worksheet and returns GoogleSpreadsheet::Table.
805
821
  # See this document for details:
806
822
  # http://code.google.com/intl/en/apis/spreadsheets/docs/3.0/developers_guide_protocol.html#TableFeeds
807
823
  def add_table(table_title, summary, columns, options)
808
824
  default_options = { :header_row => 1, :num_rows => 0, :start_row => 2}
809
825
  options = default_options.merge(options)
810
-
826
+
811
827
  column_xml = ""
812
828
  columns.each() do |index, name|
813
829
  column_xml += "<gs:column index='#{h(index)}' name='#{h(name)}'/>\n"
@@ -829,7 +845,7 @@ module GoogleSpreadsheet
829
845
  result = @session.request(:post, self.spreadsheet.tables_feed_url, :data => xml)
830
846
  return Table.new(@session, result)
831
847
  end
832
-
848
+
833
849
  # Returns list of tables for the workwheet.
834
850
  def tables
835
851
  return self.spreadsheet.tables.select(){ |t| t.worksheet_title == self.title }
@@ -846,6 +862,6 @@ module GoogleSpreadsheet
846
862
  end
847
863
 
848
864
  end
849
-
850
-
865
+
866
+
851
867
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-spreadsheet-ruby
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 2
10
- version: 0.1.2
9
+ - 3
10
+ version: 0.1.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Hiroshi Ichikawa
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-24 00:00:00 +09:00
18
+ date: 2011-05-06 00:00:00 +09:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -64,7 +64,7 @@ files:
64
64
  - README.rdoc
65
65
  - lib/google_spreadsheet.rb
66
66
  has_rdoc: true
67
- homepage: http://github.com/gimite/google-spreadsheet-ruby/tree/master
67
+ homepage: https://github.com/gimite/google-spreadsheet-ruby
68
68
  licenses: []
69
69
 
70
70
  post_install_message:
@@ -96,7 +96,7 @@ requirements: []
96
96
  rubyforge_project:
97
97
  rubygems_version: 1.3.7
98
98
  signing_key:
99
- specification_version: 2
99
+ specification_version: 3
100
100
  summary: This is a library to read/write Google Spreadsheet.
101
101
  test_files: []
102
102