From 5574a2fcb4b29c4128f2f7143e1dd7458d8d2c26 Mon Sep 17 00:00:00 2001 From: Eugene Kenny Date: Mon, 2 Oct 2023 16:35:01 +0100 Subject: [PATCH] Delegate block in broadcast logger method_missing When a method called on a broadcast logger is passed a block, it should be forwarded to all subscribed loggers. --- .../lib/active_support/broadcast_logger.rb | 12 ++++++++---- activesupport/test/broadcast_logger_test.rb | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/activesupport/lib/active_support/broadcast_logger.rb b/activesupport/lib/active_support/broadcast_logger.rb index 33255902d03dd..90b1b98c60263 100644 --- a/activesupport/lib/active_support/broadcast_logger.rb +++ b/activesupport/lib/active_support/broadcast_logger.rb @@ -203,16 +203,20 @@ def dispatch(&block) @broadcasts.each { |logger| block.call(logger) } end - def method_missing(name, *args) + def method_missing(name, *args, &block) loggers = @broadcasts.select { |logger| logger.respond_to?(name) } if loggers.none? - super(name, *args) + super(name, *args, &block) elsif loggers.one? - loggers.first.send(name, *args) + loggers.first.send(name, *args, &block) else - loggers.map { |logger| logger.send(name, *args) } + loggers.map { |logger| logger.send(name, *args, &block) } end end + + def respond_to_missing?(method, include_all) + @broadcasts.any? { |logger| logger.respond_to?(method, include_all) } + end end end diff --git a/activesupport/test/broadcast_logger_test.rb b/activesupport/test/broadcast_logger_test.rb index 1c6d3bd37c77a..280f9fc91956e 100644 --- a/activesupport/test/broadcast_logger_test.rb +++ b/activesupport/test/broadcast_logger_test.rb @@ -268,6 +268,16 @@ def info(msg, &block) assert(logger.foo) end + test "calling a method that accepts a block" do + logger = BroadcastLogger.new(CustomLogger.new) + + called = false + logger.bar do + called = true + end + assert(called) + end + class CustomLogger attr_reader :adds, :closed, :chevrons attr_accessor :level, :progname, :formatter, :local_level @@ -286,6 +296,10 @@ def foo true end + def bar + yield + end + def debug(message, &block) add(::Logger::DEBUG, message, &block) end