fastercsv 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +5 -0
- data/Rakefile +1 -1
- data/TODO +27 -0
- data/lib/faster_csv.rb +17 -12
- data/test/tc_features.rb +7 -0
- metadata +2 -2
    
        data/CHANGELOG
    CHANGED
    
    | @@ -2,6 +2,11 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            Below is a complete listing of changes for each revision of FasterCSV.
         | 
| 4 4 |  | 
| 5 | 
            +
            == 0.1.4
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            * Fixed <tt>:col_sep</tt> escaping bug (reported by Kev Jackson).
         | 
| 8 | 
            +
            * Switched to the use of named parsers internally.
         | 
| 9 | 
            +
             | 
| 5 10 | 
             
            == 0.1.3
         | 
| 6 11 |  | 
| 7 12 | 
             
            * Fixed typo in gem spec causing a require bug.
         | 
    
        data/Rakefile
    CHANGED
    
    
    
        data/TODO
    CHANGED
    
    | @@ -6,3 +6,30 @@ order. | |
| 6 6 | 
             
            * Add support for accessing fields by headers (from first row of document).
         | 
| 7 7 | 
             
            * Add "convertors" for switching numbers to Integers or Floats, dates to Date or
         | 
| 8 8 | 
             
              Time objects, etc.
         | 
| 9 | 
            +
            * Add to_csv().
         | 
| 10 | 
            +
            * Find a good headers solution for data like this:
         | 
| 11 | 
            +
                "Experiment ID:	1",,,,,,,,,,,,
         | 
| 12 | 
            +
                "Subject ID:	1013938829432171e868c340.
         | 
| 13 | 
            +
                Trial,stimulus,time,type,field1,field2,text_response,Abs. time of
         | 
| 14 | 
            +
                response,,,,,
         | 
| 15 | 
            +
                26,undefined,14828,KEY,RETURN,UNUSED,DCS,Sat Oct 15 17:48:04 GMT-0400
         | 
| 16 | 
            +
                2005,,,,,
         | 
| 17 | 
            +
                23,undefined,15078,KEY,RETURN,UNUSED,244,Sat Oct 15 17:48:19 GMT-0400
         | 
| 18 | 
            +
                2005,,,,,
         | 
| 19 | 
            +
                7,nixontrialleft copy.pct [TAG: 1],5953,KEY,1,UNUSED,,Sat Oct 15
         | 
| 20 | 
            +
                17:49:24 GMT-0400 2005,,,,,
         | 
| 21 | 
            +
                8,nixontrialfront copy.pct [TAG: 3],6250,KEY,3,UNUSED,,Sat Oct 15
         | 
| 22 | 
            +
                17:49:31 GMT-0400 2005,,,,,
         | 
| 23 | 
            +
                9,nixontrialright copy.pct [TAG: 2],2469,KEY,2,UNUSED,,Sat Oct 15
         | 
| 24 | 
            +
                17:49:34 GMT-0400 2005,,,,,
         | 
| 25 | 
            +
                #####
         | 
| 26 | 
            +
                more data
         | 
| 27 | 
            +
                ######
         | 
| 28 | 
            +
                ,,,,,,,,,,4374.347222,,
         | 
| 29 | 
            +
                ,,,,,,,,,,,,1.00
         | 
| 30 | 
            +
                ,,,,,,,,,,,,0.93
         | 
| 31 | 
            +
                ### and a new block starts
         | 
| 32 | 
            +
                "Experiment ID:	3",,,,,,,,,,,,0.92
         | 
| 33 | 
            +
                ....
         | 
| 34 | 
            +
            * Add FasterCSV.filter().
         | 
| 35 | 
            +
            * Add calculated fields.
         | 
    
        data/lib/faster_csv.rb
    CHANGED
    
    | @@ -277,15 +277,20 @@ class FasterCSV | |
| 277 277 | 
             
                @row_sep = options[:row_sep]
         | 
| 278 278 |  | 
| 279 279 | 
             
                # prebuild Regexps for faster parsing
         | 
| 280 | 
            -
                @parsers =  | 
| 281 | 
            -
             | 
| 282 | 
            -
             | 
| 283 | 
            -
             | 
| 284 | 
            -
             | 
| 285 | 
            -
             | 
| 286 | 
            -
             | 
| 287 | 
            -
             | 
| 288 | 
            -
             | 
