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.
@@ -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: []