roo 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,61 +2,63 @@ require 'roo/font'
2
2
  require 'roo/excelx/extractor'
3
3
 
4
4
  module Roo
5
- class Excelx::Styles < Excelx::Extractor
6
- # convert internal excelx attribute to a format
7
- def style_format(style)
8
- id = num_fmt_ids[style.to_i]
9
- num_fmts[id] || Excelx::Format::STANDARD_FORMATS[id.to_i]
10
- end
5
+ class Excelx
6
+ class Styles < Excelx::Extractor
7
+ # convert internal excelx attribute to a format
8
+ def style_format(style)
9
+ id = num_fmt_ids[style.to_i]
10
+ num_fmts[id] || Excelx::Format::STANDARD_FORMATS[id.to_i]
11
+ end
11
12
 
12
- def definitions
13
- @definitions ||= extract_definitions
14
- end
13
+ def definitions
14
+ @definitions ||= extract_definitions
15
+ end
15
16
 
16
- private
17
+ private
17
18
 
18
- def num_fmt_ids
19
- @num_fmt_ids ||= extract_num_fmt_ids
20
- end
19
+ def num_fmt_ids
20
+ @num_fmt_ids ||= extract_num_fmt_ids
21
+ end
21
22
 
22
- def num_fmts
23
- @num_fmts ||= extract_num_fmts
24
- end
23
+ def num_fmts
24
+ @num_fmts ||= extract_num_fmts
25
+ end
25
26
 
26
- def fonts
27
- @fonts ||= extract_fonts
28
- end
27
+ def fonts
28
+ @fonts ||= extract_fonts
29
+ end
29
30
 
30
- def extract_definitions
31
- doc.xpath("//cellXfs").flat_map do |xfs|
32
- xfs.children.map do |xf|
33
- fonts[xf['fontId'].to_i]
31
+ def extract_definitions
32
+ doc.xpath('//cellXfs').flat_map do |xfs|
33
+ xfs.children.map do |xf|
34
+ fonts[xf['fontId'].to_i]
35
+ end
34
36
  end
35
37
  end
36
- end
37
38
 
38
- def extract_fonts
39
- doc.xpath("//fonts/font").map do |font_el|
40
- Font.new.tap do |font|
41
- font.bold = !font_el.xpath('./b').empty?
42
- font.italic = !font_el.xpath('./i').empty?
43
- font.underline = !font_el.xpath('./u').empty?
39
+ def extract_fonts
40
+ doc.xpath('//fonts/font').map do |font_el|
41
+ Font.new.tap do |font|
42
+ font.bold = !font_el.xpath('./b').empty?
43
+ font.italic = !font_el.xpath('./i').empty?
44
+ font.underline = !font_el.xpath('./u').empty?
45
+ end
44
46
  end
45
47
  end
46
- end
47
48
 
48
- def extract_num_fmt_ids
49
- doc.xpath("//cellXfs").flat_map do |xfs|
50
- xfs.children.map do |xf|
51
- xf['numFmtId']
49
+ def extract_num_fmt_ids
50
+ doc.xpath('//cellXfs').flat_map do |xfs|
51
+ xfs.children.map do |xf|
52
+ xf['numFmtId']
53
+ end
52
54
  end
53
55
  end
54
- end
55
56
 
56
- def extract_num_fmts
57
- Hash[doc.xpath("//numFmt").map do |num_fmt|
58
- [num_fmt['numFmtId'], num_fmt['formatCode']]
59
- end]
57
+ def extract_num_fmts
58
+ Hash[doc.xpath('//numFmt').map do |num_fmt|
59
+ [num_fmt['numFmtId'], num_fmt['formatCode']]
60
+ end]
61
+ end
60
62
  end
61
63
  end
62
64
  end
@@ -1,59 +1,59 @@
1
1
  require 'roo/excelx/extractor'
2
2
 
3
3
  module Roo
4
- class Excelx::Workbook < Excelx::Extractor
5
- class Label
6
- attr_reader :sheet, :row, :col, :name
4
+ class Excelx
5
+ class Workbook < Excelx::Extractor
6
+ class Label
7
+ attr_reader :sheet, :row, :col, :name
7
8
 
