зеркало из https://github.com/github/ruby.git
* lib/csv.rb: If skip_lines is set to a String, convert it to a Regexp
to prevent the alternative, which is that each line in the CSV gets converted to a Regexp when calling skip_lines#match. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43823 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
10ca8a4b07
Коммит
80c4b4b3d7
|
@ -1,3 +1,9 @@
|
|||
Sat Nov 23 13:38:00 2013 Kyle Stevens <kstevens715@gmail.com>
|
||||
|
||||
* lib/csv.rb: If skip_lines is set to a String, convert it to a Regexp
|
||||
to prevent the alternative, which is that each line in the CSV gets
|
||||
converted to a Regexp when calling skip_lines#match.
|
||||
|
||||
Sun Nov 24 01:03:00 2013 Kenta Murata <mrkn@mrkn.jp>
|
||||
|
||||
* ext/bigdecimal/bigdecimal.c (BigDecimal_power): Use FIX2LONG instead
|
||||
|
|
13
lib/csv.rb
13
lib/csv.rb
|
@ -1470,11 +1470,12 @@ class CSV
|
|||
# <b><tt>:skip_lines</tt></b>:: When set to an object responding to
|
||||
# <tt>match</tt>, every line matching
|
||||
# it is considered a comment and ignored
|
||||
# during parsing. When set to +nil+
|
||||
# no line is considered a comment.
|
||||
# If the passed object does not respond
|
||||
# to <tt>match</tt>, <tt>ArgumentError</tt>
|
||||
# is thrown.
|
||||
# during parsing. When set to a String,
|
||||
# it is first converted to a Regexp.
|
||||
# When set to +nil+ no line is considered
|
||||
# a comment. If the passed object does
|
||||
# not respond to <tt>match</tt>,
|
||||
# <tt>ArgumentError</tt> is thrown.
|
||||
#
|
||||
# See CSV::DEFAULT_OPTIONS for the default settings.
|
||||
#
|
||||
|
@ -2120,10 +2121,12 @@ class CSV
|
|||
# Stores the pattern of comments to skip from the provided options.
|
||||
#
|
||||
# The pattern must respond to +.match+, else ArgumentError is raised.
|
||||
# Strings are converted to a Regexp.
|
||||
#
|
||||
# See also CSV.new
|
||||
def init_comments(options)
|
||||
@skip_lines = options.delete(:skip_lines)
|
||||
@skip_lines = Regexp.new(@skip_lines) if @skip_lines.is_a? String
|
||||
if @skip_lines and not @skip_lines.respond_to?(:match)
|
||||
raise ArgumentError, ":skip_lines has to respond to matches"
|
||||
end
|
||||
|
|
|
@ -299,12 +299,19 @@ class TestCSV::Features < TestCSV
|
|||
def test_comment_rows_are_ignored
|
||||
sample_data = "line,1,a\n#not,a,line\nline,2,b\n #also,no,line"
|
||||
c = CSV.new sample_data, :skip_lines => /\A\s*#/
|
||||
assert_equal c.each.to_a, [["line", "1", "a"], ["line", "2", "b"]]
|
||||
assert_equal [["line", "1", "a"], ["line", "2", "b"]], c.each.to_a
|
||||
end
|
||||
|
||||
def test_quoted_skip_line_markers_are_ignored
|
||||
sample_data = "line,1,a\n\"#not\",a,line\nline,2,b"
|
||||
c = CSV.new sample_data, :skip_lines => /\A\s*#/
|
||||
assert_equal c.each.to_a, [["line", "1", "a"], ["#not", "a", "line"], ["line", "2", "b"]]
|
||||
assert_equal [["line", "1", "a"], ["#not", "a", "line"], ["line", "2", "b"]], c.each.to_a
|
||||
end
|
||||
|
||||
def test_string_works_like_a_regexp
|
||||
sample_data = "line,1,a\n#(not,a,line\nline,2,b\n also,#no,line"
|
||||
c = CSV.new sample_data, :skip_lines => "#"
|
||||
assert_equal [["line", "1", "a"], ["line", "2", "b"]], c.each.to_a
|
||||
end
|
||||
|
||||
end
|
||||
|
|
Загрузка…
Ссылка в новой задаче