flirt 0.0.2 → 0.0.3

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: e91741f80d191782e97feb4f999ea217cea73ab0
4
- data.tar.gz: c82e4ca1147147b4dbe58eceda66cb1f24724e9c
3
+ metadata.gz: 3595d41a6ad627adc7eefdbb93242a03522ff4e5
4
+ data.tar.gz: d2a89c116bf434fe75827ca5c85ae3fcfe6958de
5
5
  SHA512:
6
- metadata.gz: 663901d78250f3486d9deee98b17a299032270f93bbaa8c833a7838d597dbef8d5b5ee57565ee9417ef1e0292530504d75a0e28e4b72c8c2f78a473ae5dcb635
7
- data.tar.gz: e9176cd92e3178a0ee7d291dab6fbf97956a4ca24aa39af78debd4b3ac96202148de7573fe90c41b619d778990ece3d79bfb19e69b33c466d7a6f34b1773cda6
6
+ metadata.gz: 1c42aba9604a42b718bca09e68d7ade30b6dbdfc0d10e9114ca658762bc3e72485b27f0c0740227e7621aac39c907446a3fd67ba7c97641ab78532364d9d77d6
7
+ data.tar.gz: 55d2e892fd50a3694b5c13da4c5d8f4e32da0839d9fbec8b39670c536fee612995d08c423c2b8c171fa6857ccac1280bad2f0a87bf3c37e630281c0a1b5970e9
data/.gitignore CHANGED
@@ -13,3 +13,4 @@
13
13
  *.a
14
14
  mkmf.log
15
15
  .idea
16
+ *.gem
@@ -3,18 +3,23 @@
3
3
 
4
4
  module Flirt
5
5
  class Callback
6
+
6
7
  attr_accessor :object, :callback_name
8
+
7
9
  def initialize(opts = {})
8
10
  self.callback_name = opts.fetch(:callback_name)
9
11
  self.object = opts.fetch(:object)
10
12
  end
11
13
 
14
+
12
15
  def call(event_data)
13
16
  object.send callback_name, event_data
14
17
  end
15
18
 
19
+
16
20
  def ==(other_callback)
17
21
  object == other_callback.object && callback_name == other_callback.callback_name
18
22
  end
23
+
19
24
  end
20
25
  end
@@ -38,5 +38,13 @@ module Flirt
38
38
  Flirt.subscribe self, event_name, opts
39
39
  end
40
40
  alias_method :listen_to, :subscribe_to
41
+
42
+
43
+ def unsubscribe_from(event_name, opts = {})
44
+ raise ArgumentError.new("You must pass a callback") unless opts[:with].is_a? Symbol
45
+ Flirt.unsubscribe self, event_name, opts
46
+ end
47
+ alias_method :forget, :unsubscribe_from
48
+
41
49
  end
42
50
  end
data/lib/flirt/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Flirt
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/flirt.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  require "flirt/version"
2
2
  require "flirt/callback"
3
3
  require "flirt/listener"
4
- # The Flirt module provides the main interface for dealing with Flirt.
5
- #
4
+
5
+ # The Flirt module provides the main interface for dealing with Flirt. Callbacks can be registered or unregistered
6
+ # against events, and Flirt can be enabled or disabled.
6
7
 
7
8
  module Flirt
8
9
 
@@ -17,6 +18,7 @@ module Flirt
17
18
  end
18
19
  alias_method :broadcast, :publish
19
20
 
21
+
20
22
  def subscribe(object, event_name, options = {})
21
23
  check_subscription_arguments(event_name, object, options)
22
24
  callback = Flirt::Callback.new object: object,
@@ -25,6 +27,7 @@ module Flirt
25
27
  end
26
28
  alias_method :listen, :subscribe
27
29
 
30
+
28
31
  def unsubscribe(object, event_name, options = {})
29
32
  check_subscription_arguments(event_name, object, options)
30
33
  callback = Flirt::Callback.new object: object,
@@ -33,32 +36,39 @@ module Flirt
33
36
  end
34
37
  alias_method :unlisten, :unsubscribe
35
38
 
39
+
36
40
  def enable
37
41
  self.disabled = false
38
42
  end
39
43
 
