punchblock 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
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