rscsv 0.6.0.beta4-x86_64-linux → 0.7.0-x86_64-linux

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: 27a1cd251d670bb60652d3ba4c3061bb72b34431d2a497e0f469089b33ecec06
4
- data.tar.gz: 4a555184b2e2ec8741455f746a278b3cae7bafd78f743a7c92f0622b28403893
3
+ metadata.gz: 1592c8c05eea6f97eb710e8192f412ff6f8265d521504a4ff42d93ae8ee5a317
4
+ data.tar.gz: 4eb931b86e615e65e33505283de1f5a4b6cb9c6e108e2a72d414e9e56e9b0c54
5
5
  SHA512:
6
- metadata.gz: 35edacb42e375b059a91e128406d17cb5b15ea8383a34b01a1228cea8a878312fe960e1b9f6717b9520e96d5708d281b997c38918508b159e5b3be2690733e0d
7
- data.tar.gz: bfe7afc159f2a40eecce9cf878cb6c94371cf32b35735abfae4dee31cb87329458e737306adc472070f24f69f096e79d0fd954cd7d20aa18f89641277da25797
6
+ metadata.gz: e7ad76f31d97745aa5caddcd28340ba91bd86dcea5d57f633d22e7150ae726ca639e4bdb94a4e892ce7ee0dbbcd0b4c1c954951957c76a64f9d9e256a168b60c
7
+ data.tar.gz: 47909516a75c1520328832cbe6303afd8f58b826372646491f6784dddb4ac45613663697a34f08ea339844ae7bcc8f3b8d35d9d2967ef9480b0e1471fd4fe52c
data/README.md CHANGED
@@ -3,8 +3,6 @@
3
3
  Fast CSV using Rust extensions. Can read arrays of arrays from strings and write
4
4
  strings from arrays of arrays.
5
5
 
