toml-rb 1.1.1 → 2.0.2

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.
@@ -2,14 +2,14 @@ module TomlRB
2
2
  # Used in primitive.citrus
3
3
  module BasicString
4
4
  SPECIAL_CHARS = {
5
- '\\0' => "\0",
6
- '\\t' => "\t",
7
- '\\b' => "\b",
8
- '\\f' => "\f",
9
- '\\n' => "\n",
10
- '\\r' => "\r",
11
- '\\"' => '"',
12
- '\\\\' => '\\'
5
+ "\\0" => "\0",
6
+ "\\t" => "\t",
7
+ "\\b" => "\b",
8
+ "\\f" => "\f",
9
+ "\\n" => "\n",
10
+ "\\r" => "\r",
11
+ '\\"' => '"',
12
+ "\\\\" => "\\"
13
13
  }.freeze
14
14
 
15
15
  def value
@@ -21,7 +21,7 @@ module TomlRB
21
21
  # Replace the unicode escaped characters with the corresponding character
22
22
  # e.g. \u03B4 => ?
23
23
  def self.decode_unicode(str)
24
- [str[2..-1].to_i(16)].pack('U')
24
+ [str[2..-1].to_i(16)].pack("U")
25
25
  end
26
26
 
27
27
  def self.transform_escaped_chars(str)
@@ -29,7 +29,7 @@ module TomlRB
29
29
  if m.size == 2
30
30
  SPECIAL_CHARS[m] || parse_error(m)
31
31
  else
32
- decode_unicode(m).force_encoding('UTF-8')
32
+ decode_unicode(m).force_encoding("UTF-8")
33
33
  end
34
34
  end
35
35
  end
@@ -47,11 +47,11 @@ module TomlRB
47
47
 
48
48
  module MultilineString
49
49
  def value
50
- return '' if captures[:text].empty?
50
+ return "" if captures[:text].empty?
51
51
  aux = captures[:text].first.value
52
52
 
53
53
  # Remove spaces on multilined Singleline strings
54
- aux.gsub!(/\\\r?\n[\n\t\r ]*/, '')
54
+ aux.gsub!(/\\\r?\n[\n\t\r ]*/, "")
55
55
 
56
56
  TomlRB::BasicString.transform_escaped_chars aux
57
57
  end
@@ -59,10 +59,10 @@ module TomlRB
59
59
 
60
60
  module MultilineLiteral
61
61
  def value
62
- return '' if captures[:text].empty?
62
+ return "" if captures[:text].empty?
63
63
  aux = captures[:text].first.value
64
64
 
65
- aux.gsub(/\\\r?\n[\n\t\r ]*/, '')
65
+ aux.gsub(/\\\r?\n[\n\t\r ]*/, "")
66
66
  end
67
67
  end
68
68
  end
@@ -1,20 +1,21 @@
1
1
  module TomlRB
2
- class Keygroup
3
- def initialize(nested_keys)
4
- @nested_keys = nested_keys
2
+ class Table
3
+ def initialize(dotted_keys)
4
+ @dotted_keys = dotted_keys
5
5
  end
6
6
 
7
7
  def navigate_keys(hash, visited_keys, symbolize_keys = false)
8
8
  ensure_key_not_defined(visited_keys)
9
- @nested_keys.each do |key|
10
- key = symbolize_keys ? key.to_sym : key
11
- hash[key] = {} unless hash.key?(key)
12
- element = hash[key]
13
- hash = element.is_a?(Array) ? element.last : element
9
+ current = hash
10
+ keys = symbolize_keys ? @dotted_keys.map(&:to_sym) : @dotted_keys
11
+ keys.each do |key|
12
+ current[key] = {} unless current.key?(key)
13
+ element = current[key]
14
+ current = element.is_a?(Array) ? element.last : element
14
15
  # check that key has not been defined before as a scalar value
15
- fail ValueOverwriteError.new(key) unless hash.is_a?(Hash)
16
+ fail ValueOverwriteError.new(key) unless current.is_a?(Hash)
16
17
  end
17
- hash
18
+ current
18
19
  end
19
20
 
20
21
  # Fail if the key was already defined with a ValueOverwriteError
@@ -24,18 +25,18 @@ module TomlRB
24
25
  end
25
26
 
26
27
  def accept_visitor(parser)
27
- parser.visit_keygroup self
28
+ parser.visit_table self
28
29
  end
29
30
 
30
31
  def full_key
31
- @nested_keys.join('.')
32
+ @dotted_keys.join(".")
32
33
  end
33
34
  end
34
35
 
35
36
  # Used in document.citrus
36
- module KeygroupParser
37
+ module TableParser
37
38
  def value
38
- TomlRB::Keygroup.new(captures[:stripped_key].map(&:value))
39
+ TomlRB::Table.new(captures[:stripped_key].map(&:value).first)
39
40
  end
