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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: edba9c5d0e1ea5f7b69477616d60d808fccdd0c5c6a5f4fc7dcaf49a15ec517b
4
- data.tar.gz: a2f76f9d410e9c1e799707b1f0ccf8a5849a6c1b85db591b3d12500a57f914d0
3
+ metadata.gz: 9ce6b2fdd996e28537c28dbaeab6bcb03c678590ab33323308e91d6f5b1d87ca
4
+ data.tar.gz: 1ae0fb254b3bfe3ccaacb58317a9a97034328e50ab4ea50f8a68409705f3de0e
5
5
  SHA512:
6
- metadata.gz: edc7fefcdd1f04edf2d05e6d12c1acb8ece2fe38bd12e934428c21d69785fcc9d742c0aefc05a17d3980a2acd551f4cc91954273c6148b4c77302c46f0c34848
7
- data.tar.gz: ae883861709028ee1f868514d4ecb588083765372708e40c2cd36c63241be78fcb8137811540bce6e60b6454647cd0f171db395d67a1add8ea2c4efcc9757fb9
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.7.0"
57
+ version = "1.8.1"
58
58
  source = "registry+https://github.com/rust-lang/crates.io-index"
59
- checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1"
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.1.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.84"
194
+ version = "1.0.85"
170
195
  source = "registry+https://github.com/rust-lang/crates.io-index"
171
- checksum = "ec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6"
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
- require "bundler/gem_tasks"
4
- require "minitest/test_task"
5
- require "rubocop/rake_task"
6
- require "rb_sys/extensiontask"
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
- task build: :compile
12
+ RuboCop::RakeTask.new
12
13
 
13
- GEMSPEC = Gem::Specification.load("fast_toml.gemspec")
14
+ GEMSPEC = Gem::Specification.load('fast_toml.gemspec')
14
15
 
15
- RbSys::ExtensionTask.new("fast_toml", GEMSPEC) do |ext|
16
- ext.lib_dir = "lib/fast_toml"
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]
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "fast_toml"
3
- version = "0.1.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 = { version = "0.6.2" }
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" }
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "mkmf"
4
- require "rb_sys/mkmf"
3
+ require 'mkmf'
4
+ require 'rb_sys/mkmf'
5
5
 
6
- create_rust_makefile("fast_toml/fast_toml")
6
+ create_rust_makefile('fast_toml/fast_toml')
@@ -1,15 +1,82 @@
1
+ use magnus::exception::runtime_error;
1
2
  use magnus::function;
2
3
  use magnus::prelude::*;
3
- use magnus::Error;
4
- use magnus::Ruby;
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("hello", function!(hello, 1))?;
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
+ }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FastToml
4
- VERSION = "0.1.0"
4
+ VERSION = '0.3.0'
5
5
  end
data/lib/fast_toml.rb CHANGED
@@ -1,8 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "fast_toml/version"
4
- require_relative "fast_toml/fast_toml"
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
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ desc 'Initialize fast_json environment'
4
+ task :env do
5
+ require 'lib/fast_toml'
6
+ end
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.1.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-05-26 00:00:00.000000000 Z
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.97
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.97
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.10
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: []