fast_toml 0.1.0 → 0.3.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: 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: []