roo 1.11.2 → 1.12.0

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.
@@ -1,59 +1,32 @@
1
1
  begin
2
- require "google_spreadsheet"
2
+ require "google_drive"
3
3
  rescue LoadError => e
4
- raise e, "Using Roo::Google requires the google-spreadsheet-ruby gem"
4
+ raise e, "Using Roo::Google requires the google_drive gem"
5
5
  end
6
6
 
7
- class GoogleHTTPError < RuntimeError; end
8
- class GoogleReadError < RuntimeError; end
9
- class GoogleWriteError < RuntimeError; end
10
-
11
- class Roo::Google < Roo::GenericSpreadsheet
7
+ class Roo::Google < Roo::Base
12
8
  attr_accessor :date_format, :datetime_format
13
9
 
14
- # Creates a new Google spreadsheet object.
15
- def initialize(spreadsheetkey,user=nil,password=nil)
16
- @filename = spreadsheetkey
17
- @spreadsheetkey = spreadsheetkey
18
- @user = user
19
- @password = password
20
- unless user
21
- user = ENV['GOOGLE_MAIL']
22
- end
23
- unless password
24
- password = ENV['GOOGLE_PASSWORD']
25
- end
26
- unless user and user.size > 0
27
- warn "user not set"
28
- end
29
- unless password and password.size > 0
30
- warn "password not set"
31
- end
10
+ # Creates a new Google Drive object.
11
+ def initialize(spreadsheet_key, options = {})
12
+ @filename = spreadsheet_key
13
+ @user = options[:user] || ENV['GOOGLE_MAIL']
14
+ @password = options[:password] || ENV['GOOGLE_PASSWORD']
15
+ @access_token = options[:access_token] || ENV['GOOGLE_TOKEN']
16
+
17
+ @worksheets = session.spreadsheet_by_key(@filename).worksheets
18
+ @sheets = @worksheets.map {|sheet| sheet.title }
19
+ super
32
20
  @cell = Hash.new {|h,k| h[k]=Hash.new}
33
21
  @cell_type = Hash.new {|h,k| h[k]=Hash.new}
34
22
  @formula = Hash.new
35
- @first_row = Hash.new
36
- @last_row = Hash.new
37
- @first_column = Hash.new
38
- @last_column = Hash.new
39
- @cells_read = Hash.new
40
- @header_line = 1
41
23
  @date_format = '%d/%m/%Y'
42
24
  @datetime_format = '%d/%m/%Y %H:%M:%S'
43
25
  @time_format = '%H:%M:%S'
44
- session = GoogleSpreadsheet.login(user, password)
45
- @sheetlist = []
46
- session.spreadsheet_by_key(@spreadsheetkey).worksheets.each { |sheet|
47
- @sheetlist << sheet.title
48
- }
49
- @default_sheet = self.sheets.first
50
- @worksheets = session.spreadsheet_by_key(@spreadsheetkey).worksheets
51
26
  end
52
27
 
53
28
  # returns an array of sheet names in the spreadsheet
54
- def sheets
55
- @sheetlist
56
- end
29
+ attr_reader :sheets
57
30
 
58
31
  def date?(string)
59
32
  Date.strptime(string, @date_format)
@@ -93,7 +66,7 @@ class Roo::Google < Roo::GenericSpreadsheet
93
66
  def cell(row, col, sheet=nil)
94
67
  sheet ||= @default_sheet
95
68
  validate_sheet!(sheet) #TODO: 2007-12-16
96
- read_cells(sheet) unless @cells_read[sheet]
69
+ read_cells(sheet)
97
70
  row,col = normalize(row,col)
98
71
  value = @cell[sheet]["#{row},#{col}"]
99
72
  if celltype(row,col,sheet) == :date
@@ -122,10 +95,10 @@ class Roo::Google < Roo::GenericSpreadsheet
122
95
  # * :datetime
123
96
  def celltype(row, col, sheet=nil)
124
97
  sheet ||= @default_sheet
125
- read_cells(sheet) unless @cells_read[sheet]
98
+ read_cells(sheet)
126
99
  row,col = normalize(row,col)
