fastcsv 0.0.5 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +5 -3
- data/.yardopts +3 -0
- data/Gemfile +1 -1
- data/README.md +3 -4
- data/Rakefile +5 -5
- data/ext/fastcsv/fastcsv.c +664 -1229
- data/ext/fastcsv/fastcsv.rl +16 -6
- data/fastcsv.gemspec +3 -3
- data/lib/fastcsv.rb +1 -1
- data/spec/fastcsv_spec.rb +16 -1
- metadata +14 -29
- data/USAGE +0 -1
data/ext/fastcsv/fastcsv.rl
CHANGED
@@ -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
|
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 =
|
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
|
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
|
+
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
|
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.
|
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:
|
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:
|
42
|
+
name: rspec
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
58
44
|
requirements:
|
59
|
-
- - "
|
45
|
+
- - "~>"
|
60
46
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
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: '
|
54
|
+
version: '3.1'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
56
|
+
name: rake-compiler
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
72
58
|
requirements:
|
73
|
-
- - "
|
59
|
+
- - ">="
|
74
60
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
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: '
|
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
|
-
|
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.
|