punchblock 1.2.0 → 1.3.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/.travis.yml +3 -3
- data/CHANGELOG.md +23 -0
- data/lib/punchblock.rb +24 -0
- data/lib/punchblock/command/reject.rb +10 -2
- data/lib/punchblock/component/record.rb +16 -0
- data/lib/punchblock/core_ext/blather/stanza.rb +3 -1
- data/lib/punchblock/dead_actor_safety.rb +9 -0
- data/lib/punchblock/event/complete.rb +9 -11
- data/lib/punchblock/rayo_node.rb +4 -0
- data/lib/punchblock/translator/asterisk.rb +65 -22
- data/lib/punchblock/translator/asterisk/call.rb +49 -30
- data/lib/punchblock/translator/asterisk/component.rb +6 -8
- data/lib/punchblock/translator/asterisk/component/asterisk/agi_command.rb +13 -20
- data/lib/punchblock/translator/asterisk/component/asterisk/ami_action.rb +1 -1
- data/lib/punchblock/translator/asterisk/component/input.rb +3 -6
- data/lib/punchblock/translator/asterisk/component/output.rb +40 -45
- data/lib/punchblock/translator/asterisk/component/record.rb +1 -1
- data/lib/punchblock/translator/asterisk/component/stop_by_redirect.rb +5 -2
- data/lib/punchblock/version.rb +1 -1
- data/punchblock.gemspec +5 -5
- data/spec/punchblock/command/reject_spec.rb +7 -1
- data/spec/punchblock/command_node_spec.rb +5 -2
- data/spec/punchblock/component/component_node_spec.rb +4 -0
- data/spec/punchblock/component/output_spec.rb +1 -1
- data/spec/punchblock/component/record_spec.rb +30 -0
- data/spec/punchblock/event/complete_spec.rb +10 -0
- data/spec/punchblock/translator/asterisk/call_spec.rb +191 -48
- data/spec/punchblock/translator/asterisk/component/asterisk/agi_command_spec.rb +6 -39
- data/spec/punchblock/translator/asterisk/component/asterisk/ami_action_spec.rb +3 -3
- data/spec/punchblock/translator/asterisk/component/input_spec.rb +8 -3
- data/spec/punchblock/translator/asterisk/component/output_spec.rb +153 -46
- data/spec/punchblock/translator/asterisk/component/record_spec.rb +6 -5
- data/spec/punchblock/translator/asterisk/component/stop_by_redirect_spec.rb +1 -2
- data/spec/punchblock/translator/asterisk/component_spec.rb +1 -0
- data/spec/punchblock/translator/asterisk_spec.rb +147 -12
- data/spec/punchblock_spec.rb +34 -0
- data/spec/spec_helper.rb +5 -1
- metadata +30 -20
|
@@ -33,13 +33,14 @@ module Punchblock
|
|
|
33
33
|
|
|
34
34
|
before { original_command.request! }
|
|
35
35
|
|
|
36
|
-
it "
|
|
37
|
-
mock_call.expects
|
|
38
|
-
mock_call.expects :answer_if_not_answered
|
|
36
|
+
it "returns an error if the call is not answered yet" do
|
|
37
|
+
mock_call.expects(:answered?).returns(false)
|
|
39
38
|
subject.execute
|
|
39
|
+
error = ProtocolError.new.setup 'option error', 'Record cannot be used on a call that is not answered.'
|
|
40
|
+
original_command.response(0.1).should be == error
|
|
40
41
|
end
|
|
41
42
|
|
|
42
|
-
before { mock_call.stubs
|
|
43
|
+
before { mock_call.stubs(:answered?).returns(true) }
|
|
43
44
|
|
|
44
45
|
it "sets command response to a reference to the component" do
|
|
45
46
|
mock_call.expects(:send_ami_action!)
|
|
@@ -321,8 +322,8 @@ module Punchblock
|
|
|
321
322
|
let(:command) { Punchblock::Component::Stop.new }
|
|
322
323
|
|
|
323
324
|
before do
|
|
324
|
-
mock_call.expects :answer_if_not_answered
|
|
325
325
|
mock_call.expects :send_ami_action!
|
|
326
|
+
mock_call.expects(:answered?).returns(true)
|
|
326
327
|
command.request!
|
|
327
328
|
original_command.request!
|
|
328
329
|
subject.execute
|
|
@@ -12,7 +12,7 @@ module Punchblock
|
|
|
12
12
|
include StopByRedirect
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
let(:mock_call) { mock
|
|
15
|
+
let(:mock_call) { mock 'Call', :id => 'foo' }
|
|
16
16
|
subject { MockComponent.new Hash.new, mock_call }
|
|
17
17
|
|
|
18
18
|
describe "#execute_command" do
|
|
@@ -21,7 +21,6 @@ module Punchblock
|
|
|
21
21
|
|
|
22
22
|
before { command.request! }
|
|
23
23
|
it "returns a ProtocolError response" do
|
|
24
|
-
mock_call.expects(:id)
|
|
25
24
|
subject.execute_command command
|
|
26
25
|
command.response(0.1).should be_a ProtocolError
|
|
27
26
|
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
|
|
3
3
|
require 'spec_helper'
|
|
4
|
+
require 'ostruct'
|
|
4
5
|
|
|
5
6
|
module Punchblock
|
|
6
7
|
module Translator
|
|
@@ -38,6 +39,7 @@ module Punchblock
|
|
|
38
39
|
|
|
39
40
|
it "terminates the actor" do
|
|
40
41
|
subject.shutdown
|
|
42
|
+
sleep 0.2
|
|
41
43
|
subject.should_not be_alive
|
|
42
44
|
end
|
|
43
45
|
end
|
|
@@ -98,6 +100,29 @@ module Punchblock
|
|
|
98
100
|
end
|
|
99
101
|
end
|
|
100
102
|
|
|
103
|
+
describe '#deregister_call' do
|
|
104
|
+
let(:call_id) { 'abc123' }
|
|
105
|
+
let(:channel) { 'SIP/foo' }
|
|
106
|
+
let(:call) { Translator::Asterisk::Call.new channel, subject }
|
|
107
|
+
|
|
108
|
+
before do
|
|
109
|
+
call.stubs(:id).returns call_id
|
|
110
|
+
subject.register_call call
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it 'should make the call inaccessible by ID' do
|
|
114
|
+
subject.call_with_id(call_id).should be call
|
|
115
|
+
subject.deregister_call call
|
|
116
|
+
subject.call_with_id(call_id).should be_nil
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it 'should make the call inaccessible by channel' do
|
|
120
|
+
subject.call_for_channel(channel).should be call
|
|
121
|
+
subject.deregister_call call
|
|
122
|
+
subject.call_for_channel(channel).should be_nil
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
101
126
|
describe '#register_component' do
|
|
102
127
|
let(:component_id) { 'abc123' }
|
|
103
128
|
let(:component) { mock 'Asterisk::Component::Asterisk::AMIAction', :id => component_id }
|
|
@@ -110,16 +135,14 @@ module Punchblock
|
|
|
110
135
|
|
|
111
136
|
describe '#execute_call_command' do
|
|
112
137
|
let(:call_id) { 'abc123' }
|
|
113
|
-
let(:call) { Translator::Asterisk::Call.new 'SIP/foo', subject }
|
|
114
138
|
let(:command) { Command::Answer.new.tap { |c| c.target_call_id = call_id } }
|
|
115
139
|
|
|
116
|
-
before do
|
|
117
|
-
command.request!
|
|
118
|
-
call.stubs(:id).returns call_id
|
|
119
|
-
end
|
|
120
|
-
|
|
121
140
|
context "with a known call ID" do
|
|
141
|
+
let(:call) { Translator::Asterisk::Call.new 'SIP/foo', subject }
|
|
142
|
+
|
|
122
143
|
before do
|
|
144
|
+
command.request!
|
|
145
|
+
call.stubs(:id).returns call_id
|
|
123
146
|
subject.register_call call
|
|
124
147
|
end
|
|
125
148
|
|
|
@@ -129,10 +152,84 @@ module Punchblock
|
|
|
129
152
|
end
|
|
130
153
|
end
|
|
131
154
|
|
|
155
|
+
let :end_error_event do
|
|
156
|
+
Punchblock::Event::End.new.tap do |e|
|
|
157
|
+
e.target_call_id = call_id
|
|
158
|
+
e.reason = :error
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
context "for an outgoing call which began executing but crashed" do
|
|
163
|
+
let(:dial_command) { Command::Dial.new :to => 'SIP/1234', :from => 'abc123' }
|
|
164
|
+
|
|
165
|
+
let(:call_id) { dial_command.response.id }
|
|
166
|
+
|
|
167
|
+
before do
|
|
168
|
+
subject.execute_command dial_command
|
|
169
|
+
ami_client.stub_everything
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
it 'sends an error in response to the command' do
|
|
173
|
+
call = subject.call_with_id call_id
|
|
174
|
+
|
|
175
|
+
call.wrapped_object.define_singleton_method(:oops) do
|
|
176
|
+
raise 'Woops, I died'
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
connection.expects(:handle_event).once.with end_error_event
|
|
180
|
+
|
|
181
|
+
lambda { call.oops }.should raise_error(/Woops, I died/)
|
|
182
|
+
sleep 0.1
|
|
183
|
+
call.should_not be_alive
|
|
184
|
+
subject.call_with_id(call_id).should be_nil
|
|
185
|
+
|
|
186
|
+
command.request!
|
|
187
|
+
subject.execute_call_command command
|
|
188
|
+
command.response.should be == ProtocolError.new.setup(:item_not_found, "Could not find a call with ID #{call_id}", call_id)
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
context "for an incoming call which began executing but crashed" do
|
|
193
|
+
let :ami_event do
|
|
194
|
+
RubyAMI::Event.new('AsyncAGI').tap do |e|
|
|
195
|
+
e['SubEvent'] = "Start"
|
|
196
|
+
e['Channel'] = "SIP/1234-00000000"
|
|
197
|
+
e['Env'] = "agi_request%3A%20async%0Aagi_channel%3A%20SIP%2F1234-00000000%0Aagi_language%3A%20en%0Aagi_type%3A%20SIP%0Aagi_uniqueid%3A%201320835995.0%0Aagi_version%3A%201.8.4.1%0Aagi_callerid%3A%205678%0Aagi_calleridname%3A%20Jane%20Smith%0Aagi_callingpres%3A%200%0Aagi_callingani2%3A%200%0Aagi_callington%3A%200%0Aagi_callingtns%3A%200%0Aagi_dnid%3A%201000%0Aagi_rdnis%3A%20unknown%0Aagi_context%3A%20default%0Aagi_extension%3A%201000%0Aagi_priority%3A%201%0Aagi_enhanced%3A%200.0%0Aagi_accountcode%3A%20%0Aagi_threadid%3A%204366221312%0A%0A"
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
let(:call) { subject.call_for_channel('SIP/1234-00000000') }
|
|
202
|
+
let(:call_id) { call.id }
|
|
203
|
+
|
|
204
|
+
before do
|
|
205
|
+
connection.expects(:handle_event).at_least(1)
|
|
206
|
+
subject.handle_ami_event ami_event
|
|
207
|
+
call_id
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
it 'sends an error in response to the command' do
|
|
211
|
+
call.wrapped_object.define_singleton_method(:oops) do
|
|
212
|
+
raise 'Woops, I died'
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
connection.expects(:handle_event).once.with end_error_event
|
|
216
|
+
|
|
217
|
+
lambda { call.oops }.should raise_error(/Woops, I died/)
|
|
218
|
+
sleep 0.1
|
|
219
|
+
call.should_not be_alive
|
|
220
|
+
subject.call_with_id(call_id).should be_nil
|
|
221
|
+
|
|
222
|
+
command.request!
|
|
223
|
+
subject.execute_call_command command
|
|
224
|
+
command.response.should be == ProtocolError.new.setup(:item_not_found, "Could not find a call with ID #{call_id}", call_id)
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
|
|
132
228
|
context "with an unknown call ID" do
|
|
133
229
|
it 'sends an error in response to the command' do
|
|
230
|
+
command.request!
|
|
134
231
|
subject.execute_call_command command
|
|
135
|
-
command.response.should be == ProtocolError.new.setup(
|
|
232
|
+
command.response.should be == ProtocolError.new.setup(:item_not_found, "Could not find a call with ID #{call_id}", call_id, nil)
|
|
136
233
|
end
|
|
137
234
|
end
|
|
138
235
|
end
|
|
@@ -161,7 +258,7 @@ module Punchblock
|
|
|
161
258
|
context "with an unknown component ID" do
|
|
162
259
|
it 'sends an error in response to the command' do
|
|
163
260
|
subject.execute_component_command command
|
|
164
|
-
command.response.should be == ProtocolError.new.setup(
|
|
261
|
+
command.response.should be == ProtocolError.new.setup(:item_not_found, "Could not find a component with ID #{component_id}", nil, component_id)
|
|
165
262
|
end
|
|
166
263
|
end
|
|
167
264
|
end
|
|
@@ -185,7 +282,7 @@ module Punchblock
|
|
|
185
282
|
|
|
186
283
|
it 'should instruct the call to send a dial' do
|
|
187
284
|
mock_call = stub_everything 'Asterisk::Call'
|
|
188
|
-
Asterisk::Call.expects(:
|
|
285
|
+
Asterisk::Call.expects(:new_link).once.returns mock_call
|
|
189
286
|
mock_call.expects(:dial!).once.with command
|
|
190
287
|
subject.execute_global_command command
|
|
191
288
|
end
|
|
@@ -324,6 +421,7 @@ module Punchblock
|
|
|
324
421
|
it 'should instruct the call to send an offer' do
|
|
325
422
|
mock_call = stub_everything 'Asterisk::Call'
|
|
326
423
|
Asterisk::Call.expects(:new).once.returns mock_call
|
|
424
|
+
subject.wrapped_object.expects(:link)
|
|
327
425
|
mock_call.expects(:send_offer!).once
|
|
328
426
|
subject.handle_ami_event ami_event
|
|
329
427
|
end
|
|
@@ -452,12 +550,10 @@ module Punchblock
|
|
|
452
550
|
end
|
|
453
551
|
|
|
454
552
|
before do
|
|
455
|
-
subject.wrapped_object.stubs :handle_pb_event
|
|
456
553
|
subject.register_call call
|
|
457
554
|
end
|
|
458
555
|
|
|
459
556
|
it 'sends the AMI event to the call and to the connection as a PB event' do
|
|
460
|
-
subject.wrapped_object.expects(:handle_pb_event).once
|
|
461
557
|
call.expects(:process_ami_event!).once.with ami_event
|
|
462
558
|
subject.handle_ami_event ami_event
|
|
463
559
|
end
|
|
@@ -480,7 +576,6 @@ module Punchblock
|
|
|
480
576
|
before { subject.register_call call2 }
|
|
481
577
|
|
|
482
578
|
it 'should send the event to both calls and to the connection once as a PB event' do
|
|
483
|
-
subject.wrapped_object.expects(:handle_pb_event).once
|
|
484
579
|
call.expects(:process_ami_event!).once.with ami_event
|
|
485
580
|
call2.expects(:process_ami_event!).once.with ami_event
|
|
486
581
|
subject.handle_ami_event ami_event
|
|
@@ -498,10 +593,50 @@ module Punchblock
|
|
|
498
593
|
end
|
|
499
594
|
|
|
500
595
|
describe '#run_at_fully_booted' do
|
|
596
|
+
let(:passed_show) do
|
|
597
|
+
OpenStruct.new({:text_body => "[ Context 'adhearsion-redirect' created by 'pbx_config' ]\n '1' => 1. AGI(agi:async)[pbx_config]\n\n-= 1 extension (1 priority) in 1 context. =-"})
|
|
598
|
+
end
|
|
599
|
+
|
|
600
|
+
let(:failed_show) do
|
|
601
|
+
OpenStruct.new({:text_body => "There is no existence of 'adhearsion-redirect' context\nCommand 'dialplan show adhearsion-redirect' failed."})
|
|
602
|
+
end
|
|
603
|
+
|
|
501
604
|
it 'should send the redirect extension Command to the AMI client' do
|
|
502
605
|
ami_client.expects(:send_action).once.with 'Command', 'Command' => "dialplan add extension #{Asterisk::REDIRECT_EXTENSION},#{Asterisk::REDIRECT_PRIORITY},AGI,agi:async into #{Asterisk::REDIRECT_CONTEXT}"
|
|
606
|
+
ami_client.expects(:send_action).once.with('Command', 'Command' => "dialplan show #{Asterisk::REDIRECT_CONTEXT}")
|
|
503
607
|
subject.run_at_fully_booted
|
|
504
608
|
end
|
|
609
|
+
|
|
610
|
+
it 'should check the context for existence and do nothing if it is there' do
|
|
611
|
+
ami_client.expects(:send_action).once.with 'Command', 'Command' => "dialplan add extension #{Asterisk::REDIRECT_EXTENSION},#{Asterisk::REDIRECT_PRIORITY},AGI,agi:async into #{Asterisk::REDIRECT_CONTEXT}"
|
|
612
|
+
ami_client.expects(:send_action).once.with('Command', 'Command' => "dialplan show #{Asterisk::REDIRECT_CONTEXT}").yields(passed_show)
|
|
613
|
+
subject.run_at_fully_booted
|
|
614
|
+
end
|
|
615
|
+
|
|
616
|
+
it 'should check the context for existence and log an error if it is not there' do
|
|
617
|
+
ami_client.expects(:send_action).once.with 'Command', 'Command' => "dialplan add extension #{Asterisk::REDIRECT_EXTENSION},#{Asterisk::REDIRECT_PRIORITY},AGI,agi:async into #{Asterisk::REDIRECT_CONTEXT}"
|
|
618
|
+
ami_client.expects(:send_action).once.with('Command', 'Command' => "dialplan show #{Asterisk::REDIRECT_CONTEXT}").yields(failed_show)
|
|
619
|
+
Punchblock.logger.expects(:error).once.with("Punchblock failed to add the #{Asterisk::REDIRECT_EXTENSION} extension to the #{Asterisk::REDIRECT_CONTEXT} context. Please add a [#{Asterisk::REDIRECT_CONTEXT}] entry to your dialplan.")
|
|
620
|
+
subject.run_at_fully_booted
|
|
621
|
+
end
|
|
622
|
+
end
|
|
623
|
+
|
|
624
|
+
describe '#check_recording_directory' do
|
|
625
|
+
let(:broken_path) { "/this/is/not/a/valid/path" }
|
|
626
|
+
before do
|
|
627
|
+
@new_constant = broken_path
|
|
628
|
+
@old_constant = Punchblock::Translator::Asterisk::Component::Record::RECORDING_BASE_PATH
|
|
629
|
+
Punchblock::Translator::Asterisk::Component::Record.__send__(:remove_const,'RECORDING_BASE_PATH')
|
|
630
|
+
Punchblock::Translator::Asterisk::Component::Record.const_set('RECORDING_BASE_PATH', @new_constant)
|
|
631
|
+
end
|
|
632
|
+
after do
|
|
633
|
+
Punchblock::Translator::Asterisk::Component::Record.__send__(:remove_const,'RECORDING_BASE_PATH')
|
|
634
|
+
Punchblock::Translator::Asterisk::Component::Record.const_set('RECORDING_BASE_PATH', @old_constant)
|
|
635
|
+
end
|
|
636
|
+
it 'logs a warning if the recording directory does not exist' do
|
|
637
|
+
Punchblock.logger.expects(:warning).once.with("Recordings directory #{broken_path} does not exist. Recording might not work. This warning can be ignored if Adhearsion is running on a separate machine than Asterisk. See http://adhearsion.com/docs/call-controllers#recording")
|
|
638
|
+
subject.check_recording_directory
|
|
639
|
+
end
|
|
505
640
|
end
|
|
506
641
|
end
|
|
507
642
|
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Punchblock do
|
|
4
|
+
describe '#client_with_connection' do
|
|
5
|
+
context 'with :XMPP' do
|
|
6
|
+
it 'sets up an XMPP connection, passing options, and a client with the connection attached' do
|
|
7
|
+
mock_connection = stub_everything 'Connection'
|
|
8
|
+
options = {:username => 'foo', :password => 'bar'}
|
|
9
|
+
Punchblock::Connection::XMPP.expects(:new).once.with(options).returns mock_connection
|
|
10
|
+
client = Punchblock.client_with_connection :XMPP, options
|
|
11
|
+
client.should be_a Punchblock::Client
|
|
12
|
+
client.connection.should be mock_connection
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
context 'with :asterisk' do
|
|
17
|
+
it 'sets up an Asterisk connection, passing options, and a client with the connection attached' do
|
|
18
|
+
mock_connection = stub_everything 'Connection'
|
|
19
|
+
options = {:username => 'foo', :password => 'bar'}
|
|
20
|
+
Punchblock::Connection::Asterisk.expects(:new).once.with(options).returns mock_connection
|
|
21
|
+
client = Punchblock.client_with_connection :asterisk, options
|
|
22
|
+
client.should be_a Punchblock::Client
|
|
23
|
+
client.connection.should be mock_connection
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
context 'with :yate' do
|
|
28
|
+
it 'raises ArgumentError' do
|
|
29
|
+
options = {:username => 'foo', :password => 'bar'}
|
|
30
|
+
lambda { Punchblock.client_with_connection :yate, options }.should raise_error(ArgumentError)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
|
|
3
3
|
require 'punchblock'
|
|
4
|
-
require 'mocha'
|
|
5
4
|
require 'countdownlatch'
|
|
6
5
|
require 'logger'
|
|
7
6
|
|
|
@@ -31,6 +30,11 @@ def import_stanza(xml)
|
|
|
31
30
|
Blather::Stanza.import parse_stanza(xml).root
|
|
32
31
|
end
|
|
33
32
|
|
|
33
|
+
def stub_uuids(value)
|
|
34
|
+
RubyAMI.stubs :new_uuid => value
|
|
35
|
+
Punchblock.stubs :new_uuid => value
|
|
36
|
+
end
|
|
37
|
+
|
|
34
38
|
# FIXME: change this to rayo_event? It can be ambigous
|
|
35
39
|
shared_examples_for 'event' do
|
|
36
40
|
its(:target_call_id) { should be == '9f00061' }
|
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: 1.
|
|
4
|
+
version: 1.3.0
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -11,7 +11,7 @@ authors:
|
|
|
11
11
|
autorequire:
|
|
12
12
|
bindir: bin
|
|
13
13
|
cert_chain: []
|
|
14
|
-
date: 2012-
|
|
14
|
+
date: 2012-07-22 00:00:00.000000000 Z
|
|
15
15
|
dependencies:
|
|
16
16
|
- !ruby/object:Gem::Dependency
|
|
17
17
|
name: niceogiri
|
|
@@ -132,7 +132,10 @@ dependencies:
|
|
|
132
132
|
requirements:
|
|
133
133
|
- - ~>
|
|
134
134
|
- !ruby/object:Gem::Version
|
|
135
|
-
version: '1.
|
|
135
|
+
version: '1.2'
|
|
136
|
+
- - ! '>='
|
|
137
|
+
- !ruby/object:Gem::Version
|
|
138
|
+
version: 1.2.1
|
|
136
139
|
type: :runtime
|
|
137
140
|
prerelease: false
|
|
138
141
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -140,7 +143,10 @@ dependencies:
|
|
|
140
143
|
requirements:
|
|
141
144
|
- - ~>
|
|
142
145
|
- !ruby/object:Gem::Version
|
|
143
|
-
version: '1.
|
|
146
|
+
version: '1.2'
|
|
147
|
+
- - ! '>='
|
|
148
|
+
- !ruby/object:Gem::Version
|
|
149
|
+
version: 1.2.1
|
|
144
150
|
- !ruby/object:Gem::Dependency
|
|
145
151
|
name: ruby_speech
|
|
146
152
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -162,17 +168,17 @@ dependencies:
|
|
|
162
168
|
requirement: !ruby/object:Gem::Requirement
|
|
163
169
|
none: false
|
|
164
170
|
requirements:
|
|
165
|
-
- -
|
|
171
|
+
- - ~>
|
|
166
172
|
- !ruby/object:Gem::Version
|
|
167
|
-
version: 1.0
|
|
173
|
+
version: '1.0'
|
|
168
174
|
type: :development
|
|
169
175
|
prerelease: false
|
|
170
176
|
version_requirements: !ruby/object:Gem::Requirement
|
|
171
177
|
none: false
|
|
172
178
|
requirements:
|
|
173
|
-
- -
|
|
179
|
+
- - ~>
|
|
174
180
|
- !ruby/object:Gem::Version
|
|
175
|
-
version: 1.0
|
|
181
|
+
version: '1.0'
|
|
176
182
|
- !ruby/object:Gem::Dependency
|
|
177
183
|
name: rspec
|
|
178
184
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -180,7 +186,7 @@ dependencies:
|
|
|
180
186
|
requirements:
|
|
181
187
|
- - ~>
|
|
182
188
|
- !ruby/object:Gem::Version
|
|
183
|
-
version: 2.7
|
|
189
|
+
version: '2.7'
|
|
184
190
|
type: :development
|
|
185
191
|
prerelease: false
|
|
186
192
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -188,39 +194,39 @@ dependencies:
|
|
|
188
194
|
requirements:
|
|
189
195
|
- - ~>
|
|
190
196
|
- !ruby/object:Gem::Version
|
|
191
|
-
version: 2.7
|
|
197
|
+
version: '2.7'
|
|
192
198
|
- !ruby/object:Gem::Dependency
|
|
193
199
|
name: ci_reporter
|
|
194
200
|
requirement: !ruby/object:Gem::Requirement
|
|
195
201
|
none: false
|
|
196
202
|
requirements:
|
|
197
|
-
- -
|
|
203
|
+
- - ~>
|
|
198
204
|
- !ruby/object:Gem::Version
|
|
199
|
-
version: 1.6
|
|
205
|
+
version: '1.6'
|
|
200
206
|
type: :development
|
|
201
207
|
prerelease: false
|
|
202
208
|
version_requirements: !ruby/object:Gem::Requirement
|
|
203
209
|
none: false
|
|
204
210
|
requirements:
|
|
205
|
-
- -
|
|
211
|
+
- - ~>
|
|
206
212
|
- !ruby/object:Gem::Version
|
|
207
|
-
version: 1.6
|
|
213
|
+
version: '1.6'
|
|
208
214
|
- !ruby/object:Gem::Dependency
|
|
209
215
|
name: yard
|
|
210
216
|
requirement: !ruby/object:Gem::Requirement
|
|
211
217
|
none: false
|
|
212
218
|
requirements:
|
|
213
|
-
- -
|
|
219
|
+
- - ~>
|
|
214
220
|
- !ruby/object:Gem::Version
|
|
215
|
-
version: 0.6
|
|
221
|
+
version: '0.6'
|
|
216
222
|
type: :development
|
|
217
223
|
prerelease: false
|
|
218
224
|
version_requirements: !ruby/object:Gem::Requirement
|
|
219
225
|
none: false
|
|
220
226
|
requirements:
|
|
221
|
-
- -
|
|
227
|
+
- - ~>
|
|
222
228
|
- !ruby/object:Gem::Version
|
|
223
|
-
version: 0.6
|
|
229
|
+
version: '0.6'
|
|
224
230
|
- !ruby/object:Gem::Dependency
|
|
225
231
|
name: rake
|
|
226
232
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -368,6 +374,7 @@ files:
|
|
|
368
374
|
- lib/punchblock/core_ext/blather/stanza.rb
|
|
369
375
|
- lib/punchblock/core_ext/blather/stanza/presence.rb
|
|
370
376
|
- lib/punchblock/core_ext/ruby.rb
|
|
377
|
+
- lib/punchblock/dead_actor_safety.rb
|
|
371
378
|
- lib/punchblock/disconnected_error.rb
|
|
372
379
|
- lib/punchblock/event.rb
|
|
373
380
|
- lib/punchblock/event/active_speaker.rb
|
|
@@ -450,6 +457,7 @@ files:
|
|
|
450
457
|
- spec/punchblock/translator/asterisk/component/stop_by_redirect_spec.rb
|
|
451
458
|
- spec/punchblock/translator/asterisk/component_spec.rb
|
|
452
459
|
- spec/punchblock/translator/asterisk_spec.rb
|
|
460
|
+
- spec/punchblock_spec.rb
|
|
453
461
|
- spec/spec_helper.rb
|
|
454
462
|
- spec/support/mock_connection_with_event_handler.rb
|
|
455
463
|
homepage: http://github.com/adhearsion/punchblock
|
|
@@ -467,7 +475,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
467
475
|
version: '0'
|
|
468
476
|
segments:
|
|
469
477
|
- 0
|
|
470
|
-
hash:
|
|
478
|
+
hash: -421186305561513496
|
|
471
479
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
472
480
|
none: false
|
|
473
481
|
requirements:
|
|
@@ -476,7 +484,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
476
484
|
version: 1.3.7
|
|
477
485
|
requirements: []
|
|
478
486
|
rubyforge_project: punchblock
|
|
479
|
-
rubygems_version: 1.8.
|
|
487
|
+
rubygems_version: 1.8.24
|
|
480
488
|
signing_key:
|
|
481
489
|
specification_version: 3
|
|
482
490
|
summary: Punchblock is a telephony middleware library
|
|
@@ -526,5 +534,7 @@ test_files:
|
|
|
526
534
|
- spec/punchblock/translator/asterisk/component/stop_by_redirect_spec.rb
|
|
527
535
|
- spec/punchblock/translator/asterisk/component_spec.rb
|
|
528
536
|
- spec/punchblock/translator/asterisk_spec.rb
|
|
537
|
+
- spec/punchblock_spec.rb
|
|
529
538
|
- spec/spec_helper.rb
|
|
530
539
|
- spec/support/mock_connection_with_event_handler.rb
|
|
540
|
+
has_rdoc:
|