event_emitter-with_instance_listener 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - 2.0.0
7
+ - 2.1.0
8
+ - jruby-1.7.11
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in event_emitter.gemspec
4
+ gemspec
@@ -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"
@@ -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.
@@ -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
+ [![Build Status](https://travis-ci.org/shokai/event_emitter.svg)](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
@@ -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,5 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'event_emitter/emitter'
5
+ require 'event_emitter/version'
@@ -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,3 @@
1
+ module EventEmitter
2
+ VERSION = '0.2.5'
3
+ 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
@@ -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"
@@ -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
@@ -0,0 +1,6 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'minitest/autorun'
4
+
5
+ $:.unshift File.expand_path '../lib', File.dirname(__FILE__)
6
+ require 'event_emitter'
@@ -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