44
+
40
45
  def disable
41
46
  self.disabled = true
42
47
  end
43
48
 
49
+
44
50
  def clear
45
51
  @callbacks = {}
46
52
  end
47
53
 
54
+
48
55
  private
49
56
 
50
57
  attr_reader :callbacks
51
58
  attr_accessor :disabled
52
59
 
60
+
53
61
  def callbacks
54
62
  @callbacks ||= {}
55
63
  end
56
64
 
65
+
57
66
  def add_callback(event_name, callback)
58
67
  callbacks[event_name] ||= []
59
68
  callbacks[event_name] << callback
60
69
  end
61
70
 
71
+
62
72
  def remove_callback(event_name, callback_to_delete)
63
73
  return unless callbacks[event_name]
64
74
 
@@ -67,6 +77,7 @@ module Flirt
67
77
  end
68
78
  end
69
79
 
80
+
70
81
  def check_subscription_arguments(event_name, object, options)
71
82
  raise ArgumentError.new("You must pass a callback") unless options[:with].is_a? Symbol
72
83
  raise ArgumentError.new("You must pass an object") if object.nil?
@@ -74,5 +85,4 @@ module Flirt
74
85
  end
75
86
 
76
87
  end
77
-
78
88
  end
@@ -8,31 +8,40 @@ describe Flirt::Callback do
8
8
  describe "when instantiated with an object and callback name" do
9
9
 
10
10
  let(:listener) { Object.new }
11
+
11
12
  let(:callback_name) { :call_me }
12
13
 
13
14
  let(:callback) { Flirt::Callback.new object: listener, callback_name: callback_name }
14
15
 
16
+
15
17
  it "sets the object" do
16
18
  expect(callback.object).to eq(listener)
17
19
  end
18
20
 
21
+
19
22
  it "sets the callback" do
20
23
  expect(callback.callback_name).to eq(callback_name)
21
24
  end
22
25
 
26
+
23
27
  describe "when called" do
24
28
 
25
29
  let(:event_data) { {event: :data} }
26
30
 
31
+
27
32
  it "calls the callback with the event data" do
28
33
  expect(listener).to receive(callback_name).with(event_data)
29
34
  callback.call(event_data)
30
35
  end
36
+
31
37
  end
32
38
 
39
+
33
40
  it "tests equality if object and callback are the same" do
34
41
  other_callback = Flirt::Callback.new object: listener, callback_name: callback_name
35
42
  expect(callback).to eq(other_callback)
36
43
  end
44
+
37
45
  end
46
+
38
47
  end
@@ -7,63 +7,96 @@ describe Flirt::Listener do
7
7
  end
8
8
 
9
9
  describe "when included in an instance" do
10
+
10
11
  let(:event) { :grabbed_coin }
12
+
11
13
  let(:callback_name) { :increase_score }
14
+
12
15
  let(:event_data) { { value: 100 } }
16
+
13
17
  let(:test_class) { Class.new }
18
+
14
19
  let(:test_instance) { test_class.new }
15
20
 
21
+
16
22
  before(:each) do
17
23
  test_class.class_eval do
18
24
  include Flirt::Listener
19
25
  end
26
+
20
27
  end
21
28
 
22
- it "subscribes to an event" do
23
- block_event = event
24
- block_callback_name = callback_name
25
- test_instance.instance_eval do
26
- subscribe_to block_event, with: block_callback_name
29
+
30
+ [:listen_to, :subscribe_to].each do |method|
31
+ it "subscribes to an event with ##{method}" do
32
+ block_event = event
33
+ block_callback_name = callback_name
34
+ expect(Flirt).to receive(:subscribe).with(test_instance, event, { with: callback_name })
35
+ test_instance.instance_eval do
36
+ send method, block_event, with: block_callback_name
37
+ end
38
+
27
39
  end
28
- expect(test_instance).to receive(callback_name).with(event_data)
29
- Flirt.broadcast event, event_data
40
+
30
41
  end
31
42
 