40
41
  end
41
42
  end
@@ -1,35 +1,35 @@
1
1
  module TomlRB
2
2
  class TableArray
3
- def initialize(nested_keys)
4
- @nested_keys = nested_keys
3
+ def initialize(dotted_keys)
4
+ @dotted_keys = dotted_keys
5
5
  end
6
6
 
7
7
  def navigate_keys(hash, symbolize_keys = false)
8
- last_key = @nested_keys.pop
9
- last_key = last_key.to_sym if symbolize_keys
8
+ current = hash
9
+ keys = symbolize_keys ? @dotted_keys.map(&:to_sym) : @dotted_keys
10
+ last_key = keys.pop
10
11
 
11
12
  # Go over the parent keys
12
- @nested_keys.each do |key|
13
- key = symbolize_keys ? key.to_sym : key
14
- hash[key] = {} unless hash[key]
13
+ keys.each do |key|
14
+ current[key] = {} unless current[key]
15
15
 
16
- if hash[key].is_a? Array
17
- hash[key] << {} if hash[key].empty?
18
- hash = hash[key].last
16
+ if current[key].is_a? Array
17
+ current[key] << {} if current[key].empty?
18
+ current = current[key].last
19
19
  else
20
- hash = hash[key]
20
+ current = current[key]
21
21
  end
22
22
  end
23
23
 
24
24
  # Define Table Array
25
- if hash[last_key].is_a? Hash
25
+ if current[last_key].is_a? Hash
26
26
  fail TomlRB::ParseError,
27
- "#{last_key} was defined as hash but is now redefined as a table!"
27
+ "#{last_key} was defined as hash but is now redefined as a table!"
28
28
  end
29
- hash[last_key] = [] unless hash[last_key]
30
- hash[last_key] << {}
29
+ current[last_key] = [] unless current[last_key]
30
+ current[last_key] << {}
31
31
 
32
- hash[last_key].last
32
+ current[last_key].last
33
33
  end
34
34
 
35
35
  def accept_visitor(parser)
@@ -37,14 +37,14 @@ module TomlRB
37
37
  end
38
38
 
39
39
  def full_key
40
- @nested_keys.join('.')
40
+ @dotted_keys.join(".")
41
41
  end
42
42
  end
43
43
 
44
44
  # Used in document.citrus
45
45
  module TableArrayParser
46
46
  def value
47
- TomlRB::TableArray.new(captures[:stripped_key].map(&:value))
47
+ TomlRB::TableArray.new(captures[:stripped_key].map(&:value).first)
48
48
  end
49
49
  end
50
50
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TomlRB
4
+ VERSION = "2.0.2"
5
+ end
data/lib/toml-rb.rb CHANGED
@@ -1,12 +1,13 @@
1
- require 'citrus'
1
+ require "citrus"
2
2
 
3
3
  require_relative "toml-rb/errors"
4
4
  require_relative "toml-rb/array"
5
5
  require_relative "toml-rb/string"
6
+ require_relative "toml-rb/datetime"
7
+ require_relative "toml-rb/table"
6
8
  require_relative "toml-rb/table_array"
7
9
  require_relative "toml-rb/inline_table"
8
10
  require_relative "toml-rb/keyvalue"
9
- require_relative "toml-rb/keygroup"
10
11
  require_relative "toml-rb/parser"
11
12
  require_relative "toml-rb/dumper"
12
13
 
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toml-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emiliano Mancuso
8
8
  - Lucas Tolchinsky
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-11-25 00:00:00.000000000 Z
12
+ date: 2021-11-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: citrus
@@ -31,6 +31,48 @@ dependencies:
31
31
  - - ">"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '3.0'
34
+ - !ruby/object:Gem::Dependency
35
+ name: minitest
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '5.7'
41
+ type: :development
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.7'
48
+ - !ruby/object:Gem::Dependency
49
+ name: standard
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.4'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.4'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
34
76
  description: 'A Toml parser using Citrus parsing library. '
35
77
  email:
36
78
  - emiliano.mancuso@gmail.com
@@ -39,10 +81,11 @@ executables: []
39
81
  extensions: []
40
82
  extra_rdoc_files: []
41
83
  files:
84
+ - LICENSE
42
85
  - README.md
43
- - Rakefile
44
86
  - lib/toml-rb.rb
45
87
  - lib/toml-rb/array.rb
88
+ - lib/toml-rb/datetime.rb
46
89
  - lib/toml-rb/dumper.rb
47
90
  - lib/toml-rb/errors.rb
48
91
  - lib/toml-rb/grammars/array.citrus
@@ -50,26 +93,17 @@ files:
50
93
  - lib/toml-rb/grammars/helper.citrus