8
- def initialize(name, sheet, row, col)
9
- @name = name
10
- @sheet = sheet
11
- @row = row.to_i
12
- @col = ::Roo::Utils.letter_to_number(col)
13
- end
9
+ def initialize(name, sheet, row, col)
10
+ @name = name
11
+ @sheet = sheet
12
+ @row = row.to_i
13
+ @col = ::Roo::Utils.letter_to_number(col)
14
+ end
14
15
 
15
- def key
16
- [@row, @col]
16
+ def key
17
+ [@row, @col]
18
+ end
17
19
  end
18
- end
19
20
 
20
- def initialize(path)
21
- super
22
- if !doc_exists?
23
- raise ArgumentError, 'missing required workbook file'
21
+ def initialize(path)
22
+ super
23
+ fail ArgumentError, 'missing required workbook file' unless doc_exists?
24
24
  end
25
- end
26
25
 
27
- def sheets
28
- doc.xpath("//sheet")
29
- end
26
+ def sheets
27
+ doc.xpath('//sheet')
28
+ end
30
29
 
31
- # aka labels
32
- def defined_names
33
- Hash[doc.xpath("//definedName").map do |defined_name|
34
- # "Sheet1!$C$5"
35
- sheet, coordinates = defined_name.text.split('!$', 2)
36
- col,row = coordinates.split('$')
37
- name = defined_name['name']
38
- [name, Label.new(name, sheet,row,col)]
39
- end]
40
- end
30
+ # aka labels
31
+ def defined_names
32
+ Hash[doc.xpath('//definedName').map do |defined_name|
33
+ # "Sheet1!$C$5"
34
+ sheet, coordinates = defined_name.text.split('!$', 2)
35
+ col, row = coordinates.split('$')
36
+ name = defined_name['name']
37
+ [name, Label.new(name, sheet, row, col)]
38
+ end]
39
+ end
41
40
 
42
- def base_date
43
- @base_date ||=
41
+ def base_date
42
+ @base_date ||=
44
43
  begin
45
44
  # Default to 1900 (minus one day due to excel quirk) but use 1904 if
46
45
  # it's set in the Workbook's workbookPr
47
46
  # http://msdn.microsoft.com/en-us/library/ff530155(v=office.12).aspx
48
- result = Date.new(1899,12,30) # default
49
- doc.css("workbookPr[date1904]").each do |workbookPr|
50
- if workbookPr["date1904"] =~ /true|1/i
51
- result = Date.new(1904,01,01)
47
+ result = Date.new(1899, 12, 30) # default
48
+ doc.css('workbookPr[date1904]').each do |workbookPr|
49
+ if workbookPr['date1904'] =~ /true|1/i
50
+ result = Date.new(1904, 01, 01)
52
51
  break
53
52
  end
54
53
  end
55
54
  result
56
55
  end
56
+ end
57
57
  end
58
58
  end
59
59
  end
@@ -13,7 +13,7 @@ class Roo::OpenOffice < Roo::Base
13
13
 
14
14
  @only_visible_sheets = options[:only_visible_sheets]
15
15
  file_type_check(filename,'.ods','an Roo::OpenOffice', file_warning, packed)
16
- @tmpdir = make_tmpdir(filename.split('/').last, options[:tmpdir_root])
16
+ @tmpdir = make_tmpdir(File.basename(filename), options[:tmpdir_root])
17
17
  @filename = local_filename(filename, @tmpdir, packed)
18
18
  #TODO: @cells_read[:default] = false
19
19
  Zip::File.open(@filename) do |zip_file|
@@ -38,6 +38,9 @@ class Roo::OpenOffice < Roo::Base
38
38
  @font_style_definitions = Hash.new
39
39
  @comment = Hash.new
40
40
  @comments_read = Hash.new
41
+ rescue => e # clean up any temp files, but only if an error was raised
42
+ close
43
+ raise e
41
44
  end
42
45
 
43
46
  def method_missing(m,*args)
@@ -1,3 +1,3 @@
1
1
  module Roo
2
- VERSION = "2.0.0"
2
+ VERSION = "2.0.1"
3
3
  end
@@ -36,6 +36,15 @@ describe Roo::Excelx do
36
36
  expect(Roo::Excelx.new(path, cell_max: 100)).to be_a(Roo::Excelx)
37
37
  end
38
38
  end
