punchblock 0.8.3 → 0.8.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # develop
2
2
 
3
+ # v0.8.4 - 2012-01-19
4
+ * Bugfix: End, Ringing & Answered events are allowed to have headers
5
+ * Feature: Dial commands may have an optional timeout
6
+
3
7
  # v0.8.3 - 2012-01-17
4
8
  * Feature: Return an error when trying to execute a command for unknown calls/components or when not understood
5
9
  * Feature: Log calls/translator shutting down
@@ -55,6 +55,18 @@ module Punchblock
55
55
  write_attr :from, dial_from
56
56
  end
57
57
 
58
+ ##
59
+ # @return [Integer] timeout in milliseconds
60
+ def timeout
61
+ read_attr :timeout, :to_i
62
+ end
63
+
64
+ ##
65
+ # @param [Integer] other timeout in milliseconds
66
+ def timeout=(other)
67
+ write_attr :timeout, other
68
+ end
69
+
58
70
  ##
59
71
  # @return [Join] the nested join
60
72
  #
@@ -1,5 +1,15 @@
1
1
  module Punchblock
2
2
  class Event < RayoNode
3
+ def self.new(options = {})
4
+ super().tap do |new_node|
5
+ case options
6
+ when Nokogiri::XML::Node
7
+ new_node.inherit options
8
+ when Hash
9
+ options.each_pair { |k,v| new_node.send :"#{k}=", v }
10
+ end
11
+ end
12
+ end
3
13
  end
4
14
  end
5
15
 
@@ -2,6 +2,8 @@ module Punchblock
2
2
  class Event
3
3
  class Answered < Event
4
4
  register :answered, :core
5
+
6
+ include HasHeaders
5
7
  end # End
6
8
  end # Event
7
9
  end # Punchblock
@@ -3,25 +3,6 @@ module Punchblock
3
3
  class DTMF < Event
4
4
  register :dtmf, :core
5
5
 
6
- ##
7
- # Create a DTMF event
8
- #
9
- # @param [Hash] options
10
- # @option options [String, Optional] :signal the DTMF signal received
11
- #
12
- # @return [Event::DTMF] a formatted Rayo DTMF event
13
- #
14
- def self.new(options = {})
15
- super().tap do |new_node|
16
- case options
17
- when Nokogiri::XML::Node
18
- new_node.inherit options
19
- when Hash
20
- options.each_pair { |k,v| new_node.send :"#{k}=", v }
21
- end
22
- end
23
- end
24
-
25
6
  def signal
26
7
  read_attr :signal
27
8
  end
@@ -3,24 +3,7 @@ module Punchblock
3
3
  class End < Event
4
4
  register :end, :core
5
5
 
6
- ##
7
- # Create an End event
8
- #
9
- # @param [Hash] options
10
- # @option options [String, Optional] :reason the end reason
11
- #
12
- # @return [Event::End] a formatted Rayo end event
13
- #
14
- def self.new(options = {})
15
- super().tap do |new_node|
16
- case options
17
- when Nokogiri::XML::Node
18
- new_node.inherit options
19
- when Hash
20
- options.each_pair { |k,v| new_node.send :"#{k}=", v }
21
- end
22
- end
23
- end
6
+ include HasHeaders
24
7
 
25
8
  def reason
26
9
  children.select { |c| c.is_a? Nokogiri::XML::Element }.first.name.to_sym
@@ -3,21 +3,6 @@ module Punchblock
3
3
  class Joined < Event
4
4
  register :joined, :core
5
5
 
6
- ##
7
- # Create a joined event
8
- #
9
- # @param [Hash] options
10
- # @option options [String, Optional] :other_call_id the call ID that was joined
11
- # @option options [String, Optional] :mixer_name the mixer name that was joined
12
- #
13
- # @return [Event::Joined] a formatted Rayo joined event
14
- #
15
- def self.new(options = {})
16
- super().tap do |new_node|
17
- options.each_pair { |k,v| new_node.send :"#{k}=", v }
18
- end
19
- end
20
-
21
6
  ##
22
7
  # @return [String] the call ID that was joined
23
8
  def other_call_id
@@ -5,29 +5,6 @@ module Punchblock
5
5
 
6
6
  include HasHeaders
7
7
 
