punchblock 0.8.3 → 0.8.4

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