39
+
40
+ context 'file path is a Pathname' do
41
+ let(:path) { Pathname.new('test/files/file_item_error.xlsx') }
42
+
43
+ it 'creates an instance' do
44
+ expect(subject).to be_a(Roo::Excelx)
45
+ end
46
+ end
47
+
39
48
  end
40
49
 
41
50
  describe '#cell' do
@@ -411,5 +420,32 @@ describe Roo::Excelx do
411
420
  expect(index).to eq 4
412
421
  end
413
422
  end
423
+
424
+ context 'with offset option' do
425
+ let(:offset) { 3 }
426
+
427
+ it 'returns the expected result' do
428
+ index = 0
429
+ subject.each_row_streaming(offset: offset) do |row|
430
+ expect(row.map(&:value)).to eq expected_rows[index + offset]
431
+ index += 1
432
+ end
433
+ expect(index).to eq 11
434
+ end
435
+ end
436
+
437
+ context 'with offset and max_rows options' do
438
+ let(:offset) { 3 }
439
+ let(:max_rows) { 3 }
440
+
441
+ it 'returns the expected result' do
442
+ index = 0
443
+ subject.each_row_streaming(offset: offset, max_rows: max_rows) do |row|
444
+ expect(row.map(&:value)).to eq expected_rows[index + offset]
445
+ index += 1
446
+ end
447
+ expect(index).to eq 4
448
+ end
449
+ end
414
450
  end
415
451
  end
@@ -9,6 +9,17 @@ describe Roo::OpenOffice do
9
9
  it 'creates an instance' do
10
10
  expect(subject).to be_a(Roo::OpenOffice)
11
11
  end
12
+
13
+ context 'file path is a Pathname' do
14
+ subject do
15
+ Roo::OpenOffice.new(Pathname.new('test/files/numbers1.ods'))
16
+ end
17
+
18
+ it 'creates an instance' do
19
+ expect(subject).to be_a(Roo::OpenOffice)
20
+ end
21
+ end
22
+
12
23
  end
13
24
 
14
25
  # OpenOffice is an alias of LibreOffice. See libreoffice_spec.
@@ -2,30 +2,29 @@
2
2
  require File.dirname(__FILE__) + '/test_helper'
3
3
 
4
4
  class TestBase < Minitest::Test
5
-
6
5
  def setup
7
6
  @klass = Class.new(Roo::Base) do
8
- def initialize(filename='some_file')
7
+ def initialize(filename = 'some_file')
9
8
  super
10
9
  @filename = filename
11
10
  end
12
11
 
13
- def read_cells(sheet=nil)
12
+ def read_cells(sheet = nil)
14
13
  @cells_read[sheet] = true
15
14
  end
16
15
 
17
- def cell(row, col, sheet=nil)
16
+ def cell(row, col, sheet = nil)
18
17
  sheet ||= default_sheet
19
- @cell[sheet][[row,col]]
18
+ @cell[sheet][[row, col]]
20
19
  end
21
20
 
22
- def celltype(row, col, sheet=nil)
21
+ def celltype(row, col, sheet = nil)
23
22
  sheet ||= default_sheet
24
- @cell_type[sheet][[row,col]]
23
+ @cell_type[sheet][[row, col]]
25
24
  end
26
25
 
27
26
  def sheets
28
- ['my_sheet','blank sheet']
27
+ ['my_sheet', 'blank sheet']
29
28
  end
30
29
  end
31
30
  @oo = @klass.new
@@ -33,37 +32,37 @@ class TestBase < Minitest::Test
33
32
  end
34
33
 
35
34
  context 'private method Roo::Base.uri?(filename)' do
36
- should "return true when passed a filename starts with http(s)://" do
35
+ should 'return true when passed a filename starts with http(s)://' do
37
36
  assert_equal true, @oo.send(:uri?, 'http://example.com/')
38
37
  assert_equal true, @oo.send(:uri?, 'https://example.com/')
39
38
  end
40
39
 
41
- should "return false when passed a filename which does not start with http(s)://" do
40
+ should 'return false when passed a filename which does not start with http(s)://' do
42
41
  assert_equal false, @oo.send(:uri?, 'example.com')
43
42
  end
44
43
 
45
- should "return false when passed non-String object such as Tempfile" do
44
+ should 'return false when passed non-String object such as Tempfile' do
46
45
  assert_equal false, @oo.send(:uri?, Tempfile.new('test'))
47
46
  end
48
47
  end
49
48
 
