From 28db4208c4c218fb934916f747f742e62629d697 Mon Sep 17 00:00:00 2001 From: Andrew Mackross Date: Wed, 11 Jun 2025 23:09:42 +1200 Subject: [PATCH] Fix dup modifying original store --- lib/attributed_string/klass.rb | 5 +++-- test/initializers_test.rb | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/attributed_string/klass.rb b/lib/attributed_string/klass.rb index 0087468..8e6bb05 100644 --- a/lib/attributed_string/klass.rb +++ b/lib/attributed_string/klass.rb @@ -20,8 +20,9 @@ def initialize(string = "", **attrs) def dup super.tap do |copy| new_store = @store.map do |entry| - entry[:range] = entry[:range].dup - entry.dup + entry_dup = entry.dup + entry_dup[:range] = entry_dup[:range].dup + entry_dup end copy.instance_variable_set(:@store, new_store) end diff --git a/test/initializers_test.rb b/test/initializers_test.rb index 8adb70a..1bcf3f2 100644 --- a/test/initializers_test.rb +++ b/test/initializers_test.rb @@ -24,4 +24,12 @@ def test_dup end end + def test_dup_does_not_modify_original_store + @attr_string.add_attrs(0..4, bold: true) + original_range_id = @attr_string.instance_variable_get(:@store).first[:range].object_id + @attr_string.dup + after_range_id = @attr_string.instance_variable_get(:@store).first[:range].object_id + assert_equal original_range_id, after_range_id + end + end