roo 1.13.2 → 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.
Files changed (236) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +17 -0
  3. data/.github/issue_template.md +16 -0
  4. data/.github/pull_request_template.md +14 -0
  5. data/.github/workflows/pull-request.yml +15 -0
  6. data/.github/workflows/ruby.yml +34 -0
  7. data/.gitignore +11 -0
  8. data/.rubocop.yml +186 -0
  9. data/.simplecov +4 -0
  10. data/CHANGELOG.md +702 -0
  11. data/Gemfile +18 -12
  12. data/Guardfile +23 -0
  13. data/LICENSE +5 -1
  14. data/README.md +328 -0
  15. data/Rakefile +23 -23
  16. data/examples/roo_soap_client.rb +28 -31
  17. data/examples/roo_soap_server.rb +4 -6
  18. data/examples/write_me.rb +9 -10
  19. data/lib/roo/base.rb +317 -504
  20. data/lib/roo/constants.rb +7 -0
  21. data/lib/roo/csv.rb +141 -113
  22. data/lib/roo/errors.rb +11 -0
  23. data/lib/roo/excelx/cell/base.rb +108 -0
  24. data/lib/roo/excelx/cell/boolean.rb +30 -0
  25. data/lib/roo/excelx/cell/date.rb +28 -0
  26. data/lib/roo/excelx/cell/datetime.rb +107 -0
  27. data/lib/roo/excelx/cell/empty.rb +20 -0
  28. data/lib/roo/excelx/cell/number.rb +99 -0
  29. data/lib/roo/excelx/cell/string.rb +19 -0
  30. data/lib/roo/excelx/cell/time.rb +44 -0
  31. data/lib/roo/excelx/cell.rb +110 -0
  32. data/lib/roo/excelx/comments.rb +55 -0
  33. data/lib/roo/excelx/coordinate.rb +19 -0
  34. data/lib/roo/excelx/extractor.rb +39 -0
  35. data/lib/roo/excelx/format.rb +71 -0
  36. data/lib/roo/excelx/images.rb +26 -0
  37. data/lib/roo/excelx/relationships.rb +33 -0
  38. data/lib/roo/excelx/shared.rb +39 -0
  39. data/lib/roo/excelx/shared_strings.rb +151 -0
  40. data/lib/roo/excelx/sheet.rb +151 -0
  41. data/lib/roo/excelx/sheet_doc.rb +257 -0
  42. data/lib/roo/excelx/styles.rb +64 -0
  43. data/lib/roo/excelx/workbook.rb +64 -0
  44. data/lib/roo/excelx.rb +407 -601
  45. data/lib/roo/font.rb +17 -0
  46. data/lib/roo/formatters/base.rb +15 -0
  47. data/lib/roo/formatters/csv.rb +84 -0
  48. data/lib/roo/formatters/matrix.rb +23 -0
  49. data/lib/roo/formatters/xml.rb +31 -0
  50. data/lib/roo/formatters/yaml.rb +40 -0
  51. data/lib/roo/helpers/default_attr_reader.rb +20 -0
  52. data/lib/roo/helpers/weak_instance_cache.rb +41 -0
  53. data/lib/roo/libre_office.rb +4 -0
  54. data/lib/roo/link.rb +34 -0
  55. data/lib/roo/open_office.rb +631 -0
  56. data/lib/roo/spreadsheet.rb +28 -23
  57. data/lib/roo/tempdir.rb +24 -0
  58. data/lib/roo/utils.rb +128 -0
  59. data/lib/roo/version.rb +3 -0
  60. data/lib/roo.rb +26 -24
  61. data/roo.gemspec +29 -203
  62. data/spec/helpers.rb +5 -0
  63. data/spec/lib/roo/base_spec.rb +291 -3
  64. data/spec/lib/roo/csv_spec.rb +38 -11
  65. data/spec/lib/roo/excelx/cell/time_spec.rb +15 -0
  66. data/spec/lib/roo/excelx/format_spec.rb +7 -6
  67. data/spec/lib/roo/excelx/relationships_spec.rb +43 -0
  68. data/spec/lib/roo/excelx/sheet_doc_spec.rb +11 -0
  69. data/spec/lib/roo/excelx_spec.rb +672 -11
  70. data/spec/lib/roo/libreoffice_spec.rb +16 -6
  71. data/spec/lib/roo/openoffice_spec.rb +30 -8
  72. data/spec/lib/roo/spreadsheet_spec.rb +60 -12
  73. data/spec/lib/roo/strict_spec.rb +43 -0
  74. data/spec/lib/roo/utils_spec.rb +119 -0
  75. data/spec/lib/roo/weak_instance_cache_spec.rb +92 -0
  76. data/spec/lib/roo_spec.rb +0 -0
  77. data/spec/spec_helper.rb +7 -6
  78. data/test/all_ss.rb +12 -11
  79. data/test/excelx/cell/test_attr_reader_default.rb +72 -0
  80. data/test/excelx/cell/test_base.rb +68 -0
  81. data/test/excelx/cell/test_boolean.rb +36 -0
  82. data/test/excelx/cell/test_date.rb +38 -0
  83. data/test/excelx/cell/test_datetime.rb +45 -0
  84. data/test/excelx/cell/test_empty.rb +18 -0
  85. data/test/excelx/cell/test_number.rb +90 -0
  86. data/test/excelx/cell/test_string.rb +48 -0
  87. data/test/excelx/cell/test_time.rb +30 -0
  88. data/test/excelx/test_coordinate.rb +51 -0
  89. data/test/formatters/test_csv.rb +136 -0
  90. data/test/formatters/test_matrix.rb +76 -0
  91. data/test/formatters/test_xml.rb +78 -0
  92. data/test/formatters/test_yaml.rb +20 -0
  93. data/test/helpers/test_accessing_files.rb +81 -0
  94. data/test/helpers/test_comments.rb +43 -0
  95. data/test/helpers/test_formulas.rb +9 -0
  96. data/test/helpers/test_labels.rb +103 -0
  97. data/test/helpers/test_sheets.rb +55 -0
  98. data/test/helpers/test_styles.rb +62 -0
  99. data/test/roo/test_base.rb +182 -0
  100. data/test/roo/test_csv.rb +88 -0
  101. data/test/roo/test_excelx.rb +360 -0
  102. data/test/roo/test_libre_office.rb +9 -0
  103. data/test/roo/test_open_office.rb +289 -0
  104. data/test/test_helper.rb +123 -59
  105. data/test/test_roo.rb +392 -2292
  106. metadata +153 -298
  107. data/CHANGELOG +0 -417
  108. data/Gemfile.lock +0 -78
  109. data/README.markdown +0 -126
  110. data/VERSION +0 -1
  111. data/lib/roo/excel.rb +0 -355
  112. data/lib/roo/excel2003xml.rb +0 -300
  113. data/lib/roo/google.rb +0 -292
  114. data/lib/roo/openoffice.rb +0 -496
  115. data/lib/roo/roo_rails_helper.rb +0 -83
  116. data/lib/roo/worksheet.rb +0 -18
  117. data/scripts/txt2html +0 -67
  118. data/spec/lib/roo/excel2003xml_spec.rb +0 -15
  119. data/spec/lib/roo/excel_spec.rb +0 -17
  120. data/spec/lib/roo/google_spec.rb +0 -64
  121. data/test/files/1900_base.xls +0 -0
  122. data/test/files/1900_base.xlsx +0 -0
  123. data/test/files/1904_base.xls +0 -0
  124. data/test/files/1904_base.xlsx +0 -0
  125. data/test/files/Bibelbund.csv +0 -3741
  126. data/test/files/Bibelbund.ods +0 -0
  127. data/test/files/Bibelbund.xls +0 -0
  128. data/test/files/Bibelbund.xlsx +0 -0
  129. data/test/files/Bibelbund.xml +0 -62518
  130. data/test/files/Bibelbund1.ods +0 -0
  131. data/test/files/Pfand_from_windows_phone.xlsx +0 -0
  132. data/test/files/bad_excel_date.xls +0 -0
  133. data/test/files/bbu.ods +0 -0
  134. data/test/files/bbu.xls +0 -0
  135. data/test/files/bbu.xlsx +0 -0
  136. data/test/files/bbu.xml +0 -152
  137. data/test/files/bode-v1.ods.zip +0 -0
  138. data/test/files/bode-v1.xls.zip +0 -0
  139. data/test/files/boolean.csv +0 -2
  140. data/test/files/boolean.ods +0 -0
  141. data/test/files/boolean.xls +0 -0
  142. data/test/files/boolean.xlsx +0 -0
  143. data/test/files/boolean.xml +0 -112
  144. data/test/files/borders.ods +0 -0
  145. data/test/files/borders.xls +0 -0
  146. data/test/files/borders.xlsx +0 -0
  147. data/test/files/borders.xml +0 -144
  148. data/test/files/bug-numbered-sheet-names.xlsx +0 -0
  149. data/test/files/bug-row-column-fixnum-float.xls +0 -0
  150. data/test/files/bug-row-column-fixnum-float.xml +0 -127
  151. data/test/files/comments.ods +0 -0
  152. data/test/files/comments.xls +0 -0
  153. data/test/files/comments.xlsx +0 -0
  154. data/test/files/csvtypes.csv +0 -1
  155. data/test/files/datetime.ods +0 -0
  156. data/test/files/datetime.xls +0 -0
  157. data/test/files/datetime.xlsx +0 -0
  158. data/test/files/datetime.xml +0 -142
  159. data/test/files/datetime_floatconv.xls +0 -0
  160. data/test/files/datetime_floatconv.xml +0 -148
  161. data/test/files/dreimalvier.ods +0 -0
  162. data/test/files/emptysheets.ods +0 -0
  163. data/test/files/emptysheets.xls +0 -0
  164. data/test/files/emptysheets.xlsx +0 -0
  165. data/test/files/emptysheets.xml +0 -105
  166. data/test/files/excel2003.xml +0 -21140
  167. data/test/files/false_encoding.xls +0 -0
  168. data/test/files/false_encoding.xml +0 -132
  169. data/test/files/file_item_error.xlsx +0 -0
  170. data/test/files/formula.ods +0 -0
  171. data/test/files/formula.xls +0 -0
  172. data/test/files/formula.xlsx +0 -0
  173. data/test/files/formula.xml +0 -134
  174. data/test/files/formula_parse_error.xls +0 -0
  175. data/test/files/formula_parse_error.xml +0 -1833
  176. data/test/files/formula_string_error.xlsx +0 -0
  177. data/test/files/html-escape.ods +0 -0
  178. data/test/files/link.xls +0 -0
  179. data/test/files/link.xlsx +0 -0
  180. data/test/files/matrix.ods +0 -0
  181. data/test/files/matrix.xls +0 -0
  182. data/test/files/named_cells.ods +0 -0
  183. data/test/files/named_cells.xls +0 -0
  184. data/test/files/named_cells.xlsx +0 -0
  185. data/test/files/no_spreadsheet_file.txt +0 -1
  186. data/test/files/numbers1.csv +0 -18
  187. data/test/files/numbers1.ods +0 -0
  188. data/test/files/numbers1.xls +0 -0
  189. data/test/files/numbers1.xlsx +0 -0
  190. data/test/files/numbers1.xml +0 -312
  191. data/test/files/numeric-link.xlsx +0 -0
  192. data/test/files/only_one_sheet.ods +0 -0
  193. data/test/files/only_one_sheet.xls +0 -0
  194. data/test/files/only_one_sheet.xlsx +0 -0
  195. data/test/files/only_one_sheet.xml +0 -67
  196. data/test/files/paragraph.ods +0 -0
  197. data/test/files/paragraph.xls +0 -0
  198. data/test/files/paragraph.xlsx +0 -0
  199. data/test/files/paragraph.xml +0 -127
  200. data/test/files/prova.xls +0 -0
  201. data/test/files/ric.ods +0 -0
  202. data/test/files/simple_spreadsheet.ods +0 -0
  203. data/test/files/simple_spreadsheet.xls +0 -0
  204. data/test/files/simple_spreadsheet.xlsx +0 -0
  205. data/test/files/simple_spreadsheet.xml +0 -225
  206. data/test/files/simple_spreadsheet_from_italo.ods +0 -0
  207. data/test/files/simple_spreadsheet_from_italo.xls +0 -0
  208. data/test/files/simple_spreadsheet_from_italo.xml +0 -242
  209. data/test/files/so_datetime.csv +0 -7
  210. data/test/files/style.ods +0 -0
  211. data/test/files/style.xls +0 -0
  212. data/test/files/style.xlsx +0 -0
  213. data/test/files/style.xml +0 -154
  214. data/test/files/time-test.csv +0 -2
  215. data/test/files/time-test.ods +0 -0
  216. data/test/files/time-test.xls +0 -0
  217. data/test/files/time-test.xlsx +0 -0
  218. data/test/files/time-test.xml +0 -131
  219. data/test/files/type_excel.ods +0 -0
  220. data/test/files/type_excel.xlsx +0 -0
  221. data/test/files/type_excelx.ods +0 -0
  222. data/test/files/type_excelx.xls +0 -0
  223. data/test/files/type_openoffice.xls +0 -0
  224. data/test/files/type_openoffice.xlsx +0 -0
  225. data/test/files/whitespace.ods +0 -0
  226. data/test/files/whitespace.xls +0 -0
  227. data/test/files/whitespace.xlsx +0 -0
  228. data/test/files/whitespace.xml +0 -184
  229. data/test/rm_sub_test.rb +0 -12
  230. data/test/rm_test.rb +0 -7
  231. data/test/test_generic_spreadsheet.rb +0 -259
  232. data/website/index.html +0 -385
  233. data/website/index.txt +0 -423
  234. data/website/javascripts/rounded_corners_lite.inc.js +0 -285
  235. data/website/stylesheets/screen.css +0 -130
  236. data/website/template.rhtml +0 -48
