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.
@@ -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