Feature #11267 » csv_field_allow_range.patch
| lib/csv.rb | ||
|---|---|---|
|     # | ||
|     def field(header_or_index, minimum_index = 0) | ||
|       # locate the pair | ||
|       finder = header_or_index.is_a?(Integer) ? :[] : :assoc | ||
|       finder = (header_or_index.is_a?(Integer) || header_or_index.is_a?(Range)) ? :[] : :assoc | ||
|       pair   = @row[minimum_index..-1].send(finder, header_or_index) | ||
|       # return the field if we have a pair | ||
|       pair.nil? ? nil : pair.last | ||
|       if pair.nil? | ||
|         nil | ||
|       else | ||
|         header_or_index.is_a?(Range) ? pair.map(&:last) : pair.last | ||
|       end | ||
|     end | ||
|     alias_method :[], :field | ||
| ... | ... | |
|     # | ||
|     def [](index_or_header) | ||
|       if @mode == :row or  # by index | ||
|          (@mode == :col_or_row and index_or_header.is_a? Integer) | ||
|          (@mode == :col_or_row and (index_or_header.is_a?(Integer) or index_or_header.is_a?(Range))) | ||
|         @table[index_or_header] | ||
|       else                 # by header | ||
|         @table.map { |row| row[index_or_header] } | ||
| test/csv/test_row.rb | ||
|---|---|---|
|     # by index | ||
|     assert_equal(3, @row.field(2)) | ||
|     # by range | ||
|     assert_equal([2,3], @row.field(1..2)) | ||
|     # missing | ||
|     assert_nil(@row.field("Missing")) | ||
|     assert_nil(@row.field(10)) | ||
| test/csv/test_table.rb | ||
|---|---|---|
|     @rows.each_index { |i| assert_equal(@rows[i], @table[i]) } | ||
|     assert_equal(nil, @table[100])  # empty row | ||
|     # by row with Range | ||
|     assert_equal([@table[1], @table[2]], @table[1..2]) | ||
|     # by col | ||
|     @rows.first.headers.each do |header| | ||
|       assert_equal(@rows.map { |row| row[header] }, @table[header]) | ||