events 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/events.rb +22 -1
  2. data/test/event_emitter_test.rb +62 -3
  3. metadata +3 -3
data/lib/events.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  module Events # :nodoc:
2
+ UncaughtError = Class.new(StandardError)
2
3
 
3
4
  # The Events::Emitter mixin provides a clone of the Node.js EventEmitter API
4
5
  # for Ruby.
@@ -23,6 +24,10 @@ module Events # :nodoc:
23
24
  # Outputs "added new listener #<Proc:0x0000000000000000@example.rb:12> for
24
25
  # event connection".
25
26
  #
27
+ # When an EventEmitter experiences an error, the typical action is to emit an
28
+ # :error event. Error events are special -- if there is no handler for them
29
+ # they raise an Events::UncaughtError exception.
30
+ #
26
31
  module Emitter
27
32
 
28
33
  # :call-seq: emitter.listeners(event) -> array
@@ -39,7 +44,14 @@ module Events # :nodoc:
39
44
  # Execute each of the listeners in order with the supplied arguments.
40
45
  #
41
46
  def emit(event, *args)
42
- listeners(event).each do |listener|
47
+ listeners = listeners(event).dup
48
+
49
+ if event == :error && listeners.empty?
50
+ raise args.first if args.first.kind_of?(Exception)
51
+ raise Events::UncaughtError.new("Uncaught, unspecified 'error' event.")
52
+ end
53
+
54
+ listeners.each do |listener|
43
55
  listener.call(*args)
44
56
  end.any?
45
57
  end
@@ -65,6 +77,15 @@ module Events # :nodoc:
65
77
  listeners(event).delete(proc)
66
78
  self
67
79
  end
80
+
81
+ # :call-seq: emitter.remove_all_listeners(event) -> emitter
82
+ #
83
+ # Removes all listeners from the listener array for the specified event.
84
+ #
85
+ def remove_all_listeners(event)
86
+ listeners(event).clear
87
+ self
88
+ end
68
89
  end
69
90
 
70
91
  # The Events::EventEmitter class provides a clone of the Node.js EventEmitter
@@ -40,6 +40,7 @@ class TestEventEmitter < Test::Unit::TestCase
40
40
  @callback1 = Proc.new do
41
41
  callbacks_called.push(:callback1)
42
42
  e.add_listener(:foo, &@callback2)
43
+ e.add_listener(:foo, &@callback3)
43
44
  e.remove_listener(:foo, @callback1)
44
45
  end
45
46
 
@@ -48,20 +49,78 @@ class TestEventEmitter < Test::Unit::TestCase
48
49
  e.remove_listener(:foo, @callback2)
49
50
  end
50
51
 
52
+ @callback3 = Proc.new do
53
+ callbacks_called.push(:callback3)
54
+ e.remove_listener(:foo, @callback3)
55
+ end
56
+
51
57
  e.add_listener(:foo, &@callback1)
52
58
  assert_equal(1, e.listeners(:foo).length)
53
59
 
54
60
  e.emit(:foo)
55
- assert_equal(1, e.listeners(:foo).length)
61
+ assert_equal(2, e.listeners(:foo).length)
56
62
  assert_equal([:callback1], callbacks_called)
57
63
 
58
64
  e.emit(:foo)
59
65
  assert_equal(0, e.listeners(:foo).length)
60
- assert_equal([:callback1, :callback2], callbacks_called)
66
+ assert_equal([:callback1, :callback2, :callback3], callbacks_called)
67
+
68
+ e.emit(:foo)
69
+ assert_equal(0, e.listeners(:foo).length)
70
+ assert_equal([:callback1, :callback2, :callback3], callbacks_called)
71
+
72
+ e.add_listener(:foo, &@callback1)
73
+ e.add_listener(:foo, &@callback2)
74
+ assert_equal(2, e.listeners(:foo).length)
75
+ e.remove_all_listeners(:foo)
76
+ assert_equal(0, e.listeners(:foo).length)
77
+
78
+ # Verify that removing callbacks while in emit allows emits to propagate to
79
+ # all listeners
80
+ callbacks_called = []
61
81
 
82
+ e.add_listener(:foo, &@callback2)
83
+ e.add_listener(:foo, &@callback3)
84
+ assert_equal(2, e.listeners(:foo).length)
62
85
  e.emit(:foo)
86
+ assert_equal([:callback2, :callback3], callbacks_called)
63
87
  assert_equal(0, e.listeners(:foo).length)
64
- assert_equal([:callback1, :callback2], callbacks_called)
88
+ end
89
+
90
+ # /test/simple/test-event-emitter-remove-listeners.js
91
+ def test_event_emitter_remove_listeners
92
+ count = 0
93
+
94
+ listener1 = Proc.new do
95
+ puts("listener1")
96
+ count +=1
97
+ end
98
+
99
+ listener2 = Proc.new do
100
+ puts("listener2")
101
+ count +=1
102
+ end
103
+
104
+ listener3 = Proc.new do
105
+ puts("listener3")
106
+ count +=1
107
+ end
108
+
109
+ e1 = Events::EventEmitter.new
110
+ e1.add_listener(:hello, &listener1)
111
+ e1.remove_listener(:hello, listener1)
112
+ assert_equal([], e1.listeners(:hello))
113
+
114
+ e2 = Events::EventEmitter.new
115
+ e2.add_listener(:hello, &listener1)
116
+ e2.remove_listener(:hello, listener2)
117
+ assert_equal([listener1], e2.listeners(:hello))
118
+
119
+ e3 = Events::EventEmitter.new
120
+ e3.add_listener(:hello, &listener1)
121
+ e3.add_listener(:hello, &listener2)
122
+ e3.remove_listener(:hello, listener1)
123
+ assert_equal([listener2], e3.listeners(:hello))
65
124
  end
66
125
 
67
126
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 9
8
- - 0
9
- version: 0.9.0
8
+ - 1
9
+ version: 0.9.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Matthew Sadler
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-04-07 00:00:00 +01:00
17
+ date: 2010-05-15 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies: []
20
20