rscsv 0.4.0 → 0.5.0

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
  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