roo 1.9.1 → 1.9.2

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/roo.rb CHANGED
@@ -2,7 +2,7 @@
2
2
  module Roo
3
3
 
4
4
  # :stopdoc:
5
- VERSION = '1.9.1'
5
+ VERSION = '1.9.2'
6
6
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
7
7
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
8
8
  # :startdoc:
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ require 'matrix'
2
3
  require 'rubygems'
3
4
  require 'builder'
4
5
 
@@ -162,6 +163,21 @@ class GenericSpreadsheet
162
163
  true
163
164
  end
164
165
 
166
+ def to_matrix(sheet=nil)
167
+ sheet = @default_sheet unless sheet
168
+ arr = []
169
+ pos = 0
170
+ first_row.upto(last_row) do |row|
171
+ line = []
172
+ first_column.upto(last_column) do |col|
173
+ line << cell(row,col)
174
+ end
175
+ arr[pos] = line
176
+ pos += 1
177
+ end
178
+ Matrix.rows(arr)
179
+ end
180
+
165
181
  # find a row either by row number or a condition
166
182
  # Caution: this works only within the default sheet -> set default_sheet before you call this method
167
183
  # (experimental. see examples in the test_roo.rb file)
@@ -373,16 +389,16 @@ class GenericSpreadsheet
373
389
  else
374
390
  return cell(row,col)
375
391
  end
376
- # else
377
- # geht noch nicht, weil label unterhalb (in Openoffice) dieser Klasse
378
- # es definiert ist
379
- # p "Label #{m} angesprochen?"
380
- # row,col,sheet = label('anton')
381
- # # row,col,sheet = label(m)
382
- # p "row: #{row}"
383
- # p "col: #{col}"
384
- # p "sheet: #{sheet}"
385
- # return cell(row,col)
392
+ # else
393
+ # geht noch nicht, weil label unterhalb (in Openoffice) dieser Klasse
394
+ # es definiert ist
395
+ # p "Label #{m} angesprochen?"
396
+ # row,col,sheet = label('anton')
397
+ # # row,col,sheet = label(m)
398
+ # p "row: #{row}"
399
+ # p "col: #{col}"
400
+ # p "sheet: #{sheet}"
401
+ # return cell(row,col)
386
402
  end
387
403
  raise ArgumentError, "Method #{m} missing. Args: #{args}"
388
404
  end
@@ -419,7 +435,7 @@ class GenericSpreadsheet
419
435
 
420
436
  # konvertiert einen Key in der Form "12,45" (=row,column) in
421
437
  # ein Array mit numerischen Werten ([12,45])
422
- # Diese Methode ist eine temp. Loesung, um zu erforschen, ob der
438
+ # Diese Methode ist eine temp. Loesung, um zu erforschen, ob der
423
439
  # Zugriff mit numerischen Keys schneller ist.
424
440
  def key_to_num(str)
425
441
  r,c = str.split(',')
@@ -431,7 +447,7 @@ class GenericSpreadsheet
431
447
  # siehe: key_to_num
432
448
  def key_to_string(arr)
433
449
  "#{arr[0]},#{arr[1]}"
434
- end
450
+ end
435
451
 
436
452
  private
437
453
 
@@ -489,8 +505,8 @@ class GenericSpreadsheet
489
505
  require 'open-uri'
490
506
  response = ''
491
507
  begin