6
- [![Build Status](https://travis-ci.org/lautis/rscsv.svg?branch=master)](https://travis-ci.org/lautis/rscsv)
7
-
8
6
  ## Installation
9
7
 
10
8
  This gem requires Rust (~> 1.17) and Cargo to be installed. With those
@@ -0,0 +1,12 @@
1
+ [package]
2
+ name = "rscsv"
3
+ version = "0.7.0"
4
+ authors = ["Ville Lautanala <lautis@gmail.com>"]
5
+ edition = "2021"
6
+
7
+ [lib]
8
+ crate-type = ["cdylib"]
9
+
10
+ [dependencies]
11
+ magnus = { version = "0.7", features = ["rb-sys"] }
12
+ csv = "1"
@@ -0,0 +1,5 @@
1
+ require "mkmf"
2
+ require "rb_sys/mkmf"
3
+
4
+ create_rust_makefile("rscsv/rscsv")
5
+
@@ -0,0 +1,146 @@
1
+ use magnus::{
2
+ block::yield_value, function, prelude::*, Error, RArray, RString, Ruby, Value,
3
+ };
4
+ use std::io::Read;
5
+
6
+ fn generate_lines(rows: Vec<Vec<String>>) -> Result<String, Error> {
7
+ let mut wtr = csv::WriterBuilder::new().from_writer(vec![]);
8
+ for row in rows {
9
+ wtr.write_record(&row)
10
+ .map_err(|e| Error::new(magnus::exception::runtime_error(), e.to_string()))?;
11
+ }
12
+
13
+ let inner = wtr
14
+ .into_inner()
15
+ .map_err(|e| Error::new(magnus::exception::runtime_error(), e.to_string()))?;
16
+
17
+ String::from_utf8(inner)
18
+ .map_err(|e| Error::new(magnus::exception::runtime_error(), e.to_string()))
19
+ }
20
+
21
+ fn record_to_ruby_array(record: &csv::ByteRecord) -> Result<RArray, Error> {
22
+ let array = RArray::with_capacity(record.len());
23
+ for column in record.iter() {
24
+ let column_str = RString::from_slice(column);
25
+ array.push(column_str)?;
26
+ }
27
+ Ok(array)
28
+ }
29
+
30
+ struct EnumeratorRead {
31
+ enumerator: Value,
32
+ buffer: Option<Vec<u8>>,
33
+ }
34
+
35
+ impl EnumeratorRead {
36
+ fn new(enumerator: Value) -> Self {
37
+ EnumeratorRead {
38
+ enumerator,
39
+ buffer: None,
40
+ }
41
+ }
42
+
43
+ fn read_and_store_overflow(&mut self, buf: &mut [u8], value: &[u8]) -> std::io::Result<usize> {
44
+ if value.len() > buf.len() {
45
+ let (current, next) = value.split_at(buf.len());
46
+ buf.copy_from_slice(current);
47
+ self.buffer = Some(next.to_vec());
48
+ Ok(current.len())
49
+ } else {
50
+ buf[..value.len()].copy_from_slice(value);
51
+ self.buffer = None;
52
+ Ok(value.len())
53
+ }
54
+ }
55
+
56
+ fn read_from_external(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
57
+ let result: Result<String, Error> = self.enumerator.funcall("next", ());
58
+ match result {
59
+ Ok(string) => self.read_and_store_overflow(buf, string.as_bytes()),
60
+ Err(_) => {
61
+ // StopIteration or other exception - signal EOF
62
+ Ok(0)
63
+ }
64
+ }
65
+ }
66
+ }
67
+
68
+ impl Read for EnumeratorRead {
69
+ fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
70
+ match self.buffer.take() {
71
+ Some(ref inner) => self.read_and_store_overflow(buf, inner),
72
+ None => self.read_from_external(buf),
73
+ }
74
+ }
75
+ }
76
+
77
+ fn csv_reader<R: Read>(reader: R) -> csv::Reader<R> {
78
+ csv::ReaderBuilder::new()
79
+ .buffer_capacity(16 * 1024)
80
+ .has_headers(false)
81
+ .from_reader(reader)
82
+ }
83
+
84
+ fn yield_csv(enumerator: Value) -> Result<(), Error> {
85
+ let mut reader = csv_reader(EnumeratorRead::new(enumerator));
86
+ let mut record = csv::ByteRecord::new();
87
+
88
+ loop {
89
+ let has_record = reader
90
+ .read_byte_record(&mut record)
91
+ .map_err(|e| Error::new(magnus::exception::runtime_error(), e.to_string()))?;
92
+
93
+ if !has_record {
94
+ break;
95
+ }
96
+
97
+ let row_array = record_to_ruby_array(&record)?;
98
+ let _: Value = yield_value(row_array)?;
99
+ }
100
+
101
+ Ok(())
102
+ }
103
+
104
+ fn parse_csv(data: String) -> Result<RArray, Error> {
105
+ let mut reader = csv_reader(data.as_bytes());
106
+ let result = RArray::new();
107
+
108
+ for record in reader.records() {
109
+ let record = record
110
+ .map_err(|e| Error::new(magnus::exception::runtime_error(), e.to_string()))?;
111
+
112
+ let row = RArray::with_capacity(record.len());
113
+ for field in record.iter() {
114
+ row.push(RString::new(field))?;
115
+ }
116
+ result.push(row)?;
117
+ }
118
+
119
+ Ok(result)
120
+ }
121
+
122
+ fn generate_line(row: Vec<String>) -> Result<String, Error> {
123
+ let mut wtr = csv::WriterBuilder::new().from_writer(vec![]);
124
+ wtr.write_record(&row)
125
+ .map_err(|e| Error::new(magnus::exception::runtime_error(), e.to_string()))?;
126
+
127
+ let inner = wtr
128
+ .into_inner()
129
+ .map_err(|e| Error::new(magnus::exception::runtime_error(), e.to_string()))?;
130
+
131
+ String::from_utf8(inner)
132
+ .map_err(|e| Error::new(magnus::exception::runtime_error(), e.to_string()))
133
+ }
134
+
135
+ #[magnus::init]
136
+ fn init(ruby: &Ruby) -> Result<(), Error> {
137
+ let reader_class = ruby.define_class("RscsvReader", ruby.class_object())?;
138
+ reader_class.define_singleton_method("each_internal", function!(yield_csv, 1))?;
139
+ reader_class.define_singleton_method("parse", function!(parse_csv, 1))?;
140
+
141
+ let writer_class = ruby.define_class("RscsvWriter", ruby.class_object())?;
142
+ writer_class.define_singleton_method("generate_line", function!(generate_line, 1))?;
143
+ writer_class.define_singleton_method("generate_lines", function!(generate_lines, 1))?;
144
+
145
+ Ok(())
146
+ }
Binary file
Binary file
Binary file
Binary file
Binary file
data/lib/rscsv/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rscsv
2
- VERSION = '0.6.0.beta4'.freeze
2
+ VERSION = '0.7.0'.freeze
3
3
  end
data/lib/rscsv.rb CHANGED
@@ -1,6 +1,5 @@
1
- require 'helix_runtime'
2
- require 'rscsv/native'
3
- require 'rscsv/version'
1
+ require_relative 'rscsv/rscsv'
2
+ require_relative 'rscsv/version'
4
3
 
5
4
  module Rscsv
6
5
  Reader = RscsvReader
@@ -12,5 +11,6 @@ module Rscsv
12
11
  nil
13
12
  end
14
13
  end
14
+
15
15
  Writer = RscsvWriter
16
16
  end
metadata CHANGED
@@ -1,57 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rscsv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0.beta4
4
+ version: 0.7.0
5
5
  platform: x86_64-linux
6
6
  authors:
7
7
  - Ville Lautanala
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-08 00:00:00.000000000 Z
11
+ date: 2026-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: helix_runtime
14
+ name: rb_sys
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.7.5
19
+ version: '0.9'
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.5
26
+ version: '0.9'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.14'
33
+ version: '2.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '1.14'
40
+ version: '2.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '10.0'
47
+ version: '13.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '10.0'
54
+ version: '13.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake-compiler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.2'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake-compiler-dock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.5'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.5'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: rspec
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +94,20 @@ dependencies:
66
94
  - - "~>"
67
95
  - !ruby/object:Gem::Version
68
96
  version: '3.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: csv
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '3.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '3.0'
69
111
  - !ruby/object:Gem::Dependency
70
112
  name: benchmark-ips
71
113
  requirement: !ruby/object:Gem::Requirement
@@ -87,14 +129,18 @@ executables: []
87
129
  extensions: []
88
130
  extra_rdoc_files: []
89
131
  files:
90
- - Gemfile
91
132
  - LICENSE.txt
92
133
  - README.md
93
- - Rakefile
134
+ - ext/rscsv/Cargo.toml
135
+ - ext/rscsv/extconf.rb
136
+ - ext/rscsv/src/lib.rs
94
137
  - lib/rscsv.rb
95
- - lib/rscsv/native.so
138
+ - lib/rscsv/3.0/rscsv.so
139
+ - lib/rscsv/3.1/rscsv.so
140
+ - lib/rscsv/3.2/rscsv.so
141
+ - lib/rscsv/3.3/rscsv.so
142
+ - lib/rscsv/3.4/rscsv.so
96
143
  - lib/rscsv/version.rb
97
- - lib/tasks/helix_runtime.rake
98
144
  homepage: https://github.com/lautis/rscsv
99
145
  licenses:
100
146
  - MIT
@@ -107,15 +153,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
107
153
  requirements:
108
154
  - - ">="
109
155
  - !ruby/object:Gem::Version
110
- version: '0'
156
+ version: '3.0'
157
+ - - "<"
158
+ - !ruby/object:Gem::Version
159
+ version: 3.5.dev
111
160
  required_rubygems_version: !ruby/object:Gem::Requirement
112
161
  requirements:
113
- - - ">"
162
+ - - ">="
114
163
  - !ruby/object:Gem::Version
115
- version: 1.3.1
164
+ version: '0'
116
165
  requirements: []
117
- rubyforge_project:
118
- rubygems_version: 2.7.7
166
+ rubygems_version: 3.5.23
119
167
  signing_key:
120
168
  specification_version: 4
121
169
  summary: Rust-powered CSV
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in rscsv.gemspec
4
- gemspec
data/Rakefile DELETED
@@ -1,9 +0,0 @@
1
- require 'bundler/gem_tasks'
2
- require 'bundler/setup'
3
- require 'rspec/core/rake_task'
4
- import 'lib/tasks/helix_runtime.rake'
5
-
6
- RSpec::Core::RakeTask.new(:spec)
7
-
8
- task :spec => :build
9
- task :default => :spec
data/lib/rscsv/native.so DELETED
Binary file
@@ -1,5 +0,0 @@
1
- require 'helix_runtime/build_task'
2
-
3
- HelixRuntime::BuildTask.new
4
-
5
- task :default => :build