Bug #8560 ยป csv-string-skip-lines.patch
| ChangeLog | ||
|---|---|---|
| 
     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. 
   | 
||
| 
     Sat Nov 23 12:31:00 2013  Koichi Sasada  <ko1@atdot.net> 
   | 
||
| 
     	* gc.c: fix global variable name. 
   | 
||
| lib/csv.rb | ||
|---|---|---|
| 
       # <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. 
   | 
||
| 
       # 
   | 
||
| ... | ... | |
| 
       # 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 
   | 
||
| test/csv/test_features.rb | ||
|---|---|---|
| 
       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 
   | 
||