signals 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/README.md +17 -3
- data/lib/signals/block_listener.rb +10 -4
- data/lib/signals/listener.rb +21 -0
- data/lib/signals/publisher.rb +13 -14
- data/lib/signals/version.rb +1 -1
- data/lib/signals.rb +1 -0
- data/signals.gemspec +1 -1
- data/spec/signals/block_listener_spec.rb +27 -2
- data/spec/signals/listener_spec.rb +31 -0
- data/spec/signals/publisher_spec.rb +22 -48
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 682db5800cf5ba91ba8694e672f9ba94cc766e27
|
4
|
+
data.tar.gz: 360251fd4a443e0ddac0b738af93e4a05e713026
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2bfa9e3d66d07c05840b374089148a69a124fce7fbfd4760ccf896fd331a033751b81a87ecb174d47bfbadba11a95411abdb094301ff53deb07b471d5cbd2fe2
|
7
|
+
data.tar.gz: 684f968ef7cdfd6be8c9ca7a28e0a49f5e67a7a042a3ad35d703f675809d6b538968017089b3c2a7fa006aa540814888b963a8ab322e7b67a5f11248451b7bb2
|
data/README.md
CHANGED
@@ -4,9 +4,17 @@ A light weight publish / subscribe. It is similar to how the gem Wisper works
|
|
4
4
|
but without extra functionality. This library assumes nothing and concurrency is
|
5
5
|
not a priortiy.
|
6
6
|
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
```
|
10
|
+
gem 'signals'
|
11
|
+
```
|
12
|
+
|
7
13
|
## Usage
|
8
14
|
|
9
15
|
```rb
|
16
|
+
require 'signals'
|
17
|
+
|
10
18
|
class Coach
|
11
19
|
include Signals::Publisher
|
12
20
|
|
@@ -16,15 +24,21 @@ class Coach
|
|
16
24
|
end
|
17
25
|
|
18
26
|
class Player
|
27
|
+
def initialize(name)
|
28
|
+
@name = name
|
29
|
+
end
|
30
|
+
|
19
31
|
def v_formation(coach)
|
20
|
-
puts "
|
32
|
+
puts "#{@name} is in position"
|
21
33
|
end
|
22
34
|
end
|
23
35
|
|
24
36
|
coach = Coach.new
|
25
|
-
|
37
|
+
forward = Player.new('John')
|
38
|
+
center = Player.new('Jeff')
|
26
39
|
|
27
|
-
coach.subscribe(
|
40
|
+
coach.subscribe(forward)
|
41
|
+
coach.subscribe(center)
|
28
42
|
|
29
43
|
coach.run_play
|
30
44
|
```
|
@@ -3,10 +3,16 @@ module Signals
|
|
3
3
|
# This is a Listener that once instantiated, will define a method that is
|
4
4
|
# named what is passed as the action.
|
5
5
|
class BlockListener
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
attr_reader :event, :listener
|
7
|
+
|
8
|
+
def initialize(event, &block)
|
9
|
+
@listener = block
|
10
|
+
@event = event
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute(event, *args)
|
14
|
+
if self.event == event
|
15
|
+
self.listener.call(*args)
|
10
16
|
end
|
11
17
|
end
|
12
18
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Signals
|
2
|
+
|
3
|
+
class Listener
|
4
|
+
attr_reader :listener
|
5
|
+
|
6
|
+
# @param [Object] listener the listener you want to use
|
7
|
+
def initialize(listener)
|
8
|
+
@listener = listener
|
9
|
+
end
|
10
|
+
|
11
|
+
# @param [Object] event
|
12
|
+
# @return [void]
|
13
|
+
def execute(event, *args)
|
14
|
+
if @listener.respond_to?(event)
|
15
|
+
@listener.send(event, *args)
|
16
|
+
end
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
data/lib/signals/publisher.rb
CHANGED
@@ -1,31 +1,30 @@
|
|
1
1
|
module Signals
|
2
2
|
|
3
3
|
module Publisher
|
4
|
-
# Broadcasts an
|
5
|
-
# @return [
|
6
|
-
def broadcast(
|
4
|
+
# Broadcasts an event to all of the subscribed listeners
|
5
|
+
# @return [void]
|
6
|
+
def broadcast(event, *args)
|
7
7
|
listeners.each do |listener|
|
8
|
-
|
9
|
-
listener.send(action, *args)
|
10
|
-
end
|
8
|
+
listener.execute(event, *args)
|
11
9
|
end
|
12
|
-
|
10
|
+
nil
|
13
11
|
end
|
14
12
|
|
13
|
+
# Creates a one off listener that will respond to the event provided only
|
14
|
+
# @param [Object] event the event that is triggered
|
15
|
+
# @return [void]
|
15
16
|
def on(event, &block)
|
16
|
-
listeners
|
17
|
-
|
17
|
+
listeners.add(BlockListener.new(event, &block))
|
18
|
+
nil
|
18
19
|
end
|
19
20
|
|
20
21
|
# Subscribe a listener to the publisher
|
21
|
-
# @return [
|
22
|
+
# @return [void]
|
22
23
|
def subscribe(listener)
|
23
|
-
listeners
|
24
|
-
|
24
|
+
listeners.add(Listener.new(listener))
|
25
|
+
nil
|
25
26
|
end
|
26
27
|
|
27
|
-
private
|
28
|
-
|
29
28
|
# All of the listeners subscribed to a publisher
|
30
29
|
# @return [Set] a unique set of listeners
|
31
30
|
def listeners
|
data/lib/signals/version.rb
CHANGED
data/lib/signals.rb
CHANGED
data/signals.gemspec
CHANGED
@@ -2,8 +2,33 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Signals::BlockListener do
|
4
4
|
|
5
|
-
describe '#
|
6
|
-
|
5
|
+
describe '#execute' do
|
6
|
+
it 'should execute the event it was registered for' do
|
7
|
+
block = Signals::BlockListener.new(:testing)
|
8
|
+
block.stub(listener: double('lambda', call: true))
|
9
|
+
|
10
|
+
block.execute(:testing)
|
11
|
+
|
12
|
+
block.listener.should have_received(:call).once
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should not execute when the event does not match' do
|
16
|
+
block = Signals::BlockListener.new(:testing)
|
17
|
+
block.stub(listener: double('lambda', call: true))
|
18
|
+
|
19
|
+
block.execute(:another)
|
20
|
+
|
21
|
+
block.listener.should_not have_received(:call)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should pass parameters on to the proc' do
|
25
|
+
block = Signals::BlockListener.new(:testing)
|
26
|
+
block.stub(listener: double('lambda', call: true))
|
27
|
+
|
28
|
+
block.execute(:testing, 1, 2)
|
29
|
+
|
30
|
+
block.listener.should have_received(:call).with(1,2).once
|
31
|
+
end
|
7
32
|
end
|
8
33
|
|
9
34
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Signals::Listener do
|
4
|
+
|
5
|
+
describe '#execute' do
|
6
|
+
it 'should execute an existing method with no params' do
|
7
|
+
simple = double('SimpleListener', testing: true)
|
8
|
+
listener = Signals::Listener.new(simple)
|
9
|
+
|
10
|
+
listener.execute(:testing)
|
11
|
+
|
12
|
+
listener.listener.should have_received(:testing).once
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should execute an existing method with params' do
|
16
|
+
simple = double('SimpleListener', testing: true)
|
17
|
+
listener = Signals::Listener.new(simple)
|
18
|
+
|
19
|
+
listener.execute(:testing, 1, 2)
|
20
|
+
|
21
|
+
listener.listener.should have_received(:testing).with(1, 2).once
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should not raise an error when the method does not exist' do
|
25
|
+
simple = double('SimpleListener')
|
26
|
+
listener = Signals::Listener.new(simple)
|
27
|
+
|
28
|
+
expect { listener.execute(:testing) }.to_not raise_error
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -5,68 +5,42 @@ describe Signals::Publisher do
|
|
5
5
|
include Signals::Publisher
|
6
6
|
end
|
7
7
|
|
8
|
-
class
|
9
|
-
def simple_method
|
10
|
-
true
|
11
|
-
end
|
8
|
+
class SimpleListener
|
12
9
|
end
|
13
10
|
|
14
|
-
|
15
|
-
def complex_method(a, b)
|
16
|
-
true
|
17
|
-
end
|
18
|
-
end
|
11
|
+
let(:publisher) { DummyPublisher.new }
|
19
12
|
|
20
13
|
describe '#broadcast' do
|
21
|
-
it 'should broadcast
|
22
|
-
|
23
|
-
|
24
|
-
end
|
14
|
+
it 'should broadcast an event' do
|
15
|
+
listener = double('AListener', execute: true)
|
16
|
+
publisher.stub(listeners: Set.new([listener]))
|
25
17
|
|
26
|
-
|
27
|
-
publisher = DummyPublisher.new
|
28
|
-
publisher.stub(:listeners).and_return([DummySimpleListener.new])
|
29
|
-
expect { publisher.broadcast(:simple_method) }.to_not raise_error
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'should broadcast to a complex listener' do
|
33
|
-
publisher = DummyPublisher.new
|
34
|
-
publisher.stub(:listeners).and_return([DummyComplexListener.new])
|
35
|
-
expect { publisher.broadcast(:complex_method, 1, 2) }.to_not raise_error
|
36
|
-
end
|
18
|
+
publisher.broadcast(:event, 1, 2)
|
37
19
|
|
38
|
-
|
39
|
-
publisher = DummyPublisher.new
|
40
|
-
publisher.stub(:listeners).and_return([DummySimpleListener.new])
|
41
|
-
expect { publisher.broadcast(:does_not_exist) }.to_not raise_error
|
42
|
-
end
|
43
|
-
|
44
|
-
context 'when providing too few arguments' do
|
45
|
-
it 'should raise an argument error' do
|
46
|
-
publisher = DummyPublisher.new
|
47
|
-
publisher.stub(:listeners).and_return([DummyComplexListener.new])
|
48
|
-
expect { publisher.broadcast(:complex_method, 1) }.to raise_error(/wrong number of arguments/)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
context 'when providing too many arguments' do
|
53
|
-
it 'should raise an argument error' do
|
54
|
-
publisher = DummyPublisher.new
|
55
|
-
publisher.stub(:listeners).and_return([DummySimpleListener.new])
|
56
|
-
expect { publisher.broadcast(:simple_method, 1) }.to raise_error(/wrong number of arguments/)
|
57
|
-
end
|
20
|
+
listener.should have_received(:execute).with(:event, 1, 2)
|
58
21
|
end
|
59
22
|
end
|
60
23
|
|
61
24
|
describe '#subscribe' do
|
62
|
-
it 'should subscribe
|
63
|
-
|
64
|
-
|
25
|
+
it 'should subscribe a listener' do
|
26
|
+
expect {
|
27
|
+
publisher.subscribe(SimpleListener.new)
|
28
|
+
}.to_not raise_error
|
65
29
|
end
|
66
30
|
end
|
67
31
|
|
68
32
|
describe '#on' do
|
69
|
-
|
33
|
+
it 'should subscribe a block listener' do
|
34
|
+
publisher.stub(listeners: double('Set', add: true))
|
35
|
+
|
36
|
+
publisher.on(:event) { true }
|
37
|
+
|
38
|
+
publisher.listeners.should have_received(:add).once
|
39
|
+
end
|
70
40
|
end
|
71
41
|
|
42
|
+
describe '#listeners' do
|
43
|
+
subject { publisher.listeners }
|
44
|
+
it { should be_a(Set) }
|
45
|
+
end
|
72
46
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: signals
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew Johnston
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07-
|
11
|
+
date: 2013-07-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -42,16 +42,16 @@ dependencies:
|
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - '
|
45
|
+
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 2.14.0.rc1
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - '
|
52
|
+
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 2.14.0.rc1
|
55
55
|
description: A lightweight publish / subscribe library
|
56
56
|
email:
|
57
57
|
- warmwaffles@gmail.com
|
@@ -69,10 +69,12 @@ files:
|
|
69
69
|
- Rakefile
|
70
70
|
- lib/signals.rb
|
71
71
|
- lib/signals/block_listener.rb
|
72
|
+
- lib/signals/listener.rb
|
72
73
|
- lib/signals/publisher.rb
|
73
74
|
- lib/signals/version.rb
|
74
75
|
- signals.gemspec
|
75
76
|
- spec/signals/block_listener_spec.rb
|
77
|
+
- spec/signals/listener_spec.rb
|
76
78
|
- spec/signals/publisher_spec.rb
|
77
79
|
- spec/spec_helper.rb
|
78
80
|
homepage: https://github.com/warmwaffles/signals
|
@@ -101,5 +103,6 @@ specification_version: 4
|
|
101
103
|
summary: A lightweight publish / subscribe library
|
102
104
|
test_files:
|
103
105
|
- spec/signals/block_listener_spec.rb
|
106
|
+
- spec/signals/listener_spec.rb
|
104
107
|
- spec/signals/publisher_spec.rb
|
105
108
|
- spec/spec_helper.rb
|