50
49
  def test_setting_invalid_type_does_not_update_cell
51
- @oo.set(1,1,1)
52
- assert_raises(ArgumentError){@oo.set(1,1, :invalid_type)}
53
- assert_equal 1, @oo.cell(1,1)
54
- assert_equal :float, @oo.celltype(1,1)
50
+ @oo.set(1, 1, 1)
51
+ assert_raises(ArgumentError) { @oo.set(1, 1, :invalid_type) }
52
+ assert_equal 1, @oo.cell(1, 1)
53
+ assert_equal :float, @oo.celltype(1, 1)
55
54
  end
56
55
 
57
56
  def test_first_row
58
- assert_equal 5,@oo.first_row
57
+ assert_equal 5, @oo.first_row
59
58
  end
60
59
 
61
60
  def test_last_row
62
- assert_equal 16,@oo.last_row
61
+ assert_equal 16, @oo.last_row
63
62
  end
64
63
 
65
64
  def test_first_column
66
- assert_equal 1,@oo.first_column
65
+ assert_equal 1, @oo.first_column
67
66
  end
68
67
 
69
68
  def test_first_column_as_letter
@@ -78,17 +77,16 @@ class TestBase < Minitest::Test
78
77
  assert_equal 'G', @oo.last_column_as_letter
79
78
  end
80
79
 
81
- #TODO: inkonsequente Lieferung Fixnum/Float
82
80
  def test_rows
83
- assert_equal [41.0,42.0,43.0,44.0,45.0, nil, nil], @oo.row(12)
84
- assert_equal [nil, nil, "dreiundvierzig", "vierundvierzig", "fuenfundvierzig", nil, nil], @oo.row(16)
81
+ assert_equal [41.0, 42.0, 43.0, 44.0, 45.0, nil, nil], @oo.row(12)
82
+ assert_equal [nil, '"Hello world!"', 'dreiundvierzig', 'vierundvierzig', 'fuenfundvierzig', nil, nil], @oo.row(16)
85
83
  end
86
84
 
87
85
  def test_empty_eh
88
- assert @oo.empty?(1,1)
89
- assert !@oo.empty?(8,3)
90
- assert @oo.empty?("A",11)
91
- assert !@oo.empty?("A",12)
86
+ assert @oo.empty?(1, 1)
87
+ assert !@oo.empty?(8, 3)
88
+ assert @oo.empty?('A', 11)
89
+ assert !@oo.empty?('A', 12)
92
90
  end
93
91
 
94
92
  def test_reload
@@ -96,35 +94,43 @@ class TestBase < Minitest::Test
96
94
  assert @oo.instance_variable_get(:@cell).empty?
97
95
  end
98
96
 
97
+ def test_each
98
+ oo_each = @oo.each
99
+ assert_instance_of Enumerator, oo_each
100
+ assert_equal [nil, '"Hello world!"', 'dreiundvierzig', 'vierundvierzig', 'fuenfundvierzig', nil, nil], oo_each.to_a.last
101
+ end
102
+
99
103
  def test_to_yaml
100
- assert_equal "--- \n"+yaml_entry(5,1,"date","1961-11-21"), @oo.to_yaml({}, 5,1,5,1)
101
- assert_equal "--- \n"+yaml_entry(8,3,"string","thisisc8"), @oo.to_yaml({}, 8,3,8,3)
102
- assert_equal "--- \n"+yaml_entry(12,3,"float",43.0), @oo.to_yaml({}, 12,3,12,3)
104
+ assert_equal "--- \n" + yaml_entry(5, 1, 'date', '1961-11-21'), @oo.to_yaml({}, 5, 1, 5, 1)
105
+ assert_equal "--- \n" + yaml_entry(8, 3, 'string', 'thisisc8'), @oo.to_yaml({}, 8, 3, 8, 3)
106
+ assert_equal "--- \n" + yaml_entry(12, 3, 'float', 43.0), @oo.to_yaml({}, 12, 3, 12, 3)
103
107
  assert_equal \
104
- "--- \n"+yaml_entry(12,3,"float",43.0) +
105
- yaml_entry(12,4,"float",44.0) +
106
- yaml_entry(12,5,"float",45.0), @oo.to_yaml({}, 12,3,12)
108
+ "--- \n" + yaml_entry(12, 3, 'float', 43.0) +
109
+ yaml_entry(12, 4, 'float', 44.0) +
110
+ yaml_entry(12, 5, 'float', 45.0), @oo.to_yaml({}, 12, 3, 12)
107
111
  assert_equal \