8
- ##
9
- # Create an Offer event
10
- #
11
- # @param [Hash] options
12
- # @option options [String, Optional] :to the call targed
13
- # @option options [String, Optional] :from the caller ID
14
- # @option options [Array[Header], Hash, Optional] :headers SIP headers to attach to
15
- # the call. Can be either a hash of key-value pairs, or an array of
16
- # Header objects.
17
- #
18
- # @return [Event::Offer] a formatted Rayo offer event
19
- #
20
- def self.new(options = {})
21
- super().tap do |new_node|
22
- case options
23
- when Nokogiri::XML::Node
24
- new_node.inherit options
25
- when Hash
26
- options.each_pair { |k,v| new_node.send :"#{k}=", v }
27
- end
28
- end
29
- end
30
-
31
8
  def to
32
9
  read_attr :to
33
10
  end
@@ -2,6 +2,8 @@ module Punchblock
2
2
  class Event
3
3
  class Ringing < Event
4
4
  register :ringing, :core
5
+
6
+ include HasHeaders
5
7
  end # End
6
8
  end # Event
7
9
  end # Punchblock
@@ -3,21 +3,6 @@ module Punchblock
3
3
  class Unjoined < Event
4
4
  register :unjoined, :core
5
5
 
6
- ##
7
- # Create an unjoined event
8
- #
9
- # @param [Hash] options
10
- # @option options [String, Optional] :other_call_id the call ID that was unjoined
11
- # @option options [String, Optional] :mixer_name the mixer name that was unjoined
12
- #
13
- # @return [Event::Unjoined] a formatted Rayo unjoined event
14
- #
15
- def self.new(options = {})
16
- super().tap do |new_node|
17
- options.each_pair { |k,v| new_node.send :"#{k}=", v }
18
- end
19
- end
20
-
21
6
  ##
22
7
  # @return [String] the call ID that was unjoined
23
8
  def other_call_id
@@ -1,3 +1,3 @@
1
1
  module Punchblock
2
- VERSION = "0.8.3"
2
+ VERSION = "0.8.4"
3
3
  end
@@ -1,11 +1,5 @@
1
1
  require 'spec_helper'
2
2
 
3
- %w{
4
- blather/client/dsl
5
- punchblock/core_ext/blather/stanza
6
- punchblock/core_ext/blather/stanza/presence
7
- }.each { |f| require f }
8
-
9
3
  module Punchblock
10
4
  module Command
11
5
  describe Dial do
@@ -17,19 +11,20 @@ module Punchblock
17
11
  let(:join_params) { {:other_call_id => 'abc123'} }
18
12
 
19
13
  describe "when setting options in initializer" do
20
- subject { Dial.new :to => 'tel:+14155551212', :from => 'tel:+13035551212', :headers => { :x_skill => 'agent', :x_customer_id => 8877 }, :join => join_params }
14
+ subject { Dial.new :to => 'tel:+14155551212', :from => 'tel:+13035551212', :timeout => 30000, :headers => { :x_skill => 'agent', :x_customer_id => 8877 }, :join => join_params }
21
15
 
22
16
  it_should_behave_like 'command_headers'
23
17
 
24
- its(:to) { should == 'tel:+14155551212' }
25
- its(:from) { should == 'tel:+13035551212' }
26
- its(:join) { should == Join.new(join_params) }
18
+ its(:to) { should == 'tel:+14155551212' }
19
+ its(:from) { should == 'tel:+13035551212' }
20
+ its(:timeout) { should == 30000 }
21
+ its(:join) { should == Join.new(join_params) }
27
22
  end
28
23
 
29
24
  describe "from a stanza" do
30
25
  let :stanza do
31
26
  <<-MESSAGE
32
- <dial to='tel:+14155551212' from='tel:+13035551212' xmlns='urn:xmpp:rayo:1'>
27
+ <dial to='tel:+14155551212' from='tel:+13035551212' timeout='30000' xmlns='urn:xmpp:rayo:1'>
33
28
  <join call-id="abc123" />
34
29
  <header name="x-skill" value="agent" />
35
30
  <header name="x-customer-id" value="8877" />
@@ -41,9 +36,10 @@ module Punchblock
41
36
 
42
37
  it { should be_instance_of Dial }
43
38
 
44
- its(:to) { should == 'tel:+14155551212' }
45
- its(:from) { should == 'tel:+13035551212' }
46
- its(:join) { should == Join.new(join_params) }
39
+ its(:to) { should == 'tel:+14155551212' }
40
+ its(:from) { should == 'tel:+13035551212' }
41
+ its(:timeout) { should == 30000 }
42
+ its(:join) { should == Join.new(join_params) }
47
43
  end
48
44
 
49
45
  describe "#response=" do
@@ -8,16 +8,33 @@ module Punchblock
8
8
  end
9
9
 
10
10
  describe "from a stanza" do
