roo 1.9.3 → 1.9.4

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,3 +1,15 @@
1
+ == 1.9.4 2011-06-23
2
+
3
+ * 1 enhancement
4
+ * removed gem 'builder'. Functionality goes to gem 'nokogiri'.
5
+ * 3 bugfixes
6
+ * Excel: remove temporary files if spreadsheed-file is not an excel file
7
+ and an exception was raised
8
+ * Excelx: a referenced cell with a string had the content 0.0 not the
9
+ correct string
10
+ * Fixed a problem with a date cell which was not recognized as a Date
11
+ object (see 2011-05-21 in excelx.rb)
12
+
1
13
  == 1.9.3 2010-02-12
2
14
 
3
15
  * 1 enhancements
data/README.txt CHANGED
@@ -20,6 +20,9 @@ under Linux without having to install the MS office suite.
20
20
  Roo implements read access for all spreadsheet types and read/write access for
21
21
  Google spreadsheets.
22
22
 
23
+ == SUPPORT ROO DEVELOPMENT:
24
+
25
+ If you want to support the further development of the Roo gem, send Bitcoins to the address <code>1KecEuitSFZwx2towBcwbBXmaY5eYjJC9h</code>
23
26
 
24
27
  == SYNOPSIS:
25
28
 
data/Rakefile CHANGED
@@ -1,95 +1,31 @@
1
- begin
2
- require 'bones'
3
- rescue LoadError
4
- abort '### Please install the "bones" gem ###'
5
- end
6
-
7
- ensure_in_path 'lib'
8
- require 'roo'
9
-
10
- task :default => 'test:run'
11
- # task 'gem:release' => 'test:run'
12
-
13
- Bones {
14
- name 'roo'
15
- authors 'Thomas Preymesser'
16
- email 'thopre@gmail.com'
17
- url 'http://roo.rubyforge.org/'
18
- version Roo::VERSION
19
- dependencies = [
20
- # ['xmlsimple', '>= 0.0.1'],
21
- ['spreadsheet', '> 0.6.4'],
22
- #--
23
- # rel. 0.6.4 causes an invalid Date error if we
24
- # have a datetime value of 2006-02-02 10:00:00
25
- #++
26
- ['nokogiri', '>= 0.0.1'],
27
- ['builder', '>= 2.1.2'],
28
- ['gimite-google-spreadsheet-ruby','>= 0.0.5'],
29
- ['febeling-rubyzip','>= 0.9.2'], # meine aktuelle Version
30
- ]
31
- }
32
-
33
- =begin
34
- PROJ.gem.dependencies = [
35
- # ['xmlsimple', '>= 0.0.1'],
36
- ['spreadsheet', '> 0.6.4'],
37
- #--
38
- # rel. 0.6.4 causes an invalid Date error if we
39
- # have a datetime value of 2006-02-02 10:00:00
40
- #++
41
- ['nokogiri', '>= 0.0.1'],
42
- ['builder', '>= 2.1.2'],
43
- ['gimite-google-spreadsheet-ruby','>= 0.0.5'],
44
- ['febeling-rubyzip','>= 0.9.2'], # meine aktuelle Version
45
- ]
46
- =end
47
-
48
- # EOF
49
- __END__
50
- # Look in the tasks/setup.rb file for the various options that can be
51
- # configured in this Rakefile. The .rake files in the tasks directory
52
- # are where the options are used.
53
-
54
- begin
55
- require 'bones'
56
- # Bones.setup
57
- rescue LoadError
58
- begin
59
- load 'tasks/setup.rb'
60
- rescue LoadError
61
- raise RuntimeError, '### please install the "bones" gem ###'
62
- end
63
- end
64
-
65
- ensure_in_path 'lib'
66
- module GData
67
- class Base
68
- end
69
- end
70
- require 'roo'
71
-
72
- task :default => 'spec:run'
73
-
74
- PROJ.name = 'roo'
75
- PROJ.authors = 'Thomas Preymesser'
76
- PROJ.email = 'thopre@gmail.com'
77
- PROJ.url = 'http://roo.rubyforge.org/'
78
- PROJ.version = Roo::VERSION
79
- PROJ.rubyforge.name = 'roo'
80
- PROJ.gem.dependencies = [
81
- # ['xmlsimple', '>= 0.0.1'],
82
- ['spreadsheet', '> 0.6.4'],
83
- #--
84
- # rel. 0.6.4 causes an invalid Date error if we
85
- # have a datetime value of 2006-02-02 10:00:00
86
- #++
87
- ['nokogiri', '>= 0.0.1'],
88
- ['builder', '>= 2.1.2'],
89
- ['gimite-google-spreadsheet-ruby','>= 0.0.5'],
90
- ['febeling-rubyzip','>= 0.9.2'], # meine aktuelle Version
91
- ]
92
-
93
- PROJ.spec.opts << '--color'
94
-
95
- # EOF
1
+ begin
2
+ require 'bones'
3
+ rescue LoadError
4
+ puts '### Please install the "bones" gem ###'
5
+ end
6
+
7
+ ensure_in_path 'lib'
8
+ require 'roo'
9
+
10
+ task :default => 'test:run'
11
+ # task 'gem:release' => 'test:run'
12
+
13
+ Bones {
14
+ name 'roo'
15
+ authors 'Thomas Preymesser'
16
+ email 'thopre@gmail.com'
17
+ url 'http://roo.rubyforge.org/'
18
+ version Roo::VERSION
19
+ depend_on 'spreadsheet', '> 0.6.4'
20
+ #--
21
+ # rel. 0.6.4 causes an invalid Date error if we
22
+ # have a datetime value of 2006-02-02 10:00:00
23
+ #++
24
+ depend_on 'nokogiri' #, '>= 0.0.1'
25
+ #TODO: brauchen wir das noch? depend_on 'gimite-google-spreadsheet-ruby','>= 0.0.5'
26
+ #depend_on 'febeling-rubyzip','>= 0.9.2' # meine aktuelle Version
27
+ #TODO: warum brauchen wir das? es lief doch auch vorher ohne dieses spezielle gem
28
+ depend_on 'google-spreadsheet-ruby'
29
+ }
30
+
31
+ # EOF
data/TODO ADDED
@@ -0,0 +1,2 @@
1
+ - replace builder gem with Nokogiri:Builder
2
+ - New parameter at #new specifying the name of the directory for the roo temporary files
data/a.xls ADDED
Binary file
data/bin/roo CHANGED
@@ -4,5 +4,5 @@ require File.expand_path(
4
4
  File.join(File.dirname(__FILE__), %w[.. lib roo]))
