events 0.9.2 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,19 @@
1
1
  module Events # :nodoc:
2
2
  UncaughtError = Class.new(StandardError)
3
3
 
4
+ class OnceProxy # :nodoc:
5
+ attr_reader :event, :caller, :delegate
6
+
7
+ def initialize(event, caller, delegate)
8
+ @event, @caller, @delegate = event, caller, delegate
9
+ end
10
+
11
+ def call(*args)
12
+ caller.remove_listener(event, self)
13
+ delegate.call(*args)
14
+ end
15
+ end
16
+
4
17
  # The Events::Emitter mixin provides a clone of the Node.js EventEmitter API
5
18
  # for Ruby.
6
19
  #
@@ -56,20 +69,38 @@ module Events # :nodoc:
56
69
  end.any?
57
70
  end
58
71
 
59
- # :call-seq: emitter.on(event, &block) -> emitter
72
+ # :call-seq: emitter.on(event) {|args...| block} -> emitter
73
+ # emitter.on(event, proc) -> emitter
60
74
  #
61
75
  # Adds a listener to the end of the listeners array for the specified event.
62
76
  # server.on(:connection) do |socket|
63
77
  # puts "someone connected!"
64
78
  # end
65
79
  #
66
- def add_listener(event, &block)
67
- emit(:new_listener, event, block)
68
- listeners(event).push(block)
80
+ # Rather than a block, can take a second argument of a Proc (or any object
81
+ # with a #call method).
82
+ #
83
+ def add_listener(event, proc=nil, &block)
84
+ emit(:new_listener, event, proc || block)
85
+ listeners(event).push(proc || block)
69
86
  self
70
87
  end
71
88
  alias on add_listener
72
89
 
90
+
91
+ # :call-seq: emitter.once(event) {|args...| block} -> emitter
92
+ # emitter.once(event, proc) -> emitter
93
+ #
94
+ # Adds a one time listener for the event. The listener is invoked only the
95
+ # first time the event is fired, after which it is removed.
96
+ # server.once(:connection) do |socket|
97
+ # puts "Ah, we have our first user!"
98
+ # end
99
+ #
100
+ def once(event, proc=nil, &block)
101
+ add_listener(event, OnceProxy.new(event, self, proc || block))
102
+ end
103
+
73
104
  # :call-seq: emitter.remove_listener(event, proc) -> emitter
74
105
  #
75
106
  # Remove a listener from the listener array for the specified event.
@@ -37,6 +37,14 @@ Adds a listener to the end of the listeners array for the specified event.
37
37
  puts "someone connected!"
38
38
  end
39
39
 
40
+ emitter.once(event, &block)
41
+
42
+ Adds a one time listener for the event. The listener is invoked only the
43
+ first time the event is fired, after which it is removed.
44
+ server.once(:connection) do |socket|
45
+ puts "Ah, we have our first user!"
46
+ end
47
+
40
48
  emitter.remove_listener(event, proc)
41
49
 
42
50
  Remove a listener from the listener array for the specified event.
@@ -123,4 +123,44 @@ class TestEventEmitter < Test::Unit::TestCase
123
123
  assert_equal([listener2], e3.listeners(:hello))
124
124
  end
125
125
 
126
+ # /test/simple/test-event-emitter-once.js
127
+ def test_event_emitter_once
128
+ e = Events::EventEmitter.new
129
+ times_hello_emited = 0
130
+
131
+ e.once(:hello) do |a, b|
132
+ times_hello_emited += 1
133
+ end
134
+
135
+ e.emit(:hello, "a", "b")
136
+ e.emit(:hello, "a", "b")
137
+ e.emit(:hello, "a", "b")
138
+ e.emit(:hello, "a", "b")
139
+
140
+ assert_equal(1, times_hello_emited)
141
+ end
142
+
143
+ # /test/simple/test-event-emitter-num-args.js
144
+ def test_event_emitter_num_args
145
+ e = Events::EventEmitter.new
146
+ num_args_emited = []
147
+
148
+ e.on(:num_args) do |*args|
149
+ num_args = args.length
150
+ puts "num_args: #{num_args}"
151
+ num_args_emited.push(num_args)
152
+ end
153
+
154
+ puts "start"
155
+
156
+ e.emit(:num_args)
157
+ e.emit(:num_args, nil)
158
+ e.emit(:num_args, nil, nil)
159
+ e.emit(:num_args, nil, nil, nil)
160
+ e.emit(:num_args, nil, nil, nil, nil)
161
+ e.emit(:num_args, nil, nil, nil, nil, nil)
162
+
163
+ assert_equal([0, 1, 2, 3, 4, 5], num_args_emited)
164
+ end
165
+
126
166
  end
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: events
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ hash: 61
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 9
9
+ - 3
10
+ version: 0.9.3
5
11
  platform: ruby
6
12
  authors:
7
13
  - Matthew Sadler
@@ -9,7 +15,7 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2010-07-05 00:00:00 +01:00
18
+ date: 2011-01-30 00:00:00 +00:00
13
19
  default_executable:
14
20
  dependencies: []
15
21
 
@@ -36,21 +42,27 @@ rdoc_options:
36
42
  require_paths:
37
43
  - lib
38
44
  required_ruby_version: !ruby/object:Gem::Requirement
45
+ none: false
39
46
  requirements:
40
47
  - - ">="
41
48
  - !ruby/object:Gem::Version
49
+ hash: 3
50
+ segments:
51
+ - 0
42
52
  version: "0"
43
- version:
44
53
  required_rubygems_version: !ruby/object:Gem::Requirement
54
+ none: false
45
55
  requirements:
46
56
  - - ">="
47
57
  - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
60
+ - 0
48
61
  version: "0"
49
- version:
50
62
  requirements: []
51
63
 
52
64
  rubyforge_project:
53
- rubygems_version: 1.3.5
65
+ rubygems_version: 1.3.7
54
66
  signing_key:
55
67
  specification_version: 3
56
68
  summary: Clone of the node.js EventEmitter api for Ruby