@@ -1,7 +1,295 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Roo::GenericSpreadsheet do
4
- it 'is an alias of Base' do
5
- expect(Roo::GenericSpreadsheet).to eq(Roo::Base)
3
+ describe Roo::Base do
4
+ let(:klass) do
5
+ Class.new(Roo::Base) do
6
+ def initialize(filename, data = {})
7
+ super(filename)
8
+ @data ||= data
9
+ end
10
+
11
+ def read_cells(sheet = default_sheet)
12
+ return if @cells_read[sheet]
13
+ type_map = { String => :string, Date => :date, Numeric => :float }
14
+
15
+ @cell[sheet] = @data
16
+ @cell_type[sheet] = Hash[@data.map { |k, v| [k, type_map.find {|type,_| v.is_a?(type) }.last ] }]
17
+ @first_row[sheet] = @data.map { |k, _| k[0] }.min
18
+ @last_row[sheet] = @data.map { |k, _| k[0] }.max
19
+ @first_column[sheet] = @data.map { |k, _| k[1] }.min
20
+ @last_column[sheet] = @data.map { |k, _| k[1] }.max
21
+ @cells_read[sheet] = true
22
+ end
23
+
24
+ def cell(row, col, sheet = nil)
25
+ sheet ||= default_sheet
26
+ read_cells(sheet)
27
+ @cell[sheet][[row, col]]
28
+ end
29
+
30
+ def celltype(row, col, sheet = nil)
31
+ sheet ||= default_sheet
32
+ read_cells(sheet)
33
+ @cell_type[sheet][[row, col]]
34
+ end
35
+
36
+ def sheets
37
+ ['my_sheet', 'blank sheet']
38
+ end
39
+ end
40
+ end
41
+
42
+ let(:spreadsheet_data) do
43
+ {
44
+ [3, 1] => 'Header',
45
+
46
+ [5, 1] => Date.civil(1961, 11, 21),
47
+
48
+ [8, 3] => 'thisisc8',
49
+ [8, 7] => 'thisisg8',
50
+
51
+ [12, 1] => 41.0,
52
+ [12, 2] => 42.0,
53
+ [12, 3] => 43.0,
54
+ [12, 4] => 44.0,
55
+ [12, 5] => 45.0,
56
+
57
+ [15, 3] => 43.0,
58
+ [15, 4] => 44.0,
59
+ [15, 5] => 45.0,
60
+
61
+ [16, 2] => '"Hello world!"',
62
+ [16, 3] => 'forty-three',
63
+ [16, 4] => 'forty-four',
64
+ [16, 5] => 'forty-five'
65
+ }
66
+ end
67
+
68
+ let(:spreadsheet) { klass.new('some_file', spreadsheet_data) }
69
+
70
+ describe '#uri?' do
71
+ it 'should return true when passed a filename starting with http(s)://' do
72
+ expect(spreadsheet.send(:uri?, 'http://example.com/')).to be_truthy
73
+ expect(spreadsheet.send(:uri?, 'https://example.com/')).to be_truthy
74
+ end
75
+
76
+ it 'should return false when passed a filename which does not start with http(s)://' do
77
+ expect(spreadsheet.send(:uri?, 'example.com')).to be_falsy
78
+ end
79
+
80
+ it 'should return false when passed non-String object such as Tempfile' do
81
+ expect(spreadsheet.send(:uri?, Tempfile.new('test'))).to be_falsy
82
+ end
83
+ end
84
+
85
+ describe '#set' do
86
+ it 'should not update cell when setting an invalid type' do
87
+ spreadsheet.set(1, 1, 1)
88
+ expect { spreadsheet.set(1, 1, :invalid_type) }.to raise_error(ArgumentError)
89
+ expect(spreadsheet.cell(1, 1)).to eq(1)
90
+ expect(spreadsheet.celltype(1, 1)).to eq(:float)
91
+ end
92
+ end
93
+
94
+ describe '#first_row' do
95
+ it 'should return the first row' do
96
+ expect(spreadsheet.first_row).to eq(3)
97
+ end
98
+ end
99
+
100
+ describe '#last_row' do
101
+ it 'should return the last row' do
102
+ expect(spreadsheet.last_row).to eq(16)
103
+ end
104
+ end
105
+
106
+ describe '#first_column' do
107
+ it 'should return the first column' do
108
+ expect(spreadsheet.first_column).to eq(1)
109
+ end
110
+ end
111
+
112
+ describe '#first_column_as_letter' do
113
+ it 'should return the first column as a letter' do
114
+ expect(spreadsheet.first_column_as_letter).to eq('A')
115
+ end
116
+ end
117
+
118
+ describe '#last_column' do
119
+ it 'should return the last column' do
120
+ expect(spreadsheet.last_column).to eq(7)
121
+ end
122
+ end
123
+
124
+ describe '#last_column_as_letter' do
125
+ it 'should return the last column as a letter' do
126
+ expect(spreadsheet.last_column_as_letter).to eq('G')
127
+ end
128
+ end
129
+
130
+ describe "#row" do
131
+ it "should return the specified row" do
132
+ expect(spreadsheet.row(12)).to eq([41.0, 42.0, 43.0, 44.0, 45.0, nil, nil])
133
+ expect(spreadsheet.row(16)).to eq([nil, '"Hello world!"', "forty-three", "forty-four", "forty-five", nil, nil])
134
+ end
135
+
136
+ it "should return the specified row if default_sheet is set by a string" do
137
+ spreadsheet.default_sheet = "my_sheet"
138
+ expect(spreadsheet.row(12)).to eq([41.0, 42.0, 43.0, 44.0, 45.0, nil, nil])
139
+ expect(spreadsheet.row(16)).to eq([nil, '"Hello world!"', "forty-three", "forty-four", "forty-five", nil, nil])
140
+ end
141
+
142
+ it "should return the specified row if default_sheet is set by an integer" do
143
+ spreadsheet.default_sheet = 0
144
+ expect(spreadsheet.row(12)).to eq([41.0, 42.0, 43.0, 44.0, 45.0, nil, nil])
145
+ expect(spreadsheet.row(16)).to eq([nil, '"Hello world!"', "forty-three", "forty-four", "forty-five", nil, nil])
146
+ end
147
+ end
148
+
149
+ describe '#row_with' do
150
+ context 'with a matching header row' do
151
+ it 'returns the row number' do
152
+ expect(spreadsheet.row_with([/Header/])). to eq 3
153
+ end
154
+ end
155
+
156
+ context 'without a matching header row' do
157
+ it 'raises an error' do
158
+ expect { spreadsheet.row_with([/Missing Header/]) }.to \
159
+ raise_error(Roo::HeaderRowNotFoundError)
160
+ end
161
+
162
+ it 'returns missing headers' do
163
+ expect { spreadsheet.row_with([/Header/, /Missing Header 1/, /Missing Header 2/]) }.to \
164
+ raise_error(Roo::HeaderRowNotFoundError, '[/Missing Header 1/, /Missing Header 2/]')
165
+ end
166
+ end
167
+ end
168
+
169
+ describe '#empty?' do
170
+ it 'should return true when empty' do
171
+ expect(spreadsheet.empty?(1, 1)).to be_truthy
172
+ expect(spreadsheet.empty?(8, 3)).to be_falsy
173
+ expect(spreadsheet.empty?('A', 11)).to be_truthy
174
+ expect(spreadsheet.empty?('A', 12)).to be_falsy
175
+ end
176
+ end
177
+
178
+ describe '#reload' do
179
+ it 'should return reinitialize the spreadsheet' do
180
+ spreadsheet.reload
181
+ expect(spreadsheet.instance_variable_get(:@cell).empty?).to be_truthy
182
+ end
183
+ end
184
+
185
+ describe '#each_with_pagename' do
186
+ context 'when block given' do
187
+ it 'iterate with sheet and sheet_name' do
188
+ sheet_names = []
189
+ spreadsheet.each_with_pagename do |sheet_name, sheet|
190
+ sheet_names << sheet_name
191
+ end
192
+ expect(sheet_names).to eq ['my_sheet', 'blank sheet']
193
+ end
194
+ end
195
+
196
+ context 'when called without block' do
197
+ it 'should return an enumerator with all the rows' do
198
+ each_with_pagename = spreadsheet.each_with_pagename
199
+ expect(each_with_pagename).to be_a(Enumerator)
200
+ expect(each_with_pagename.to_a.last).to eq([spreadsheet.default_sheet, spreadsheet])
201
+ end
202
+ end
203
+ end
204
+
205
+ describe '#each' do
206
+ it 'should return an enumerator with all the rows' do
207
+ each = spreadsheet.each
208
+ expect(each).to be_a(Enumerator)
209
+ expect(each.to_a.last).to eq([nil, '"Hello world!"', 'forty-three', 'forty-four', 'forty-five', nil, nil])
210
+ end
211
+ end
212
+
213
+ describe "#default_sheet=" do
214
+ it "should correctly set the default sheet if passed a string" do
215
+ spreadsheet.default_sheet = "my_sheet"
216
+ expect(spreadsheet.default_sheet).to eq("my_sheet")
217
+ end
218
+
219
+ it "should correctly set the default sheet if passed an integer" do
220
+ spreadsheet.default_sheet = 0
221
+ expect(spreadsheet.default_sheet).to eq("my_sheet")
222
+ end
223
+
224
+ it "should correctly set the default sheet if passed an integer for the second sheet" do
225
+ spreadsheet.default_sheet = 1
226
+ expect(spreadsheet.default_sheet).to eq("blank sheet")
227
+ end
228
+
229
+ it "should raise an error if passed a sheet that does not exist as an integer" do
230
+ expect { spreadsheet.default_sheet = 10 }.to raise_error RangeError
231
+ end
232
+
233
+ it "should raise an error if passed a sheet that does not exist as a string" do
234
+ expect { spreadsheet.default_sheet = "does_not_exist" }.to raise_error RangeError
235
+ end
236
+ end
237
+
238
+ describe '#to_yaml' do
239
+ it 'should convert the spreadsheet to yaml' do
240
+ expect(spreadsheet.to_yaml({}, 5, 1, 5, 1)).to eq("--- \n" + yaml_entry(5, 1, 'date', '1961-11-21'))
241
+ expect(spreadsheet.to_yaml({}, 8, 3, 8, 3)).to eq("--- \n" + yaml_entry(8, 3, 'string', 'thisisc8'))
242
+
243
+ expect(spreadsheet.to_yaml({}, 12, 3, 12, 3)).to eq("--- \n" + yaml_entry(12, 3, 'float', 43.0))
244
+
245
+ expect(spreadsheet.to_yaml({}, 12, 3, 12)).to eq(
246
+ "--- \n" + yaml_entry(12, 3, 'float', 43.0) +
247
+ yaml_entry(12, 4, 'float', 44.0) +
248
+ yaml_entry(12, 5, 'float', 45.0))
249
+
250
+ expect(spreadsheet.to_yaml({}, 12, 3)).to eq(
251
+ "--- \n" + yaml_entry(12, 3, 'float', 43.0) +
252
+ yaml_entry(12, 4, 'float', 44.0) +
253
+ yaml_entry(12, 5, 'float', 45.0) +
254
+ yaml_entry(15, 3, 'float', 43.0) +
255
+ yaml_entry(15, 4, 'float', 44.0) +
256
+ yaml_entry(15, 5, 'float', 45.0) +
257
+ yaml_entry(16, 3, 'string', 'forty-three') +
258
+ yaml_entry(16, 4, 'string', 'forty-four') +
259
+ yaml_entry(16, 5, 'string', 'forty-five'))
260
+ end
261
+ end
262
+
263
+ let(:expected_csv) do
264
+ <<EOS
265
+ ,,,,,,
266
+ ,,,,,,
267
+ "Header",,,,,,
268
+ ,,,,,,
269
+ 1961-11-21,,,,,,
270
+ ,,,,,,
271
+ ,,,,,,
272
+ ,,"thisisc8",,,,"thisisg8"
273
+ ,,,,,,
274
+ ,,,,,,
275
+ ,,,,,,
276
+ 41,42,43,44,45,,
277
+ ,,,,,,
278
+ ,,,,,,
279
+ ,,43,44,45,,
280
+ ,"""Hello world!""","forty-three","forty-four","forty-five",,
281
+ EOS
282
+ end
283
+
284
+ let(:expected_csv_with_semicolons) { expected_csv.gsub(/\,/, ';') }
285
+
286
+ describe '#to_csv' do
287
+ it 'should convert the spreadsheet to csv' do
288
+ expect(spreadsheet.to_csv).to eq(expected_csv)
289
+ end
290
+
291
+ it 'should convert the spreadsheet to csv using the separator when is passed on the parameter' do
292
+ expect(spreadsheet.to_csv(nil, ';')).to eq(expected_csv_with_semicolons)
293
+ end
6
294
  end