127
100
  if @formula.size > 0 && @formula[sheet]["#{row},#{col}"]
128
- return :formula
101
+ :formula
129
102
  else
130
103
  @cell_type[sheet]["#{row},#{col}"]
131
104
  end
@@ -136,22 +109,11 @@ class Roo::Google < Roo::GenericSpreadsheet
136
109
  # The method #formula? checks if there is a formula.
137
110
  def formula(row,col,sheet=nil)
138
111
  sheet ||= @default_sheet
139
- read_cells(sheet) unless @cells_read[sheet]
140
- row,col = normalize(row,col)
141
- if @formula[sheet]["#{row},#{col}"] == nil
142
- return nil
143
- else
144
- return @formula[sheet]["#{row},#{col}"]
145
- end
146
- end
147
-
148
- # true, if there is a formula
149
- def formula?(row,col,sheet=nil)
150
- sheet ||= @default_sheet
151
- read_cells(sheet) unless @cells_read[sheet]
112
+ read_cells(sheet)
152
113
  row,col = normalize(row,col)
153
- formula(row,col) != nil
114
+ @formula[sheet]["#{row},#{col}"] && @formula[sheet]["#{row},#{col}"]
154
115
  end
116
+ alias_method :formula?, :formula
155
117
 
156
118
  # true, if the cell is empty
157
119
  def empty?(row, col, sheet=nil)
@@ -247,6 +209,8 @@ class Roo::Google < Roo::GenericSpreadsheet
247
209
  def read_cells(sheet=nil)
248
210
  sheet ||= @default_sheet
249
211
  validate_sheet!(sheet)
212
+ return if @cells_read[sheet]
213
+
250
214
  sheet_no = sheets.index(sheet)
251
215
  ws = @worksheets[sheet_no]
252
216
  for row in 1..ws.num_rows
@@ -312,4 +276,17 @@ class Roo::Google < Roo::GenericSpreadsheet
312
276
  return rows.min, rows.max, cols.min, cols.max
313
277
  end
314
278
 
315
- end # class
279
+ def reinitialize
280
+ initialize(@filename, user: @user, password: @password, access_token: @access_token)
281
+ end
282
+
283
+ def session
284
+ @session ||= if @user && @password
285
+ GoogleDrive.login(@user, @password)
286
+ elsif @access_token
287
+ GoogleDrive.login_with_oauth(@access_token)
288
+ else
289
+ warn 'set user and password or access token'
290
+ end
291
+ end
292
+ end
@@ -1,10 +1,8 @@
1
- require 'fileutils'
2
1
  require 'date'
3
2
  require 'nokogiri'
4
3
  require 'cgi'
5
- require 'pp' #TODO
6
- class Roo::Openoffice < Roo::GenericSpreadsheet
7
4
 
5
+ class Roo::OpenOffice < Roo::Base
8
6
  class << self
9
7
  def extract_content(tmpdir, filename)
10
8
  Zip::ZipFile.open(filename) do |zip|
@@ -32,34 +30,35 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
32
30
 
33
31
  # initialization and opening of a spreadsheet file
34
32
  # values for packed: :zip
35
- def initialize(filename, packed=nil, file_warning=:error, tmpdir_root=nil)
36
- file_type_check(filename,'.ods','an Roo::Openoffice', file_warning, packed)
33
+ def initialize(filename, options={}, deprecated_file_warning=:error, deprecated_tmpdir_root=nil)
34
+ if Hash === options
35
+ packed = options[:packed]
36
+ file_warning = options[:file_warning] || :error
37
+ tmpdir_root = options[:tmpdir_root]
38
+ else
39
+ warn 'Supplying `packed`, `file_warning`, or `tmpdir_root` as separate arguments to `Roo::OpenOffice.new` is deprected. Use an options hash instead.'
40
+ packed = options
41
+ file_warning = deprecated_file_warning
42
+ tmpdir_root = deprecated_tmpdir_root
43
+ end
44
+
45
+ file_type_check(filename,'.ods','an Roo::OpenOffice', file_warning, packed)
37
46
  make_tmpdir(tmpdir_root) do |tmpdir|