32
- it "listens to an event" do
33
- block_event = event
34
- block_callback_name = callback_name
35
- test_instance.instance_eval do
36
- listen_to block_event, with: block_callback_name
43
+
44
+ [:forget, :unsubscribe_from].each do |method|
45
+ it "unsubscribes from an event with ##{method}" do
46
+ block_event = event
47
+ block_callback_name = callback_name
48
+ expect(Flirt).to receive(:unsubscribe).with(test_instance, event, { with: callback_name })
49
+ test_instance.instance_eval do
50
+ send method, block_event, with: block_callback_name
51
+ end
52
+
37
53
  end
38
- expect(test_instance).to receive(callback_name).with(event_data)
39
- Flirt.broadcast event, event_data
54
+
40
55
  end
56
+
41
57
  end
42
58
 
59
+
43
60
  describe "when included in a class" do
61
+
44
62
  let(:event) { :event_name }
63
+
45
64
  let(:callback_name) { :callback_name }
65
+
46
66
  let(:event_data) { { value: 100 } }
67
+
47
68
  let(:test_class) { Class.new }
48
69
 
49
- it "subscribes to an event" do
50
- block_event = event
51
- block_callback_name = callback_name
52
- expect(Flirt).to receive(:subscribe).with(test_class, event, { with: callback_name })
53
- test_class.class_eval do
54
- extend Flirt::Listener
55
- subscribe_to block_event, with: block_callback_name
70
+
71
+ [:listen_to, :subscribe_to].each do |method|
72
+ it "subscribes to an event with ##{method}" do
73
+ block_event = event
74
+ block_callback_name = callback_name
75
+ expect(Flirt).to receive(:subscribe).with(test_class, event, { with: callback_name })
76
+ test_class.class_eval do
77
+ extend Flirt::Listener
78
+ send method, block_event, with: block_callback_name
79
+ end
80
+
56
81
  end
82
+
57
83
  end
58
84
 
59
- it "listens to an event" do
60
- block_event = event
61
- block_callback_name = callback_name
62
- expect(Flirt).to receive(:subscribe).with(test_class, event, { with: callback_name })
63
- test_class.class_eval do
64
- extend Flirt::Listener
65
- listen_to block_event, with: block_callback_name
85
+
86
+ [:forget, :unsubscribe_from].each do |method|
87
+ it "unsubscribes from an event with ##{method}" do
88
+ block_event = event
89
+ block_callback_name = callback_name
90
+ expect(Flirt).to receive(:unsubscribe).with(test_class, event, { with: callback_name })
91
+ test_class.class_eval do
92
+ extend Flirt::Listener
93
+ send method, block_event, with: block_callback_name
94
+ end
95
+
66
96
  end
97
+
67
98
  end
99
+
68
100
  end
101
+
69
102
  end
@@ -6,94 +6,101 @@ describe Flirt do
6
6
  describe "with a single :pancake_fried subscriber" do
7
7
 
8
8
  let(:response) { { topping: "cream" } }
9
+
9
10
  let(:event) { :pancake_fried }
11
+
10
12
  let(:wrong_event) { :spud_baked }
13
+
11
14
  let(:callback) { :respond }
15
+
12
16
  let!(:listener) { Object.new }
13
17
 
14
- before(:each) do
15
- Flirt.listen listener, event, with: callback
16
- end
17
18
 
18
- it "listens to the correct broadcast event" do
19
- expect(listener).to receive(callback).with(response)
20
- Flirt.broadcast event, response
21
- end
19
+ [:subscribe, :listen].each do |method|
22
20
 
23
- it "listens to the correct publish event" do
24
- expect(listener).to receive(callback).with(response)
25
- Flirt.publish event, response
26
- end
21
+ describe "and a listener added with ##{method}" do
27
22
 
28
- it "doesn't listen to the wrong broadcast event" do
29
- expect(listener).not_to receive(callback)
30
- Flirt.broadcast wrong_event, response
31
- end
23
+ before(:each) do
24
+ Flirt.send method, listener, event, with: callback
25
+ end
32
26
 
33
- it "doesn't listen to the wrong publish event" do
34
- expect(listener).not_to receive(callback)
35
- Flirt.broadcast wrong_event, response
36
- end
37
27
 
38
- describe "when disabled" do
39
- before(:each) { Flirt.disable }
40
- after(:each) { Flirt.enable }
28
+ [:publish, :broadcast].each do |method|
41
29
 
