Project

General

Profile

Feature #12347 ยป 0001-lib-csv.rb-CSV-Row-Table-each-delete_if-Returns-an-e.patch

ktsj (Kazuki Tsujimoto), 05/04/2016 03:59 AM

View differences:

lib/csv.rb
#
# This method returns the row for chaining.
#
# If no block is given, an Enumerator is returned.
#
def delete_if(&block)
block or return enum_for(__method__) { size }
@row.delete_if(&block)
self # for chaining
......
#
# Yields each pair of the row as header and field tuples (much like
# iterating over a Hash).
# iterating over a Hash). This method returns the row for chaining.
#
# Support for Enumerable.
# If no block is given, an Enumerator is returned.
#
# This method returns the row for chaining.
# Support for Enumerable.
#
def each(&block)
block or return enum_for(__method__) { size }
@row.each(&block)
self # for chaining
......
#
# This method returns the table for chaining.
#
# If no block is given, an Enumerator is returned.
#
def delete_if(&block)
block or return enum_for(__method__) { @mode == :row or @mode == :col_or_row ? size : headers.size }
if @mode == :row or @mode == :col_or_row # by index
@table.delete_if(&block)
else # by header
......
#
# This method returns the table for chaining.
#
# If no block is given, an Enumerator is returned.
#
def each(&block)
block or return enum_for(__method__) { @mode == :col ? headers.size : size }
if @mode == :col
headers.each { |header| block[[header, self[header]]] }
else
test/csv/test_row.rb
# by header
assert_equal(["C", 3], @row.delete("C"))
# using a block
end
def test_delete_if
assert_equal(@row, @row.delete_if { |h, f| h == "A" and not f.nil? })
assert_equal([["A", nil]], @row.to_a)
assert_equal([["B", 2], ["C", 3], ["A", nil]], @row.to_a)
end
def test_delete_if_without_block
enum = @row.delete_if
assert_instance_of(Enumerator, enum)
assert_equal(@row.size, enum.size)
assert_equal(@row, enum.each { |h, f| h == "A" and not f.nil? })
assert_equal([["B", 2], ["C", 3], ["A", nil]], @row.to_a)
end
def test_fields
......
# verify that we can chain the call
assert_equal(@row, @row.each { })
# without block
ary = @row.to_a
enum = @row.each
assert_instance_of(Enumerator, enum)
assert_equal(@row.size, enum.size)
enum.each do |pair|
assert_equal(ary.first.first, pair.first)
assert_equal(ary.shift.last, pair.last)
end
end
def test_enumerable
test/csv/test_table.rb
# verify that we can chain the call
assert_equal(@table, @table.each { })
# without block
enum = @table.each
assert_instance_of(Enumerator, enum)
assert_equal(@table.size, enum.size)
i = 0
enum.each do |row|
assert_equal(@rows[i], row)
i += 1
end
###################
### Column Mode ###
###################
......
assert_equal(@table[header], column)
end
# without block
enum = @table.each
assert_instance_of(Enumerator, enum)
assert_equal(@table.headers.size, enum.size)
headers = @table.headers
enum.each do |header, column|
assert_equal(headers.shift, header)
assert_equal(@table[header], column)
end
############################
### One Shot Mode Change ###
############################
......
END_RESULT
end
def test_delete_if_row_without_block
######################
### Mixed/Row Mode ###
######################
enum = @table.delete_if
assert_instance_of(Enumerator, enum)
assert_equal(@table.size, enum.size)
# verify that we can chain the call
assert_equal(@table, enum.each { |row| (row["B"] % 2).zero? })
# verify resulting table
assert_equal(<<-END_RESULT.gsub(/^\s+/, ""), @table.to_csv)
A,B,C
4,5,6
END_RESULT
end
def test_delete_if_column
###################
### Column Mode ###
......
END_RESULT
end
def test_delete_if_column_without_block
###################
### Column Mode ###
###################
@table.by_col!
enum = @table.delete_if
assert_instance_of(Enumerator, enum)
assert_equal(@table.headers.size, enum.size)
assert_equal(@table, enum.each { |h, v| h > "A" })
assert_equal(<<-END_RESULT.gsub(/^\s+/, ""), @table.to_csv)
A
1
4
7
END_RESULT
end
def test_values_at
##################
### Mixed Mode ###
    (1-1/1)