11
- let(:stanza) { '<answered xmlns="urn:xmpp:rayo:1"/>' }
11
+ let :stanza do
12
+ <<-MESSAGE
13
+ <answered xmlns='urn:xmpp:rayo:1'>
14
+ <!-- Signaling (e.g. SIP) Headers -->
15
+ <header name="x-skill" value="agent" />
16
+ <header name="x-customer-id" value="8877" />
17
+ </answered>
18
+ MESSAGE
19
+ end
12
20
 
13
21
  subject { RayoNode.import parse_stanza(stanza).root, '9f00061', '1' }
14
22
 
15
23
  it { should be_instance_of Answered }
16
24
 
17
25
  it_should_behave_like 'event'
26
+ it_should_behave_like 'event_headers'
18
27
 
19
28
  its(:xmlns) { should == 'urn:xmpp:rayo:1' }
20
29
  end
30
+
31
+ describe "when setting options in initializer" do
32
+ subject do
33
+ Answered.new :headers => { :x_skill => "agent", :x_customer_id => "8877" }
34
+ end
35
+
36
+ it_should_behave_like 'event_headers'
37
+ end
21
38
  end
22
39
  end
23
40
  end # Punchblock
@@ -12,6 +12,9 @@ module Punchblock
12
12
  <<-MESSAGE
13
13
  <end xmlns="urn:xmpp:rayo:1">
14
14
  <timeout />
15
+ <!-- Signaling (e.g. SIP) Headers -->
16
+ <header name="x-skill" value="agent" />
17
+ <header name="x-customer-id" value="8877" />
15
18
  </end>
16
19
  MESSAGE
17
20
  end
@@ -21,6 +24,7 @@ module Punchblock
21
24
  it { should be_instance_of End }
22
25
 
23
26
  it_should_behave_like 'event'
27
+ it_should_behave_like 'event_headers'
24
28
 
25
29
  its(:reason) { should == :timeout }
26
30
  its(:xmlns) { should == 'urn:xmpp:rayo:1' }
@@ -28,10 +32,12 @@ module Punchblock
28
32
 
29
33
  describe "when setting options in initializer" do
30
34
  subject do
31
- End.new :reason => :hangup
35
+ End.new :reason => :hangup,
36
+ :headers => { :x_skill => "agent", :x_customer_id => "8877" }
32
37
  end
33
38
 
34
39
  its(:reason) { should == :hangup }
40
+ it_should_behave_like 'event_headers'
35
41
  end
36
42
  end
37
43
  end
@@ -8,16 +8,33 @@ module Punchblock
8
8
  end
9
9
 
10
10
  describe "from a stanza" do
11
- let(:stanza) { '<ringing xmlns="urn:xmpp:rayo:1"/>' }
11
+ let :stanza do
12
+ <<-MESSAGE
13
+ <ringing xmlns='urn:xmpp:rayo:1'>
14
+ <!-- Signaling (e.g. SIP) Headers -->
15
+ <header name="x-skill" value="agent" />
16
+ <header name="x-customer-id" value="8877" />
17
+ </ringing>
18
+ MESSAGE
19
+ end
12
20
 
13
21
  subject { RayoNode.import parse_stanza(stanza).root, '9f00061', '1' }
14
22
 
15
23
  it { should be_instance_of Ringing }
16
24
 
17
25
  it_should_behave_like 'event'
26
+ it_should_behave_like 'event_headers'
18
27
 
19
28
  its(:xmlns) { should == 'urn:xmpp:rayo:1' }
20
29
  end
30
+
31
+ describe "when setting options in initializer" do
32
+ subject do
33
+ Ringing.new :headers => { :x_skill => "agent", :x_customer_id => "8877" }
34
+ end
35
+
36
+ it_should_behave_like 'event_headers'
37
+ end
21
38
  end
22
39
  end
23
40
  end # Punchblock
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.8.3
4
+ version: 0.8.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,11 +11,11 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-01-17 00:00:00.000000000 Z
14
+ date: 2012-01-19 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: niceogiri
18
- requirement: &2155905140 !ruby/object:Gem::Requirement
18
+ requirement: &2152348840 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ! '>='
@@ -23,10 +23,10 @@ dependencies:
23
23
  version: 0.0.4
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *2155905140
26
+ version_requirements: *2152348840
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: blather
29
- requirement: &2155903300 !ruby/object:Gem::Requirement
29
+ requirement: &2152347280 !ruby/object:Gem::Requirement
30
30
  none: false
31
31
  requirements:
32
32
  - - ! '>='
@@ -34,10 +34,10 @@ dependencies:
34
34
  version: 0.5.12
35
35
  type: :runtime