51
94
  - lib/toml-rb/grammars/primitive.citrus
52
95
  - lib/toml-rb/inline_table.rb
53
- - lib/toml-rb/keygroup.rb
54
96
  - lib/toml-rb/keyvalue.rb
55
97
  - lib/toml-rb/parser.rb
56
98
  - lib/toml-rb/string.rb
99
+ - lib/toml-rb/table.rb
57
100
  - lib/toml-rb/table_array.rb
58
- - test/dumper_test.rb
59
- - test/errors_test.rb
60
- - test/example-v0.4.0.toml
61
- - test/example.toml
62
- - test/grammar_test.rb
63
- - test/hard_example.toml
64
- - test/helper.rb
65
- - test/toml_examples.rb
66
- - test/toml_test.rb
67
- - toml-rb.gemspec
68
- homepage: http://github.com/emancu/toml-rb
101
+ - lib/toml-rb/version.rb
102
+ homepage: https://github.com/emancu/toml-rb
69
103
  licenses:
70
104
  - MIT
71
105
  metadata: {}
72
- post_install_message:
106
+ post_install_message:
73
107
  rdoc_options: []
74
108
  require_paths:
75
109
  - lib
@@ -77,16 +111,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
77
111
  requirements:
78
112
  - - ">="
79
113
  - !ruby/object:Gem::Version
80
- version: '0'
114
+ version: '2.3'
81
115
  required_rubygems_version: !ruby/object:Gem::Requirement
82
116
  requirements:
83
117
  - - ">="
84
118
  - !ruby/object:Gem::Version
85
119
  version: '0'
86
120
  requirements: []
87
- rubyforge_project:
88
- rubygems_version: 2.6.12
89
- signing_key:
121
+ rubygems_version: 3.2.22
122
+ signing_key:
90
123
  specification_version: 4
91
124
  summary: Toml parser in ruby, for ruby.
92
125
  test_files: []
