From 6fe36ba585d7d60d127b3ba75f923a48c132b3bb Mon Sep 17 00:00:00 2001 From: Eric Saxby Date: Sat, 11 Aug 2012 17:39:20 -0700 Subject: [PATCH] Evented notifications take priority over Timed notifications In cases where a notification subscriber includes methods to support both Evented and Timed events, Evented should take priority over Timed. This allows subscribers to be backwards compatible (older Rails only allows Timed events) while defaulting to newer behavior. --- .../active_support/notifications/fanout.rb | 6 +++--- .../evented_notification_test.rb | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/activesupport/lib/active_support/notifications/fanout.rb b/activesupport/lib/active_support/notifications/fanout.rb index 6ffc0912335..2e5bcf4639d 100644 --- a/activesupport/lib/active_support/notifications/fanout.rb +++ b/activesupport/lib/active_support/notifications/fanout.rb @@ -59,10 +59,10 @@ module ActiveSupport module Subscribers # :nodoc: def self.new(pattern, listener) - if listener.respond_to?(:call) - subscriber = Timed.new pattern, listener - else + if listener.respond_to?(:start) and listener.respond_to?(:finish) subscriber = Evented.new pattern, listener + else + subscriber = Timed.new pattern, listener end unless pattern diff --git a/activesupport/test/notifications/evented_notification_test.rb b/activesupport/test/notifications/evented_notification_test.rb index f77a0eb3fa7..f690ad43fc1 100644 --- a/activesupport/test/notifications/evented_notification_test.rb +++ b/activesupport/test/notifications/evented_notification_test.rb @@ -19,6 +19,12 @@ module ActiveSupport end end + class ListenerWithTimedSupport < Listener + def call(name, start, finish, id, payload) + @events << [:call, name, start, finish, id, payload] + end + end + def test_evented_listener notifier = Fanout.new listener = Listener.new @@ -62,6 +68,20 @@ module ActiveSupport [:finish, 'hello', 1, {}], ], listener.events end + + def test_evented_listener_priority + notifier = Fanout.new + listener = ListenerWithTimedSupport.new + notifier.subscribe 'hi', listener + + notifier.start 'hi', 1, {} + notifier.finish 'hi', 1, {} + + assert_equal [ + [:start, 'hi', 1, {}], + [:finish, 'hi', 1, {}] + ], listener.events + end end end end