freec 0.2.6 → 0.2.7

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2914222ca5a7510ef0738b9d28eeb18fe5c41e03
4
+ data.tar.gz: 973b2970fb112031e662cf533f87e922a2e6fa60
5
+ SHA512:
6
+ metadata.gz: 145213091d5bca8cb8f56211f3cb1539d90a3576f60ac6a5b7c5e8baffb6abf30cf62618c930f20dd4298f28670978c45772a889db0975d7da4276ced64c5287
7
+ data.tar.gz: a4d1df85b3f5083b3addb6227411fd45cd819b74b16bf3776f428e8671139f4e7beca0e4374961391c0e9cd3cf5b510151e0228c519f926afc100e1d2b27ae05
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ pkg
2
+ doc
3
+ Manifest
4
+ *gem
5
+ .rspec_status
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in freec.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,39 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ freec (0.2.7)
5
+ daemons (~> 1.2.4)
6
+ gserver (~> 0.0.1)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ daemons (1.2.4)
12
+ diff-lcs (1.3)
13
+ gserver (0.0.1)
14
+ rake (10.5.0)
15
+ rspec (3.5.0)
16
+ rspec-core (~> 3.5.0)
17
+ rspec-expectations (~> 3.5.0)
18
+ rspec-mocks (~> 3.5.0)
19
+ rspec-core (3.5.4)
20
+ rspec-support (~> 3.5.0)
21
+ rspec-expectations (3.5.0)
22
+ diff-lcs (>= 1.2.0, < 2.0)
23
+ rspec-support (~> 3.5.0)
24
+ rspec-mocks (3.5.0)
25
+ diff-lcs (>= 1.2.0, < 2.0)
26
+ rspec-support (~> 3.5.0)
27
+ rspec-support (3.5.0)
28
+
29
+ PLATFORMS
30
+ ruby
31
+
32
+ DEPENDENCIES
33
+ bundler (~> 1.14)
34
+ freec!
35
+ rake (~> 10.0)
36
+ rspec (~> 3.0)
37
+
38
+ BUNDLED WITH
39
+ 1.14.4
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 Jan Kubr
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.rdoc CHANGED
@@ -58,7 +58,7 @@ If you return nil or false from the step method, the call will be hungup.
58
58
 
59
59
  = Stinks?
