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 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