diff --git a/lib/did_you_mean.rb b/lib/did_you_mean.rb index 640d910..c0bc181 100644 --- a/lib/did_you_mean.rb +++ b/lib/did_you_mean.rb @@ -118,7 +118,7 @@ def self.formatter if defined?(Ractor) Ractor.current[:__did_you_mean_formatter__] || Formatter else - Formatter + @formatter || Formatter end end @@ -126,6 +126,8 @@ def self.formatter def self.formatter=(formatter) if defined?(Ractor) Ractor.current[:__did_you_mean_formatter__] = formatter + else + @formatter = formatter end end end diff --git a/test/test_formatter.rb b/test/test_formatter.rb new file mode 100644 index 0000000..1bf3f9e --- /dev/null +++ b/test/test_formatter.rb @@ -0,0 +1,37 @@ +require_relative './helper' + +class FormatterTest < Test::Unit::TestCase + class CustomFormatter + def self.message_for(corrections) + " custom suggestions: #{corrections.join(', ')}" + end + end + + def setup + @original_formatter = DidYouMean.formatter + end + + def teardown + DidYouMean.formatter = @original_formatter + end + + def test_custom_formatter_is_used_for_error_messages + DidYouMean.formatter = CustomFormatter + assert_same CustomFormatter, DidYouMean.formatter + error = assert_raise(KeyError) { { book: 1 }.fetch(:boook) } + assert_include DidYouMean::TestHelper.get_message(error), 'custom suggestions: :book' + end + + def test_nil_formatter_restores_default + DidYouMean.formatter = CustomFormatter + DidYouMean.formatter = nil + assert_same DidYouMean::Formatter, DidYouMean.formatter + end + + unless defined?(Ractor) + def test_formatter_is_shared_between_threads_without_ractors + DidYouMean.formatter = CustomFormatter + assert_same CustomFormatter, Thread.new { DidYouMean.formatter }.value + end + end +end