5
5
 
6
6
  # Put your code here
7
-
7
+ puts "the executable #{$0} does currently nothing"
8
8
  # EOF
data/lib/roo.rb CHANGED
@@ -1,8 +1,9 @@
1
+ # require 'todo_gem'
1
2
 
2
3
  module Roo
3
4
 
4
5
  # :stopdoc:
5
- VERSION = '1.9.3'
6
+ VERSION = '1.9.4'
6
7
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
7
8
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
8
9
  # :startdoc:
@@ -109,16 +109,33 @@ class Excel < GenericSpreadsheet
109
109
  filename = open_from_stream(filename[7..-1]) if filename[0,7] == "stream:"
110
110
  filename = unzip(filename) if packed and packed == :zip
111
111
  begin
112
+ begin
112
113
  file_type_check(filename,'.xls','an Excel')
114
+ rescue TypeError
115
+ FileUtils::rm_r @tmpdir
116
+ raise
117
+ end
113
118
  @filename = filename
114
119
  unless File.file?(@filename)
115
120
  raise IOError, "file #{@filename} does not exist"
116
121
  end
117
- @workbook = Spreadsheet.open(filename)
122
+ begin
123
+ @workbook = Spreadsheet.open(filename)
124
+ rescue Ole::Storage::FormatError
125
+ FileUtils::rm_r(@tmpdir)
126
+ raise # nach aussen weiterhin sichtbar
127
+ end
118
128
  @default_sheet = self.sheets.first
