event_emitter-with_instance_listener 0.2.5
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.
- checksums.yaml +7 -0
- data/.gitignore +24 -0
- data/.travis.yml +8 -0
- data/Gemfile +4 -0
- data/History.txt +58 -0
- data/LICENSE.txt +22 -0
- data/README.md +134 -0
- data/Rakefile +14 -0
- data/benchmark/benchmark.rb +57 -0
- data/benchmark/benchmark_helper.rb +22 -0
- data/event_emitter.gemspec +21 -0
- data/lib/event_emitter.rb +5 -0
- data/lib/event_emitter/emitter.rb +125 -0
- data/lib/event_emitter/version.rb +3 -0
- data/samples/class-method.rb +17 -0
- data/samples/instance-specific-method.rb +29 -0
- data/samples/sample.rb +33 -0
- data/samples/timer.rb +31 -0
- data/test/test_catch_all_events.rb +61 -0
- data/test/test_class_method.rb +113 -0
- data/test/test_event_emitter.rb +143 -0
- data/test/test_helper.rb +6 -0
- data/test/test_instance_on.rb +97 -0
- data/test/test_singular_method.rb +107 -0
- metadata +116 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: b398037ff48a7fddc56df53a6f83d210dab46e62
|
|
4
|
+
data.tar.gz: cd44e4a578af3f2364b75592abacb3971cf601d3
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 7991572c76a22cc25c6a90780255d23f2354e42c7524984d91f5557bdf8608d46ed510ad8ae805b450282a61d0784744866839a364454f4858b91e26ab4664c3
|
|
7
|
+
data.tar.gz: 6a6c7dab36d8206bfcaeaaca5476f8e033f140778504fb7aad4cb18a706bf6b1ff5f83f4888f084694ee701eb89d2c790faa6002be0000fc9f4e94de90f94ebc
|
data/.gitignore
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
.DS_Store
|
|
2
|
+
*.tmp
|
|
3
|
+
*~
|
|
4
|
+
*#*
|
|
5
|
+
vendor
|
|
6
|
+
.sass-cache
|
|
7
|
+
.bundle
|
|
8
|
+
config.yml
|
|
9
|
+
*.gem
|
|
10
|
+
*.rbc
|
|
11
|
+
.config
|
|
12
|
+
.yardoc
|
|
13
|
+
InstalledFiles
|
|
14
|
+
_yardoc
|
|
15
|
+
coverage
|
|
16
|
+
doc/
|
|
17
|
+
lib/bundler/man
|
|
18
|
+
pkg
|
|
19
|
+
rdoc
|
|
20
|
+
spec/reports
|
|
21
|
+
test/tmp
|
|
22
|
+
test/version_tmp
|
|
23
|
+
tmp
|
|
24
|
+
.ruby-version
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/History.txt
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
=== 0.2.5 2013-03-31
|
|
2
|
+
|
|
3
|
+
* add benchmark
|
|
4
|
+
|
|
5
|
+
=== 0.2.4 2013-03-21
|
|
6
|
+
|
|
7
|
+
* bugfix multiple once error
|
|
8
|
+
|
|
9
|
+
=== 0.2.3 2013-03-05
|
|
10
|
+
|
|
11
|
+
* catch all events with "EventEmitter#on :*"
|
|
12
|
+
|
|
13
|
+
=== 0.2.2 2013-01-04
|
|
14
|
+
|
|
15
|
+
* bugfix
|
|
16
|
+
|
|
17
|
+
=== 0.2.1 2013-01-04
|
|
18
|
+
|
|
19
|
+
* use bundler gem template
|
|
20
|
+
|
|
21
|
+
=== 0.2.0 2012-12-16
|
|
22
|
+
|
|
23
|
+
* remove_listener
|
|
24
|
+
* fix method-name duplication
|
|
25
|
+
|
|
26
|
+
=== 0.1.0 2012-11-15
|
|
27
|
+
|
|
28
|
+
* support on/emit multiple arguments
|
|
29
|
+
|
|
30
|
+
=== 0.0.7 2012-11-09
|
|
31
|
+
|
|
32
|
+
* on/emit without any args
|
|
33
|
+
* add tests
|
|
34
|
+
|
|
35
|
+
=== 0.0.6 2012-11-09
|
|
36
|
+
|
|
37
|
+
* add sample
|
|
38
|
+
|
|
39
|
+
=== 0.0.5 2012-11-08
|
|
40
|
+
|
|
41
|
+
* add github page link
|
|
42
|
+
|
|
43
|
+
=== 0.0.4 2012-11-08
|
|
44
|
+
|
|
45
|
+
* instance-specific method with EventEmitter.apply(instance)
|
|
46
|
+
|
|
47
|
+
=== 0.0.3 2012-11-08
|
|
48
|
+
|
|
49
|
+
* call listener with Object#instance_exec
|
|
50
|
+
|
|
51
|
+
=== 0.0.2 2012-11-07
|
|
52
|
+
|
|
53
|
+
* EventEmitter#once : call listener only first time
|
|
54
|
+
* EventEmitter#add_listener, remove_listener
|
|
55
|
+
|
|
56
|
+
=== 0.0.1 2012-11-07
|
|
57
|
+
|
|
58
|
+
* implement "on" and "emit"
|
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Copyright (c) 2012 Sho Hashimoto
|
|
2
|
+
|
|
3
|
+
MIT License
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
event_emitter
|
|
2
|
+
=============
|
|
3
|
+
|
|
4
|
+
* Ruby port of EventEmitter from Node.js
|
|
5
|
+
* http://shokai.github.com/event_emitter
|
|
6
|
+
|
|
7
|
+
[](https://travis-ci.org/shokai/event_emitter)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
Install
|
|
11
|
+
-------
|
|
12
|
+
|
|
13
|
+
% gem install event_emitter
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
Requirements
|
|
17
|
+
------------
|
|
18
|
+
|
|
19
|
+
testing on
|
|
20
|
+
|
|
21
|
+
* Ruby 1.8.7
|
|
22
|
+
* Ruby 1.9.2
|
|
23
|
+
* Ruby 2.0.0
|
|
24
|
+
* Ruby 2.1.0
|
|
25
|
+
* JRuby
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
Synopsys
|
|
29
|
+
--------
|
|
30
|
+
|
|
31
|
+
load rubygem
|
|
32
|
+
```ruby
|
|
33
|
+
require "rubygems"
|
|
34
|
+
require "event_emitter"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
include
|
|
38
|
+
```ruby
|
|
39
|
+
class User
|
|
40
|
+
include EventEmitter
|
|
41
|
+
attr_accessor :name
|
|
42
|
+
end
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
register event listener
|
|
46
|
+
```ruby
|
|
47
|
+
user = User.new
|
|
48
|
+
user.name = "shokai"
|
|
49
|
+
user.on :go do |data|
|
|
50
|
+
puts "#{name} go to #{data[:place]}"
|
|
51
|
+
end
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
call event
|
|
55
|
+
```ruby
|
|
56
|
+
user.emit :go, {:place => "mountain"}
|
|
57
|
+
# => "shokai go to mountain"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
regist event using "once"
|
|
61
|
+
```ruby
|
|
62
|
+
user.once :eat do |what, where|
|
|
63
|
+
puts "#{name} -> eat #{what} at #{where}"
|
|
64
|
+
end
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
call
|
|
68
|
+
```ruby
|
|
69
|
+
user.emit :eat, "BEEF", "zanmai" # => "shokai -> eat BEEF at zanmai"
|
|
70
|
+
user.emit :eat, "Ramen", "marutomo" # => do not call. call only first time.
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
apply as instance-specific method
|
|
74
|
+
```ruby
|
|
75
|
+
class Foo
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
foo = Foo.new
|
|
79
|
+
EventEmitter.apply foo
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
remove event listener
|
|
83
|
+
```ruby
|
|
84
|
+
user.remove_listener :go
|
|
85
|
+
user.remove_listener event_id
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
catch all events
|
|
89
|
+
```ruby
|
|
90
|
+
user.on :* do |event_name, args|
|
|
91
|
+
puts event_name + " called"
|
|
92
|
+
p args
|
|
93
|
+
end
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
listen to all instances of a class
|
|
97
|
+
```ruby
|
|
98
|
+
User.instance_on :eat do |what, where|
|
|
99
|
+
puts "#{name} -> eat #{what} at #{where}"
|
|
100
|
+
end
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
call
|
|
104
|
+
```ruby
|
|
105
|
+
user = User.new
|
|
106
|
+
user.name = "shokai"
|
|
107
|
+
user.emit :eat, "BEEF", "zanmai" # => "shokai -> eat BEEF at zanmai"
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
see samples https://github.com/shokai/event_emitter/tree/master/samples
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
Test
|
|
115
|
+
----
|
|
116
|
+
|
|
117
|
+
% gem install bundler
|
|
118
|
+
% bundle install
|
|
119
|
+
% rake test
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
Benchmark
|
|
123
|
+
---------
|
|
124
|
+
|
|
125
|
+
% rake benchmark
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
Contributing
|
|
129
|
+
------------
|
|
130
|
+
1. Fork it
|
|
131
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
132
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
133
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
134
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require "bundler/gem_tasks"
|
|
2
|
+
require "rake/testtask"
|
|
3
|
+
|
|
4
|
+
Rake::TestTask.new do |t|
|
|
5
|
+
t.pattern = "test/test_*.rb"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
task :default => :test
|
|
9
|
+
|
|
10
|
+
desc "run eventemitter benchmark"
|
|
11
|
+
task :benchmark do
|
|
12
|
+
require File.expand_path 'benchmark/benchmark', File.dirname(__FILE__)
|
|
13
|
+
Bench.run
|
|
14
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
require File.expand_path 'benchmark_helper', File.dirname(__FILE__)
|
|
3
|
+
|
|
4
|
+
class Bench
|
|
5
|
+
|
|
6
|
+
class Foo
|
|
7
|
+
include EventEmitter
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def bench_1on_100Kemit
|
|
11
|
+
foo = Foo.new
|
|
12
|
+
count = 0
|
|
13
|
+
foo.on :bar do |num|
|
|
14
|
+
count += num
|
|
15
|
+
end
|
|
16
|
+
100000.times do
|
|
17
|
+
foo.emit :bar, 1
|
|
18
|
+
end
|
|
19
|
+
raise Error, "test code error" unless count == 100000
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def bench_1Kon_1Kemit
|
|
23
|
+
foo = Foo.new
|
|
24
|
+
count = 0
|
|
25
|
+
(1000-1).times do
|
|
26
|
+
foo.on :bar do
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
foo.on :bar do |num|
|
|
30
|
+
count += num
|
|
31
|
+
end
|
|
32
|
+
1000.times do
|
|
33
|
+
foo.emit :bar, 1
|
|
34
|
+
end
|
|
35
|
+
raise Error, "test code error" unless count == 1000
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def bench_100Kon_1emit
|
|
39
|
+
foo = Foo.new
|
|
40
|
+
count = 0
|
|
41
|
+
1.upto(100000-1).each do |i|
|
|
42
|
+
foo.on "bar_#{i}" do
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
foo.on :bar do |num|
|
|
46
|
+
count += num
|
|
47
|
+
end
|
|
48
|
+
foo.emit :bar, 1
|
|
49
|
+
raise Error, "test code error" unless count == 1
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
if __FILE__ == $0
|
|
56
|
+
Bench.run
|
|
57
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
$:.unshift File.expand_path '../lib', File.dirname(__FILE__)
|
|
2
|
+
require 'event_emitter'
|
|
3
|
+
require 'benchmark'
|
|
4
|
+
|
|
5
|
+
class Bench
|
|
6
|
+
|
|
7
|
+
class Error < StandardError
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.run
|
|
11
|
+
puts "ruby #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
|
|
12
|
+
bench = self.new
|
|
13
|
+
Benchmark.bm do |x|
|
|
14
|
+
bench.methods.select{|i| i.to_s =~ /^bench_(.+)$/}.sort.each do |m|
|
|
15
|
+
x.report m.to_s.scan(/^bench_(.+)$/)[0][0] do
|
|
16
|
+
bench.__send__ m
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
|
+
require 'event_emitter/version'
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |gem|
|
|
6
|
+
gem.name = "event_emitter-with_instance_listener"
|
|
7
|
+
gem.version = EventEmitter::VERSION
|
|
8
|
+
gem.authors = ["Sho Hashimoto", "Trey Grffith"]
|
|
9
|
+
gem.email = ["hashimoto@shokai.org", "trey.griffith@gmail.com"]
|
|
10
|
+
gem.description = %q{Ruby port of EventEmitter from Node.js}
|
|
11
|
+
gem.summary = gem.description
|
|
12
|
+
|
|
13
|
+
gem.files = `git ls-files`.split($/).reject{|i| i=="Gemfile.lock" }
|
|
14
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
|
15
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
|
16
|
+
gem.require_paths = ["lib"]
|
|
17
|
+
|
|
18
|
+
gem.add_development_dependency "minitest"
|
|
19
|
+
gem.add_development_dependency "rake"
|
|
20
|
+
gem.add_development_dependency "bundler", "~> 1.3"
|
|
21
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
module EventEmitter
|
|
2
|
+
def self.included(klass)
|
|
3
|
+
klass.extend ClassMethods
|
|
4
|
+
klass.__send__ :include, InstanceMethods
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def self.apply(object)
|
|
8
|
+
object.extend InstanceMethods
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
module InstanceMethods
|
|
12
|
+
def __events
|
|
13
|
+
@__events ||= []
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def add_listener(type, params={}, &block)
|
|
17
|
+
raise ArgumentError, 'listener block not given' unless block_given?
|
|
18
|
+
id = __events.empty? ? 0 : __events.last[:id]+1
|
|
19
|
+
__events << {
|
|
20
|
+
:type => type.to_sym,
|
|
21
|
+
:listener => block,
|
|
22
|
+
:params => params,
|
|
23
|
+
:id => id
|
|
24
|
+
}
|
|
25
|
+
id
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
alias :on :add_listener
|
|
29
|
+
|
|
30
|
+
def remove_listener(id_or_type)
|
|
31
|
+
if id_or_type.class == Fixnum
|
|
32
|
+
__events.delete_if do |e|
|
|
33
|
+
e[:id] == id_or_type
|
|
34
|
+
end
|
|
35
|
+
elsif [String, Symbol].include? id_or_type.class
|
|
36
|
+
__events.delete_if do |e|
|
|
37
|
+
e[:type] == id_or_type.to_sym
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def emit(type, *data)
|
|
43
|
+
type = type.to_sym
|
|
44
|
+
__events.each do |e|
|
|
45
|
+
case e[:type]
|
|
46
|
+
when type
|
|
47
|
+
listener = e[:listener]
|
|
48
|
+
e[:type] = nil if e[:params][:once]
|
|
49
|
+
instance_exec(*data, &listener)
|
|
50
|
+
when :*
|
|
51
|
+
listener = e[:listener]
|
|
52
|
+
e[:type] = nil if e[:params][:once]
|
|
53
|
+
instance_exec(type, *data, &listener)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
__events.each do |e|
|
|
57
|
+
remove_listener e[:id] unless e[:type]
|
|
58
|
+
end
|
|
59
|
+
self.class.instance_emit(self, type, *data) if self.class.respond_to? :instance_emit
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def once(type, &block)
|
|
63
|
+
add_listener type, {:once => true}, &block
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
module ClassMethods
|
|
69
|
+
include InstanceMethods
|
|
70
|
+
|
|
71
|
+
def __instance_events
|
|
72
|
+
@__instance_events ||= []
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def add_instance_listener(type, params={}, &block)
|
|
76
|
+
raise ArgumentError, 'listener block not given' unless block_given?
|
|
77
|
+
id = __instance_events.empty? ? 0 : __instance_events.last[:id]+1
|
|
78
|
+
__instance_events << {
|
|
79
|
+
:type => type.to_sym,
|
|
80
|
+
:listener => block,
|
|
81
|
+
:params => params,
|
|
82
|
+
:id => id
|
|
83
|
+
}
|
|
84
|
+
id
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
alias :instance_on :add_instance_listener
|
|
88
|
+
|
|
89
|
+
def remove_listener_from_instance(id_or_type)
|
|
90
|
+
if id_or_type.class == Fixnum
|
|
91
|
+
__instance_events.delete_if do |e|
|
|
92
|
+
e[:id] == id_or_type
|
|
93
|
+
end
|
|
94
|
+
elsif [String, Symbol].include? id_or_type.class
|
|
95
|
+
__instance_events.delete_if do |e|
|
|
96
|
+
e[:type] == id_or_type.to_sym
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def instance_emit(instance, type, *data)
|
|
102
|
+
type = type.to_sym
|
|
103
|
+
__instance_events.each do |e|
|
|
104
|
+
case e[:type]
|
|
105
|
+
when type
|
|
106
|
+
listener = e[:listener]
|
|
107
|
+
e[:type] = nil if e[:params][:once]
|
|
108
|
+
instance.instance_exec(*data, &listener)
|
|
109
|
+
when :*
|
|
110
|
+
listener = e[:listener]
|
|
111
|
+
e[:type] = nil if e[:params][:once]
|
|
112
|
+
instance.instance_exec(type, *data, &listener)
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
__instance_events.each do |e|
|
|
116
|
+
remove_listener_from_instance e[:id] unless e[:type]
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def instance_once(type, &block)
|
|
121
|
+
add_instance_listener type, {:once => true}, &block
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
$:.unshift File.expand_path '../lib', File.dirname(__FILE__)
|
|
3
|
+
require 'event_emitter'
|
|
4
|
+
|
|
5
|
+
class DB
|
|
6
|
+
def self.connect
|
|
7
|
+
self.emit :connect, :connected
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
EventEmitter.apply DB
|
|
12
|
+
|
|
13
|
+
DB.on :connect do |status|
|
|
14
|
+
puts status
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
DB.connect
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
$:.unshift File.expand_path '../lib', File.dirname(__FILE__)
|
|
3
|
+
require 'event_emitter'
|
|
4
|
+
|
|
5
|
+
class User
|
|
6
|
+
attr_accessor :name
|
|
7
|
+
def initialize(name)
|
|
8
|
+
@name = name
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
shokai = User.new "shokai"
|
|
13
|
+
ymrl = User.new "ymrl"
|
|
14
|
+
EventEmitter.apply shokai ## set instance-specific method
|
|
15
|
+
|
|
16
|
+
shokai.on :go do |data|
|
|
17
|
+
puts "#{name} go to #{data[:place]}"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
shokai.emit :go, :place => "chiba city"
|
|
21
|
+
|
|
22
|
+
## raise undefined-method error
|
|
23
|
+
begin
|
|
24
|
+
ymrl.on :go do |data|
|
|
25
|
+
puts "#{name} go to #{data[:place]}"
|
|
26
|
+
end
|
|
27
|
+
rescue => e
|
|
28
|
+
STDERR.puts e
|
|
29
|
+
end
|
data/samples/sample.rb
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
$:.unshift File.expand_path '../lib', File.dirname(__FILE__)
|
|
3
|
+
require 'event_emitter'
|
|
4
|
+
|
|
5
|
+
class User
|
|
6
|
+
include EventEmitter
|
|
7
|
+
attr_accessor :name
|
|
8
|
+
|
|
9
|
+
def initialize(name)
|
|
10
|
+
@name = name
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
shokai = User.new 'shokai'
|
|
15
|
+
ymrl = User.new 'ymrl'
|
|
16
|
+
|
|
17
|
+
shokai.on :go do |data|
|
|
18
|
+
puts "#{name} go to #{data[:place]}"
|
|
19
|
+
end
|
|
20
|
+
ymrl.on :go do |data|
|
|
21
|
+
puts "#{name} go to #{data[:place]}"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
shokai.emit :go, {:place => 'mountain'}
|
|
25
|
+
ymrl.emit :go, :place => 'cyberspace'
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
shokai.once :eat do |what, where|
|
|
29
|
+
puts "#{name} -> #{what} at #{where}"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
shokai.emit :eat, 'BEEF', 'zanmai'
|
|
33
|
+
shokai.emit :eat, 'Ramen', 'marutomo' # do not call. call only first time if regist with "once"
|
data/samples/timer.rb
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
$:.unshift File.expand_path '../lib', File.dirname(__FILE__)
|
|
3
|
+
require 'event_emitter'
|
|
4
|
+
|
|
5
|
+
class Timer
|
|
6
|
+
include EventEmitter
|
|
7
|
+
|
|
8
|
+
def start(sec, count)
|
|
9
|
+
count.times do
|
|
10
|
+
sleep sec
|
|
11
|
+
emit :tick
|
|
12
|
+
end
|
|
13
|
+
emit :end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
timer = Timer.new
|
|
18
|
+
|
|
19
|
+
timer.on :tick do
|
|
20
|
+
puts Time.now
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
timer.once :tick do
|
|
24
|
+
puts "timer start"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
timer.on :end do
|
|
28
|
+
puts "timer end"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
timer.start 1, 5
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require File.expand_path 'test_helper', File.dirname(__FILE__)
|
|
2
|
+
|
|
3
|
+
class TestCatchAllEvents < MiniTest::Test
|
|
4
|
+
|
|
5
|
+
class Foo
|
|
6
|
+
include EventEmitter
|
|
7
|
+
attr_accessor :created_at
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def setup
|
|
11
|
+
@foo = Foo.new
|
|
12
|
+
@foo.created_at = @now = Time.now
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_catch_all_emits
|
|
16
|
+
created_at = nil
|
|
17
|
+
created_at_ = nil
|
|
18
|
+
called_event = nil
|
|
19
|
+
@foo.on :* do |event|
|
|
20
|
+
called_event = event
|
|
21
|
+
created_at = self.created_at
|
|
22
|
+
end
|
|
23
|
+
@foo.on :bar do
|
|
24
|
+
created_at_ = self.created_at
|
|
25
|
+
end
|
|
26
|
+
@foo.emit :bar
|
|
27
|
+
|
|
28
|
+
assert created_at == @now
|
|
29
|
+
assert called_event == :bar
|
|
30
|
+
assert created_at_ == @now
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_catch_all_emits_with_args
|
|
34
|
+
arg1_ = nil
|
|
35
|
+
arg2_ = nil
|
|
36
|
+
called_event = nil
|
|
37
|
+
@foo.on :* do |event, arg1, arg2|
|
|
38
|
+
called_event = event
|
|
39
|
+
arg1_ = arg1
|
|
40
|
+
arg2_ = arg2
|
|
41
|
+
end
|
|
42
|
+
@foo.emit :bar, 'kazusuke', 'zanmai'
|
|
43
|
+
|
|
44
|
+
assert called_event == :bar
|
|
45
|
+
assert arg1_ == 'kazusuke'
|
|
46
|
+
assert arg2_ == 'zanmai'
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def test_once
|
|
50
|
+
total = 0
|
|
51
|
+
@foo.once :* do |event, data|
|
|
52
|
+
total += data[:num] if event == :add
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
@foo.emit :add, :num => 10
|
|
56
|
+
assert total == 10, 'first call'
|
|
57
|
+
@foo.emit :add, :num => 5
|
|
58
|
+
assert total == 10, 'call listener only first time'
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
require File.expand_path 'test_helper', File.dirname(__FILE__)
|
|
2
|
+
|
|
3
|
+
class TestClassMethod < MiniTest::Test
|
|
4
|
+
|
|
5
|
+
class Foo
|
|
6
|
+
def self.created_at
|
|
7
|
+
@@created_at
|
|
8
|
+
end
|
|
9
|
+
def self.created_at=(time)
|
|
10
|
+
@@created_at = time
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def setup
|
|
15
|
+
Foo.created_at = @now = Time.now
|
|
16
|
+
EventEmitter.apply Foo
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_simple
|
|
20
|
+
created_at = nil
|
|
21
|
+
Foo.on :bar do
|
|
22
|
+
created_at = self.created_at
|
|
23
|
+
end
|
|
24
|
+
Foo.emit :bar
|
|
25
|
+
|
|
26
|
+
assert created_at == @now
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def test_on_emit
|
|
30
|
+
result = nil
|
|
31
|
+
created_at = nil
|
|
32
|
+
Foo.on :chat do |data|
|
|
33
|
+
result = data
|
|
34
|
+
created_at = self.created_at
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
Foo.emit :chat, :user => 'shokai', :message => 'hello world'
|
|
38
|
+
|
|
39
|
+
assert result[:user] == 'shokai'
|
|
40
|
+
assert result[:message] == 'hello world'
|
|
41
|
+
assert created_at == @now, 'instance method'
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def test_on_emit_multiargs
|
|
45
|
+
_user = nil
|
|
46
|
+
_message = nil
|
|
47
|
+
_session = nil
|
|
48
|
+
created_at = nil
|
|
49
|
+
Foo.on :chat2 do |user, message, session|
|
|
50
|
+
_user = user
|
|
51
|
+
_message = message
|
|
52
|
+
_session = session
|
|
53
|
+
created_at = self.created_at
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
sid = Time.now.to_i
|
|
57
|
+
Foo.emit :chat2, 'shokai', 'hello world', sid
|
|
58
|
+
|
|
59
|
+
assert _user == 'shokai'
|
|
60
|
+
assert _message == 'hello world'
|
|
61
|
+
assert _session == sid
|
|
62
|
+
assert created_at == @now, 'instance method'
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_add_listener
|
|
66
|
+
result = nil
|
|
67
|
+
created_at = nil
|
|
68
|
+
Foo.add_listener :chat do |data|
|
|
69
|
+
result = data
|
|
70
|
+
created_at = self.created_at
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
Foo.emit :chat, :user => 'shokai', :message => 'hello world'
|
|
74
|
+
|
|
75
|
+
assert result[:user] == 'shokai'
|
|
76
|
+
assert result[:message] == 'hello world'
|
|
77
|
+
assert created_at == @now, 'instance method'
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def test_remove_listener
|
|
81
|
+
size = Foo.__events.size
|
|
82
|
+
|
|
83
|
+
Foo.on :foo do |data|
|
|
84
|
+
puts "bar #{data}"
|
|
85
|
+
end
|
|
86
|
+
Foo.on :foo do |data|
|
|
87
|
+
puts "barbar: #{data}"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
id = Foo.on :baz do |data|
|
|
91
|
+
p data
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
assert Foo.__events.size == size+3, 'check registerd listener count'
|
|
95
|
+
Foo.remove_listener id
|
|
96
|
+
assert Foo.__events.size == size+2, 'remove listener by id'
|
|
97
|
+
|
|
98
|
+
Foo.remove_listener :foo
|
|
99
|
+
assert Foo.__events.size == size, 'remove all "foo" listener'
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def test_once
|
|
103
|
+
total = 0
|
|
104
|
+
Foo.once :add do |data|
|
|
105
|
+
total += data
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
Foo.emit :add, 1
|
|
109
|
+
assert total == 1, 'first call'
|
|
110
|
+
Foo.emit :add, 1
|
|
111
|
+
assert total == 1, 'call listener only first time'
|
|
112
|
+
end
|
|
113
|
+
end
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
require File.expand_path 'test_helper', File.dirname(__FILE__)
|
|
2
|
+
|
|
3
|
+
class TestEventEmitter < MiniTest::Test
|
|
4
|
+
|
|
5
|
+
class Foo
|
|
6
|
+
include EventEmitter
|
|
7
|
+
attr_accessor :created_at
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def setup
|
|
11
|
+
@foo = Foo.new
|
|
12
|
+
@foo.created_at = @now = Time.now
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_simple
|
|
16
|
+
created_at = nil
|
|
17
|
+
@foo.on :bar do
|
|
18
|
+
created_at = self.created_at
|
|
19
|
+
end
|
|
20
|
+
@foo.emit :bar
|
|
21
|
+
|
|
22
|
+
assert created_at == @now
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_string_event_name
|
|
26
|
+
created_at = nil
|
|
27
|
+
@foo.on "bar" do
|
|
28
|
+
created_at = self.created_at
|
|
29
|
+
end
|
|
30
|
+
@foo.emit :bar
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_on_emit
|
|
34
|
+
result = nil
|
|
35
|
+
created_at = nil
|
|
36
|
+
@foo.on :chat do |data|
|
|
37
|
+
result = data
|
|
38
|
+
created_at = self.created_at
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
@foo.emit :chat, :user => 'shokai', :message => 'hello world'
|
|
42
|
+
|
|
43
|
+
assert result[:user] == 'shokai'
|
|
44
|
+
assert result[:message] == 'hello world'
|
|
45
|
+
assert created_at == @now, 'instance method'
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_on_emit_multiargs
|
|
49
|
+
_user = nil
|
|
50
|
+
_message = nil
|
|
51
|
+
_session = nil
|
|
52
|
+
created_at = nil
|
|
53
|
+
@foo.on :chat do |user, message, session|
|
|
54
|
+
_user = user
|
|
55
|
+
_message = message
|
|
56
|
+
_session = session
|
|
57
|
+
created_at = self.created_at
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
sid = Time.now.to_i
|
|
61
|
+
@foo.emit :chat, 'shokai', 'hello world', sid
|
|
62
|
+
|
|
63
|
+
assert _user == 'shokai'
|
|
64
|
+
assert _message == 'hello world'
|
|
65
|
+
assert _session == sid
|
|
66
|
+
assert created_at == @now, 'instance method'
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def test_add_listener
|
|
70
|
+
result = nil
|
|
71
|
+
created_at = nil
|
|
72
|
+
@foo.add_listener :chat do |data|
|
|
73
|
+
result = data
|
|
74
|
+
created_at = self.created_at
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
@foo.emit :chat, :user => 'shokai', :message => 'hello world'
|
|
78
|
+
|
|
79
|
+
assert result[:user] == 'shokai'
|
|
80
|
+
assert result[:message] == 'hello world'
|
|
81
|
+
assert created_at == @now, 'instance method'
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def test_remove_listener
|
|
85
|
+
@foo.on :bar do |data|
|
|
86
|
+
puts "bar #{data}"
|
|
87
|
+
end
|
|
88
|
+
@foo.on :bar do |data|
|
|
89
|
+
puts "barbar: #{data}"
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
id = @foo.on :baz do |data|
|
|
93
|
+
p data
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
assert @foo.__events.size == 3, 'check registerd listener count'
|
|
97
|
+
@foo.remove_listener id
|
|
98
|
+
assert @foo.__events.size == 2, 'remove listener by id'
|
|
99
|
+
|
|
100
|
+
@foo.remove_listener :bar
|
|
101
|
+
assert @foo.__events.size == 0, 'remove all "bar" listener'
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def test_once
|
|
105
|
+
total = 0
|
|
106
|
+
@foo.once :add do |num|
|
|
107
|
+
total += num
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
@foo.emit :add, 1
|
|
111
|
+
assert total == 1, 'first call'
|
|
112
|
+
@foo.emit :add, 1
|
|
113
|
+
assert total == 1, 'call listener only first time'
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def test_multiple_once
|
|
117
|
+
total = 0
|
|
118
|
+
@foo.on :add do |num|
|
|
119
|
+
total += num
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
@foo.once :add do |num|
|
|
123
|
+
total += num
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
@foo.once :add do |num|
|
|
127
|
+
total += num
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
@foo.once :add do |num|
|
|
131
|
+
total += num
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
@foo.once :add do |num|
|
|
135
|
+
total += num
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
@foo.emit :add, 1
|
|
139
|
+
assert total == 5, 'first call'
|
|
140
|
+
@foo.emit :add, 1
|
|
141
|
+
assert total == 6, 'call'
|
|
142
|
+
end
|
|
143
|
+
end
|
data/test/test_helper.rb
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
require File.expand_path 'test_helper', File.dirname(__FILE__)
|
|
2
|
+
|
|
3
|
+
class TestInstanceOn < MiniTest::Test
|
|
4
|
+
|
|
5
|
+
class Foo
|
|
6
|
+
include EventEmitter
|
|
7
|
+
def created_at
|
|
8
|
+
@created_at
|
|
9
|
+
end
|
|
10
|
+
def created_at=(time)
|
|
11
|
+
@created_at = time
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def setup
|
|
16
|
+
@foo = Foo.new
|
|
17
|
+
@foo.created_at = @now = Time.now
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_extends
|
|
21
|
+
assert Foo.respond_to? :emit
|
|
22
|
+
assert Foo.respond_to? :instance_on
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_simple
|
|
26
|
+
created_at = nil
|
|
27
|
+
Foo.instance_on :bar do
|
|
28
|
+
created_at = self.created_at
|
|
29
|
+
end
|
|
30
|
+
@foo.emit :bar
|
|
31
|
+
|
|
32
|
+
assert created_at == @now
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_on_emit
|
|
36
|
+
result = nil
|
|
37
|
+
created_at = nil
|
|
38
|
+
Foo.instance_on :chat do |data|
|
|
39
|
+
result = data
|
|
40
|
+
created_at = self.created_at
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
@foo.emit :chat, :user => 'shokai', :message => 'hello world'
|
|
44
|
+
|
|
45
|
+
assert result[:user] == 'shokai'
|
|
46
|
+
assert result[:message] == 'hello world'
|
|
47
|
+
assert created_at == @now, 'instance method'
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_on_emit_multiargs
|
|
51
|
+
_user = nil
|
|
52
|
+
_message = nil
|
|
53
|
+
_session = nil
|
|
54
|
+
created_at = nil
|
|
55
|
+
Foo.instance_on :chat2 do |user, message, session|
|
|
56
|
+
_user = user
|
|
57
|
+
_message = message
|
|
58
|
+
_session = session
|
|
59
|
+
created_at = self.created_at
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
sid = Time.now.to_i
|
|
63
|
+
@foo.emit :chat2, 'shokai', 'hello world', sid
|
|
64
|
+
|
|
65
|
+
assert _user == 'shokai'
|
|
66
|
+
assert _message == 'hello world'
|
|
67
|
+
assert _session == sid
|
|
68
|
+
assert created_at == @now, 'instance method'
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def test_add_instance_listener
|
|
72
|
+
result = nil
|
|
73
|
+
created_at = nil
|
|
74
|
+
Foo.add_instance_listener :chat do |data|
|
|
75
|
+
result = data
|
|
76
|
+
created_at = self.created_at
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
@foo.emit :chat, :user => 'shokai', :message => 'hello world'
|
|
80
|
+
|
|
81
|
+
assert result[:user] == 'shokai'
|
|
82
|
+
assert result[:message] == 'hello world'
|
|
83
|
+
assert created_at == @now, 'instance method'
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def test_once
|
|
87
|
+
total = 0
|
|
88
|
+
Foo.instance_once :add do |data|
|
|
89
|
+
total += data
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
@foo.emit :add, 1
|
|
93
|
+
assert total == 1, 'first call'
|
|
94
|
+
@foo.emit :add, 1
|
|
95
|
+
assert total == 1, 'call listener only first time'
|
|
96
|
+
end
|
|
97
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
require File.expand_path 'test_helper', File.dirname(__FILE__)
|
|
2
|
+
|
|
3
|
+
class TestSingularMethod < MiniTest::Test
|
|
4
|
+
|
|
5
|
+
class Foo
|
|
6
|
+
attr_accessor :created_at
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def setup
|
|
10
|
+
@foo = Foo.new
|
|
11
|
+
@foo.created_at = @now = Time.now
|
|
12
|
+
EventEmitter.apply @foo
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_simple
|
|
16
|
+
created_at = nil
|
|
17
|
+
@foo.on :bar do
|
|
18
|
+
created_at = self.created_at
|
|
19
|
+
end
|
|
20
|
+
@foo.emit :bar
|
|
21
|
+
|
|
22
|
+
assert created_at == @now
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_on_emit
|
|
26
|
+
result = nil
|
|
27
|
+
created_at = nil
|
|
28
|
+
@foo.on :chat do |data|
|
|
29
|
+
result = data
|
|
30
|
+
created_at = self.created_at
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
@foo.emit :chat, :user => 'shokai', :message => 'hello world'
|
|
34
|
+
|
|
35
|
+
assert result[:user] == 'shokai'
|
|
36
|
+
assert result[:message] == 'hello world'
|
|
37
|
+
assert created_at == @now, 'instance method'
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_on_emit_multiargs
|
|
41
|
+
_user = nil
|
|
42
|
+
_message = nil
|
|
43
|
+
_session = nil
|
|
44
|
+
created_at = nil
|
|
45
|
+
@foo.on :chat do |user, message, session|
|
|
46
|
+
_user = user
|
|
47
|
+
_message = message
|
|
48
|
+
_session = session
|
|
49
|
+
created_at = self.created_at
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
sid = Time.now.to_i
|
|
53
|
+
@foo.emit :chat, 'shokai', 'hello world', sid
|
|
54
|
+
|
|
55
|
+
assert _user == 'shokai'
|
|
56
|
+
assert _message == 'hello world'
|
|
57
|
+
assert _session == sid
|
|
58
|
+
assert created_at == @now, 'instance method'
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_add_listener
|
|
62
|
+
result = nil
|
|
63
|
+
created_at = nil
|
|
64
|
+
@foo.add_listener :chat do |data|
|
|
65
|
+
result = data
|
|
66
|
+
created_at = self.created_at
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
@foo.emit :chat, :user => 'shokai', :message => 'hello world'
|
|
70
|
+
|
|
71
|
+
assert result[:user] == 'shokai'
|
|
72
|
+
assert result[:message] == 'hello world'
|
|
73
|
+
assert created_at == @now, 'instance method'
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def test_remove_listener
|
|
77
|
+
@foo.on :bar do |data|
|
|
78
|
+
puts "bar #{data}"
|
|
79
|
+
end
|
|
80
|
+
@foo.on :bar do |data|
|
|
81
|
+
puts "barbar: #{data}"
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
id = @foo.on :baz do |data|
|
|
85
|
+
p data
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
assert @foo.__events.size == 3, 'check registerd listener count'
|
|
89
|
+
@foo.remove_listener id
|
|
90
|
+
assert @foo.__events.size == 2, 'remove listener by id'
|
|
91
|
+
|
|
92
|
+
@foo.remove_listener :bar
|
|
93
|
+
assert @foo.__events.size == 0, 'remove all "bar" listener'
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test_once
|
|
97
|
+
total = 0
|
|
98
|
+
@foo.once :add do |data|
|
|
99
|
+
total += data
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
@foo.emit :add, 1
|
|
103
|
+
assert total == 1, 'first call'
|
|
104
|
+
@foo.emit :add, 1
|
|
105
|
+
assert total == 1, 'call listener only first time'
|
|
106
|
+
end
|
|
107
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: event_emitter-with_instance_listener
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.2.5
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Sho Hashimoto
|
|
8
|
+
- Trey Grffith
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2014-10-17 00:00:00.000000000 Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: minitest
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
requirements:
|
|
18
|
+
- - '>='
|
|
19
|
+
- !ruby/object:Gem::Version
|
|
20
|
+
version: '0'
|
|
21
|
+
type: :development
|
|
22
|
+
prerelease: false
|
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
24
|
+
requirements:
|
|
25
|
+
- - '>='
|
|
26
|
+
- !ruby/object:Gem::Version
|
|
27
|
+
version: '0'
|
|
28
|
+
- !ruby/object:Gem::Dependency
|
|
29
|
+
name: rake
|
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
|
31
|
+
requirements:
|
|
32
|
+
- - '>='
|
|
33
|
+
- !ruby/object:Gem::Version
|
|
34
|
+
version: '0'
|
|
35
|
+
type: :development
|
|
36
|
+
prerelease: false
|
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
38
|
+
requirements:
|
|
39
|
+
- - '>='
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: '0'
|
|
42
|
+
- !ruby/object:Gem::Dependency
|
|
43
|
+
name: bundler
|
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
|
45
|
+
requirements:
|
|
46
|
+
- - ~>
|
|
47
|
+
- !ruby/object:Gem::Version
|
|
48
|
+
version: '1.3'
|
|
49
|
+
type: :development
|
|
50
|
+
prerelease: false
|
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
52
|
+
requirements:
|
|
53
|
+
- - ~>
|
|
54
|
+
- !ruby/object:Gem::Version
|
|
55
|
+
version: '1.3'
|
|
56
|
+
description: Ruby port of EventEmitter from Node.js
|
|
57
|
+
email:
|
|
58
|
+
- hashimoto@shokai.org
|
|
59
|
+
- trey.griffith@gmail.com
|
|
60
|
+
executables: []
|
|
61
|
+
extensions: []
|
|
62
|
+
extra_rdoc_files: []
|
|
63
|
+
files:
|
|
64
|
+
- .gitignore
|
|
65
|
+
- .travis.yml
|
|
66
|
+
- Gemfile
|
|
67
|
+
- History.txt
|
|
68
|
+
- LICENSE.txt
|
|
69
|
+
- README.md
|
|
70
|
+
- Rakefile
|
|
71
|
+
- benchmark/benchmark.rb
|
|
72
|
+
- benchmark/benchmark_helper.rb
|
|
73
|
+
- event_emitter.gemspec
|
|
74
|
+
- lib/event_emitter.rb
|
|
75
|
+
- lib/event_emitter/emitter.rb
|
|
76
|
+
- lib/event_emitter/version.rb
|
|
77
|
+
- samples/class-method.rb
|
|
78
|
+
- samples/instance-specific-method.rb
|
|
79
|
+
- samples/sample.rb
|
|
80
|
+
- samples/timer.rb
|
|
81
|
+
- test/test_catch_all_events.rb
|
|
82
|
+
- test/test_class_method.rb
|
|
83
|
+
- test/test_event_emitter.rb
|
|
84
|
+
- test/test_helper.rb
|
|
85
|
+
- test/test_instance_on.rb
|
|
86
|
+
- test/test_singular_method.rb
|
|
87
|
+
homepage:
|
|
88
|
+
licenses: []
|
|
89
|
+
metadata: {}
|
|
90
|
+
post_install_message:
|
|
91
|
+
rdoc_options: []
|
|
92
|
+
require_paths:
|
|
93
|
+
- lib
|
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
95
|
+
requirements:
|
|
96
|
+
- - '>='
|
|
97
|
+
- !ruby/object:Gem::Version
|
|
98
|
+
version: '0'
|
|
99
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - '>='
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '0'
|
|
104
|
+
requirements: []
|
|
105
|
+
rubyforge_project:
|
|
106
|
+
rubygems_version: 2.2.2
|
|
107
|
+
signing_key:
|
|
108
|
+
specification_version: 4
|
|
109
|
+
summary: Ruby port of EventEmitter from Node.js
|
|
110
|
+
test_files:
|
|
111
|
+
- test/test_catch_all_events.rb
|
|
112
|
+
- test/test_class_method.rb
|
|
113
|
+
- test/test_event_emitter.rb
|
|
114
|
+
- test/test_helper.rb
|
|
115
|
+
- test/test_instance_on.rb
|
|
116
|
+
- test/test_singular_method.rb
|