twilio-ruby 3.2.0 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/Gemfile +3 -0
- data/README.md +70 -6
- data/README.rdoc +0 -0
- data/lib/twilio-ruby/rest/{accounts/account.rb → accounts.rb} +2 -0
- data/lib/twilio-ruby/rest/{applications/application.rb → applications.rb} +1 -0
- data/lib/twilio-ruby/rest/{available_phone_numbers/available_phone_numbers.rb → available_phone_numbers.rb} +2 -0
- data/lib/twilio-ruby/rest/{calls/call.rb → calls.rb} +6 -0
- data/lib/twilio-ruby/rest/client.rb +140 -27
- data/lib/twilio-ruby/rest/conferences/participants.rb +18 -1
- data/lib/twilio-ruby/rest/{conferences/conference.rb → conferences.rb} +2 -0
- data/lib/twilio-ruby/rest/{incoming_phone_numbers/incoming_phone_numbers.rb → incoming_phone_numbers.rb} +2 -0
- data/lib/twilio-ruby/rest/instance_resource.rb +39 -0
- data/lib/twilio-ruby/rest/list_resource.rb +67 -7
- data/lib/twilio-ruby/rest/{notifications/notification.rb → notifications.rb} +1 -0
- data/lib/twilio-ruby/rest/{outgoing_caller_ids/outgoing_caller_ids.rb → outgoing_caller_ids.rb} +2 -0
- data/lib/twilio-ruby/rest/{recordings/recording.rb → recordings.rb} +2 -2
- data/lib/twilio-ruby/rest/{sandbox/sandbox.rb → sandbox.rb} +0 -0
- data/lib/twilio-ruby/rest/sms/messages.rb +2 -0
- data/lib/twilio-ruby/rest/sms/short_codes.rb +1 -0
- data/lib/twilio-ruby/rest/{sms/sms.rb → sms.rb} +0 -0
- data/lib/twilio-ruby/rest/{transcriptions/transcription.rb → transcriptions.rb} +1 -0
- data/lib/twilio-ruby/version.rb +3 -0
- data/lib/twilio-ruby.rb +29 -44
- data/test/twilio_spec.rb +141 -4
- data/twilio-ruby.gemspec +25 -11
- metadata +178 -84
- data/lib/twilio-ruby/rest/accounts/accounts.rb +0 -5
- data/lib/twilio-ruby/rest/applications/applications.rb +0 -5
- data/lib/twilio-ruby/rest/available_phone_numbers/available_phone_number.rb +0 -5
- data/lib/twilio-ruby/rest/calls/calls.rb +0 -10
- data/lib/twilio-ruby/rest/conferences/conferences.rb +0 -5
- data/lib/twilio-ruby/rest/conferences/participant.rb +0 -17
- data/lib/twilio-ruby/rest/incoming_phone_numbers/incoming_phone_number.rb +0 -5
- data/lib/twilio-ruby/rest/notifications/notifications.rb +0 -5
- data/lib/twilio-ruby/rest/outgoing_caller_ids/outgoing_caller_id.rb +0 -5
- data/lib/twilio-ruby/rest/recordings/recordings.rb +0 -5
- data/lib/twilio-ruby/rest/sms/message.rb +0 -5
- data/lib/twilio-ruby/rest/sms/short_code.rb +0 -5
- data/lib/twilio-ruby/rest/transcriptions/transcriptions.rb +0 -5
@@ -8,28 +8,88 @@ module Twilio
|
|
8
8
|
@instance_class = Twilio::REST.const_get @resource_name.chop
|
9
9
|
@uri, @client = uri, client
|
10
10
|
end
|
11
|
-
|
12
|
-
|
11
|
+
|
12
|
+
def inspect # :nodoc:
|
13
|
+
"<#{self.class} @uri=#{@uri}>"
|
14
|
+
end
|
15
|
+
|
16
|
+
##
|
17
|
+
# Grab a list of this kind of resource and return it as an array. The
|
18
|
+
# array includes a special attribute named +total+ which will return the
|
19
|
+
# total number of items in the list on Twilio's server. This may differ
|
20
|
+
# from the +size+ and +length+ attributes of the returned array since
|
21
|
+
# by default Twilio will only return 50 resources, and the maximum number
|
22
|
+
# of resources you can request is 1000.
|
23
|
+
#
|
24
|
+
# The optional +params+ hash allows you to filter the list returned. The
|
25
|
+
# filters for each list resource type are defined by Twilio
|
13
26
|
def list(params = {})
|
14
27
|
raise "Can't get a resource list without a REST Client" unless @client
|
15
28
|
response = @client.get @uri, params
|
16
29
|
resources = response[detwilify(@resource_name)]
|
17
|
-
resources.map do |resource|
|
18
|
-
@instance_class.new "#{@uri}/#{resource[
|
30
|
+
resource_list = resources.map do |resource|
|
31
|
+
@instance_class.new "#{@uri}/#{resource[instance_sid_key]}", @client,
|
32
|
+
resource
|
19
33
|
end
|
34
|
+
# set the +total+ property on the array
|
35
|
+
resource_list.instance_eval {
|
36
|
+
eigenclass = class << self; self; end
|
37
|
+
eigenclass.send :define_method, :total, &lambda {response['total']}
|
38
|
+
}
|
39
|
+
# update the list's internal total if we just fetched the whole list
|
40
|
+
@total = response['total'] if params.empty?
|
41
|
+
resource_list
|
20
42
|
end
|
21
43
|
|
22
|
-
|
44
|
+
##
|
45
|
+
# Ask Twilio for the total number of items in the list and cache it.
|
46
|
+
# Calling this method makes an HTTP GET request to <tt>@uri</tt> with a
|
47
|
+
# page size parameter of 1 to minimize data over the wire while still
|
48
|
+
# obtaining the total. Don't use this or #total if you are planning to
|
49
|
+
# call #list anyway, since the array returned from #list will have a
|
50
|
+
# +total+ attribute as well.
|
51
|
+
def total!
|
52
|
+
raise "Can't get a resource total without a REST Client" unless @client
|
53
|
+
response = @client.get @uri, :page_size => 1
|
54
|
+
@total = response['total']
|
55
|
+
end
|
56
|
+
|
57
|
+
##
|
58
|
+
# Return the cached total number of items in the list, or fetch and cache.
|
59
|
+
def total
|
60
|
+
@total ||= total!
|
61
|
+
end
|
62
|
+
|
63
|
+
##
|
64
|
+
# Return an empty instance resource object with the proper URI. Note that
|
65
|
+
# this will never raise a Twilio::REST::RequestError on 404 since no HTTP
|
66
|
+
# request is made. The HTTP request is made when attempting to access an
|
67
|
+
# attribute of the returned instance resource object, such as
|
68
|
+
# its #date_created or #voice_url attributes.
|
23
69
|
def get(sid)
|
24
70
|
@instance_class.new "#{@uri}/#{sid}", @client
|
25
71
|
end
|
26
|
-
|
27
|
-
|
72
|
+
alias :find :get # for the ActiveRecord lovers
|
73
|
+
|
74
|
+
##
|
75
|
+
# Return a newly created resource. Some +params+ may be required. Consult
|
76
|
+
# the Twilio REST API documentation related to the kind of resource you
|
77
|
+
# are attempting to create for details. Calling this method makes an HTTP
|
78
|
+
# POST request to <tt>@uri</tt> with the given params
|
28
79
|
def create(params = {})
|
29
80
|
raise "Can't create a resource without a REST Client" unless @client
|
30
81
|
response = @client.post @uri, params
|
31
82
|
@instance_class.new "#{@uri}/#{response['sid']}", @client, response
|
32
83
|
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
##
|
88
|
+
# Return the JSON key containing the sid of each instance. Overridden for
|
89
|
+
# conference participants and perhaps other resources.
|
90
|
+
def instance_sid_key
|
91
|
+
'sid'
|
92
|
+
end
|
33
93
|
end
|
34
94
|
end
|
35
95
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
module Twilio
|
2
2
|
module REST
|
3
|
-
class
|
3
|
+
class Recordings < ListResource; end
|
4
4
|
|
5
|
+
class Recording < InstanceResource
|
5
6
|
def initialize(uri, client, params={})
|
6
7
|
super uri, client, params
|
7
8
|
resource :transcriptions
|
8
9
|
end
|
9
|
-
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
File without changes
|
File without changes
|
data/lib/twilio-ruby.rb
CHANGED
@@ -1,52 +1,37 @@
|
|
1
|
-
TWILIO_RUBY_ROOT = File.expand_path(File.dirname(__FILE__))
|
2
|
-
|
3
1
|
require 'net/http'
|
4
2
|
require 'net/https'
|
5
3
|
require 'builder'
|
6
|
-
require '
|
4
|
+
require 'multi_json'
|
7
5
|
require 'cgi'
|
8
6
|
require 'openssl'
|
9
7
|
require 'base64'
|
10
8
|
require 'jwt'
|
11
9
|
|
12
|
-
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
27
|
-
require
|
28
|
-
require
|
29
|
-
require
|
30
|
-
require
|
31
|
-
require
|
32
|
-
require
|
33
|
-
require
|
34
|
-
require
|
35
|
-
require
|
36
|
-
require
|
37
|
-
require
|
38
|
-
require
|
39
|
-
require
|
40
|
-
require "#{TWILIO_RUBY_ROOT}/twilio-ruby/rest/available_phone_numbers/toll_free"
|
41
|
-
require "#{TWILIO_RUBY_ROOT}/twilio-ruby/rest/conferences/conference"
|
42
|
-
require "#{TWILIO_RUBY_ROOT}/twilio-ruby/rest/conferences/conferences"
|
43
|
-
require "#{TWILIO_RUBY_ROOT}/twilio-ruby/rest/conferences/participant"
|
44
|
-
require "#{TWILIO_RUBY_ROOT}/twilio-ruby/rest/conferences/participants"
|
45
|
-
require "#{TWILIO_RUBY_ROOT}/twilio-ruby/rest/recordings/recording"
|
46
|
-
require "#{TWILIO_RUBY_ROOT}/twilio-ruby/rest/recordings/recordings"
|
47
|
-
require "#{TWILIO_RUBY_ROOT}/twilio-ruby/rest/transcriptions/transcription"
|
48
|
-
require "#{TWILIO_RUBY_ROOT}/twilio-ruby/rest/transcriptions/transcriptions"
|
49
|
-
require "#{TWILIO_RUBY_ROOT}/twilio-ruby/rest/notifications/notification"
|
50
|
-
require "#{TWILIO_RUBY_ROOT}/twilio-ruby/rest/notifications/notifications"
|
51
|
-
require "#{TWILIO_RUBY_ROOT}/twilio-ruby/rest/client"
|
52
|
-
require "#{TWILIO_RUBY_ROOT}/twilio-ruby/twiml/response"
|
10
|
+
require 'twilio-ruby/version'
|
11
|
+
require 'twilio-ruby/util'
|
12
|
+
require 'twilio-ruby/util/request_validator'
|
13
|
+
require 'twilio-ruby/util/capability'
|
14
|
+
require 'twilio-ruby/twiml/response'
|
15
|
+
require 'twilio-ruby/rest/errors'
|
16
|
+
require 'twilio-ruby/rest/utils'
|
17
|
+
require 'twilio-ruby/rest/list_resource'
|
18
|
+
require 'twilio-ruby/rest/instance_resource'
|
19
|
+
require 'twilio-ruby/rest/sandbox'
|
20
|
+
require 'twilio-ruby/rest/accounts'
|
21
|
+
require 'twilio-ruby/rest/calls'
|
22
|
+
require 'twilio-ruby/rest/sms'
|
23
|
+
require 'twilio-ruby/rest/sms/messages'
|
24
|
+
require 'twilio-ruby/rest/sms/short_codes'
|
25
|
+
require 'twilio-ruby/rest/applications'
|
26
|
+
require 'twilio-ruby/rest/outgoing_caller_ids'
|
27
|
+
require 'twilio-ruby/rest/incoming_phone_numbers'
|
28
|
+
require 'twilio-ruby/rest/available_phone_numbers'
|
29
|
+
require 'twilio-ruby/rest/available_phone_numbers/country'
|
30
|
+
require 'twilio-ruby/rest/available_phone_numbers/local'
|
31
|
+
require 'twilio-ruby/rest/available_phone_numbers/toll_free'
|
32
|
+
require 'twilio-ruby/rest/conferences'
|
33
|
+
require 'twilio-ruby/rest/conferences/participants'
|
34
|
+
require 'twilio-ruby/rest/recordings'
|
35
|
+
require 'twilio-ruby/rest/transcriptions'
|
36
|
+
require 'twilio-ruby/rest/notifications'
|
37
|
+
require 'twilio-ruby/rest/client'
|
data/test/twilio_spec.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
|
2
2
|
require 'twilio-ruby'
|
3
3
|
require 'fakeweb'
|
4
|
+
require 'rack'
|
4
5
|
|
5
6
|
describe Twilio::REST::Client do
|
6
7
|
before :all do
|
@@ -21,14 +22,14 @@ describe Twilio::REST::Client do
|
|
21
22
|
end
|
22
23
|
|
23
24
|
it 'should set up the proper http ssl connection when a different domain is given' do
|
24
|
-
twilio = Twilio::REST::Client.new('someSid', 'someToken', 'api.faketwilio.com')
|
25
|
+
twilio = Twilio::REST::Client.new('someSid', 'someToken', :host => 'api.faketwilio.com')
|
25
26
|
twilio.instance_variable_get('@connection').address.should == 'api.faketwilio.com'
|
26
27
|
twilio.instance_variable_get('@connection').port.should == 443
|
27
28
|
twilio.instance_variable_get('@connection').use_ssl?.should == true
|
28
29
|
end
|
29
30
|
|
30
31
|
it 'should set up the proper http ssl connection when a proxy_host is given' do
|
31
|
-
twilio = Twilio::REST::Client.new('someSid', 'someToken', 'api.faketwilio.com', 'localhost')
|
32
|
+
twilio = Twilio::REST::Client.new('someSid', 'someToken', :host => 'api.faketwilio.com', :proxy_addr => 'localhost')
|
32
33
|
twilio.instance_variable_get('@connection').proxy?.should == true
|
33
34
|
twilio.instance_variable_get('@connection').proxy_address.should == 'localhost'
|
34
35
|
twilio.instance_variable_get('@connection').proxy_port.should == 80
|
@@ -38,7 +39,7 @@ describe Twilio::REST::Client do
|
|
38
39
|
end
|
39
40
|
|
40
41
|
it 'should set up the proper http ssl connection when a proxy_host and proxy_port are given' do
|
41
|
-
twilio = Twilio::REST::Client.new('someSid', 'someToken', 'api.faketwilio.com', 'localhost', 13128)
|
42
|
+
twilio = Twilio::REST::Client.new('someSid', 'someToken', :host => 'api.faketwilio.com', :proxy_addr => 'localhost', :proxy_port => 13128)
|
42
43
|
twilio.instance_variable_get('@connection').proxy?.should == true
|
43
44
|
twilio.instance_variable_get('@connection').proxy_address.should == 'localhost'
|
44
45
|
twilio.instance_variable_get('@connection').proxy_port.should == 13128
|
@@ -208,3 +209,139 @@ describe Twilio::Util::RequestValidator do
|
|
208
209
|
validator.validate(url, params, signature).should == true
|
209
210
|
end
|
210
211
|
end
|
212
|
+
|
213
|
+
describe Twilio::Util::Capability do
|
214
|
+
before :each do
|
215
|
+
@capability = Twilio::Util::Capability.new 'myAccountSid', 'myAuthToken'
|
216
|
+
end
|
217
|
+
|
218
|
+
def queries(q)
|
219
|
+
q.scan(/scope:client:(incoming|outgoing)\?(\S+)/).map{|(type, query)| [type, Rack::Utils.parse_query(query)]}
|
220
|
+
end
|
221
|
+
|
222
|
+
it 'should return a valid jwt when #generate is called' do
|
223
|
+
token = @capability.generate
|
224
|
+
decoded = JWT.decode token, 'myAuthToken'
|
225
|
+
decoded['scope'].should_not be_nil
|
226
|
+
decoded['iss'].should_not be_nil
|
227
|
+
decoded['exp'].should_not be_nil
|
228
|
+
end
|
229
|
+
|
230
|
+
it 'should properly set the iss key in the payload' do
|
231
|
+
token = @capability.generate
|
232
|
+
decoded = JWT.decode token, 'myAuthToken'
|
233
|
+
decoded['iss'].should == 'myAccountSid'
|
234
|
+
end
|
235
|
+
|
236
|
+
it 'should properly set the exp key based on the default hour ttl' do
|
237
|
+
seconds = Time.now.to_i
|
238
|
+
token = @capability.generate
|
239
|
+
decoded = JWT.decode token, 'myAuthToken'
|
240
|
+
decoded['exp'].should == seconds + 3600
|
241
|
+
end
|
242
|
+
|
243
|
+
it 'should properly set the exp key based on the ttl passed to #generate' do
|
244
|
+
ttl = rand 10000
|
245
|
+
seconds = Time.now.to_i
|
246
|
+
token = @capability.generate ttl
|
247
|
+
decoded = JWT.decode token, 'myAuthToken'
|
248
|
+
decoded['exp'].should == seconds + ttl
|
249
|
+
end
|
250
|
+
|
251
|
+
it 'should generate a proper incoming client scope string' do
|
252
|
+
@capability.allow_client_incoming 'andrew'
|
253
|
+
token = @capability.generate
|
254
|
+
decoded = JWT.decode token, 'myAuthToken'
|
255
|
+
queries(decoded['scope']).should == [['incoming', {'clientName' => 'andrew'}]]
|
256
|
+
end
|
257
|
+
|
258
|
+
it 'should generate multiple proper incoming client scope strings' do
|
259
|
+
@capability.allow_client_incoming 'andrew'
|
260
|
+
@capability.allow_client_incoming 'bridget'
|
261
|
+
token = @capability.generate
|
262
|
+
decoded = JWT.decode token, 'myAuthToken'
|
263
|
+
queries(decoded['scope']).should == [
|
264
|
+
['incoming', {'clientName' => 'andrew'}],
|
265
|
+
['incoming', {'clientName' => 'bridget'}]
|
266
|
+
]
|
267
|
+
end
|
268
|
+
|
269
|
+
it 'should generate a proper outgoing client scope string' do
|
270
|
+
@capability.allow_client_outgoing 'myAppSid'
|
271
|
+
token = @capability.generate
|
272
|
+
decoded = JWT.decode token, 'myAuthToken'
|
273
|
+
queries(decoded['scope']).should == [['outgoing', {'appSid' => 'myAppSid'}]]
|
274
|
+
end
|
275
|
+
|
276
|
+
it 'should generate a proper outgoing client scope string with parameters' do
|
277
|
+
app_params_hash = {'key' => 'a value', :foo => 'bar/baz'}
|
278
|
+
@capability.allow_client_outgoing 'myAppSid', app_params_hash
|
279
|
+
app_params = @capability.instance_eval {url_encode(app_params_hash)}
|
280
|
+
params_hash = {'appSid' => 'myAppSid', 'appParams' => app_params}
|
281
|
+
params = @capability.instance_eval {url_encode(params_hash)}
|
282
|
+
token = @capability.generate
|
283
|
+
decoded = JWT.decode token, 'myAuthToken'
|
284
|
+
queries(decoded['scope']).should == [['outgoing', params_hash]]
|
285
|
+
end
|
286
|
+
|
287
|
+
it 'should generate a proper outgoing client scope string based on the ' +
|
288
|
+
'client name when calling #allow_client_incoming first' do
|
289
|
+
@capability.allow_client_incoming 'andrew'
|
290
|
+
@capability.allow_client_outgoing 'myAppSid'
|
291
|
+
token = @capability.generate
|
292
|
+
decoded = JWT.decode token, 'myAuthToken'
|
293
|
+
queries(decoded['scope']).should == [
|
294
|
+
['incoming', {'clientName' => 'andrew'}],
|
295
|
+
['outgoing', {'clientName' => 'andrew', 'appSid' => 'myAppSid'}]
|
296
|
+
]
|
297
|
+
end
|
298
|
+
|
299
|
+
it 'should generate a proper outgoing client scope string based on the ' +
|
300
|
+
'client name when calling #allow_client_incoming second' do
|
301
|
+
@capability.allow_client_outgoing 'myAppSid'
|
302
|
+
@capability.allow_client_incoming 'andrew'
|
303
|
+
token = @capability.generate
|
304
|
+
decoded = JWT.decode token, 'myAuthToken'
|
305
|
+
queries(decoded['scope']).should == [["incoming", {"clientName"=>"andrew"}], ["outgoing", {"clientName"=>"andrew", "appSid"=>"myAppSid"}]]
|
306
|
+
end
|
307
|
+
|
308
|
+
it 'should generate a proper outgoing client scope string with parameters ' +
|
309
|
+
'and a client name when calling #allow_client_incoming first' do
|
310
|
+
@capability.allow_client_incoming 'andrew'
|
311
|
+
app_params_hash = {'key' => 'a value', :foo => 'bar/baz'}
|
312
|
+
@capability.allow_client_outgoing 'myAppSid', app_params_hash
|
313
|
+
app_params = @capability.instance_eval {url_encode(app_params_hash)}
|
314
|
+
params_hash = {'appSid' => 'myAppSid', 'appParams' => app_params, 'clientName' => 'andrew'}
|
315
|
+
params = @capability.instance_eval {url_encode(params_hash)}
|
316
|
+
token = @capability.generate
|
317
|
+
decoded = JWT.decode token, 'myAuthToken'
|
318
|
+
scopes = queries(decoded['scope'])
|
319
|
+
scopes.shift.should == ["incoming", {"clientName"=>"andrew"}]
|
320
|
+
scope = scopes.shift
|
321
|
+
scope.first.should == 'outgoing'
|
322
|
+
Rack::Utils.parse_query(scope.last['appParams']).should == {'key' => 'a value', 'foo' => 'bar/baz'}
|
323
|
+
scope.last["clientName"].should == "andrew"
|
324
|
+
scope.last["appSid"].should == "myAppSid"
|
325
|
+
scopes.should be_empty
|
326
|
+
end
|
327
|
+
|
328
|
+
it 'should generate a proper outgoing client scope string with parameters ' +
|
329
|
+
'and a client name when calling #allow_client_incoming second' do
|
330
|
+
app_params_hash = {'key' => 'a value', :foo => 'bar/baz'}
|
331
|
+
@capability.allow_client_outgoing 'myAppSid', app_params_hash
|
332
|
+
@capability.allow_client_incoming 'andrew'
|
333
|
+
app_params = @capability.instance_eval {url_encode(app_params_hash)}
|
334
|
+
params_hash = {'appSid' => 'myAppSid', 'appParams' => app_params, 'clientName' => 'andrew'}
|
335
|
+
params = @capability.instance_eval {url_encode(params_hash)}
|
336
|
+
token = @capability.generate
|
337
|
+
decoded = JWT.decode token, 'myAuthToken'
|
338
|
+
scopes = queries(decoded['scope'])
|
339
|
+
scopes.shift.should == ["incoming", {"clientName"=>"andrew"}]
|
340
|
+
scope = scopes.shift
|
341
|
+
scope.first.should == 'outgoing'
|
342
|
+
Rack::Utils.parse_query(scope.last['appParams']).should == {'key' => 'a value', 'foo' => 'bar/baz'}
|
343
|
+
scope.last["clientName"].should == "andrew"
|
344
|
+
scope.last["appSid"].should == "myAppSid"
|
345
|
+
scopes.should be_empty
|
346
|
+
end
|
347
|
+
end
|
data/twilio-ruby.gemspec
CHANGED
@@ -1,15 +1,29 @@
|
|
1
|
+
require 'lib/twilio-ruby/version'
|
2
|
+
|
1
3
|
Gem::Specification.new do |s|
|
2
|
-
s.name =
|
3
|
-
s.version =
|
4
|
-
s.author =
|
5
|
-
s.email =
|
6
|
-
|
7
|
-
s.
|
8
|
-
s.
|
4
|
+
s.name = 'twilio-ruby'
|
5
|
+
s.version = Twilio::VERSION
|
6
|
+
s.author = 'Andrew Benton'
|
7
|
+
s.email = 'andrew@twilio.com'
|
8
|
+
|
9
|
+
s.description = 'A simple library for communicating with the Twilio REST API, building TwiML, and generating Twilio Client Capability Tokens'
|
10
|
+
s.summary = 'A simple library for communicating with the Twilio REST API, building TwiML, and generating Twilio Client Capability Tokens'
|
11
|
+
s.homepage = 'http://github.com/twilio/twilio-ruby'
|
12
|
+
|
9
13
|
s.platform = Gem::Platform::RUBY
|
10
|
-
s.
|
14
|
+
s.require_paths = %w[lib]
|
15
|
+
s.files = `git ls-files`.split("\n")
|
11
16
|
s.test_files = Dir['test/**/*.rb']
|
12
|
-
|
13
|
-
s.add_dependency(
|
14
|
-
s.add_dependency(
|
17
|
+
|
18
|
+
s.add_dependency('multi_json', '>= 1.0.3')
|
19
|
+
s.add_dependency('builder', '>= 2.1.2')
|
20
|
+
s.add_dependency('jwt', '>= 0.1.2')
|
21
|
+
|
22
|
+
s.add_development_dependency 'rake', '~> 0.9.0'
|
23
|
+
s.add_development_dependency 'rspec', '~> 2.6.0'
|
24
|
+
s.add_development_dependency 'fakeweb', '~> 1.3.0'
|
25
|
+
s.add_development_dependency 'rack', '~> 1.3.0'
|
26
|
+
|
27
|
+
s.extra_rdoc_files = ['README.md', 'README.rdoc', 'examples.rb', 'LICENSE']
|
28
|
+
s.rdoc_options = ['--line-numbers', '--inline-source', '--title', 'twilio-ruby', '--main', 'README.md']
|
15
29
|
end
|