bandwidth-sdk 9.1.2 → 9.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: db76591055af337edfa263589d610ccaeb6548b790e8198c151c8aef12aae58a
4
- data.tar.gz: '0149d372e10582225a5add12aa9f07b43ab52686431facea7968c011297ca97e'
3
+ metadata.gz: 18a1aa70f505740cb401da02868903300dd1dea4bad46e34334387a24b5ed391
4
+ data.tar.gz: c6d3de5ab878190e7a7b9fe29fd503b240aa3434c3fd54b72bce236d1ddfafd9
5
5
  SHA512:
6
- metadata.gz: 07716df459d4e176ec1725d353f1c811db5fe8890bb413d84cc54a531d69db998add4aee95f6da55d113a62678a9d924c2278e6148a3fafeb0f04230c1561337
7
- data.tar.gz: 21c7a1a53d35326b9319dc7836d93d71a7e252b0804ca2311053aaed6c85149e9ec5ac1f2bd2adfcf9439ae80259c22302f2b1f18c63d207d5b3b5260895bb46
6
+ metadata.gz: 97b472c59acf4f4fe5552a5a7c561d0b36fdbdbeb7c240fc0d3c4dfcf3eee3a46d0ca5316325f1245086ab6efc91101a80a9826d49078ccee6d2f7563db6171c
7
+ data.tar.gz: 526b08eeab6f9335208edd49b2c3ea7b01193b4077254374d5cf496d20048231ff990029a92c2e4c33013657ef5a5cad7705296073910a5b6406862d7d06ee9b
@@ -3,14 +3,11 @@ Dir[File.dirname(__FILE__) + '/verbs/*'].each {|file|
3
3
  require_relative file
4
4
  }
5
5
 
6
- SSML_REGEX = /<([a-zA-Z\/\/].*?)>/
7
- SPEAK_SENTENCE_REGEX = /<SpeakSentence.*?>.*?<\/SpeakSentence>/
8
-
9
6
  module Bandwidth
10
7
  module Voice
11
- class Response
8
+ class Bxml
12
9
  # Initializer
13
- # @param verbs [Array] optional list of verbs to include into response
10
+ # @param verbs [Array] optional list of verbs to include in the bxml tag
14
11
  def initialize(verbs = nil)
15
12
  @verbs = verbs || []
16
13
  end
@@ -19,7 +16,7 @@ module Bandwidth
19
16
  def to_bxml()
20
17
  xml = Builder::XmlMarkup.new()
21
18
  xml.instruct!(:xml, :version=>'1.0', :encoding=>'UTF-8')
22
- xml.Response do
19
+ xml.Bxml do
23
20
  @verbs.each {|verb| verb.to_bxml(xml)}
24
21
  end
25
22
  xml.target!().gsub(SPEAK_SENTENCE_REGEX){|s|s.gsub(SSML_REGEX, '<\1>')}
@@ -0,0 +1,39 @@
1
+ require 'builder'
2
+ Dir[File.dirname(__FILE__) + '/verbs/*'].each {|file|
3
+ require_relative file
4
+ }
5
+
6
+ SSML_REGEX = /&lt;([a-zA-Z\/\/].*?)&gt;/
7
+ SPEAK_SENTENCE_REGEX = /<SpeakSentence.*?>.*?<\/SpeakSentence>/
8
+
9
+ module Bandwidth
10
+ module Voice
11
+ class Response
12
+ # Initializer
13
+ # @param verbs [Array] optional list of verbs to include into response
14
+ def initialize(verbs = nil)
15
+ @verbs = verbs || []
16
+ end
17
+
18
+ # Return BXML representaion of this response
19
+ def to_bxml()
20
+ xml = Builder::XmlMarkup.new()
21
+ xml.instruct!(:xml, :version=>'1.0', :encoding=>'UTF-8')
22
+ xml.Response do
23
+ @verbs.each {|verb| verb.to_bxml(xml)}
24
+ end
25
+ xml.target!().gsub(SPEAK_SENTENCE_REGEX){|s|s.gsub(SSML_REGEX, '<\1>')}
26
+ end
27
+
28
+ # Add one or more verbs to this response
29
+ def push(*verbs)
30
+ @verbs.push(*verbs)
31
+ end
32
+
33
+ # Add a verb to this response
34
+ def <<(verb)
35
+ @verbs << verb
36
+ end
37
+ end
38
+ end
39
+ end
@@ -252,6 +252,87 @@ module Voice
252
252
  ApiResponse.new(_response)