38
- filename = open_from_uri(filename, tmpdir) if uri?(filename)
47
+ filename = download_uri(filename, tmpdir) if uri?(filename)
39
48
  filename = unzip(filename, tmpdir) if packed == :zip
40
- @cells_read = Hash.new
41
49
  #TODO: @cells_read[:default] = false
42
50
  @filename = filename
43
51
  unless File.file?(@filename)
44
52
  raise IOError, "file #{@filename} does not exist"
45
53
  end
46
54
  self.class.extract_content(tmpdir, @filename)
47
- @doc = File.open(File.join(tmpdir, "roo_content.xml")) do |file|
48
- Nokogiri::XML(file)
49
- end
55
+ @doc = load_xml(File.join(tmpdir, "roo_content.xml"))
50
56
  end
51
- @default_sheet = self.sheets.first
52
- @cell = Hash.new
53
- @cell_type = Hash.new
57
+ super(filename, options)
54
58
  @formula = Hash.new
55
- @first_row = Hash.new
56
- @last_row = Hash.new
57
- @first_column = Hash.new
58
- @last_column = Hash.new
59
59
  @style = Hash.new
60
60
  @style_defaults = Hash.new { |h,k| h[k] = [] }
61
61
  @style_definitions = Hash.new
62
- @header_line = 1
63
62
  @comment = Hash.new
64
63
  @comments_read = Hash.new
65
64
  end
@@ -82,7 +81,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
82
81
  # cell at the first line and first row.
83
82
  def cell(row, col, sheet=nil)
84
83
  sheet ||= @default_sheet
85
- read_cells(sheet) unless @cells_read[sheet]
84
+ read_cells(sheet)
86
85
  row,col = normalize(row,col)
87
86
  if celltype(row,col,sheet) == :date
88
87
  yyyy,mm,dd = @cell[sheet][[row,col]].to_s.split('-')
@@ -96,36 +95,17 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
96
95
  # The method #formula? checks if there is a formula.
97
96
  def formula(row,col,sheet=nil)
98
97
  sheet ||= @default_sheet
99
- read_cells(sheet) unless @cells_read[sheet]
100
- row,col = normalize(row,col)
101
- if @formula[sheet][[row,col]] == nil
102
- return nil
103
- else
104
- # return @formula[sheet][[row,col]]["oooc:".length..-1]
105
- # TODO:
106
- #str = @formula[sheet][[row,col]]
107
- #if str.include? ':'
108
- #return str[str.index(':')+1..-1]
109
- #else
110
- #return str
111
- #end
112
- @formula[sheet][[row,col]]
113
- end
114
- end
115
-
116
- # true, if there is a formula
117
- def formula?(row,col,sheet=nil)
118
- sheet ||= @default_sheet
119
- read_cells(sheet) unless @cells_read[sheet]
98
+ read_cells(sheet)
120
99
  row,col = normalize(row,col)
121
- formula(row,col) != nil
100
+ @formula[sheet][[row,col]]
122
101
  end
102
+ alias_method :formula?, :formula
123
103
 
124
104
  # returns each formula in the selected sheet as an array of elements
125
105
  # [row, col, formula]
126
106
  def formulas(sheet=nil)
127
107
  sheet ||= @default_sheet
128
- read_cells(sheet) unless @cells_read[sheet]
108
+ read_cells(sheet)
129
109
  if @formula[sheet]
130
110
  @formula[sheet].each.collect do |elem|
131
111
  [elem[0][0], elem[0][1], elem[1]]
@@ -154,7 +134,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
154
134
  # Given a cell, return the cell's style
155
135
  def font(row, col, sheet=nil)
156
136
  sheet ||= @default_sheet
157
- read_cells(sheet) unless @cells_read[sheet]
137
+ read_cells(sheet)
158
138
  row,col = normalize(row,col)
159
139
  style_name = @style[sheet][[row,col]] || @style_defaults[sheet][col - 1] || 'Default'
160
140
  @style_definitions[style_name]
