toml-rb 4.0.0 → 4.1.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: 7deb039c3dea36679fb813cc6414671f8691f97d8a4d3d180a5a8cab2a5636e8
4
- data.tar.gz: 6d495d33fe92641632e962d560a508c35f1d0f03c5d445e13151b5b4e046a9ce
3
+ metadata.gz: 80597ee120e2f6517bfca775d9215d4ac3c9c9880bac87c1ec432edb78f32566
4
+ data.tar.gz: fd278770b1c245508fc7ceb15336fba968e98b258bc06badcca0875107406292
5
5
  SHA512:
6
- metadata.gz: 853879c8fbd703519d800f6e48b8b81cbc92791adb63584a5be9a75b9f17ea635df63aa86df7c05465684c4d15d2b72528740c307a06abda5f786913391ff16a
7
- data.tar.gz: 766d75b5c583d47a17d17c0fca05d6f520ae198c7953ad78cf2eda937397bb67c77e5c820ca1ea0924825020da3af2d7d26249d89f1a9d6062a03ff647a811dc
6
+ metadata.gz: d31002d86304f9c675da476e41f9c196077c7ded480f9f2224fb9d43416de1964238410828d55ce894f0ed68a0559097f2d96324be0f527771507f2589da4777
7
+ data.tar.gz: 91a114c7a2c397be72edfb826025ae1cde65d0732359c38a3719ca6e61f2cd6eb237842d7ddf60e3034db9791c800c916e8bf1885aaa48e56ff147aaccc68d20
@@ -11,7 +11,7 @@ module TomlRB
11
11
 
12
12
  def initialize(key)
13
13
  @key = key
14
- super "Key #{key.inspect} is defined more than once"
14
+ super("Key #{key.inspect} is defined more than once")
15
15
  end
16
16
  end
17
17
  end
@@ -16,24 +16,30 @@ module TomlRB
16
16
  keys = symbolize_keys ? @dotted_keys.map(&:to_sym) : @dotted_keys
17
17
  update = keys.reverse.inject(visit_value(@value)) { |k1, k2| {k2 => k1} }
18
18
 
19
+ parent_inline_table = fully_defined_keys.find { |k| dotted_keys_str.start_with?("#{k}.") }
20
+ fail ValueOverwriteError.new(@dotted_keys.first) if parent_inline_table
21
+
19
22
  if @value.is_a?(InlineTable)
23
+ child_keys_exist = fully_defined_keys.find { |k| k.start_with?("#{dotted_keys_str}.") }
24
+ fail ValueOverwriteError.new(@dotted_keys.first) if child_keys_exist
25
+
26
+ existing_hash = hash.dig(*keys)
27
+ fail ValueOverwriteError.new(@dotted_keys.first) if existing_hash.is_a?(Hash) && !existing_hash.empty?
28
+
20
29
  fully_defined_keys << dotted_keys_str
21
- hash.merge!(update) { |key, _, _| fail ValueOverwriteError.new(key) }
22
- elsif fully_defined_keys.find { |k| update.dig(*k) }
23
- hash.merge!(update) { |key, _, _| fail ValueOverwriteError.new(key) }
24
- else
25
- dotted_key_merge(hash, update)
26
30
  end
31
+
32
+ dotted_key_merge(hash, update)
27
33
  end
28
34
 
29
35
  def dotted_key_merge(hash, update)
30
- hash.merge!(update) { |key, old, new|
36
+ hash.merge!(update) do |key, old, new|
31
37
  if old.is_a?(Hash) && new.is_a?(Hash)
32
38
  dotted_key_merge(old, new)
33
39
  else
34
40
  fail ValueOverwriteError.new(key)
35
41
  end
36
- }
42
+ end
37
43
  end
38
44
 
39
45
  def accept_visitor(parser)
@@ -14,6 +14,14 @@ module TomlRB
14
14
  parsed.matches.map(&:value).compact.each { |m| m.accept_visitor(self) }
15
15
  rescue Citrus::ParseError => e
16
16
  raise TomlRB::ParseError.new(e.message)
17
+ rescue Encoding::CompatibilityError => e
18
+ raise TomlRB::ParseError.new("Encoding error: #{e.message}")
19
+ rescue ArgumentError => e
20
+ if e.message.include?("invalid byte sequence") || e.message.include?("encoding")
21
+ raise TomlRB::ParseError.new("Encoding error: #{e.message}")
22
+ else
23
+ raise
24
+ end
17
25
  end
18
26
  end
19
27
 
data/lib/toml-rb/table.rb CHANGED
@@ -8,9 +8,16 @@ module TomlRB
8
8
  ensure_key_not_defined(visited_keys)
9
9
  current = hash
10
10
  keys = symbolize_keys ? @dotted_keys.map(&:to_sym) : @dotted_keys
11
- keys.each do |key|
11
+ keys.each_with_index do |key, index|
12
12
  current[key] = {} unless current.key?(key)
13
13
  element = current[key]
14
+
15
+ # If this is the final key and it's already an array (from [[key]]), that's invalid
16
+ is_final_key = (index == keys.length - 1)
17
+ if is_final_key && element.is_a?(Array)
18
+ fail ValueOverwriteError.new(key)
19
+ end
20
+
14
21
  current = element.is_a?(Array) ? element.last : element
15
22
  # check that key has not been defined before as a scalar value
16
23
  fail ValueOverwriteError.new(key) unless current.is_a?(Hash)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TomlRB
4
- VERSION = "4.0.0"
4
+ VERSION = "4.1.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toml-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emiliano Mancuso
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2025-03-12 00:00:00.000000000 Z
12
+ date: 2025-10-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: citrus