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.
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