253
253
  end
254
254
 
255
+ # Makes a PUT request to /api/v2/accounts/{accountId}/calls/{callId}/bxml
256
+ # @param [String] account_id Required parameter: Example:
257
+ # @param [String] call_id Required parameter: Example:
258
+ # @param [String] body Required parameter: Example:
259
+ # @return [void] response from the API call
260
+ def modify_call_bxml(account_id,
261
+ call_id,
262
+ body
263
+ )
264
+ # Prepare query url.
265
+ _query_builder = config.get_base_uri(Server::VOICEDEFAULT)
266
+ _query_builder << '/api/v2/accounts/{accountId}/calls/{callId}/bxml'
267
+ _query_builder = APIHelper.append_url_with_template_parameters(
268
+ _query_builder,
269
+ 'accountId' => { 'value' => account_id, 'encode' => false },
270
+ 'callId' => { 'value' => call_id, 'encode' => false }
271
+ )
272
+ _query_url = APIHelper.clean_url _query_builder
273
+
274
+ # Prepare headers.
275
+ _headers = {
276
+ 'content-type' => 'application/xml; charset=utf-8'
277
+ }
278
+
279
+ # Prepare and execute HttpRequest.
280
+ _request = config.http_client.put(
281
+ _query_url,
282
+ headers: _headers,
283
+ parameters: body.to_json
284
+ )
285
+ VoiceBasicAuth.apply(config, _request)
286
+ _response = execute_request(_request)
287
+
288
+ # Validate response against endpoint and global error codes.
289
+ case _response.status_code
290
+ when 400
291
+ raise ApiErrorException.new(
292
+ 'Something\'s not quite right... Your request is invalid. Please' \
293
+ ' fix it before trying again.',
294
+ _response
295
+ )
296
+ when 401
297
+ raise APIException.new(
298
+ 'Your credentials are invalid. Please use your Bandwidth dashboard' \
299
+ ' credentials to authenticate to the API.',
300
+ _response
301
+ )
302
+ when 403
303
+ raise ApiErrorException.new(
304
+ 'User unauthorized to perform this action.',
305
+ _response
306
+ )
307
+ when 404
308
+ raise ApiErrorException.new(
309
+ 'The resource specified cannot be found or does not belong to you.',
310
+ _response
311
+ )
312
+ when 415
313
+ raise ApiErrorException.new(
314
+ 'We don\'t support that media type. If a request body is required,' \
315
+ ' please send it to us as `application/xml`.',
316
+ _response
317
+ )
318
+ when 429
319
+ raise ApiErrorException.new(
320
+ 'You\'re sending requests to this endpoint too frequently. Please' \
321
+ ' slow your request rate down and try again.',
322
+ _response
323
+ )
324
+ when 500
325
+ raise ApiErrorException.new(
326
+ 'Something unexpected happened. Please try again.',
327
+ _response
328
+ )
329
+ end
330
+ validate_response(_response)
331
+
332
+ # Return appropriate response type.
333
+ ApiResponse.new(_response)
334
+ end
335
+
255
336
  # Pauses or resumes a recording.
256
337
  # @param [String] account_id Required parameter: Example:
257
338
  # @param [String] call_id Required parameter: Example:
@@ -25,126 +25,54 @@ module Bandwidth
25
25
  # @return [String]
26
26
  attr_accessor :uui
27
27
 
