em-emitter 0.9.0.beta.1
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.
- data/lib/em-emitter/emitter.rb +52 -0
- data/lib/em-emitter/event.rb +51 -0
- data/lib/em-emitter/observable.rb +40 -0
- data/lib/em-emitter/observer.rb +40 -0
- data/lib/em-emitter.rb +17 -0
- metadata +82 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
module EM
|
2
|
+
module Emitter
|
3
|
+
@@observers = []
|
4
|
+
@@max_listeners = 50
|
5
|
+
|
6
|
+
def self.max_listeners
|
7
|
+
@@max_listeners
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.max_listeners=(n)
|
11
|
+
# TODO make this unchangeable once EM is running
|
12
|
+
@@max_listeners = n
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.listeners_count
|
16
|
+
@@observers.count
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.add_observer(object, event, method_to_call)
|
20
|
+
raise EM::Emitter::MaxObserversReachedException.new if @@observers.count >= @@max_listeners
|
21
|
+
|
22
|
+
@@observers << EM::Emitter::Observer.new(event, object, method_to_call)
|
23
|
+
|
24
|
+
@@observers.count
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.remove_observer(observer)
|
28
|
+
@@observers.delete_if { |x| x == observer }
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.clear_observers!
|
32
|
+
@@observers = []
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.emit(object, event, data)
|
36
|
+
@@observers.each do |ob|
|
37
|
+
if ob.is_active && ob.event == event
|
38
|
+
# make the observer method calls async
|
39
|
+
EM.next_tick do
|
40
|
+
# call the method on the object with the data
|
41
|
+
ob.call_action(data)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
EM.next_tick do
|
47
|
+
# remove non active items first
|
48
|
+
@@observers.delete_if { |x| x.is_active == false }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module EM
|
2
|
+
module Emitter
|
3
|
+
|
4
|
+
class Event
|
5
|
+
attr_reader :event_hash
|
6
|
+
attr_reader :observer
|
7
|
+
|
8
|
+
def initialize(hash, observer)
|
9
|
+
@event_hash = hash
|
10
|
+
@observer = observer
|
11
|
+
end
|
12
|
+
|
13
|
+
def ==(other)
|
14
|
+
if other.class == Hash
|
15
|
+
check_filter(other)
|
16
|
+
else
|
17
|
+
super
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def check_filter(other)
|
22
|
+
if @event_hash.class == Symbol
|
23
|
+
case @event_hash
|
24
|
+
when :all
|
25
|
+
true
|
26
|
+
when :all_once
|
27
|
+
@observer.remove
|
28
|
+
true
|
29
|
+
else
|
30
|
+
false
|
31
|
+
end
|
32
|
+
else
|
33
|
+
filter_match?(other)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def filter_match?(filter)
|
38
|
+
# logic for working out if the filter matches
|
39
|
+
|
40
|
+
# find any items in the event that is not in the filter
|
41
|
+
outersect = Hash[@event_hash.to_a - filter.to_a]
|
42
|
+
|
43
|
+
# if there are no elements that dont match we have a match
|
44
|
+
return true if outersect.count == 0
|
45
|
+
|
46
|
+
false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module EM
|
2
|
+
module Emitter
|
3
|
+
module Observable
|
4
|
+
|
5
|
+
def uses_clone(cloner)
|
6
|
+
@uses_clone = cloner
|
7
|
+
end
|
8
|
+
|
9
|
+
def emit(event, object)
|
10
|
+
# check and see if the observer uses cloning
|
11
|
+
if @uses_clone
|
12
|
+
object = clone_data(object)
|
13
|
+
end
|
14
|
+
|
15
|
+
EM::Emitter.emit(self, event, object)
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def receiver(event, method_name)
|
20
|
+
EM::Emitter.add_observer(self, event, method_name)
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def clone_data(object)
|
25
|
+
# clone or copy depending on type
|
26
|
+
if object.nil?
|
27
|
+
clone_obj = nil
|
28
|
+
elsif object.respond_to?(:clone)
|
29
|
+
clone_obj = object.clone
|
30
|
+
elsif object.respond_to?(:dup)
|
31
|
+
clone_obj = object.dup
|
32
|
+
else
|
33
|
+
clone_obj = object
|
34
|
+
end
|
35
|
+
|
36
|
+
clone_obj
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module EM
|
2
|
+
module Emitter
|
3
|
+
|
4
|
+
class Observer
|
5
|
+
attr_reader :object
|
6
|
+
attr_reader :event
|
7
|
+
attr_reader :method
|
8
|
+
attr_reader :is_active
|
9
|
+
|
10
|
+
def initialize(event, object, method)
|
11
|
+
@event = EM::Emitter::Event.new(event, self)
|
12
|
+
@object = object
|
13
|
+
@method = method
|
14
|
+
@is_active = true
|
15
|
+
end
|
16
|
+
|
17
|
+
def call_action(data)
|
18
|
+
# only invoke the method if it can be invoked
|
19
|
+
if @object.nil? == false && @object.respond_to?(@method)
|
20
|
+
@object.send(@method, data)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def ==(other)
|
25
|
+
if other.class == Observer
|
26
|
+
self.object_id == other.object_id
|
27
|
+
else
|
28
|
+
super
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def remove
|
33
|
+
# TODO: add logic that doesnt mutate the observer array while in flight
|
34
|
+
@is_active = false
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
data/lib/em-emitter.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
2
|
+
|
3
|
+
require 'eventmachine'
|
4
|
+
require 'em-emitter/event'
|
5
|
+
require 'em-emitter/observer'
|
6
|
+
require 'em-emitter/observable'
|
7
|
+
require 'em-emitter/emitter'
|
8
|
+
|
9
|
+
module EM
|
10
|
+
module Emitter
|
11
|
+
# Exception classes
|
12
|
+
class MaxObserversReachedException < Exception
|
13
|
+
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: em-emitter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.9.0.beta.1
|
5
|
+
prerelease: 6
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Paul Van de Vreede
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-10-09 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: eventmachine
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: eventmachine
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '1.0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '1.0'
|
46
|
+
description: You can use em-emitter to communicate with other objects in the Eventmachine
|
47
|
+
reactor by subscribing to events and emitting them with encapsulated pieces of data.
|
48
|
+
email: paul@vdvreede.net
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files: []
|
52
|
+
files:
|
53
|
+
- lib/em-emitter/emitter.rb
|
54
|
+
- lib/em-emitter/event.rb
|
55
|
+
- lib/em-emitter/observable.rb
|
56
|
+
- lib/em-emitter/observer.rb
|
57
|
+
- lib/em-emitter.rb
|
58
|
+
homepage: https://github.com/pvdvreede/em-emitter
|
59
|
+
licenses: []
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options: []
|
62
|
+
require_paths:
|
63
|
+
- lib
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ! '>'
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.3.1
|
76
|
+
requirements: []
|
77
|
+
rubyforge_project:
|
78
|
+
rubygems_version: 1.8.24
|
79
|
+
signing_key:
|
80
|
+
specification_version: 3
|
81
|
+
summary: Global event emitter based on the observer pattern for Eventmachine.
|
82
|
+
test_files: []
|