7
295
  end
@@ -10,12 +10,33 @@ describe Roo::CSV do
10
10
  end
11
11
  end
12
12
 
13
+ describe '.new with stream' do
14
+ let(:csv) { Roo::CSV.new(File.read(path)) }
15
+ it 'creates an instance' do
16
+ expect(csv).to be_a(Roo::CSV)
17
+ end
18
+ end
19
+
13
20
  describe '#parse' do
14
- subject {
21
+ subject do
15
22
  csv.parse(options)
16
- }
23
+ end
17
24
  context 'with headers: true' do
18
- let(:options) { {headers: true} }
25
+ let(:options) { { headers: true } }
26
+
27
+ it "doesn't blow up" do
28
+ expect { subject }.to_not raise_error
29
+ end
30
+ end
31
+ end
32
+
33
+ describe '#parse_with_clean_option' do
34
+ subject do
35
+ csv.parse(options)
36
+ end
37
+ context 'with clean: true' do
38
+ let(:options) { {clean: true} }
39
+ let(:path) { 'test/files/parse_with_clean_option.csv' }
19
40
 
20
41
  it "doesn't blow up" do
21
42
  expect { subject }.to_not raise_error
@@ -25,30 +46,36 @@ describe Roo::CSV do
25
46
 
26
47
  describe '#csv_options' do
27
48
  context 'when created with the csv_options option' do
28
- let(:options) {
49
+ let(:options) do
29
50
  {
30
51
  col_sep: '\t',
31
52
  quote_char: "'"
32
53
  }
33
- }
54
+ end
34
55
 
35
56
  it 'returns the csv options' do
36
57
  csv = Roo::CSV.new(path, csv_options: options)
37
- csv.csv_options.should == options
58
+ expect(csv.csv_options).to eq(options)
38
59
  end
39
60
  end
40
61
 
41
62
  context 'when created without the csv_options option' do
42
63
  it 'returns a hash' do
43
64
  csv = Roo::CSV.new(path)
44
- csv.csv_options.should == {}
65
+ expect(csv.csv_options).to eq({})
45
66
  end
46
67
  end
47
68
  end
48
- end
49
69
 
50
- describe Roo::Csv do
51
- it 'is an alias of LibreOffice' do
52
- expect(Roo::Csv).to eq(Roo::CSV)
70
+ describe '#set_value' do
71
+ it 'returns the cell value' do
72
+ expect(csv.set_value('A', 1, 'some-value', nil)).to eq('some-value')
73
+ end
74
+ end
75
+
76
+ describe '#set_type' do
77
+ it 'returns the cell type' do
78
+ expect(csv.set_type('A', 1, 'some-type', nil)).to eq('some-type')
79
+ end
53
80
  end
