punchblock 2.1.1 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -1
  3. data/CHANGELOG.md +7 -0
  4. data/lib/punchblock.rb +1 -1
  5. data/lib/punchblock/component.rb +2 -0
  6. data/lib/punchblock/component/input.rb +9 -1
  7. data/lib/punchblock/component/output.rb +1 -1
  8. data/lib/punchblock/component/receive_fax.rb +24 -0
  9. data/lib/punchblock/component/send_fax.rb +62 -0
  10. data/lib/punchblock/connection/asterisk.rb +1 -1
  11. data/lib/punchblock/event/complete.rb +15 -1
  12. data/lib/punchblock/translator/asterisk.rb +30 -15
  13. data/lib/punchblock/translator/asterisk/call.rb +13 -27
  14. data/lib/punchblock/translator/asterisk/component.rb +4 -7
  15. data/lib/punchblock/translator/asterisk/component/asterisk/agi_command.rb +1 -5
  16. data/lib/punchblock/translator/asterisk/component/composed_prompt.rb +8 -9
  17. data/lib/punchblock/translator/asterisk/component/input.rb +2 -3
  18. data/lib/punchblock/translator/asterisk/component/mrcp_prompt.rb +9 -9
  19. data/lib/punchblock/translator/asterisk/component/output.rb +134 -39
  20. data/lib/punchblock/translator/asterisk/component/record.rb +2 -3
  21. data/lib/punchblock/translator/asterisk/component/stop_by_redirect.rb +2 -3
  22. data/lib/punchblock/translator/dtmf_recognizer.rb +2 -4
  23. data/lib/punchblock/translator/freeswitch/component/abstract_output.rb +6 -1
  24. data/lib/punchblock/translator/freeswitch/component/flite_output.rb +1 -1
  25. data/lib/punchblock/translator/freeswitch/component/output.rb +12 -10
  26. data/lib/punchblock/translator/freeswitch/component/tts_output.rb +1 -1
  27. data/lib/punchblock/version.rb +1 -1
  28. data/spec/punchblock/component/input_spec.rb +91 -0
  29. data/spec/punchblock/component/output_spec.rb +1 -2
  30. data/spec/punchblock/component/receive_fax_spec.rb +111 -0
  31. data/spec/punchblock/component/send_fax_spec.rb +110 -0
  32. data/spec/punchblock/connection/asterisk_spec.rb +1 -1
  33. data/spec/punchblock/translator/asterisk/call_spec.rb +53 -79
  34. data/spec/punchblock/translator/asterisk/component/asterisk/agi_command_spec.rb +0 -3
  35. data/spec/punchblock/translator/asterisk/component/asterisk/ami_action_spec.rb +1 -1
  36. data/spec/punchblock/translator/asterisk/component/composed_prompt_spec.rb +2 -2
  37. data/spec/punchblock/translator/asterisk/component/input_spec.rb +6 -6
  38. data/spec/punchblock/translator/asterisk/component/mrcp_native_prompt_spec.rb +3 -3
  39. data/spec/punchblock/translator/asterisk/component/mrcp_prompt_spec.rb +9 -11
  40. data/spec/punchblock/translator/asterisk/component/output_spec.rb +902 -28
  41. data/spec/punchblock/translator/asterisk/component/stop_by_redirect_spec.rb +1 -1
  42. data/spec/punchblock/translator/asterisk/component_spec.rb +2 -9
  43. data/spec/punchblock/translator/asterisk_spec.rb +42 -94
  44. data/spec/punchblock/translator/freeswitch/component/flite_output_spec.rb +5 -5
  45. data/spec/punchblock/translator/freeswitch/component/output_spec.rb +7 -3
  46. data/spec/punchblock/translator/freeswitch/component/tts_output_spec.rb +17 -5
  47. 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.async.should_receive(:redirect_back)
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.wrapped_object.should_receive(:send_event).once.with expected_event
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.wrapped_object.should_receive(:send_complete_event).once.with Punchblock::Event::Complete::Hangup.new
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.async.should_receive(:execute_command).once.with command
124
+ call.should_receive(:execute_command).once.with command
140
125
  subject.execute_call_command command
141
126
  end
142
- end
143
127
 
144
- let :end_error_event do
145
- Punchblock::Event::End.new reason: :error, target_call_id: call_id
146
- end
128
+ context 'when it raises' do
129
+ before do
130
+ call.should_receive(:execute_command).and_raise StandardError
131
+ end
147
132
 
148
- context "for an outgoing call which began executing but crashed" do
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
- let(:call_id) { dial_command.response.call_id }
135
+ it 'sends an error in response to the command' do
136
+ subject.execute_call_command command
152
137
 
153
- before do
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
- call.wrapped_object.define_singleton_method(:oops) do
162
- raise 'Woops, I died'
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
- context "for an incoming call which began executing but crashed" do
179
- let :ami_event do
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.async.should_receive(:execute_command).once.with command
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
- call_actor = subject.call_for_channel('SIP/1234')
266
- call_actor.wrapped_object.should be_a Asterisk::Call
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(:new_link).once.and_return mock_call
272
- mock_call.async.should_receive(:dial).once.with command
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.async.should_receive(:execute).once
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
- call_actor = subject.call_for_channel('SIP/1234-00000000')
369
- call_actor.should be_a Asterisk::Call
370
- call_actor.agi_env.should be_a Hash
371
- call_actor.agi_env.should be == {
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(:new_link).once.and_return mock_call
398
- mock_call.async.should_receive(:send_offer).once
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(:new_link).never
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.async.should_receive(:process_ami_event).once.with ami_event
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.async.should_receive(:process_ami_event).once.with ami_event
548
- call2.async.should_receive(:process_ami_event).once.with ami_event
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.async.should_receive(:process_ami_event).once.with ami_event
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.async.should_receive(:process_ami_event).never.with ami_event2
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}|FOO"
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
- it "should return an error and not execute any actions" do
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
- it "should return an error and not execute any actions" do
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}|#{ssml_doc}"
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
- it "should return an error and not execute any actions" do
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.1.1
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: 2013-12-19 00:00:00.000000000 Z
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.2
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