fast_toml 0.1.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Cargo.lock +102 -5
- data/Rakefile +12 -9
- data/ext/fast_toml/Cargo.toml +19 -2
- data/ext/fast_toml/extconf.rb +3 -3
- data/ext/fast_toml/src/lib.rs +75 -8
- data/lib/fast_toml/version.rb +1 -1
- data/lib/fast_toml.rb +9 -2
- data/rakelib/benchmark.rake +53 -0
- data/rakelib/env.rake +6 -0
- metadata +10 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ce6b2fdd996e28537c28dbaeab6bcb03c678590ab33323308e91d6f5b1d87ca
|
4
|
+
data.tar.gz: 1ae0fb254b3bfe3ccaacb58317a9a97034328e50ab4ea50f8a68409705f3de0e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b54db7122904b9c138ac7a9651c5d94edd852ce84a02c2450e0c90181d1f2f537a402feea5f657aabdb6aad79567591a3d01525df4120f165d23bcae43b87be5
|
7
|
+
data.tar.gz: a971b475d7968d130af93b33625b6dddb3fd4f38b648d2c98ea237af7558f1929565051342f4401d33301002057b2f930ba08012a55ce8745de25d77fd92437e
|
data/Cargo.lock
CHANGED
@@ -54,9 +54,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
|
54
54
|
|
55
55
|
[[package]]
|
56
56
|
name = "clang-sys"
|
57
|
-
version = "1.
|
57
|
+
version = "1.8.1"
|
58
58
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
59
|
-
checksum = "
|
59
|
+
checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
|
60
60
|
dependencies = [
|
61
61
|
"glob",
|
62
62
|
"libc",
|
@@ -69,11 +69,20 @@ version = "1.12.0"
|
|
69
69
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
70
70
|
checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b"
|
71
71
|
|
72
|
+
[[package]]
|
73
|
+
name = "equivalent"
|
74
|
+
version = "1.0.1"
|
75
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
76
|
+
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
|
77
|
+
|
72
78
|
[[package]]
|
73
79
|
name = "fast_toml"
|
74
|
-
version = "0.
|
80
|
+
version = "0.3.0"
|
75
81
|
dependencies = [
|
76
82
|
"magnus",
|
83
|
+
"rb-sys",
|
84
|
+
"rb-sys-env",
|
85
|
+
"toml",
|
77
86
|
]
|
78
87
|
|
79
88
|
[[package]]
|
@@ -82,6 +91,22 @@ version = "0.3.1"
|
|
82
91
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
83
92
|
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
|
84
93
|
|
94
|
+
[[package]]
|
95
|
+
name = "hashbrown"
|
96
|
+
version = "0.14.5"
|
97
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
98
|
+
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
99
|
+
|
100
|
+
[[package]]
|
101
|
+
name = "indexmap"
|
102
|
+
version = "2.2.6"
|
103
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
104
|
+
checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
|
105
|
+
dependencies = [
|
106
|
+
"equivalent",
|
107
|
+
"hashbrown",
|
108
|
+
]
|
109
|
+
|
85
110
|
[[package]]
|
86
111
|
name = "itertools"
|
87
112
|
version = "0.12.1"
|
@@ -166,9 +191,9 @@ dependencies = [
|
|
166
191
|
|
167
192
|
[[package]]
|
168
193
|
name = "proc-macro2"
|
169
|
-
version = "1.0.
|
194
|
+
version = "1.0.85"
|
170
195
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
171
|
-
checksum = "
|
196
|
+
checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23"
|
172
197
|
dependencies = [
|
173
198
|
"unicode-ident",
|
174
199
|
]
|
@@ -253,6 +278,35 @@ version = "0.3.5"
|
|
253
278
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
254
279
|
checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4"
|
255
280
|
|
281
|
+
[[package]]
|
282
|
+
name = "serde"
|
283
|
+
version = "1.0.203"
|
284
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
285
|
+
checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
|
286
|
+
dependencies = [
|
287
|
+
"serde_derive",
|
288
|
+
]
|
289
|
+
|
290
|
+
[[package]]
|
291
|
+
name = "serde_derive"
|
292
|
+
version = "1.0.203"
|
293
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
294
|
+
checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
|
295
|
+
dependencies = [
|
296
|
+
"proc-macro2",
|
297
|
+
"quote",
|
298
|
+
"syn",
|
299
|
+
]
|
300
|
+
|
301
|
+
[[package]]
|
302
|
+
name = "serde_spanned"
|
303
|
+
version = "0.6.6"
|
304
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
305
|
+
checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0"
|
306
|
+
dependencies = [
|
307
|
+
"serde",
|
308
|
+
]
|
309
|
+
|
256
310
|
[[package]]
|
257
311
|
name = "shell-words"
|
258
312
|
version = "1.1.0"
|
@@ -276,6 +330,40 @@ dependencies = [
|
|
276
330
|
"unicode-ident",
|
277
331
|
]
|
278
332
|
|
333
|
+
[[package]]
|
334
|
+
name = "toml"
|
335
|
+
version = "0.8.14"
|
336
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
337
|
+
checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335"
|
338
|
+
dependencies = [
|
339
|
+
"serde",
|
340
|
+
"serde_spanned",
|
341
|
+
"toml_datetime",
|
342
|
+
"toml_edit",
|
343
|
+
]
|
344
|
+
|
345
|
+
[[package]]
|
346
|
+
name = "toml_datetime"
|
347
|
+
version = "0.6.6"
|
348
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
349
|
+
checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf"
|
350
|
+
dependencies = [
|
351
|
+
"serde",
|
352
|
+
]
|
353
|
+
|
354
|
+
[[package]]
|
355
|
+
name = "toml_edit"
|
356
|
+
version = "0.22.14"
|
357
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
358
|
+
checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38"
|
359
|
+
dependencies = [
|
360
|
+
"indexmap",
|
361
|
+
"serde",
|
362
|
+
"serde_spanned",
|
363
|
+
"toml_datetime",
|
364
|
+
"winnow",
|
365
|
+
]
|
366
|
+
|
279
367
|
[[package]]
|
280
368
|
name = "unicode-ident"
|
281
369
|
version = "1.0.12"
|
@@ -345,3 +433,12 @@ name = "windows_x86_64_msvc"
|
|
345
433
|
version = "0.52.5"
|
346
434
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
347
435
|
checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
|
436
|
+
|
437
|
+
[[package]]
|
438
|
+
name = "winnow"
|
439
|
+
version = "0.6.13"
|
440
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
441
|
+
checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1"
|
442
|
+
dependencies = [
|
443
|
+
"memchr",
|
444
|
+
]
|
data/Rakefile
CHANGED
@@ -1,19 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
require
|
6
|
-
require
|
3
|
+
$LOAD_PATH.unshift File.expand_path(__dir__)
|
4
|
+
|
5
|
+
require 'bundler/gem_tasks'
|
6
|
+
require 'minitest/test_task'
|
7
|
+
require 'rubocop/rake_task'
|
8
|
+
require 'rb_sys/extensiontask'
|
7
9
|
|
8
10
|
Minitest::TestTask.create
|
9
|
-
RuboCop::RakeTask.new
|
10
11
|
|
11
|
-
|
12
|
+
RuboCop::RakeTask.new
|
12
13
|
|
13
|
-
GEMSPEC = Gem::Specification.load(
|
14
|
+
GEMSPEC = Gem::Specification.load('fast_toml.gemspec')
|
14
15
|
|
15
|
-
RbSys::ExtensionTask.new(
|
16
|
-
ext.lib_dir =
|
16
|
+
RbSys::ExtensionTask.new('fast_toml', GEMSPEC) do |ext|
|
17
|
+
ext.lib_dir = 'lib/fast_toml'
|
17
18
|
end
|
18
19
|
|
20
|
+
task build: :compile
|
21
|
+
|
19
22
|
task default: %i[compile test rubocop]
|
data/ext/fast_toml/Cargo.toml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
[package]
|
2
2
|
name = "fast_toml"
|
3
|
-
version = "0.
|
3
|
+
version = "0.3.0"
|
4
4
|
edition = "2021"
|
5
5
|
authors = ["Guilherme Carreiro <karreiro@gmail.com>"]
|
6
6
|
license = "MIT"
|
@@ -10,4 +10,21 @@ publish = false
|
|
10
10
|
crate-type = ["cdylib"]
|
11
11
|
|
12
12
|
[dependencies]
|
13
|
-
magnus =
|
13
|
+
magnus = "0.6.4"
|
14
|
+
toml = "0.8.13"
|
15
|
+
rb-sys = { version = "0.9.85", features = [
|
16
|
+
"bindgen-rbimpls",
|
17
|
+
"bindgen-deprecated-types",
|
18
|
+
"stable-api-compiled-fallback",
|
19
|
+
] }
|
20
|
+
|
21
|
+
[dev-dependencies]
|
22
|
+
rb-sys = { version = "0.9.85", features = [
|
23
|
+
"link-ruby",
|
24
|
+
"bindgen-rbimpls",
|
25
|
+
"bindgen-deprecated-types",
|
26
|
+
"stable-api-compiled-fallback",
|
27
|
+
] }
|
28
|
+
|
29
|
+
[build-dependencies]
|
30
|
+
rb-sys-env = { version = "0.1.2" }
|
data/ext/fast_toml/extconf.rb
CHANGED
data/ext/fast_toml/src/lib.rs
CHANGED
@@ -1,15 +1,82 @@
|
|
1
|
+
use magnus::exception::runtime_error;
|
1
2
|
use magnus::function;
|
2
3
|
use magnus::prelude::*;
|
3
|
-
use magnus::
|
4
|
-
use magnus::
|
5
|
-
|
6
|
-
fn hello(subject: String) -> String {
|
7
|
-
format!("Hello from Rust, {subject}!")
|
8
|
-
}
|
4
|
+
use magnus::value::{InnerValue, Lazy};
|
5
|
+
use magnus::RModule;
|
6
|
+
use magnus::{IntoValue, RArray, RHash, Ruby};
|
9
7
|
|
10
8
|
#[magnus::init]
|
11
|
-
fn init(ruby: &Ruby) -> Result<(), Error> {
|
9
|
+
fn init(ruby: &Ruby) -> Result<(), magnus::Error> {
|
12
10
|
let module = ruby.define_module("FastToml")?;
|
13
|
-
module.define_singleton_method("
|
11
|
+
module.define_singleton_method("parse", function!(parse, 1))?;
|
14
12
|
Ok(())
|
15
13
|
}
|
14
|
+
|
15
|
+
fn parse(str: String) -> Result<magnus::Value, magnus::Error> {
|
16
|
+
let toml_value = toml::from_str(&str);
|
17
|
+
|
18
|
+
match toml_value {
|
19
|
+
Ok(toml_value) => {
|
20
|
+
let ruby_value = to_ruby_value(toml_value);
|
21
|
+
Ok(ruby_value)
|
22
|
+
}
|
23
|
+
Err(err) => {
|
24
|
+
let ruby_err = to_ruby_err(err.message());
|
25
|
+
Err(ruby_err)
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
fn to_ruby_err(err_msg: &str) -> magnus::Error {
|
31
|
+
let ruby_api = Ruby::get();
|
32
|
+
|
33
|
+
if let Ok(ruby_api) = ruby_api {
|
34
|
+
let module = fast_toml_module(&ruby_api);
|
35
|
+
|
36
|
+
let err_class = module
|
37
|
+
.define_error("Error", ruby_api.exception_standard_error())
|
38
|
+
.expect("Failed to define or get FastToml::Error");
|
39
|
+
|
40
|
+
return magnus::Error::new(err_class, err_msg.to_string());
|
41
|
+
}
|
42
|
+
|
43
|
+
magnus::Error::new(runtime_error(), "FastToml runtime err")
|
44
|
+
}
|
45
|
+
|
46
|
+
fn fast_toml_module(ruby_api: &Ruby) -> RModule {
|
47
|
+
Lazy::new(|ruby| {
|
48
|
+
ruby.define_module("FastToml")
|
49
|
+
.expect("Failed to define or get FastToml")
|
50
|
+
})
|
51
|
+
.get_inner_with(ruby_api)
|
52
|
+
}
|
53
|
+
|
54
|
+
fn to_ruby_value(value: toml::Value) -> magnus::Value {
|
55
|
+
match value {
|
56
|
+
toml::Value::String(string) => string.into_value(),
|
57
|
+
toml::Value::Integer(integer) => integer.into_value(),
|
58
|
+
toml::Value::Float(float) => float.into_value(),
|
59
|
+
toml::Value::Boolean(boolean) => boolean.into_value(),
|
60
|
+
toml::Value::Datetime(date) => date.to_string().into_value(),
|
61
|
+
toml::Value::Array(rust_array) => {
|
62
|
+
let ruby_array = RArray::new();
|
63
|
+
|
64
|
+
for value in rust_array {
|
65
|
+
let value = to_ruby_value(value);
|
66
|
+
ruby_array.push(value).unwrap();
|
67
|
+
}
|
68
|
+
|
69
|
+
ruby_array.into_value()
|
70
|
+
}
|
71
|
+
toml::Value::Table(rust_map) => {
|
72
|
+
let ruby_hash = RHash::new();
|
73
|
+
|
74
|
+
for (key, value) in rust_map {
|
75
|
+
let value = to_ruby_value(value);
|
76
|
+
ruby_hash.aset(key, value).unwrap();
|
77
|
+
}
|
78
|
+
|
79
|
+
ruby_hash.into_value()
|
80
|
+
}
|
81
|
+
}
|
82
|
+
}
|
data/lib/fast_toml/version.rb
CHANGED
data/lib/fast_toml.rb
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
4
|
-
|
3
|
+
require_relative 'fast_toml/version'
|
4
|
+
|
5
|
+
begin
|
6
|
+
RUBY_VERSION =~ /(\d+\.\d+)/
|
7
|
+
require_relative "fast_toml/#{Regexp.last_match(1)}/fast_toml"
|
8
|
+
rescue LoadError
|
9
|
+
require_relative 'fast_toml/fast_toml'
|
10
|
+
end
|
5
11
|
|
6
12
|
module FastToml
|
7
13
|
class Error < StandardError; end
|
14
|
+
# Your code goes here...
|
8
15
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'benchmark'
|
4
|
+
require 'benchmark/ips'
|
5
|
+
require 'toml'
|
6
|
+
require 'toml-rb'
|
7
|
+
require 'perfect_toml'
|
8
|
+
require 'tomlrb'
|
9
|
+
|
10
|
+
TOML_INPUT = <<~TOML
|
11
|
+
[package]
|
12
|
+
name = "fast_toml"
|
13
|
+
version = "0.1.0"
|
14
|
+
edition = "2021"
|
15
|
+
authors = ["Guilherme Carreiro <karreiro@gmail.com>"]
|
16
|
+
license = "MIT"
|
17
|
+
publish = false
|
18
|
+
|
19
|
+
[lib]
|
20
|
+
crate-type = ["cdylib"]
|
21
|
+
|
22
|
+
[dependencies]
|
23
|
+
magnus = "0.6.4"
|
24
|
+
toml = "0.8.13"
|
25
|
+
TOML
|
26
|
+
|
27
|
+
namespace :benchmark do
|
28
|
+
desc 'Benchmark different TOML parsers (ips)'
|
29
|
+
task ips: :env do
|
30
|
+
Benchmark.ips do |x|
|
31
|
+
x.report('fast_toml') { FastToml.parse(TOML_INPUT) }
|
32
|
+
x.report('toml') { TOML::Parser.new(TOML_INPUT).parsed }
|
33
|
+
x.report('toml-rb') { TomlRB.parse(TOML_INPUT) }
|
34
|
+
x.report('perfect_toml') { PerfectTOML.parse(TOML_INPUT) }
|
35
|
+
x.report('tomlrb') { Tomlrb.parse(TOML_INPUT) }
|
36
|
+
|
37
|
+
x.compare!
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
desc 'Benchmark different TOML parsers (ms)'
|
42
|
+
task ms: :env do
|
43
|
+
n = 5_000
|
44
|
+
|
45
|
+
Benchmark.bm(20) do |x|
|
46
|
+
x.report('fast_toml:') { n.times { FastToml.parse(TOML_INPUT) } }
|
47
|
+
x.report('toml:') { n.times { TOML::Parser.new(TOML_INPUT).parsed } }
|
48
|
+
x.report('toml-rb:') { n.times { TomlRB.parse(TOML_INPUT) } }
|
49
|
+
x.report('perfect_toml:') { n.times { PerfectTOML.parse(TOML_INPUT) } }
|
50
|
+
x.report('tomlrb:') { n.times { Tomlrb.parse(TOML_INPUT) } }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/rakelib/env.rake
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fast_toml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guilherme Carreiro
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-06-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rb_sys
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.9.
|
19
|
+
version: 0.9.85
|
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.9.
|
26
|
+
version: 0.9.85
|
27
27
|
description: A fast TOML parser.
|
28
28
|
email:
|
29
29
|
- karreiro@gmail.com
|
@@ -44,6 +44,8 @@ files:
|
|
44
44
|
- ext/fast_toml/src/lib.rs
|
45
45
|
- lib/fast_toml.rb
|
46
46
|
- lib/fast_toml/version.rb
|
47
|
+
- rakelib/benchmark.rake
|
48
|
+
- rakelib/env.rake
|
47
49
|
homepage: https://github.com/karreiro/fast_toml
|
48
50
|
licenses:
|
49
51
|
- MIT
|
@@ -53,7 +55,7 @@ metadata:
|
|
53
55
|
homepage_uri: https://github.com/karreiro/fast_toml
|
54
56
|
source_code_uri: https://github.com/karreiro/fast_toml
|
55
57
|
rubygems_mfa_required: 'true'
|
56
|
-
post_install_message:
|
58
|
+
post_install_message:
|
57
59
|
rdoc_options: []
|
58
60
|
require_paths:
|
59
61
|
- lib
|
@@ -68,8 +70,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
68
70
|
- !ruby/object:Gem::Version
|
69
71
|
version: 3.3.11
|
70
72
|
requirements: []
|
71
|
-
rubygems_version: 3.5.
|
72
|
-
signing_key:
|
73
|
+
rubygems_version: 3.5.9
|
74
|
+
signing_key:
|
73
75
|
specification_version: 4
|
74
76
|
summary: A fast TOML parser.
|
75
77
|
test_files: []
|