signals 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 79695d044f17ec3916824ea55ba5551f24fcd4a8
4
- data.tar.gz: f1894ecf6cdb059adcf22e9c685b349fca6a7bea
3
+ metadata.gz: 682db5800cf5ba91ba8694e672f9ba94cc766e27
4
+ data.tar.gz: 360251fd4a443e0ddac0b738af93e4a05e713026
5
5
  SHA512:
6
- metadata.gz: b02380267c91e36fa2908332cae607fdf463f8d3c0c94755003b98b2de10e5379ff5f59970ce88e0420f083419022a72db0e9776157272ec8ea3ff2802226853
7
- data.tar.gz: e78b36011fd2e6195e110e4765424cd5cb44e04286a9e4a1e0aae3eab7d4251981100b227b564e2578da04363bfa2d2684e7841d349914329df5bdd270d1082a
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 "I'm in position"
32
+ puts "#{@name} is in position"
21
33
  end
22
34
  end
23
35
 
24
36
  coach = Coach.new
25
- player = Player.new
37
+ forward = Player.new('John')
38
+ center = Player.new('Jeff')
26
39
 
27
- coach.subscribe(player)
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
- # @param [String] action
7
- def initialize(action, &block)
8
- (class << self; self; end;).instance_eval do
9
- define_method(action, block)
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
@@ -1,31 +1,30 @@
1
1
  module Signals
2
2
 
3
3
  module Publisher
4
- # Broadcasts an action to all of the subscribed listeners
5
- # @return [Signals::Publisher]
6
- def broadcast(action, *args)
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
- if listener.respond_to?(action)
9
- listener.send(action, *args)
10
- end
8
+ listener.execute(event, *args)
11
9
  end
12
- self
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 << BlockListener.new(event, &block)
17
- self
17
+ listeners.add(BlockListener.new(event, &block))
18
+ nil
18
19
  end
19
20
 
20
21
  # Subscribe a listener to the publisher
21
- # @return [Signals::Publisher]
22
+ # @return [void]
22
23
  def subscribe(listener)
23
- listeners << listener
24
- self
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
@@ -1,3 +1,3 @@
1
1
  module Signals
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/signals.rb CHANGED
@@ -3,5 +3,6 @@ end
3
3
 
4
4
  require 'set'
5
5
  require 'signals/version'
6
+ require 'signals/listener'
6
7
  require 'signals/block_listener'
7
8
  require 'signals/publisher'
data/signals.gemspec CHANGED
@@ -20,6 +20,6 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
- spec.add_development_dependency "rspec"
23
+ spec.add_development_dependency "rspec", "2.14.0.rc1"
24
24
 
25
25
  end
@@ -2,8 +2,33 @@ require 'spec_helper'
2
2
 
3
3
  describe Signals::BlockListener do
4
4
 
5
- describe '#initialize' do
6
- pending
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 DummySimpleListener
9
- def simple_method
10
- true
11
- end
8
+ class SimpleListener
12
9
  end
13
10
 
14
- class DummyComplexListener
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 to no listeners' do
22
- publisher = DummyPublisher.new
23
- expect { publisher.broadcast(:simple_method) }.to_not raise_error
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
- it 'should broadcast to a simple listener' do
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
- it 'should broadcast an unsupported event to a listener' do
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 an object' do
63
- publisher = DummyPublisher.new
64
- expect { publisher.subscribe(Object.new) }.to_not raise_error
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
- pending
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.1
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-02 00:00:00.000000000 Z
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: '0'
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: '0'
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