punchblock 0.4.3 → 0.5.0
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 +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
|