fastcsv 0.0.3 → 0.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1f1c56bdc3a7600dfb311eee7a98f07fe0d0e575
4
- data.tar.gz: 2fae9ec519e877178a81dfb6f139c0ce94c974d2
3
+ metadata.gz: e5c917e36ec5bc0f784fa36281e33e23a14784c3
4
+ data.tar.gz: 38ac5f6dc7c494759b98c06b4879c54770e088d7
5
5
  SHA512:
6
- metadata.gz: d9063634cca29ad95e961ee7bfa7269dc906c39a70a8317e35ea6ffc5991bd0caadf5b985040638d392bcbd49f1931d991261377c9a94c04d31b0147a8e9d721
7
- data.tar.gz: 51314a4e948a996ad1546097ac7ad5c9d9d72eb6e8ef38a8874039920814445bee5de121225b81d5e2d461037b7fe23b1595c6be1f54dc93576aa7497681d91f
6
+ metadata.gz: bfcc78d6223c83a270b658921a334e70f58dc600d380935d3baf27e980c0881cfcc5018af08adbb5f039f839aa52c153f161013fa1ae544f74c5968fac1daf86
7
+ data.tar.gz: 0e7c462ec4f1d41174885faa9af6fd93db533cb143e1403fa7dc0b3fa18bc8e6a69a4e3db3697ee798f430d3af5191f31d9c2eee04f6e9e2e40edcccb0ca45dc
@@ -24,9 +24,6 @@ if (enc2 != NULL) { \
24
24
  #define FREE \
25
25
  if (buf != NULL) { \
26
26
  free(buf); \
27
- } \
28
- if (row_sep != NULL) { \
29
- free(row_sep); \
30
27
  }
31
28
 
32
29
  static VALUE cClass, cParser, eError;
@@ -38,11 +35,11 @@ typedef struct {
38
35
  } Data;
39
36
 
40
37
 
41
- #line 170 "ext/fastcsv/fastcsv.rl"
38
+ #line 152 "ext/fastcsv/fastcsv.rl"
42
39
 
43
40
 
44
41
 
45
- #line 46 "ext/fastcsv/fastcsv.c"
42
+ #line 43 "ext/fastcsv/fastcsv.c"
46
43
  static const int raw_parse_start = 4;
47
44
  static const int raw_parse_first_final = 4;
48
45
  static const int raw_parse_error = 0;
@@ -50,7 +47,7 @@ static const int raw_parse_error = 0;
50
47
  static const int raw_parse_en_main = 4;
51
48
 
52
49
 
53
- #line 173 "ext/fastcsv/fastcsv.rl"
50
+ #line 155 "ext/fastcsv/fastcsv.rl"
54
51
 
55
52
  // 16 kB
56
53
  #define BUFSIZE 16384
@@ -83,11 +80,11 @@ static void rb_io_ext_int_to_encs(rb_encoding *ext, rb_encoding *intern, rb_enco
83
80
 
84
81
  static VALUE raw_parse(int argc, VALUE *argv, VALUE self) {
85
82
  int cs, act, have = 0, curline = 1, io = 0;
86
- char *ts = 0, *te = 0, *buf = 0, *eof = 0, *mark_row_sep = 0, *row_sep = NULL;
83
+ char *ts = 0, *te = 0, *buf = 0, *eof = 0;
87
84
 
88
85
  VALUE port, opts, r_encoding;
89
86
  VALUE row = rb_ary_new(), field = Qnil, bufsize = Qnil;
90
- int done = 0, unclosed_line = 0, len_row_sep = 0, buffer_size = 0, taint = 0;
87
+ int done = 0, unclosed_line = 0, buffer_size = 0, taint = 0;
91
88
  rb_encoding *enc = NULL, *enc2 = NULL, *encoding = NULL;
92
89
 
93
90
  Data *d;
@@ -225,6 +222,8 @@ static VALUE raw_parse(int argc, VALUE *argv, VALUE self) {
225
222
  encoding = rb_enc_get(r_encoding);
226
223
  }
227
224
 
225
+ // In case #raw_parse is called multiple times on the same parser. Note that
226
+ // using IO methods on a re-used parser can cause segmentation faults.
228
227
  rb_ivar_set(self, s_row, Qnil);
229
228
 
230
229
  buffer_size = BUFSIZE;
@@ -244,7 +243,7 @@ static VALUE raw_parse(int argc, VALUE *argv, VALUE self) {
244
243
  }
245
244
 
246
245
 
247
- #line 248 "ext/fastcsv/fastcsv.c"
246
+ #line 247 "ext/fastcsv/fastcsv.c"
248
247
  {
249
248
  cs = raw_parse_start;
250
249
  ts = 0;
@@ -252,12 +251,12 @@ static VALUE raw_parse(int argc, VALUE *argv, VALUE self) {
252
251
  act = 0;
253
252
  }
254
253
 
255
- #line 366 "ext/fastcsv/fastcsv.rl"
254
+ #line 350 "ext/fastcsv/fastcsv.rl"
256
255
 
257
256
  while (!done) {
258
257
  VALUE str;
259
258
  char *p, *pe;
260
- int len, space = buffer_size - have, tokstart_diff, tokend_diff, start_diff, mark_row_sep_diff;
259
+ int len, space = buffer_size - have, tokstart_diff, tokend_diff, start_diff;
261
260
 
262
261
  if (io) {
263
262
  if (space == 0) {
@@ -265,7 +264,6 @@ static VALUE raw_parse(int argc, VALUE *argv, VALUE self) {
265
264
  tokstart_diff = ts - buf;
266
265
  tokend_diff = te - buf;
267
266
  start_diff = d->start - buf;
268
- mark_row_sep_diff = mark_row_sep - buf;
269
267
 
270
268
  buffer_size += BUFSIZE;
271
269
  REALLOC_N(buf, char, buffer_size);
@@ -275,7 +273,6 @@ static VALUE raw_parse(int argc, VALUE *argv, VALUE self) {
275
273
  ts = buf + tokstart_diff;
276
274
  te = buf + tokend_diff;
277
275
  d->start = buf + start_diff;
278
- mark_row_sep = buf + mark_row_sep_diff;
279
276
  }
280
277
  p = buf + have;
281
278
 
@@ -314,7 +311,7 @@ static VALUE raw_parse(int argc, VALUE *argv, VALUE self) {
314
311
 
315
312
  pe = p + len;
316
313
 
317
- #line 318 "ext/fastcsv/fastcsv.c"
314
+ #line 315 "ext/fastcsv/fastcsv.c"
318
315
  {
319
316
  if ( p == pe )
320
317
  goto _test_eof;
@@ -333,7 +330,7 @@ tr0:
333
330
  }
334
331
  goto st4;
335
332
  tr5:
336
- #line 49 "ext/fastcsv/fastcsv.rl"
333
+ #line 46 "ext/fastcsv/fastcsv.rl"
337
334
  {
338
335
  if (p == ts) {
339
336
  // Unquoted empty fields are nil, not "", in Ruby.
@@ -344,16 +341,16 @@ tr5:
344
341
  ENCODE;
345
342
  }
346
343
  }
347
- #line 95 "ext/fastcsv/fastcsv.rl"
344
+ #line 92 "ext/fastcsv/fastcsv.rl"
348
345
  {
349
346
  rb_ary_push(row, field);
350
347
  field = Qnil;
351
348
  }
352
- #line 166 "ext/fastcsv/fastcsv.rl"
349
+ #line 148 "ext/fastcsv/fastcsv.rl"
353
350
  {te = p+1;}
354
351
  goto st4;
355
352
  tr9:
356
- #line 138 "ext/fastcsv/fastcsv.rl"
353
+ #line 120 "ext/fastcsv/fastcsv.rl"
357
354
  {
358
355
  if (d->start == 0 || p == d->start) {
359
356
  rb_ivar_set(self, s_row, rb_str_new2(""));
@@ -370,41 +367,28 @@ tr9:
370
367
  rb_yield(row);
371
368
  }
372
369
  }
373
- #line 168 "ext/fastcsv/fastcsv.rl"
370
+ #line 150 "ext/fastcsv/fastcsv.rl"
374
371
  {te = p+1;}
375
372
  goto st4;
376
373
  tr12:
377
- #line 95 "ext/fastcsv/fastcsv.rl"
374
+ #line 92 "ext/fastcsv/fastcsv.rl"
378
375
  {
379
376
  rb_ary_push(row, field);
380
377
  field = Qnil;
381
378
  }
382
- #line 166 "ext/fastcsv/fastcsv.rl"
379
+ #line 148 "ext/fastcsv/fastcsv.rl"
383
380
  {te = p+1;}
384
381
  goto st4;
385
382
  tr15:
386
- #line 168 "ext/fastcsv/fastcsv.rl"
383
+ #line 150 "ext/fastcsv/fastcsv.rl"
387
384
  {te = p;p--;}
388
385
  goto st4;
389
386
  tr16:
390
- #line 100 "ext/fastcsv/fastcsv.rl"
387
+ #line 97 "ext/fastcsv/fastcsv.rl"
391
388
  {
392
389
  d->start = p;
393
-
394
- if (len_row_sep) {
395
- if (p - mark_row_sep != len_row_sep || row_sep[0] != *mark_row_sep || len_row_sep == 2 && row_sep[1] != *(mark_row_sep + 1)) {
396
- FREE;
397
-
398
- rb_raise(eError, "Unquoted fields do not allow \\r or \\n (line %d).", curline - 1);
399
- }
400
- }
401
- else {
402
- len_row_sep = p - mark_row_sep;
403
- row_sep = ALLOC_N(char, p - mark_row_sep);
404
- memcpy(row_sep, mark_row_sep, p - mark_row_sep);
405
- }
406
390
  }
407
- #line 167 "ext/fastcsv/fastcsv.rl"
391
+ #line 149 "ext/fastcsv/fastcsv.rl"
408
392
  {te = p;p--;}
409
393
  goto st4;
410
394
  st4:
@@ -417,7 +401,7 @@ st4:
417
401
  case 4:
418
402
  #line 1 "NONE"
419
403
  {ts = p;}
420
- #line 421 "ext/fastcsv/fastcsv.c"
404
+ #line 405 "ext/fastcsv/fastcsv.c"
421
405
  switch( (*p) ) {
422
406
  case 0: goto tr13;
423
407
  case 10: goto tr3;
@@ -441,7 +425,7 @@ case 1:
441
425
  tr2:
442
426
  #line 1 "NONE"
443
427
  {te = p+1;}
444
- #line 49 "ext/fastcsv/fastcsv.rl"
428
+ #line 46 "ext/fastcsv/fastcsv.rl"
445
429
  {
446
430
  if (p == ts) {
447
431
  // Unquoted empty fields are nil, not "", in Ruby.
@@ -452,7 +436,7 @@ tr2:
452
436
  ENCODE;
453
437
  }
454
438
  }
455
- #line 138 "ext/fastcsv/fastcsv.rl"
439
+ #line 120 "ext/fastcsv/fastcsv.rl"
456
440
  {
457
441
  if (d->start == 0 || p == d->start) {
458
442
  rb_ivar_set(self, s_row, rb_str_new2(""));
@@ -469,14 +453,14 @@ tr2:
469
453
  rb_yield(row);
470
454
  }
471
455
  }
472
- #line 168 "ext/fastcsv/fastcsv.rl"
456
+ #line 150 "ext/fastcsv/fastcsv.rl"
473
457
  {act = 3;}
474
458
  goto st5;
475
459
  st5:
476
460
  if ( ++p == pe )
477
461
  goto _test_eof5;
478
462
  case 5:
479
- #line 480 "ext/fastcsv/fastcsv.c"
463
+ #line 464 "ext/fastcsv/fastcsv.c"
480
464
  switch( (*p) ) {
481
465
  case 0: goto tr2;
482
466
  case 10: goto tr3;
@@ -486,7 +470,7 @@ case 5:
486
470
  }
487
471
  goto st1;
488
472
  tr3:
489
- #line 49 "ext/fastcsv/fastcsv.rl"
473
+ #line 46 "ext/fastcsv/fastcsv.rl"
490
474
  {
491
475
  if (p == ts) {
492
476
  // Unquoted empty fields are nil, not "", in Ruby.
@@ -497,10 +481,8 @@ tr3:
497
481
  ENCODE;
498
482
  }
499
483
  }
500
- #line 117 "ext/fastcsv/fastcsv.rl"
484
+ #line 101 "ext/fastcsv/fastcsv.rl"
501
485
  {
502
- mark_row_sep = p;
503
-
504
486
  curline++;
505
487
 
506
488
  if (d->start == 0 || p == d->start) {
@@ -520,10 +502,8 @@ tr3:
520
502
  }
521
503
  goto st6;
522
504
  tr10:
523
- #line 117 "ext/fastcsv/fastcsv.rl"
505
+ #line 101 "ext/fastcsv/fastcsv.rl"
524
506
  {
525
- mark_row_sep = p;
526
-
527
507
  curline++;
528
508
 
529
509
  if (d->start == 0 || p == d->start) {
@@ -546,10 +526,10 @@ st6:
546
526
  if ( ++p == pe )
547
527
  goto _test_eof6;
548
528
  case 6:
549
- #line 550 "ext/fastcsv/fastcsv.c"
529
+ #line 530 "ext/fastcsv/fastcsv.c"
550
530
  goto tr16;
551
531
  tr4:
552
- #line 49 "ext/fastcsv/fastcsv.rl"
532
+ #line 46 "ext/fastcsv/fastcsv.rl"
553
533
  {
554
534
  if (p == ts) {
555
535
  // Unquoted empty fields are nil, not "", in Ruby.
@@ -560,10 +540,8 @@ tr4:
560
540
  ENCODE;
561
541
  }
562
542
  }
563
- #line 117 "ext/fastcsv/fastcsv.rl"
543
+ #line 101 "ext/fastcsv/fastcsv.rl"
564
544
  {
565
- mark_row_sep = p;
566
-
567
545
  curline++;
568
546
 
569
547
  if (d->start == 0 || p == d->start) {
@@ -583,10 +561,8 @@ tr4:
583
561
  }
584
562
  goto st7;
585
563
  tr11:
586
- #line 117 "ext/fastcsv/fastcsv.rl"
564
+ #line 101 "ext/fastcsv/fastcsv.rl"
587
565
  {
588
- mark_row_sep = p;
589
-
590
566
  curline++;
591
567
 
592
568
  if (d->start == 0 || p == d->start) {
@@ -609,14 +585,14 @@ st7:
609
585
  if ( ++p == pe )
610
586
  goto _test_eof7;
611
587
  case 7:
612
- #line 613 "ext/fastcsv/fastcsv.c"
588
+ #line 589 "ext/fastcsv/fastcsv.c"
613
589
  if ( (*p) == 10 )
614
590
  goto st6;
615
591
  goto tr16;
616
592
  tr13:
617
593
  #line 1 "NONE"
618
594
  {te = p+1;}
619
- #line 49 "ext/fastcsv/fastcsv.rl"
595
+ #line 46 "ext/fastcsv/fastcsv.rl"
620
596
  {
621
597
  if (p == ts) {
622
598
  // Unquoted empty fields are nil, not "", in Ruby.
@@ -627,7 +603,7 @@ tr13:
627
603
  ENCODE;
628
604
  }
629
605
  }
630
- #line 138 "ext/fastcsv/fastcsv.rl"
606
+ #line 120 "ext/fastcsv/fastcsv.rl"
631
607
  {
632
608
  if (d->start == 0 || p == d->start) {
633
609
  rb_ivar_set(self, s_row, rb_str_new2(""));
@@ -644,14 +620,14 @@ tr13:
644
620
  rb_yield(row);
645
621
  }
646
622
  }
647
- #line 168 "ext/fastcsv/fastcsv.rl"
623
+ #line 150 "ext/fastcsv/fastcsv.rl"
648
624
  {act = 3;}
649
625
  goto st8;
650
626
  st8:
651
627
  if ( ++p == pe )
652
628
  goto _test_eof8;
653
629
  case 8:
654
- #line 655 "ext/fastcsv/fastcsv.c"
630
+ #line 631 "ext/fastcsv/fastcsv.c"
655
631
  switch( (*p) ) {
656
632
  case 10: goto tr15;
657
633
  case 13: goto tr15;
@@ -660,7 +636,7 @@ case 8:
660
636
  }
661
637
  goto st1;
662
638
  tr14:
663
- #line 41 "ext/fastcsv/fastcsv.rl"
639
+ #line 38 "ext/fastcsv/fastcsv.rl"
664
640
  {
665
641
  unclosed_line = curline;
666
642
  }
@@ -669,7 +645,7 @@ st2:
669
645
  if ( ++p == pe )
670
646
  goto _test_eof2;
671
647
  case 2:
672
- #line 673 "ext/fastcsv/fastcsv.c"
648
+ #line 649 "ext/fastcsv/fastcsv.c"
673
649
  switch( (*p) ) {
674
650
  case 0: goto st0;
675
651
  case 34: goto tr8;
@@ -679,7 +655,7 @@ st0:
679
655
  cs = 0;
680
656
  goto _out;
681
657
  tr8:
682
- #line 60 "ext/fastcsv/fastcsv.rl"
658
+ #line 57 "ext/fastcsv/fastcsv.rl"
683
659
  {
684
660
  if (p == ts) {
685
661
  field = rb_enc_str_new("", 0, encoding);
@@ -714,7 +690,7 @@ tr8:
714
690
  }
715
691
  }
716
692
  }
717
- #line 45 "ext/fastcsv/fastcsv.rl"
693
+ #line 42 "ext/fastcsv/fastcsv.rl"
718
694
  {
719
695
  unclosed_line = 0;
720
696
  }
@@ -723,7 +699,7 @@ st3:
723
699
  if ( ++p == pe )
724
700
  goto _test_eof3;
725
701
  case 3:
726
- #line 727 "ext/fastcsv/fastcsv.c"
702
+ #line 703 "ext/fastcsv/fastcsv.c"
727
703
  switch( (*p) ) {
728
704
  case 0: goto tr9;
729
705
  case 10: goto tr10;
@@ -757,9 +733,16 @@ case 3:
757
733
  _out: {}
758
734
  }
759
735
 
760
- #line 427 "ext/fastcsv/fastcsv.rl"
736
+ #line 409 "ext/fastcsv/fastcsv.rl"
761
737
 
762
738
  if (done && cs < raw_parse_first_final) {
739
+ if (d->start == 0 || p == d->start) {
740
+ rb_ivar_set(self, s_row, rb_str_new2(""));
741
+ }
742
+ else if (p > d->start) {
743
+ rb_ivar_set(self, s_row, rb_str_new(d->start, p - d->start));
744
+ }
745
+
763
746
  FREE;
764
747
 
765
748
  if (unclosed_line) {
@@ -22,9 +22,6 @@ if (enc2 != NULL) { \
22
22
  #define FREE \
23
23
  if (buf != NULL) { \
24
24
  free(buf); \
25
- } \
26
- if (row_sep != NULL) { \
27
- free(row_sep); \
28
25
  }
29
26
 
30
27
  static VALUE cClass, cParser, eError;
@@ -99,24 +96,9 @@ typedef struct {
99
96
 
100
97
  action mark_row {
101
98
  d->start = p;
102
-
103
- if (len_row_sep) {
104
- if (p - mark_row_sep != len_row_sep || row_sep[0] != *mark_row_sep || len_row_sep == 2 && row_sep[1] != *(mark_row_sep + 1)) {
105
- FREE;
106
-
107
- rb_raise(eError, "Unquoted fields do not allow \\r or \\n (line %d).", curline - 1);
108
- }
109
- }
110
- else {
111
- len_row_sep = p - mark_row_sep;
112
- row_sep = ALLOC_N(char, p - mark_row_sep);
113
- memcpy(row_sep, mark_row_sep, p - mark_row_sep);
114
- }
115
99
  }
116
100
 
117
101
  action new_row {
118
- mark_row_sep = p;
119
-
120
102
  curline++;
121
103
 
122
104
  if (d->start == 0 || p == d->start) {
@@ -202,11 +184,11 @@ static void rb_io_ext_int_to_encs(rb_encoding *ext, rb_encoding *intern, rb_enco
202
184
 
203
185
  static VALUE raw_parse(int argc, VALUE *argv, VALUE self) {
204
186
  int cs, act, have = 0, curline = 1, io = 0;
205
- char *ts = 0, *te = 0, *buf = 0, *eof = 0, *mark_row_sep = 0, *row_sep = NULL;
187
+ char *ts = 0, *te = 0, *buf = 0, *eof = 0;
206
188
 
207
189
  VALUE port, opts, r_encoding;
208
190
  VALUE row = rb_ary_new(), field = Qnil, bufsize = Qnil;
209
- int done = 0, unclosed_line = 0, len_row_sep = 0, buffer_size = 0, taint = 0;
191
+ int done = 0, unclosed_line = 0, buffer_size = 0, taint = 0;
210
192
  rb_encoding *enc = NULL, *enc2 = NULL, *encoding = NULL;
211
193
 
212
194
  Data *d;
@@ -369,7 +351,7 @@ static VALUE raw_parse(int argc, VALUE *argv, VALUE self) {
369
351
  while (!done) {
370
352
  VALUE str;
371
353
  char *p, *pe;
372
- int len, space = buffer_size - have, tokstart_diff, tokend_diff, start_diff, mark_row_sep_diff;
354
+ int len, space = buffer_size - have, tokstart_diff, tokend_diff, start_diff;
373
355
 
374
356
  if (io) {
375
357
  if (space == 0) {
@@ -377,7 +359,6 @@ static VALUE raw_parse(int argc, VALUE *argv, VALUE self) {
377
359
  tokstart_diff = ts - buf;
378
360
  tokend_diff = te - buf;
379
361
  start_diff = d->start - buf;
380
- mark_row_sep_diff = mark_row_sep - buf;
381
362
 
382
363
  buffer_size += BUFSIZE;
383
364
  REALLOC_N(buf, char, buffer_size);
@@ -387,7 +368,6 @@ static VALUE raw_parse(int argc, VALUE *argv, VALUE self) {
387
368
  ts = buf + tokstart_diff;
388
369
  te = buf + tokend_diff;
389
370
  d->start = buf + start_diff;
390
- mark_row_sep = buf + mark_row_sep_diff;
391
371
  }
392
372
  p = buf + have;
393
373
 
@@ -428,6 +408,13 @@ static VALUE raw_parse(int argc, VALUE *argv, VALUE self) {
428
408
  %% write exec;
429
409
 
430
410
  if (done && cs < raw_parse_first_final) {
411
+ if (d->start == 0 || p == d->start) {
412
+ rb_ivar_set(self, s_row, rb_str_new2(""));
413
+ }
414
+ else if (p > d->start) {
415
+ rb_ivar_set(self, s_row, rb_str_new(d->start, p - d->start));
416
+ }
417
+
431
418
  FREE;
432
419
 
433
420
  if (unclosed_line) {
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "fastcsv"
5
- s.version = '0.0.3'
5
+ s.version = '0.0.4'
6
6
  s.platform = Gem::Platform::RUBY
7
7
  s.authors = ["Open North"]
8
8
  s.email = ["info@opennorth.ca"]
@@ -8,6 +8,10 @@ class FastCSV < CSV
8
8
  Parser.new.raw_parse(*args, &block)
9
9
  end
10
10
 
11
+ def row
12
+ parser && parser.row
13
+ end
14
+
11
15
  def shift
12
16
  # COPY
13
17
  # handle headers not based on document content
@@ -147,6 +147,7 @@ RSpec.shared_examples 'a CSV parser' do
147
147
  it 'should raise an error on mixed row separators' do
148
148
  csv = "foo\rbar\nbaz\r\n"
149
149
  expect{CSV.parse(csv)}.to raise_error(CSV::MalformedCSVError, 'Unquoted fields do not allow \r or \n (line 2).')
150
+ skip
150
151
  expect{FastCSV.parse(csv)}.to raise_error(FastCSV::MalformedCSVError, 'Unquoted fields do not allow \r or \n (line 2).')
151
152
  end
152
153
 
@@ -160,16 +160,16 @@ class TestCSV::Parsing < TestCSV
160
160
  assert_equal(6, lines.size)
161
161
  assert_match(/\Aline,4/, lines.find { |l| l =~ /some\rjunk/ })
162
162
 
163
- csv = FastCSV.new(bad_data)
164
- begin
165
- loop do
166
- assert_not_nil(csv.shift)
167
- assert_send([csv.lineno, :<, 5]) # FIXME 4
168
- end
169
- rescue FastCSV::MalformedCSVError
170
- assert_equal( "Unquoted fields do not allow \\r or \\n (line 4).",
171
- $!.message )
172
- end
163
+ # csv = FastCSV.new(bad_data)
164
+ # begin
165
+ # loop do
166
+ # assert_not_nil(csv.shift)
167
+ # assert_send([csv.lineno, :<, 5]) # FIXME 4
168
+ # end
169
+ # rescue FastCSV::MalformedCSVError
170
+ # assert_equal( "Unquoted fields do not allow \\r or \\n (line 4).",
171
+ # $!.message )
172
+ # end
173
173
 
174
174
  assert_raise(FastCSV::MalformedCSVError) { FastCSV.parse_line('1,2,"3...') }
175
175
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastcsv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Open North