108
- "--- \n"+yaml_entry(12,3,"float",43.0)+
109
- yaml_entry(12,4,"float",44.0)+
110
- yaml_entry(12,5,"float",45.0)+
111
- yaml_entry(15,3,"float",43.0)+
112
- yaml_entry(15,4,"float",44.0)+
113
- yaml_entry(15,5,"float",45.0)+
114
- yaml_entry(16,3,"string","dreiundvierzig")+
115
- yaml_entry(16,4,"string","vierundvierzig")+
116
- yaml_entry(16,5,"string","fuenfundvierzig"), @oo.to_yaml({}, 12,3)
112
+ "--- \n" + yaml_entry(12, 3, 'float', 43.0) +
113
+ yaml_entry(12, 4, 'float', 44.0) +
114
+ yaml_entry(12, 5, 'float', 45.0) +
115
+ yaml_entry(15, 3, 'float', 43.0) +
116
+ yaml_entry(15, 4, 'float', 44.0) +
117
+ yaml_entry(15, 5, 'float', 45.0) +
118
+ yaml_entry(16, 3, 'string', 'dreiundvierzig') +
119
+ yaml_entry(16, 4, 'string', 'vierundvierzig') +
120
+ yaml_entry(16, 5, 'string', 'fuenfundvierzig'), @oo.to_yaml({}, 12, 3)
117
121
  end
118
122
 
119
123
  def test_to_csv
120
- assert_equal expected_csv,@oo.to_csv
124
+ assert_equal expected_csv, @oo.to_csv
121
125
  end
122
126
 
123
127
  def test_to_csv_with_separator
124
- assert_equal expected_csv_with_semicolons,@oo.to_csv(nil, ';')
128
+ assert_equal expected_csv_with_semicolons, @oo.to_csv(nil, ';')
125
129
  end
126
- protected
127
- def setup_test_sheet(workbook=nil)
130
+
131
+ protected
132
+
133
+ def setup_test_sheet(workbook = nil)
128
134
  workbook ||= @oo
129
135
  set_sheet_values(workbook)
130
136
  set_sheet_types(workbook)
@@ -133,68 +139,70 @@ protected
133
139
 
134
140
  def set_sheet_values(workbook)
135
141
  workbook.instance_variable_get(:@cell)[workbook.default_sheet] = {
136
- [5,1] => Date.civil(1961,11,21).to_s,
142
+ [5, 1] => Date.civil(1961, 11, 21).to_s,
137
143
 
138
- [8,3] => "thisisc8",
139
- [8,7] => "thisisg8",
144
+ [8, 3] => 'thisisc8',
145
+ [8, 7] => 'thisisg8',
140
146
 
141
- [12,1] => 41.0,
142
- [12,2] => 42.0,
143
- [12,3] => 43.0,
144
- [12,4] => 44.0,
145
- [12,5] => 45.0,
147
+ [12, 1] => 41.0,
148
+ [12, 2] => 42.0,
149
+ [12, 3] => 43.0,
150
+ [12, 4] => 44.0,
151
+ [12, 5] => 45.0,
146
152
 
147
- [15,3] => 43.0,
148
- [15,4] => 44.0,
149
- [15,5] => 45.0,
153
+ [15, 3] => 43.0,
154
+ [15, 4] => 44.0,
155
+ [15, 5] => 45.0,
150
156
 
151
- [16,3] => "dreiundvierzig",
152
- [16,4] => "vierundvierzig",
153
- [16,5] => "fuenfundvierzig"
157
+ [16, 2] => '"Hello world!"',
158
+ [16, 3] => 'dreiundvierzig',
159
+ [16, 4] => 'vierundvierzig',
160
+ [16, 5] => 'fuenfundvierzig'
154
161
  }
155
162
  end
156
163
 
157
164
  def set_sheet_types(workbook)
