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.
This commit is contained in:
Jean Boussier 2020-01-09 10:35:14 +01:00
parent 67e18160e6
commit 0309179fb6
2 changed files with 10 additions and 1 deletions

@ -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

@ -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