@@ -170,7 +150,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
170
150
  # * :datetime
171
151
  def celltype(row,col,sheet=nil)
172
152
  sheet ||= @default_sheet
173
- read_cells(sheet) unless @cells_read[sheet]
153
+ read_cells(sheet)
174
154
  row,col = normalize(row,col)
175
155
  if @formula[sheet][[row,col]]
176
156
  return :formula
@@ -180,14 +160,12 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
180
160
  end
181
161
 
182
162
  def sheets
183
- return_sheets = []
184
- @doc.xpath("//*[local-name()='table']").each do |sheet|
185
- return_sheets << sheet.attributes["name"].value
163
+ @doc.xpath("//*[local-name()='table']").map do |sheet|
164
+ sheet.attributes["name"].value
186
165
  end
187
- return_sheets
188
166
  end
189
167
 
190
- # version of the Roo::Openoffice document
168
+ # version of the Roo::OpenOffice document
191
169
  # at 2007 this is always "1.0"
192
170
  def officeversion
193
171
  oo_version
@@ -198,7 +176,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
198
176
  # mainly for debugging purposes
199
177
  def to_s(sheet=nil)
200
178
  sheet ||= @default_sheet
201
- read_cells(sheet) unless @cells_read[sheet]
179
+ read_cells(sheet)
202
180
  @cell[sheet].inspect
203
181
  end
204
182
 
@@ -211,7 +189,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
211
189
  end
212
190
  if @label.has_key? labelname
213
191
  return @label[labelname][1].to_i,
214
- Roo::GenericSpreadsheet.letter_to_number(@label[labelname][2]),
192
+ Roo::Base.letter_to_number(@label[labelname][2]),
215
193
  @label[labelname][0]
216
194
  else
217
195
  return nil,nil,nil
@@ -225,7 +203,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
225
203
  @label.map do |label|
226
204
  [ label[0], # name
227
205
  [ label[1][1].to_i, # row
228
- Roo::GenericSpreadsheet.letter_to_number(label[1][2]), # column
206
+ Roo::Base.letter_to_number(label[1][2]), # column
229
207
  label[1][0], # sheet
230
208
  ] ]
231
209
  end
@@ -235,7 +213,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
235
213
  # nil if there is no comment
236
214
  def comment(row,col,sheet=nil)
237
215
  sheet ||= @default_sheet
238
- read_cells(sheet) unless @cells_read[sheet]
216
+ read_cells(sheet)
239
217
  row,col = normalize(row,col)
240
218
  return nil unless @comment[sheet]
241
219
  @comment[sheet][[row,col]]
@@ -244,7 +222,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
244
222
  # true, if there is a comment
245
223
  def comment?(row,col,sheet=nil)
246
224
  sheet ||= @default_sheet
247
- read_cells(sheet) unless @cells_read[sheet]
225
+ read_cells(sheet)
248
226
  row,col = normalize(row,col)
249
227
  comment(row,col) != nil
250
228
  end
@@ -277,7 +255,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
277
255
  def set_cell_values(sheet,x,y,i,v,value_type,formula,table_cell,str_v,style_name)
278
256
  key = [y,x+i]
279
257
  @cell_type[sheet] = {} unless @cell_type[sheet]
280
- @cell_type[sheet][key] = Roo::Openoffice.oo_type_2_roo_type(value_type)
258
+ @cell_type[sheet][key] = Roo::OpenOffice.oo_type_2_roo_type(value_type)
281
259
  @formula[sheet] = {} unless @formula[sheet]
282
260
  if formula
283
261
  ['of:', 'oooc:'].each do |prefix|
@@ -323,8 +301,9 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
323
301
  def read_cells(sheet=nil)
324
302
  sheet ||= @default_sheet
325
303
  validate_sheet!(sheet)
326
- sheet_found = false
304
+ return if @cells_read[sheet]
327
305
 
306
+ sheet_found = false
328
307
  @doc.xpath("//*[local-name()='table']").each do |ws|
329
308
  if sheet == attr(ws,'name')
330
309
  sheet_found = true