36
36
  prerelease: false
37
- version_requirements: *2155903300
37
+ version_requirements: *2152347280
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: activesupport
40
- requirement: &2155901420 !ruby/object:Gem::Requirement
40
+ requirement: &2152345280 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ! '>='
@@ -45,10 +45,10 @@ dependencies:
45
45
  version: 2.1.0
46
46
  type: :runtime
47
47
  prerelease: false
48
- version_requirements: *2155901420
48
+ version_requirements: *2152345280
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: state_machine
51
- requirement: &2168536880 !ruby/object:Gem::Requirement
51
+ requirement: &2152344340 !ruby/object:Gem::Requirement
52
52
  none: false
53
53
  requirements:
54
54
  - - ! '>='
@@ -56,10 +56,10 @@ dependencies:
56
56
  version: 1.0.1
57
57
  type: :runtime
58
58
  prerelease: false
59
- version_requirements: *2168536880
59
+ version_requirements: *2152344340
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: future-resource
62
- requirement: &2168535180 !ruby/object:Gem::Requirement
62
+ requirement: &2156165100 !ruby/object:Gem::Requirement
63
63
  none: false
64
64
  requirements:
65
65
  - - ! '>='
@@ -67,10 +67,10 @@ dependencies:
67
67
  version: 0.0.2
68
68
  type: :runtime
69
69
  prerelease: false
70
- version_requirements: *2168535180
70
+ version_requirements: *2156165100
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: has-guarded-handlers
73
- requirement: &2168531860 !ruby/object:Gem::Requirement
73
+ requirement: &2156161800 !ruby/object:Gem::Requirement
74
74
  none: false
75
75
  requirements:
76
76
  - - ! '>='
@@ -78,10 +78,10 @@ dependencies:
78
78
  version: 0.1.0
79
79
  type: :runtime
80
80
  prerelease: false
81
- version_requirements: *2168531860
81
+ version_requirements: *2156161800
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: celluloid
84
- requirement: &2168527860 !ruby/object:Gem::Requirement
84
+ requirement: &2156160660 !ruby/object:Gem::Requirement
85
85
  none: false
86
86
  requirements:
87
87
  - - ! '>='
@@ -89,10 +89,10 @@ dependencies:
89
89
  version: 0.6.0
90
90
  type: :runtime
91
91
  prerelease: false
92
- version_requirements: *2168527860
92
+ version_requirements: *2156160660
93
93
  - !ruby/object:Gem::Dependency
94
94
  name: ruby_ami
95
- requirement: &2168526320 !ruby/object:Gem::Requirement
95
+ requirement: &2156158320 !ruby/object:Gem::Requirement
96
96
  none: false
97
97
  requirements:
98
98
  - - ! '>='
@@ -100,10 +100,10 @@ dependencies:
100
100
  version: 0.1.3
101
101
  type: :runtime
102
102
  prerelease: false
103
- version_requirements: *2168526320
103
+ version_requirements: *2156158320
104
104
  - !ruby/object:Gem::Dependency
105
105
  name: ruby_speech
106
- requirement: &2168524860 !ruby/object:Gem::Requirement
106
+ requirement: &2156144520 !ruby/object:Gem::Requirement
107
107
  none: false
108
108
  requirements:
109
109
  - - ! '>='
@@ -111,10 +111,10 @@ dependencies:
111
111
  version: 0.5.1
112
112
  type: :runtime
113
113
  prerelease: false
114
- version_requirements: *2168524860
114
+ version_requirements: *2156144520
115
115
  - !ruby/object:Gem::Dependency
116
116
  name: bundler
117
- requirement: &2168523980 !ruby/object:Gem::Requirement
117
+ requirement: &2156142420 !ruby/object:Gem::Requirement
118
118
  none: false
119
119
  requirements:
120
120
  - - ~>
@@ -122,10 +122,10 @@ dependencies:
122
122
  version: 1.0.0
123
123
  type: :development
124
124
  prerelease: false
125
- version_requirements: *2168523980
125
+ version_requirements: *2156142420
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: rspec
128
- requirement: &2168522200 !ruby/object:Gem::Requirement
128
+ requirement: &2156139000 !ruby/object:Gem::Requirement
129
129
  none: false
130
130
  requirements:
131
131
  - - ~>
@@ -133,10 +133,10 @@ dependencies:
133
133
  version: 2.7.0
134
134
  type: :development
135
135
  prerelease: false
136
- version_requirements: *2168522200
136
+ version_requirements: *2156139000
137
137
  - !ruby/object:Gem::Dependency
138
138
  name: ci_reporter
