Derferman-twilio 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/Changelog ADDED
@@ -0,0 +1,3 @@
1
+ Changelog for Twilio Ruby Gem
2
+ =================================================
3
+ 0.1.2 - Renamed gem
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2008 Twilio, Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,26 @@
1
+ Ruby Twilio REST SDK
2
+
3
+
4
+ DESCRIPTION
5
+ The Twilio REST SDK simplifies the process of makes calls to the Twilio REST.
6
+ The Twilio REST API lets to you initiate outgoing calls, list previous call,
7
+ and much more. See http://www.twilio.com/docs for more information.
8
+
9
+
10
+ USAGE
11
+ To use the twiliorest.rb library with Rails just copy the twiliorest.rb file
12
+ into the lib directory of your Rails application. Then just require
13
+ "twiliorest.rb" in the controller or code file you wish to use the Twilio REST
14
+ API from. As shown in example.rb, you will need to specify the ACCOUNT_ID and
15
+ ACCOUNT_TOKEN given to you by Twilio before you can make REST requests. In
16
+ addition, you will need to choose a 'Caller' and 'Called' before making
17
+ outgoing calls. See http://www.twilio.com/docs for more information.
18
+
19
+
20
+ FILES
21
+ twiliorest.rb -- include this library in your code
22
+ example.rb -- example usage of twiliorest library
23
+
24
+
25
+ LICENSE
26
+ The Twilio SDK is distributed under the MIT License
data/Rakefile ADDED
@@ -0,0 +1,26 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+
4
+ spec = Gem::Specification.new do |s|
5
+ s.name = "twilio"
6
+ s.version = "0.1.3"
7
+ s.author = "Kyle Conroy"
8
+ s.email = "kjconroy@twilio.com"
9
+ s.homepage = "http://www.twilio.com/docs"
10
+ s.platform = Gem::Platform::RUBY
11
+ s.summary = "Some description"
12
+ s.files = FileList["{lib}/*"].to_a
13
+ s.require_path = "lib"
14
+ s.test_files = FileList["{test}/response_spec.rb"].to_a
15
+ s.has_rdoc = true
16
+ s.extra_rdoc_files = ["README"]
17
+ s.add_dependency("builder", ">= 2.1.2")
18
+ end
19
+
20
+ Rake::GemPackageTask.new(spec) do |pkg|
21
+ pkg.need_tar = true
22
+ end
23
+
24
+ task :default => "pkg/#{spec.name}-#{spec.version}.gem" do
25
+ puts "generated latest version"
26
+ end
data/example-rest.rb ADDED
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "twiliorest.rb"
4
+
5
+ # Twilio REST API version
6
+ API_VERSION = '2008-08-01'
7
+
8
+ # Twilio AccountSid and AuthToken
9
+ ACCOUNT_SID = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
10
+ ACCOUNT_TOKEN = 'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY'
11
+
12
+ # Outgoing Caller ID previously validated with Twilio
13
+ CALLER_ID = 'NNNNNNNNNN';
14
+
15
+ # Create a Twilio REST account object using your Twilio account ID and token
16
+ account = TwilioRest::Account.new(ACCOUNT_SID, ACCOUNT_TOKEN)
17
+
18
+ # ===========================================================================
19
+ # 1. Initiate a new outbound call to 415-555-1212
20
+ # uses a HTTP POST
21
+ d = {
22
+ 'Caller' => CALLER_ID,
23
+ 'Called' => '415-555-1212',
24
+ 'Url' => 'http://demo.twilio.com/welcome',
25
+ }
26
+ resp = account.request("/#{API_VERSION}/Accounts/#{ACCOUNT_SID}/Calls",
27
+ 'POST', d)
28
+ resp.error! unless resp.kind_of? Net::HTTPSuccess
29
+ puts "code: %s\nbody: %s" % [resp.code, resp.body]
30
+
31
+ # ===========================================================================
32
+ # 2. Get a list of recent completed calls (i.e. Status = 2)
33
+ # uses a HTTP GET
34
+ d = { 'Status' => 2 }
35
+ resp = account.request("/#{API_VERSION}/Accounts/#{ACCOUNT_SID}/Calls",
36
+ 'GET', d)
37
+ resp.error! unless resp.kind_of? Net::HTTPSuccess
38
+ puts "code: %s\nbody: %s" % [resp.code, resp.body]
39
+
40
+ # ===========================================================================
41
+ # 3. Get a list of recent notification log entries
42
+ # uses a HTTP GET
43
+ resp = account.request("/#{API_VERSION}/Accounts/#{ACCOUNT_SID}/\
44
+ Notifications", 'GET')
45
+ resp.error! unless resp.kind_of? Net::HTTPSuccess
46
+ puts "code: %s\nbody: %s" % [resp.code, resp.body]
47
+
48
+ # ===========================================================================
49
+ # 4. Get a list of audio recordings for a certain call
50
+ # uses a HTTP GET
51
+ d = { 'CallSid' => 'CA5d44cc11756367a4c54e517511484900' }
52
+ resp = account.request("/#{API_VERSION}/Accounts/#{ACCOUNT_SID}/Recordings",
53
+ 'GET', d)
54
+ resp.error! unless resp.kind_of? Net::HTTPSuccess
55
+ puts "code: %s\nbody: %s" % [resp.code, resp.body]
56
+
57
+ # ===========================================================================
58
+ # 5. Delete a specific recording
59
+ # uses a HTTP DELETE, no response is returned when using DLETE
60
+ resp = account.request( \
61
+ "/#{API_VERSION}/Accounts/#{ACCOUNT_SID}/Recordings/\
62
+ RE7b22d733d3e730d234e94242b9697cae", 'DELETE')
63
+ puts "code: %s" % [resp.code]
data/example-twiml.rb ADDED
@@ -0,0 +1,72 @@
1
+ require "twilio.rb"
2
+
3
+ # Say, Dial, and Play
4
+ @r = Twilio::Response.new
5
+ @r.append(Twilio::Say.new "Hello World", :voice => "man", :loop => "10")
6
+ @r.append(Twilio::Dial.new("5305451766", :timeLimit => "45"))
7
+ @r.append(Twilio::Play.new("http://www.mp3.com"))
8
+ puts @r.respond
9
+
10
+ # @r.respond; outputs:
11
+ #<Response>
12
+ # <Say voice="man" loop="10">Hello World</Say>
13
+ # <Play>http://www.mp3.com</Play>
14
+ # <Dial timeLimit="45">5305451766</Dial>
15
+ #</Response>
16
+
17
+
18
+ # Gather, Redirect
19
+ @r = Twilio::Response.new;
20
+ @g = @r.append(Twilio::Gather.new(:numDigits => "10"))
21
+ @g.append(Twilio::Say.new("Press 1"))
22
+ @r.append(Twilio::Redirect.new())
23
+ puts @r.respond
24
+
25
+
26
+ #<Response>
27
+ # <Gather numDigits="1">
28
+ # <Say>Press 1</Say>
29
+ # </Gather>
30
+ # <Redirect/>
31
+ #</Response>
32
+
33
+
34
+
35
+ # Add a Say verb multiple times
36
+ @r = Twilio::Response.new
37
+ @say = Twilio::Say.new("Press 1")
38
+ @r.append(@say);
39
+ @r.append(@say);
40
+ puts @r.respond
41
+
42
+ #<Response>
43
+ # <Say>Press 1</Say>
44
+ # <Say>Press 1</Say>
45
+ #</Response>
46
+
47
+
48
+ # Set any attribute / value pair
49
+
50
+ @r = Twilio::Response.new
51
+ @r.append(Twilio::Redirect.new(:__crazy => "delicious"))
52
+ puts @r.respond
53
+
54
+
55
+ #<Response>
56
+ # <Redirect crazy="delicious"/>
57
+ #<Response>
58
+
59
+ # Convenience methods
60
+ @r = Twilio::Response.new
61
+ @r.addSay "Hello World", :voice => "man", :language => "fr", :loop => "10"
62
+ @r.addDial "5305451766", :timeLimit => "45"
63
+ @r.addPlay "http://www.mp3.com"
64
+ puts @r.respond
65
+
66
+ # @r.respond; outputs:
67
+ #<Response>
68
+ # <Say voice="man" language="fr" loop="10">Hello World</Say>
69
+ # <Play>http://www.mp3.com</Play>
70
+ # <Dial timeLimit="45">5305451766</Dial>
71
+ #</Response>
72
+
data/lib/twilio.rb ADDED
@@ -0,0 +1,342 @@
1
+ =begin
2
+ Copyright (c) 2009 Twilio, Inc.
3
+
4
+ Permission is hereby granted, free of charge, to any person
5
+ obtaining a copy of this software and associated documentation
6
+ files (the "Software"), to deal in the Software without
7
+ restriction, including without limitation the rights to use,
8
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the
10
+ Software is furnished to do so, subject to the following
11
+ conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23
+ OTHER DEALINGS IN THE SOFTWARE.
24
+ =end
25
+
26
+ module Twilio
27
+ require 'net/http'
28
+ require 'net/https'
29
+ require 'uri'
30
+ require 'cgi'
31
+ require 'rubygems'
32
+ require 'builder'
33
+
34
+ TWILIO_API_URL = 'https://api.twilio.com'
35
+
36
+ class RestAccount
37
+
38
+ #initialize a twilio account object
39
+ #
40
+ #@param [String, String] Your Twilio Acount SID/ID and Auth Token
41
+ #@return [Object] Twilio account object
42
+ def initialize(id, token)
43
+ @id = id
44
+ @token = token
45
+ end
46
+
47
+ #sends a request and gets a response from the Twilio REST API
48
+ #
49
+ #@param [String, String, Hash]
50
+ #path, the URL (relative to the endpoint URL, after the /v1
51
+ #method, the HTTP method to use, defaults to POST
52
+ #vars, for POST or PUT, a dict of data to send
53
+ #
54
+ #@return Twilio response XML
55
+ #@raises [ArgumentError] Invalid path parameter
56
+ #@raises [NotImplementedError] Method given is not implemented
57
+ def request(path, method=nil, vars={})
58
+ if !path || path.length < 1
59
+ raise ArgumentError, 'Invalid path parameter'
60
+ end
61
+ if method && !['GET', 'POST', 'DELETE', 'PUT'].include?(method)
62
+ raise NotImplementedError, 'HTTP %s not implemented' % method
63
+ end
64
+
65
+ if path[0, 1] == '/'
66
+ uri = TWILIO_API_URL + path
67
+ else
68
+ uri = TWILIO_API_URL + '/' + path
69
+ end
70
+
71
+ return fetch(uri, vars, method)
72
+ end
73
+
74
+ #enocde the parameters into a URL friendly string
75
+ #
76
+ #@param [Hash] URL key / values
77
+ #@return [String] Encoded URL
78
+ protected
79
+ def urlencode(params)
80
+ params.to_a.collect! \
81
+ { |k, v| "#{k}=#{CGI.escape(v.to_s)}" }.join("&")
82
+ end
83
+
84
+ # Create the uri for the REST call
85
+ #
86
+ #@param [String, Hash] Base URL and URL parameters
87
+ #@return [String] URI for the REST call
88
+ def build_get_uri(uri, params)
89
+ if params && params.length > 0
90
+ if uri.include?('?')
91
+ if uri[-1, 1] != '&'
92
+ uri += '&'
93
+ end
94
+ uri += urlencode(params)
95
+ else
96
+ uri += '?' + urlencode(params)
97
+ end
98
+ end
99
+ return uri
100
+ end
101
+
102
+ # Returns a http request for the given url and parameters
103
+ #
104
+ #@param [String, Hash, String] Base URL, URL parameters, optional METHOD string
105
+ #@return [String] URI for the REST call
106
+ def fetch(url, params, method=nil)
107
+ if method && method == 'GET'
108
+ url = build_get_uri(url, params)
109
+ end
110
+ uri = URI.parse(url)
111
+
112
+ http = Net::HTTP.new(uri.host, uri.port)
113
+ http.use_ssl = true
114
+
115
+ if method && method == 'GET'
116
+ req = Net::HTTP::Get.new(uri.request_uri)
117
+ elsif method && method == 'DELETE'
118
+ req = Net::HTTP::Delete.new(uri.request_uri)
119
+ elsif method && method == 'PUT'
120
+ req = Net::HTTP::Put.new(uri.request_uri)
121
+ req.set_form_data(params)
122
+ else
123
+ req = Net::HTTP::Post.new(uri.request_uri)
124
+ req.set_form_data(params)
125
+ end
126
+ req.basic_auth(@id, @token)
127
+
128
+ return http.request(req)
129
+ end
130
+ end
131
+
132
+ module Verb
133
+ module ClassMethods
134
+ @attributes = []
135
+ @allowed_verbs = []
136
+ attr_accessor :attributes
137
+
138
+ def allowed_verbs(*verbs)
139
+ return @allowed_verbs if verbs == []
140
+ @allowed_verbs = [] if @allowed_verbs.nil?
141
+ verbs.each do |verb|
142
+ @allowed_verbs << verb.to_s.capitalize
143
+ end
144
+ @allowed_verbs = @allowed_verbs.uniq
145
+ end
146
+
147
+ def attributes(*attrs)
148
+ return @attributes if attrs == []
149
+ @attributes = [] if @attributes.nil?
150
+ @attributes = (@attributes + attrs).uniq
151
+ attr_accessor(*@attributes)
152
+ @attributes
153
+ end
154
+ end
155
+
156
+ def attributes
157
+ self.class.attributes
158
+ end
159
+
160
+ #test if a given verb is allowed to be nested
161
+ #
162
+ #@param [Object] Verb to be appended
163
+ #@return [true, false]
164
+ def allowed?(verb)
165
+ self.class.allowed_verbs.nil? ? false : self.class.allowed_verbs.include?(verb.class.name.split('::')[1])
166
+ end
167
+
168
+ #initialize a twilio response object
169
+ #
170
+ #@param [String, Hash] Body of the verb, and a hash of the attributes
171
+ #@return [Object] Twilio Verb object
172
+ #
173
+ #@raises [ArgumentError] Invalid Argument
174
+ def initialize(body = nil, params = {})
175
+ @children = []
176
+ if body.class == String
177
+ @body = body
178
+ else
179
+ @body = nil
180
+ params = body || {}
181
+ end
182
+ params.each do |k,v|
183
+ if !self.class.attributes.nil? && self.class.attributes.include?(k)
184
+ send(k.to_s+"=",v)
185
+ else
186
+ raise ArgumentError, "Attribute Not Supported"
187
+ end
188
+ end
189
+ end
190
+
191
+ #set an attribute key / value
192
+ #no error checking
193
+ #
194
+ #@param [Hash] Hash of options
195
+ #@return void
196
+ def set(params = {})
197
+ params.each do |k,v|
198
+ self.class.attributes k.to_s
199
+ send(k.to_s+"=",v)
200
+ end
201
+ end
202
+
203
+ #output valid Twilio markup
204
+ #
205
+ #@param [Hash] Hash of options
206
+ #@return [String] Twilio Markup (in XML)
207
+ def respond(opts = {})
208
+ opts[:builder] ||= Builder::XmlMarkup.new(:indent => opts[:indent])
209
+ b = opts[:builder]
210
+ attrs = {}
211
+ #attributes.each {|a| puts send(a) } unless attributes.nil?
212
+ attributes.each {|a| attrs[a] = send(a) unless send(a).nil? } unless attributes.nil?
213
+
214
+ if @children and @body.nil?
215
+ b.__send__(self.class.to_s.split(/::/)[-1], attrs) do
216
+ @children.each {|e|e.respond( opts.merge(:skip_instruct => true) )}
217
+ end
218
+ elsif @body and @children == []
219
+ b.__send__(self.class.to_s.split(/::/)[-1], @body, attrs)
220
+ else
221
+ raise ArgumentError, "Cannot have children and a body at the same time"
222
+ end
223
+ end
224
+
225
+ #output valid Twilio markup encoded for inclusion in a URL
226
+ #
227
+ #@param []
228
+ #@return [String] URL encoded Twilio Markup (XML)
229
+ def to_URLstring()
230
+ CGI::escape(self.respond)
231
+ end
232
+
233
+ def append(verb)
234
+ if(allowed?(verb))
235
+ @children << verb
236
+ @children[-1]
237
+ else
238
+ raise ArgumentError, "Verb Not Supported"
239
+ end
240
+ end
241
+
242
+ ##### Verb Convenience Methods #####
243
+ def addSay(string_to_say = nil, opts = {})
244
+ append(Twilio::Say.new(string_to_say, opts))
245
+ end
246
+
247
+ def addPlay(file_to_play = nil, opts = {})
248
+ append Twilio::Play.new(file_to_play, opts)
249
+ end
250
+
251
+ def addGather(opts = {})
252
+ append Twilio::Gather.new(opts)
253
+ end
254
+
255
+ def addRecord(opts = {})
256
+ append Twilio::Record.new(opts)
257
+ end
258
+
259
+ def addDial(number = nil, opts = {})
260
+ append Twilio::Dial.new(number, opts)
261
+ end
262
+
263
+ def addRedirect(url = nil, opts = {})
264
+ append Twilio::Redirect.new(url, opts)
265
+ end
266
+
267
+ def addPause(opts = {})
268
+ append Twilio::Pause.new(opts)
269
+ end
270
+
271
+ def addHangup
272
+ append Twilio::Hangup.new
273
+ end
274
+
275
+ def addNumber(number, opts = {})
276
+ append Twilio::Number.new(number, opts)
277
+ end
278
+
279
+ end
280
+
281
+ class Say
282
+ extend Twilio::Verb::ClassMethods
283
+ include Twilio::Verb
284
+ attributes :voice, :language, :loop
285
+ end
286
+
287
+ class Play
288
+ extend Twilio::Verb::ClassMethods
289
+ include Twilio::Verb
290
+ attributes :loop
291
+ end
292
+
293
+ class Gather
294
+ extend Twilio::Verb::ClassMethods
295
+ include Twilio::Verb
296
+ attributes :action, :method, :timeout, :finishOnKey, :numDigits
297
+ allowed_verbs :play, :say, :pause
298
+ end
299
+
300
+ class Record
301
+ extend Twilio::Verb::ClassMethods
302
+ include Twilio::Verb
303
+ attributes :action, :method, :timeout, :finishOnKey, :maxLength, :transcribe, :transcribeCallback
304
+ end
305
+
306
+ class Dial
307
+ extend Twilio::Verb::ClassMethods
308
+ include Twilio::Verb
309
+ attributes :action, :method, :timeout, :hangupOnStar, :timeLimit, :callerId
310
+ allowed_verbs :number
311
+ end
312
+
313
+ class Redirect
314
+ extend Twilio::Verb::ClassMethods
315
+ include Twilio::Verb
316
+ attributes :method
317
+ end
318
+
319
+ class Pause
320
+ extend Twilio::Verb::ClassMethods
321
+ include Twilio::Verb
322
+ attributes :length
323
+ end
324
+
325
+ class Hangup
326
+ extend Twilio::Verb::ClassMethods
327
+ include Twilio::Verb
328
+ end
329
+
330
+ class Number
331
+ extend Twilio::Verb::ClassMethods
332
+ include Twilio::Verb
333
+ attributes :sendDigits, :url
334
+ end
335
+
336
+ class Response
337
+ extend Twilio::Verb::ClassMethods
338
+ include Twilio::Verb
339
+ allowed_verbs :say, :play, :gather, :record, :dial, :redirect, :pause, :hangup
340
+ end
341
+
342
+ end
@@ -0,0 +1,366 @@
1
+ require File.dirname(__FILE__) + '/../twilio-rb/twilio.rb'
2
+
3
+ module AccountExampleHelperMethods
4
+
5
+ def bad_append(verb)
6
+
7
+ lambda {verb.append(Twilio::Response)}.should raise_error(ArgumentError)
8
+ lambda {verb.append(Twilio::Say)}.should raise_error(ArgumentError)
9
+ lambda {verb.append(Twilio::Play)}.should raise_error(ArgumentError)
10
+ lambda {verb.append(Twilio::Gather)}.should raise_error(ArgumentError)
11
+ lambda {verb.append(Twilio::Record)}.should raise_error(ArgumentError)
12
+ lambda {verb.append(Twilio::Redirect)}.should raise_error(ArgumentError)
13
+ lambda {verb.append(Twilio::Hangup)}.should raise_error(ArgumentError)
14
+ lambda {verb.append(Twilio::Pause)}.should raise_error(ArgumentError)
15
+ lambda {verb.append(Twilio::Number)}.should raise_error(ArgumentError)
16
+
17
+ end
18
+
19
+ def bad_attr(verb)
20
+ lambda {verb.new(:crazy => 'delicious')}.should raise_error(ArgumentError)
21
+ end
22
+
23
+ end
24
+
25
+ describe Twilio::Response do
26
+ include AccountExampleHelperMethods
27
+
28
+ it "should be an empty response" do
29
+ @r = Twilio::Response.new
30
+ @r.respond.should == '<Response></Response>'
31
+ end
32
+
33
+ it "add attribute" do
34
+ @r = Twilio::Response.new
35
+ @r.set :crazy => 'delicious'
36
+ @r.respond.should == '<Response crazy="delicious"></Response>'
37
+ end
38
+
39
+ it "bad attribute" do
40
+ bad_attr(Twilio::Response)
41
+ end
42
+
43
+ end
44
+
45
+ describe Twilio::Say do
46
+ include AccountExampleHelperMethods
47
+
48
+ it "should say hello monkey" do
49
+ @r = Twilio::Response.new
50
+ @r.append(Twilio::Say.new("Hello Monkey"))
51
+ @r.respond.should == '<Response><Say>Hello Monkey</Say></Response>'
52
+ end
53
+
54
+ it "should say hello monkey and loop 3 times" do
55
+ @r = Twilio::Response.new
56
+ @r.append(Twilio::Say.new("Hello Monkey", :loop => 3))
57
+ @r.respond.should == '<Response><Say loop="3">Hello Monkey</Say></Response>'
58
+ end
59
+
60
+ it "should say have a woman say hello monkey and loop 3 times" do
61
+ @r = Twilio::Response.new
62
+ @r.append(Twilio::Say.new("Hello Monkey", :voice => 'woman'))
63
+ @r.respond.should == '<Response><Say voice="woman">Hello Monkey</Say></Response>'
64
+ end
65
+
66
+ it "should say have a woman say hello monkey and loop 3 times and be in french" do
67
+ @r = Twilio::Response.new
68
+ @r.append(Twilio::Say.new("Hello Monkey", :language => 'fr'))
69
+ @r.respond.should == '<Response><Say language="fr">Hello Monkey</Say></Response>'
70
+ end
71
+
72
+ it "convenience method: should say have a woman say hello monkey and loop 3 times and be in french" do
73
+ @r = Twilio::Response.new
74
+ @r.addSay "Hello Monkey", :language => 'fr'
75
+ @r.respond.should == '<Response><Say language="fr">Hello Monkey</Say></Response>'
76
+ end
77
+
78
+ it "should raises exceptions for wrong appending" do
79
+ @r = Twilio::Response.new
80
+ @s = @r.append(Twilio::Say.new("Hello Monkey"))
81
+ bad_append @s
82
+ end
83
+
84
+ it "add attribute" do
85
+ @r = Twilio::Say.new
86
+ @r.set :crazy => 'delicious'
87
+ @r.respond.should == '<Say crazy="delicious"></Say>'
88
+ end
89
+
90
+ end
91
+
92
+ describe Twilio::Play do
93
+ include AccountExampleHelperMethods
94
+
95
+ it "should play hello monkey" do
96
+ @r = Twilio::Response.new
97
+ @r.append(Twilio::Play.new("Hello Monkey.mp3"))
98
+ @r.respond.should == '<Response><Play>Hello Monkey.mp3</Play></Response>'
99
+ end
100
+
101
+ it "should play hello monkey" do
102
+ @r = Twilio::Response.new
103
+ @r.append(Twilio::Play.new("Hello Monkey.mp3", :loop => '3'))
104
+ @r.respond.should == '<Response><Play loop="3">Hello Monkey.mp3</Play></Response>'
105
+ end
106
+
107
+ it "convenience method: should play hello monkey" do
108
+ @r = Twilio::Response.new
109
+ @r.addPlay "Hello Monkey.mp3", :loop => '3'
110
+ @r.respond.should == '<Response><Play loop="3">Hello Monkey.mp3</Play></Response>'
111
+ end
112
+
113
+ it "should raises exceptions for wrong appending" do
114
+ @r = Twilio::Response.new
115
+ @s = @r.append(Twilio::Play.new("Hello Monkey.mp3", :loop => '3'))
116
+ bad_append @s
117
+ end
118
+
119
+ it "add attribute" do
120
+ @r = Twilio::Play.new
121
+ @r.set :crazy => 'delicious'
122
+ @r.respond.should == '<Play crazy="delicious"></Play>'
123
+ end
124
+
125
+ end
126
+
127
+ describe Twilio::Record do
128
+ include AccountExampleHelperMethods
129
+
130
+ it "should record" do
131
+ @r = Twilio::Response.new
132
+ @r.append(Twilio::Record.new())
133
+ @r.respond.should == '<Response><Record></Record></Response>'
134
+ end
135
+
136
+ it "should record with an action and a get method" do
137
+ r = Twilio::Response.new
138
+ r.append(Twilio::Record.new(:action => "example.com", :method => 'GET'))
139
+ r.respond.should == '<Response><Record action="example.com" method="GET"></Record></Response>'
140
+ end
141
+
142
+ it "should record with an maxlength, finishonkey, and timeout" do
143
+ r = Twilio::Response.new
144
+ r.append(Twilio::Record.new(:timeout => "4", :finishOnKey => '#', :maxLength => "30"))
145
+ r.respond.should == '<Response><Record timeout="4" finishOnKey="#" maxLength="30"></Record></Response>'
146
+ end
147
+
148
+ it "should record with a transcribe and transcribeCallback" do
149
+ r = Twilio::Response.new
150
+ r.append(Twilio::Record.new(:transcribeCallback => 'example.com'))
151
+ r.respond.should == '<Response><Record transcribeCallback="example.com"></Record></Response>'
152
+ end
153
+
154
+ it "convenience methods: should record with a transcribe and transcribeCallback" do
155
+ r = Twilio::Response.new
156
+ r.addRecord :transcribeCallback => 'example.com'
157
+ r.respond.should == '<Response><Record transcribeCallback="example.com"></Record></Response>'
158
+ end
159
+
160
+ it "should raises exceptions for wrong appending" do
161
+ @r = Twilio::Response.new
162
+ @s = @r.append(Twilio::Record.new())
163
+ bad_append @s
164
+ end
165
+
166
+ it "add attribute" do
167
+ @r = Twilio::Record.new
168
+ @r.set :crazy => 'delicious'
169
+ @r.respond.should == '<Record crazy="delicious"></Record>'
170
+ end
171
+
172
+ end
173
+
174
+
175
+ describe Twilio::Redirect do
176
+ include AccountExampleHelperMethods
177
+
178
+ it "should redirect" do
179
+ @r = Twilio::Response.new
180
+ @r.append(Twilio::Redirect.new())
181
+ @r.respond.should == '<Response><Redirect></Redirect></Response>'
182
+ end
183
+
184
+ it "should redirect to a url via POST" do
185
+ @r = Twilio::Response.new
186
+ @r.append(Twilio::Redirect.new("example.com", :method => "POST"))
187
+ @r.respond.should == '<Response><Redirect method="POST">example.com</Redirect></Response>'
188
+ end
189
+
190
+ it "convenience: should redirect to a url via POST" do
191
+ @r = Twilio::Response.new
192
+ @r.addRedirect "example.com", :method => "POST"
193
+ @r.respond.should == '<Response><Redirect method="POST">example.com</Redirect></Response>'
194
+ end
195
+
196
+ it "should raises exceptions for wrong appending" do
197
+ @r = Twilio::Response.new
198
+ @s = @r.append(Twilio::Redirect.new())
199
+ bad_append @s
200
+ end
201
+
202
+ it "add attribute" do
203
+ @r = Twilio::Redirect.new
204
+ @r.set :crazy => 'delicious'
205
+ @r.respond.should == '<Redirect crazy="delicious"></Redirect>'
206
+ end
207
+
208
+
209
+ end
210
+
211
+ describe Twilio::Hangup do
212
+ include AccountExampleHelperMethods
213
+
214
+ it "should redirect" do
215
+ @r = Twilio::Response.new
216
+ @r.append(Twilio::Hangup.new())
217
+ @r.respond.should == '<Response><Hangup></Hangup></Response>'
218
+ end
219
+
220
+ it "convenience: should Hangup to a url via POST" do
221
+ @r = Twilio::Response.new
222
+ @r.addHangup
223
+ @r.respond.should == '<Response><Hangup></Hangup></Response>'
224
+ end
225
+
226
+ it "should raises exceptions for wrong appending" do
227
+ @r = Twilio::Response.new
228
+ @s = @r.append(Twilio::Hangup.new())
229
+ bad_append @s
230
+ end
231
+
232
+ it "add attribute" do
233
+ @r = Twilio::Hangup.new
234
+ @r.set :crazy => 'delicious'
235
+ @r.respond.should == '<Hangup crazy="delicious"></Hangup>'
236
+ end
237
+
238
+ end
239
+
240
+ describe Twilio::Pause do
241
+ include AccountExampleHelperMethods
242
+
243
+ it "should redirect" do
244
+ @r = Twilio::Response.new
245
+ @r.append(Twilio::Pause.new())
246
+ @r.respond.should == '<Response><Pause></Pause></Response>'
247
+ end
248
+
249
+ it "convenience: should Pause to a url via POST" do
250
+ @r = Twilio::Response.new
251
+ @r.addPause :length => '4'
252
+ @r.respond.should == '<Response><Pause length="4"></Pause></Response>'
253
+ end
254
+
255
+ it "should raises exceptions for wrong appending" do
256
+ @r = Twilio::Response.new
257
+ @s = @r.append(Twilio::Pause.new())
258
+ bad_append @s
259
+ end
260
+
261
+ it "add attribute" do
262
+ @r = Twilio::Pause.new
263
+ @r.set :crazy => 'delicious'
264
+ @r.respond.should == '<Pause crazy="delicious"></Pause>'
265
+ end
266
+
267
+ end
268
+
269
+ describe Twilio::Dial do
270
+ include AccountExampleHelperMethods
271
+
272
+ it "should redirect" do
273
+ @r = Twilio::Response.new
274
+ @r.append(Twilio::Dial.new("1231231234"))
275
+ @r.respond.should == '<Response><Dial>1231231234</Dial></Response>'
276
+ end
277
+
278
+ it "convenience: should Hangup to a url via POST" do
279
+ @r = Twilio::Response.new
280
+ @r.addDial
281
+ @r.respond.should == '<Response><Dial></Dial></Response>'
282
+ end
283
+
284
+ it "add a number to a dial" do
285
+ @r = Twilio::Response.new
286
+ @d = @r.append(Twilio::Dial.new())
287
+ @d.append(Twilio::Number.new("1231231234"))
288
+ @r.respond.should == '<Response><Dial><Number>1231231234</Number></Dial></Response>'
289
+ end
290
+
291
+ it "convenience: add a number to a dial" do
292
+ @r = Twilio::Response.new
293
+ @d = @r.addDial
294
+ @d.addNumber "1231231234"
295
+ @r.respond.should == '<Response><Dial><Number>1231231234</Number></Dial></Response>'
296
+ end
297
+
298
+ it "add attribute" do
299
+ @r = Twilio::Dial.new
300
+ @r.set :crazy => 'delicious'
301
+ @r.respond.should == '<Dial crazy="delicious"></Dial>'
302
+ end
303
+
304
+ it "bad append" do
305
+ verb = Twilio::Dial.new
306
+ lambda {verb.append(Twilio::Response)}.should raise_error(ArgumentError)
307
+ lambda {verb.append(Twilio::Say)}.should raise_error(ArgumentError)
308
+ lambda {verb.append(Twilio::Play)}.should raise_error(ArgumentError)
309
+ lambda {verb.append(Twilio::Gather)}.should raise_error(ArgumentError)
310
+ lambda {verb.append(Twilio::Record)}.should raise_error(ArgumentError)
311
+ lambda {verb.append(Twilio::Redirect)}.should raise_error(ArgumentError)
312
+ lambda {verb.append(Twilio::Hangup)}.should raise_error(ArgumentError)
313
+ lambda {verb.append(Twilio::Pause)}.should raise_error(ArgumentError)
314
+ end
315
+
316
+ end
317
+
318
+ describe Twilio::Gather do
319
+ include AccountExampleHelperMethods
320
+
321
+ it "should redirect" do
322
+ @r = Twilio::Response.new
323
+ @r.append(Twilio::Gather.new("1231231234"))
324
+ @r.respond.should == '<Response><Gather>1231231234</Gather></Response>'
325
+ end
326
+
327
+ it "convenience: should Hangup to a url via POST" do
328
+ @r = Twilio::Response.new
329
+ @r.addGather
330
+ @r.respond.should == '<Response><Gather></Gather></Response>'
331
+ end
332
+
333
+ it "add a number to a Gather" do
334
+ @r = Twilio::Response.new
335
+ @g = @r.append(Twilio::Gather.new)
336
+ @g.append(Twilio::Say.new("Hello World"))
337
+ @g.append(Twilio::Play.new("Hello World.mp3"))
338
+ @g.append(Twilio::Pause.new)
339
+ @r.respond.should == '<Response><Gather><Say>Hello World</Say><Play>Hello World.mp3</Play><Pause></Pause></Gather></Response>'
340
+ end
341
+
342
+ it "convenience: add a number to a Gather" do
343
+ @r = Twilio::Response.new
344
+ @g = @r.addGather
345
+ @g.addSay "Hello World"
346
+ @g.addPlay "Hello World.mp3"
347
+ @g.addPause
348
+ @r.respond.should == '<Response><Gather><Say>Hello World</Say><Play>Hello World.mp3</Play><Pause></Pause></Gather></Response>'
349
+ end
350
+
351
+ it "add attribute" do
352
+ @r = Twilio::Gather.new
353
+ @r.set :crazy => 'delicious'
354
+ @r.respond.should == '<Gather crazy="delicious"></Gather>'
355
+ end
356
+
357
+ it "bad append" do
358
+ verb = Twilio::Gather.new
359
+ lambda {verb.append(Twilio::Response)}.should raise_error(ArgumentError)
360
+ lambda {verb.append(Twilio::Gather)}.should raise_error(ArgumentError)
361
+ lambda {verb.append(Twilio::Record)}.should raise_error(ArgumentError)
362
+ lambda {verb.append(Twilio::Redirect)}.should raise_error(ArgumentError)
363
+ lambda {verb.append(Twilio::Hangup)}.should raise_error(ArgumentError)
364
+ end
365
+
366
+ end
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: Derferman-twilio
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.3
5
+ platform: ruby
6
+ authors:
7
+ - Kyle Conroy
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-05-16 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: builder
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.1.2
24
+ version:
25
+ description:
26
+ email: kjconroy@twilio.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - README
33
+ files:
34
+ - LICENSE
35
+ - README
36
+ - Changelog
37
+ - example-rest.rb
38
+ - example-twiml.rb
39
+ - lib/twilio.rb
40
+ - Rakefile
41
+ has_rdoc: true
42
+ homepage: http://www.twilio.com/docs
43
+ post_install_message:
44
+ rdoc_options: []
45
+
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: "0"
53
+ version:
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: "0"
59
+ version:
60
+ requirements: []
61
+
62
+ rubyforge_project:
63
+ rubygems_version: 1.2.0
64
+ signing_key:
65
+ specification_version: 2
66
+ summary: Some description
67
+ test_files:
68
+ - tests/response_spec.rb