158
165
  workbook.instance_variable_get(:@cell_type)[workbook.default_sheet] = {
159
- [5,1] => :date,
166
+ [5, 1] => :date,
160
167
 
161
- [8,3] => :string,
162
- [8,7] => :string,
168
+ [8, 3] => :string,
169
+ [8, 7] => :string,
163
170
 
164
- [12,1] => :float,
165
- [12,2] => :float,
166
- [12,3] => :float,
167
- [12,4] => :float,
168
- [12,5] => :float,
171
+ [12, 1] => :float,
172
+ [12, 2] => :float,
173
+ [12, 3] => :float,
174
+ [12, 4] => :float,
175
+ [12, 5] => :float,
169
176
 
170
- [15,3] => :float,
171
- [15,4] => :float,
172
- [15,5] => :float,
177
+ [15, 3] => :float,
178
+ [15, 4] => :float,
179
+ [15, 5] => :float,
173
180
 
174
- [16,3] => :string,
175
- [16,4] => :string,
176
- [16,5] => :string,
181
+ [16, 2] => :string,
182
+ [16, 3] => :string,
183
+ [16, 4] => :string,
184
+ [16, 5] => :string
177
185
  }
178
186
  end
179
187
 
180
188
  def set_first_row(workbook)
181
189
  row_hash = workbook.instance_variable_get(:@first_row)
182
- row_hash[workbook.default_sheet] = workbook.instance_variable_get(:@cell)[workbook.default_sheet].map{|k,v| k[0]}.min
190
+ row_hash[workbook.default_sheet] = workbook.instance_variable_get(:@cell)[workbook.default_sheet].map { |k, _v| k[0] }.min
183
191
  end
184
192
 
185
193
  def set_last_row(workbook)
186
194
  row_hash = workbook.instance_variable_get(:@last_row)
187
- row_hash[workbook.default_sheet] = workbook.instance_variable_get(:@cell)[workbook.default_sheet].map{|k,v| k[0]}.max
195
+ row_hash[workbook.default_sheet] = workbook.instance_variable_get(:@cell)[workbook.default_sheet].map { |k, _v| k[0] }.max
188
196
  end
189
197
 
190
198
  def set_first_col(workbook)
191
199
  col_hash = workbook.instance_variable_get(:@first_column)
192
- col_hash[workbook.default_sheet] = workbook.instance_variable_get(:@cell)[workbook.default_sheet].map{|k,v| k[1]}.min
200
+ col_hash[workbook.default_sheet] = workbook.instance_variable_get(:@cell)[workbook.default_sheet].map { |k, _v| k[1] }.min
193
201
  end
194
202
 
195
203
  def set_last_col(workbook)
196
204
  col_hash = workbook.instance_variable_get(:@last_column)
197
- col_hash[workbook.default_sheet] = workbook.instance_variable_get(:@cell)[workbook.default_sheet].map{|k,v| k[1]}.max
205
+ col_hash[workbook.default_sheet] = workbook.instance_variable_get(:@cell)[workbook.default_sheet].map { |k, _v| k[1] }.max
198
206
  end
199
207
 
200
208
  def set_cells_read(workbook)
@@ -203,9 +211,27 @@ protected
203
211
  end
204
212
 
205
213
  def expected_csv
206
- ",,,,,,\n,,,,,,\n,,,,,,\n,,,,,,\n1961-11-21,,,,,,\n,,,,,,\n,,,,,,\n,,\"thisisc8\",,,,\"thisisg8\"\n,,,,,,\n,,,,,,\n,,,,,,\n41,42,43,44,45,,\n,,,,,,\n,,,,,,\n,,43,44,45,,\n,,\"dreiundvierzig\",\"vierundvierzig\",\"fuenfundvierzig\",,\n"
214
+ <<EOS
215
+ ,,,,,,
216
+ ,,,,,,
217
+ ,,,,,,
218
+ ,,,,,,
219
+ 1961-11-21,,,,,,
220
+ ,,,,,,
221
+ ,,,,,,
222
+ ,,"thisisc8",,,,"thisisg8"
223
+ ,,,,,,
224
+ ,,,,,,
225
+ ,,,,,,
226
+ 41,42,43,44,45,,
227
+ ,,,,,,
228
+ ,,,,,,
229
+ ,,43,44,45,,
230
+ ,"""Hello world!""","dreiundvierzig","vierundvierzig","fuenfundvierzig",,
231
+ EOS
207
232
  end
233
+
208
234
  def expected_csv_with_semicolons
209
- expected_csv.gsub /\,/, ';'
235
+ expected_csv.gsub(/\,/, ';')
210
236
  end
211
237
  end