| 280 | 
            +
                @parsers = {
         | 
| 281 | 
            +
                  :leading_fields =>
         | 
| 282 | 
            +
                    /\A#{Regexp.escape(@col_sep)}+/,         # for empty leading fields
         | 
| 283 | 
            +
                  :csv_row        =>
         | 
| 284 | 
            +
                    ### The Primary Parser ###
         | 
| 285 | 
            +
                    / \G(?:^|#{Regexp.escape(@col_sep)})     # anchor the match
         | 
| 286 | 
            +
                      (?: "((?>[^"]*)(?>""[^"]*)*)"          # find quoted fields
         | 
| 287 | 
            +
                          |                                  # ... or ...
         | 
| 288 | 
            +
                          ([^"#{Regexp.escape(@col_sep)}]*)  # unquoted fields
         | 
| 289 | 
            +
                          )/x,
         | 
| 290 | 
            +
                    ### End Primary Parser ###
         | 
| 291 | 
            +
                  :line_end       =>
         | 
| 292 | 
            +
                    /#{Regexp.escape(@row_sep)}\Z/           # safer than chomp!()
         | 
| 293 | 
            +
                }
         | 
| 289 294 | 
             
              end
         | 
| 290 295 |  | 
| 291 296 | 
             
              ### IO and StringIO Delegation ###
         | 
| @@ -369,7 +374,7 @@ class FasterCSV | |
| 369 374 | 
             
                  line  += @io.gets(@row_sep) rescue return nil
         | 
| 370 375 | 
             
                  # copy the line so we can chop it up in parsing
         | 
| 371 376 | 
             
                  parse = line.dup
         | 
| 372 | 
            -
                  parse.sub!(@parsers[ | 
| 377 | 
            +
                  parse.sub!(@parsers[:line_end], "")
         | 
| 373 378 |  | 
| 374 379 | 
             
                  # 
         | 
| 375 380 | 
             
                  # I believe a blank line should be an <tt>Array.new</tt>, not 
         | 
| @@ -381,7 +386,7 @@ class FasterCSV | |
| 381 386 | 
             
                  # shave leading empty fields if needed, because the main parser chokes 
         | 
| 382 387 | 
             
                  # on these
         | 
| 383 388 | 
             
                  # 
         | 
| 384 | 
            -
                  csv = if parse.sub!(@parsers[ | 
| 389 | 
            +
                  csv = if parse.sub!(@parsers[:leading_fields], "")
         | 
| 385 390 | 
             
                    [nil] * $&.length
         | 
| 386 391 | 
             
                  else
         | 
| 387 392 | 
             
                    Array.new
         | 
| @@ -390,7 +395,7 @@ class FasterCSV | |
| 390 395 | 
             
                  # then parse the main fields with a hyper-tuned Regexp from 
         | 
| 391 396 | 
             
                  # Mastering Regular Expressions, Second Edition
         | 
| 392 397 | 
             
                  # 
         | 
| 393 | 
            -
                  parse.gsub!(@parsers[ | 
| 398 | 
            +
                  parse.gsub!(@parsers[:csv_row]) do
         | 
| 394 399 | 
             
                    csv << if $1.nil?     # we found an unquoted field
         | 
| 395 400 | 
             
                      if $2.empty?        # switch empty unquoted fields to +nil+...
         | 
| 396 401 | 
             
                        nil               # for CSV compatibility
         | 
    
        data/test/tc_features.rb
    CHANGED
    
    | @@ -48,4 +48,11 @@ class TestFasterCSVFeatures < Test::Unit::TestCase | |
| 48 48 | 
             
                              FasterCSV.parse_line( %Q{1,2,"3\n",4,5\r\n},
         | 
| 49 49 | 
             
                                                    :row_sep => "\r\n") )
         | 
| 50 50 | 
             
              end
         | 
| 51 | 
            +
              
         | 
| 52 | 
            +
              def test_bug_fixes
         | 
| 53 | 
            +
                # failing to escape <tt>:col_sep</tt> (reported by Kev Jackson)
         | 
| 54 | 
            +
                assert_nothing_raised(Exception) do 
         | 
| 55 | 
            +
                  FasterCSV.new(String.new, :col_sep => "|")
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
              end
         | 
| 51 58 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -3,8 +3,8 @@ rubygems_version: 0.8.11 | |
| 3 3 | 
             
            specification_version: 1
         | 
| 4 4 | 
             
            name: fastercsv
         | 
| 5 5 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 6 | 
            -
              version: 0.1. | 
| 7 | 
            -
            date: 2005- | 
| 6 | 
            +
              version: 0.1.4
         | 
| 7 | 
            +
            date: 2005-12-02 00:00:00 -06:00
         | 
| 8 8 | 
             
            summary: "FasterCSV is CSV, but faster, smaller, and cleaner."
         | 
| 9 9 | 
             
            require_paths: 
         | 
| 10 10 | 
             
              - lib
         |