119
129
  ensure
120
130
  #if ENV["roo_local"] != "thomas-p"
121
- FileUtils::rm_r(@tmpdir)
131
+ # ich glaube ich darf hier noch nicht die temporaere
132
+ # Datei loeschen, weil
133
+ #to do
134
+ #"Loeschen temp. Directory anpassen"
135
+ #end
136
+ #if fremdrechner?
137
+ #FileUtils::rm_r(@tmpdir)
138
+ #end
122
139
  #end
123
140
  end
124
141
  @cell = Hash.new
@@ -156,7 +173,12 @@ class Excel < GenericSpreadsheet
156
173
  if celltype(row,col,sheet) == :string
157
174
  return platform_specific_iconv(@cell[sheet][[row,col]])
158
175
  else
159
- return @cell[sheet][[row,col]]
176
+ #return @cell[sheet][[row,col]]
177
+ if @cell[sheet] and @cell[sheet][[row,col]]
178
+ return @cell[sheet][[row,col]]
179
+ else
180
+ return nil
181
+ end
160
182
  end
161
183
  end
162
184
 
@@ -173,10 +195,15 @@ class Excel < GenericSpreadsheet
173
195
  read_cells(sheet) unless @cells_read[sheet]
174
196
  row,col = normalize(row,col)
175
197
  begin
176
- if @formula[sheet][[row,col]]
198
+ if @formula[sheet] and @formula[sheet][[row,col]]
177
199
  return :formula
178
200
  else
179
- @cell_type[sheet][[row,col]]
201
+ # @cell_type[sheet][[row,col]]
202
+ if @cell_type[sheet] and @cell_type[sheet][[row,col]]
203
+ return @cell_type[sheet][[row,col]]
204
+ else
205
+ return nil
206
+ end
180
207
  end
181
208
  rescue
182
209
  puts "Error in sheet #{sheet}, row #{row}, col #{col}"
@@ -215,7 +242,7 @@ class Excel < GenericSpreadsheet
215
242
  @cell[sheet].inspect
216
243
  end
217
244
 
218
- # returns the row,col values of the labelled cell
245
+ # returns the row,col values of the labelled cell
219
246
  # (nil,nil) if label is not defined
220
247
  # sheet parameter is not really needed because label names are global
221
248
  # to the whole spreadsheet
@@ -48,6 +48,7 @@ class Excelx < GenericSpreadsheet
48
48
  'dd/mm/yy' => :date,
49
49
  'hh:mm:ss' => :time,
50
50
  "dd/mm/yy\\ hh:mm" => :datetime,
51
+ 'dd/mmm/yy' => :date, # 2011-05-21
51
52
  }
