[ruby/csv] Fix CSV.filter to preserve headers (#174)
Co-authored-by: Sutou Kouhei <kou@clear-code.com> https://github.com/ruby/csv/commit/203c5e0574
This commit is contained in:
parent
207f2acc13
commit
614afb1647
Notes:
git
2020-11-24 09:34:32 +09:00
21
lib/csv.rb
21
lib/csv.rb
@ -1057,10 +1057,29 @@ class CSV
|
|||||||
out_options[key] = value
|
out_options[key] = value
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# build input and output wrappers
|
# build input and output wrappers
|
||||||
input = new(input || ARGF, **in_options)
|
input = new(input || ARGF, **in_options)
|
||||||
output = new(output || $stdout, **out_options)
|
output = new(output || $stdout, **out_options)
|
||||||
|
|
||||||
|
# process headers
|
||||||
|
need_manual_header_output =
|
||||||
|
(in_options[:headers] and
|
||||||
|
out_options[:headers] == true and
|
||||||
|
out_options[:write_headers])
|
||||||
|
if need_manual_header_output
|
||||||
|
first_row = input.shift
|
||||||
|
if first_row
|
||||||
|
if first_row.is_a?(Row)
|
||||||
|
headers = first_row.headers
|
||||||
|
yield headers
|
||||||
|
output << headers
|
||||||
|
end
|
||||||
|
yield first_row
|
||||||
|
output << first_row
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# read, yield, write
|
# read, yield, write
|
||||||
input.each do |row|
|
input.each do |row|
|
||||||
yield row
|
yield row
|
||||||
|
@ -6,7 +6,7 @@ class TestCSVInterfaceReadWrite < Test::Unit::TestCase
|
|||||||
extend DifferentOFS
|
extend DifferentOFS
|
||||||
|
|
||||||
def test_filter
|
def test_filter
|
||||||
input = <<-CSV
|
input = <<-CSV.freeze
|
||||||
1;2;3
|
1;2;3
|
||||||
4;5
|
4;5
|
||||||
CSV
|
CSV
|
||||||
@ -24,6 +24,71 @@ class TestCSVInterfaceReadWrite < Test::Unit::TestCase
|
|||||||
CSV
|
CSV
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_filter_headers_true
|
||||||
|
input = <<-CSV.freeze
|
||||||
|
Name,Value
|
||||||
|
foo,0
|
||||||
|
bar,1
|
||||||
|
baz,2
|
||||||
|
CSV
|
||||||
|
output = ""
|
||||||
|
CSV.filter(input, output, headers: true) do |row|
|
||||||
|
row[0] += "X"
|
||||||
|
row[1] = row[1].to_i + 1
|
||||||
|
end
|
||||||
|
assert_equal(<<-CSV, output)
|
||||||
|
fooX,1
|
||||||
|
barX,2
|
||||||
|
bazX,3
|
||||||
|
CSV
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_filter_headers_true_write_headers
|
||||||
|
input = <<-CSV.freeze
|
||||||
|
Name,Value
|
||||||
|
foo,0
|
||||||
|
bar,1
|
||||||
|
baz,2
|
||||||
|
CSV
|
||||||
|
output = ""
|
||||||
|
CSV.filter(input, output, headers: true, out_write_headers: true) do |row|
|
||||||
|
if row.is_a?(Array)
|
||||||
|
row[0] += "X"
|
||||||
|
row[1] += "Y"
|
||||||
|
else
|
||||||
|
row[0] += "X"
|
||||||
|
row[1] = row[1].to_i + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
assert_equal(<<-CSV, output)
|
||||||
|
NameX,ValueY
|
||||||
|
fooX,1
|
||||||
|
barX,2
|
||||||
|
bazX,3
|
||||||
|
CSV
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_filter_headers_array_write_headers
|
||||||
|
input = <<-CSV.freeze
|
||||||
|
foo,0
|
||||||
|
bar,1
|
||||||
|
baz,2
|
||||||
|
CSV
|
||||||
|
output = ""
|
||||||
|
CSV.filter(input, output,
|
||||||
|
headers: ["Name", "Value"],
|
||||||
|
out_write_headers: true) do |row|
|
||||||
|
row[0] += "X"
|
||||||
|
row[1] = row[1].to_i + 1
|
||||||
|
end
|
||||||
|
assert_equal(<<-CSV, output)
|
||||||
|
Name,Value
|
||||||
|
fooX,1
|
||||||
|
barX,2
|
||||||
|
bazX,3
|
||||||
|
CSV
|
||||||
|
end
|
||||||
|
|
||||||
def test_instance_same
|
def test_instance_same
|
||||||
data = ""
|
data = ""
|
||||||
assert_equal(CSV.instance(data, col_sep: ";").object_id,
|
assert_equal(CSV.instance(data, col_sep: ";").object_id,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user