54
81
  end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Roo::Excelx::Cell::Time do
4
+ it "should set the cell value to the correct number of seconds" do
5
+ value = 0.05513888888888888 # '1:19:24'
6
+ excelx_type = [:numeric_or_formula, "h:mm:ss"]
7
+ base_timestamp = Date.new(1899, 12, 30).to_time.to_i
8
+ time_cell = Roo::Excelx::Cell::Time.new(value, nil, excelx_type, 1, nil, base_timestamp, nil)
9
+ expect(time_cell.value).to eq(1*60*60 + 19*60 + 24) # '1:19:24' in seconds
10
+ # use case from https://github.com/roo-rb/roo/issues/310
11
+ value = 0.523761574074074 # '12:34:13' in seconds
12
+ time_cell = Roo::Excelx::Cell::Time.new(value, nil, excelx_type, 1, nil, base_timestamp, nil)
13
+ expect(time_cell.value).to eq(12*60*60 + 34*60 + 13) # 12:34:13 in seconds
14
+ end
15
+ end
@@ -11,8 +11,8 @@ describe Roo::Excelx::Format do
11
11
  '0%' => :percentage,
12
12
  '0.00%' => :percentage,
13
13
  '0.00E+00' => :float,
14
- '# ?/?' => :float, #??? TODO:
15
- '# ??/??' => :float, #??? TODO:
14
+ '# ?/?' => :float, # ??? TODO:
15
+ '# ??/??' => :float, # ??? TODO:
16
16
  'mm-dd-yy' => :date,
