From 6fdadc81ca838c6d65cd9db5539a9ea79b345023 Mon Sep 17 00:00:00 2001 From: Matas Zanevicius Date: Wed, 29 Mar 2023 01:58:01 +0300 Subject: [PATCH] Do not dup class and module name constants --- lib/attr_extras/attr_initialize.rb | 10 +++++++++- spec/attr_extras/attr_initialize_spec.rb | 12 ++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/attr_extras/attr_initialize.rb b/lib/attr_extras/attr_initialize.rb index 6b4e576..e5e9ee1 100644 --- a/lib/attr_extras/attr_initialize.rb +++ b/lib/attr_extras/attr_initialize.rb @@ -27,7 +27,15 @@ def apply validate_args.call(values, klass_params) klass_params.default_values.each do |name, default_value| - instance_variable_set("@#{name}", default_value.dup) + if (default_value.is_a?(Module) || default_value.is_a?(Class)) && + !default_value.name.nil? && + Module.const_defined?( + (default_value.to_s if default_value.respond_to?(:to_s)), + ) + instance_variable_set("@#{name}", default_value) + else + instance_variable_set("@#{name}", default_value.dup) + end end klass_params.positional_args.zip(values).each do |name, value| diff --git a/spec/attr_extras/attr_initialize_spec.rb b/spec/attr_extras/attr_initialize_spec.rb index 956e79f..cff0b48 100644 --- a/spec/attr_extras/attr_initialize_spec.rb +++ b/spec/attr_extras/attr_initialize_spec.rb @@ -47,6 +47,18 @@ def self.name _(example.instance_variable_get("@baz")).must_equal "Baz" end + it "can set constants as default values for positional arguments" do + klass = Class.new do + attr_initialize [ foo: AttrExtras ] + end + + example = klass.new + _(example.instance_variable_get("@foo")).must_equal AttrExtras + + example = klass.new(foo: AttrExtras::AttrInitialize) + _(example.instance_variable_get("@foo")).must_equal AttrExtras::AttrInitialize + end + it "treats hash values as optional" do klass = Class.new do attr_initialize :foo, [ :bar, :baz ]