diff options
Diffstat (limited to 'railties')
-rw-r--r-- | railties/lib/rails/subscriber.rb | 12 | ||||
-rw-r--r-- | railties/lib/rails/subscriber/test_helper.rb | 7 | ||||
-rw-r--r-- | railties/test/subscriber_test.rb | 23 |
3 files changed, 40 insertions, 2 deletions
diff --git a/railties/lib/rails/subscriber.rb b/railties/lib/rails/subscriber.rb index f98dec738d..88a6f77eaa 100644 --- a/railties/lib/rails/subscriber.rb +++ b/railties/lib/rails/subscriber.rb @@ -30,7 +30,8 @@ module Rails # purposes(which slows down the main thread). Besides of providing a centralized # facility on top of Rails.logger. # - # Finally, Subscriber some helpers to deal with logging, like managing console colors. + # Subscriber also has some helpers to deal with logging and automatically flushes + # all logs when the request finishes (via action_dispatch.callback notification). class Subscriber cattr_accessor :colorize_logging, :instance_writer => false self.colorize_logging = true @@ -64,6 +65,15 @@ module Rails if subscriber.respond_to?(name) && subscriber.logger subscriber.send(name, ActiveSupport::Notifications::Event.new(*args)) end + + flush_all! if args[0] == "action_dispatch.callback" + end + + # Flush all subscribers' logger. + def self.flush_all! + loggers = subscribers.values.map(&:logger) + loggers.uniq! + loggers.each { |l| l.flush if l.respond_to?(:flush) } end # By default, we use the Rails.logger for logging. diff --git a/railties/lib/rails/subscriber/test_helper.rb b/railties/lib/rails/subscriber/test_helper.rb index 8b981dc3a6..1464767ed9 100644 --- a/railties/lib/rails/subscriber/test_helper.rb +++ b/railties/lib/rails/subscriber/test_helper.rb @@ -58,7 +58,10 @@ module Rails end class MockLogger + attr_reader :flush_count + def initialize + @flush_count = 0 @logged = Hash.new { |h,k| h[k] = [] } end @@ -69,6 +72,10 @@ module Rails def logged(level) @logged[level].compact.map { |l| l.to_s.strip } end + + def flush + @flush_count += 1 + end end # Wait notifications to be published. diff --git a/railties/test/subscriber_test.rb b/railties/test/subscriber_test.rb index db953bb041..7e91b7333f 100644 --- a/railties/test/subscriber_test.rb +++ b/railties/test/subscriber_test.rb @@ -76,10 +76,31 @@ module SubscriberTest def test_does_not_send_the_event_if_logger_is_nil Rails.logger = nil + @subscriber.expects(:some_event).never Rails::Subscriber.add :my_subscriber, @subscriber instrument "my_subscriber.some_event" wait - assert_equal [], @logger.logged(:info) + end + + def test_flushes_loggers + Rails::Subscriber.add :my_subscriber, @subscriber + Rails::Subscriber.flush_all! + assert_equal 1, @logger.flush_count + end + + def test_flushes_loggers_when_action_dispatch_callback_is_received + Rails::Subscriber.add :my_subscriber, @subscriber + instrument "action_dispatch.callback" + wait + assert_equal 1, @logger.flush_count + end + + def test_flushes_the_same_logger_just_once + Rails::Subscriber.add :my_subscriber, @subscriber + Rails::Subscriber.add :another, @subscriber + instrument "action_dispatch.callback" + wait + assert_equal 1, @logger.flush_count end class SyncSubscriberTest < ActiveSupport::TestCase |