punchblock 0.4.0 → 0.4.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.
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # v0.4.1
2
+ * Feature/API change: Components no longer have an event queue, but instead it is possible to define guarded event handlers via #register_event_handler
3
+
4
+ # v0.4.0
5
+ * First public release
data/lib/punchblock.rb CHANGED
@@ -1,6 +1,9 @@
1
- require 'active_support/dependencies/autoload'
2
- require 'active_support/core_ext/object/blank'
3
- require 'future-resource'
1
+ %w{
2
+ active_support/dependencies/autoload
3
+ active_support/core_ext/object/blank
4
+ future-resource
5
+ has_guarded_handlers
6
+ }.each { |l| require l }
4
7
 
5
8
  module Punchblock
6
9
  extend ActiveSupport::Autoload
@@ -10,27 +10,31 @@ module Punchblock
10
10
  InvalidActionError = Class.new StandardError
11
11
 
12
12
  class ComponentNode < CommandNode
13
- attr_accessor :event_queue, :complete_event, :event_callback
13
+ include HasGuardedHandlers
14
+
15
+ attr_accessor :complete_event
14
16
 
15
17
  def initialize(*args)
16
18
  super
17
- @event_queue = Queue.new
18
19
  @complete_event = FutureResource.new
19
- @event_callback = nil
20
+ register_initial_handlers
21
+ end
22
+
23
+ def register_initial_handlers
24
+ register_event_handler Event::Complete do |event|
25
+ complete!
26
+ complete_event.resource = event
27
+ throw :pass
28
+ end
20
29
  end
21
30
 
22
31
  def add_event(event)
23
32
  event.original_component = self
24
- transition_state! event
25
- complete_event.resource = event if event.is_a? Event::Complete
26
- if event_callback.respond_to?(:call)
27
- add_event_to_queue = event_callback.call event
28
- end
29
- @event_queue << event unless add_event_to_queue
33
+ trigger_handler :event, event
30
34
  end
31
35
 
32
- def transition_state!(event)
33
- complete! if event.is_a? Event::Complete
36
+ def register_event_handler(*guards, &block)
37
+ register_handler :event, *guards, &block
34
38
  end
35
39
 
36
40
  def write_action(action)
@@ -149,13 +149,15 @@ module Punchblock
149
149
  [:name, :mute, :terminator, :tone_passthrough, :moderator, :announcement, :music] + super
150
150
  end
151
151
 
152
- def transition_state!(event)
153
- super
154
- case event
155
- when OnHold
152
+ def register_initial_handlers
153
+ register_event_handler OnHold do |event|
156
154
  onhold!
157
- when OffHold
155
+ throw :pass
156
+ end
157
+
158
+ register_event_handler OffHold do |event|
158
159
  offhold!
160
+ throw :pass
159
161
  end
160
162
  end
161
163
 
@@ -1,3 +1,3 @@
1
1
  module Punchblock
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.1"
3
3
  end
data/punchblock.gemspec CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
28
28
  s.add_runtime_dependency %q<activesupport>, [">= 2.1.0"]
29
29
  s.add_runtime_dependency %q<state_machine>, [">= 1.0.1"]
30
30
  s.add_runtime_dependency %q<future-resource>, [">= 0.0.2"]
31
+ s.add_runtime_dependency %q<has-guarded-handlers>, [">= 0.0.3"]
31
32
 
32
33
  s.add_development_dependency %q<bundler>, ["~> 1.0.0"]
33
34
  s.add_development_dependency %q<rspec>, ["~> 2.3.0"]
@@ -40,21 +40,21 @@ module Punchblock
40
40
  it { should_not == conference3 }
41
41
  end
42
42
 
43
- describe "#transition_state!" do
43
+ describe "#add_event" do
44
44
  describe "with an on-hold" do
45
45
  it "should call #onhold!" do
46
46
  subject.expects(:onhold!).once
47
- subject.transition_state! Conference::OnHold.new
47
+ subject.add_event Conference::OnHold.new
48
48
  end
49
49
  end
50
50
 
51
51
  describe "with an off-hold" do
52
52
  it "should call #offhold!" do
53
53
  subject.expects(:offhold!).once