28
- # A comma-separated list of 'User-To-User' headers to be sent in the INVITE
29
- # when calling a SIP URI. Each value must end with an 'encoding' parameter
30
- # as described in https://tools.ietf.org/html/rfc7433. Only 'jwt' and
31
- # 'base64' encodings are allowed. The entire value cannot exceed 350
32
- # characters, including parameters and separators.
33
28
  # @return [Float]
34
29
  attr_accessor :call_timeout
35
30
 
36
- # A comma-separated list of 'User-To-User' headers to be sent in the INVITE
37
- # when calling a SIP URI. Each value must end with an 'encoding' parameter
38
- # as described in https://tools.ietf.org/html/rfc7433. Only 'jwt' and
39
- # 'base64' encodings are allowed. The entire value cannot exceed 350
40
- # characters, including parameters and separators.
41
31
  # @return [Float]
42
32
  attr_accessor :callback_timeout
43
33
 
44
- # A comma-separated list of 'User-To-User' headers to be sent in the INVITE
45
- # when calling a SIP URI. Each value must end with an 'encoding' parameter
46
- # as described in https://tools.ietf.org/html/rfc7433. Only 'jwt' and
47
- # 'base64' encodings are allowed. The entire value cannot exceed 350
48
- # characters, including parameters and separators.
49
34
  # @return [String]
50
35
  attr_accessor :answer_url
51
36
 
52
- # A comma-separated list of 'User-To-User' headers to be sent in the INVITE
53
- # when calling a SIP URI. Each value must end with an 'encoding' parameter
54
- # as described in https://tools.ietf.org/html/rfc7433. Only 'jwt' and
55
- # 'base64' encodings are allowed. The entire value cannot exceed 350
56
- # characters, including parameters and separators.
57
37
  # @return [String]
58
38
  attr_accessor :answer_fallback_url
59
39
 
60
- # A comma-separated list of 'User-To-User' headers to be sent in the INVITE
61
- # when calling a SIP URI. Each value must end with an 'encoding' parameter
62
- # as described in https://tools.ietf.org/html/rfc7433. Only 'jwt' and
63
- # 'base64' encodings are allowed. The entire value cannot exceed 350
64
- # characters, including parameters and separators.
65
40
  # @return [String]
66
41
  attr_accessor :username
67
42
 
68
- # A comma-separated list of 'User-To-User' headers to be sent in the INVITE
69
- # when calling a SIP URI. Each value must end with an 'encoding' parameter
70
- # as described in https://tools.ietf.org/html/rfc7433. Only 'jwt' and
71
- # 'base64' encodings are allowed. The entire value cannot exceed 350
72
- # characters, including parameters and separators.
73
43
  # @return [String]
74
44
  attr_accessor :password
75
45
 
76
- # A comma-separated list of 'User-To-User' headers to be sent in the INVITE
77
- # when calling a SIP URI. Each value must end with an 'encoding' parameter
78
- # as described in https://tools.ietf.org/html/rfc7433. Only 'jwt' and
79
- # 'base64' encodings are allowed. The entire value cannot exceed 350
80
- # characters, including parameters and separators.
81
46
  # @return [String]
82
47
  attr_accessor :fallback_username
83
48
 
84
- # A comma-separated list of 'User-To-User' headers to be sent in the INVITE
85
- # when calling a SIP URI. Each value must end with an 'encoding' parameter
86
- # as described in https://tools.ietf.org/html/rfc7433. Only 'jwt' and
87
- # 'base64' encodings are allowed. The entire value cannot exceed 350
88
- # characters, including parameters and separators.
89
49
  # @return [String]
90
50
  attr_accessor :fallback_password
91
51
 
92
- # A comma-separated list of 'User-To-User' headers to be sent in the INVITE
93
- # when calling a SIP URI. Each value must end with an 'encoding' parameter
94
- # as described in https://tools.ietf.org/html/rfc7433. Only 'jwt' and
95
- # 'base64' encodings are allowed. The entire value cannot exceed 350
96
- # characters, including parameters and separators.
97
52
  # @return [AnswerMethodEnum]
98
53
  attr_accessor :answer_method
99
54
 
100
- # A comma-separated list of 'User-To-User' headers to be sent in the INVITE
101
- # when calling a SIP URI. Each value must end with an 'encoding' parameter
102
- # as described in https://tools.ietf.org/html/rfc7433. Only 'jwt' and
103
- # 'base64' encodings are allowed. The entire value cannot exceed 350
104
- # characters, including parameters and separators.
105
55
  # @return [AnswerFallbackMethodEnum]
106
56
  attr_accessor :answer_fallback_method
107
57
 
108
- # A comma-separated list of 'User-To-User' headers to be sent in the INVITE
109
- # when calling a SIP URI. Each value must end with an 'encoding' parameter
110
- # as described in https://tools.ietf.org/html/rfc7433. Only 'jwt' and
111
- # 'base64' encodings are allowed. The entire value cannot exceed 350
112
- # characters, including parameters and separators.
113
58
  # @return [String]
114
59
  attr_accessor :disconnect_url
115
60
 
116
- # A comma-separated list of 'User-To-User' headers to be sent in the INVITE
117
- # when calling a SIP URI. Each value must end with an 'encoding' parameter
118
- # as described in https://tools.ietf.org/html/rfc7433. Only 'jwt' and
119
- # 'base64' encodings are allowed. The entire value cannot exceed 350
120
- # characters, including parameters and separators.
121
61
  # @return [DisconnectMethodEnum]
122
62
  attr_accessor :disconnect_method
123
63
 
124
- # A comma-separated list of 'User-To-User' headers to be sent in the INVITE
125
- # when calling a SIP URI. Each value must end with an 'encoding' parameter
126
- # as described in https://tools.ietf.org/html/rfc7433. Only 'jwt' and
127
- # 'base64' encodings are allowed. The entire value cannot exceed 350
128
- # characters, including parameters and separators.
129
64
  # @return [String]
130
65
  attr_accessor :tag
131
66
 
132
- # A comma-separated list of 'User-To-User' headers to be sent in the INVITE
133
- # when calling a SIP URI. Each value must end with an 'encoding' parameter
134
- # as described in https://tools.ietf.org/html/rfc7433. Only 'jwt' and
135
- # 'base64' encodings are allowed. The entire value cannot exceed 350
136
- # characters, including parameters and separators.
137
67
  # @return [String]
138
68
  attr_accessor :application_id
139
69
 
140
- # A comma-separated list of 'User-To-User' headers to be sent in the INVITE
141
- # when calling a SIP URI. Each value must end with an 'encoding' parameter
142
- # as described in https://tools.ietf.org/html/rfc7433. Only 'jwt' and
143
- # 'base64' encodings are allowed. The entire value cannot exceed 350
144
- # characters, including parameters and separators.
145
70
  # @return [MachineDetectionRequest]
146
71
  attr_accessor :machine_detection
147
72
 
73
+ # @return [Integer]
74
+ attr_accessor :priority
75
+
148
76
  # A mapping from model property names to API property names.
149
77
  def self.names
150
78
  @_hash = {} if @_hash.nil?
@@ -166,6 +94,7 @@ module Bandwidth
166
94
  @_hash['tag'] = 'tag'
167
95
  @_hash['application_id'] = 'applicationId'
168
96
  @_hash['machine_detection'] = 'machineDetection'
97
+ @_hash['priority'] = 'priority'
169
98
  @_hash
170
99
  end
171
100
 
@@ -186,6 +115,7 @@ module Bandwidth
186
115
  disconnect_method
187
116
  tag
188
117
  machine_detection
118
+ priority
189
119
  ]
190
120
  end
191
121
 
@@ -205,6 +135,7 @@ module Bandwidth
205
135
  disconnect_url
206
136
  disconnect_method
207
137
  tag
138
+ priority
208
139
  ]
209
140
  end
210
141
 
@@ -225,7 +156,8 @@ module Bandwidth
225
156
  disconnect_url = nil,
226
157
  disconnect_method = nil,
227
158
  tag = nil,
228
- machine_detection = nil)
159
+ machine_detection = nil,
160
+ priority = nil)
229
161
  @from = from unless from == SKIP
230
162
  @to = to unless to == SKIP
231
163
  @uui = uui unless uui == SKIP
@@ -244,6 +176,7 @@ module Bandwidth
244
176
  @tag = tag unless tag == SKIP
245
177
  @application_id = application_id unless application_id == SKIP
246
178
  @machine_detection = machine_detection unless machine_detection == SKIP
179
+ @priority = priority unless priority == SKIP
247
180
  end
248
181
 
249
182
  # Creates an instance of the object from a hash.
@@ -276,6 +209,7 @@ module Bandwidth
276
209
  tag = hash.key?('tag') ? hash['tag'] : SKIP
277
210
  machine_detection = MachineDetectionConfiguration.from_hash(hash['machineDetection']) if
278
211
  hash['machineDetection']
212
+ priority = hash.key?('priority') ? hash['priority'] : SKIP
279
213
 
280
214
  # Create object from extracted values.
281
215
  CreateCallRequest.new(from,
@@ -295,7 +229,8 @@ module Bandwidth
295
229
  disconnect_url,
296
230
  disconnect_method,
297
231
  tag,
298
- machine_detection)
232
+ machine_detection,
233
+ priority)
299
234
  end
300
235
  end
301
236
  end
@@ -90,6 +90,9 @@ module Bandwidth
90
90
  # @return [String]
91
91
  attr_accessor :tag
92
92
 
93
+ # @return [Integer]
94
+ attr_accessor :priority
95
+
93
96
  # A mapping from model property names to API property names.
94
97
  def self.names
95
98
  @_hash = {} if @_hash.nil?
@@ -113,6 +116,7 @@ module Bandwidth
113
116
  @_hash['fallback_username'] = 'fallbackUsername'
114
117
  @_hash['fallback_password'] = 'fallbackPassword'
115
118
  @_hash['tag'] = 'tag'
119
+ @_hash['priority'] = 'priority'
116
120
  @_hash
117
121
  end
118
122
 
@@ -130,6 +134,7 @@ module Bandwidth
130
134
  fallback_username
131
135
  fallback_password
132
136
  tag
137
+ priority
133
138
  ]
134
139
  end
135
140
 
@@ -145,6 +150,7 @@ module Bandwidth
145
150
  fallback_username
146
151
  fallback_password
147
152
  tag
153
+ priority
148
154
  ]
149
155
  end
150
156
 
@@ -167,7 +173,8 @@ module Bandwidth
167
173
  password = nil,
168
174
  fallback_username = nil,
169
175
  fallback_password = nil,
170
- tag = nil)
176
+ tag = nil,
177
+ priority = nil)
171
178
  @account_id = account_id unless account_id == SKIP
172
179
  @call_id = call_id unless call_id == SKIP
173
180
  @application_id = application_id unless application_id == SKIP
@@ -188,6 +195,7 @@ module Bandwidth
188
195
  @fallback_username = fallback_username unless fallback_username == SKIP
189
196
  @fallback_password = fallback_password unless fallback_password == SKIP
190
197
  @tag = tag unless tag == SKIP
198
+ @priority = priority unless priority == SKIP
191
199
  end
192
200
 
193
201
  # Creates an instance of the object from a hash.
@@ -225,6 +233,7 @@ module Bandwidth
225
233
  fallback_password =
226
234
  hash.key?('fallbackPassword') ? hash['fallbackPassword'] : SKIP
227
235
  tag = hash.key?('tag') ? hash['tag'] : SKIP
236
+ priority = hash.key?('priority') ? hash['priority'] : SKIP
228
237
 
229
238
  # Create object from extracted values.
230
239
  CreateCallResponse.new(account_id,
@@ -246,7 +255,8 @@ module Bandwidth
246
255
  password,
247
256
  fallback_username,
248
257
  fallback_password,
249
- tag)
258
+ tag,
259
+ priority)
250
260
  end
251
261
 
252
262
  def to_start_time
@@ -86,6 +86,11 @@ module Bandwidth
86
86
  # @return [String]
87
87
  attr_accessor :fallback_password
88
88
 
89
+ # When an answering machine is detected, the amount of silence (in seconds)
90
+ # before assuming the message has finished playing.
91
+ # return [Float]
92
+ attr_accessor :machine_speech_end_threshold
93
+
89
94
  # A mapping from model property names to API property names.
90
95
  def self.names
91
96
  @_hash = {} if @_hash.nil?
@@ -103,6 +108,7 @@ module Bandwidth
103
108
  @_hash['password'] = 'password'
104
109
  @_hash['fallback_username'] = 'fallbackUsername'
105
110
  @_hash['fallback_password'] = 'fallbackPassword'
111
+ @_hash['machine_speech_end_threshold'] = 'machineSpeechEndThreshold'
106
112
  @_hash
107
113
  end
108
114
 
@@ -123,6 +129,7 @@ module Bandwidth
123
129
  password
124
130
  fallback_username
125
131
  fallback_password
132
+ machine_speech_end_threshold
126
133
  ]
127
134
  end
128
135
 
@@ -137,6 +144,7 @@ module Bandwidth
137
144
  password
138
145
  fallback_username
139
146
  fallback_password
147
+ machine_speech_end_threshold
140
148
  ]
141
149
  end
142
150
 
@@ -153,7 +161,8 @@ module Bandwidth
153
161
  username = nil,
154
162
  password = nil,
155
163
  fallback_username = nil,
156
- fallback_password = nil)
164
+ fallback_password = nil,
165
+ machine_speech_end_threshold = nil)
157
166
  @mode = mode unless mode == SKIP
158
167
  @detection_timeout = detection_timeout unless detection_timeout == SKIP
159
168
  @silence_timeout = silence_timeout unless silence_timeout == SKIP
@@ -168,6 +177,7 @@ module Bandwidth
168
177
  @password = password unless password == SKIP
169
178
  @fallback_username = fallback_username unless fallback_username == SKIP
170
179
  @fallback_password = fallback_password unless fallback_password == SKIP
180
+ @machine_speech_end_threshold = machine_speech_end_threshold unless machine_speech_end_threshold == SKIP
171
181
  end
172
182
 
173
183
  # Creates an instance of the object from a hash.
@@ -197,6 +207,8 @@ module Bandwidth
197
207
  hash.key?('fallbackUsername') ? hash['fallbackUsername'] : SKIP
198
208
  fallback_password =
199
209
  hash.key?('fallbackPassword') ? hash['fallbackPassword'] : SKIP
210
+ machine_speech_end_threshold =
211
+ hash.key?('machineSpeechEndThreshold') ? hash['machineSpeechEndThreshold'] : SKIP
200
212
 
201
213
  # Create object from extracted values.
202
214
  MachineDetectionConfiguration.new(mode,
@@ -212,7 +224,8 @@ module Bandwidth
212
224
  username,
213
225
  password,
214
226
  fallback_username,
215
- fallback_password)
227
+ fallback_password,
228
+ machine_speech_end_threshold)
216
229
  end
217
230
  end
218
231
  end
data/lib/bandwidth.rb CHANGED
@@ -47,6 +47,7 @@ require_relative 'bandwidth/http/auth/web_rtc_basic_auth'
47
47
  require_relative 'bandwidth/http/auth/web_rtc_basic_auth.rb'
48
48
 
49
49
  # External Files
