punchblock 2.1.1 → 2.2.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.
- checksums.yaml +4 -4
- data/.travis.yml +2 -1
- data/CHANGELOG.md +7 -0
- data/lib/punchblock.rb +1 -1
- data/lib/punchblock/component.rb +2 -0
- data/lib/punchblock/component/input.rb +9 -1
- data/lib/punchblock/component/output.rb +1 -1
- data/lib/punchblock/component/receive_fax.rb +24 -0
- data/lib/punchblock/component/send_fax.rb +62 -0
- data/lib/punchblock/connection/asterisk.rb +1 -1
- data/lib/punchblock/event/complete.rb +15 -1
- data/lib/punchblock/translator/asterisk.rb +30 -15
- data/lib/punchblock/translator/asterisk/call.rb +13 -27
- data/lib/punchblock/translator/asterisk/component.rb +4 -7
- data/lib/punchblock/translator/asterisk/component/asterisk/agi_command.rb +1 -5
- data/lib/punchblock/translator/asterisk/component/composed_prompt.rb +8 -9
- data/lib/punchblock/translator/asterisk/component/input.rb +2 -3
- data/lib/punchblock/translator/asterisk/component/mrcp_prompt.rb +9 -9
- data/lib/punchblock/translator/asterisk/component/output.rb +134 -39
- data/lib/punchblock/translator/asterisk/component/record.rb +2 -3
- data/lib/punchblock/translator/asterisk/component/stop_by_redirect.rb +2 -3
- data/lib/punchblock/translator/dtmf_recognizer.rb +2 -4
- data/lib/punchblock/translator/freeswitch/component/abstract_output.rb +6 -1
- data/lib/punchblock/translator/freeswitch/component/flite_output.rb +1 -1
- data/lib/punchblock/translator/freeswitch/component/output.rb +12 -10
- data/lib/punchblock/translator/freeswitch/component/tts_output.rb +1 -1
- data/lib/punchblock/version.rb +1 -1
- data/spec/punchblock/component/input_spec.rb +91 -0
- data/spec/punchblock/component/output_spec.rb +1 -2
- data/spec/punchblock/component/receive_fax_spec.rb +111 -0
- data/spec/punchblock/component/send_fax_spec.rb +110 -0
- data/spec/punchblock/connection/asterisk_spec.rb +1 -1
- data/spec/punchblock/translator/asterisk/call_spec.rb +53 -79
- data/spec/punchblock/translator/asterisk/component/asterisk/agi_command_spec.rb +0 -3
- data/spec/punchblock/translator/asterisk/component/asterisk/ami_action_spec.rb +1 -1
- data/spec/punchblock/translator/asterisk/component/composed_prompt_spec.rb +2 -2
- data/spec/punchblock/translator/asterisk/component/input_spec.rb +6 -6
- data/spec/punchblock/translator/asterisk/component/mrcp_native_prompt_spec.rb +3 -3
- data/spec/punchblock/translator/asterisk/component/mrcp_prompt_spec.rb +9 -11
- data/spec/punchblock/translator/asterisk/component/output_spec.rb +902 -28
- data/spec/punchblock/translator/asterisk/component/stop_by_redirect_spec.rb +1 -1
- data/spec/punchblock/translator/asterisk/component_spec.rb +2 -9
- data/spec/punchblock/translator/asterisk_spec.rb +42 -94
- data/spec/punchblock/translator/freeswitch/component/flite_output_spec.rb +5 -5
- data/spec/punchblock/translator/freeswitch/component/output_spec.rb +7 -3
- data/spec/punchblock/translator/freeswitch/component/tts_output_spec.rb +17 -5
- metadata +67 -61
|
@@ -41,7 +41,7 @@ module Punchblock
|
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
it "sets the command response to true" do
|
|
44
|
-
mock_call.
|
|
44
|
+
mock_call.should_receive(:redirect_back)
|
|
45
45
|
mock_call.should_receive(:register_handler).with do |type, *guards|
|
|
46
46
|
type.should be == :ami
|
|
47
47
|
guards.should have(2).guards
|
|
@@ -48,21 +48,14 @@ module Punchblock
|
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
it "should send a complete event with the specified reason" do
|
|
51
|
-
subject.
|
|
51
|
+
subject.should_receive(:send_event).once.with expected_event
|
|
52
52
|
subject.send_complete_event reason
|
|
53
53
|
end
|
|
54
|
-
|
|
55
|
-
it "should cause the actor to be shut down" do
|
|
56
|
-
subject.wrapped_object.stub(:send_event).and_return true
|
|
57
|
-
subject.send_complete_event reason
|
|
58
|
-
sleep 0.2
|
|
59
|
-
subject.should_not be_alive
|
|
60
|
-
end
|
|
61
54
|
end
|
|
62
55
|
|
|
63
56
|
describe "#call_ended" do
|
|
64
57
|
it "should send a complete event with the call hangup reason" do
|
|
65
|
-
subject.
|
|
58
|
+
subject.should_receive(:send_complete_event).once.with Punchblock::Event::Complete::Hangup.new
|
|
66
59
|
subject.call_ended
|
|
67
60
|
end
|
|
68
61
|
end
|
|
@@ -18,21 +18,6 @@ module Punchblock
|
|
|
18
18
|
|
|
19
19
|
after { translator.terminate if translator.alive? }
|
|
20
20
|
|
|
21
|
-
describe '#shutdown' do
|
|
22
|
-
it "instructs all calls to shutdown" do
|
|
23
|
-
call = Asterisk::Call.new 'foo', subject, ami_client, connection
|
|
24
|
-
call.async.should_receive(:shutdown).once
|
|
25
|
-
subject.register_call call
|
|
26
|
-
subject.shutdown
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
it "terminates the actor" do
|
|
30
|
-
subject.shutdown
|
|
31
|
-
sleep 0.2
|
|
32
|
-
subject.should_not be_alive
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
21
|
describe '#execute_command' do
|
|
37
22
|
describe 'with a call command' do
|
|
38
23
|
let(:command) { Command::Answer.new }
|
|
@@ -136,78 +121,31 @@ module Punchblock
|
|
|
136
121
|
end
|
|
137
122
|
|
|
138
123
|
it 'sends the command to the call for execution' do
|
|
139
|
-
call.
|
|
124
|
+
call.should_receive(:execute_command).once.with command
|
|
140
125
|
subject.execute_call_command command
|
|
141
126
|
end
|
|
142
|
-
end
|
|
143
127
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
128
|
+
context 'when it raises' do
|
|
129
|
+
before do
|
|
130
|
+
call.should_receive(:execute_command).and_raise StandardError
|
|
131
|
+
end
|
|
147
132
|
|
|
148
|
-
|
|
149
|
-
let(:dial_command) { Command::Dial.new :to => 'SIP/1234', :from => 'abc123' }
|
|
133
|
+
let(:other_command) { Command::Answer.new target_call_id: call_id }
|
|
150
134
|
|
|
151
|
-
|
|
135
|
+
it 'sends an error in response to the command' do
|
|
136
|
+
subject.execute_call_command command
|
|
152
137
|
|
|
153
|
-
|
|
154
|
-
subject.async.should_receive(:execute_global_command)
|
|
155
|
-
subject.execute_command dial_command
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
it 'sends an error in response to the command' do
|
|
159
|
-
call = subject.call_with_id call_id
|
|
138
|
+
subject.call_with_id(call_id).should be_nil
|
|
160
139
|
|
|
161
|
-
|
|
162
|
-
|
|
140
|
+
other_command.request!
|
|
141
|
+
subject.execute_call_command other_command
|
|
142
|
+
other_command.response.should be == ProtocolError.new.setup(:item_not_found, "Could not find a call with ID #{call_id}", call_id)
|
|
163
143
|
end
|
|
164
|
-
|
|
165
|
-
connection.should_receive(:handle_event).once.with end_error_event
|
|
166
|
-
|
|
167
|
-
lambda { call.oops }.should raise_error(/Woops, I died/)
|
|
168
|
-
sleep 0.1
|
|
169
|
-
call.should_not be_alive
|
|
170
|
-
subject.call_with_id(call_id).should be_nil
|
|
171
|
-
|
|
172
|
-
command.request!
|
|
173
|
-
subject.execute_call_command command
|
|
174
|
-
command.response.should be == ProtocolError.new.setup(:item_not_found, "Could not find a call with ID #{call_id}", call_id)
|
|
175
144
|
end
|
|
176
145
|
end
|
|
177
146
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
RubyAMI::Event.new 'AsyncAGI',
|
|
181
|
-
'SubEvent' => "Start",
|
|
182
|
-
'Channel' => "SIP/1234-00000000",
|
|
183
|
-
'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"
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
let(:call) { subject.call_for_channel('SIP/1234-00000000') }
|
|
187
|
-
let(:call_id) { call.id }
|
|
188
|
-
|
|
189
|
-
before do
|
|
190
|
-
connection.stub :handle_event
|
|
191
|
-
subject.handle_ami_event ami_event
|
|
192
|
-
call_id
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
it 'sends an error in response to the command' do
|
|
196
|
-
call.wrapped_object.define_singleton_method(:oops) do
|
|
197
|
-
raise 'Woops, I died'
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
connection.should_receive(:handle_event).once.with end_error_event
|
|
201
|
-
|
|
202
|
-
lambda { call.oops }.should raise_error(/Woops, I died/)
|
|
203
|
-
sleep 0.1
|
|
204
|
-
call.should_not be_alive
|
|
205
|
-
subject.call_with_id(call_id).should be_nil
|
|
206
|
-
|
|
207
|
-
command.request!
|
|
208
|
-
subject.execute_call_command command
|
|
209
|
-
command.response.should be == ProtocolError.new.setup(:item_not_found, "Could not find a call with ID #{call_id}", call_id)
|
|
210
|
-
end
|
|
147
|
+
let :end_error_event do
|
|
148
|
+
Punchblock::Event::End.new reason: :error, target_call_id: call_id
|
|
211
149
|
end
|
|
212
150
|
|
|
213
151
|
context "with an unknown call ID" do
|
|
@@ -236,7 +174,7 @@ module Punchblock
|
|
|
236
174
|
end
|
|
237
175
|
|
|
238
176
|
it 'sends the command to the component for execution' do
|
|
239
|
-
component.
|
|
177
|
+
component.should_receive(:execute_command).once.with command
|
|
240
178
|
subject.execute_component_command command
|
|
241
179
|
end
|
|
242
180
|
end
|
|
@@ -262,14 +200,14 @@ module Punchblock
|
|
|
262
200
|
|
|
263
201
|
it 'should be able to look up the call by channel ID' do
|
|
264
202
|
subject.execute_global_command command
|
|
265
|
-
|
|
266
|
-
|
|
203
|
+
call = subject.call_for_channel('SIP/1234')
|
|
204
|
+
call.should be_a Asterisk::Call
|
|
267
205
|
end
|
|
268
206
|
|
|
269
207
|
it 'should instruct the call to send a dial' do
|
|
270
208
|
mock_call = double('Asterisk::Call').as_null_object
|
|
271
|
-
Asterisk::Call.should_receive(:
|
|
272
|
-
mock_call.
|
|
209
|
+
Asterisk::Call.should_receive(:new).once.and_return mock_call
|
|
210
|
+
mock_call.should_receive(:dial).once.with command
|
|
273
211
|
subject.execute_global_command command
|
|
274
212
|
end
|
|
275
213
|
end
|
|
@@ -283,7 +221,7 @@ module Punchblock
|
|
|
283
221
|
|
|
284
222
|
it 'should create a component actor and execute it asynchronously' do
|
|
285
223
|
Asterisk::Component::Asterisk::AMIAction.should_receive(:new).once.with(command, subject, ami_client).and_return mock_action
|
|
286
|
-
mock_action.
|
|
224
|
+
mock_action.should_receive(:execute).once
|
|
287
225
|
subject.execute_global_command command
|
|
288
226
|
end
|
|
289
227
|
|
|
@@ -336,6 +274,16 @@ module Punchblock
|
|
|
336
274
|
subject.handle_ami_event ami_event
|
|
337
275
|
end
|
|
338
276
|
|
|
277
|
+
context "when the event doesn't pass the filter" do
|
|
278
|
+
before { described_class.event_filter = ->(event) { false } }
|
|
279
|
+
after { described_class.event_filter = nil }
|
|
280
|
+
|
|
281
|
+
it 'does not send the AMI event to the connection as a PB event' do
|
|
282
|
+
subject.connection.should_receive(:handle_event).never
|
|
283
|
+
subject.handle_ami_event ami_event
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
|
|
339
287
|
context 'with something that is not a RubyAMI::Event' do
|
|
340
288
|
it 'does not send anything to the connection' do
|
|
341
289
|
subject.connection.should_receive(:handle_event).never
|
|
@@ -365,10 +313,10 @@ module Punchblock
|
|
|
365
313
|
|
|
366
314
|
it 'should be able to look up the call by channel ID' do
|
|
367
315
|
subject.handle_ami_event ami_event
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
316
|
+
call = subject.call_for_channel('SIP/1234-00000000')
|
|
317
|
+
call.should be_a Asterisk::Call
|
|
318
|
+
call.agi_env.should be_a Hash
|
|
319
|
+
call.agi_env.should be == {
|
|
372
320
|
:agi_request => 'async',
|
|
373
321
|
:agi_channel => 'SIP/1234-00000000',
|
|
374
322
|
:agi_language => 'en',
|
|
@@ -394,8 +342,8 @@ module Punchblock
|
|
|
394
342
|
|
|
395
343
|
it 'should instruct the call to send an offer' do
|
|
396
344
|
mock_call = double('Asterisk::Call').as_null_object
|
|
397
|
-
Asterisk::Call.should_receive(:
|
|
398
|
-
mock_call.
|
|
345
|
+
Asterisk::Call.should_receive(:new).once.and_return mock_call
|
|
346
|
+
mock_call.should_receive(:send_offer).once
|
|
399
347
|
subject.handle_ami_event ami_event
|
|
400
348
|
end
|
|
401
349
|
|
|
@@ -407,7 +355,7 @@ module Punchblock
|
|
|
407
355
|
end
|
|
408
356
|
|
|
409
357
|
it "should not create a new call" do
|
|
410
|
-
Asterisk::Call.should_receive(:
|
|
358
|
+
Asterisk::Call.should_receive(:new).never
|
|
411
359
|
subject.handle_ami_event ami_event
|
|
412
360
|
end
|
|
413
361
|
end
|
|
@@ -523,7 +471,7 @@ module Punchblock
|
|
|
523
471
|
end
|
|
524
472
|
|
|
525
473
|
it 'sends the AMI event to the call and to the connection as a PB event' do
|
|
526
|
-
call.
|
|
474
|
+
call.should_receive(:process_ami_event).once.with ami_event
|
|
527
475
|
subject.handle_ami_event ami_event
|
|
528
476
|
end
|
|
529
477
|
|
|
@@ -544,8 +492,8 @@ module Punchblock
|
|
|
544
492
|
before { subject.register_call call2 }
|
|
545
493
|
|
|
546
494
|
it 'should send the event to both calls and to the connection once as a PB event' do
|
|
547
|
-
call.
|
|
548
|
-
call2.
|
|
495
|
+
call.should_receive(:process_ami_event).once.with ami_event
|
|
496
|
+
call2.should_receive(:process_ami_event).once.with ami_event
|
|
549
497
|
subject.handle_ami_event ami_event
|
|
550
498
|
end
|
|
551
499
|
end
|
|
@@ -578,12 +526,12 @@ module Punchblock
|
|
|
578
526
|
end
|
|
579
527
|
|
|
580
528
|
it 'sends the AMI event to the call and to the connection as a PB event if it is an allowed event' do
|
|
581
|
-
call.
|
|
529
|
+
call.should_receive(:process_ami_event).once.with ami_event
|
|
582
530
|
subject.handle_ami_event ami_event
|
|
583
531
|
end
|
|
584
532
|
|
|
585
533
|
it 'does not send the AMI event to a bridged channel if it is not allowed' do
|
|
586
|
-
call.
|
|
534
|
+
call.should_receive(:process_ami_event).never.with ami_event2
|
|
587
535
|
subject.handle_ami_event ami_event2
|
|
588
536
|
end
|
|
589
537
|
|
|
@@ -34,8 +34,8 @@ module Punchblock
|
|
|
34
34
|
|
|
35
35
|
describe '#execute' do
|
|
36
36
|
before { original_command.request! }
|
|
37
|
-
def expect_playback(voice = :kal)
|
|
38
|
-
subject.wrapped_object.should_receive(:application).once.with :speak, "flite|#{voice}
|
|
37
|
+
def expect_playback(voice = :kal, doc = "FOO")
|
|
38
|
+
subject.wrapped_object.should_receive(:application).once.with :speak, "flite|#{voice}|#{doc}"
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
let(:command_opts) { {} }
|
|
@@ -74,10 +74,10 @@ module Punchblock
|
|
|
74
74
|
|
|
75
75
|
context 'with multiple documents' do
|
|
76
76
|
let(:command_opts) { { :render_documents => [{:value => ssml_doc}, {:value => ssml_doc}] } }
|
|
77
|
-
|
|
77
|
+
|
|
78
|
+
it "should render all audio files from all documents" do
|
|
79
|
+
expect_playback :kal, "FOOFOO"
|
|
78
80
|
subject.execute
|
|
79
|
-
error = ProtocolError.new.setup 'option error', 'Only a single document is supported.'
|
|
80
|
-
original_command.response(0.1).should be == error
|
|
81
81
|
end
|
|
82
82
|
end
|
|
83
83
|
end
|
|
@@ -133,11 +133,15 @@ module Punchblock
|
|
|
133
133
|
end
|
|
134
134
|
|
|
135
135
|
context 'with multiple documents' do
|
|
136
|
+
let(:audio_filename) { 'http://foo.com/bar.mp3' }
|
|
137
|
+
let :ssml_doc do
|
|
138
|
+
RubySpeech::SSML.draw { audio :src => audio_filename }
|
|
139
|
+
end
|
|
136
140
|
let(:command_opts) { { :render_documents => [{:value => ssml_doc}, {:value => ssml_doc}] } }
|
|
137
|
-
|
|
141
|
+
|
|
142
|
+
it "should render all audio files from all documents" do
|
|
143
|
+
expect_playback [audio_filename, audio_filename].join('!')
|
|
138
144
|
subject.execute
|
|
139
|
-
error = ProtocolError.new.setup 'option error', 'Only a single document is supported.'
|
|
140
|
-
original_command.response(0.1).should be == error
|
|
141
145
|
end
|
|
142
146
|
end
|
|
143
147
|
end
|
|
@@ -34,8 +34,8 @@ module Punchblock
|
|
|
34
34
|
|
|
35
35
|
describe '#execute' do
|
|
36
36
|
before { original_command.request! }
|
|
37
|
-
def expect_playback(voice = :kal, renderer = :flite)
|
|
38
|
-
subject.wrapped_object.should_receive(:application).once.with :speak, "#{renderer}|#{voice}|#{
|
|
37
|
+
def expect_playback(voice = :kal, renderer = :flite, doc = ssml_doc)
|
|
38
|
+
subject.wrapped_object.should_receive(:application).once.with :speak, "#{renderer}|#{voice}|#{doc}"
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
let :ssml_doc do
|
|
@@ -80,11 +80,23 @@ module Punchblock
|
|
|
80
80
|
end
|
|
81
81
|
|
|
82
82
|
context 'with multiple documents' do
|
|
83
|
+
let(:audio_filename) { 'http://foo.com/bar.mp3' }
|
|
84
|
+
let :ssml_doc do
|
|
85
|
+
RubySpeech::SSML.draw { audio :src => audio_filename }
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
let :expected_doc do
|
|
89
|
+
RubySpeech::SSML.draw do
|
|
90
|
+
audio :src => audio_filename
|
|
91
|
+
audio :src => audio_filename
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
83
95
|
let(:command_opts) { { :render_documents => [{:value => ssml_doc}, {:value => ssml_doc}] } }
|
|
84
|
-
|
|
96
|
+
|
|
97
|
+
it "should render all audio files from all documents" do
|
|
98
|
+
expect_playback :kal, :flite, expected_doc
|
|
85
99
|
subject.execute
|
|
86
|
-
error = ProtocolError.new.setup 'option error', 'Only a single document is supported.'
|
|
87
|
-
original_command.response(0.1).should be == error
|
|
88
100
|
end
|
|
89
101
|
end
|
|
90
102
|
end
|
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: 2.
|
|
4
|
+
version: 2.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jason Goecke
|
|
@@ -10,354 +10,354 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date:
|
|
13
|
+
date: 2014-01-15 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: nokogiri
|
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
|
18
18
|
requirements:
|
|
19
|
-
- - ~>
|
|
19
|
+
- - "~>"
|
|
20
20
|
- !ruby/object:Gem::Version
|
|
21
21
|
version: '1.5'
|
|
22
|
-
- -
|
|
22
|
+
- - ">="
|
|
23
23
|
- !ruby/object:Gem::Version
|
|
24
24
|
version: 1.5.6
|
|
25
25
|
type: :runtime
|
|
26
26
|
prerelease: false
|
|
27
27
|
version_requirements: !ruby/object:Gem::Requirement
|
|
28
28
|
requirements:
|
|
29
|
-
- - ~>
|
|
29
|
+
- - "~>"
|
|
30
30
|
- !ruby/object:Gem::Version
|
|
31
31
|
version: '1.5'
|
|
32
|
-
- -
|
|
32
|
+
- - ">="
|
|
33
33
|
- !ruby/object:Gem::Version
|
|
34
34
|
version: 1.5.6
|
|
35
35
|
- !ruby/object:Gem::Dependency
|
|
36
36
|
name: blather
|
|
37
37
|
requirement: !ruby/object:Gem::Requirement
|
|
38
38
|
requirements:
|
|
39
|
-
- -
|
|
39
|
+
- - ">="
|
|
40
40
|
- !ruby/object:Gem::Version
|
|
41
41
|
version: 0.7.0
|
|
42
42
|
type: :runtime
|
|
43
43
|
prerelease: false
|
|
44
44
|
version_requirements: !ruby/object:Gem::Requirement
|
|
45
45
|
requirements:
|
|
46
|
-
- -
|
|
46
|
+
- - ">="
|
|
47
47
|
- !ruby/object:Gem::Version
|
|
48
48
|
version: 0.7.0
|
|
49
49
|
- !ruby/object:Gem::Dependency
|
|
50
50
|
name: activesupport
|
|
51
51
|
requirement: !ruby/object:Gem::Requirement
|
|
52
52
|
requirements:
|
|
53
|
-
- -
|
|
53
|
+
- - ">="
|
|
54
54
|
- !ruby/object:Gem::Version
|
|
55
55
|
version: 3.0.0
|
|
56
|
-
- - <
|
|
56
|
+
- - "<"
|
|
57
57
|
- !ruby/object:Gem::Version
|
|
58
58
|
version: 5.0.0
|
|
59
59
|
type: :runtime
|
|
60
60
|
prerelease: false
|
|
61
61
|
version_requirements: !ruby/object:Gem::Requirement
|
|
62
62
|
requirements:
|
|
63
|
-
- -
|
|
63
|
+
- - ">="
|
|
64
64
|
- !ruby/object:Gem::Version
|
|
65
65
|
version: 3.0.0
|
|
66
|
-
- - <
|
|
66
|
+
- - "<"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
68
|
version: 5.0.0
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
70
|
name: state_machine
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
72
72
|
requirements:
|
|
73
|
-
- - ~>
|
|
73
|
+
- - "~>"
|
|
74
74
|
- !ruby/object:Gem::Version
|
|
75
75
|
version: '1.0'
|
|
76
76
|
type: :runtime
|
|
77
77
|
prerelease: false
|
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
79
|
requirements:
|
|
80
|
-
- - ~>
|
|
80
|
+
- - "~>"
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
82
|
version: '1.0'
|
|
83
83
|
- !ruby/object:Gem::Dependency
|
|
84
84
|
name: future-resource
|
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
|
86
86
|
requirements:
|
|
87
|
-
- - ~>
|
|
87
|
+
- - "~>"
|
|
88
88
|
- !ruby/object:Gem::Version
|
|
89
89
|
version: '1.0'
|
|
90
90
|
type: :runtime
|
|
91
91
|
prerelease: false
|
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
93
|
requirements:
|
|
94
|
-
- - ~>
|
|
94
|
+
- - "~>"
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
96
|
version: '1.0'
|
|
97
97
|
- !ruby/object:Gem::Dependency
|
|
98
98
|
name: has-guarded-handlers
|
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
|
100
100
|
requirements:
|
|
101
|
-
- - ~>
|
|
101
|
+
- - "~>"
|
|
102
102
|
- !ruby/object:Gem::Version
|
|
103
103
|
version: '1.5'
|
|
104
104
|
type: :runtime
|
|
105
105
|
prerelease: false
|
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
107
|
requirements:
|
|
108
|
-
- - ~>
|
|
108
|
+
- - "~>"
|
|
109
109
|
- !ruby/object:Gem::Version
|
|
110
110
|
version: '1.5'
|
|
111
111
|
- !ruby/object:Gem::Dependency
|
|
112
112
|
name: celluloid
|
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
|
114
114
|
requirements:
|
|
115
|
-
- - ~>
|
|
115
|
+
- - "~>"
|
|
116
116
|
- !ruby/object:Gem::Version
|
|
117
117
|
version: '0.14'
|
|
118
118
|
type: :runtime
|
|
119
119
|
prerelease: false
|
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
121
|
requirements:
|
|
122
|
-
- - ~>
|
|
122
|
+
- - "~>"
|
|
123
123
|
- !ruby/object:Gem::Version
|
|
124
124
|
version: '0.14'
|
|
125
125
|
- !ruby/object:Gem::Dependency
|
|
126
126
|
name: ruby_ami
|
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
|
128
128
|
requirements:
|
|
129
|
-
- - ~>
|
|
129
|
+
- - "~>"
|
|
130
130
|
- !ruby/object:Gem::Version
|
|
131
131
|
version: '2.0'
|
|
132
132
|
type: :runtime
|
|
133
133
|
prerelease: false
|
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
|
135
135
|
requirements:
|
|
136
|
-
- - ~>
|
|
136
|
+
- - "~>"
|
|
137
137
|
- !ruby/object:Gem::Version
|
|
138
138
|
version: '2.0'
|
|
139
139
|
- !ruby/object:Gem::Dependency
|
|
140
140
|
name: ruby_fs
|
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
|
142
142
|
requirements:
|
|
143
|
-
- - ~>
|
|
143
|
+
- - "~>"
|
|
144
144
|
- !ruby/object:Gem::Version
|
|
145
145
|
version: '1.1'
|
|
146
146
|
type: :runtime
|
|
147
147
|
prerelease: false
|
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
|
149
149
|
requirements:
|
|
150
|
-
- - ~>
|
|
150
|
+
- - "~>"
|
|
151
151
|
- !ruby/object:Gem::Version
|
|
152
152
|
version: '1.1'
|
|
153
153
|
- !ruby/object:Gem::Dependency
|
|
154
154
|
name: ruby_speech
|
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
|
156
156
|
requirements:
|
|
157
|
-
- - ~>
|
|
157
|
+
- - "~>"
|
|
158
158
|
- !ruby/object:Gem::Version
|
|
159
159
|
version: '2.3'
|
|
160
160
|
type: :runtime
|
|
161
161
|
prerelease: false
|
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
|
163
163
|
requirements:
|
|
164
|
-
- - ~>
|
|
164
|
+
- - "~>"
|
|
165
165
|
- !ruby/object:Gem::Version
|
|
166
166
|
version: '2.3'
|
|
167
167
|
- !ruby/object:Gem::Dependency
|
|
168
168
|
name: virtus
|
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
|
170
170
|
requirements:
|
|
171
|
-
- - ~>
|
|
171
|
+
- - "~>"
|
|
172
172
|
- !ruby/object:Gem::Version
|
|
173
173
|
version: '1.0'
|
|
174
174
|
type: :runtime
|
|
175
175
|
prerelease: false
|
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
|
177
177
|
requirements:
|
|
178
|
-
- - ~>
|
|
178
|
+
- - "~>"
|
|
179
179
|
- !ruby/object:Gem::Version
|
|
180
180
|
version: '1.0'
|
|
181
181
|
- !ruby/object:Gem::Dependency
|
|
182
182
|
name: ruby_jid
|
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
|
184
184
|
requirements:
|
|
185
|
-
- - ~>
|
|
185
|
+
- - "~>"
|
|
186
186
|
- !ruby/object:Gem::Version
|
|
187
187
|
version: '1.0'
|
|
188
188
|
type: :runtime
|
|
189
189
|
prerelease: false
|
|
190
190
|
version_requirements: !ruby/object:Gem::Requirement
|
|
191
191
|
requirements:
|
|
192
|
-
- - ~>
|
|
192
|
+
- - "~>"
|
|
193
193
|
- !ruby/object:Gem::Version
|
|
194
194
|
version: '1.0'
|
|
195
195
|
- !ruby/object:Gem::Dependency
|
|
196
196
|
name: bundler
|
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
|
198
198
|
requirements:
|
|
199
|
-
- - ~>
|
|
199
|
+
- - "~>"
|
|
200
200
|
- !ruby/object:Gem::Version
|
|
201
201
|
version: '1.0'
|
|
202
202
|
type: :development
|
|
203
203
|
prerelease: false
|
|
204
204
|
version_requirements: !ruby/object:Gem::Requirement
|
|
205
205
|
requirements:
|
|
206
|
-
- - ~>
|
|
206
|
+
- - "~>"
|
|
207
207
|
- !ruby/object:Gem::Version
|
|
208
208
|
version: '1.0'
|
|
209
209
|
- !ruby/object:Gem::Dependency
|
|
210
210
|
name: rspec
|
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|
|
212
212
|
requirements:
|
|
213
|
-
- - ~>
|
|
213
|
+
- - "~>"
|
|
214
214
|
- !ruby/object:Gem::Version
|
|
215
215
|
version: '2.7'
|
|
216
216
|
type: :development
|
|
217
217
|
prerelease: false
|
|
218
218
|
version_requirements: !ruby/object:Gem::Requirement
|
|
219
219
|
requirements:
|
|
220
|
-
- - ~>
|
|
220
|
+
- - "~>"
|
|
221
221
|
- !ruby/object:Gem::Version
|
|
222
222
|
version: '2.7'
|
|
223
223
|
- !ruby/object:Gem::Dependency
|
|
224
224
|
name: ci_reporter
|
|
225
225
|
requirement: !ruby/object:Gem::Requirement
|
|
226
226
|
requirements:
|
|
227
|
-
- - ~>
|
|
227
|
+
- - "~>"
|
|
228
228
|
- !ruby/object:Gem::Version
|
|
229
229
|
version: '1.6'
|
|
230
230
|
type: :development
|
|
231
231
|
prerelease: false
|
|
232
232
|
version_requirements: !ruby/object:Gem::Requirement
|
|
233
233
|
requirements:
|
|
234
|
-
- - ~>
|
|
234
|
+
- - "~>"
|
|
235
235
|
- !ruby/object:Gem::Version
|
|
236
236
|
version: '1.6'
|
|
237
237
|
- !ruby/object:Gem::Dependency
|
|
238
238
|
name: yard
|
|
239
239
|
requirement: !ruby/object:Gem::Requirement
|
|
240
240
|
requirements:
|
|
241
|
-
- - ~>
|
|
241
|
+
- - "~>"
|
|
242
242
|
- !ruby/object:Gem::Version
|
|
243
243
|
version: '0.6'
|
|
244
244
|
type: :development
|
|
245
245
|
prerelease: false
|
|
246
246
|
version_requirements: !ruby/object:Gem::Requirement
|
|
247
247
|
requirements:
|
|
248
|
-
- - ~>
|
|
248
|
+
- - "~>"
|
|
249
249
|
- !ruby/object:Gem::Version
|
|
250
250
|
version: '0.6'
|
|
251
251
|
- !ruby/object:Gem::Dependency
|
|
252
252
|
name: rake
|
|
253
253
|
requirement: !ruby/object:Gem::Requirement
|
|
254
254
|
requirements:
|
|
255
|
-
- -
|
|
255
|
+
- - ">="
|
|
256
256
|
- !ruby/object:Gem::Version
|
|
257
257
|
version: '0'
|
|
258
258
|
type: :development
|
|
259
259
|
prerelease: false
|
|
260
260
|
version_requirements: !ruby/object:Gem::Requirement
|
|
261
261
|
requirements:
|
|
262
|
-
- -
|
|
262
|
+
- - ">="
|
|
263
263
|
- !ruby/object:Gem::Version
|
|
264
264
|
version: '0'
|
|
265
265
|
- !ruby/object:Gem::Dependency
|
|
266
266
|
name: i18n
|
|
267
267
|
requirement: !ruby/object:Gem::Requirement
|
|
268
268
|
requirements:
|
|
269
|
-
- -
|
|
269
|
+
- - ">="
|
|
270
270
|
- !ruby/object:Gem::Version
|
|
271
271
|
version: '0'
|
|
272
272
|
type: :development
|
|
273
273
|
prerelease: false
|
|
274
274
|
version_requirements: !ruby/object:Gem::Requirement
|
|
275
275
|
requirements:
|
|
276
|
-
- -
|
|
276
|
+
- - ">="
|
|
277
277
|
- !ruby/object:Gem::Version
|
|
278
278
|
version: '0'
|
|
279
279
|
- !ruby/object:Gem::Dependency
|
|
280
280
|
name: countdownlatch
|
|
281
281
|
requirement: !ruby/object:Gem::Requirement
|
|
282
282
|
requirements:
|
|
283
|
-
- -
|
|
283
|
+
- - ">="
|
|
284
284
|
- !ruby/object:Gem::Version
|
|
285
285
|
version: '0'
|
|
286
286
|
type: :development
|
|
287
287
|
prerelease: false
|
|
288
288
|
version_requirements: !ruby/object:Gem::Requirement
|
|
289
289
|
requirements:
|
|
290
|
-
- -
|
|
290
|
+
- - ">="
|
|
291
291
|
- !ruby/object:Gem::Version
|
|
292
292
|
version: '0'
|
|
293
293
|
- !ruby/object:Gem::Dependency
|
|
294
294
|
name: guard-rspec
|
|
295
295
|
requirement: !ruby/object:Gem::Requirement
|
|
296
296
|
requirements:
|
|
297
|
-
- -
|
|
297
|
+
- - ">="
|
|
298
298
|
- !ruby/object:Gem::Version
|
|
299
299
|
version: '0'
|
|
300
300
|
type: :development
|
|
301
301
|
prerelease: false
|
|
302
302
|
version_requirements: !ruby/object:Gem::Requirement
|
|
303
303
|
requirements:
|
|
304
|
-
- -
|
|
304
|
+
- - ">="
|
|
305
305
|
- !ruby/object:Gem::Version
|
|
306
306
|
version: '0'
|
|
307
307
|
- !ruby/object:Gem::Dependency
|
|
308
308
|
name: rb-fsevent
|
|
309
309
|
requirement: !ruby/object:Gem::Requirement
|
|
310
310
|
requirements:
|
|
311
|
-
- - ~>
|
|
311
|
+
- - "~>"
|
|
312
312
|
- !ruby/object:Gem::Version
|
|
313
313
|
version: '0.9'
|
|
314
314
|
type: :development
|
|
315
315
|
prerelease: false
|
|
316
316
|
version_requirements: !ruby/object:Gem::Requirement
|
|
317
317
|
requirements:
|
|
318
|
-
- - ~>
|
|
318
|
+
- - "~>"
|
|
319
319
|
- !ruby/object:Gem::Version
|
|
320
320
|
version: '0.9'
|
|
321
321
|
- !ruby/object:Gem::Dependency
|
|
322
322
|
name: coveralls
|
|
323
323
|
requirement: !ruby/object:Gem::Requirement
|
|
324
324
|
requirements:
|
|
325
|
-
- -
|
|
325
|
+
- - ">="
|
|
326
326
|
- !ruby/object:Gem::Version
|
|
327
327
|
version: '0'
|
|
328
328
|
type: :development
|
|
329
329
|
prerelease: false
|
|
330
330
|
version_requirements: !ruby/object:Gem::Requirement
|
|
331
331
|
requirements:
|
|
332
|
-
- -
|
|
332
|
+
- - ">="
|
|
333
333
|
- !ruby/object:Gem::Version
|
|
334
334
|
version: '0'
|
|
335
335
|
- !ruby/object:Gem::Dependency
|
|
336
336
|
name: guard-rake
|
|
337
337
|
requirement: !ruby/object:Gem::Requirement
|
|
338
338
|
requirements:
|
|
339
|
-
- -
|
|
339
|
+
- - ">="
|
|
340
340
|
- !ruby/object:Gem::Version
|
|
341
341
|
version: '0'
|
|
342
342
|
type: :development
|
|
343
343
|
prerelease: false
|
|
344
344
|
version_requirements: !ruby/object:Gem::Requirement
|
|
345
345
|
requirements:
|
|
346
|
-
- -
|
|
346
|
+
- - ">="
|
|
347
347
|
- !ruby/object:Gem::Version
|
|
348
348
|
version: '0'
|
|
349
349
|
- !ruby/object:Gem::Dependency
|
|
350
350
|
name: benchmark_suite
|
|
351
351
|
requirement: !ruby/object:Gem::Requirement
|
|
352
352
|
requirements:
|
|
353
|
-
- -
|
|
353
|
+
- - ">="
|
|
354
354
|
- !ruby/object:Gem::Version
|
|
355
355
|
version: '0'
|
|
356
356
|
type: :development
|
|
357
357
|
prerelease: false
|
|
358
358
|
version_requirements: !ruby/object:Gem::Requirement
|
|
359
359
|
requirements:
|
|
360
|
-
- -
|
|
360
|
+
- - ">="
|
|
361
361
|
- !ruby/object:Gem::Version
|
|
362
362
|
version: '0'
|
|
363
363
|
description: Like Rack is to Rails and Sinatra, Punchblock provides a consistent API
|
|
@@ -367,10 +367,10 @@ executables: []
|
|
|
367
367
|
extensions: []
|
|
368
368
|
extra_rdoc_files: []
|
|
369
369
|
files:
|
|
370
|
-
- .document
|
|
371
|
-
- .gitignore
|
|
372
|
-
- .rspec
|
|
373
|
-
- .travis.yml
|
|
370
|
+
- ".document"
|
|
371
|
+
- ".gitignore"
|
|
372
|
+
- ".rspec"
|
|
373
|
+
- ".travis.yml"
|
|
374
374
|
- CHANGELOG.md
|
|
375
375
|
- Gemfile
|
|
376
376
|
- Guardfile
|
|
@@ -405,7 +405,9 @@ files:
|
|
|
405
405
|
- lib/punchblock/component/input.rb
|
|
406
406
|
- lib/punchblock/component/output.rb
|
|
407
407
|
- lib/punchblock/component/prompt.rb
|
|
408
|
+
- lib/punchblock/component/receive_fax.rb
|
|
408
409
|
- lib/punchblock/component/record.rb
|
|
410
|
+
- lib/punchblock/component/send_fax.rb
|
|
409
411
|
- lib/punchblock/component/stop.rb
|
|
410
412
|
- lib/punchblock/connection.rb
|
|
411
413
|
- lib/punchblock/connection/asterisk.rb
|
|
@@ -491,7 +493,9 @@ files:
|
|
|
491
493
|
- spec/punchblock/component/input_spec.rb
|
|
492
494
|
- spec/punchblock/component/output_spec.rb
|
|
493
495
|
- spec/punchblock/component/prompt_spec.rb
|
|
496
|
+
- spec/punchblock/component/receive_fax_spec.rb
|
|
494
497
|
- spec/punchblock/component/record_spec.rb
|
|
498
|
+
- spec/punchblock/component/send_fax_spec.rb
|
|
495
499
|
- spec/punchblock/connection/asterisk_spec.rb
|
|
496
500
|
- spec/punchblock/connection/freeswitch_spec.rb
|
|
497
501
|
- spec/punchblock/connection/xmpp_spec.rb
|
|
@@ -542,17 +546,17 @@ require_paths:
|
|
|
542
546
|
- lib
|
|
543
547
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
544
548
|
requirements:
|
|
545
|
-
- -
|
|
549
|
+
- - ">="
|
|
546
550
|
- !ruby/object:Gem::Version
|
|
547
551
|
version: '0'
|
|
548
552
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
549
553
|
requirements:
|
|
550
|
-
- -
|
|
554
|
+
- - ">="
|
|
551
555
|
- !ruby/object:Gem::Version
|
|
552
556
|
version: 1.3.7
|
|
553
557
|
requirements: []
|
|
554
558
|
rubyforge_project: punchblock
|
|
555
|
-
rubygems_version: 2.0
|
|
559
|
+
rubygems_version: 2.2.0
|
|
556
560
|
signing_key:
|
|
557
561
|
specification_version: 4
|
|
558
562
|
summary: Punchblock is a telephony middleware library
|
|
@@ -577,7 +581,9 @@ test_files:
|
|
|
577
581
|
- spec/punchblock/component/input_spec.rb
|
|
578
582
|
- spec/punchblock/component/output_spec.rb
|
|
579
583
|
- spec/punchblock/component/prompt_spec.rb
|
|
584
|
+
- spec/punchblock/component/receive_fax_spec.rb
|
|
580
585
|
- spec/punchblock/component/record_spec.rb
|
|
586
|
+
- spec/punchblock/component/send_fax_spec.rb
|
|
581
587
|
- spec/punchblock/connection/asterisk_spec.rb
|
|
582
588
|
- spec/punchblock/connection/freeswitch_spec.rb
|
|
583
589
|
- spec/punchblock/connection/xmpp_spec.rb
|