139
- requirement: &2168516560 !ruby/object:Gem::Requirement
139
+ requirement: &2156137680 !ruby/object:Gem::Requirement
140
140
  none: false
141
141
  requirements:
142
142
  - - ! '>='
@@ -144,10 +144,10 @@ dependencies:
144
144
  version: 1.6.3
145
145
  type: :development
146
146
  prerelease: false
147
- version_requirements: *2168516560
147
+ version_requirements: *2156137680
148
148
  - !ruby/object:Gem::Dependency
149
149
  name: yard
150
- requirement: &2168515600 !ruby/object:Gem::Requirement
150
+ requirement: &2156134180 !ruby/object:Gem::Requirement
151
151
  none: false
152
152
  requirements:
153
153
  - - ~>
@@ -155,10 +155,10 @@ dependencies:
155
155
  version: 0.6.0
156
156
  type: :development
157
157
  prerelease: false
158
- version_requirements: *2168515600
158
+ version_requirements: *2156134180
159
159
  - !ruby/object:Gem::Dependency
160
160
  name: rcov
161
- requirement: &2168475680 !ruby/object:Gem::Requirement
161
+ requirement: &2156132420 !ruby/object:Gem::Requirement
162
162
  none: false
163
163
  requirements:
164
164
  - - ! '>='
@@ -166,10 +166,10 @@ dependencies:
166
166
  version: '0'
167
167
  type: :development
168
168
  prerelease: false
169
- version_requirements: *2168475680
169
+ version_requirements: *2156132420
170
170
  - !ruby/object:Gem::Dependency
171
171
  name: rake
172
- requirement: &2168496000 !ruby/object:Gem::Requirement
172
+ requirement: &2156131300 !ruby/object:Gem::Requirement
173
173
  none: false
174
174
  requirements:
175
175
  - - ! '>='
@@ -177,10 +177,10 @@ dependencies:
177
177
  version: '0'
178
178
  type: :development
179
179
  prerelease: false
180
- version_requirements: *2168496000
180
+ version_requirements: *2156131300
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: mocha
183
- requirement: &2152431080 !ruby/object:Gem::Requirement
183
+ requirement: &2156129300 !ruby/object:Gem::Requirement
184
184
  none: false
185
185
  requirements:
186
186
  - - ! '>='
@@ -188,10 +188,10 @@ dependencies:
188
188
  version: '0'
189
189
  type: :development
190
190
  prerelease: false
191
- version_requirements: *2152431080
191
+ version_requirements: *2156129300
192
192
  - !ruby/object:Gem::Dependency
193
193
  name: i18n
194
- requirement: &2152427440 !ruby/object:Gem::Requirement
194
+ requirement: &2156120240 !ruby/object:Gem::Requirement
195
195
  none: false
196
196
  requirements:
197
197
  - - ! '>='
@@ -199,10 +199,10 @@ dependencies:
199
199
  version: '0'
200
200
  type: :development
201
201
  prerelease: false
202
- version_requirements: *2152427440
202
+ version_requirements: *2156120240
203
203
  - !ruby/object:Gem::Dependency
204
204
  name: countdownlatch
205
- requirement: &2152370940 !ruby/object:Gem::Requirement
205
+ requirement: &2156117560 !ruby/object:Gem::Requirement
206
206
  none: false
207
207
  requirements:
208
208
  - - ! '>='
@@ -210,10 +210,10 @@ dependencies:
210
210
  version: '0'
211
211
  type: :development
212
212
  prerelease: false
213
- version_requirements: *2152370940
213
+ version_requirements: *2156117560
214
214
  - !ruby/object:Gem::Dependency
215
215
  name: guard-rspec
216
- requirement: &2152361220 !ruby/object:Gem::Requirement
216
+ requirement: &2156075180 !ruby/object:Gem::Requirement
217
217
  none: false
218
218
  requirements:
219
219
  - - ! '>='
@@ -221,7 +221,7 @@ dependencies:
221
221
  version: '0'
222
222
  type: :development
223
223
  prerelease: false
224
- version_requirements: *2152361220
224
+ version_requirements: *2156075180
225
225
  description: Like Rack is to Rails and Sinatra, Punchblock provides a consistent API
226
226
  on top of several underlying third-party call control protocols.
227
227
  email: punchblock@adhearsion.com
@@ -364,7 +364,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
364
364
  version: '0'
365
365
  segments:
366
366
  - 0
367
- hash: 243839831400829248
367
+ hash: -2039809251711287548
368
368
  required_rubygems_version: !ruby/object:Gem::Requirement
369
369
  none: false
370
370
  requirements: