punchblock 0.4.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +3 -0
- data/bin/punchblock-console +11 -10
- data/lib/punchblock.rb +2 -1
- data/lib/punchblock/client.rb +64 -0
- data/lib/punchblock/client/component_registry.rb +22 -0
- data/lib/punchblock/command/dial.rb +1 -4
- data/lib/punchblock/component.rb +6 -8
- data/lib/punchblock/connection.rb +4 -206
- data/lib/punchblock/connection/connected.rb +15 -0
- data/lib/punchblock/connection/xmpp.rb +161 -0
- data/lib/punchblock/dsl.rb +4 -4
- data/lib/punchblock/rayo_node.rb +2 -2
- data/lib/punchblock/version.rb +1 -1
- data/punchblock.gemspec +1 -1
- data/spec/punchblock/client/component_registry_spec.rb +15 -0
- data/spec/punchblock/client_spec.rb +125 -0
- data/spec/punchblock/command/dial_spec.rb +1 -8
- data/spec/punchblock/component/input_spec.rb +3 -2
- data/spec/punchblock/component/output_spec.rb +10 -9
- data/spec/punchblock/component/record_spec.rb +5 -4
- data/spec/punchblock/component/tropo/ask_spec.rb +3 -2
- data/spec/punchblock/component/tropo/conference_spec.rb +6 -5
- data/spec/punchblock/component/tropo/say_spec.rb +5 -4
- data/spec/punchblock/component/tropo/transfer_spec.rb +3 -2
- data/spec/punchblock/component_spec.rb +3 -9
- data/spec/punchblock/connection/xmpp_spec.rb +201 -0
- metadata +45 -38
- data/lib/punchblock/generic_connection.rb +0 -18
- data/spec/punchblock/connection_spec.rb +0 -216
@@ -28,12 +28,13 @@ module Punchblock
|
|
28
28
|
end
|
29
29
|
|
30
30
|
describe "actions" do
|
31
|
+
let(:mock_client) { mock 'Client' }
|
31
32
|
let(:command) { Record.new }
|
32
33
|
|
33
34
|
before do
|
34
35
|
command.component_id = 'abc123'
|
35
36
|
command.call_id = '123abc'
|
36
|
-
command.
|
37
|
+
command.client = mock_client
|
37
38
|
end
|
38
39
|
|
39
40
|
describe '#pause_action' do
|
@@ -52,7 +53,7 @@ module Punchblock
|
|
52
53
|
end
|
53
54
|
|
54
55
|
it "should send its command properly" do
|
55
|
-
|
56
|
+
mock_client.expects(:execute_command).with(command.pause_action, :call_id => '123abc', :component_id => 'abc123').returns true
|
56
57
|
command.expects :paused!
|
57
58
|
command.pause!
|
58
59
|
end
|
@@ -96,7 +97,7 @@ module Punchblock
|
|
96
97
|
end
|
97
98
|
|
98
99
|
it "should send its command properly" do
|
99
|
-
|
100
|
+
mock_client.expects(:execute_command).with(command.resume_action, :call_id => '123abc', :component_id => 'abc123').returns true
|
100
101
|
command.expects :resumed!
|
101
102
|
command.resume!
|
102
103
|
end
|
@@ -140,7 +141,7 @@ module Punchblock
|
|
140
141
|
end
|
141
142
|
|
142
143
|
it "should send its command properly" do
|
143
|
-
|
144
|
+
mock_client.expects(:execute_command).with(command.stop_action, :call_id => '123abc', :component_id => 'abc123')
|
144
145
|
command.stop!
|
145
146
|
end
|
146
147
|
end
|
@@ -86,12 +86,13 @@ module Punchblock
|
|
86
86
|
end
|
87
87
|
|
88
88
|
describe "actions" do
|
89
|
+
let(:mock_client) { mock 'Client' }
|
89
90
|
let(:command) { Ask.new :choices => '[5 DIGITS]' }
|
90
91
|
|
91
92
|
before do
|
92
93
|
command.component_id = 'abc123'
|
93
94
|
command.call_id = '123abc'
|
94
|
-
command.
|
95
|
+
command.client = mock_client
|
95
96
|
end
|
96
97
|
|
97
98
|
describe '#stop_action' do
|
@@ -110,7 +111,7 @@ module Punchblock
|
|
110
111
|
end
|
111
112
|
|
112
113
|
it "should send its command properly" do
|
113
|
-
|
114
|
+
mock_client.expects(:execute_command).with(command.stop_action, :call_id => '123abc', :component_id => 'abc123')
|
114
115
|
command.stop!
|
115
116
|
end
|
116
117
|
end
|
@@ -96,12 +96,13 @@ module Punchblock
|
|
96
96
|
end
|
97
97
|
|
98
98
|
describe "actions" do
|
99
|
+
let(:mock_client) { mock 'Client' }
|
99
100
|
let(:conference) { Conference.new :name => '1234' }
|
100
101
|
|
101
102
|
before do
|
102
103
|
conference.component_id = 'abc123'
|
103
104
|
conference.call_id = '123abc'
|
104
|
-
conference.
|
105
|
+
conference.client = mock_client
|
105
106
|
end
|
106
107
|
|
107
108
|
describe '#mute_action' do
|
@@ -120,7 +121,7 @@ module Punchblock
|
|
120
121
|
end
|
121
122
|
|
122
123
|
it "should send its command properly" do
|
123
|
-
|
124
|
+
mock_client.expects(:execute_command).with(conference.mute_action, :call_id => '123abc', :component_id => 'abc123').returns true
|
124
125
|
conference.expects :muted!
|
125
126
|
conference.mute!
|
126
127
|
end
|
@@ -169,7 +170,7 @@ module Punchblock
|
|
169
170
|
end
|
170
171
|
|
171
172
|
it "should send its command properly" do
|
172
|
-
|
173
|
+
mock_client.expects(:execute_command).with(conference.unmute_action, :call_id => '123abc', :component_id => 'abc123').returns true
|
173
174
|
conference.expects :unmuted!
|
174
175
|
conference.unmute!
|
175
176
|
end
|
@@ -213,7 +214,7 @@ module Punchblock
|
|
213
214
|
end
|
214
215
|
|
215
216
|
it "should send its command properly" do
|
216
|
-
|
217
|
+
mock_client.expects(:execute_command).with(conference.stop_action, :call_id => '123abc', :component_id => 'abc123')
|
217
218
|
conference.stop!
|
218
219
|
end
|
219
220
|
end
|
@@ -241,7 +242,7 @@ module Punchblock
|
|
241
242
|
end
|
242
243
|
|
243
244
|
it "should send its command properly" do
|
244
|
-
|
245
|
+
mock_client.expects(:execute_command).with(conference.kick_action(:message => 'bye!'), :call_id => '123abc', :component_id => 'abc123')
|
245
246
|
conference.kick! :message => 'bye!'
|
246
247
|
end
|
247
248
|
end
|
@@ -25,12 +25,13 @@ module Punchblock
|
|
25
25
|
end
|
26
26
|
|
27
27
|
describe "actions" do
|
28
|
+
let(:mock_client) { mock 'Client' }
|
28
29
|
let(:command) { Say.new :text => 'Once upon a time there was a message...', :voice => 'kate' }
|
29
30
|
|
30
31
|
before do
|
31
32
|
command.component_id = 'abc123'
|
32
33
|
command.call_id = '123abc'
|
33
|
-
command.
|
34
|
+
command.client = mock_client
|
34
35
|
end
|
35
36
|
|
36
37
|
describe '#pause_action' do
|
@@ -49,7 +50,7 @@ module Punchblock
|
|
49
50
|
end
|
50
51
|
|
51
52
|
it "should send its command properly" do
|
52
|
-
|
53
|
+
mock_client.expects(:execute_command).with(command.pause_action, :call_id => '123abc', :component_id => 'abc123').returns true
|
53
54
|
command.expects :paused!
|
54
55
|
command.pause!
|
55
56
|
end
|
@@ -93,7 +94,7 @@ module Punchblock
|
|
93
94
|
end
|
94
95
|
|
95
96
|
it "should send its command properly" do
|
96
|
-
|
97
|
+
mock_client.expects(:execute_command).with(command.resume_action, :call_id => '123abc', :component_id => 'abc123').returns true
|
97
98
|
command.expects :resumed!
|
98
99
|
command.resume!
|
99
100
|
end
|
@@ -137,7 +138,7 @@ module Punchblock
|
|
137
138
|
end
|
138
139
|
|
139
140
|
it "should send its command properly" do
|
140
|
-
|
141
|
+
mock_client.expects(:execute_command).with(command.stop_action, :call_id => '123abc', :component_id => 'abc123')
|
141
142
|
command.stop!
|
142
143
|
end
|
143
144
|
end
|
@@ -32,12 +32,13 @@ module Punchblock
|
|
32
32
|
end
|
33
33
|
|
34
34
|
describe "actions" do
|
35
|
+
let(:mock_client) { mock 'Client' }
|
35
36
|
let(:command) { Transfer.new :to => 'tel:+14045551212', :from => 'tel:+14155551212' }
|
36
37
|
|
37
38
|
before do
|
38
39
|
command.component_id = 'abc123'
|
39
40
|
command.call_id = '123abc'
|
40
|
-
command.
|
41
|
+
command.client = mock_client
|
41
42
|
end
|
42
43
|
|
43
44
|
describe '#stop_action' do
|
@@ -56,7 +57,7 @@ module Punchblock
|
|
56
57
|
end
|
57
58
|
|
58
59
|
it "should send its command properly" do
|
59
|
-
|
60
|
+
mock_client.expects(:execute_command).with(command.stop_action, :call_id => '123abc', :component_id => 'abc123')
|
60
61
|
command.stop!
|
61
62
|
end
|
62
63
|
end
|
@@ -67,7 +67,7 @@ module Punchblock
|
|
67
67
|
describe "#response=" do
|
68
68
|
before do
|
69
69
|
subject.request!
|
70
|
-
subject.
|
70
|
+
subject.client = Client.new
|
71
71
|
end
|
72
72
|
|
73
73
|
let(:component_id) { 'abc123' }
|
@@ -78,16 +78,10 @@ module Punchblock
|
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
-
let :iq do
|
82
|
-
Blather::Stanza::Iq.new(:result, 'blah').tap do |iq|
|
83
|
-
iq.from = "12345@call.rayo.net"
|
84
|
-
iq << ref
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
81
|
it "should set the component ID from the ref" do
|
89
|
-
subject.response =
|
82
|
+
subject.response = ref
|
90
83
|
subject.component_id.should == component_id
|
84
|
+
subject.client.find_component_by_id(component_id).should be subject
|
91
85
|
end
|
92
86
|
end
|
93
87
|
end # ComponentNode
|
@@ -0,0 +1,201 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Punchblock
|
4
|
+
module Connection
|
5
|
+
describe XMPP do
|
6
|
+
let(:connection) { XMPP.new :username => '1@call.rayo.net', :password => 1 }
|
7
|
+
|
8
|
+
let(:mock_event_handler) { stub_everything 'Event Handler' }
|
9
|
+
|
10
|
+
before do
|
11
|
+
connection.event_handler = mock_event_handler
|
12
|
+
end
|
13
|
+
|
14
|
+
subject { connection }
|
15
|
+
|
16
|
+
it 'should require a username and password to be passed in the options' do
|
17
|
+
expect { XMPP.new :password => 1 }.to raise_error ArgumentError
|
18
|
+
expect { XMPP.new :username => 1 }.to raise_error ArgumentError
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should properly set the Blather logger' do
|
22
|
+
XMPP.new :wire_logger => :foo, :username => 1, :password => 1
|
23
|
+
Blather.logger.should be :foo
|
24
|
+
end
|
25
|
+
|
26
|
+
it "looking up original command by command ID" do
|
27
|
+
pending
|
28
|
+
offer = Event::Offer.new
|
29
|
+
offer.call_id = '9f00061'
|
30
|
+
offer.to = 'sip:whatever@127.0.0.1'
|
31
|
+
say = <<-MSG
|
32
|
+
<say xmlns='urn:xmpp:tropo:say:1' voice='allison'>
|
33
|
+
<audio url='http://acme.com/greeting.mp3'>
|
34
|
+
Thanks for calling ACME company
|
35
|
+
</audio>
|
36
|
+
<audio url='http://acme.com/package-shipped.mp3'>
|
37
|
+
Your package was shipped on
|
38
|
+
</audio>
|
39
|
+
<say-as interpret-as='date'>12/01/2011</say-as>
|
40
|
+
</say>
|
41
|
+
MSG
|
42
|
+
Component::Tropo::Say
|
43
|
+
say = RayoNode.import parse_stanza(say).root
|
44
|
+
connection.expects(:write_to_stream).once.returns true
|
45
|
+
iq = Blather::Stanza::Iq.new :set, '9f00061@call.rayo.net'
|
46
|
+
connection.expects(:create_iq).returns iq
|
47
|
+
|
48
|
+
write_thread = Thread.new do
|
49
|
+
connection.write offer.call_id, say
|
50
|
+
end
|
51
|
+
|
52
|
+
result = import_stanza <<-MSG
|
53
|
+
<iq type='result' from='16577@app.rayo.net/1' to='9f00061@call.rayo.net/1' id='#{iq.id}'>
|
54
|
+
<ref id='fgh4590' xmlns='urn:xmpp:rayo:1' />
|
55
|
+
</iq>
|
56
|
+
MSG
|
57
|
+
|
58
|
+
sleep 0.5 # Block so there's enough time for the write thread to get to the point where it's waiting on an IQ
|
59
|
+
|
60
|
+
connection.__send__ :handle_iq_result, result
|
61
|
+
|
62
|
+
write_thread.join
|
63
|
+
|
64
|
+
say.state_name.should == :executing
|
65
|
+
|
66
|
+
connection.original_component_from_id('fgh4590').should == say
|
67
|
+
|
68
|
+
example_complete = import_stanza <<-MSG
|
69
|
+
<presence to='16577@app.rayo.net/1' from='9f00061@call.rayo.net/fgh4590'>
|
70
|
+
<complete xmlns='urn:xmpp:rayo:ext:1'>
|
71
|
+
<success xmlns='urn:xmpp:tropo:say:complete:1' />
|
72
|
+
</complete>
|
73
|
+
</presence>
|
74
|
+
MSG
|
75
|
+
|
76
|
+
connection.__send__ :handle_presence, example_complete
|
77
|
+
say.complete_event.resource.source.should == say
|
78
|
+
|
79
|
+
say.component_id.should == 'fgh4590'
|
80
|
+
end
|
81
|
+
|
82
|
+
describe '#handle_presence' do
|
83
|
+
let :offer_xml do
|
84
|
+
<<-MSG
|
85
|
+
<presence to='16577@app.rayo.net/1' from='9f00061@call.rayo.net'>
|
86
|
+
<offer xmlns="urn:xmpp:rayo:1" to="sip:whatever@127.0.0.1" from="sip:ylcaomxb@192.168.1.9">
|
87
|
+
<header name="Max-Forwards" value="70"/>
|
88
|
+
<header name="Content-Length" value="367"/>
|
89
|
+
</offer>
|
90
|
+
</presence>
|
91
|
+
MSG
|
92
|
+
end
|
93
|
+
|
94
|
+
let(:example_offer) { import_stanza offer_xml }
|
95
|
+
|
96
|
+
it { example_offer.should be_a Blather::Stanza::Presence }
|
97
|
+
|
98
|
+
let :complete_xml do
|
99
|
+
<<-MSG
|
100
|
+
<presence to='16577@app.rayo.net/1' from='9f00061@call.rayo.net/fgh4590'>
|
101
|
+
<complete xmlns='urn:xmpp:rayo:ext:1'>
|
102
|
+
<success xmlns='urn:xmpp:tropo:say:complete:1' />
|
103
|
+
</complete>
|
104
|
+
</presence>
|
105
|
+
MSG
|
106
|
+
end
|
107
|
+
|
108
|
+
let(:example_complete) { import_stanza complete_xml }
|
109
|
+
|
110
|
+
it { example_complete.should be_a Blather::Stanza::Presence }
|
111
|
+
|
112
|
+
describe "presence received" do
|
113
|
+
describe "from an offer" do
|
114
|
+
let(:handle_presence) { connection.__send__ :handle_presence, example_offer }
|
115
|
+
|
116
|
+
it 'should call the event handler with the event' do
|
117
|
+
mock_event_handler.expects(:call).once.with do |event|
|
118
|
+
event.should be_instance_of Event::Offer
|
119
|
+
event.call_id.should == '9f00061'
|
120
|
+
end
|
121
|
+
handle_presence
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should populate the call map with the domain for the call ID" do
|
125
|
+
handle_presence
|
126
|
+
callmap = connection.instance_variable_get(:'@callmap')
|
127
|
+
callmap['9f00061'].should == 'call.rayo.net'
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe "from something that's not a real event" do
|
132
|
+
let :irrelevant_xml do
|
133
|
+
<<-MSG
|
134
|
+
<presence to='16577@app.rayo.net/1' from='9f00061@call.rayo.net/fgh4590'>
|
135
|
+
<foo/>
|
136
|
+
</presence>
|
137
|
+
MSG
|
138
|
+
end
|
139
|
+
|
140
|
+
let(:example_irrelevant_event) { import_stanza irrelevant_xml }
|
141
|
+
|
142
|
+
it 'should not handle the event' do
|
143
|
+
mock_event_handler.expects(:call).never
|
144
|
+
lambda { connection.__send__ :handle_presence, example_irrelevant_event }.should throw_symbol(:pass)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe "from someone other than the rayo domain" do
|
149
|
+
let :irrelevant_xml do
|
150
|
+
<<-MSG
|
151
|
+
<presence to='16577@app.rayo.net/1' from='9f00061@jabber.org/fgh4590'>
|
152
|
+
<complete xmlns='urn:xmpp:rayo:ext:1'>
|
153
|
+
<success xmlns='urn:xmpp:tropo:say:complete:1' />
|
154
|
+
</complete>
|
155
|
+
</presence>
|
156
|
+
MSG
|
157
|
+
end
|
158
|
+
|
159
|
+
let(:example_irrelevant_event) { import_stanza irrelevant_xml }
|
160
|
+
|
161
|
+
it 'should not handle the event' do
|
162
|
+
mock_event_handler.expects(:call).never
|
163
|
+
lambda { connection.__send__ :handle_presence, example_irrelevant_event }.should throw_symbol(:pass)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
describe "#handle_error" do
|
170
|
+
let(:call_id) { "f6d437f4-1e18-457b-99f8-b5d853f50347" }
|
171
|
+
let(:component_id) { 'abc123' }
|
172
|
+
let :error_xml do
|
173
|
+
<<-MSG
|
174
|
+
<iq type="error" id="blather000e" from="f6d437f4-1e18-457b-99f8-b5d853f50347@10.0.1.11/abc123" to="usera@10.0.1.11/voxeo">
|
175
|
+
<output xmlns="urn:xmpp:rayo:output:1"/>
|
176
|
+
<error type="cancel">
|
177
|
+
<item-not-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
|
178
|
+
<text xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" lang="en">Could not find call [id=f6d437f4-1e18-457b-99f8-b5d853f50347]</text>
|
179
|
+
</error>
|
180
|
+
</iq>
|
181
|
+
MSG
|
182
|
+
end
|
183
|
+
|
184
|
+
let(:example_error) { import_stanza error_xml }
|
185
|
+
let(:cmd) { Component::Output.new }
|
186
|
+
|
187
|
+
before(:all) do
|
188
|
+
cmd.request!
|
189
|
+
connection.__send__ :handle_error, example_error, cmd
|
190
|
+
end
|
191
|
+
|
192
|
+
subject { cmd.response }
|
193
|
+
|
194
|
+
its(:call_id) { should == call_id }
|
195
|
+
its(:component_id) { should == component_id }
|
196
|
+
its(:name) { should == :item_not_found }
|
197
|
+
its(:text) { should == 'Could not find call [id=f6d437f4-1e18-457b-99f8-b5d853f50347]' }
|
198
|
+
end
|
199
|
+
end # describe XMPP
|
200
|
+
end # XMPP
|
201
|
+
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.
|
4
|
+
version: 0.5.0
|
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-
|
14
|
+
date: 2011-10-30 01:00:00.000000000 +01:00
|
15
15
|
default_executable:
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: niceogiri
|
19
|
-
requirement: &
|
19
|
+
requirement: &2160230400 !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: *
|
27
|
+
version_requirements: *2160230400
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: blather
|
30
|
-
requirement: &
|
30
|
+
requirement: &2160229160 !ruby/object:Gem::Requirement
|
31
31
|
none: false
|
32
32
|
requirements:
|
33
33
|
- - ! '>='
|
@@ -35,10 +35,10 @@ dependencies:
|
|
35
35
|
version: 0.5.7
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
|
-
version_requirements: *
|
38
|
+
version_requirements: *2160229160
|
39
39
|
- !ruby/object:Gem::Dependency
|
40
40
|
name: pry
|
41
|
-
requirement: &
|
41
|
+
requirement: &2160227940 !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: *
|
49
|
+
version_requirements: *2160227940
|
50
50
|
- !ruby/object:Gem::Dependency
|
51
51
|
name: activesupport
|
52
|
-
requirement: &
|
52
|
+
requirement: &2160227180 !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: *
|
60
|
+
version_requirements: *2160227180
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
62
|
name: state_machine
|
63
|
-
requirement: &
|
63
|
+
requirement: &2160224320 !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: *
|
71
|
+
version_requirements: *2160224320
|
72
72
|
- !ruby/object:Gem::Dependency
|
73
73
|
name: future-resource
|
74
|
-
requirement: &
|
74
|
+
requirement: &2160223240 !ruby/object:Gem::Requirement
|
75
75
|
none: false
|
76
76
|
requirements:
|
77
77
|
- - ! '>='
|
@@ -79,21 +79,21 @@ dependencies:
|
|
79
79
|
version: 0.0.2
|
80
80
|
type: :runtime
|
81
81
|
prerelease: false
|
82
|
-
version_requirements: *
|
82
|
+
version_requirements: *2160223240
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: has-guarded-handlers
|
85
|
-
requirement: &
|
85
|
+
requirement: &2160205020 !ruby/object:Gem::Requirement
|
86
86
|
none: false
|
87
87
|
requirements:
|
88
88
|
- - ! '>='
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version: 0.0
|
90
|
+
version: 0.1.0
|
91
91
|
type: :runtime
|
92
92
|
prerelease: false
|
93
|
-
version_requirements: *
|
93
|
+
version_requirements: *2160205020
|
94
94
|
- !ruby/object:Gem::Dependency
|
95
95
|
name: bundler
|
96
|
-
requirement: &
|
96
|
+
requirement: &2160197900 !ruby/object:Gem::Requirement
|
97
97
|
none: false
|
98
98
|
requirements:
|
99
99
|
- - ~>
|
@@ -101,10 +101,10 @@ dependencies:
|
|
101
101
|
version: 1.0.0
|
102
102
|
type: :development
|
103
103
|
prerelease: false
|
104
|
-
version_requirements: *
|
104
|
+
version_requirements: *2160197900
|
105
105
|
- !ruby/object:Gem::Dependency
|
106
106
|
name: rspec
|
107
|
-
requirement: &
|
107
|
+
requirement: &2160196940 !ruby/object:Gem::Requirement
|
108
108
|
none: false
|
109
109
|
requirements:
|
110
110
|
- - ~>
|
@@ -112,10 +112,10 @@ dependencies:
|
|
112
112
|
version: 2.3.0
|
113
113
|
type: :development
|
114
114
|
prerelease: false
|
115
|
-
version_requirements: *
|
115
|
+
version_requirements: *2160196940
|
116
116
|
- !ruby/object:Gem::Dependency
|
117
117
|
name: ci_reporter
|
118
|
-
requirement: &
|
118
|
+
requirement: &2160186300 !ruby/object:Gem::Requirement
|
119
119
|
none: false
|
120
120
|
requirements:
|
121
121
|
- - ! '>='
|
@@ -123,10 +123,10 @@ dependencies:
|
|
123
123
|
version: 1.6.3
|
124
124
|
type: :development
|
125
125
|
prerelease: false
|
126
|
-
version_requirements: *
|
126
|
+
version_requirements: *2160186300
|
127
127
|
- !ruby/object:Gem::Dependency
|
128
128
|
name: yard
|
129
|
-
requirement: &
|
129
|
+
requirement: &2160181420 !ruby/object:Gem::Requirement
|
130
130
|
none: false
|
131
131
|
requirements:
|
132
132
|
- - ~>
|
@@ -134,10 +134,10 @@ dependencies:
|
|
134
134
|
version: 0.6.0
|
135
135
|
type: :development
|
136
136
|
prerelease: false
|
137
|
-
version_requirements: *
|
137
|
+
version_requirements: *2160181420
|
138
138
|
- !ruby/object:Gem::Dependency
|
139
139
|
name: rcov
|
140
|
-
requirement: &
|
140
|
+
requirement: &2160178780 !ruby/object:Gem::Requirement
|
141
141
|
none: false
|
142
142
|
requirements:
|
143
143
|
- - ! '>='
|
@@ -145,10 +145,10 @@ dependencies:
|
|
145
145
|
version: '0'
|
146
146
|
type: :development
|
147
147
|
prerelease: false
|
148
|
-
version_requirements: *
|
148
|
+
version_requirements: *2160178780
|
149
149
|
- !ruby/object:Gem::Dependency
|
150
150
|
name: rake
|
151
|
-
requirement: &
|
151
|
+
requirement: &2160169440 !ruby/object:Gem::Requirement
|
152
152
|
none: false
|
153
153
|
requirements:
|
154
154
|
- - ! '>='
|
@@ -156,10 +156,10 @@ dependencies:
|
|
156
156
|
version: '0'
|
157
157
|
type: :development
|
158
158
|
prerelease: false
|
159
|
-
version_requirements: *
|
159
|
+
version_requirements: *2160169440
|
160
160
|
- !ruby/object:Gem::Dependency
|
161
161
|
name: mocha
|
162
|
-
requirement: &
|
162
|
+
requirement: &2160167220 !ruby/object:Gem::Requirement
|
163
163
|
none: false
|
164
164
|
requirements:
|
165
165
|
- - ! '>='
|
@@ -167,10 +167,10 @@ dependencies:
|
|
167
167
|
version: '0'
|
168
168
|
type: :development
|
169
169
|
prerelease: false
|
170
|
-
version_requirements: *
|
170
|
+
version_requirements: *2160167220
|
171
171
|
- !ruby/object:Gem::Dependency
|
172
172
|
name: i18n
|
173
|
-
requirement: &
|
173
|
+
requirement: &2160161940 !ruby/object:Gem::Requirement
|
174
174
|
none: false
|
175
175
|
requirements:
|
176
176
|
- - ! '>='
|
@@ -178,10 +178,10 @@ dependencies:
|
|
178
178
|
version: '0'
|
179
179
|
type: :development
|
180
180
|
prerelease: false
|
181
|
-
version_requirements: *
|
181
|
+
version_requirements: *2160161940
|
182
182
|
- !ruby/object:Gem::Dependency
|
183
183
|
name: countdownlatch
|
184
|
-
requirement: &
|
184
|
+
requirement: &2160157820 !ruby/object:Gem::Requirement
|
185
185
|
none: false
|
186
186
|
requirements:
|
187
187
|
- - ! '>='
|
@@ -189,7 +189,7 @@ dependencies:
|
|
189
189
|
version: '0'
|
190
190
|
type: :development
|
191
191
|
prerelease: false
|
192
|
-
version_requirements: *
|
192
|
+
version_requirements: *2160157820
|
193
193
|
description: Like Rack is to Rails and Sinatra, Punchblock provides a consistent API
|
194
194
|
on top of several underlying third-party call control protocols.
|
195
195
|
email: punchblock@adhearsion.com
|
@@ -213,6 +213,8 @@ files:
|
|
213
213
|
- assets/ozone/transfer-1.0.xsd
|
214
214
|
- bin/punchblock-console
|
215
215
|
- lib/punchblock.rb
|
216
|
+
- lib/punchblock/client.rb
|
217
|
+
- lib/punchblock/client/component_registry.rb
|
216
218
|
- lib/punchblock/command.rb
|
217
219
|
- lib/punchblock/command/accept.rb
|
218
220
|
- lib/punchblock/command/answer.rb
|
@@ -235,6 +237,8 @@ files:
|
|
235
237
|
- lib/punchblock/component/tropo/say.rb
|
236
238
|
- lib/punchblock/component/tropo/transfer.rb
|
237
239
|
- lib/punchblock/connection.rb
|
240
|
+
- lib/punchblock/connection/connected.rb
|
241
|
+
- lib/punchblock/connection/xmpp.rb
|
238
242
|
- lib/punchblock/core_ext/blather/stanza.rb
|
239
243
|
- lib/punchblock/core_ext/blather/stanza/presence.rb
|
240
244
|
- lib/punchblock/dsl.rb
|
@@ -248,7 +252,6 @@ files:
|
|
248
252
|
- lib/punchblock/event/offer.rb
|
249
253
|
- lib/punchblock/event/ringing.rb
|
250
254
|
- lib/punchblock/event/unjoined.rb
|
251
|
-
- lib/punchblock/generic_connection.rb
|
252
255
|
- lib/punchblock/has_headers.rb
|
253
256
|
- lib/punchblock/header.rb
|
254
257
|
- lib/punchblock/media_container.rb
|
@@ -259,6 +262,8 @@ files:
|
|
259
262
|
- lib/punchblock/version.rb
|
260
263
|
- log/.gitkeep
|
261
264
|
- punchblock.gemspec
|
265
|
+
- spec/punchblock/client/component_registry_spec.rb
|
266
|
+
- spec/punchblock/client_spec.rb
|
262
267
|
- spec/punchblock/command/accept_spec.rb
|
263
268
|
- spec/punchblock/command/answer_spec.rb
|
264
269
|
- spec/punchblock/command/dial_spec.rb
|
@@ -278,7 +283,7 @@ files:
|
|
278
283
|
- spec/punchblock/component/tropo/say_spec.rb
|
279
284
|
- spec/punchblock/component/tropo/transfer_spec.rb
|
280
285
|
- spec/punchblock/component_spec.rb
|
281
|
-
- spec/punchblock/
|
286
|
+
- spec/punchblock/connection/xmpp_spec.rb
|
282
287
|
- spec/punchblock/event/answered_spec.rb
|
283
288
|
- spec/punchblock/event/complete_spec.rb
|
284
289
|
- spec/punchblock/event/dtmf_spec.rb
|
@@ -319,6 +324,8 @@ signing_key:
|
|
319
324
|
specification_version: 3
|
320
325
|
summary: Punchblock is a telephony middleware library
|
321
326
|
test_files:
|
327
|
+
- spec/punchblock/client/component_registry_spec.rb
|
328
|
+
- spec/punchblock/client_spec.rb
|
322
329
|
- spec/punchblock/command/accept_spec.rb
|
323
330
|
- spec/punchblock/command/answer_spec.rb
|
324
331
|
- spec/punchblock/command/dial_spec.rb
|
@@ -338,7 +345,7 @@ test_files:
|
|
338
345
|
- spec/punchblock/component/tropo/say_spec.rb
|
339
346
|
- spec/punchblock/component/tropo/transfer_spec.rb
|
340
347
|
- spec/punchblock/component_spec.rb
|
341
|
-
- spec/punchblock/
|
348
|
+
- spec/punchblock/connection/xmpp_spec.rb
|
342
349
|
- spec/punchblock/event/answered_spec.rb
|
343
350
|
- spec/punchblock/event/complete_spec.rb
|
344
351
|
- spec/punchblock/event/dtmf_spec.rb
|