rscsv 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 40a0b9b97f5c3273d2f29e60f1124cb84f71a17ad2f3cb4aca6c57527e6fd270
4
- data.tar.gz: 11d1c58a01c0a826d11cdbe8d3fcec9b1fd687dc948449471b4b536242cae054
3
+ metadata.gz: 147b5e77ae27df3d9db307249e6dca18bdcc6c438238c7b53ccf0637288c6a9c
4
+ data.tar.gz: d3eea2efba98f4dcd80c0d7c67fa0684ee02f4efc3df666a1fa88a954364ed94
5
5
  SHA512:
6
- metadata.gz: ccb6484958de5857da020b74e52c57cf52373c777d67cb7710641832d7bdef9b71913108a0a143c70806c8b1dfe6d41f1cd6a70e008292be3bda78faf5d217cd
7
- data.tar.gz: 2bef5822fad2b041333c063d05d3d5cf2565c7e022667600ce0daef586a3781df989573bf1053ecb8676de53a22c8c13101952172a05f3c70ea8e92c9ba88cdf
6
+ metadata.gz: b83963c68975702176dd3fc3c16bc3d65fc211c8444cf6f36ec3ba5cd6ef954328a3034fdebfe07937fa651ab6708bf50d6646f643690f1e5b0d6d526880f601
7
+ data.tar.gz: a766556bb9de6518c77ee11071a7dfa8f8fb73d6d6b2035085d0a108a0146ec4540e5df0aafd3570a42fc46778149499f8bef720bcf798693930bd55b1dd28ba
data/Cargo.lock CHANGED
@@ -1,8 +1,3 @@
1
- [[package]]
2
- name = "cslice"
3
- version = "0.3.0"
4
- source = "registry+https://github.com/rust-lang/crates.io-index"
5
-
6
1
  [[package]]
7
2
  name = "cstr-macro"
8
3
  version = "0.1.0"
@@ -13,67 +8,68 @@ name = "csv"
13
8
  version = "1.0.0-beta.5"
14
9
  source = "registry+https://github.com/rust-lang/crates.io-index"
15
10
  dependencies = [
16
- "csv-core 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
17
- "serde 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)",
11
+ "csv-core 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
12
+ "serde 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)",
18
13
  ]
19
14
 
20
15
  [[package]]
21
16
  name = "csv-core"
22
- version = "0.1.3"
17
+ version = "0.1.4"
23
18
  source = "registry+https://github.com/rust-lang/crates.io-index"
24
19
  dependencies = [
25
- "memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
20
+ "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
26
21
  ]
27
22
 
28
23
  [[package]]
29
24
  name = "helix"
30
- version = "0.7.2"
25
+ version = "0.7.3"
31
26
  source = "registry+https://github.com/rust-lang/crates.io-index"
32
27
  dependencies = [
33
- "cslice 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
34
28
  "cstr-macro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
35
- "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
36
- "libcruby-sys 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
29
+ "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
30
+ "libcruby-sys 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
37
31
  ]
38
32
 
39
33
  [[package]]
40
34
  name = "libc"
41
- version = "0.2.34"
35
+ version = "0.2.39"
42
36
  source = "registry+https://github.com/rust-lang/crates.io-index"
43
37
 
44
38
  [[package]]
45
39
  name = "libcruby-sys"
46
- version = "0.7.2"
40
+ version = "0.7.3"
47
41
  source = "registry+https://github.com/rust-lang/crates.io-index"
48
42
  dependencies = [
49
- "libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
43
+ "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
50
44
  ]
51
45
 
52
46
  [[package]]
53
47
  name = "memchr"
54
- version = "1.0.2"
48
+ version = "2.0.1"
55
49
  source = "registry+https://github.com/rust-lang/crates.io-index"
50
+ dependencies = [
51
+ "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
52
+ ]
56
53
 
57
54
  [[package]]
58
55
  name = "rscsv"
59
- version = "0.3.3"
56
+ version = "0.5.0"
60
57
  dependencies = [
61
58
  "csv 1.0.0-beta.5 (registry+https://github.com/rust-lang/crates.io-index)",
62
- "helix 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
59
+ "helix 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
63
60
  ]
64
61
 
65
62
  [[package]]
66
63
  name = "serde"
67
- version = "1.0.24"
64
+ version = "1.0.29"
68
65
  source = "registry+https://github.com/rust-lang/crates.io-index"
69
66
 
70
67
  [metadata]
71
- "checksum cslice 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0f8cb7306107e4b10e64994de6d3274bd08996a7c1322a27b86482392f96be0a"
72
68
  "checksum cstr-macro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db53fddba18cdd35477a7213a3ef6acfbfa333c31b42ce019e544c4a1420a06f"
73
69
  "checksum csv 1.0.0-beta.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e7a9e063dcebdb56c306f23e672bfd31df3da8ec5f6d696b35f2c29c2a9572f0"
