1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* lib/csv.rb (CSV::{Row,Table}#{each,delete_if}): returns an enumerator

if no block is given. [ruby-core:75346] [Feature #11058]

* test/csv/test_row.rb: add test for above.

* test/csv/test_table.rb: ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56083 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ktsj 2016-09-07 06:06:09 +00:00
parent f60caf13f9
commit b425d4f19a
4 changed files with 108 additions and 5 deletions

View file

@ -1,3 +1,12 @@
Wed Sep 7 14:56:59 2016 Kazuki Tsujimoto <kazuki@callcc.net>
* lib/csv.rb (CSV::{Row,Table}#{each,delete_if}): returns an enumerator
if no block is given. [ruby-core:75346] [Feature #11058]
* test/csv/test_row.rb: add test for above.
* test/csv/test_table.rb: ditto.
Wed Sep 7 14:50:01 2016 Kazuki Tsujimoto <kazuki@callcc.net>
* gems/bundled_gems: update to power_assert 0.3.1.

View file

@ -431,7 +431,11 @@ class CSV
#
# 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
@ -500,13 +504,15 @@ class CSV
#
# 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.
#
# If no block is given, an Enumerator is returned.
#
# Support for Enumerable.
#
# This method returns the row for chaining.
#
def each(&block)
block or return enum_for(__method__) { size }
@row.each(&block)
self # for chaining
@ -822,7 +828,11 @@ class CSV
#
# 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
@ -845,7 +855,11 @@ class CSV
#
# 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

View file

@ -209,9 +209,20 @@ class TestCSV::Row < TestCSV
# 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
@ -281,6 +292,16 @@ class TestCSV::Row < TestCSV
# 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

View file

@ -220,6 +220,17 @@ class TestCSV::Table < TestCSV
# 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 ###
###################
@ -231,6 +242,17 @@ class TestCSV::Table < TestCSV
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 ###
############################
@ -363,6 +385,24 @@ class TestCSV::Table < TestCSV
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 ###
@ -378,6 +418,25 @@ class TestCSV::Table < TestCSV
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 ###