spreadbase 0.1.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/workflows/ci.yml +25 -0
- data/.gitignore +3 -2
- data/.rspec +1 -0
- data/Gemfile +7 -0
- data/LICENSE +674 -0
- data/README.md +34 -18
- data/Rakefile +5 -0
- data/docs/STRUCTURE.md +3 -0
- data/docs/TESTING.md +11 -0
- data/lib/spreadbase.rb +7 -28
- data/lib/spreadbase/cell.rb +19 -0
- data/lib/spreadbase/codecs/open_document_12.rb +19 -44
- data/lib/spreadbase/codecs/open_document_12_modules/decoding.rb +99 -94
- data/lib/spreadbase/codecs/open_document_12_modules/encoding.rb +43 -72
- data/lib/spreadbase/document.rb +12 -33
- data/lib/spreadbase/helpers/helpers.rb +27 -61
- data/lib/spreadbase/table.rb +143 -82
- data/lib/spreadbase/version.rb +1 -3
- data/spec/codecs/open_document_12_spec.rb +128 -64
- data/spec/elements/document_spec.rb +56 -55
- data/spec/elements/table_spec.rb +202 -143
- data/spec/fixtures/test.ods +0 -0
- data/spec/spec_helper.rb +100 -0
- data/spec/spec_helpers.rb +10 -30
- data/spreadbase.gemspec +15 -10
- data/utils/convert_sqlite_to_ods.rb +30 -49
- data/utils/test_ods_folder.rb +7 -26
- data/utils/test_recoding_file.rb +11 -27
- data/utils/test_recoding_from_content.rb +10 -29
- data/utils/utils_helpers.rb +19 -33
- metadata +53 -27
- data/COPYING.LESSER +0 -165
- data/utils/prettify_file.rb +0 -46
data/lib/spreadbase/version.rb
CHANGED
@@ -1,25 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
=begin
|
4
|
-
Copyright 2012 Saverio Miroddi saverio.pub2 <a-hat!> gmail.com
|
5
|
-
|
6
|
-
This file is part of SpreadBase.
|
7
|
-
|
8
|
-
SpreadBase is free software: you can redistribute it and/or modify it under the
|
9
|
-
terms of the GNU Lesser General Public License as published by the Free Software
|
10
|
-
Foundation, either version 3 of the License, or (at your option) any later
|
11
|
-
version.
|
12
|
-
|
13
|
-
SpreadBase is distributed in the hope that it will be useful, but WITHOUT ANY
|
14
|
-
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
15
|
-
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
16
|
-
|
17
|
-
You should have received a copy of the GNU Lesser General Public License along
|
18
|
-
with SpreadBase. If not, see <http://www.gnu.org/licenses/>.
|
19
|
-
=end
|
20
|
-
|
21
|
-
require File.expand_path( '../../../lib/spreadbase', __FILE__ )
|
22
|
-
require File.expand_path( '../../spec_helpers', __FILE__ )
|
1
|
+
require_relative '../../lib/spreadbase'
|
2
|
+
require_relative '../spec_helpers'
|
23
3
|
|
24
4
|
require 'date'
|
25
5
|
require 'bigdecimal'
|
@@ -33,13 +13,13 @@ describe SpreadBase::Codecs::OpenDocument12 do
|
|
33
13
|
before :each do
|
34
14
|
table_1 = SpreadBase::Table.new(
|
35
15
|
'abc', [
|
36
|
-
[
|
37
|
-
[
|
38
|
-
[
|
16
|
+
[1, 1.1, T_BIGDECIMAL],
|
17
|
+
[T_DATE, T_DATETIME, T_TIME],
|
18
|
+
[nil, nil, 'a']
|
39
19
|
]
|
40
20
|
)
|
41
21
|
|
42
|
-
table_2 = SpreadBase::Table.new(
|
22
|
+
table_2 = SpreadBase::Table.new('cde')
|
43
23
|
|
44
24
|
@sample_document = SpreadBase::Document.new
|
45
25
|
|
@@ -49,89 +29,173 @@ describe SpreadBase::Codecs::OpenDocument12 do
|
|
49
29
|
# :encode/:decode
|
50
30
|
#
|
51
31
|
it "should encode and decode the sample document" do
|
52
|
-
document_archive = SpreadBase::Codecs::OpenDocument12.new.encode_to_archive(
|
32
|
+
document_archive = SpreadBase::Codecs::OpenDocument12.new.encode_to_archive(@sample_document)
|
53
33
|
|
54
|
-
document = SpreadBase::Codecs::OpenDocument12.new.decode_archive(
|
34
|
+
document = SpreadBase::Codecs::OpenDocument12.new.decode_archive(document_archive, floats_as_bigdecimal: true)
|
55
35
|
|
56
|
-
assert_size(
|
36
|
+
assert_size(document.tables, 2) do | table_1, table_2 |
|
57
37
|
|
58
|
-
table_1.name.
|
38
|
+
expect(table_1.name).to eq('abc')
|
59
39
|
|
60
|
-
assert_size(
|
40
|
+
assert_size(table_1.data, 3) do | row_1, row_2, row_3 |
|
61
41
|
|
62
|
-
assert_size(
|
63
|
-
value_1.
|
64
|
-
value_1.
|
65
|
-
value_2.
|
66
|
-
value_2.
|
67
|
-
value_3.
|
68
|
-
value_3.
|
42
|
+
assert_size(row_1, 3) do | value_1, value_2, value_3 |
|
43
|
+
expect(value_1).to eq(1)
|
44
|
+
expect(value_1).to be_a(Integer)
|
45
|
+
expect(value_2).to eq(1.1)
|
46
|
+
expect(value_2).to be_a(BigDecimal)
|
47
|
+
expect(value_3).to eq(T_BIGDECIMAL)
|
48
|
+
expect(value_3).to be_a(BigDecimal)
|
69
49
|
end
|
70
50
|
|
71
|
-
assert_size(
|
72
|
-
value_1.
|
73
|
-
value_2.
|
74
|
-
value_3.
|
51
|
+
assert_size(row_2, 3) do | value_1, value_2, value_3 |
|
52
|
+
expect(value_1).to eq(T_DATE)
|
53
|
+
expect(value_2).to eq(T_DATETIME)
|
54
|
+
expect(value_3).to eq(T_DATETIME)
|
75
55
|
end
|
76
56
|
|
77
|
-
assert_size(
|
78
|
-
value_1.
|
79
|
-
value_2.
|
80
|
-
value_3.
|
57
|
+
assert_size(row_3, 3) do | value_1, value_2, value_3 |
|
58
|
+
expect(value_1).to eq(nil)
|
59
|
+
expect(value_2).to eq(nil)
|
60
|
+
expect(value_3).to eq('a')
|
81
61
|
end
|
82
62
|
|
83
63
|
end
|
84
64
|
|
85
|
-
table_2.name.
|
65
|
+
expect(table_2.name).to eq('cde')
|
86
66
|
|
87
|
-
assert_size(
|
67
|
+
assert_size(table_2.data, 0)
|
88
68
|
end
|
89
69
|
end
|
90
70
|
|
91
71
|
# Not worth testing in detail; just ensure that the pref
|
92
72
|
#
|
93
73
|
it "should encode the document with makeup (:prettify) - SMOKE" do
|
94
|
-
formatter = stub_initializer(
|
74
|
+
formatter = stub_initializer(REXML::Formatters::Pretty)
|
95
75
|
|
96
|
-
formatter.
|
76
|
+
expect(formatter).to receive(:write)
|
97
77
|
|
98
|
-
SpreadBase::Codecs::OpenDocument12.new.encode_to_archive(
|
78
|
+
SpreadBase::Codecs::OpenDocument12.new.encode_to_archive(@sample_document, prettify: true)
|
99
79
|
end
|
100
80
|
|
101
81
|
# Those methods are actually "utility" (read: testing) methods.
|
102
82
|
#
|
103
83
|
it "should encode/decode the content.xml - SMOKE" do
|
104
|
-
content_xml = SpreadBase::Codecs::OpenDocument12.new.encode_to_content_xml(
|
84
|
+
content_xml = SpreadBase::Codecs::OpenDocument12.new.encode_to_content_xml(@sample_document)
|
105
85
|
|
106
|
-
document = SpreadBase::Codecs::OpenDocument12.new.decode_content_xml(
|
86
|
+
document = SpreadBase::Codecs::OpenDocument12.new.decode_content_xml(content_xml)
|
107
87
|
|
108
|
-
assert_size(
|
88
|
+
assert_size(document.tables, 2)
|
109
89
|
end
|
110
90
|
|
111
91
|
# If values are not converted to UTF-8, some encodings cause an error to be
|
112
92
|
# raised when assigning a value to a cell.
|
113
93
|
#
|
114
|
-
# 1.8 tests can't be done, since the official platform is 1.9
|
115
|
-
#
|
116
94
|
it "should convert to utf-8 before saving" do
|
117
|
-
string = "à".encode(
|
95
|
+
string = "à".encode('utf-16')
|
118
96
|
|
119
|
-
@sample_document.tables[
|
97
|
+
@sample_document.tables[0][0, 0] = string
|
120
98
|
|
121
99
|
# Doesn't encode correctly if the value is not converted
|
122
100
|
#
|
123
|
-
SpreadBase::Codecs::OpenDocument12.new.encode_to_content_xml(
|
101
|
+
SpreadBase::Codecs::OpenDocument12.new.encode_to_content_xml(@sample_document)
|
124
102
|
end
|
125
103
|
|
126
104
|
it "should decode as BigDecimal" do
|
127
|
-
content_xml = SpreadBase::Codecs::OpenDocument12.new.encode_to_content_xml(
|
105
|
+
content_xml = SpreadBase::Codecs::OpenDocument12.new.encode_to_content_xml(@sample_document)
|
106
|
+
|
107
|
+
document = SpreadBase::Codecs::OpenDocument12.new.decode_content_xml(content_xml, floats_as_bigdecimal: true)
|
108
|
+
|
109
|
+
value = document.tables[0][2, 0]
|
110
|
+
|
111
|
+
expect(value).to be_a(BigDecimal)
|
112
|
+
expect(value).to eq(T_BIGDECIMAL)
|
113
|
+
end
|
114
|
+
|
115
|
+
context "when cells at the end of the row are empty" do
|
116
|
+
let(:document_archive) do
|
117
|
+
document = SpreadBase::Document.new
|
118
|
+
|
119
|
+
document.tables << SpreadBase::Table.new(
|
120
|
+
'abc', [
|
121
|
+
[nil],
|
122
|
+
[nil, nil],
|
123
|
+
[1 , nil],
|
124
|
+
[nil, 1 , nil]
|
125
|
+
]
|
126
|
+
)
|
127
|
+
|
128
|
+
SpreadBase::Codecs::OpenDocument12.new.encode_to_archive(document)
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should drop such cells" do
|
132
|
+
document = SpreadBase::Codecs::OpenDocument12.new.decode_archive(document_archive)
|
133
|
+
table = document.tables[0]
|
128
134
|
|
129
|
-
|
135
|
+
assert_size(table.data, 4) do |row_1, row_2, row_3, row_4|
|
136
|
+
assert_size(row_1, 0)
|
130
137
|
|
131
|
-
|
138
|
+
assert_size(row_2, 0)
|
132
139
|
|
133
|
-
|
134
|
-
|
140
|
+
assert_size(row_3, 1) do |value_1|
|
141
|
+
expect(value_1).to eq(1)
|
142
|
+
end
|
143
|
+
|
144
|
+
assert_size(row_4, 2) do |value_1, value_2|
|
145
|
+
expect(value_1).to be_nil
|
146
|
+
expect(value_2).to eq(1)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
context "when cells of the last row are empty" do
|
153
|
+
let(:document_archive) do
|
154
|
+
document = SpreadBase::Document.new
|
155
|
+
|
156
|
+
document.tables << SpreadBase::Table.new(
|
157
|
+
'abc', [
|
158
|
+
[]
|
159
|
+
]
|
160
|
+
)
|
161
|
+
|
162
|
+
document.tables << SpreadBase::Table.new(
|
163
|
+
'def', [
|
164
|
+
[nil]
|
165
|
+
]
|
166
|
+
)
|
167
|
+
|
168
|
+
document.tables << SpreadBase::Table.new(
|
169
|
+
'ghi', [
|
170
|
+
[nil, nil]
|
171
|
+
]
|
172
|
+
)
|
173
|
+
|
174
|
+
document.tables << SpreadBase::Table.new(
|
175
|
+
'jkl', [
|
176
|
+
[nil],
|
177
|
+
[1],
|
178
|
+
[nil]
|
179
|
+
]
|
180
|
+
)
|
181
|
+
|
182
|
+
SpreadBase::Codecs::OpenDocument12.new.encode_to_archive(document)
|
183
|
+
end
|
184
|
+
|
185
|
+
it "should drop such row" do
|
186
|
+
document = SpreadBase::Codecs::OpenDocument12.new.decode_archive(document_archive)
|
187
|
+
tables = document.tables
|
188
|
+
|
189
|
+
assert_size(tables, 4) do |table_1, table_2, table_3, table_4|
|
190
|
+
assert_size(table_1.data, 0)
|
191
|
+
|
192
|
+
assert_size(table_2.data, 0)
|
193
|
+
|
194
|
+
assert_size(table_3.data, 0)
|
195
|
+
|
196
|
+
assert_size(table_4.data, 2)
|
197
|
+
end
|
198
|
+
end
|
135
199
|
end
|
136
200
|
|
137
201
|
end
|
@@ -1,25 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
=begin
|
4
|
-
Copyright 2012 Saverio Miroddi saverio.pub2 <a-hat!> gmail.com
|
5
|
-
|
6
|
-
This file is part of SpreadBase.
|
7
|
-
|
8
|
-
SpreadBase is free software: you can redistribute it and/or modify it under the
|
9
|
-
terms of the GNU Lesser General Public License as published by the Free Software
|
10
|
-
Foundation, either version 3 of the License, or (at your option) any later
|
11
|
-
version.
|
12
|
-
|
13
|
-
SpreadBase is distributed in the hope that it will be useful, but WITHOUT ANY
|
14
|
-
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
15
|
-
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
16
|
-
|
17
|
-
You should have received a copy of the GNU Lesser General Public License along
|
18
|
-
with SpreadBase. If not, see <http://www.gnu.org/licenses/>.
|
19
|
-
=end
|
20
|
-
|
21
|
-
require File.expand_path( '../../../lib/spreadbase', __FILE__ )
|
22
|
-
require File.expand_path( '../../spec_helpers', __FILE__ )
|
1
|
+
require_relative '../../lib/spreadbase'
|
2
|
+
require_relative '../spec_helpers'
|
23
3
|
|
24
4
|
include SpecHelpers
|
25
5
|
|
@@ -30,9 +10,9 @@ describe SpreadBase::Document do
|
|
30
10
|
@sample_document.tables = [
|
31
11
|
SpreadBase::Table.new(
|
32
12
|
'abc', [
|
33
|
-
[
|
34
|
-
[
|
35
|
-
[
|
13
|
+
[1, 1.1, T_BIGDECIMAL],
|
14
|
+
[T_DATE, T_DATETIME, T_TIME],
|
15
|
+
[true, 'a', nil]
|
36
16
|
]
|
37
17
|
)
|
38
18
|
]
|
@@ -43,61 +23,59 @@ describe SpreadBase::Document do
|
|
43
23
|
it "should initialize out of thin air" do
|
44
24
|
document = SpreadBase::Document.new
|
45
25
|
|
46
|
-
document.document_path.
|
26
|
+
expect(document.document_path).to be(nil)
|
47
27
|
|
48
|
-
document.tables.
|
28
|
+
expect(document.tables).to be_empty
|
49
29
|
end
|
50
30
|
|
51
31
|
# A lazy use of stubs
|
52
32
|
#
|
53
33
|
it "should initialize from a file" do
|
54
|
-
codec = stub_initializer(
|
34
|
+
codec = stub_initializer(SpreadBase::Codecs::OpenDocument12)
|
55
35
|
|
56
|
-
File.
|
57
|
-
IO.
|
58
|
-
codec.
|
36
|
+
expect(File).to receive(:'exist?').with('/pizza/margerita.txt').and_return(true)
|
37
|
+
expect(IO).to receive(:read).with('/pizza/margerita.txt').and_return('abc')
|
38
|
+
expect(codec).to receive(:decode_archive).with('abc', {}).and_return(@sample_document)
|
59
39
|
|
60
|
-
document = SpreadBase::Document.new(
|
40
|
+
document = SpreadBase::Document.new('/pizza/margerita.txt')
|
61
41
|
|
62
|
-
assert_size(
|
63
|
-
table.name.
|
64
|
-
table.data.size.
|
42
|
+
assert_size(document.tables, 1) do | table |
|
43
|
+
expect(table.name).to eq('abc')
|
44
|
+
expect(table.data.size).to eq(3)
|
65
45
|
end
|
66
46
|
end
|
67
47
|
|
68
48
|
it "should initialize with a non-existing file" do
|
69
|
-
|
70
|
-
|
71
|
-
document = SpreadBase::Document.new( '/pizza/margerita.txt' )
|
49
|
+
document = SpreadBase::Document.new('/pizza/margerita.txt')
|
72
50
|
|
73
|
-
assert_size(
|
51
|
+
assert_size(document.tables, 0)
|
74
52
|
end
|
75
53
|
|
76
54
|
it "should save to a file" do
|
77
|
-
codec = stub_initializer(
|
55
|
+
codec = stub_initializer(SpreadBase::Codecs::OpenDocument12)
|
78
56
|
|
79
57
|
document = SpreadBase::Document.new
|
80
|
-
document.tables << SpreadBase::Table.new(
|
58
|
+
document.tables << SpreadBase::Table.new('Ya-ha!')
|
81
59
|
document.document_path = '/tmp/abc.ods'
|
82
60
|
|
83
|
-
codec.
|
84
|
-
File.
|
61
|
+
expect(codec).to receive(:encode_to_archive).with(document, prettify: 'abc').and_return('sob!')
|
62
|
+
expect(File).to receive(:open).with('/tmp/abc.ods', 'wb')
|
85
63
|
|
86
|
-
document.save(
|
64
|
+
document.save(prettify: 'abc')
|
87
65
|
end
|
88
66
|
|
89
67
|
it "should raise an error when trying to save without a filename" do
|
90
68
|
document = SpreadBase::Document.new
|
91
|
-
document.tables << SpreadBase::Table.new(
|
69
|
+
document.tables << SpreadBase::Table.new('Ya-ha!')
|
92
70
|
|
93
|
-
|
71
|
+
expect { document.save }.to raise_error(RuntimeError, "Document path not specified")
|
94
72
|
end
|
95
73
|
|
96
74
|
it "should raise an error when trying to save without tables" do
|
97
75
|
document = SpreadBase::Document.new
|
98
76
|
document.document_path = 'abc.ods'
|
99
77
|
|
100
|
-
|
78
|
+
expect { document.save }.to raise_error(RuntimeError, "At least one table must be present")
|
101
79
|
end
|
102
80
|
|
103
81
|
it "should return the data as string (:to_s)" do
|
@@ -105,14 +83,14 @@ describe SpreadBase::Document do
|
|
105
83
|
abc:
|
106
84
|
|
107
85
|
+------------+---------------------------+---------------------------+
|
108
|
-
| 1 | 1.1 |
|
109
|
-
| 2012-04-10 | 2012-04-
|
110
|
-
| true | a |
|
86
|
+
| 1 | 1.1 | 1.33 |
|
87
|
+
| 2012-04-10 | 2012-04-11 23:33:42 +0000 | 2012-04-11 23:33:42 +0200 |
|
88
|
+
| true | a | NIL |
|
111
89
|
+------------+---------------------------+---------------------------+
|
112
90
|
|
113
91
|
"
|
114
92
|
|
115
|
-
@sample_document.to_s.
|
93
|
+
expect(@sample_document.to_s).to eq(expected_string)
|
116
94
|
end
|
117
95
|
|
118
96
|
it "should return the data as string, with headers (:to_s)" do
|
@@ -120,15 +98,38 @@ abc:
|
|
120
98
|
abc:
|
121
99
|
|
122
100
|
+------------+---------------------------+---------------------------+
|
123
|
-
| 1 | 1.1 |
|
101
|
+
| 1 | 1.1 | 1.33 |
|
124
102
|
+------------+---------------------------+---------------------------+
|
125
|
-
| 2012-04-10 | 2012-04-
|
126
|
-
| true | a |
|
103
|
+
| 2012-04-10 | 2012-04-11 23:33:42 +0000 | 2012-04-11 23:33:42 +0200 |
|
104
|
+
| true | a | NIL |
|
127
105
|
+------------+---------------------------+---------------------------+
|
128
106
|
|
129
107
|
"
|
130
108
|
|
131
|
-
@sample_document.to_s(
|
109
|
+
expect(@sample_document.to_s(with_headers: true)).to eq(expected_string)
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should parse a existing ODS file" do
|
113
|
+
ods_file = File.expand_path('../fixtures/test.ods', __dir__)
|
114
|
+
document = SpreadBase::Document.new(ods_file)
|
115
|
+
|
116
|
+
expect(document.tables[0].name).to eq('Sheet1')
|
117
|
+
expect(document.tables[0].data).to match([
|
118
|
+
match(['hoge' ]),
|
119
|
+
match([nil , 'fuga' ]),
|
120
|
+
match([nil , nil , 'piyo' ]),
|
121
|
+
match([nil , nil , nil , 'hogera' ]),
|
122
|
+
match([nil , nil , nil , nil , 'hogehoge'])
|
123
|
+
])
|
124
|
+
|
125
|
+
expect(document.tables[1].name).to eq('Sheet2')
|
126
|
+
expect(document.tables[1].data).to match([
|
127
|
+
match([nil , nil , nil , nil , 'foo']),
|
128
|
+
match([nil , nil , nil , 'bar' ]),
|
129
|
+
match([nil , nil , 'baz' ]),
|
130
|
+
match([nil , 'foobar' ]),
|
131
|
+
match(['qux' ])
|
132
|
+
])
|
132
133
|
end
|
133
134
|
|
134
135
|
end
|
data/spec/elements/table_spec.rb
CHANGED
@@ -1,36 +1,18 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
=begin
|
4
|
-
Copyright 2012 Saverio Miroddi saverio.pub2 <a-hat!> gmail.com
|
5
|
-
|
6
|
-
This file is part of SpreadBase.
|
7
|
-
|
8
|
-
SpreadBase is free software: you can redistribute it and/or modify it under the
|
9
|
-
terms of the GNU Lesser General Public License as published by the Free Software
|
10
|
-
Foundation, either version 3 of the License, or (at your option) any later
|
11
|
-
version.
|
12
|
-
|
13
|
-
SpreadBase is distributed in the hope that it will be useful, but WITHOUT ANY
|
14
|
-
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
15
|
-
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
16
|
-
|
17
|
-
You should have received a copy of the GNU Lesser General Public License along
|
18
|
-
with SpreadBase. If not, see <http://www.gnu.org/licenses/>.
|
19
|
-
=end
|
20
|
-
|
21
|
-
require File.expand_path( '../../../lib/spreadbase', __FILE__ )
|
22
|
-
require File.expand_path( '../../spec_helpers', __FILE__ )
|
1
|
+
require_relative '../../lib/spreadbase'
|
2
|
+
require_relative '../spec_helpers'
|
23
3
|
|
24
4
|
include SpecHelpers
|
25
5
|
|
6
|
+
include SpreadBase
|
7
|
+
|
26
8
|
describe SpreadBase::Table do
|
27
9
|
|
28
10
|
before :each do
|
29
11
|
@sample_table = SpreadBase::Table.new(
|
30
12
|
'abc', [
|
31
|
-
[
|
32
|
-
[
|
33
|
-
[
|
13
|
+
[1, 1.1, T_BIGDECIMAL],
|
14
|
+
[T_DATE, T_DATETIME, T_TIME],
|
15
|
+
[true, Cell.new('a'), nil]
|
34
16
|
]
|
35
17
|
)
|
36
18
|
end
|
@@ -39,89 +21,133 @@ describe SpreadBase::Table do
|
|
39
21
|
# this routine is called, by checking against the index (-1).
|
40
22
|
#
|
41
23
|
it "should check the row index" do
|
42
|
-
|
24
|
+
expect { @sample_table.row(4) }.to raise_error(RuntimeError, "Invalid row index (4) - allowed 0 to 2")
|
43
25
|
|
44
26
|
# called with :allow_append
|
45
|
-
|
46
|
-
|
27
|
+
expect { @sample_table.insert_row(-1, []) }.to raise_error(RuntimeError, "Invalid row index (-1) - allowed 0 to 3")
|
28
|
+
expect { @sample_table.insert_row(40, []) }.to raise_error(RuntimeError, "Invalid row index (40) - allowed 0 to 3")
|
47
29
|
end
|
48
30
|
|
49
|
-
it "should initialize with data" do
|
31
|
+
it "should initialize with data, and return the data" do
|
50
32
|
expected_data = [
|
51
|
-
[
|
52
|
-
[
|
53
|
-
[
|
33
|
+
[1, 1.1, T_BIGDECIMAL],
|
34
|
+
[T_DATE, T_DATETIME, T_TIME],
|
35
|
+
[true, 'a', nil]
|
54
36
|
]
|
55
37
|
|
56
|
-
@sample_table.data.
|
38
|
+
expect(@sample_table.data).to eq(expected_data)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "return the data in cell format" do
|
42
|
+
expected_data = [
|
43
|
+
[Cell.new(1), Cell.new(1.1), Cell.new(T_BIGDECIMAL)],
|
44
|
+
[Cell.new(T_DATE), Cell.new(T_DATETIME), Cell.new(T_TIME)],
|
45
|
+
[Cell.new(true), Cell.new('a'), Cell.new(nil)]
|
46
|
+
]
|
47
|
+
|
48
|
+
expect(@sample_table.data(as_cell: true)).to eq(expected_data)
|
57
49
|
end
|
58
50
|
|
59
51
|
it "should raise an error when the initialization requirements are not met" do
|
60
|
-
|
61
|
-
|
52
|
+
expect { SpreadBase::Table.new(nil) }.to raise_error("Table name required")
|
53
|
+
expect { SpreadBase::Table.new('') }.to raise_error("Table name required")
|
62
54
|
|
63
55
|
# This is acceptable
|
64
56
|
#
|
65
|
-
SpreadBase::Table.new(
|
57
|
+
SpreadBase::Table.new(' ')
|
66
58
|
end
|
67
59
|
|
68
60
|
it "should access a cell" do
|
69
|
-
@sample_table[
|
70
|
-
@sample_table[
|
71
|
-
@sample_table[
|
72
|
-
@sample_table[
|
73
|
-
@sample_table[
|
74
|
-
@sample_table[
|
75
|
-
@sample_table[
|
76
|
-
@sample_table[
|
77
|
-
@sample_table[
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
61
|
+
expect(@sample_table['a', 0]).to eq(1)
|
62
|
+
expect(@sample_table[1, 0]).to eq(1.1)
|
63
|
+
expect(@sample_table[2, 0]).to eq(T_BIGDECIMAL)
|
64
|
+
expect(@sample_table[0, 1]).to eq(T_DATE)
|
65
|
+
expect(@sample_table['B', 1]).to eq(T_DATETIME)
|
66
|
+
expect(@sample_table[2, 1]).to eq(T_TIME)
|
67
|
+
expect(@sample_table[0, 2]).to eq(true)
|
68
|
+
expect(@sample_table[1, 2]).to eq('a')
|
69
|
+
expect(@sample_table[2, 2]).to eq(nil)
|
70
|
+
|
71
|
+
expect(@sample_table[1, 2, as_cell: true]).to eq(Cell.new('a'))
|
72
|
+
|
73
|
+
expect { @sample_table[-1, 0] }.to raise_error(RuntimeError, "Negative column indexes not allowed: -1")
|
74
|
+
expect { @sample_table[0, -1] }.to raise_error(RuntimeError, "Invalid row index (-1) - allowed 0 to 2")
|
75
|
+
expect { @sample_table[3, 0] }.to raise_error(RuntimeError, "Invalid column index (3) for the given row - allowed 0 to 2")
|
82
76
|
end
|
83
77
|
|
84
78
|
it "should set a cell value" do
|
85
|
-
@sample_table[
|
86
|
-
@sample_table[
|
79
|
+
@sample_table[0, 0] = 10
|
80
|
+
@sample_table['B', 1] = Cell.new(T_TIME)
|
87
81
|
|
88
|
-
@sample_table.data.
|
89
|
-
[
|
90
|
-
[
|
91
|
-
[
|
92
|
-
]
|
82
|
+
expect(@sample_table.data).to eq([
|
83
|
+
[10, 1.1, T_BIGDECIMAL],
|
84
|
+
[T_DATE, T_TIME, T_TIME],
|
85
|
+
[true, 'a', nil],
|
86
|
+
])
|
93
87
|
|
94
|
-
|
95
|
-
|
88
|
+
expect { @sample_table[0, -1] = 33 }.to raise_error(RuntimeError, "Invalid row index (-1) - allowed 0 to 2")
|
89
|
+
expect { @sample_table[3, 0] = 44 }.to raise_error(RuntimeError, "Invalid column index (3) for the given row - allowed 0 to 2")
|
96
90
|
end
|
97
91
|
|
98
92
|
it "should access a row" do
|
99
|
-
@sample_table.row(
|
100
|
-
|
93
|
+
expect(@sample_table.row(0)).to eq([1, 1.1, T_BIGDECIMAL])
|
94
|
+
|
95
|
+
expect(@sample_table.row(1, as_cell: true)).to eq([Cell.new(T_DATE), Cell.new(T_DATETIME), Cell.new(T_TIME)])
|
96
|
+
|
97
|
+
expect { @sample_table.row(-1) }.to raise_error(RuntimeError, "Invalid row index (-1) - allowed 0 to 2")
|
98
|
+
end
|
101
99
|
|
102
|
-
|
100
|
+
it "should access a set of rows by range" do
|
101
|
+
expect(@sample_table.row(0..1)).to eq([
|
102
|
+
[1, 1.1, T_BIGDECIMAL],
|
103
|
+
[T_DATE, T_DATETIME, T_TIME],
|
104
|
+
])
|
105
|
+
|
106
|
+
expect { @sample_table.row(0..5) }.to raise_error(RuntimeError, "Invalid row index (5) - allowed 0 to 2")
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should access a set of rows by range (as cell)" do
|
110
|
+
expect(@sample_table.row(0..1, as_cell: true)).to eq([
|
111
|
+
[Cell.new(1), Cell.new(1.1), Cell.new(T_BIGDECIMAL)],
|
112
|
+
[Cell.new(T_DATE), Cell.new(T_DATETIME), Cell.new(T_TIME)],
|
113
|
+
])
|
114
|
+
|
115
|
+
expect { @sample_table.row(0..5) }.to raise_error(RuntimeError, "Invalid row index (5) - allowed 0 to 2")
|
103
116
|
end
|
104
117
|
|
105
118
|
it "should delete a row" do
|
106
|
-
@sample_table.delete_row(
|
119
|
+
expect(@sample_table.delete_row(1)).to eq([T_DATE, T_DATETIME, T_TIME])
|
107
120
|
|
108
|
-
@sample_table.data.
|
109
|
-
[
|
110
|
-
[
|
111
|
-
]
|
121
|
+
expect(@sample_table.data).to eq([
|
122
|
+
[1, 1.1, T_BIGDECIMAL],
|
123
|
+
[true, 'a', nil],
|
124
|
+
])
|
112
125
|
|
113
|
-
|
126
|
+
expect { @sample_table.delete_row(-1) }.to raise_error(RuntimeError, "Invalid row index (-1) - allowed 0 to 1")
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should delete a set of rows by range" do
|
130
|
+
expect(@sample_table.delete_row(0..1)).to eq([
|
131
|
+
[1, 1.1, T_BIGDECIMAL],
|
132
|
+
[T_DATE, T_DATETIME, T_TIME],
|
133
|
+
])
|
134
|
+
|
135
|
+
expect(@sample_table.data).to eq([
|
136
|
+
[true, 'a', nil]
|
137
|
+
])
|
138
|
+
|
139
|
+
expect { @sample_table.delete_row(0..5) }.to raise_error(RuntimeError, "Invalid row index (5) - allowed 0 to 0")
|
114
140
|
end
|
115
141
|
|
116
142
|
it "should insert a row" do
|
117
|
-
@sample_table.insert_row(
|
143
|
+
@sample_table.insert_row(1, [4, Cell.new(5), 6])
|
118
144
|
|
119
|
-
@sample_table.data.
|
120
|
-
[
|
121
|
-
[
|
122
|
-
[
|
123
|
-
[
|
124
|
-
]
|
145
|
+
expect(@sample_table.data).to eq([
|
146
|
+
[1, 1.1, T_BIGDECIMAL],
|
147
|
+
[4, 5, 6],
|
148
|
+
[T_DATE, T_DATETIME, T_TIME],
|
149
|
+
[true, 'a', nil],
|
150
|
+
])
|
125
151
|
|
126
152
|
# illegal row index tested in separate UT
|
127
153
|
end
|
@@ -129,139 +155,172 @@ describe SpreadBase::Table do
|
|
129
155
|
it "should insert a row without error if there is no data" do
|
130
156
|
@sample_table.data = []
|
131
157
|
|
132
|
-
@sample_table.insert_row(
|
158
|
+
@sample_table.insert_row(0, [4, 5])
|
133
159
|
|
134
|
-
@sample_table.data.size.
|
160
|
+
expect(@sample_table.data.size).to eq(1)
|
135
161
|
end
|
136
162
|
|
137
163
|
it "should append a row" do
|
138
|
-
@sample_table.append_row(
|
139
|
-
|
140
|
-
@sample_table.data.
|
141
|
-
[
|
142
|
-
[
|
143
|
-
[
|
144
|
-
[
|
145
|
-
]
|
164
|
+
@sample_table.append_row([4, Cell.new(5), 6])
|
165
|
+
|
166
|
+
expect(@sample_table.data).to eq([
|
167
|
+
[1, 1.1, T_BIGDECIMAL],
|
168
|
+
[T_DATE, T_DATETIME, T_TIME],
|
169
|
+
[true, 'a', nil],
|
170
|
+
[4, 5, 6],
|
171
|
+
])
|
146
172
|
end
|
147
173
|
|
148
174
|
it "should access a column" do
|
149
|
-
@sample_table.column(
|
150
|
-
|
175
|
+
expect(@sample_table.column(0)).to eq([1, T_DATE, true])
|
176
|
+
|
177
|
+
expect(@sample_table.column(1, as_cell: true)).to eq([Cell.new(1.1), Cell.new(T_DATETIME), Cell.new('a')])
|
178
|
+
|
179
|
+
expect(@sample_table.column(3)).to eq([nil, nil, nil])
|
180
|
+
end
|
181
|
+
|
182
|
+
it "should access a set of columns by range" do
|
183
|
+
expect(@sample_table.column(0..1)).to eq([
|
184
|
+
[1, T_DATE, true],
|
185
|
+
[1.1, T_DATETIME, 'a'],
|
186
|
+
])
|
151
187
|
|
152
|
-
@sample_table.column(
|
188
|
+
expect(@sample_table.column('C'..'D')).to eq([
|
189
|
+
[T_BIGDECIMAL, T_TIME, nil],
|
190
|
+
[nil, nil, nil],
|
191
|
+
])
|
192
|
+
end
|
193
|
+
|
194
|
+
it "should access a set of columns by range (as cell )" do
|
195
|
+
expect(@sample_table.column(0..1, as_cell: true)).to eq([
|
196
|
+
[Cell.new(1), Cell.new(T_DATE), Cell.new(true)],
|
197
|
+
[Cell.new(1.1), Cell.new(T_DATETIME), Cell.new('a')],
|
198
|
+
])
|
153
199
|
end
|
154
200
|
|
155
201
|
it "should delete a column" do
|
156
|
-
@sample_table.column_width_styles = [
|
202
|
+
@sample_table.column_width_styles = ['abc', nil, 'cde']
|
157
203
|
|
158
|
-
@sample_table.delete_column(
|
204
|
+
expect(@sample_table.delete_column(0)).to eq([1, T_DATE, true])
|
159
205
|
|
160
|
-
@sample_table.column_width_styles.
|
206
|
+
expect(@sample_table.column_width_styles).to eq([nil, 'cde'])
|
161
207
|
|
162
|
-
@sample_table.delete_column(
|
208
|
+
expect(@sample_table.delete_column(3)).to eq([nil, nil, nil])
|
163
209
|
|
164
|
-
@sample_table.column_width_styles.
|
210
|
+
expect(@sample_table.column_width_styles).to eq([nil, 'cde'])
|
165
211
|
|
166
|
-
@sample_table.data.
|
167
|
-
[
|
168
|
-
[
|
169
|
-
[
|
170
|
-
]
|
212
|
+
expect(@sample_table.data).to eq([
|
213
|
+
[1.1, T_BIGDECIMAL],
|
214
|
+
[T_DATETIME, T_TIME],
|
215
|
+
['a', nil]
|
216
|
+
])
|
217
|
+
end
|
218
|
+
|
219
|
+
it "should delete a set of columns by range" do
|
220
|
+
expect(@sample_table.delete_column(0..1)).to eq([
|
221
|
+
[1, T_DATE, true],
|
222
|
+
[1.1, T_DATETIME, 'a'],
|
223
|
+
])
|
224
|
+
|
225
|
+
expect(@sample_table.data).to eq([
|
226
|
+
[T_BIGDECIMAL],
|
227
|
+
[T_TIME],
|
228
|
+
[nil],
|
229
|
+
])
|
171
230
|
end
|
172
231
|
|
173
232
|
it "should insert a column" do
|
174
233
|
# Setup/fill table
|
175
234
|
|
176
|
-
@sample_table.column_width_styles = [
|
235
|
+
@sample_table.column_width_styles = ['abc', nil, 'cde']
|
177
236
|
|
178
|
-
@sample_table.insert_column(
|
237
|
+
@sample_table.insert_column(1, [34, 'abc', Cell.new(nil)])
|
179
238
|
|
180
|
-
@sample_table.data.
|
181
|
-
[
|
182
|
-
[
|
183
|
-
[
|
184
|
-
]
|
239
|
+
expect(@sample_table.data).to eq([
|
240
|
+
[1, 34, 1.1, T_BIGDECIMAL],
|
241
|
+
[T_DATE, 'abc', T_DATETIME, T_TIME],
|
242
|
+
[true, nil, 'a', nil],
|
243
|
+
])
|
185
244
|
|
186
|
-
@sample_table.column_width_styles = [
|
245
|
+
@sample_table.column_width_styles = ['abc', nil, nil, 'cde']
|
187
246
|
|
188
247
|
# Empty table
|
189
248
|
|
190
|
-
table = SpreadBase::Table.new(
|
249
|
+
table = SpreadBase::Table.new('abc')
|
191
250
|
|
192
|
-
table.insert_column(
|
251
|
+
table.insert_column(0, [34, 'abc', 1])
|
193
252
|
|
194
|
-
table.data.
|
195
|
-
[
|
196
|
-
[
|
197
|
-
[
|
198
|
-
]
|
253
|
+
expect(table.data).to eq([
|
254
|
+
[34,],
|
255
|
+
['abc'],
|
256
|
+
[1],
|
257
|
+
])
|
199
258
|
|
200
|
-
@sample_table.column_width_styles = [
|
259
|
+
@sample_table.column_width_styles = [nil]
|
201
260
|
end
|
202
261
|
|
203
262
|
it "should not insert a column if the size is not correct" do
|
204
|
-
|
263
|
+
expect { @sample_table.insert_column(1, [34, 'abc']) }.to raise_error(RuntimeError, "Inserting column size (2) different than existing columns size (3)")
|
205
264
|
|
206
|
-
@sample_table.data.first.size.
|
265
|
+
expect(@sample_table.data.first.size).to eq(3)
|
207
266
|
end
|
208
267
|
|
209
268
|
it "should insert a column outside the row boundaries" do
|
210
|
-
@sample_table.insert_column(
|
269
|
+
@sample_table.insert_column(5, [34, 'abc', nil])
|
211
270
|
|
212
|
-
@sample_table.data.
|
213
|
-
[
|
214
|
-
[
|
215
|
-
[
|
216
|
-
]
|
271
|
+
expect(@sample_table.data).to eq([
|
272
|
+
[1, 1.1, T_BIGDECIMAL, nil, nil, 34],
|
273
|
+
[T_DATE, T_DATETIME, T_TIME, nil, nil, 'abc'],
|
274
|
+
[true, 'a', nil, nil, nil, nil],
|
275
|
+
])
|
217
276
|
end
|
218
277
|
|
219
278
|
it "should append a column" do
|
220
|
-
table = SpreadBase::Table.new(
|
279
|
+
table = SpreadBase::Table.new('abc')
|
221
280
|
|
222
|
-
table.append_column(
|
281
|
+
table.append_column([Cell.new(34), 'abc', 1])
|
223
282
|
|
224
|
-
table.data.
|
225
|
-
[
|
226
|
-
[
|
227
|
-
[
|
228
|
-
]
|
283
|
+
expect(table.data).to eq([
|
284
|
+
[34,],
|
285
|
+
['abc'],
|
286
|
+
[1],
|
287
|
+
])
|
229
288
|
|
230
|
-
table.append_column(
|
289
|
+
table.append_column(['cute', 'little', 'spielerin'])
|
231
290
|
|
232
|
-
table.data.
|
233
|
-
[
|
234
|
-
[
|
235
|
-
[
|
236
|
-
]
|
291
|
+
expect(table.data).to eq([
|
292
|
+
[34, 'cute'],
|
293
|
+
['abc', 'little'],
|
294
|
+
[1, 'spielerin'],
|
295
|
+
])
|
237
296
|
end
|
238
297
|
|
239
298
|
it "return the data as string (:to_s)" do
|
240
299
|
expected_string = "\
|
241
300
|
+------------+---------------------------+---------------------------+
|
242
|
-
| 1 | 1.1 |
|
243
|
-
| 2012-04-10 | 2012-04-
|
244
|
-
| true | a |
|
301
|
+
| 1 | 1.1 | 1.33 |
|
302
|
+
| 2012-04-10 | 2012-04-11 23:33:42 +0000 | 2012-04-11 23:33:42 +0200 |
|
303
|
+
| true | a | NIL |
|
245
304
|
+------------+---------------------------+---------------------------+
|
246
305
|
"
|
247
|
-
@sample_table.to_s.
|
306
|
+
expect(@sample_table.to_s).to eq(expected_string)
|
248
307
|
end
|
249
308
|
|
250
309
|
it "return the data as string, with headers (:to_s)" do
|
251
310
|
expected_string = "\
|
252
311
|
+------------+---------------------------+---------------------------+
|
253
|
-
| 1 | 1.1 |
|
312
|
+
| 1 | 1.1 | 1.33 |
|
254
313
|
+------------+---------------------------+---------------------------+
|
255
|
-
| 2012-04-10 | 2012-04-
|
256
|
-
| true | a |
|
314
|
+
| 2012-04-10 | 2012-04-11 23:33:42 +0000 | 2012-04-11 23:33:42 +0200 |
|
315
|
+
| true | a | NIL |
|
257
316
|
+------------+---------------------------+---------------------------+
|
258
317
|
"
|
259
318
|
|
260
|
-
@sample_table.to_s(
|
319
|
+
expect(@sample_table.to_s(with_headers: true)).to eq(expected_string)
|
261
320
|
|
262
321
|
@sample_table.data = []
|
263
322
|
|
264
|
-
@sample_table.to_s(
|
323
|
+
expect(@sample_table.to_s(with_headers: true)).to eq("")
|
265
324
|
end
|
266
325
|
|
267
326
|
end
|