50
+ require_relative 'bandwidth/voice_lib/bxml/response.rb'
50
51
  require_relative 'bandwidth/voice_lib/bxml/bxml.rb'
51
52
  require_relative 'bandwidth/voice_lib/bxml/verbs/bridge.rb'
52
53
  require_relative 'bandwidth/voice_lib/bxml/verbs/conference.rb'
@@ -128,6 +128,7 @@ class IntegrationTest < Test::Unit::TestCase
128
128
  machine_detection.delay_result = true
129
129
  machine_detection.callback_url = BASE_CALLBACK_URL + '/machineDetection'
130
130
  machine_detection.callback_method = 'POST'
131
+ machine_detection.machine_speech_end_threshold = 3.2
131
132
 
132
133
  body = CreateCallRequest.new
133
134
  body.from = BW_NUMBER
@@ -143,6 +144,19 @@ class IntegrationTest < Test::Unit::TestCase
143
144
  assert(response.data.state.length > 0, "state value not set")
144
145
  end
145
146
 
147
+ def test_create_call_with_priority
148
+ body = CreateCallRequest.new
149
+ body.from = BW_NUMBER
150
+ body.to = USER_NUMBER
151
+ body.application_id = BW_VOICE_APPLICATION_ID
152
+ body.answer_url = BASE_CALLBACK_URL
153
+ body.priority = 1
154
+
155
+ response = @bandwidth_client.voice_client.client.create_call(BW_ACCOUNT_ID, body)
156
+ assert(response.data.call_id.length > 0, "call_id value not set")
157
+ assert(response.data.priority == 1, "priority not set")
158
+ end
159
+
146
160
  def test_create_call_invalid_phone_number
147
161
  body = CreateCallRequest.new
148
162
  body.from = BW_NUMBER
@@ -248,6 +262,34 @@ class IntegrationTest < Test::Unit::TestCase
248
262
  assert_equal(expected, actual)
249
263
  end
250
264
 
265
+ def test_empty_bxml_verb
266
+ bxml = Bandwidth::Voice::Bxml.new()
267
+
268
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Bxml></Bxml>'
269
+ actual = bxml.to_bxml()
270
+ assert_equal(expected, actual)
271
+ end
272
+
273
+ def test_bxml_speak_sentence_pause
274
+ bxml = Bandwidth::Voice::Bxml.new()
275
+
276
+ speak_sentence = Bandwidth::Voice::SpeakSentence.new({
277
+ :sentence => "new modify call bxml is pog",
278
+ :voice => "Julie"
279
+ })
280
+
281
+ pause = Bandwidth::Voice::Pause.new({
282
+ :duration => 6
283
+ })
284
+
285
+ bxml.push(speak_sentence)
286
+ bxml.push(pause)
287
+
288
+ expected = '<?xml version="1.0" encoding="UTF-8"?><Bxml><SpeakSentence voice="Julie">new modify call bxml is pog</SpeakSentence><Pause duration="6"/></Bxml>'
289
+ actual = bxml.to_bxml()
290
+ assert_equal(expected, actual)
291
+ end
292
+
251
293
  def test_hangup
252
294
  hangup = Bandwidth::Voice::Hangup.new()
253
295
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bandwidth-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.1.2
4
+ version: 9.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bandwidth
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-01 00:00:00.000000000 Z
11
+ date: 2022-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logging
@@ -206,6 +206,7 @@ files:
206
206
  - lib/bandwidth/utilities/date_time_helper.rb
207
207
  - lib/bandwidth/utilities/file_wrapper.rb
208
208
  - lib/bandwidth/voice_lib/bxml/bxml.rb
209
+ - lib/bandwidth/voice_lib/bxml/response.rb
209
210
  - lib/bandwidth/voice_lib/bxml/verbs/bridge.rb
210
211
  - lib/bandwidth/voice_lib/bxml/verbs/conference.rb
211
212
  - lib/bandwidth/voice_lib/bxml/verbs/forward.rb