17
17
  'd-mmm-yy' => :date,
18
18
  'd-mmm' => :date,
@@ -33,17 +33,18 @@ describe Roo::Excelx::Format do
33
33
  '##0.0E+0' => :float,
34
34
  '@' => :float,
35
35
  #-- zusaetzliche Formate, die nicht standardmaessig definiert sind:
36
- "yyyy\\-mm\\-dd" => :date,
36
+ 'yyyy\\-mm\\-dd' => :date,
37
37
  'dd/mm/yy' => :date,
38
38
  'hh:mm:ss' => :time,
39
- "dd/mm/yy\\ hh:mm" => :datetime,
39
+ 'dd/mm/yy\\ hh:mm' => :datetime,
40
40
  'dd/mmm/yy\\ hh:mm' => :datetime,
41
41
  'dd/mmm/yy' => :date, # 2011-05-21
42
42
  'yyyy-mm-dd' => :date, # 2011-09-16
43
- 'yyyy-mm-dd;@' => :date
43
+ 'yyyy-mm-dd;@' => :date,
44
+ '#0_);[Red]\(0\)' => :float
44
45
  }.each do |format, type|
45
46
  it "translates #{format} to #{type}" do
46
- Roo::Excelx::Format.to_type(format).should == type
47
+ expect(Roo::Excelx::Format.to_type(format)).to eq(type)
47
48
  end