74
- "checksum csv-core 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ae1fbabf21d9a52d04675cc5b032d7bae24ecdcd22646f7eefcd0496a122686c"
75
- "checksum helix 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf45e0f51337f76d3481ac5a29693ca6138dcfa569a671988c7c65a6536d4cf"
76
- "checksum libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)" = "36fbc8a8929c632868295d0178dd8f63fc423fd7537ad0738372bd010b3ac9b0"
77
- "checksum libcruby-sys 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a8d944129f388f0dfd391fb8308f4e0b9cde5c83ed1e66c1ee395445ad62282c"
78
- "checksum memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "148fab2e51b4f1cfc66da2a7c32981d1d3c083a803978268bb11fe4b86925e7a"
79
- "checksum serde 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)" = "1c57ab4ec5fa85d08aaf8ed9245899d9bbdd66768945b21113b84d5f595cb6a1"
70
+ "checksum csv-core 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4dd8e6d86f7ba48b4276ef1317edc8cc36167546d8972feb4a2b5fec0b374105"
71
+ "checksum helix 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1a5e45d09f37327fded2b1e0939ab4c061e181b0c007f82c53ccd03e869cf085"
72
+ "checksum libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)" = "f54263ad99207254cf58b5f701ecb432c717445ea2ee8af387334bdd1a03fdff"
73
+ "checksum libcruby-sys 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8b0fb9beb529127d706dd12e26f961be3e527badb74a7b2e5d6b9d928fe6059"
74
+ "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d"
75
+ "checksum serde 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)" = "4763b773978e495252615e814d2ad04773b2c1f85421c7913869a537f35cb406"
data/Cargo.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rscsv"
3
- version = "0.3.3"
3
+ version = "0.5.0"
4
4
  authors = ["Ville Lautanala <lautis@gmail.com>"]
5
5
 
6
6
  [lib]
@@ -8,5 +8,5 @@ authors = ["Ville Lautanala <lautis@gmail.com>"]
8
8
  crate-type = ["cdylib"]
9
9
 
10
10
  [dependencies]
11
- helix = "0.7.2"
11
+ helix = "0.7.3"
12
12
  csv = "1.0.0-beta.4"
data/lib/rscsv/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rscsv
2
- VERSION = '0.4.0'.freeze
2
+ VERSION = '0.5.0'.freeze
3
3
  end
data/rscsv.gemspec CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.require_paths = ['lib']
22
22
  spec.extensions = Dir['ext/extconf.rb']
23
23
 
24
- spec.add_dependency 'helix_runtime', '0.7.2'
24
+ spec.add_dependency 'helix_runtime', '0.7.3'
25
25
  spec.add_dependency 'rake', '>= 10.0'
26
26
  spec.add_development_dependency 'bundler', '~> 1.14'
27
27
  spec.add_development_dependency 'rspec', '~> 3.0'
data/src/lib.rs CHANGED
@@ -5,21 +5,14 @@ extern crate csv;
5
5
  use std::error::Error;
6
6
  use std::io::Read;
7
7
  use helix::sys;
8
- use helix::sys::{ID, VALUE};
8
+ use helix::sys::{VALUE, RubyException};
9
9
  use helix::{FromRuby, CheckResult, ToRuby};
10
- use helix::libc::c_int;
10
+ use helix::libc::{c_void};
11
11
 