60
60
  What Freec can do at the moment was enough for me to implement Telfa (http://telfapbx.com). If it doesn't fit your needs, you can:
61
- 1. Complain to hi@jankubr.com .
61
+ 1. Complain to mail@jankubr.com .
62
62
  2. Fork it and change yourself.
63
63
  3. Check Liverpie (http://www.liverpie.com/) or Telegraph (http://code.google.com/p/telegraph/), Freec is inspired by them.
64
64
  4. Write yours :-)
data/Rakefile CHANGED
@@ -1,42 +1,6 @@
1
- require 'rubygems'
2
- require 'rake'
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
3
 
4
- desc 'Clean up files.'
5
- task :clean do |t|
6
- FileUtils.rm_rf "tmp"
7
- FileUtils.rm_rf "pkg"
8
- end
4
+ RSpec::Core::RakeTask.new(:spec)
9
5
 
10
- spec = Gem::Specification.new do |s|
11
- s.name = "freec"
12
- s.version = '0.2.6'
13
- s.author = "Jan Kubr"
14
- s.email = "mail@jankubr.com"
15
- s.homepage = "http://github.com/jankubr/freec"
16
- s.platform = Gem::Platform::RUBY
17
- s.summary = "The layer between your Ruby voice app and FreeSWITCH."
18
- s.files = FileList["README*",
19
- "Rakefile",
20
- "{lib,spec}/**/*"].to_a
21
- s.require_path = "lib"
22
- s.rubyforge_project = "freec"
23
- s.has_rdoc = false
24
- s.extra_rdoc_files = FileList["README*"].to_a
25
- s.rdoc_options << '--line-numbers' << '--inline-source'
26
- s.add_dependency "daemons"
27
- s.add_development_dependency 'rspec', '> 2.0.1'
28
- end
29
-
30
- desc "Generate a gemspec file"
31
- task :gemspec do
32
- File.open("#{spec.name}.gemspec", 'w') do |f|
33
- f.write spec.to_ruby
34
- end
35
- end
36
-
37
- require 'rspec/core/rake_task'
38
-
39
- desc "Run all specs"
40
- RSpec::Core::RakeTask.new(:spec) do |t|
41
- t.pattern = FileList['spec/**/*.rb']
42
- end
6
+ task default: :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "freec"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/freec.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'freec/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "freec"
8
+ spec.version = Freec::VERSION
9
+ spec.authors = ["Jan Kubr"]
10
+ spec.email = ["mail@jankubr.com"]
11
+
12
+ spec.summary = "The layer between your Ruby voice app and FreeSWITCH."
13
+ spec.description = "The layer between your Ruby voice app and FreeSWITCH."
14
+ spec.homepage = "http://github.com/jankubr/freec"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_runtime_dependency 'gserver', '~> 0.0.1'
25
+ spec.add_runtime_dependency 'daemons', '~> 1.2.4'
26
+
27
+ spec.add_development_dependency "bundler", "~> 1.14"
28
+ spec.add_development_dependency "rake", "~> 10.0"
29
+ spec.add_development_dependency "rspec", "~> 3.0"
30
+ end
data/lib/freec.rb CHANGED
@@ -1,6 +1,8 @@
1
+ require 'freec/version'
1
2
  lib_dir = File.dirname(__FILE__)
2
3
  $LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
3
- require "freec_base"
4
+ require 'gserver'
5
+ require 'freec_base'
4
6
  require 'listener'
5
7
 
6
8
  require 'fileutils'
@@ -9,7 +11,7 @@ require 'daemons/daemonize'
9
11
  include Daemonize
10
12
 
11
13
  def freec_app_file_name
12
- $0.sub(/\.[^\.]*$/, '')
14
+ $0.sub(/\.[^\.]*$/, '')
13
15
  end
14
16
 
15
17
  def freec_app_class_name
@@ -21,7 +23,7 @@ def freec_app_log_dir
21
23
  end
22
24
 
23
25
  def create_freec_app_log_dir
24
- FileUtils.mkdir_p(freec_app_log_dir)
26
+ FileUtils.mkdir_p(freec_app_log_dir)
25
27
  end
26
28
 
27
29
  def freec_app_log_file
@@ -59,9 +61,6 @@ unless defined?(TEST)
59
61
  server = Listener.new(freec_app_class_name, @@config)
60
62
  server.audit = true
61
63
  server.start
62
- loop do
63
- break if server.stopped?
64
- sleep(1)
65
- end
64
+ server.join
66
65
  end
67
66
  end
@@ -0,0 +1,3 @@
1
+ module Freec
2
+ VERSION = "0.2.7"
3
+ end
data/lib/freec_base.rb CHANGED
@@ -1,28 +1,27 @@
1
1
  require 'gserver'
2
- require 'rubygems'
3
2
  require 'uri'
4
3
 
5
4
  require 'tools'
6
- require "freeswitch_applications"
7
- require "call_variables"
5
+ require 'freeswitch_applications'
6
+ require 'call_variables'
8
7
 
9
- class Freec
8
+ class FreecBase
10
9
  include FreeswitchApplications
11
10
  include CallVariables
12
-
11
+
13
12
  attr_reader :call_vars, :event_body, :log, :config
14
-
13
+
15
14
  def initialize(io, log, config) #:nodoc:
16
15
  @call_vars = {}
17
16
  @want_events_from = []
18
17
  @last_app_executed = 'initial_step'
19
- @io = io
18
+ @io = io
20
19
  @log = log
21
20
  @config = config
22
21
  end
23
-
22
+
24
23
  def handle_call #:nodoc:
25
- call_initialization
24
+ call_initialization
26
25
  loop do
27
26
  subscribe_to_new_channel_events
28
27
  if last_event_dtmf? && respond_to?(:on_dtmf)
@@ -38,7 +37,7 @@ class Freec
38
37
  hangup unless @io.closed?
39
38
  send_and_read('exit') unless @io.closed?
40
39
  end
41
-
40
+
42
41
  def wait_for(key, value)
43
42
  @waiting_for_key = key && key.to_sym
44
43
  @waiting_for_value = value
@@ -46,13 +45,13 @@ class Freec
46
45
 
47
46
  def reset_wait_for
48
47
  wait_for(nil, nil)
49
- true
50
- end
51
-
48
+ true
49
+ end
50
+
52
51
  def execute_completed?
53
52
  channel_execute_complete? || channel_destroyed_after_bridge? || disconnect_notice?
54
53
  end
55
-
54
+
56
55
  private
57
56
 
58
57
  def call_initialization
@@ -62,17 +61,17 @@ private
62
61
 
63
62
  def channel_execute_complete?
64
63
  return true if @last_app_executed == 'initial_step'
65
- complete = call_vars[:content_type] == 'text/event-plain' &&
64
+ complete = call_vars[:content_type] == 'text/event-plain' &&
66
65
  call_vars[:event_name] == 'CHANNEL_EXECUTE_COMPLETE' &&
67
66
  @last_app_executed == call_vars[:application]
68
67
  @last_app_executed = nil if complete
69
68
  complete
70
69
  end
71
-
70
+
72
71
  def channel_destroyed_after_bridge?
73
72
  call_vars[:application] == 'bridge' && call_vars[:event_name] == 'CHANNEL_DESTROY'
74
73
  end
75
-
74
+
76
75
  def disconnect_notice?
77
76
  @io.closed? || call_vars[:content_type] == 'text/disconnect-notice'
78
77
  end
@@ -81,7 +80,7 @@ private
81
80
  send(callback_name, *args) if respond_to?(callback_name)
82
81
  rescue StandardError => e
83
82
  log.error e.message
84
- e.backtrace.each {|trace_line| log.error(trace_line)}
83
+ e.backtrace.each {|trace_line| log.error(trace_line)}
85
84
  end
86
85
 
87
86
  def reload_application_code
@@ -89,7 +88,7 @@ private
89
88
  load($0)
90
89
  lib_dir = "#{ROOT}/lib"
91
90
  return unless File.exist?(lib_dir)
92
- Dir.open(lib_dir).each do |file|
91
+ Dir.open(lib_dir).each do |file|
93
92
  full_file_name = File.join(lib_dir, file)
94
93
  next unless File.file?(full_file_name)
95
94
  load(full_file_name)
@@ -100,62 +99,62 @@ private
100
99
  send_and_read('connect')
101
100
  parse_response
102
101
  end
103
-
102
+
104
103
  def subscribe_to_events
105
104
  send_and_read('events plain all')
106
- parse_response
107
- send_and_read("filter Unique-ID #{@unique_id}")
108
- parse_response
109
- send_and_read("divert_events on")
105
+ parse_response
106
+ send_and_read("filter Unique-ID #{@unique_id}")
107
+ parse_response
108
+ send_and_read("divert_events on")
110
109
  parse_response
111
110
  end
112
-
111
+
113
112
  def subscribe_to_new_channel_events
114
113
  return unless call_vars[:event_name] == 'CHANNEL_BRIDGE'
115
114
  @want_events_from << call_vars[:other_leg_unique_id]
116
115
  send_and_read("filter Unique-ID #{call_vars[:other_leg_unique_id]}")
117
116
  end
118
-
117
+
119
118
  def waiting_for_this_response?
120
119
  @waiting_for_key && @waiting_for_value && call_vars[@waiting_for_key] == @waiting_for_value
121
120
  end
122
-
121
+
123
122
  def last_event_dtmf?
124
123
  call_vars[:content_type] == 'text/event-plain' && call_vars[:event_name] == 'DTMF'
125
124
  end
126
-
125
+
127
126
  def send_data(data)
128
127
  log.debug "Sending: #{data}"
129
128
  @io.write("#{data}\n\n") unless disconnect_notice?
130
129
  end
131
-
130
+
132
131
  def send_and_read(data)
133
132
  send_data(data)
134
133
  read_response
135
134
  end
136
-
135
+
137
136
  def read_and_parse_response
138
137
  my_event = false
139
138
  until my_event
140
139
  read_response
141
140
  my_event = parse_response
142
- end
141
+ end
143
142
  end
144
-
143
+
145
144
  def read_response
146
145
  return if disconnect_notice?
147
146
  read_response_info
148
147
  read_event_header
149
148
  read_event_body
150
149
  end
151
-
150
+
152
151
  def read_response_info
153
152
  @response = ''
154
153
  begin
155
154
  @response += read_line_from_io
156
- end until @response[-2..-1] == "\n\n"
155
+ end until @response[-2..-1] == "\n\n"
157
156
  end
158
-
157
+
159
158
  def read_event_header
160
159
  header_length = @response.sub(/^Content-Length: ([0-9]+)$.*/m, '\1').to_i
161
160
  return if header_length == 0
@@ -163,23 +162,23 @@ private
163
162
  begin
164
163
  header += read_line_from_io
165
164
  end until header[-2..-1] == "\n\n"
166
- @response += header
165
+ @response += header
167
166
  end
168
-
167
+
169
168
  def read_event_body
170
169
  body_length = @response.sub(/^Content-Length.*^Content-Length: ([0-9]+)$.*/m, '\1').to_i
171
170
  return if body_length == 0
172
171
  body = ''
173
- begin
172
+ begin
174
173
  body += read_block_from_io(body_length)
175
174
  end until body.length == body_length
176
- @response += body
175
+ @response += body
177
176
  end
178
-
177
+
179
178
  def parse_response
180
179
  hash = {}
181
180
  if @response =~ /^Content-Length.*^Content-Length/m
182
- @event_body = @response.sub(/.*\n\n.*\n\n(.*)/m, '\1').strip
181
+ @event_body = @response.sub(/.*\n\n.*\n\n(.*)/m, '\1').strip
183
182
  else
184
183
  @event_body = nil
185
184
  end
@@ -198,21 +197,21 @@ private
198
197
  @response = ''
199
198
  true
200
199
  end
201
-
200
+
202
201
  def read_line_from_io
203
202
  line = @io.gets
204
203
  raise io_disconnected_message unless line
205
204
  line
206
205
  end
207
-
206
+
208
207
  def read_block_from_io(length)
209
208
  block = @io.read(length)
210
209
  raise io_disconnected_message unless block
211
210
  block
212
211
  end
213
-
212
+
214
213
  def io_disconnected_message
215
214
  "IO disconnected - FreeSWITCH crashed?"
216
215
  end
217
-
218
- end
216
+
217
+ end
@@ -1,12 +1,12 @@
1
1
  module FreeswitchApplications
2
-
2
+
3
3
  # Answers the call.
4
4
  def answer
5
5
  execute_app('answer')
6
6
  end
7
7
 
8
8
  # Plays the file in file_name
9
- # file_name is either an absolute path or path relative
9
+ # file_name is either an absolute path or path relative
10
10
  # to the sound_prefix variable set in Freeswitch's vars.xml configuration file.
11
11
  def playback(file_name)
12
12
  execute_app('playback', file_name)
@@ -16,36 +16,36 @@ module FreeswitchApplications
16
16
  def spell(string)
17
17
  execute_app('phrase', "spell,#{string}")
18
18
  end
19
-
19
+
20
20
  # Says the given string
21
21
  # Don't forget to set up your TTS engine and set variables tts_engine and tts_voice accordingly
22
22
  # See e.g.: http://wiki.freeswitch.org/wiki/Mod_flite
23
23
  def speak(string)
24
24
  execute_app('speak', string)
25
25
  end
26
-
26
+
27
27
  # Bridges the call to the given number or numbers (this param can be a number or an array of numbers).
28
28
  def bridge(number_or_numbers, options = {})
29
29
  number_or_numbers = number_or_numbers.join(",") if number_or_numbers.is_a?(Array)
30
30
  execute_app("bridge", "#{number_or_numbers}")
31
31
  end
32
-
32
+
33
33
  # Transfers the call to the given extension
34
34
  def transfer(extension)
35
35
  execute_app("transfer", "#{extension}")
36
36
  end
37
-
37
+
38
38
  # Records the call to a file with the given file_name
39
- # file_name is either an absolute path or path relative
39
+ # file_name is either an absolute path or path relative
40
40
  # to the sound_prefix variable set in Freeswitch's vars.xml configuration file.
41
41
  #
42
42
  # Options:
43
43
  # * <tt>:time_limit_secs</tt> overrides the default timeout, which is 600 seconds
44
44
  def record(file_name, options = {})
45
- options = {:time_limit_secs => 600}.merge(options) #no reverse_merge, no fun :-)
45
+ options = {time_limit_secs: 600}.merge(options) #no reverse_merge, no fun :-)
46
46
  execute_app("record", "#{file_name} #{options[:time_limit_secs]}")
47
47
  end
48
-
48
+
49
49
  # Plays the file in file_name and reads input (key presses) from the user.
50
50
  #
51
51
  # Options:
@@ -55,10 +55,10 @@ module FreeswitchApplications
55
55
  # * <tt>:min and :max</tt> options to override the default maximum and minimum of characters that will be read (both default to 1)
56
56
  def read(file_name, options = {})
57
57
  options[:terminators] = [options[:terminators]] if options[:terminators].is_a?(String)
58
- options = {:timeout => 10, :variable => 'input', :min => 1, :max => 1, :terminators => ['#']}.merge(options)
58
+ options = {timeout: 10, variable: 'input', min: 1, max: 1, terminators: ['#']}.merge(options)
59
59
  execute_app("read", "#{options[:min]} #{options[:max]} #{file_name} #{options[:variable]} #{options[:timeout] * 1000} #{options[:terminators].join(',')}")
60
60
  end
61
-
61
+
62
62
  # Starts recording the call in file in file_name
63
63
  #
64
64
  def start_recording(file_name)
@@ -66,11 +66,11 @@ module FreeswitchApplications
66
66
  end
67
67
 
68
68
  # Stops recording the call in file in file_name
69
- #
69
+ #
70
70
  def stop_recording(file_name)
71
71
  execute_app('stop_record_session', file_name)
72
72
  end
73
-
73
+
74
74
  # Sets a variable with the give name to the given value.
75
75
  def set_variable(name, value)
76
76
  execute_app('set', "#{name}=#{value}")
@@ -78,9 +78,9 @@ module FreeswitchApplications
78
78
 
79
79
  # Hangs up the call.
80
80
  def hangup
81
- execute_app('hangup')
82
- end
83
-
81
+ execute_app('hangup', 'USER_BUSY')
82
+ end
83
+
84
84
  # Executes an app using the sendmsg command of Freeswitch.
85
85
  # Use this if there is no method for the application you want to run.
86
86
  #
@@ -88,7 +88,7 @@ module FreeswitchApplications
88
88
  # * <tt>app</tt> is the application name
89
89
  # * <tt>pars</tt> is a string of arguments of the app
90
90
  # * <tt>lock</tt> can be set to false so Freeswitch won't wait for this app to finish before running the next one
91
- def execute_app(app, pars = '', lock = true, unique_id = nil)
91
+ def execute_app(app, pars = '', lock = true, unique_id = nil)
92
92
  @last_app_executed = app
93
93
  unique_id = @unique_id unless unique_id
94
94
  cmd = "sendmsg #{unique_id}"
@@ -97,5 +97,5 @@ module FreeswitchApplications
97
97
  cmd << "\nexecute-app-arg: #{pars}" unless pars.blank?
98
98
  cmd << "\nevent-lock:#{lock}"
99
99
  send_data cmd
100
- end
101
- end
100
+ end
101
+ end
metadata CHANGED
@@ -1,84 +1,131 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: freec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
5
- prerelease:
4
+ version: 0.2.7
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jan Kubr
9
8
  autorequire:
10
- bindir: bin
9
+ bindir: exe
11
10
  cert_chain: []
12
- date: 2012-02-23 00:00:00.000000000 Z
11
+ date: 2017-04-01 00:00:00.000000000 Z
13
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: gserver
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.1
14
27
  - !ruby/object:Gem::Dependency
15
28
  name: daemons
16
- requirement: &70325537302580 !ruby/object:Gem::Requirement
17
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
18
30
  requirements:
19
- - - ! '>='
31
+ - - "~>"
20
32
  - !ruby/object:Gem::Version
21
- version: '0'
33
+ version: 1.2.4
22
34
  type: :runtime
23
35
  prerelease: false
24
- version_requirements: *70325537302580
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.2.4
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.14'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.14'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
25
69
  - !ruby/object:Gem::Dependency
26
70
  name: rspec
27
- requirement: &70325537302100 !ruby/object:Gem::Requirement
28
- none: false
71
+ requirement: !ruby/object:Gem::Requirement
29
72
  requirements:
30
- - - ! '>'
73
+ - - "~>"
31
74
  - !ruby/object:Gem::Version
32
- version: 2.0.1
75
+ version: '3.0'
33
76
  type: :development
34
77
  prerelease: false
35
- version_requirements: *70325537302100
36
- description:
37
- email: mail@jankubr.com
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ description: The layer between your Ruby voice app and FreeSWITCH.
84
+ email:
85
+ - mail@jankubr.com
38
86
  executables: []
39
87
  extensions: []
40
- extra_rdoc_files:
41
- - README.rdoc
88
+ extra_rdoc_files: []
42
89
  files:
90
+ - ".gitignore"
91
+ - Gemfile
92
+ - Gemfile.lock
93
+ - LICENSE.txt
43
94
  - README.rdoc
44
95
  - Rakefile
96
+ - bin/console
97
+ - bin/setup
98
+ - freec.gemspec
45
99
  - lib/call_variables.rb
46
100
  - lib/freec.rb
101
+ - lib/freec/version.rb
47
102
  - lib/freec_base.rb
48
103
  - lib/freec_logger.rb
49
104
  - lib/freeswitch_applications.rb
50
105
  - lib/listener.rb
51
106
  - lib/tools.rb
52
- - spec/data/event.rb
53
- - spec/data/event_with_body.rb
54
- - spec/event_parser_spec.rb
55
- - spec/freec_base_spec.rb
56
- - spec/freeswitch_applications_spec.rb
57
- - spec/spec_helper.rb
58
107
  homepage: http://github.com/jankubr/freec
59
- licenses: []
108
+ licenses:
109
+ - MIT
110
+ metadata: {}
60
111
  post_install_message:
61
- rdoc_options:
62
- - --line-numbers
63
- - --inline-source
112
+ rdoc_options: []
64
113
  require_paths:
65
114
  - lib
66
115
  required_ruby_version: !ruby/object:Gem::Requirement
67
- none: false
68
116
  requirements:
69
- - - ! '>='
117
+ - - ">="
70
118
  - !ruby/object:Gem::Version
71
119
  version: '0'
72
120
  required_rubygems_version: !ruby/object:Gem::Requirement
73
- none: false
74
121
  requirements:
75
- - - ! '>='
122
+ - - ">="
76
123
  - !ruby/object:Gem::Version
77
124
  version: '0'
78
125
  requirements: []
79
- rubyforge_project: freec
80
- rubygems_version: 1.8.10
126
+ rubyforge_project:
127
+ rubygems_version: 2.5.2
81
128
  signing_key:
82
- specification_version: 3
129
+ specification_version: 4
83
130
  summary: The layer between your Ruby voice app and FreeSWITCH.
84
131
  test_files: []
data/spec/data/event.rb DELETED
@@ -1,56 +0,0 @@
1
- unless defined?(EVENT)
2
- EVENT=<<STRING
3
- Content-Length: 1693
4
- Content-Type: text/event-plain
5
-
6
- Event-Name: CHANNEL_EXECUTE
7
- Core-UUID: 4a78c88d-38cc-4e35-92af-c155def76f9a
8
- FreeSWITCH-Hostname: air.local
9
- FreeSWITCH-IPv4: 10.0.1.2
10
- FreeSWITCH-IPv6: %3A%3A1
11
- Event-Date-Local: 2009-05-14%2019%3A29%3A09
12
- Event-Date-GMT: Thu,%2014%20May%202009%2017%3A29%3A09%20GMT
13
- Event-Date-Timestamp: 1242322149917313
14
- Event-Calling-File: switch_core_session.c
15
- Event-Calling-Function: switch_core_session_exec
16
- Event-Calling-Line-Number: 1460
17
- Channel-State: CS_EXECUTE
18
- Channel-State-Number: 4
19
- Channel-Name: sofia/internal/jan.kubr.gmail.com%4010.0.1.2
20
- Channel-Destination-Number: 886
21
- Unique-ID: f3c2d5ee-d064-4f55-9280-5be2a65867e8
22
- Call-Direction: inbound
23
- Presence-Call-Direction: inbound
24
- Answer-State: answered
25
- Channel-Read-Codec-Name: GSM
26
- Channel-Read-Codec-Rate: 8000
27
- Channel-Write-Codec-Name: GSM
28
- Channel-Write-Codec-Rate: 8000
29
- Caller-Username: jan.kubr.gmail.com
30
- Caller-Dialplan: XML
31
- Caller-Caller-ID-Name: Jan%20Local
32
- Caller-Caller-ID-Number: jan.kubr.gmail.com
33
- Caller-Network-Addr: 10.0.1.2
34
- Caller-Destination-Number: 0
35
- Caller-Unique-ID: f3c2d5ee-d064-4f55-9280-5be2a65867e8
36
- Caller-Source: mod_sofia
37
- Caller-Context: default
38
- Caller-Channel-Name: sofia/internal/jan.kubr.gmail.com%4010.0.1.2
39
- Caller-Profile-Index: 1
40
- Caller-Profile-Created-Time: 1242322142643329
41
- Caller-Channel-Created-Time: 1242322142643329
42
- Caller-Channel-Answered-Time: 1242322143798188
43
- Caller-Channel-Progress-Time: 0
44
- Caller-Channel-Progress-Media-Time: 1242322142657064
45
- Caller-Channel-Hangup-Time: 0
46
- Caller-Channel-Transfer-Time: 0
47
- Caller-Screen-Bit: true
48
- Caller-Privacy-Hide-Name: false
49
- Caller-Privacy-Hide-Number: false
50
- variable_sip_to_user: 886
51
- variable_sip_from_user: 1001
52
- Application: set
53
- Application-Data: continue_on_fail%3Dtrue
54
-
55
- STRING
56
- end
@@ -1,25 +0,0 @@
1
- unless defined?(EVENT_WITH_BODY)
2
- EVENT_WITH_BODY=<<STRING
3
- Content-Length: 460
4
- Content-Type: text/event-plain
5
-
6
- Event-Name: DETECTED_SPEECH
7
- Core-UUID: b61467b4-6d7c-4a6f-ba87-32ade7b79951
8
- FreeSWITCH-Hostname: air.local
9
- FreeSWITCH-IPv4: 10.0.1.2
10
- FreeSWITCH-IPv6: %3A%3A1
11
- Event-Date-Local: 2009-05-04%2020%3A40%3A48
12
- Event-Date-GMT: Mon,%2004%20May%202009%2018%3A40%3A48%20GMT
13
- Event-Date-Timestamp: 1241462448174337
14
- Event-Calling-File: switch_ivr_async.c
15
- Event-Calling-Function: speech_thread
16
- Event-Calling-Line-Number: 1878
17
- Speech-Type: detected-speech
18
- Content-Length: 132
19
-
20
- <interpretation grammar="battle" score="100">
21
- <result name="match">FREESTYLE</result>
22
- <input>FREESTYLE</input>
23
- </interpretation>
24
- STRING
25
- end
@@ -1,84 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/spec_helper"
2
-
3
- describe Freec do
4
- before do
5
- io = stub(:io)
6
- log = FreecLogger.new(STDOUT)
7
- log.level = Logger::FATAL
8
- @freec = Freec.new(io, log, {})
9
- end
10
-
11
- describe "parses body-less event" do
12
- before do
13
- @freec.instance_variable_set(:@response, EVENT)
14
- @freec.send :parse_response
15
- end
16
-
17
- it "should read unique id from response" do
18
- @freec.instance_variable_get(:@unique_id).should == 'f3c2d5ee-d064-4f55-9280-5be2a65867e8'
19
- end
20
-
21
- it "should include channel unique id to the array of ids event variables are read from" do
22
- @freec.instance_variable_get(:@want_events_from).should == ['f3c2d5ee-d064-4f55-9280-5be2a65867e8']
23
- end
24
-
25
- it "should parse variables from response" do
26
- @freec.call_vars[:call_direction].should == 'inbound'
27
- @freec.call_vars[:caller_context].should == 'default'
28
- @freec.call_vars[:application].should == 'set'
29
- end
30
-
31
- it "should make the value of the sip_from_user variable available as a method" do
32
- @freec.sip_from_user.should == '1001'
33
- end
34
-
35
- it "should make the value of the sip_to_user variable available as a method" do
36
- @freec.sip_to_user.should == '886'
37
- end
38
-
39
- it "should make the value of the channel_destination_number variable available as a method" do
40
- @freec.channel_destination_number.should == '886'
41
- end
42
- end
43
-
44
- describe "ignores variables from another channel event" do
45
-
46
- it "should not parse variables from event of another channel" do
47
- @freec.instance_variable_set(:@response, EVENT)
48
- @freec.send(:parse_response).should be_true
49
- another_channel_event = EVENT.sub('Unique-ID: f3c2d5ee-d064-4f55-9280-5be2a65867e8', 'Unique-ID: ffff1111-e72d-48bf-9ecf-d71bd4b60617').
50
- sub('Application: set', 'Application: bridge')
51
- @freec.instance_variable_set(:@response, another_channel_event)
52
- @freec.send(:parse_response).should be_false
53
- @freec.call_vars[:application].should == 'set'
54
- end
55
-
56
- it "parses variables from disconnect notices" do
57
- @freec.instance_variable_set(:@response, EVENT)
58
- @freec.send(:parse_response).should be_true
59
- @freec.call_vars[:content_type].should == 'text/event-plain'
60
- disconnect_notice_event = EVENT.sub('Unique-ID: f3c2d5ee-d064-4f55-9280-5be2a65867e8', 'Unique-ID: ').
61
- sub('Content-Type: text/event-plain', 'Content-Type: text/disconnect-notice')
62
- @freec.instance_variable_set(:@response, disconnect_notice_event)
63
- @freec.send(:parse_response).should be_true
64
- @freec.call_vars[:content_type].should == 'text/disconnect-notice'
65
- end
66
-
67
- end
68
-
69
- describe "parses an event with a body" do
70
- before do
71
- @freec.instance_variable_set(:@response, EVENT_WITH_BODY)
72
- @freec.send :parse_response
73
- end
74
-
75
- it "should parse the variables from the event header" do
76
- @freec.call_vars[:event_name].should == 'DETECTED_SPEECH'
77
- end
78
-
79
- it "makes the body of the response available as a public method" do
80
- @freec.event_body.should =~ /<\/interpretation>$/
81
- end
82
-
83
- end
84
- end
@@ -1,213 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/spec_helper"
2
-
3
- module FreecSpecHelper
4
- def event_parts(event=EVENT)
5
- @parts = event.split("\n\n").map {|p| "#{p}\n\n"}
6
- end
7
-
8
- def initial_response
9
- @initial_response ||= EVENT.split("\n\n")[1] + "\n\n"
10
- end
11
-
12
- end
13
-
14
- describe Freec do
15
- include FreecSpecHelper
16
-
17
- before do
18
- @io = stub(:io)
19
- @log = FreecLogger.new(STDOUT)
20
- @log.level = Logger::FATAL
21
- @config = {:config1 => 'value'}
22
- @freec = Freec.new(@io, @log, @config)
23
- end
24
-
25
- describe "initialization" do
26
-
27
- it "makes log and config available" do
28
- @freec.log.should == @log
29
- @freec.config.should == @config
30
- end
31
-
32
- end
33
-
34
- describe "call initialization" do
35
-
36
- it "sends 'connect' command to Freeswitch" do
37
- @freec.should_receive(:send_data).with("connect")
38
- @freec.should_receive(:send_data)
39
- @freec.should_receive(:send_data)
40
- @freec.should_receive(:send_data)
41
- @io.should_receive(:gets).exactly(4).and_return(initial_response)
42
- @freec.send :call_initialization
43
- end
44
-
45
- it "subscribes to events" do
46
- @freec.should_receive(:send_data)
47
- @freec.should_receive(:send_data).with('events plain all')
48
- @freec.should_receive(:send_data).with('filter Unique-ID f3c2d5ee-d064-4f55-9280-5be2a65867e8')
49
- @freec.should_receive(:send_data).with('divert_events on')
50
- @io.should_receive(:gets).exactly(4).and_return(initial_response)
51
- @freec.send :call_initialization
52
- end
53
-
54
- end
55
-
56
- describe "response reader" do
57
-
58
- it "reads the full body-less event" do
59
- @io.should_receive(:gets).and_return(event_parts(EVENT)[0], event_parts(EVENT)[1])
60
- @freec.send(:read_response)
61
- end
62
-
63
- it "raises exception if IO is disconnected while reading response info" do
64
- @io.should_receive(:gets).and_return(nil)
65
- lambda { @freec.send(:read_response) }.should raise_error(RuntimeError, 'IO disconnected - FreeSWITCH crashed?')
66
- end
67
-
68
- it "raises exception if IO is disconnected while reading event header" do
69
- @io.should_receive(:gets).and_return(event_parts(EVENT)[0], nil)
70
- lambda { @freec.send(:read_response) }.should raise_error(RuntimeError, 'IO disconnected - FreeSWITCH crashed?')
71
- end
72
-
73
- it "reads the full event with body" do
74
- @io.should_receive(:gets).and_return(event_parts(EVENT_WITH_BODY)[0],
75
- event_parts(EVENT_WITH_BODY)[1])
76
- @io.should_receive(:read).and_return(event_parts(EVENT_WITH_BODY)[2].strip.chomp)
77
- @freec.send(:read_response)
78
- end
79
-
80
- it "raises exception if IO is disconnected while reading body" do
81
- @io.should_receive(:gets).and_return(event_parts(EVENT_WITH_BODY)[0],
82
- event_parts(EVENT_WITH_BODY)[1])
83
- @io.should_receive(:read).and_return(nil)
84
- lambda { @freec.send(:read_response) }.should raise_error(RuntimeError, 'IO disconnected - FreeSWITCH crashed?')
85
- end
86
-
87
- end
88
-
89
-
90
- describe "event recognition" do
91
-
92
- it "ignores events for another channel" do
93
- @freec.should_receive(:read_response).twice
94
- @freec.should_receive(:parse_response).and_return(false, true)
95
- @freec.send(:read_and_parse_response)
96
- end
97
-
98
- it "should subscribe to events of other leg channel after bridge" do
99
- bridge_event = EVENT.sub('CHANNEL_EXECUTE', 'CHANNEL_BRIDGE').sub('Caller-Profile-Index: 1', 'Other-Leg-Unique-ID: 6c75cb42-e72d-48bf-9ecf-d71bd4b60617')
100
- @freec.instance_variable_set(:@response, bridge_event)
101
- @freec.send(:parse_response)
102
- @freec.should_receive(:send_and_read).with("filter Unique-ID 6c75cb42-e72d-48bf-9ecf-d71bd4b60617")
103
- @freec.send(:subscribe_to_new_channel_events)
104
- @freec.instance_variable_get(:@want_events_from).should == ["f3c2d5ee-d064-4f55-9280-5be2a65867e8", "6c75cb42-e72d-48bf-9ecf-d71bd4b60617"]
105
- end
106
-
107
- it "should recognize last event was DTMF to call the on_dtmf callback" do
108
- dtmf_event = EVENT.sub('CHANNEL_EXECUTE', 'DTMF')
109
- @freec.instance_variable_set(:@response, dtmf_event)
110
- @freec.send(:parse_response)
111
- @freec.send(:last_event_dtmf?).should be_true
112
- end
113
-
114
- it "should recognize an event as a non-DTMF one" do
115
- @freec.instance_variable_set(:@response, EVENT)
116
- @freec.send(:parse_response)
117
- @freec.send(:last_event_dtmf?).should be_false
118
- end
119
-
120
- it "should recognize that app execution has been completed for the last run app" do
121
- @freec.instance_variable_set(:@last_app_executed, 'set')
122
- set_executed_event = EVENT.sub('CHANNEL_EXECUTE', 'CHANNEL_EXECUTE_COMPLETE')
123
- @freec.instance_variable_set(:@response, set_executed_event)
124
- @freec.send(:parse_response)
125
-
126
- @freec.send(:execute_completed?).should be_true
127
- @freec.instance_variable_get(:@last_app_executed).should be_nil
128
- end
129
-
130
- it "should recognize that app execution has been completed but not for the last run one" do
131
- @freec.instance_variable_set(:@last_app_executed, 'different')
132
- set_executed_event = EVENT.sub('CHANNEL_EXECUTE', 'CHANNEL_EXECUTE_COMPLETE')
133
- @freec.instance_variable_set(:@response, set_executed_event)
134
- @freec.send(:parse_response)
135
-
136
- @freec.send(:execute_completed?).should be_false
137
- @freec.instance_variable_get(:@last_app_executed).should == 'different'
138
- end
139
-
140
- it "should hangup the call, send exit command to Freeswitch and disconnect from it when step callback returns nil" do
141
- @freec.should_receive(:send_data).with("connect")
142
- @freec.should_receive(:send_data).with("events plain all")
143
- @freec.should_receive(:send_data).with('filter Unique-ID f3c2d5ee-d064-4f55-9280-5be2a65867e8')
144
- @freec.should_receive(:send_data).with('divert_events on')
145
-
146
- @io.should_receive(:gets).and_return(initial_response, initial_response, initial_response, initial_response, "bye\n\n")
147
- @io.should_receive(:closed?).twice.and_return(false)
148
- @freec.should_receive(:step).and_return(nil)
149
- @freec.should_receive(:execute_app).with('hangup')
150
- @freec.should_receive(:on_hangup)
151
- @freec.should_receive(:send_data).with("exit")
152
- @freec.handle_call
153
- end
154
-
155
- it "should exit when Freeswitch disconnects (e.g. caller hangs up) and neither call the step callback nor send any other data to Freeswitch" do
156
- disconnect_event = EVENT.sub('text/event-plain', 'text/disconnect-notice')
157
- @freec.should_receive(:send_data).with("connect")
158
- @freec.should_receive(:send_data).with("events plain all")
159
- @freec.should_receive(:send_data).with('filter Unique-ID f3c2d5ee-d064-4f55-9280-5be2a65867e8')
160
- @freec.should_receive(:send_data).with('divert_events on')
161
- @io.should_receive(:gets).and_return(initial_response, initial_response, event_parts(disconnect_event)[0], event_parts(disconnect_event)[1])
162
- @io.should_receive(:closed?).twice.and_return(true)
163
- @freec.should_receive(:step).never
164
- @freec.should_receive(:on_hangup)
165
- @freec.should_receive(:execute_app).never
166
- @freec.should_receive(:send_data).never
167
- @freec.handle_call
168
- end
169
-
170
- end
171
-
172
- describe "callback exception handling" do
173
- it "should catch and log any exception occurred in a callback" do
174
- @freec.should_receive(:callback_name).and_raise(RuntimeError)
175
- @freec.log.should_receive(:error).with('RuntimeError')
176
- @freec.log.should_receive(:error).at_least(1).times #backtrace
177
- lambda { @freec.send(:callback, :callback_name) }.should_not raise_error(Exception)
178
- end
179
- end
180
-
181
- describe "custom waiting conditions" do
182
-
183
- # it "should return true from waiting_for_this_response? when the conditions for the response are met" do
184
- # @freec.wait_for(:content_type, 'command/reply')
185
- # @freec.instance_variable_set(:@response, EVENT)
186
- # @freec.send(:parse_response)
187
- # @freec.send(:waiting_for_this_response?).should be_true
188
- # end
189
- #
190
- # it "should return false from waiting_for_this_response? when the conditions for the response are not met" do
191
- # @freec.wait_for(:content_type, 'text/event-plain')
192
- # @freec.instance_variable_set(:@response, EVENT)
193
- # @freec.send(:parse_response)
194
- # @freec.send(:waiting_for_this_response?).should be_false
195
- # end
196
- #
197
- # it "should reset the waiting conditions after they have been met" do
198
- # @freec.wait_for(:content_type, 'command/reply')
199
- # @freec.should_receive(:send_data).with("connect")
200
- # @freec.should_receive(:send_data).with("myevents")
201
- # @io.should_receive(:gets).and_return(EVENT, EVENT, "bye\n\n")
202
- # @freec.instance_variable_set(:@last_app_executed, 'set')
203
- # @freec.should_receive(:step).and_return(nil)
204
- # @freec.should_receive(:execute_app).with('hangup')
205
- # @freec.should_receive(:on_hangup)
206
- # @freec.should_receive(:send_data).with("exit")
207
- # @freec.handle_call
208
- # @freec.send(:waiting_for_this_response?).should be_nil
209
- # end
210
- #
211
- end
212
-
213
- end
@@ -1,128 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/spec_helper"
2
-
3
- module FreeswitchApplicationsSpecHelper
4
- def freeswitch_command(app, pars = nil)
5
- cmd = "sendmsg "
6
- cmd += "\ncall-command: execute"
7
- cmd += "\nexecute-app-name: #{app}"
8
- cmd += "\nexecute-app-arg: #{pars}" unless pars.blank?
9
- cmd += "\nevent-lock:true"
10
- cmd
11
- end
12
- end
13
-
14
- describe Freec do
15
-
16
- before do
17
- io = stub(:io)
18
- log = FreecLogger.new(STDOUT)
19
- log.level = Logger::FATAL
20
- @freec = Freec.new(io, log, {})
21
- end
22
-
23
- describe "executes Freeswitch applications" do
24
- include FreeswitchApplicationsSpecHelper
25
-
26
- it "should set the last_app_executed variable to last run app" do
27
- @freec.should_receive(:send_data).with(freeswitch_command('answer'))
28
- @freec.answer
29
- @freec.instance_variable_get(:@last_app_executed).should == 'answer'
30
- end
31
-
32
- it "should execute the answer app when called the answer method" do
33
- @freec.should_receive(:send_data).with(freeswitch_command('answer'))
34
- @freec.answer
35
- end
36
-
37
- it "should execute the playback app when called the playback method" do
38
- @freec.should_receive(:send_data).with(freeswitch_command('playback', 'sounds/file.wav'))
39
- @freec.playback('sounds/file.wav')
40
- end
41
-
42
- it "should execute the phrase app with spell option when called the spell method" do
43
- @freec.should_receive(:send_data).with(freeswitch_command('phrase', 'spell,abcd'))
44
- @freec.spell('abcd')
45
- end
46
-
47
- it "should execute the speak app when called the speak method" do
48
- @freec.should_receive(:send_data).with(freeswitch_command('speak', 'hello'))
49
- @freec.speak('hello')
50
- end
51
-
52
- it "should execute the bridge app when called the bridge method" do
53
- @freec.should_receive(:send_data).with(freeswitch_command('bridge', 'user/brian@10.0.1.2'))
54
- @freec.bridge('user/brian@10.0.1.2')
55
- end
56
-
57
- it "should execute the transfer app when called the transfer method" do
58
- @freec.should_receive(:send_data).with(freeswitch_command('transfer', '1000'))
59
- @freec.transfer('1000')
60
- end
61
-
62
- it "should pass all numbers passed to the bridge method as params of the bridge separated by comma (thus numbers are called simultaneously)" do
63
- @freec.should_receive(:send_data).with(freeswitch_command('bridge', 'user/brian@10.0.1.2,user/karl@10.0.1.2'))
64
- @freec.bridge(['user/brian@10.0.1.2', 'user/karl@10.0.1.2'])
65
- end
66
-
67
- it "should execute the record app when called the record method" do
68
- @freec.should_receive(:send_data).with(freeswitch_command('record', 'recordings/file.mp3 600'))
69
- @freec.record('recordings/file.mp3')
70
- end
71
-
72
- it "should set the time_limit_secs option send to the record method as the max length of the recording" do
73
- @freec.should_receive(:send_data).with(freeswitch_command('record', 'recordings/file.mp3 120'))
74
- @freec.record('recordings/file.mp3', :time_limit_secs => 120)
75
- end
76
-
77
- it "should execute the read app when called the input method" do
78
- @freec.should_receive(:send_data).with(freeswitch_command('read', '1 1 sounds/file.mp3 input 10000 #'))
79
- @freec.read('sounds/file.mp3')
80
- end
81
-
82
- it "should allow to pass the minimum and maximum digits to be read" do
83
- @freec.should_receive(:send_data).with(freeswitch_command('read', '2 5 sounds/file.mp3 input 10000 #'))
84
- @freec.read('sounds/file.mp3', :min => 2, :max => 5)
85
- end
86
-
87
- it "should allow to pass the timeout in seconds before the read apps before it times out" do
88
- @freec.should_receive(:send_data).with(freeswitch_command('read', '1 1 sounds/file.mp3 input 5000 #'))
89
- @freec.read('sounds/file.mp3', :timeout => 5)
90
- end
91
-
92
- it "should allow to pass the terminator for the read app" do
93
- @freec.should_receive(:send_data).with(freeswitch_command('read', '1 1 sounds/file.mp3 input 10000 *'))
94
- @freec.read('sounds/file.mp3', :terminators => '*')
95
- end
96
-
97
- it "should allow to pass the terminators as an array for the read app" do
98
- @freec.should_receive(:send_data).with(freeswitch_command('read', '1 1 sounds/file.mp3 input 10000 #,*'))
99
- @freec.read('sounds/file.mp3', :terminators => ['#', '*'])
100
- end
101
-
102
- it "should allow to specify the variable name the input is read by the read app" do
103
- @freec.should_receive(:send_data).with(freeswitch_command('read', '1 1 sounds/file.mp3 name 10000 #'))
104
- @freec.read('sounds/file.mp3', :variable => 'name')
105
- end
106
-
107
- it "should execute the record_session app when called the start_recording method" do
108
- @freec.should_receive(:send_data).with(freeswitch_command('record_session', 'file.wav'))
109
- @freec.start_recording('file.wav')
110
- end
111
-
112
- it "should execute the stop_record_session app when called the start_recording method" do
113
- @freec.should_receive(:send_data).with(freeswitch_command('stop_record_session', 'file.wav'))
114
- @freec.stop_recording('file.wav')
115
- end
116
-
117
- it "should call the set app to set a variable" do
118
- @freec.should_receive(:send_data).with(freeswitch_command('set', 'name=value'))
119
- @freec.set_variable('name', 'value')
120
- end
121
-
122
- it "should call the hangup app when caled the hangup method" do
123
- @freec.should_receive(:send_data).with(freeswitch_command('hangup'))
124
- @freec.hangup
125
- end
126
-
127
- end
128
- end
data/spec/spec_helper.rb DELETED
@@ -1,12 +0,0 @@
1
- require 'rubygems'
2
- require 'rspec'
3
-
4
- $:.unshift(File.join(File.dirname(__FILE__), "..", 'lib')).unshift(File.dirname(__FILE__)).
5
- unshift(File.join(File.dirname(__FILE__), 'data'))
6
- ROOT = File.join(File.dirname(__FILE__), '..') unless defined?(ROOT)
7
- @@config = ''
8
- ENVIRONMENT = 'test' unless defined?(ENVIRONMENT)
9
- TEST = true unless defined?(TEST)
10
- require 'freec'
11
- require 'event'
12
- require 'event_with_body'