fastcsv 0.0.5 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -104,7 +104,7 @@ typedef struct {
104
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
105
  FREE;
106
106
 
107
- rb_raise(eError, "Unquoted fields do not allow \\r or \\n (line %d).", curline - 1);
107
+ rb_raise(eError, "Unquoted fields do not allow \\r or \\n (line %d).", curline);
108
108
  }
109
109
  }
110
110
  else {
@@ -112,11 +112,12 @@ typedef struct {
112
112
  row_sep = ALLOC_N(char, len_row_sep);
113
113
  memcpy(row_sep, mark_row_sep, len_row_sep);
114
114
  }
115
+
116
+ curline++;
115
117
  }
116
118
 
117
119
  action new_row {
118
120
  mark_row_sep = p;
119
- curline++;
120
121
 
121
122
  if (d->start == 0 || p == d->start) {
122
123
  rb_ivar_set(self, s_row, rb_str_new2(""));
@@ -154,12 +155,14 @@ typedef struct {
154
155
  EOF = 0;
155
156
  quote_char = any when { fc == quote_char };
156
157
  col_sep = any when { fc == col_sep } >new_field;
157
- row_sep = ('\r' '\n'? | '\n');
158
- unquoted = (any* -- quote_char -- col_sep -- row_sep - EOF) %read_unquoted;
159
- quoted = quote_char >open_quote (any - quote_char - EOF | quote_char quote_char | row_sep)* %read_quoted quote_char >close_quote;
158
+ row_sep = '\r' '\n'? | '\n';
159
+ unquoted = (any* -- quote_char -- col_sep -- row_sep -- '\r' -- '\n' - EOF) %read_unquoted;
160
+ quoted = quote_char >open_quote (any - quote_char - EOF | quote_char quote_char)* %read_quoted quote_char >close_quote;
160
161
  field = unquoted | quoted;
161
162
 
162
163
  # @see Ragel Guide: 6.3 Scanners
164
+ # > Entering
165
+ # % Leaving
163
166
  # An unquoted field can be zero-length.
164
167
  main := |*
165
168
  field col_sep;
@@ -250,7 +253,7 @@ static VALUE raw_parse(int argc, VALUE *argv, VALUE self) {
250
253
  rb_raise(rb_eArgError, ":col_sep has to be a single character String");
251
254
  }
252
255
 
253
- // @see rb_io_extract_modeenc
256
+ // @see rb_io_extract_modeenc parse_mode_enc
254
257
  /* Set to defaults */
255
258
  rb_io_ext_int_to_encs(NULL, NULL, &enc, &enc2, 0);
256
259
 
@@ -466,6 +469,13 @@ static VALUE raw_parse(int argc, VALUE *argv, VALUE self) {
466
469
  else if (io) {
467
470
  have = pe - ts;
468
471
  memmove(buf, ts, have);
472
+ // @see https://github.com/hpricot/hpricot/blob/master/ext/hpricot_scan/hpricot_scan.rl#L92
473
+ if (d->start > ts) {
474
+ d->start = buf + (d->start - ts);
475
+ }
476
+ if (mark_row_sep >= ts) {
477
+ mark_row_sep = buf + (mark_row_sep - ts);
478
+ }
469
479
  te = buf + (te - ts);
470
480
  ts = buf;
471
481
  }
data/fastcsv.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "fastcsv"
5
- s.version = '0.0.5'
5
+ s.version = '0.0.7'
6
6
  s.platform = Gem::Platform::RUBY
7
7
  s.authors = ["James McKinney"]
8
8
  s.homepage = "https://github.com/jpmckinney/fastcsv"
@@ -16,8 +16,8 @@ Gem::Specification.new do |s|
16
16
  s.extensions = ["ext/fastcsv/extconf.rb"]
17
17
 
18
18
  s.add_development_dependency('coveralls')
19
- s.add_development_dependency('json', '~> 1.8') # to silence coveralls warning
20
19
  s.add_development_dependency('rake')
21
- s.add_development_dependency('rake-compiler')
22
20
  s.add_development_dependency('rspec', '~> 3.1')
21
+
22
+ s.add_development_dependency('rake-compiler')
23
23
  end
data/lib/fastcsv.rb CHANGED
@@ -123,7 +123,7 @@ private
123
123
  encoding = enc
124
124
  end
125
125
  end
126
- parser.raw_parse(@io, encoding: encoding, quote_char: quote_char, col_sep: col_sep) do |row|
126
+ parser.raw_parse(@io, encoding: encoding, quote_char: quote_char, col_sep: col_sep, row_sep: row_sep) do |row|
127
127
  Fiber.yield(row)
128
128
  end
129
129
  end
data/spec/fastcsv_spec.rb CHANGED
@@ -136,7 +136,14 @@ RSpec.shared_examples 'a CSV parser' do
136
136
  end
137
137
  end
138
138
 
139
- it "should parse an encoded string" do
139
+ it 'should raise the row number' do
140
+ csv = %("\n\n\n"\n"x)
141
+ csv_error = 'Unclosed quoted field on line 2.'
142
+ expect{CSV.parse(csv)}.to raise_error(CSV::MalformedCSVError, csv_error)
143
+ expect{parse(csv)}.to raise_error(FastCSV::MalformedCSVError, csv_error)
144
+ end
145
+
146
+ it 'should parse an encoded string' do
140
147
  csv = "ß"
141
148
  actual = parse(csv)
142
149
  expected = CSV.parse(csv)
@@ -181,6 +188,14 @@ RSpec.shared_examples 'a CSV parser' do
181
188
  it 'should allow zero' do
182
189
  expect(parse_with_buffer_size(simple, 0)).to eq(CSV.parse(simple))
183
190
  end
191
+
192
+ it 'should parse a consecutive field-sep and row-sep at a buffer boundary' do
193
+ # This is a further minimized reproduction of
194
+ # https://github.com/jpmckinney/fastcsv/issues/14
195
+ csv = "A0,B0\nA1,B1,\nA2,B2,\n"
196
+ buffer_size = 4
197
+ expect(parse_with_buffer_size(csv, buffer_size)).to eq(CSV.parse(csv))
198
+ end
184
199
  end
185
200
  end
186
201
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastcsv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - James McKinney
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-05 00:00:00.000000000 Z
11
+ date: 2023-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: coveralls
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: json
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.8'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.8'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: rake
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -53,33 +39,33 @@ dependencies:
53
39
  - !ruby/object:Gem::Version
54
40
  version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
- name: rake-compiler
42
+ name: rspec
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
- - - ">="
45
+ - - "~>"
60
46
  - !ruby/object:Gem::Version
61
- version: '0'
47
+ version: '3.1'
62
48
  type: :development
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
- - - ">="
52
+ - - "~>"
67
53
  - !ruby/object:Gem::Version
68
- version: '0'
54
+ version: '3.1'
69
55
  - !ruby/object:Gem::Dependency
70
- name: rspec
56
+ name: rake-compiler
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
- - - "~>"
59
+ - - ">="
74
60
  - !ruby/object:Gem::Version
75
- version: '3.1'
61
+ version: '0'
76
62
  type: :development
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
- - - "~>"
66
+ - - ">="
81
67
  - !ruby/object:Gem::Version
82
- version: '3.1'
68
+ version: '0'
83
69
  description:
84
70
  email:
85
71
  executables: []
@@ -90,12 +76,12 @@ files:
90
76
  - ".gitignore"
91
77
  - ".rspec"
92
78
  - ".travis.yml"
79
+ - ".yardopts"
93
80
  - Gemfile
94
81
  - LICENSE
95
82
  - README.md
96
83
  - Rakefile
97
84
  - TESTS.md
98
- - USAGE
99
85
  - ext/fastcsv/extconf.rb
100
86
  - ext/fastcsv/fastcsv.c
101
87
  - ext/fastcsv/fastcsv.rl
@@ -141,8 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
127
  - !ruby/object:Gem::Version
142
128
  version: '0'
143
129
  requirements: []
144
- rubyforge_project:
145
- rubygems_version: 2.2.0
130
+ rubygems_version: 3.0.3.1
146
131
  signing_key:
147
132
  specification_version: 4
148
133
  summary: A fast Ragel-based CSV parser, compatible with Ruby's CSV
data/USAGE DELETED
@@ -1 +0,0 @@
1
- See README.md for full usage details.