From 4998f8326bde90cf577da5b82acdd43c4b667c56 Mon Sep 17 00:00:00 2001 From: Oskar Eichler Date: Fri, 28 Aug 2026 03:04:15 +0300 Subject: [PATCH 1/2] Inspect actual methods when protecting OpenStruct fields --- lib/ostruct.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/ostruct.rb b/lib/ostruct.rb index a8763da..ecf37a9 100644 --- a/lib/ostruct.rb +++ b/lib/ostruct.rb @@ -252,12 +252,13 @@ def new_ostruct_member!(name) # :nodoc: private :new_ostruct_member! private def is_method_protected!(name) # :nodoc: - if !respond_to?(name, true) + sc = singleton_class! + if !(sc.method_defined?(name) || sc.private_method_defined?(name)) false elsif name.match?(/!$/) true else - owner = method!(name).owner + owner = sc.instance_method(name).owner if owner.class == ::Class owner < ::OpenStruct else From b64c16b2bbfe2c82dcf62b1d3d4f5c0e5f1ea6e8 Mon Sep 17 00:00:00 2001 From: Oskar Eichler <62393985+OskarEichler@users.noreply.github.com> Date: Fri, 28 Aug 2026 14:56:19 +0300 Subject: [PATCH 2/2] test: cover OpenStruct field collision regression --- test/ostruct/test_ostruct.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/ostruct/test_ostruct.rb b/test/ostruct/test_ostruct.rb index 616f84d..f0cbd7d 100644 --- a/test/ostruct/test_ostruct.rb +++ b/test/ostruct/test_ostruct.rb @@ -439,4 +439,10 @@ def test_performance_warning ) end end + def test_initialize_with_respond_to_field + o = OpenStruct.new(respond_to?: false, next_field: 3) + + assert_equal({respond_to?: false, next_field: 3}, o.to_h) + end + end