54
- subject.transition_state! Conference::OffHold.new
54
+ subject.add_event Conference::OffHold.new
55
55
  end
56
56
  end
57
- end # #transition_state!
57
+ end
58
58
 
59
59
  describe "#requested" do
60
60
  context "when requesting to be muted" do
@@ -9,8 +9,6 @@ require 'spec_helper'
9
9
  module Punchblock
10
10
  module Component
11
11
  describe ComponentNode do
12
- its(:event_queue) { should be_empty }
13
-
14
12
  it "should not initially have a complete event set" do
15
13
  subject.complete_event.set_yet?.should == false
16
14
  end
@@ -25,27 +23,22 @@ module Punchblock
25
23
 
26
24
  let(:add_event) { subject.add_event event }
27
25
 
28
- it "should add the event to the component's event queue" do
29
- add_event
30
- subject.event_queue.pop(false).should == event
31
- end
32
-
33
- it "should set the original event on the command" do
26
+ it "should set the original component on the event" do
34
27
  add_event
35
28
  event.original_component.should == subject
36
29
  end
37
30
 
38
- it "should trigger state transition" do
39
- subject.expects(:transition_state!).once.with event
40
- add_event
41
- end
42
-
43
31
  describe "with a complete event" do
44
32
  it "should set the complete event resource" do
45
33
  add_event
46
34
  subject.complete_event.set_yet?.should == true
47
35
  subject.complete_event.resource.should == event
48
36
  end
37
+
38
+ it "should call #complete!" do
39
+ subject.expects(:complete!).once
40
+ add_event
41
+ end
49
42
  end
50
43
 
51
44
  describe "with another event" do
@@ -57,44 +50,20 @@ module Punchblock
57
50
  end
58
51
  end
59
52
 
60
- describe "with an event callback set" do
61
- let(:event_callback) { lambda { |event| @foo = :bar } }
53
+ describe "with an event handler set" do
54
+ let(:handler) { mock 'Response' }
62
55
 
63
56
  before do
64
- @foo = nil
65
- subject.event_callback = event_callback
66
- add_event
57
+ handler.expects(:call).once.with(event)
58
+ subject.register_event_handler { |event| handler.call event }
67
59
  end
68
60
 
69
61
  it "should trigger the callback" do
70
- @foo.should == :bar
71
- end
72
-
73
- it "should not write the event to the event queue" do
74
- subject.event_queue.should be_empty
75
- end
76
-
77
- describe "which returns a falsy value" do
78
- let(:event_callback) do
79
- lambda { |event| false }
80
- end
81
-
82
- it "should add the event to the event queue" do
83
- subject.event_queue.should_not be_empty
84
- end
62
+ add_event
85
63
  end
86
64
  end
87
65
  end # #add_event
88
66
 
89
- describe "#transition_state!" do
90
- describe "with a complete" do
91
- it "should call #complete!" do
92
- subject.expects(:complete!).once
93
- subject.transition_state! Event::Complete.new
94
- end
95
- end
96
- end # #transition_state!
97
-
98
67
  describe "#response=" do
99
68
  before do
100
69
  subject.request!
@@ -69,7 +69,7 @@ module Punchblock
69
69
  MSG
70
70
 
71
71
  connection.__send__ :handle_presence, example_complete
72
- say.event_queue.pop(false).source.should == say
72
+ say.complete_event.resource.source.should == say
73
73
 
74
74
  say.component_id.should == 'fgh4590'
75
75
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: punchblock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,12 +11,12 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2011-09-15 00:00:00.000000000 +01:00
14
+ date: 2011-09-21 00:00:00.000000000 +01:00
15
15
  default_executable:
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: niceogiri
19
- requirement: &2168880140 !ruby/object:Gem::Requirement
19
+ requirement: &2160644940 !ruby/object:Gem::Requirement
20
20
  none: false
21
21
  requirements:
22
22
  - - ! '>='
@@ -24,10 +24,10 @@ dependencies:
24
24
  version: 0.0.4
25
25
  type: :runtime
26
26
  prerelease: false
27
- version_requirements: *2168880140
27
+ version_requirements: *2160644940
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: blather
30
- requirement: &2168879620 !ruby/object:Gem::Requirement
30
+ requirement: &2160644340 !ruby/object:Gem::Requirement
31
31
  none: false
