From 0309179fb665f5f4628f2e0deb4050a75a9b742e Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Thu, 9 Jan 2020 10:35:14 +0100 Subject: [PATCH] Do not define instance predicate if the instance reader isn't as well This regressed in 49d1b5a98dc50ca59bbfb817f90eb5c2c2645d30. I didn't notice it because the method would be defined but would raise a NoMethodError. --- .../lib/active_support/core_ext/class/attribute.rb | 4 +++- activesupport/test/core_ext/class/attribute_test.rb | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/activesupport/lib/active_support/core_ext/class/attribute.rb b/activesupport/lib/active_support/core_ext/class/attribute.rb index ef930d0a6d..80a1955bed 100644 --- a/activesupport/lib/active_support/core_ext/class/attribute.rb +++ b/activesupport/lib/active_support/core_ext/class/attribute.rb @@ -120,7 +120,9 @@ def class_attribute(*attrs, instance_accessor: true, if instance_predicate class_methods << "silence_redefinition_of_method def #{name}?; !!self.#{name}; end" - methods << "silence_redefinition_of_method def #{name}?; !!self.#{name}; end" + if instance_reader + methods << "silence_redefinition_of_method def #{name}?; !!self.#{name}; end" + end end end diff --git a/activesupport/test/core_ext/class/attribute_test.rb b/activesupport/test/core_ext/class/attribute_test.rb index f8711ce506..6319feaf0d 100644 --- a/activesupport/test/core_ext/class/attribute_test.rb +++ b/activesupport/test/core_ext/class/attribute_test.rb @@ -68,24 +68,31 @@ def setup test "disabling instance writer" do object = Class.new { class_attribute :setting, instance_writer: false }.new assert_raise(NoMethodError) { object.setting = "boom" } + assert_not_respond_to object, :setting= end test "disabling instance reader" do object = Class.new { class_attribute :setting, instance_reader: false }.new assert_raise(NoMethodError) { object.setting } + assert_not_respond_to object, :setting assert_raise(NoMethodError) { object.setting? } + assert_not_respond_to object, :setting? end test "disabling both instance writer and reader" do object = Class.new { class_attribute :setting, instance_accessor: false }.new assert_raise(NoMethodError) { object.setting } + assert_not_respond_to object, :setting assert_raise(NoMethodError) { object.setting? } + assert_not_respond_to object, :setting? assert_raise(NoMethodError) { object.setting = "boom" } + assert_not_respond_to object, :setting= end test "disabling instance predicate" do object = Class.new { class_attribute :setting, instance_predicate: false }.new assert_raise(NoMethodError) { object.setting? } + assert_not_respond_to object, :setting? end test "works well with singleton classes" do