492
- open(uri, "User-Agent" => "Ruby/#{RUBY_VERSION}") { |net|
493
- response = net.read
508
+ open(uri, "User-Agent" => "Ruby/#{RUBY_VERSION}") { |net|
509
+ response = net.read
494
510
  tempfilename = File.join(@tmpdir, File.basename(uri))
495
511
  f = File.open(tempfilename,"wb")
496
512
  f.write(response)
@@ -605,8 +621,8 @@ class GenericSpreadsheet
605
621
  if onecell == ""
606
622
  str << ''
607
623
  else
608
- onecell.gsub!(/"/,'""')
609
- str << ('"'+onecell+'"')
624
+ one = onecell.gsub(/"/,'""')
625
+ str << ('"'+one+'"')
610
626
  end
611
627
  when :float,:percentage
612
628
  if onecell == onecell.to_i
@@ -619,8 +635,8 @@ class GenericSpreadsheet
619
635
  if onecell == ""
620
636
  str << ''
621
637
  else
622
- onecell.gsub!(/"/,'""')
623
- str << '"'+onecell+'"'
638
+ one = onecell.gsub(/"/,'""')
639
+ str << '"'+one+'"'
624
640
  end
625
641
  elsif onecell.class == Float
626
642
  if onecell == onecell.to_i
data/lib/roo/google.rb CHANGED
@@ -95,8 +95,6 @@ class Google < GenericSpreadsheet
95
95
  value = @cell[sheet]["#{row},#{col}"]
96
96
  if celltype(row,col,sheet) == :date
97
97
  begin
98
- $log.debug "cell() value: #{value} @date_format: #{@date_format}"
99
- $log.debug "returns #{Date.strptime(value, @date_format).inspect}"
100
98
  return Date.strptime(value, @date_format)
101
99
  rescue ArgumentError
102
100
  raise "Invalid Date #{sheet}[#{row},#{col}] #{value} using format '{@date_format}'"
@@ -252,10 +250,7 @@ class Google < GenericSpreadsheet
252
250
  sheet = @default_sheet unless sheet
253
251
  raise RangeError, "illegal sheet <#{sheet}>" unless sheets.index(sheet)
254
252
  sheet_no = sheets.index(sheet)
255
- $log.debug "sheet: #{sheet}"
256
- $log.debug "sheet_no: #{sheet_no}"
257
253
  ws = @worksheets[sheet_no]
258
- $log.debug "#{ws.inspect}"
259
254
  for row in 1..ws.num_rows
260
255
  for col in 1..ws.num_cols
261
256
  key = "#{row},#{col}"
@@ -263,9 +258,6 @@ class Google < GenericSpreadsheet
263
258
  numeric_value = ws[row,col] #item['numericvalue'] || item['numericValue']
264
259
  (value, value_type) = determine_datatype(string_value, numeric_value)
265
260
  @cell[sheet][key] = value unless value == "" or value == nil
266
- if value_type == :date
267
- $log.debug "date erkannt. value: #{value}"
268
- end
269
261
  @cell_type[sheet][key] = value_type
270
262
  @formula[sheet] = {} unless @formula[sheet]
271
263
  @formula[sheet][key] = string_value if value_type == :formula
@@ -304,7 +296,7 @@ class Google < GenericSpreadsheet
304
296
  ty = :string
305
297
  end
306
298
  end
307
- $log.debug "val: #{val} ty: #{ty}" if ty == :date
299
+ #$log.debug "val: #{val} ty: #{ty}" if ty == :date
308
300
  return val, ty
309
301
  end
310
302
 
Binary file
Binary file
data/test/matrix.ods ADDED
Binary file
data/test/matrix.xls ADDED
Binary file
data/test/test_roo.rb CHANGED
@@ -138,10 +138,10 @@ class TestRoo < Test::Unit::TestCase
138
138
 
139
139
  OPENOFFICE = true # do Openoffice-Spreadsheet Tests?
140
140
  EXCEL = true # do Excel Tests?
141
- GOOGLE = true # do Google-Spreadsheet Tests?
141
+ GOOGLE = false # do Google-Spreadsheet Tests?
142
142
  EXCELX = true # do Excel-X Tests? (.xlsx-files)
143
143
 
144
- ONLINE = true
144
+ ONLINE = false
145
145
  LONG_RUN = true
146
146
  GLOBAL_TIMEOUT = 48.minutes #*60 # 2*12*60 # seconds
147
147
 
@@ -158,6 +158,18 @@ class TestRoo < Test::Unit::TestCase
158
158
  # call a block of code for each spreadsheet type
159
159
  # and yield a reference to the roo object
160
160
  def with_each_spreadsheet(options)
161
+ # test if the spreadsheet type is valid :nodoc
162
+ if options[:format]
163
+ if options[:format].is_a? Symbol
164
+ options[:format] = [options[:format]]
165
+ end
166
+ options[:format].each do |formatname|
167
+ unless [:openoffice,:excel,:excelx,:google].include?(formatname)
168
+ raise "invalid spreadsheet type #{formatname}"
169
+ end
170
+ end
171
+ end
172
+ # end test spreadsheet type :nodoc
161
173
  options[:format] ||= [:excel, :excelx, :openoffice, :google]
162
174
  options[:format] = [options[:format]] if options[:format].class == Symbol
163
175
  yield Roo::Spreadsheet.open(File.join(TESTDIR, options[:name] + '.xls')) if EXCEL && options[:format].include?(:excel)
@@ -781,7 +793,8 @@ class TestRoo < Test::Unit::TestCase
781
793
  if LONG_RUN
782
794
  with_each_spreadsheet(:name=>'Bibelbund', :format=>[:openoffice,
783
795
  :excel,
784
- :excelx]) do |oo|
796
+ :excelx
797
+ ]) do |oo|
785
798
  assert_nothing_raised(Timeout::Error) {
786
799
  Timeout::timeout(GLOBAL_TIMEOUT) do |timeout_length|
787
800
  File.delete_if_exist("/tmp/Bibelbund.csv")
@@ -798,6 +811,20 @@ class TestRoo < Test::Unit::TestCase
798
811
  end
799
812
  end
800
813
 
814
+ def test_bug_quotes_excelx
815
+ with_each_spreadsheet(:name=>'Bibelbund', :format=>[:openoffice,
816
+ :excel,
817
+ :excelx]) do |oo|
818
+ oo.default_sheet = oo.sheets.first
819
+ assert_equal 'Einflüsse der neuen Theologie in "de gereformeerde Kerken van Nederland"',
820
+ oo.cell('a',76)
821
+ dummy = oo.to_csv("csv#{$$}")
822
+ assert_equal 'Einflüsse der neuen Theologie in "de gereformeerde Kerken van Nederland"',
823
+ oo.cell('a',78)
824
+ File.delete_if_exist("csv#{$$}")
825
+ end
826
+ end
827
+
801
828
  def test_to_csv
802
829
  with_each_spreadsheet(:name=>'numbers1') do |oo|
803
830
  master = "#{TESTDIR}/numbers1.csv"
@@ -1420,9 +1447,9 @@ Sheet 3:
1420
1447
  with_each_spreadsheet(:name=>'numbers1', :encoding => 'utf8') do |oo|
1421
1448
  assert_nothing_raised {oo.to_xml}
1422
1449
  sheetname = oo.sheets.first
1423
- # doc = XML::Parser.string(oo.to_xml).parse
1424
- doc = Nokogiri::XML(oo.to_xml)
1425
- # doc.root.each_element {|xml_sheet|
1450
+ # doc = XML::Parser.string(oo.to_xml).parse
1451
+ doc = Nokogiri::XML(oo.to_xml)
1452
+ # doc.root.each_element {|xml_sheet|
1426
1453
  doc.root.each {|xml_sheet|
1427
1454
  all_cells = init_all_cells(oo, sheetname)
1428
1455
  x = 0
@@ -1846,20 +1873,21 @@ doc = Nokogiri::XML(oo.to_xml)
1846
1873
  end
1847
1874
 
1848
1875
  def test_cell_methods
1849
- with_each_spreadsheet(:name=>'numbers1') do |oo|
1850
- assert_equal 10, oo.a4 # cell(4,'A')
1851
- assert_equal 11, oo.b4 # cell(4,'B')
1852
- assert_equal 12, oo.c4 # cell(4,'C')
1853
- assert_equal 13, oo.d4 # cell(4,'D')
1854
- assert_equal 14, oo.e4 # cell(4,'E')
1855
- assert_equal 'ABC', oo.c6('Sheet5')
1856
-
1857
- assert_raises(ArgumentError) {
1858
- # a42a is not a valid cell name, should raise ArgumentError
1859
- assert_equal 9999, oo.a42a
1860
- }
1876
+ after Date.new(2010,1,30) do
1877
+ with_each_spreadsheet(:name=>'numbers1') do |oo|
1878
+ assert_equal 10, oo.a4 # cell(4,'A')
1879
+ assert_equal 11, oo.b4 # cell(4,'B')
1880
+ assert_equal 12, oo.c4 # cell(4,'C')
1881
+ assert_equal 13, oo.d4 # cell(4,'D')
1882
+ assert_equal 14, oo.e4 # cell(4,'E')
1883
+ assert_equal 'ABC', oo.c6('Sheet5')
1884
+
1885
+ assert_raises(ArgumentError) {
1886
+ # a42a is not a valid cell name, should raise ArgumentError
1887
+ assert_equal 9999, oo.a42a
1888
+ }
1889
+ end
1861
1890
  end
1862
-
1863
1891
  end
1864
1892
 
1865
1893
 
@@ -1890,42 +1918,69 @@ doc = Nokogiri::XML(oo.to_xml)
1890
1918
  end
1891
1919
 
1892
1920
  def test_labeled_cells
1893
- # TODO: more spreadsheet types
1894
- with_each_spreadsheet(:name=>'named_cells', :format=>:openoffice) do |oo|
1895
- oo.default_sheet = oo.sheets.first
1896
- begin
1897
- row,col = oo.label('anton')
1898
- rescue ArgumentError
1899
- puts "labels error at #{oo.class}"
1900
- raise
1901
- end
1902
- assert_equal 5, row
1903
- assert_equal 3, col
1921
+ after Date.new(2010,1,25) do
1922
+ # TODO: more spreadsheet types
1923
+ with_each_spreadsheet(:name=>'named_cells', :format=>:openoffice) do |oo|
1924
+ oo.default_sheet = oo.sheets.first
1925
+ begin
1926
+ row,col = oo.label('anton')
1927
+ rescue ArgumentError
1928
+ puts "labels error at #{oo.class}"
1929
+ raise
1930
+ end
1931
+ assert_equal 5, row
1932
+ assert_equal 3, col
1904
1933
 
1905
- row,col = oo.label('anton')
1906
- assert_equal 'Anton', oo.cell(row,col)
1934
+ row,col = oo.label('anton')
1935
+ assert_equal 'Anton', oo.cell(row,col)
1907
1936
 
1908
- row,col = oo.label('berta')
1909
- assert_equal 'Bertha', oo.cell(row,col)
1937
+ row,col = oo.label('berta')
1938
+ assert_equal 'Bertha', oo.cell(row,col)
1910
1939
 
1911
- row,col = oo.label('caesar')
1912
- assert_equal 'Cäsar', oo.cell(row,col)
1940
+ row,col = oo.label('caesar')
1941
+ assert_equal 'Cäsar', oo.cell(row,col)
1913
1942
 
1914
- # a not defined label:
1915
- row,col = oo.label('never')
1916
- assert_nil row
1917
- assert_nil col
1943
+ # a not defined label:
1944
+ row,col = oo.label('never')
1945
+ assert_nil row
1946
+ assert_nil col
1918
1947
 
1919
- row,col,sheet = oo.label('anton')
1920
- assert_equal 5, row
1921
- assert_equal 3, col
1922
- assert_equal "Sheet1", sheet
1923
- #
1924
- # assert_equal "Anton", oo.label('anton')
1925
- after Date.new(2009,12,12) do
1926
- assert_equal "Anton", oo.anton
1948
+ row,col,sheet = oo.label('anton')
1949
+ assert_equal 5, row
1950
+ assert_equal 3, col
1951
+ assert_equal "Sheet1", sheet
1952
+ #
1953
+ # assert_equal "Anton", oo.label('anton')
1954
+ after Date.new(2009,12,12) do
1955
+ assert_equal "Anton", oo.anton
1956
+ end
1927
1957
  end
1928
1958
  end
1929
1959
  end
1930
-
1960
+
1961
+
1962
+ def test_bug_excel_last_row_255
1963
+ after Date.new(2010,2,20) do
1964
+ oo = Excel.new(File.join('test','ScienceStaff.xls'))
1965
+ oo.default_sheet = oo.sheets.first
1966
+ assert_equal "COMSCI", oo.cell(255,1)
1967
+ assert_equal "lala", oo.cell(256,1)
1968
+ assert_equal 1537, oo.last_row
1969
+ end
1970
+ end
1971
+
1972
+ def test_bug_excel_last_row_255_modified
1973
+ oo = Excel.new(File.join('test','ScienceStaff_modified.xls'))
1974
+ oo.default_sheet = oo.sheets.first
1975
+ assert_equal 1537, oo.last_row
1976
+ end
1977
+ require 'matrix'
1978
+ def test_matrix
1979
+ with_each_spreadsheet(:name => 'matrix', :format => [:openoffice, :excel, :google]) do |oo|
1980
+ oo.default_sheet = oo.sheets.first
1981
+ assert_equal Matrix[ [1.0, 2.0, 3.0],
1982
+ [4.0, 5.0, 6.0],
1983
+ [7.0, 8.0, 9.0] ], oo.to_matrix
1984
+ end
1985
+ end
1931
1986
  end # class
@@ -0,0 +1,19 @@
1
+ require 'test/unit'
2
+ require 'spreadsheet'
3
+
4
+ class TestSpreadsheet < Test::Unit::TestCase
5
+
6
+ def test_bug_last_row_255
7
+ after Date.new(2010,2,15) do
8
+ Spreadsheet.client_encoding = 'UTF-8'
9
+ book = Spreadsheet.open(File.join('test','ScienceStaff.xls'))
10
+ sheet1 = book.worksheet 0
11
+ count = 0
12
+ sheet1.each do |row|
13
+ count += 1 # do something interesting with a row
14
+ end
15
+ puts "#{count} rows found"
16
+ assert_equal 1537, count
17
+ end
18
+ end
19
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.1
4
+ version: 1.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Preymesser
@@ -9,59 +9,9 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-10 00:00:00 +01:00
12
+ date: 2010-01-18 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: spreadsheet
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.6.4
24
- version:
25
- - !ruby/object:Gem::Dependency
26
- name: nokogiri
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 0.0.1
34
- version:
35
- - !ruby/object:Gem::Dependency
36
- name: builder
37
- type: :runtime
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- version: 2.1.2
44
- version:
45
- - !ruby/object:Gem::Dependency
46
- name: gimite-google-spreadsheet-ruby
47
- type: :runtime
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - ">="
52
- - !ruby/object:Gem::Version
53
- version: 0.0.5
54
- version:
55
- - !ruby/object:Gem::Dependency
56
- name: febeling-rubyzip
57
- type: :runtime
58
- version_requirement:
59
- version_requirements: !ruby/object:Gem::Requirement
60
- requirements:
61
- - - ">="
62
- - !ruby/object:Gem::Version
63
- version: 0.9.2
64
- version:
65
15
  - !ruby/object:Gem::Dependency
66
16
  name: bones
67
17
  type: :development
@@ -70,7 +20,7 @@ dependencies:
70
20
  requirements:
71
21
  - - ">="
72
22
  - !ruby/object:Gem::Version
73
- version: 2.5.1
23
+ version: 3.2.0
74
24
  version:
75
25
  description: |-
76
26
  Roo can access the contents of various spreadsheet files. It can handle
@@ -95,6 +45,9 @@ files:
95
45
  - README.txt
96
46
  - Rakefile
97
47
  - bin/roo
48
+ - csv11159
49
+ - csv9419
50
+ - csv9957
98
51
  - lib/roo.rb
99
52
  - lib/roo/excel.rb
100
53
  - lib/roo/excelx.rb
@@ -103,19 +56,6 @@ files:
103
56
  - lib/roo/openoffice.rb
104
57
  - lib/roo/roo_rails_helper.rb
105
58
  - lib/roo/version.rb
106
- - tasks/ann.rake
107
- - tasks/bones.rake
108
- - tasks/gem.rake
109
- - tasks/git.rake
110
- - tasks/notes.rake
111
- - tasks/post_load.rake
112
- - tasks/rdoc.rake
113
- - tasks/rubyforge.rake
114
- - tasks/setup.rb
115
- - tasks/spec.rake
116
- - tasks/svn.rake
117
- - tasks/test.rake
118
- - tasks/zentest.rake
119
59
  - test/1900_base.xls
120
60
  - test/1904_base.xls
121
61
  - test/Bibelbund.csv
@@ -123,6 +63,8 @@ files:
123
63
  - test/Bibelbund.xls
124
64
  - test/Bibelbund.xlsx
125
65
  - test/Bibelbund1.ods
66
+ - test/ScienceStaff.xls
67
+ - test/ScienceStaff_modified.xls
126
68
  - test/bbu.ods
127
69
  - test/bbu.xls
128
70
  - test/bbu.xlsx
@@ -146,6 +88,8 @@ files:
146
88
  - test/formula.xls
147
89
  - test/formula.xlsx
148
90
  - test/html-escape.ods
91
+ - test/matrix.ods
92
+ - test/matrix.xls
149
93
  - test/named_cells.ods
150
94
  - test/no_spreadsheet_file.txt
151
95
  - test/numbers1.csv
@@ -170,6 +114,7 @@ files:
170
114
  - test/style.xlsx
171
115
  - test/test_helper.rb
172
116
  - test/test_roo.rb
117
+ - test/test_spreadsheet.rb
173
118
  - test/time-test.csv
174
119
  - test/time-test.ods
175
120
  - test/time-test.xls
@@ -207,5 +152,6 @@ signing_key:
207
152
  specification_version: 3
208
153
  summary: Roo can access the contents of various spreadsheet files
209
154
  test_files:
210
- - test/test_helper.rb
211
155
  - test/test_roo.rb
156
+ - test/test_helper.rb
157
+ - test/test_spreadsheet.rb