32
32
  requirements:
33
33
  - - ! '>='
@@ -35,10 +35,10 @@ dependencies:
35
35
  version: 0.5.3
36
36
  type: :runtime
37
37
  prerelease: false
38
- version_requirements: *2168879620
38
+ version_requirements: *2160644340
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: pry
41
- requirement: &2168879080 !ruby/object:Gem::Requirement
41
+ requirement: &2160643800 !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
44
44
  - - ! '>='
@@ -46,10 +46,10 @@ dependencies:
46
46
  version: 0.8.3
47
47
  type: :runtime
48
48
  prerelease: false
49
- version_requirements: *2168879080
49
+ version_requirements: *2160643800
50
50
  - !ruby/object:Gem::Dependency
51
51
  name: activesupport
52
- requirement: &2168878540 !ruby/object:Gem::Requirement
52
+ requirement: &2160643280 !ruby/object:Gem::Requirement
53
53
  none: false
54
54
  requirements:
55
55
  - - ! '>='
@@ -57,10 +57,10 @@ dependencies:
57
57
  version: 2.1.0
58
58
  type: :runtime
59
59
  prerelease: false
60
- version_requirements: *2168878540
60
+ version_requirements: *2160643280
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: state_machine
63
- requirement: &2168872980 !ruby/object:Gem::Requirement
63
+ requirement: &2160642700 !ruby/object:Gem::Requirement
64
64
  none: false
65
65
  requirements:
66
66
  - - ! '>='
@@ -68,10 +68,10 @@ dependencies:
68
68
  version: 1.0.1
69
69
  type: :runtime
70
70
  prerelease: false
71
- version_requirements: *2168872980
71
+ version_requirements: *2160642700
72
72
  - !ruby/object:Gem::Dependency
73
73
  name: future-resource
74
- requirement: &2168872440 !ruby/object:Gem::Requirement
74
+ requirement: &2160642220 !ruby/object:Gem::Requirement
75
75
  none: false
76
76
  requirements:
77
77
  - - ! '>='
@@ -79,10 +79,21 @@ dependencies:
79
79
  version: 0.0.2
80
80
  type: :runtime
81
81
  prerelease: false
82
- version_requirements: *2168872440
82
+ version_requirements: *2160642220
83
+ - !ruby/object:Gem::Dependency
84
+ name: has-guarded-handlers
85
+ requirement: &2160641740 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
90
+ version: 0.0.3
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: *2160641740
83
94
  - !ruby/object:Gem::Dependency
84
95
  name: bundler
85
- requirement: &2168871920 !ruby/object:Gem::Requirement
96
+ requirement: &2160641260 !ruby/object:Gem::Requirement
86
97
  none: false
87
98
  requirements:
88
99
  - - ~>
@@ -90,10 +101,10 @@ dependencies:
90
101
  version: 1.0.0
91
102
  type: :development
92
103
  prerelease: false
93
- version_requirements: *2168871920
104
+ version_requirements: *2160641260
94
105
  - !ruby/object:Gem::Dependency
95
106
  name: rspec
96
- requirement: &2168871320 !ruby/object:Gem::Requirement
107
+ requirement: &2160640780 !ruby/object:Gem::Requirement
97
108
  none: false
98
109
  requirements:
99
110
  - - ~>
@@ -101,10 +112,10 @@ dependencies:
101
112
  version: 2.3.0
102
113
  type: :development
103
114
  prerelease: false
104
- version_requirements: *2168871320
115
+ version_requirements: *2160640780
105
116
  - !ruby/object:Gem::Dependency
106
117
  name: ci_reporter
107
- requirement: &2168870720 !ruby/object:Gem::Requirement
118
+ requirement: &2160640260 !ruby/object:Gem::Requirement
108
119
  none: false
109
120
  requirements:
110
121
  - - ! '>='
@@ -112,10 +123,10 @@ dependencies:
112
123
  version: 1.6.3
113
124
  type: :development
114
125
  prerelease: false
115
- version_requirements: *2168870720
126
+ version_requirements: *2160640260
116
127
  - !ruby/object:Gem::Dependency
