diff --git a/lib/active_model/serializer/settings.rb b/lib/active_model/serializer/settings.rb index 4a3e7c9d..77ac903d 100644 --- a/lib/active_model/serializer/settings.rb +++ b/lib/active_model/serializer/settings.rb @@ -1,16 +1,18 @@ +require 'active_support/hash_with_indifferent_access' + module ActiveModel class Serializer class Settings def initialize - @data = {} + @data = ActiveSupport::HashWithIndifferentAccess.new end def [](key) - @data[key.to_s] + @data[key] end def []=(key, value) - @data[key.to_s] = value + @data[key] = value end def each(&block) @@ -20,6 +22,17 @@ module ActiveModel def clear @data.clear end + + def method_missing(name, *args) + return @data[name] if @data.include?(name) + match = name.to_s.match(/(.*?)([?=]?)$/) + case match[2] + when "=" + @data[match[1]] = args.first + when "?" + !!@data[match[1]] + end + end end SETTINGS = Settings.new diff --git a/test/unit/active_model/serializer/settings_test.rb b/test/unit/active_model/serializer/settings_test.rb index abd5531b..2a083db8 100644 --- a/test/unit/active_model/serializer/settings_test.rb +++ b/test/unit/active_model/serializer/settings_test.rb @@ -43,6 +43,25 @@ module ActiveModel ensure SETTINGS.clear end + + def test_setup_config_accessors + ActiveModel::Serializer.setup do |config| + config.foo = 'v1' + config.bar = 'v2' + end + + assert_equal 'v1', SETTINGS.foo + assert_equal 'v2', SETTINGS.bar + ensure + SETTINGS.clear + end + + def test_setup_acessor_when_nil + assert_nil SETTINGS.foo + SETTINGS.foo = 1 + assert 1, SETTINGS.foo + assert_nil SETTINGS.bar + end end end end