diff options
author | Eric Saxby <sax@livinginthepast.org> | 2012-08-11 17:39:20 -0700 |
---|---|---|
committer | Eric Saxby <sax@livinginthepast.org> | 2012-08-11 17:39:20 -0700 |
commit | 6fe36ba585d7d60d127b3ba75f923a48c132b3bb (patch) | |
tree | 5952b944b2a021c16e87252be1e263e6901826c3 | |
parent | a513cc1862cc61fd9605352a58c5e36cc40cb574 (diff) | |
download | rails-6fe36ba585d7d60d127b3ba75f923a48c132b3bb.tar.gz rails-6fe36ba585d7d60d127b3ba75f923a48c132b3bb.tar.bz2 rails-6fe36ba585d7d60d127b3ba75f923a48c132b3bb.zip |
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.
-rw-r--r-- | activesupport/lib/active_support/notifications/fanout.rb | 6 | ||||
-rw-r--r-- | activesupport/test/notifications/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 6ffc091233..2e5bcf4639 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 f77a0eb3fa..f690ad43fc 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 |