@@ -436,8 +415,8 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
436
415
  @comments_read[sheet] = true
437
416
  end
438
417
 
439
- # Only calls read_cells because Roo::GenericSpreadsheet calls read_comments
440
- # whereas the reading of comments is done in read_cells for Roo::Openoffice-objects
418
+ # Only calls read_cells because Roo::Base calls read_comments
419
+ # whereas the reading of comments is done in read_cells for Roo::OpenOffice-objects
441
420
  def read_comments(sheet=nil)
442
421
  read_cells(sheet)
443
422
  end
@@ -456,12 +435,12 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
456
435
  end
457
436
 
458
437
  def read_styles(style_elements)
459
- @style_definitions['Default'] = Roo::Openoffice::Font.new
438
+ @style_definitions['Default'] = Roo::OpenOffice::Font.new
460
439
  style_elements.each do |style|
461
440
  next unless style.name == 'style'
462
441
  style_name = attr(style,'name')
463
442
  style.each do |properties|
464
- font = Roo::Openoffice::Font.new
443
+ font = Roo::OpenOffice::Font.new
465
444
  font.bold = attr(properties,'font-weight')
466
445
  font.italic = attr(properties,'font-style')
467
446
  font.underline = attr(properties,'text-underline-style')
@@ -505,16 +484,13 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
505
484
  result
506
485
  end
507
486
 
508
-
509
- private
510
487
  def attr(node, attr_name)
511
488
  if node.attributes[attr_name]
512
489
  node.attributes[attr_name].value
513
490
  end
514
491
  end
515
-
516
492
  end # class
517
493
 
518
- # Libreoffice is just an alias for Roo::Openoffice class
519
- class Roo::Libreoffice < Roo::Openoffice
494
+ # LibreOffice is just an alias for Roo::OpenOffice class
495
+ class Roo::LibreOffice < Roo::OpenOffice
520
496
  end
@@ -1,3 +1,4 @@
1
+ warn "Roo's roo_rails_helper, aka the spreadsheet view method is currently deprecated with no replacement. If you find it helpful, tell http://github.com/Empact or extract it yourself."
1
2
  def spreadsheet(spreadsheet, sheets, options={})
2
3
  @rspreadsheet = spreadsheet
3
4
  coordinates = true # default
@@ -43,7 +44,7 @@ def spreadsheet(spreadsheet, sheets, options={})
43
44
  next
44
45
  end
45
46
  o << " <td>"
46
- o << " <b>#{Roo::GenericSpreadsheet.number_to_letter(c)}</b>"
47
+ o << " <b>#{Roo::Base.number_to_letter(c)}</b>"
47
48
  o << " </td>"
48
49
  }
49
50
  o << "</tr>"
@@ -1,21 +1,30 @@
1
1
  module Roo
2
2
  class Spreadsheet
3
3
  class << self
4
- def open(file)
4
+ def open(file, options = {})
5
5
  file = File === file ? file.path : file
6
- case File.extname(file).downcase
6
+
7
+ extension =
8
+ if options[:extension]
9
+ options[:file_warning] = :ignore
10
+ ".#{options[:extension]}"
11
+ else
12
+ File.extname(file)
13
+ end
14
+
15
+ case extension.downcase
7
16
  when '.xls'
8
- Roo::Excel.new(file)
17
+ Roo::Excel.new(file, options)
9
18
  when '.xlsx'
10
- Roo::Excelx.new(file)
19
+ Roo::Excelx.new(file, options)
11
20
  when '.ods'
12
- Roo::Openoffice.new(file)
21
+ Roo::OpenOffice.new(file, options)
13
22
  when '.xml'
14
- Roo::Excel2003XML.new(file)
23
+ Roo::Excel2003XML.new(file, options)
15
24
  when ''
16
- Roo::Google.new(file)
25
+ Roo::Google.new(file, options)
17
26
  when '.csv'
18
- Roo::Csv.new(file)
27
+ Roo::CSV.new(file, options)
19
28
  else
20
29
  raise ArgumentError, "Don't know how to open file #{file}"
21
30
  end