48
49
  end
49
50
  end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe Roo::Excelx::Relationships do
6
+ subject(:relationships) { Roo::Excelx::Relationships.new Roo::Excelx.new(path).rels_files[0] }
7
+
8
+ describe "#include_type?" do
9
+ [
10
+ ["with hyperlink type", "test/files/link.xlsx", true, false],
11
+ ["with nil path", "test/files/Bibelbund.xlsx", false, false],
12
+ ["with comments type", "test/files/comments-google.xlsx", false, true],
13
+ ].each do |context_desc, file_path, hyperlink_value, comments_value|
14
+ context context_desc do
15
+ let(:path) { file_path }
16
+
17
+ it "should return #{hyperlink_value} for hyperlink" do
18
+ expect(subject.include_type?("hyperlink")).to be hyperlink_value
19
+ end
20
+
21
+ it "should return #{hyperlink_value} for link" do
22
+ expect(subject.include_type?("link")).to be hyperlink_value
23
+ end
24
+
25
+ it "should return false for hypelink" do
26
+ expect(subject.include_type?("hypelink")).to be false
27
+ end
28
+
29
+ it "should return false for coment" do
30
+ expect(subject.include_type?("coment")).to be false
31
+ end
32
+
33
+ it "should return #{comments_value} for comments" do
34
+ expect(subject.include_type?("comments")).to be comments_value
35
+ end
36
+
37
+ it "should return #{comments_value} for comment" do
38
+ expect(subject.include_type?("comment")).to be comments_value
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe Roo::Excelx::SheetDoc do
6
+ subject(:blank_children) { Roo::Excelx.new("test/files/blank_children.xlsx") }
7
+
8
+ example "#last_row" do
9
+ expect(subject.last_row).to eq 3
10
+ end
11
+ end