data/Rakefile DELETED
@@ -1,6 +0,0 @@
1
- require 'rake/testtask'
2
-
3
- Rake::TestTask.new do |t|
4
- t.pattern = 'test/*_test.rb'
5
- end
6
- task default: :test
data/test/dumper_test.rb DELETED
@@ -1,94 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class DumperTest < Minitest::Test
4
- def test_dump_empty
5
- dumped = TomlRB.dump({})
6
- assert_equal('', dumped)
7
- end
8
-
9
- def test_dump_types
10
- dumped = TomlRB.dump(string: 'TomlRB "dump"')
11
- assert_equal("string = \"TomlRB \\\"dump\\\"\"\n", dumped)
12
-
13
- dumped = TomlRB.dump(float: -13.24)
14
- assert_equal("float = -13.24\n", dumped)
15
-
16
- dumped = TomlRB.dump(int: 1234)
17
- assert_equal("int = 1234\n", dumped)
18
-
19
- dumped = TomlRB.dump(true: true)
20
- assert_equal("true = true\n", dumped)
21
-
22
- dumped = TomlRB.dump(false: false)
23
- assert_equal("false = false\n", dumped)
24
-
25
- dumped = TomlRB.dump(array: [1, 2, 3])
26
- assert_equal("array = [1, 2, 3]\n", dumped)
27
-
28
- dumped = TomlRB.dump(array: [[1, 2], %w(weird one)])
29
- assert_equal("array = [[1, 2], [\"weird\", \"one\"]]\n", dumped)
30
-
31
- dumped = TomlRB.dump(datetime: Time.utc(1986, 8, 28, 15, 15))
32
- assert_equal("datetime = 1986-08-28T15:15:00Z\n", dumped)
33
- end
34
-
35
- def test_dump_nested_attributes
36
- hash = { nested: { hash: { deep: true } } }
37
- dumped = TomlRB.dump(hash)
38
- assert_equal("[nested.hash]\ndeep = true\n", dumped)
39
-
40
- hash[:nested].merge!(other: 12)
41
- dumped = TomlRB.dump(hash)
42
- assert_equal("[nested]\nother = 12\n[nested.hash]\ndeep = true\n", dumped)
43
-
44
- hash[:nested].merge!(nest: { again: 'it never ends' })
45
- dumped = TomlRB.dump(hash)
46
- toml = <<-EOS.gsub(/^ {6}/, '')
47
- [nested]
48
- other = 12
49
- [nested.hash]
50
- deep = true
51
- [nested.nest]
52
- again = "it never ends"
53
- EOS
54
-
55
- assert_equal(toml, dumped)
56
-
57
- hash = { non: { 'bare."keys"' => { "works" => true } } }
58
- dumped = TomlRB.dump(hash)
59
- assert_equal("[non.\"bare.\\\"keys\\\"\"]\nworks = true\n", dumped)
60
-
61
- hash = { hola: [{ chau: 4 }, { chau: 3 }] }
62
- dumped = TomlRB.dump(hash)
63
- assert_equal("[[hola]]\nchau = 4\n[[hola]]\nchau = 3\n", dumped)
64
- end
65
-
66
- def test_print_empty_tables
67
- hash = { plugins: { cpu: { foo: "bar", baz: 1234 }, disk: {}, io: {} } }
68
- dumped = TomlRB.dump(hash)
69
- toml = <<-EOS.gsub(/^ {6}/, '')
70
- [plugins.cpu]
71
- baz = 1234
72
- foo = "bar"
73
- [plugins.disk]
74
- [plugins.io]
75
- EOS
76
-
77
- assert_equal toml, dumped
78
- end
79
-
80
- def test_dump_array_tables
81
- hash = { fruit: [{ physical: { color: "red" } }, { physical: { color: "blue" } }] }
82
- dumped = TomlRB.dump(hash)
83
- toml = <<-EOS.gsub(/^ {6}/, '')
84
- [[fruit]]
85
- [fruit.physical]
86
- color = "red"
87
- [[fruit]]
88
- [fruit.physical]
89
- color = "blue"
90
- EOS
91
-
92
- assert_equal toml, dumped
93
- end
94
- end
data/test/errors_test.rb DELETED
@@ -1,88 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class ErrorsTest < Minitest::Test
4
- def test_text_after_keygroup
5
- str = "[error] if you didn't catch this, your parser is broken"
6
- assert_raises(TomlRB::ParseError) { TomlRB.parse(str) }
7
- end
8
-
9
- def test_text_after_string
10
- str = 'string = "Anything other than tabs, spaces and newline after a '
11
- str += 'keygroup or key value pair has ended should produce an error '
12
- str += 'unless it is a comment" like this'
13
-
14
- assert_raises(TomlRB::ParseError) { TomlRB.parse(str) }
15
- end
16
-
17
- def test_multiline_array_bad_string
18
- str = <<-EOS
19
- array = [
20
- "This might most likely happen in multiline arrays",
21
- Like here,
22
- "or here,
23
- and here"
24
- ] End of array comment, forgot the #
25
- EOS
26
-
27
- assert_raises(TomlRB::ParseError) { TomlRB.parse(str) }
28
- end
29
-
30
- def test_multiline_array_string_not_ended
31
- str = <<-EOS
32
- array = [
33
- "This might most likely happen in multiline arrays",
34
- "or here,
35
- and here"
36
- ] End of array comment, forgot the #
37
- EOS
38
-
39
- assert_raises(TomlRB::ParseError) { TomlRB.parse(str) }
40
- end
41
-
42
- def test_text_after_multiline_array
43
- str = <<-EOS
44
- array = [
45
- "This might most likely happen in multiline arrays",
46
- "or here",
47
- "and here"
48
- ] End of array comment, forgot the #
49
- EOS
50
-
51
- assert_raises(TomlRB::ParseError) { TomlRB.parse(str) }
52
- end
53
-
54
- def test_text_after_number
55
- str = 'number = 3.14 pi <--again forgot the #'
56
- assert_raises(TomlRB::ParseError) { TomlRB.parse(str) }
57
- end
58
-
59
- def test_value_overwrite
60
- str = "a = 1\na = 2"
61
- e = assert_raises(TomlRB::ValueOverwriteError) { TomlRB.parse(str) }
62
- assert_equal "Key \"a\" is defined more than once", e.message
63
- assert_equal "a", e.key
64
-
65
- str = "a = false\na = true"
66
- assert_raises(TomlRB::ValueOverwriteError) { TomlRB.parse(str) }
67
- end
68
-
69
- def test_table_overwrite
70
- str = "[a]\nb=1\n[a]\nc=2"
71
- e = assert_raises(TomlRB::ValueOverwriteError) { TomlRB.parse(str) }
72
- assert_equal "Key \"a\" is defined more than once", e.message
73
-
74
- str = "[a]\nb=1\n[a]\nb=1"
75
- e = assert_raises(TomlRB::ValueOverwriteError) { TomlRB.parse(str) }
76
- assert_equal "Key \"a\" is defined more than once", e.message
77
- end
78
-
79
- def test_value_overwrite_with_table
80
- str = "[a]\nb=1\n[a.b]\nc=2"
81
- e = assert_raises(TomlRB::ValueOverwriteError) { TomlRB.parse(str) }
82
- assert_equal "Key \"b\" is defined more than once", e.message
83
-
84
- str = "[a]\nb=1\n[a.b.c]\nd=3"
85
- e = assert_raises(TomlRB::ValueOverwriteError) { TomlRB.parse(str) }
86
- assert_equal "Key \"b\" is defined more than once", e.message
87
- end
88
- end