em-emitter 0.9.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []