From 1f43d72a8331f083b3424820d45292c299f3ca78 Mon Sep 17 00:00:00 2001 From: akmhatey-ai <260399619+akmhatey-ai@users.noreply.github.com> Date: Mon, 25 May 2026 21:26:03 +0200 Subject: [PATCH] #469: Preserve hash additions in place --- lib/fbe/overwrite.rb | 10 ++++++++++ test/fbe/test_overwrite.rb | 16 ++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/lib/fbe/overwrite.rb b/lib/fbe/overwrite.rb index b857238..f63ee91 100644 --- a/lib/fbe/overwrite.rb +++ b/lib/fbe/overwrite.rb @@ -40,14 +40,24 @@ def Fbe.overwrite(fact, property_or_hash, values = nil, fb: Fbe.fb, fid: '_id') before[k.to_s] = fact[k] end modified = false + missing = true property_or_hash.each do |k, vv| raise(Fbe::Error, "The value for #{k} is nil") if vv.nil? vv = [vv] unless vv.is_a?(Array) + missing = false unless before[k.to_s].nil? next if before[k.to_s] == vv before[k.to_s] = vv modified = true end return fact unless modified + if missing + before.slice(*property_or_hash.keys.map(&:to_s)).each do |k, vv| + vv.each do |v| + fact.public_send(:"#{k}=", v) + end + end + return + end id = fact[fid]&.first raise(Fbe::Error, "There is no #{fid} in the fact, cannot use Fbe.overwrite") if id.nil? raise(Fbe::Error, "No facts by #{fid} = #{id}") if fb.query("(eq #{fid} #{id})").delete!.zero? diff --git a/test/fbe/test_overwrite.rb b/test/fbe/test_overwrite.rb index 9998b08..f144bda 100644 --- a/test/fbe/test_overwrite.rb +++ b/test/fbe/test_overwrite.rb @@ -88,6 +88,22 @@ def test_without_previous_property assert_equal(before, fbx.query('(eq bar 44)').each.first._id) end + def test_hash_without_previous_property + c = 0 + fb = + Factbase::Pre.new(Factbase.new) do |f, _fbt| + f.pos = c + c += 1 + end + f = fb.insert + f._id = 1 + f.foo = 42 + before = f.pos + Fbe.overwrite(f, { bar: 44 }, fb:) + found = fb.query('(eq bar 44)').each.first + assert_equal(before, found.pos) + end + def test_safe_insert fb = Factbase.new first = fb.insert