117
128
  name: yard
118
- requirement: &2168870120 !ruby/object:Gem::Requirement
129
+ requirement: &2160639760 !ruby/object:Gem::Requirement
119
130
  none: false
120
131
  requirements:
121
132
  - - ~>
@@ -123,10 +134,10 @@ dependencies:
123
134
  version: 0.6.0
124
135
  type: :development
125
136
  prerelease: false
126
- version_requirements: *2168870120
137
+ version_requirements: *2160639760
127
138
  - !ruby/object:Gem::Dependency
128
139
  name: bluecloth
129
- requirement: &2168869520 !ruby/object:Gem::Requirement
140
+ requirement: &2160639260 !ruby/object:Gem::Requirement
130
141
  none: false
131
142
  requirements:
132
143
  - - ! '>='
@@ -134,10 +145,10 @@ dependencies:
134
145
  version: '0'
135
146
  type: :development
136
147
  prerelease: false
137
- version_requirements: *2168869520
148
+ version_requirements: *2160639260
138
149
  - !ruby/object:Gem::Dependency
139
150
  name: rcov
140
- requirement: &2168868920 !ruby/object:Gem::Requirement
151
+ requirement: &2160638780 !ruby/object:Gem::Requirement
141
152
  none: false
142
153
  requirements:
143
154
  - - ! '>='
@@ -145,10 +156,10 @@ dependencies:
145
156
  version: '0'
146
157
  type: :development
147
158
  prerelease: false
148
- version_requirements: *2168868920
159
+ version_requirements: *2160638780
149
160
  - !ruby/object:Gem::Dependency
150
161
  name: rake
151
- requirement: &2168868320 !ruby/object:Gem::Requirement
162
+ requirement: &2160638280 !ruby/object:Gem::Requirement
152
163
  none: false
153
164
  requirements:
154
165
  - - ! '>='
@@ -156,10 +167,10 @@ dependencies:
156
167
  version: '0'
157
168
  type: :development
158
169
  prerelease: false
159
- version_requirements: *2168868320
170
+ version_requirements: *2160638280
160
171
  - !ruby/object:Gem::Dependency
161
172
  name: mocha
162
- requirement: &2168867720 !ruby/object:Gem::Requirement
173
+ requirement: &2160637800 !ruby/object:Gem::Requirement
163
174
  none: false
164
175
  requirements:
165
176
  - - ! '>='
@@ -167,10 +178,10 @@ dependencies:
167
178
  version: '0'
168
179
  type: :development
169
180
  prerelease: false
170
- version_requirements: *2168867720
181
+ version_requirements: *2160637800
171
182
  - !ruby/object:Gem::Dependency
172
183
  name: i18n
173
- requirement: &2168867240 !ruby/object:Gem::Requirement
184
+ requirement: &2160637300 !ruby/object:Gem::Requirement
174
185
  none: false
175
186
  requirements:
176
187
  - - ! '>='
@@ -178,10 +189,10 @@ dependencies:
178
189
  version: '0'
179
190
  type: :development
180
191
  prerelease: false
181
- version_requirements: *2168867240
192
+ version_requirements: *2160637300
182
193
  - !ruby/object:Gem::Dependency
183
194
  name: countdownlatch
184
- requirement: &2168866660 !ruby/object:Gem::Requirement
195
+ requirement: &2160636780 !ruby/object:Gem::Requirement
185
196
  none: false
186
197
  requirements:
187
198
  - - ! '>='
@@ -189,7 +200,7 @@ dependencies:
189
200
  version: '0'
190
201
  type: :development
191
202
  prerelease: false
192
- version_requirements: *2168866660
203
+ version_requirements: *2160636780
193
204
  description: Like Rack is to Rails and Sinatra, Punchblock provides a consistent API
194
205
  on top of several underlying third-party call control protocols.
195
206
  email: punchblock@adhearsion.com
@@ -201,6 +212,7 @@ files:
201
212
  - .document
202
213
  - .gitignore
203
214
  - .rspec
215
+ - CHANGELOG.md
204
216
  - Gemfile
205
217
  - LICENSE.txt
206
218
  - README.markdown