52
53
  STANDARD_FORMATS = {
53
54
  0 => 'General',
@@ -416,12 +417,16 @@ class Excelx < GenericSpreadsheet
416
417
  #TODO: elsif (c.attributes.to_h['t'] == 'b')
417
418
  elsif c['t'] == 'b'
418
419
  tmp_type = :boolean
420
+ # 2011-02-25 BEGIN
421
+ elsif c['t'] == 'str'
422
+ tmp_type = :string
423
+ # 2011-02-25 END
419
424
  else
420
- #s_attribute = c.attributes.to_h['s'].to_i # was here
425
+ #s_attribute = c.attributes.to_h['s'].to_i # was here
421
426
  s_attribute = c['s'].to_i # was here
422
- format = attribute2format(s_attribute)
423
- tmp_type = format2type(format)
424
- end
427
+ format = attribute2format(s_attribute)
428
+ tmp_type = format2type(format)
429
+ end
425
430
  formula = nil
426
431
  #TODO: c.each_element do |cell|
427
432
  c.children.each do |cell|
@@ -462,6 +467,12 @@ class Excelx < GenericSpreadsheet
462
467
  elsif tmp_type == :formula
463
468
  vt = :formula
464
469
  v = cell.content.to_f #TODO: !!!!
470
+ # 2011-02-25 BEGIN
471
+ elsif tmp_type == :string
472
+ vt = :string
473
+ str_v = cell.content
474
+ excelx_type = :string
475
+ # 2011-02-25 END
465
476
  else
466
477
  vt = :float
467
478
  v = cell.content
@@ -609,7 +620,7 @@ class Excelx < GenericSpreadsheet
609
620
  doc.xpath("//*[local-name()='cellXfs']").each do |xfs|
610
621
  xfs.children.each do |xf|
611
622
  #TODO: numFmtId = xf.attributes.to_h['numFmtId']
612
- numFmtId = xf['numFmtId']
623
+ numFmtId = xf['numFmtId']
613
624
  @cellXfs << [numFmtId]
614
625
  #TODO: fontId = xf.attributes.to_h['fontId'].to_i
615
626
  fontId = xf['fontId'].to_i
@@ -1,7 +1,5 @@
1
1
  # encoding: utf-8
2
2
  require 'matrix'
3
- require 'rubygems'
4
- require 'builder'
5
3
 
6
4
  # Base class for all other types of spreadsheets
7
5
  class GenericSpreadsheet
@@ -11,10 +9,28 @@ class GenericSpreadsheet
11
9
  # sets the line with attribute names (default: 1)
12
10
  attr_accessor :header_line
13
11
 
14
- def initialize
15
- end
12
+ protected
16
13
 
17
- # set the working sheet in the document
14
+ # Helper function for development
15
+ def fremdrechner? #nodoc
16
+ eigener = [
17
+ 'C:\Users\thopre',
18
+ 'c:/Users/thopre',
19
+ '/c/Users/thopre',
20
+ '/home/tp',
21
+ ].include? ENV['HOME']
22
+ # if eigener
23
+ # puts "fremdrechner? ==> false"
24
+ # else
25
+ # puts "fremdrechner? ==> true"
26
+ # end
27
+ ! eigener
28
+ end
29
+
30
+ public
31
+
32
+ # sets the working sheet in the document
33
+ # 'sheet' can be a number (0 = first sheet) or the name of a sheet.
18
34
  def default_sheet=(sheet)
19
35
  if sheet.kind_of? Fixnum
20
36
  if sheet >= 0 and sheet <= sheets.length
@@ -300,10 +316,11 @@ class GenericSpreadsheet
300
316
 
301
317
  # reopens and read a spreadsheet document
302
318
  def reload
319
+ # von Abfrage der Klasse direkt auf .to_s == '..' umgestellt
303
320
  ds = @default_sheet
304
- initialize(@filename) if self.class == Openoffice or
305
- self.class == Excel
306
- initialize(@spreadsheetkey,@user,@password) if self.class == Google
321
+ initialize(@filename) if self.class.to_s == 'Openoffice' or
322
+ self.class.to_s == 'Excel'
323
+ initialize(@spreadsheetkey,@user,@password) if self.class.to_s == 'Google'
307
324
  self.default_sheet = ds
308
325
  #@first_row = @last_row = @first_column = @last_column = nil
309
326
  end
@@ -322,7 +339,13 @@ class GenericSpreadsheet
322
339
  # recursively removes the current temporary directory
323
340
  # this is only needed if you work with zipped files or files via the web
324
341
  def remove_tmp
342
+ #to do
343
+ # "remove_tmp wieder aktivieren"
344
+ #end
345
+ #return
346
+ #$log.debug("remove_tmp('#{@tmpdir}')")
325
347
  if File.exists?(@tmpdir)
348
+ #$log.debug("#{@tmpdir} exists")
326
349
  FileUtils::rm_r(@tmpdir)
327
350
  end
328
351
  end
@@ -352,30 +375,29 @@ class GenericSpreadsheet
352
375
  end
353
376
 
354
377
  def to_xml
355
- xml_document = ''
356
- xml = Builder::XmlMarkup.new(:target => xml_document, :indent => 2)
357
- xml.instruct! :xml, :version =>"1.0", :encoding => "utf-8"
358
- xml.spreadsheet {
359
- self.sheets.each do |sheet|
360
- self.default_sheet = sheet
361
- xml.sheet(:name => sheet) { |x|
362
- if first_row and last_row and first_column and last_column
363
- # sonst gibt es Fehler bei leeren Blaettern
364
- first_row.upto(last_row) do |row|
365
- first_column.upto(last_column) do |col|
366
- unless empty?(row,col)
367
- x.cell(cell(row,col),
368
- :row =>row,
369
- :column => col,
370
- :type => celltype(row,col))
378
+ builder = Nokogiri::XML::Builder.new do |xml|
379
+ xml.spreadsheet {
380
+ self.sheets.each do |sheet|
381
+ self.default_sheet = sheet
382
+ xml.sheet(:name => sheet) { |x|
383
+ if first_row and last_row and first_column and last_column
384
+ # sonst gibt es Fehler bei leeren Blaettern
385
+ first_row.upto(last_row) do |row|
386
+ first_column.upto(last_column) do |col|
387
+ unless empty?(row,col)
388
+ x.cell(cell(row,col),
389
+ :row =>row,
390
+ :column => col,
391
+ :type => celltype(row,col))
392
+ end
371
393
  end
372
394
  end
373
395
  end
374
- end
375
- }
376
- end
377
- }
378
- xml_document
396
+ }
397
+ end
398
+ }
399
+ end
400
+ return builder.to_xml
379
401
  end
380
402
 
381
403
  # when a method like spreadsheet.a42 is called
@@ -391,18 +413,9 @@ class GenericSpreadsheet
391
413
  else
392
414
  return cell(row,col)
393
415
  end
394
- # else
395
- # geht noch nicht, weil label unterhalb (in Openoffice) dieser Klasse
396
- # es definiert ist
397
- # p "Label #{m} angesprochen?"
398
- # row,col,sheet = label('anton')
399
- # # row,col,sheet = label(m)
400
- # p "row: #{row}"
401
- # p "col: #{col}"
402
- # p "sheet: #{sheet}"
403
- # return cell(row,col)
416
+ else
417
+ super
404
418
  end
405
- raise ArgumentError, "Method #{m} missing. Args: #{args}"
406
419
  end
407
420
 
408
421
  protected
@@ -470,39 +483,6 @@ class GenericSpreadsheet
470
483
  return row,col
471
484
  end
472
485
 
473
- # def open_from_uri(uri)
474
- # require 'open-uri' ;
475
- # tempfilename = File.join(@tmpdir, File.basename(uri))
476
- # f = File.open(tempfilename,"wb")
477
- # begin
478
- # open(uri) do |net|
479
- # f.write(net.read)
480
- # end
481
- # rescue
482
- # raise "could not open #{uri}"
483
- # end
484
- # f.close
485
- # File.join(@tmpdir, File.basename(uri))
486
- # end
487
-
488
- # OpenURI::HTTPError
489
- # def open_from_uri(uri)
490
- # require 'open-uri'
491
- # #existiert URL?
492
- # r = Net::HTTP.get_response(URI.parse(uri))
493
- # raise "URL nicht verfuegbar" unless r.is_a? Net::HTTPOK
494
- # tempfilename = File.join(@tmpdir, File.basename(uri))
495
- # f = File.open(tempfilename,"wb")
496
- # open(uri) do |net|
497
- # f.write(net.read)
498
- # end
499
- # # rescue
500
- # # raise "could not open #{uri}"
501
- # # end
502
- # f.close
503
- # File.join(@tmpdir, File.basename(uri))
504
- # end
505
-
506
486
  def open_from_uri(uri)
507
487
  require 'open-uri'
508
488
  response = ''