12
- #[cfg_attr(windows, link(name = "helix-runtime"))]
13
- extern "C" {
14
- pub fn rb_block_given_p() -> c_int;
15
- pub fn rb_yield(value: VALUE);
16
- pub fn rb_funcall(value: VALUE, name: ID, nargs: c_int, ...) -> VALUE;
17
- }
18
-
19
- fn generate_lines(rows: Vec<Vec<String>>) -> Result<String, Box<Error>> {
12
+ fn generate_lines(rows: &[Vec<String>]) -> Result<String, Box<Error>> {
20
13
  let mut wtr = csv::WriterBuilder::new().from_writer(vec![]);
21
14
  for row in rows {
22
- wtr.write_record(&row)?;
15
+ wtr.write_record(row)?;
23
16
  }
24
17
 
25
18
  Ok(String::from_utf8(wtr.into_inner()?)?)
@@ -37,6 +30,33 @@ fn record_to_ruby(record: &csv::ByteRecord) -> VALUE {
37
30
  inner_array
38
31
  }
39
32
 
33
+ extern fn protect_wrapper<F>(closure: *mut c_void) -> VALUE
34
+ where F: FnOnce() -> VALUE {
35
+ let closure_option = closure as *mut Option<F>;
36
+ unsafe {
37
+ (*closure_option).take().unwrap()()
38
+ }
39
+ }
40
+
41
+ pub fn protect<F>(func: F) -> Result<VALUE, RubyException>
42
+ where
43
+ F: FnOnce() -> VALUE,
44
+ {
45
+ let mut state = sys::EMPTY_EXCEPTION;
46
+ let value = unsafe {
47
+ sys::rb_protect(
48
+ protect_wrapper::<F>,
49
+ &func as *const _ as *mut c_void,
50
+ &mut state,
51
+ )
52
+ };
53
+ if state == sys::EMPTY_EXCEPTION {
54
+ Ok(value)
55
+ } else {
56
+ Err(state)
57
+ }
58
+ }
59
+
40
60
  struct Enumerator {
41
61
  value: VALUE,
42
62
  }
@@ -89,24 +109,33 @@ impl EnumeratorRead {
89
109
  }
90
110
 
91
111
  fn read_from_external(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
92
- let next = unsafe {
93
- rb_funcall(
94
- self.value,
95
- sys::rb_intern("next\0".as_ptr() as *const i8),
96
- 0,
97
- )
98
- };
99
112
 
100
- let string = String::from_ruby_unwrap(next);
113
+ let value = self.value;
114
+ let result = protect(|| {
115
+ unsafe { sys::rb_funcall(
116
+ value,
117
+ sys::rb_intern("next\0".as_ptr() as *const i8),
118
+ 0)
119
+ }
120
+ });
121
+ match result {
122
+ Ok(next) => {
123
+ let string = String::from_ruby_unwrap(next);
124
+ self.read_and_store_overflow(buf, string.as_bytes())
125
+ },
126
+ Err(state) => {
127
+ unsafe { sys::rb_jump_tag(state) };
128
+ //Err(std::io::Error::new(ErrorKind::Other, "Ruby Exception"))
129
+ }
130
+ }
101
131
 
102
- self.read_and_store_overflow(buf, string.as_bytes())
103
132
  }
104
133
  }
105
134
 
106
135
  impl Read for EnumeratorRead {
107
136
  fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
108
- match self.next.clone() {
109
- Some(inner) => self.read_and_store_overflow(buf, &inner),
137
+ match self.next.take() {
138
+ Some(ref inner) => self.read_and_store_overflow(buf, inner),
110
139
  None => self.read_from_external(buf),
111
140
  }
112
141
  }
@@ -119,39 +148,45 @@ fn csv_reader<R: Read>(reader: R) -> csv::Reader<R> {
119
148
  .from_reader(reader)
120
149
  }
121
150
 
122
- fn yield_csv(data: Enumerator) -> Result<(), csv::Error> {
151
+ fn yield_csv(data: &Enumerator) -> Result<(), csv::Error> {
123
152
  let mut reader = csv_reader(EnumeratorRead::new(data.value));
124
153
  let mut record = csv::ByteRecord::new();
125
154
 
126
155
  while reader.read_byte_record(&mut record)? {
127
156
  let inner_array = record_to_ruby(&record);
128
- unsafe {
129
- rb_yield(inner_array);
157
+ let result = protect(|| {
158
+ unsafe {
159
+ return sys::rb_yield(inner_array);
160
+ }
161
+ });
162
+
163
+ if result.is_err() {
164
+ unsafe { sys::rb_jump_tag(result.unwrap_err()) };
130
165
  }
131
166
  }
132
167
 
133
168
  Ok(())
134
169
  }
135
170
 
136
- fn parse_csv(data: String) -> Result<Vec<Vec<VALUE>>, csv::Error> {
171
+ fn parse_csv(data: &str) -> Result<Vec<Vec<VALUE>>, csv::Error> {
137
172
  csv_reader(data.as_bytes())
138
173
  .records()
139
- .map(|r| r.map(record_to_vec))
174
+ .map(|r| r.map(|v| record_to_vec(&v)))
140
175
  .collect()
141
176
  }
142
177
 
143
- fn record_to_vec(record: csv::StringRecord) -> Vec<VALUE> {
178
+ fn record_to_vec(record: &csv::StringRecord) -> Vec<VALUE> {
144
179
  record.iter().map(|s| s.to_ruby().unwrap()).collect()
145
180
  }
146
181
 
147
182
  ruby! {
148
183
  class RscsvReader {
149
184
  def each_internal(data: Enumerator) -> Result<(), &'static str> {
150
- yield_csv(data).map_err(|_| "Error parsing CSV")
185
+ yield_csv(&data).map_err(|_| "Error parsing CSV")
151
186
  }
152
187
 
153
188
  def parse(data: String) -> Result<Vec<Vec<VALUE>>, &'static str> {
154
- parse_csv(data).map_err(|_| "Error parsing CSV")
189
+ parse_csv(&data).map_err(|_| "Error parsing CSV")
155
190
  }
156
191
  }
157
192
 
@@ -165,7 +200,7 @@ ruby! {
165
200
  }
166
201
 
167
202
  def generate_lines(rows: Vec<Vec<String>>) -> Result<String, &'static str> {
168
- generate_lines(rows).map_err(|_| "Error generating csv")
203
+ generate_lines(&rows).map_err(|_| "Error generating csv")
169
204
  }
170
205
  }
171
206
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rscsv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ville Lautanala
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-12-28 00:00:00.000000000 Z
11
+ date: 2018-03-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: helix_runtime
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.7.2
19
+ version: 0.7.3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.7.2
26
+ version: 0.7.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement