提交 b50468d1 编写于 作者: D Dennis Schoen

Fixed duplicate subscribers in ActiveSupport::Subscriber

ActiveSupport::Subscriber no longer creates multiple subscribers when
you redefine a method.
上级 83e05442
* Fixed `ActiveSupport::Subscriber` so that no duplicate subscriber is created
when a subscriber method is redefined.
*Dennis Schön*
* `humanize` strips leading underscores, if any.
Before:
......
......@@ -64,12 +64,21 @@ def subscribers
def add_event_subscriber(event)
return if %w{ start finish }.include?(event.to_s)
notifier.subscribe("#{event}.#{namespace}", subscriber)
pattern = "#{event}.#{namespace}"
# don't add multiple subscribers (eg. if methods are redefined)
return if subscriber.patterns.include?(pattern)
subscriber.patterns << pattern
notifier.subscribe(pattern, subscriber)
end
end
attr_reader :patterns
def initialize
@queue_key = [self.class.name, object_id].join "-"
@patterns = []
super
end
......
......@@ -4,20 +4,27 @@
class TestSubscriber < ActiveSupport::Subscriber
attach_to :doodle
cattr_reader :event
cattr_reader :events
def self.clear
@@event = nil
@@events = []
end
def open_party(event)
@@event = event
events << event
end
private
def private_party(event)
@@event = event
events << event
end
end
# Monkey patch subscriber to test that only one subscriber per method is added.
class TestSubscriber
def open_party(event)
events << event
end
end
......@@ -29,12 +36,18 @@ def setup
def test_attaches_subscribers
ActiveSupport::Notifications.instrument("open_party.doodle")
assert_equal "open_party.doodle", TestSubscriber.event.name
assert_equal "open_party.doodle", TestSubscriber.events.first.name
end
def test_attaches_only_one_subscriber
ActiveSupport::Notifications.instrument("open_party.doodle")
assert_equal 1, TestSubscriber.events.size
end
def test_does_not_attach_private_methods
ActiveSupport::Notifications.instrument("private_party.doodle")
assert_nil TestSubscriber.event
assert_equal TestSubscriber.events, []
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册