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:
		
							parent
							
								
									f60caf13f9
								
							
						
					
					
						commit
						b425d4f19a
					
				
					 4 changed files with 108 additions and 5 deletions
				
			
		|  | @ -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. | ||||
|  |  | |||
							
								
								
									
										20
									
								
								lib/csv.rb
									
										
									
									
									
								
							
							
						
						
									
										20
									
								
								lib/csv.rb
									
										
									
									
									
								
							|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 ### | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 ktsj
						ktsj