42
- it "doesn't broadcast" do
43
- expect(listener).not_to receive(callback)
44
- Flirt.broadcast event, response
45
- end
30
+ it "listens to the correct event published with ##{method}" do
31
+ expect(listener).to receive(callback).with(response)
32
+ Flirt.send method, event, response
33
+ end
46
34
 
47
- it "doesn't publish" do
48
- expect(listener).not_to receive(callback)
49
- Flirt.publish event, response
50
- end
51
- end
52
35
 
53
- describe "when cleared" do
36
+ it "doesn't listen to the wrong event published with ##{method}" do
37
+ expect(listener).not_to receive(callback)
38
+ Flirt.send method, wrong_event, response
39
+ end
54
40
 
55
- let(:callback2) { :respond2 }
56
41
 
57
- before(:each) do
58
- Flirt.listen listener, event, with: callback2
59
- Flirt.clear
60
- end
42
+ describe "when disabled" do
61
43
 
62
- it "forgets listeners" do
63
- expect(listener).not_to receive(callback)
64
- expect(listener).not_to receive(callback2)
65
- Flirt.publish event, response
66
- end
44
+ before(:each) { Flirt.disable }
67
45
 
68
- end
46
+ after(:each) { Flirt.enable }
69
47
 
70
- describe "when unlistened" do
71
48
 
72
- let(:callback2) { :respond2 }
49
+ it "doesn't broadcast an event published with ##{method}" do
50
+ expect(listener).not_to receive(callback)
51
+ Flirt.send method, event, response
52
+ end
73
53
 
74
- before(:each) do
75
- Flirt.listen listener, event, with: callback2
76
- Flirt.unlisten listener, event, with: callback
77
- end
54
+ end
78
55
 
79
- it "forgets the listener" do
80
- expect(listener).not_to receive(callback)
81
- expect(listener).to receive(callback2).with(response)
82
- Flirt.broadcast event, response
83
- end
56
+ end
84
57
 
85
- end
58
+ describe "when cleared" do
86
59
 
87
- describe "when unsubscribed" do
88
- before(:each) do
89
- Flirt.unsubscribe listener, event, with: callback
90
- end
60
+ let(:callback2) { :respond2 }
61
+
62
+
63
+ before(:each) do
64
+ Flirt.listen listener, event, with: callback2
65
+ Flirt.clear
66
+ end
67
+
68
+
69
+ it "forgets listeners" do
70
+ expect(listener).not_to receive(callback)
71
+ expect(listener).not_to receive(callback2)
72
+ Flirt.publish event, response
73
+ end
74
+
75
+ end
76
+
77
+ [:unsubscribe, :unlisten].each do |method|
78
+
79
+ describe "when another listener is added and the original unsubscribed with ##{method}" do
80
+
81
+ let(:callback2) { :respond2 }
82
+
83
+
84
+ before(:each) do
85
+ Flirt.listen listener, event, with: callback2
86
+ Flirt.send method, listener, event, with: callback
87
+ end
88
+
89
+
90
+ it "it forgets the original listener but remembers the new one" do
91
+ expect(listener).not_to receive(callback)
92
+ expect(listener).to receive(callback2).with(response)
93
+ Flirt.broadcast event, response
94
+ end
95
+
96
+ end
97
+
98
+ end
91
99
 
92
- it "forgets the listener" do
93
- expect(listener).not_to receive(callback).with(response)
94
- Flirt.publish event, response
95
100
  end
96
101
 
97
102
  end
103
+
98
104
  end
105
+
99
106
  end
data/spec/spec_helper.rb CHANGED
@@ -12,7 +12,9 @@ Bundler.setup
12
12
  require 'flirt'
13
13
 
14
14
  RSpec.configure do |config|
15
+
15
16
  config.run_all_when_everything_filtered = true
17
+
16
18
  config.filter_run :focus
17
19
 
18
20
  config.before(:each) do
@@ -24,4 +26,5 @@ RSpec.configure do |config|
24
26
  # the seed, which is printed after each run.
25
27
  # --seed 1234
26
28
  config.order = 'random'
29
+
27
30
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flirt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Randles-Dunkley