roo 2.3.0 → 2.10.1
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.
- checksums.yaml +5 -5
- data/.codeclimate.yml +17 -0
- data/.github/issue_template.md +16 -0
- data/.github/pull_request_template.md +14 -0
- data/.github/workflows/pull-request.yml +15 -0
- data/.github/workflows/ruby.yml +34 -0
- data/.gitignore +4 -0
- data/.rubocop.yml +186 -0
- data/CHANGELOG.md +148 -0
- data/Gemfile +4 -4
- data/LICENSE +2 -0
- data/README.md +84 -27
- data/Rakefile +1 -1
- data/lib/roo/base.rb +111 -237
- data/lib/roo/constants.rb +5 -3
- data/lib/roo/csv.rb +106 -85
- data/lib/roo/errors.rb +2 -0
- data/lib/roo/excelx/cell/base.rb +26 -12
- data/lib/roo/excelx/cell/boolean.rb +9 -6
- data/lib/roo/excelx/cell/date.rb +7 -7
- data/lib/roo/excelx/cell/datetime.rb +50 -44
- data/lib/roo/excelx/cell/empty.rb +3 -2
- data/lib/roo/excelx/cell/number.rb +60 -47
- data/lib/roo/excelx/cell/string.rb +3 -3
- data/lib/roo/excelx/cell/time.rb +17 -16
- data/lib/roo/excelx/cell.rb +11 -7
- data/lib/roo/excelx/comments.rb +3 -3
- data/lib/roo/excelx/coordinate.rb +11 -4
- data/lib/roo/excelx/extractor.rb +20 -3
- data/lib/roo/excelx/format.rb +38 -31
- data/lib/roo/excelx/images.rb +26 -0
- data/lib/roo/excelx/relationships.rb +12 -4
- data/lib/roo/excelx/shared.rb +10 -3
- data/lib/roo/excelx/shared_strings.rb +113 -9
- data/lib/roo/excelx/sheet.rb +49 -10
- data/lib/roo/excelx/sheet_doc.rb +101 -48
- data/lib/roo/excelx/styles.rb +4 -4
- data/lib/roo/excelx/workbook.rb +8 -3
- data/lib/roo/excelx.rb +85 -42
- data/lib/roo/formatters/base.rb +15 -0
- data/lib/roo/formatters/csv.rb +84 -0
- data/lib/roo/formatters/matrix.rb +23 -0
- data/lib/roo/formatters/xml.rb +31 -0
- data/lib/roo/formatters/yaml.rb +40 -0
- data/lib/roo/helpers/default_attr_reader.rb +20 -0
- data/lib/roo/helpers/weak_instance_cache.rb +41 -0
- data/lib/roo/open_office.rb +41 -27
- data/lib/roo/spreadsheet.rb +8 -2
- data/lib/roo/tempdir.rb +24 -0
- data/lib/roo/utils.rb +76 -26
- data/lib/roo/version.rb +1 -1
- data/lib/roo.rb +5 -0
- data/roo.gemspec +22 -12
- data/spec/lib/roo/base_spec.rb +65 -3
- data/spec/lib/roo/csv_spec.rb +19 -0
- data/spec/lib/roo/excelx/cell/time_spec.rb +15 -0
- data/spec/lib/roo/excelx/relationships_spec.rb +43 -0
- data/spec/lib/roo/excelx/sheet_doc_spec.rb +11 -0
- data/spec/lib/roo/excelx_spec.rb +237 -5
- data/spec/lib/roo/openoffice_spec.rb +2 -2
- data/spec/lib/roo/spreadsheet_spec.rb +1 -1
- data/spec/lib/roo/strict_spec.rb +43 -0
- data/spec/lib/roo/utils_spec.rb +22 -9
- data/spec/lib/roo/weak_instance_cache_spec.rb +92 -0
- data/spec/lib/roo_spec.rb +0 -0
- data/spec/spec_helper.rb +2 -7
- data/test/excelx/cell/test_attr_reader_default.rb +72 -0
- data/test/excelx/cell/test_base.rb +6 -2
- data/test/excelx/cell/test_boolean.rb +1 -3
- data/test/excelx/cell/test_date.rb +1 -6
- data/test/excelx/cell/test_datetime.rb +7 -10
- data/test/excelx/cell/test_empty.rb +12 -2
- data/test/excelx/cell/test_number.rb +28 -4
- data/test/excelx/cell/test_string.rb +21 -3
- data/test/excelx/cell/test_time.rb +7 -10
- data/test/excelx/test_coordinate.rb +51 -0
- data/test/formatters/test_csv.rb +136 -0
- data/test/formatters/test_matrix.rb +76 -0
- data/test/formatters/test_xml.rb +78 -0
- data/test/formatters/test_yaml.rb +20 -0
- data/test/helpers/test_accessing_files.rb +81 -0
- data/test/helpers/test_comments.rb +43 -0
- data/test/helpers/test_formulas.rb +9 -0
- data/test/helpers/test_labels.rb +103 -0
- data/test/helpers/test_sheets.rb +55 -0
- data/test/helpers/test_styles.rb +62 -0
- data/test/roo/test_base.rb +182 -0
- data/test/roo/test_csv.rb +88 -0
- data/test/roo/test_excelx.rb +360 -0
- data/test/roo/test_libre_office.rb +9 -0
- data/test/roo/test_open_office.rb +289 -0
- data/test/test_helper.rb +129 -14
- data/test/test_roo.rb +60 -1765
- metadata +91 -21
- data/.travis.yml +0 -14
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
if RUBY_PLATFORM == "java"
|
4
|
+
require 'java'
|
5
|
+
java_import 'java.lang.System'
|
6
|
+
end
|
7
|
+
|
8
|
+
describe Roo::Helpers::WeakInstanceCache do
|
9
|
+
let(:klass) do
|
10
|
+
Class.new do
|
11
|
+
include Roo::Helpers::WeakInstanceCache
|
12
|
+
|
13
|
+
def memoized_data
|
14
|
+
instance_cache(:@memoized_data) do
|
15
|
+
"Some Costly Operation #{rand(1000)}" * 1_000
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
subject do
|
22
|
+
klass.new
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should be lazy' do
|
26
|
+
expect(subject.instance_variables).to_not include(:@memoized_data)
|
27
|
+
data = subject.memoized_data
|
28
|
+
expect(subject.instance_variables).to include(:@memoized_data)
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
it 'should be memoized' do
|
33
|
+
data = subject.memoized_data
|
34
|
+
expect(subject.memoized_data).to equal(data)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should recalculate after GC' do
|
38
|
+
expect(subject.instance_variables).to_not include(:@memoized_data)
|
39
|
+
GC.disable
|
40
|
+
subject.memoized_data && nil
|
41
|
+
expect(subject.instance_variables).to include(:@memoized_data)
|
42
|
+
|
43
|
+
force_gc
|
44
|
+
expect(subject.instance_variables).to_not include(:@memoized_data)
|
45
|
+
GC.disable
|
46
|
+
subject.memoized_data && nil
|
47
|
+
expect(subject.instance_variables).to include(:@memoized_data)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'must remove instance variable' do
|
51
|
+
expect(subject.instance_variables).to_not include(:@memoized_data)
|
52
|
+
GC.disable
|
53
|
+
subject.memoized_data && nil
|
54
|
+
expect(subject.instance_variables).to include(:@memoized_data)
|
55
|
+
|
56
|
+
force_gc
|
57
|
+
expect(subject.instance_variables).to_not include(:@memoized_data)
|
58
|
+
end
|
59
|
+
|
60
|
+
context '#inspect must not raise' do
|
61
|
+
it 'before calculation' do
|
62
|
+
expect{subject.inspect}.to_not raise_error
|
63
|
+
end
|
64
|
+
it 'after calculation' do
|
65
|
+
GC.disable
|
66
|
+
subject.memoized_data && nil
|
67
|
+
expect{subject.inspect}.to_not raise_error
|
68
|
+
expect(subject.inspect).to include("Some Costly Operation")
|
69
|
+
force_gc
|
70
|
+
end
|
71
|
+
it 'after GC' do
|
72
|
+
subject.memoized_data && nil
|
73
|
+
force_gc
|
74
|
+
expect(subject.instance_variables).to_not include(:@memoized_data)
|
75
|
+
expect{subject.inspect}.to_not raise_error
|
76
|
+
expect(subject.inspect).to_not include("Some Costly Operation")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
if RUBY_PLATFORM == "java"
|
81
|
+
def force_gc
|
82
|
+
System.gc
|
83
|
+
sleep(0.1)
|
84
|
+
end
|
85
|
+
else
|
86
|
+
def force_gc
|
87
|
+
GC.start(full_mark: true, immediate_sweep: true)
|
88
|
+
sleep(0.1)
|
89
|
+
GC.start(full_mark: true, immediate_sweep: true)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
File without changes
|
data/spec/spec_helper.rb
CHANGED
@@ -1,14 +1,9 @@
|
|
1
1
|
require 'simplecov'
|
2
2
|
require 'roo'
|
3
|
-
require 'vcr'
|
4
|
-
|
5
3
|
require 'helpers'
|
6
4
|
|
7
5
|
RSpec.configure do |c|
|
8
6
|
c.include Helpers
|
9
|
-
|
10
|
-
|
11
|
-
VCR.configure do |c|
|
12
|
-
c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
|
13
|
-
c.hook_into :webmock # or :fakeweb
|
7
|
+
c.color = true
|
8
|
+
c.formatter = :documentation if ENV["USE_REPORTERS"]
|
14
9
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class TestAttrReaderDefault < Minitest::Test
|
4
|
+
def base
|
5
|
+
Roo::Excelx::Cell::Base
|
6
|
+
end
|
7
|
+
|
8
|
+
def boolean
|
9
|
+
Roo::Excelx::Cell::Boolean
|
10
|
+
end
|
11
|
+
|
12
|
+
def class_date
|
13
|
+
Roo::Excelx::Cell::Date
|
14
|
+
end
|
15
|
+
|
16
|
+
def datetime
|
17
|
+
Roo::Excelx::Cell::DateTime
|
18
|
+
end
|
19
|
+
|
20
|
+
def empty
|
21
|
+
Roo::Excelx::Cell::Empty
|
22
|
+
end
|
23
|
+
|
24
|
+
def number
|
25
|
+
Roo::Excelx::Cell::Number
|
26
|
+
end
|
27
|
+
|
28
|
+
def string
|
29
|
+
Roo::Excelx::Cell::String
|
30
|
+
end
|
31
|
+
|
32
|
+
def base_date
|
33
|
+
::Date.new(1899, 12, 30)
|
34
|
+
end
|
35
|
+
|
36
|
+
def base_timestamp
|
37
|
+
::Date.new(1899, 12, 30).to_datetime.to_time.to_i
|
38
|
+
end
|
39
|
+
|
40
|
+
def class_time
|
41
|
+
Roo::Excelx::Cell::Time
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_cell_default_values
|
45
|
+
assert_values base.new(nil, nil, [], 1, nil, nil), default_type: :base, :@default_type => nil, style: 1, :@style => nil
|
46
|
+
assert_values boolean.new("1", nil, nil, nil, nil), default_type: :boolean, :@default_type => nil, cell_type: :boolean, :@cell_type => nil
|
47
|
+
assert_values class_date.new("41791", nil, [:numeric_or_formula, "mm-dd-yy"], 6, nil, base_date, nil), default_type: :date, :@default_type => nil
|
48
|
+
assert_values class_time.new("0.521", nil, [:numeric_or_formula, "hh:mm"], 6, nil, base_timestamp, nil), default_type: :time, :@default_type => nil
|
49
|
+
assert_values datetime.new("41791.521", nil, [:numeric_or_formula, "mm-dd-yy hh:mm"], 6, nil, base_timestamp, nil), default_type: :datetime, :@default_type => nil
|
50
|
+
assert_values empty.new(nil), default_type: nil, :@default_type => nil, style: nil, :@style => nil
|
51
|
+
assert_values number.new("42", nil, ["0"], nil, nil, nil), default_type: :float, :@default_type => nil
|
52
|
+
assert_values string.new("1", nil, nil, nil, nil), default_type: :string, :@default_type => nil, cell_type: :string, :@cell_type => nil
|
53
|
+
|
54
|
+
assert_values base.new(nil, nil, [], 2, nil, nil), style: 2, :@style => 2
|
55
|
+
end
|
56
|
+
|
57
|
+
def assert_values(object, value_hash)
|
58
|
+
value_hash.each do |attr_name, expected_value|
|
59
|
+
value = if attr_name.to_s.include?("@")
|
60
|
+
object.instance_variable_defined?(attr_name) ? object.instance_variable_get(attr_name) : nil
|
61
|
+
else
|
62
|
+
object.public_send(attr_name)
|
63
|
+
end
|
64
|
+
|
65
|
+
if expected_value
|
66
|
+
assert_equal expected_value, value
|
67
|
+
else
|
68
|
+
assert_nil value
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -1,5 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'roo/link'
|
1
|
+
require 'test_helper'
|
3
2
|
|
4
3
|
class TestRooExcelxCellBase < Minitest::Test
|
5
4
|
def base
|
@@ -26,6 +25,11 @@ class TestRooExcelxCellBase < Minitest::Test
|
|
26
25
|
refute cell.empty?
|
27
26
|
end
|
28
27
|
|
28
|
+
def test_presence
|
29
|
+
cell = base.new(value, nil, [], nil, nil, nil)
|
30
|
+
assert_equal cell, cell.presence
|
31
|
+
end
|
32
|
+
|
29
33
|
def test_cell_type_is_formula
|
30
34
|
formula = true
|
31
35
|
cell = base.new(value, formula, [], nil, nil, nil)
|
@@ -1,16 +1,13 @@
|
|
1
|
-
require '
|
2
|
-
require 'roo/excelx/cell/base'
|
3
|
-
require 'roo/excelx/cell/datetime'
|
4
|
-
require 'roo/link'
|
1
|
+
require 'test_helper'
|
5
2
|
|
6
3
|
class TestRooExcelxCellDateTime < Minitest::Test
|
7
4
|
def test_cell_value_is_datetime
|
8
|
-
cell = datetime.new('30000.323212', nil, ['mm-dd-yy'], nil, nil,
|
5
|
+
cell = datetime.new('30000.323212', nil, ['mm-dd-yy'], nil, nil, base_timestamp, nil)
|
9
6
|
assert_kind_of ::DateTime, cell.value
|
10
7
|
end
|
11
8
|
|
12
9
|
def test_cell_type_is_datetime
|
13
|
-
cell = datetime.new('30000.323212', nil, [], nil, nil,
|
10
|
+
cell = datetime.new('30000.323212', nil, [], nil, nil, base_timestamp, nil)
|
14
11
|
assert_equal :datetime, cell.type
|
15
12
|
end
|
16
13
|
|
@@ -22,7 +19,7 @@ class TestRooExcelxCellDateTime < Minitest::Test
|
|
22
19
|
['mmm-yy', 'JAN-15'],
|
23
20
|
['m/d/yy h:mm', '1/25/15 8:15']
|
24
21
|
].each do |format, formatted_value|
|
25
|
-
cell = datetime.new '42029.34375', nil, [format], nil, nil,
|
22
|
+
cell = datetime.new '42029.34375', nil, [format], nil, nil, base_timestamp, nil
|
26
23
|
assert_equal formatted_value, cell.formatted_value
|
27
24
|
end
|
28
25
|
end
|
@@ -33,7 +30,7 @@ class TestRooExcelxCellDateTime < Minitest::Test
|
|
33
30
|
['h:mm:ss000 mm/yy', '8:15:00000 01/15'],
|
34
31
|
['mmm yyy', '2015-01-25 08:15:00']
|
35
32
|
].each do |format, formatted_value|
|
36
|
-
cell = datetime.new '42029.34375', nil, [format], nil, nil,
|
33
|
+
cell = datetime.new '42029.34375', nil, [format], nil, nil, base_timestamp, nil
|
37
34
|
assert_equal formatted_value, cell.formatted_value
|
38
35
|
end
|
39
36
|
end
|
@@ -42,7 +39,7 @@ class TestRooExcelxCellDateTime < Minitest::Test
|
|
42
39
|
Roo::Excelx::Cell::DateTime
|
43
40
|
end
|
44
41
|
|
45
|
-
def
|
46
|
-
|
42
|
+
def base_timestamp
|
43
|
+
DateTime.new(1899, 12, 30).to_time.to_i
|
47
44
|
end
|
48
45
|
end
|
@@ -1,8 +1,18 @@
|
|
1
|
-
require '
|
2
|
-
require 'roo/excelx/cell/empty'
|
1
|
+
require 'test_helper'
|
3
2
|
|
4
3
|
class TestRooExcelxCellEmpty < Minitest::Test
|
5
4
|
def empty
|
6
5
|
Roo::Excelx::Cell::Empty
|
7
6
|
end
|
7
|
+
|
8
|
+
def test_empty?
|
9
|
+
cell = empty.new(nil)
|
10
|
+
assert_same true, cell.empty?
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_nil_presence
|
14
|
+
cell = empty.new(nil)
|
15
|
+
assert_nil cell.presence
|
16
|
+
end
|
17
|
+
|
8
18
|
end
|
@@ -1,6 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'roo/excelx/cell/number'
|
3
|
-
require 'roo/link'
|
1
|
+
require 'test_helper'
|
4
2
|
|
5
3
|
class TestRooExcelxCellNumber < Minitest::Test
|
6
4
|
def number
|
@@ -17,11 +15,31 @@ class TestRooExcelxCellNumber < Minitest::Test
|
|
17
15
|
assert_kind_of(Integer, cell.value)
|
18
16
|
end
|
19
17
|
|
18
|
+
def test_scientific_notation
|
19
|
+
cell = Roo::Excelx::Cell::Number.new '1.2E-3', nil, ['0'], nil, nil, nil
|
20
|
+
assert_kind_of(Float, cell.value)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_simple_scientific_notation
|
24
|
+
cell = Roo::Excelx::Cell::Number.new '1E-3', nil, ['0'], nil, nil, nil
|
25
|
+
assert_kind_of(Float, cell.value)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_very_simple_scientific_notation
|
29
|
+
cell = Roo::Excelx::Cell::Number.new '1e6', nil, ['0'], nil, nil, nil
|
30
|
+
assert_kind_of(Float, cell.value)
|
31
|
+
end
|
32
|
+
|
20
33
|
def test_percent
|
21
34
|
cell = Roo::Excelx::Cell::Number.new '42.1', nil, ['0.00%'], nil, nil, nil
|
22
35
|
assert_kind_of(Float, cell.value)
|
23
36
|
end
|
24
37
|
|
38
|
+
def test_rounded_percent_formatted_value
|
39
|
+
cell = Roo::Excelx::Cell::Number.new '0.569999999995', nil, ['0%'], nil, nil, nil
|
40
|
+
assert_equal('57%', cell.formatted_value)
|
41
|
+
end
|
42
|
+
|
25
43
|
def test_formats_with_negative_numbers
|
26
44
|
[
|
27
45
|
['#,##0 ;(#,##0)', '(1,042)'],
|
@@ -35,7 +53,7 @@ class TestRooExcelxCellNumber < Minitest::Test
|
|
35
53
|
end
|
36
54
|
|
37
55
|
def test_numbers_with_cell_errors
|
38
|
-
|
56
|
+
Roo::Excelx::ERROR_VALUES.each do |error|
|
39
57
|
cell = Roo::Excelx::Cell::Number.new error, nil, ['General'], nil, nil, nil
|
40
58
|
assert_equal error, cell.value
|
41
59
|
assert_equal error, cell.formatted_value
|
@@ -45,10 +63,15 @@ class TestRooExcelxCellNumber < Minitest::Test
|
|
45
63
|
def test_formats
|
46
64
|
[
|
47
65
|
['General', '1042'],
|
66
|
+
['GENERAL', '1042'],
|
48
67
|
['0', '1042'],
|
68
|
+
['000000', '001042'],
|
49
69
|
['0.00', '1042.00'],
|
70
|
+
['0.0000', '1042.0000'],
|
71
|
+
['0.000000000', '1042.000000000'],
|
50
72
|
['#,##0', '1,042'],
|
51
73
|
['#,##0.00', '1,042.00'],
|
74
|
+
['#,##0.000', '1,042.000'],
|
52
75
|
['0%', '104200%'],
|
53
76
|
['0.00%', '104200.00%'],
|
54
77
|
['0.00E+00', '1.04E+03'],
|
@@ -57,6 +80,7 @@ class TestRooExcelxCellNumber < Minitest::Test
|
|
57
80
|
['#,##0.00;(#,##0.00)', '1,042.00'],
|
58
81
|
['#,##0.00;[Red](#,##0.00)', '1,042.00'],
|
59
82
|
['##0.0E+0', '1.0E+03'],
|
83
|
+
["_-* #,##0.00\\ _€_-;\\-* #,##0.00\\ _€_-;_-* \"-\"??\\ _€_-;_-@_-", '1,042.00'],
|
60
84
|
['@', '1042']
|
61
85
|
].each do |style_format, result|
|
62
86
|
cell = Roo::Excelx::Cell::Number.new '1042', nil, [style_format], nil, nil, nil
|
@@ -1,6 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'roo/excelx/cell/string'
|
3
|
-
require 'roo/link'
|
1
|
+
require 'test_helper'
|
4
2
|
|
5
3
|
class TestRooExcelxCellString < Minitest::Test
|
6
4
|
def string
|
@@ -27,4 +25,24 @@ class TestRooExcelxCellString < Minitest::Test
|
|
27
25
|
cell = string.new '0', nil, nil, nil, nil
|
28
26
|
assert_equal '0', cell.value
|
29
27
|
end
|
28
|
+
|
29
|
+
def test_not_empty?
|
30
|
+
cell = string.new '1', nil, nil, nil, nil
|
31
|
+
assert_equal false, cell.empty?
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_empty?
|
35
|
+
cell = string.new '', nil, nil, nil, nil
|
36
|
+
assert_equal true, cell.empty?
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_presence
|
40
|
+
cell = string.new '1', nil, nil, nil, nil
|
41
|
+
assert_equal cell, cell.presence
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_nil_presence
|
45
|
+
cell = string.new '', nil, nil, nil, nil
|
46
|
+
assert_nil cell.presence
|
47
|
+
end
|
30
48
|
end
|
@@ -1,15 +1,12 @@
|
|
1
|
-
require '
|
2
|
-
require 'roo/excelx/cell/datetime'
|
3
|
-
require 'roo/excelx/cell/time'
|
4
|
-
require 'roo/link'
|
1
|
+
require 'test_helper'
|
5
2
|
|
6
3
|
class TestRooExcelxCellTime < Minitest::Test
|
7
|
-
def
|
4
|
+
def roo_time
|
8
5
|
Roo::Excelx::Cell::Time
|
9
6
|
end
|
10
7
|
|
11
|
-
def
|
12
|
-
|
8
|
+
def base_timestamp
|
9
|
+
DateTime.new(1899, 12, 30).to_time.to_i
|
13
10
|
end
|
14
11
|
|
15
12
|
def test_formatted_value
|
@@ -21,13 +18,13 @@ class TestRooExcelxCellTime < Minitest::Test
|
|
21
18
|
['[h]:mm:ss', '[1]:48:09'],
|
22
19
|
['mmss.0', '4809.0'] # Cell::Time always get rounded to the nearest second.
|
23
20
|
].each do |style_format, result|
|
24
|
-
cell =
|
21
|
+
cell = roo_time.new(value, nil, [:numeric_or_formula, style_format], 6, nil, base_timestamp, nil)
|
25
22
|
assert_equal result, cell.formatted_value, "Style=#{style_format} is not properly formatted"
|
26
23
|
end
|
27
24
|
end
|
28
25
|
|
29
26
|
def test_value
|
30
|
-
cell =
|
31
|
-
assert_kind_of
|
27
|
+
cell = roo_time.new('0.0751', nil, [:numeric_or_formula, 'h:mm'], 6, nil, base_timestamp, nil)
|
28
|
+
assert_kind_of Integer, cell.value
|
32
29
|
end
|
33
30
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class TestRooExcelxCoordinate < Minitest::Test
|
6
|
+
def row
|
7
|
+
10
|
8
|
+
end
|
9
|
+
|
10
|
+
def column
|
11
|
+
20
|
12
|
+
end
|
13
|
+
|
14
|
+
def coordinate
|
15
|
+
Roo::Excelx::Coordinate.new(row, column)
|
16
|
+
end
|
17
|
+
|
18
|
+
def array
|
19
|
+
[row, column]
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_row
|
23
|
+
assert_same row, coordinate.row
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_column
|
27
|
+
assert_same column, coordinate.column
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_frozen?
|
31
|
+
assert coordinate.frozen?
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_equality
|
35
|
+
hash = {}
|
36
|
+
hash[coordinate] = true
|
37
|
+
assert hash.key?(coordinate)
|
38
|
+
assert hash.key?(array)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_expand
|
42
|
+
r, c = coordinate
|
43
|
+
assert_same row, r
|
44
|
+
assert_same column, c
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_aref
|
48
|
+
assert_same row, coordinate[0]
|
49
|
+
assert_same column, coordinate[1]
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class TestRooFormatterCSV < Minitest::Test
|
4
|
+
def test_date_time_to_csv
|
5
|
+
with_each_spreadsheet(name: "time-test") do |workbook|
|
6
|
+
Dir.mktmpdir do |tempdir|
|
7
|
+
csv_output = File.join(tempdir, "time_test.csv")
|
8
|
+
assert workbook.to_csv(csv_output)
|
9
|
+
assert File.exist?(csv_output)
|
10
|
+
assert_equal "", `diff --strip-trailing-cr #{TESTDIR}/time-test.csv #{csv_output}`
|
11
|
+
# --strip-trailing-cr is needed because the test-file use 0A and
|
12
|
+
# the test on an windows box generates 0D 0A as line endings
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_boolean_to_csv
|
18
|
+
with_each_spreadsheet(name: "boolean") do |workbook|
|
19
|
+
Dir.mktmpdir do |tempdir|
|
20
|
+
csv_output = File.join(tempdir,"boolean.csv")
|
21
|
+
assert workbook.to_csv(csv_output)
|
22
|
+
assert File.exist?(csv_output)
|
23
|
+
assert_equal "", `diff --strip-trailing-cr #{TESTDIR}/boolean.csv #{csv_output}`
|
24
|
+
# --strip-trailing-cr is needed because the test-file use 0A and
|
25
|
+
# the test on an windows box generates 0D 0A as line endings
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_link_to_csv
|
31
|
+
with_each_spreadsheet(name: "link", format: :excelx) do |workbook|
|
32
|
+
Dir.mktmpdir do |tempdir|
|
33
|
+
csv_output = File.join(tempdir, "link.csv")
|
34
|
+
assert workbook.to_csv(csv_output)
|
35
|
+
assert File.exist?(csv_output)
|
36
|
+
assert_equal "", `diff --strip-trailing-cr #{TESTDIR}/link.csv #{csv_output}`
|
37
|
+
# --strip-trailing-cr is needed because the test-file use 0A and
|
38
|
+
# the test on an windows box generates 0D 0A as line endings
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# "/tmp/xxxx" darf man unter Windows nicht verwenden, weil das nicht erkannt
|
44
|
+
# wird.
|
45
|
+
# Besser: Methode um temporaeres Dir. portabel zu bestimmen
|
46
|
+
def test_huge_document_to_csv
|
47
|
+
skip_long_test
|
48
|
+
|
49
|
+
original_csv_path = File.join(TESTDIR, "Bibelbund.csv")
|
50
|
+
with_each_spreadsheet(name: "Bibelbund", format: [:openoffice, :excelx]) do |workbook|
|
51
|
+
Dir.mktmpdir do |tempdir|
|
52
|
+
new_csv_path = File.join(tempdir, "Bibelbund.csv")
|
53
|
+
assert_equal "Tagebuch des Sekret\303\244rs. Letzte Tagung 15./16.11.75 Schweiz", workbook.cell(45, "A")
|
54
|
+
assert_equal "Tagebuch des Sekret\303\244rs. Nachrichten aus Chile", workbook.cell(46, "A")
|
55
|
+
assert_equal "Tagebuch aus Chile Juli 1977", workbook.cell(55, "A")
|
56
|
+
assert workbook.to_csv(new_csv_path)
|
57
|
+
assert File.exist?(new_csv_path)
|
58
|
+
assert FileUtils.identical?(original_csv_path, new_csv_path), "error in class #{workbook.class}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_bug_empty_sheet
|
64
|
+
with_each_spreadsheet(name: "formula", format: [:openoffice, :excelx]) do |workbook|
|
65
|
+
workbook.default_sheet = "Sheet3" # is an empty sheet
|
66
|
+
Dir.mktmpdir do |tempdir|
|
67
|
+
workbook.to_csv(File.join(tempdir, "emptysheet.csv"))
|
68
|
+
assert_equal "", `cat #{File.join(tempdir, "emptysheet.csv")}`
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_bug_quotes_excelx
|
74
|
+
skip_long_test
|
75
|
+
# TODO: run this test with a much smaller document
|
76
|
+
with_each_spreadsheet(name: "Bibelbund", format: [:openoffice, :excelx]) do |workbook|
|
77
|
+
workbook.default_sheet = workbook.sheets.first
|
78
|
+
assert_equal(
|
79
|
+
'Einflüsse der neuen Theologie in "de gereformeerde Kerken van Nederland"',
|
80
|
+
workbook.cell("A", 76)
|
81
|
+
)
|
82
|
+
workbook.to_csv("csv#{$$}")
|
83
|
+
assert_equal(
|
84
|
+
'Einflüsse der neuen Theologie in "de gereformeerde Kerken van Nederland"',
|
85
|
+
workbook.cell("A", 78)
|
86
|
+
)
|
87
|
+
File.delete_if_exist("csv#{$$}")
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_bug_datetime_to_csv
|
92
|
+
with_each_spreadsheet(name: "datetime") do |workbook|
|
93
|
+
Dir.mktmpdir do |tempdir|
|
94
|
+
datetime_csv_file = File.join(tempdir, "datetime.csv")
|
95
|
+
|
96
|
+
assert workbook.to_csv(datetime_csv_file)
|
97
|
+
assert File.exist?(datetime_csv_file)
|
98
|
+
assert_equal "", file_diff("#{TESTDIR}/so_datetime.csv", datetime_csv_file)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_bug_datetime_offset_change
|
104
|
+
# DO NOT REMOVE Asia/Calcutta
|
105
|
+
[nil, "US/Eastern", "US/Pacific", "Asia/Calcutta"].each do |zone|
|
106
|
+
with_timezone(zone) do
|
107
|
+
with_each_spreadsheet(name: "datetime_timezone_ist_offset_change", format: %i[excelx openoffice libreoffice]) do |workbook|
|
108
|
+
Dir.mktmpdir do |tempdir|
|
109
|
+
datetime_csv_file = File.join(tempdir, "datetime_timezone_ist_offset_change.csv")
|
110
|
+
|
111
|
+
assert workbook.to_csv(datetime_csv_file)
|
112
|
+
assert File.exist?(datetime_csv_file)
|
113
|
+
assert_equal "", file_diff("#{TESTDIR}/so_datetime_timezone_ist_offset_change.csv", datetime_csv_file)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_true_class
|
121
|
+
assert_equal "true", cell_to_csv(1, 1)
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_false_class
|
125
|
+
assert_equal "false", cell_to_csv(2, 1)
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_date_class
|
129
|
+
assert_equal "2017-01-01", cell_to_csv(3, 1)
|
130
|
+
end
|
131
|
+
|
132
|
+
def cell_to_csv(row, col)
|
133
|
+
filename = File.join(TESTDIR, "formula_cell_types.xlsx")
|
134
|
+
Roo::Spreadsheet.open(filename).send("cell_to_csv", row, col, "Sheet1")
|
135
|
+
end
|
136
|
+
end
|