twilio-ruby 4.2.1 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES.md +10 -0
- data/lib/twilio-ruby/rest/list_resource.rb +4 -5
- data/lib/twilio-ruby/task_router/capability.rb +172 -35
- data/lib/twilio-ruby/version.rb +1 -1
- data/spec/task_router_deprecated_spec.rb +130 -0
- data/spec/task_router_spec.rb +32 -36
- data/spec/task_router_taskqueue_spec.rb +111 -0
- data/spec/task_router_worker_spec.rb +129 -0
- data/spec/task_router_workspace_spec.rb +110 -0
- metadata +27 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b89103d98fe5a0cc274231f662de67e7a3b33c35
|
4
|
+
data.tar.gz: 23519a4229477cd81a3d0a03023c3c0d0032eb28
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 22efb989dd0661f6e15f2357faff19b67cb9ee0314d38024ea5a399b46fb8dd1d44f30975bc1b744ef3f75854d97df17d71992c528b9ee231cd75d5d685399f1
|
7
|
+
data.tar.gz: e3b6739ff15ef1c1ab643f85923776e8831213412c8a1ddc3d36c23cc2331324976f6357aabd098f667ebaf651e97abab5883d26595c03e90714e86fa4e58a55
|
data/CHANGES.md
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
twilio-ruby changelog
|
2
2
|
=====================
|
3
3
|
|
4
|
+
Version 4.3.0
|
5
|
+
-------------
|
6
|
+
|
7
|
+
Release August 11, 2015
|
8
|
+
|
9
|
+
- Add support for new Taskrouter JWT Functionality, JWTs now grant access to
|
10
|
+
- Workspace
|
11
|
+
- Worker
|
12
|
+
- TaskQueue
|
13
|
+
|
4
14
|
Version 4.2.1
|
5
15
|
-------------
|
6
16
|
|
@@ -35,11 +35,10 @@ module Twilio
|
|
35
35
|
|
36
36
|
##
|
37
37
|
# Grab a list of this kind of resource and return it as an array. The
|
38
|
-
# array includes
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
# of resources you can request is 1000.
|
38
|
+
# array includes two special methods +previous_page+ and +next_page+
|
39
|
+
# which will return the previous or next page or resources. By default
|
40
|
+
# Twilio will only return 50 resources, and the maximum number of
|
41
|
+
# resources you can request (using the :page_size param) is 1000.
|
43
42
|
#
|
44
43
|
# The optional +params+ hash allows you to filter the list returned. The
|
45
44
|
# filters for each list resource type are defined by Twilio.
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module Twilio
|
2
2
|
module TaskRouter
|
3
3
|
class Capability
|
4
|
-
|
5
4
|
TASK_ROUTER_BASE_URL = 'https://taskrouter.twilio.com'
|
6
5
|
TASK_ROUTER_VERSION = 'v1'
|
7
6
|
TASK_ROUTER_WEBSOCKET_BASE_URL = 'https://event-bridge.twilio.com/v1/wschannels'
|
@@ -9,79 +8,217 @@ module Twilio
|
|
9
8
|
REQUIRED = {required: true}
|
10
9
|
OPTIONAL = {required: false}
|
11
10
|
|
12
|
-
def initialize(account_sid, auth_token, workspace_sid,
|
11
|
+
def initialize(account_sid, auth_token, workspace_sid, channel_id)
|
13
12
|
@account_sid = account_sid
|
14
13
|
@auth_token = auth_token
|
15
|
-
@workspace_sid = workspace_sid
|
16
|
-
@worker_sid = worker_sid
|
17
14
|
@policies = []
|
18
|
-
|
19
|
-
|
15
|
+
|
16
|
+
@workspace_sid = workspace_sid
|
17
|
+
@channel_id = channel_id
|
18
|
+
|
19
|
+
@baseUrl = "#{TASK_ROUTER_BASE_URL}/#{TASK_ROUTER_VERSION}/Workspaces/#{workspace_sid}"
|
20
|
+
|
21
|
+
validate_jwt
|
22
|
+
|
23
|
+
setup_resource
|
24
|
+
|
25
|
+
allow_websocket_requests(@channel_id)
|
26
|
+
allow(@resourceUrl, "GET")
|
20
27
|
end
|
21
28
|
|
22
|
-
def
|
23
|
-
|
29
|
+
def allow_fetch_subresources
|
30
|
+
allow(@resourceUrl + "/**", "GET")
|
24
31
|
end
|
25
32
|
|
26
|
-
def
|
27
|
-
|
33
|
+
def allow_updates
|
34
|
+
allow(@resourceUrl, "POST")
|
28
35
|
end
|
29
36
|
|
37
|
+
def allow_updates_subresources
|
38
|
+
allow(@resourceUrl + "/**", "POST")
|
39
|
+
end
|
40
|
+
|
41
|
+
def allow_delete
|
42
|
+
allow(@resourceUrl, "DELETE")
|
43
|
+
end
|
44
|
+
|
45
|
+
def allow_delete_subresources
|
46
|
+
allow(@resourceUrl + "/**", "DELETE")
|
47
|
+
end
|
48
|
+
|
49
|
+
# @deprecated Please use {Twilio::TaskRouter::WorkerCapability.allowActivityUpdates} instead
|
30
50
|
def allow_worker_activity_updates
|
31
|
-
|
51
|
+
if(@channel_id[0..1] == 'WK')
|
52
|
+
allow(@resourceUrl, "POST", nil, {ActivitySid: REQUIRED})
|
53
|
+
else
|
54
|
+
raise "Deprecreated function not applicable to non-Worker"
|
55
|
+
end
|
32
56
|
end
|
33
57
|
|
58
|
+
# @deprecated Please use {Twilio::TaskRouter::WorkerCapability} instead; added automatically in constructor
|
34
59
|
def allow_worker_fetch_attributes
|
35
|
-
|
60
|
+
if(@channel_id[0..1] == 'WK')
|
61
|
+
allow(@resourceUrl, "GET")
|
62
|
+
else
|
63
|
+
raise "Deprecated function not applicable to non Worker"
|
64
|
+
end
|
36
65
|
end
|
37
66
|
|
67
|
+
# @deprecated Please use {Twilio::TaskRouter::WorkerCapability.allowReservationUpdates} instead
|
38
68
|
def allow_task_reservation_updates
|
39
|
-
|
40
|
-
|
69
|
+
if(@channel_id[0..1] == 'WK')
|
70
|
+
task_url = "#{@baseUrl}/Tasks/**"
|
71
|
+
allow(task_url, "POST", nil, nil)
|
72
|
+
else
|
73
|
+
raise "Deprecated function not applicable to non Worker"
|
74
|
+
end
|
41
75
|
end
|
42
76
|
|
43
|
-
def add_policy(url, method,
|
77
|
+
def add_policy(url, method, allowed = true, query_filters = nil, post_filters = nil)
|
44
78
|
policy = {
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
79
|
+
url: url,
|
80
|
+
method: method,
|
81
|
+
query_filter: query_filters || {},
|
82
|
+
post_filter: post_filters || {},
|
83
|
+
allow: allowed
|
50
84
|
}
|
51
85
|
|
52
86
|
@policies.push(policy)
|
53
87
|
end
|
54
88
|
|
89
|
+
def allow(url, method, query_filters = nil, post_filters = nil)
|
90
|
+
add_policy(url, method, true, query_filters, post_filters)
|
91
|
+
end
|
92
|
+
|
93
|
+
def deny(url, method, query_filters = nil, post_filters = nil)
|
94
|
+
add_policy(url, method, false, query_filters, post_filters)
|
95
|
+
end
|
96
|
+
|
55
97
|
def generate_token(ttl = 3600)
|
98
|
+
taskRouterAttributes = {
|
99
|
+
account_sid: @account_sid,
|
100
|
+
workspace_sid: @workspace_sid,
|
101
|
+
channel: @channel_id
|
102
|
+
}
|
103
|
+
|
104
|
+
if(@channel_id[0..1] == 'WK')
|
105
|
+
taskRouterAttributes['worker_sid'] = @channel_id
|
106
|
+
elsif(@channel_id[0..1] == 'WQ')
|
107
|
+
taskRouterAttributes['taskqueue_sid'] = @channel_id
|
108
|
+
end
|
109
|
+
|
110
|
+
generate_token_protected(ttl, taskRouterAttributes)
|
111
|
+
end
|
112
|
+
|
113
|
+
protected
|
114
|
+
|
115
|
+
def generate_token_protected(ttl = 3600, extraAttributes)
|
56
116
|
payload = {
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
workspace_sid: @workspace_sid
|
117
|
+
iss: @account_sid,
|
118
|
+
exp: (Time.now.to_i + ttl),
|
119
|
+
version: TASK_ROUTER_VERSION,
|
120
|
+
friendly_name: @channel_id,
|
121
|
+
policies: @policies,
|
122
|
+
}
|
123
|
+
extraAttributes.each { |key, value|
|
124
|
+
payload[key] = value
|
66
125
|
}
|
67
126
|
|
68
127
|
JWT.encode payload, @auth_token
|
69
128
|
end
|
70
129
|
|
71
|
-
|
130
|
+
def setup_resource
|
131
|
+
if(@channel_id[0..1] == 'WS')
|
132
|
+
@resourceUrl = @baseUrl
|
133
|
+
elsif(@channel_id[0..1] == 'WK')
|
134
|
+
@resourceUrl = @baseUrl + "/Workers/" + @channel_id
|
72
135
|
|
73
|
-
|
74
|
-
|
136
|
+
@activityUrl = @baseUrl + "/Activities"
|
137
|
+
allow(@activityUrl, "GET")
|
138
|
+
|
139
|
+
@reservationsUrl = @baseUrl + "/Tasks/**"
|
140
|
+
allow(@reservationsUrl, "GET")
|
141
|
+
|
142
|
+
elsif(@channel_id[0..1] == 'WQ')
|
143
|
+
@resourceUrl = @baseUrl + "/TaskQueues/" + @channel_id
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def allow_websocket_requests(channel_id)
|
148
|
+
worker_url = "#{TASK_ROUTER_WEBSOCKET_BASE_URL}/#{@account_sid}/#{channel_id}"
|
75
149
|
['GET', 'POST'].each do |meth|
|
76
150
|
add_policy(worker_url, meth)
|
77
151
|
end
|
78
152
|
end
|
79
153
|
|
80
|
-
def
|
81
|
-
|
82
|
-
|
154
|
+
def validate_jwt
|
155
|
+
if(@account_sid.nil? or @account_sid[0..1] != 'AC')
|
156
|
+
raise "Invalid AccountSid provided #{@account_sid}"
|
157
|
+
end
|
158
|
+
if(@workspace_sid.nil? or @workspace_sid[0..1] != 'WS')
|
159
|
+
raise "Invalid WorkspaceSid provided #{@workspace_sid}"
|
160
|
+
end
|
161
|
+
if(@channel_id.nil?)
|
162
|
+
raise "ChannelId not provided"
|
163
|
+
end
|
164
|
+
@prefix = @channel_id[0..1]
|
165
|
+
if(@prefix != 'WS' and @prefix != 'WK' and @prefix != 'WQ')
|
166
|
+
raise "Invalid ChannelId provided: #{@channel_id}"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
class WorkerCapability < Capability
|
171
|
+
|
172
|
+
def initialize(account_sid, auth_token, workspace_sid, worker_sid)
|
173
|
+
super(account_sid, auth_token, workspace_sid, worker_sid)
|
174
|
+
@reservationsUrl = @baseUrl + "/Tasks/**"
|
175
|
+
@activityUrl = @baseUrl + "/Activities"
|
176
|
+
|
177
|
+
allow(@activityUrl, "GET")
|
178
|
+
allow(@reservationsUrl, "GET")
|
179
|
+
end
|
180
|
+
|
181
|
+
def allow_activity_updates
|
182
|
+
allow(@resourceUrl, "POST", nil, {ActivitySid: REQUIRED})
|
183
|
+
end
|
184
|
+
|
185
|
+
def allow_reservation_updates
|
186
|
+
allow(@reservationsUrl, "POST", nil, nil)
|
187
|
+
end
|
188
|
+
|
189
|
+
protected
|
190
|
+
|
191
|
+
def setup_resource
|
192
|
+
@resourceUrl = @baseUrl + "/Workers/" + @channel_id
|
83
193
|
end
|
84
194
|
|
85
195
|
end
|
196
|
+
|
197
|
+
class WorkspaceCapability < Capability
|
198
|
+
|
199
|
+
def initialize(account_sid, auth_token, workspace_sid)
|
200
|
+
super(account_sid, auth_token, workspace_sid, workspace_sid)
|
201
|
+
end
|
202
|
+
|
203
|
+
protected
|
204
|
+
|
205
|
+
def setup_resource
|
206
|
+
@resourceUrl = @baseUrl
|
207
|
+
end
|
208
|
+
|
209
|
+
end
|
210
|
+
|
211
|
+
class TaskQueueCapability < Capability
|
212
|
+
|
213
|
+
def initialize(account_sid, auth_token, workspace_sid, taskqueue_sid)
|
214
|
+
super(account_sid, auth_token, workspace_sid, taskqueue_sid)
|
215
|
+
end
|
216
|
+
|
217
|
+
protected
|
218
|
+
|
219
|
+
def setup_resource
|
220
|
+
@resourceUrl = @baseUrl + "/TaskQueues/" + @channel_id
|
221
|
+
end
|
222
|
+
end
|
86
223
|
end
|
87
224
|
end
|
data/lib/twilio-ruby/version.rb
CHANGED
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Twilio::TaskRouter::Capability do
|
4
|
+
describe 'with a deprecated capability' do
|
5
|
+
before :each do
|
6
|
+
@capability = Twilio::TaskRouter::Capability.new 'AC123', 'foobar', 'WS456', 'WK789'
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should return a valid jwt when #generate_token is called' do
|
10
|
+
token = @capability.generate_token
|
11
|
+
decoded, header = JWT.decode token, 'foobar'
|
12
|
+
expect(decoded['policies']).not_to be_nil
|
13
|
+
expect(decoded['iss']).not_to be_nil
|
14
|
+
expect(decoded['exp']).not_to be_nil
|
15
|
+
expect(decoded['account_sid']).to eq('AC123')
|
16
|
+
expect(decoded['workspace_sid']).to eq('WS456')
|
17
|
+
expect(decoded['worker_sid']).to eq('WK789')
|
18
|
+
expect(decoded['channel']).to eq('WK789')
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should properly set the iss key in the payload' do
|
22
|
+
token = @capability.generate_token
|
23
|
+
decoded, header = JWT.decode token, 'foobar'
|
24
|
+
expect(decoded['iss']).to eq('AC123')
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should properly set exp based on the default 1-hour ttl' do
|
28
|
+
seconds = Time.now.to_i
|
29
|
+
token = @capability.generate_token
|
30
|
+
decoded, header = JWT.decode token, 'foobar'
|
31
|
+
expect(decoded['exp']).to eq(seconds + 3600)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should properly set exp based on the ttl arg to #generate_token' do
|
35
|
+
seconds = Time.now.to_i
|
36
|
+
ttl = rand 10000
|
37
|
+
token = @capability.generate_token ttl
|
38
|
+
decoded, header = JWT.decode token, 'foobar'
|
39
|
+
expect(decoded['exp']).to eq(seconds + ttl)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should allow websocket operations and fetching the workspace by default' do
|
43
|
+
token = @capability.generate_token
|
44
|
+
decoded, header = JWT.decode token, 'foobar'
|
45
|
+
expect(decoded['policies'].size).to eq(5)
|
46
|
+
|
47
|
+
activites_fetch_policy = {
|
48
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Activities',
|
49
|
+
'method' => 'GET',
|
50
|
+
'query_filter' => {},
|
51
|
+
'post_filter' => {},
|
52
|
+
'allow' => true
|
53
|
+
}
|
54
|
+
expect(decoded['policies'][0]).to eq(activites_fetch_policy)
|
55
|
+
|
56
|
+
reservation_fetch_policy = {
|
57
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**',
|
58
|
+
'method' => 'GET',
|
59
|
+
'query_filter' => {},
|
60
|
+
'post_filter' => {},
|
61
|
+
'allow' => true
|
62
|
+
}
|
63
|
+
expect(decoded['policies'][1]).to eq(reservation_fetch_policy)
|
64
|
+
|
65
|
+
get_policy = {
|
66
|
+
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WK789',
|
67
|
+
"method" => 'GET',
|
68
|
+
"query_filter" => {},
|
69
|
+
"post_filter" => {},
|
70
|
+
"allow" => true
|
71
|
+
}
|
72
|
+
expect(decoded['policies'][2]).to eq(get_policy)
|
73
|
+
post_policy = {
|
74
|
+
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WK789',
|
75
|
+
"method" => 'POST',
|
76
|
+
"query_filter" => {},
|
77
|
+
"post_filter" => {},
|
78
|
+
"allow" => true
|
79
|
+
}
|
80
|
+
expect(decoded['policies'][3]).to eq(post_policy)
|
81
|
+
|
82
|
+
worker_fetch_policy = {
|
83
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789',
|
84
|
+
'method' => 'GET',
|
85
|
+
'query_filter' => {},
|
86
|
+
'post_filter' => {},
|
87
|
+
'allow' => true
|
88
|
+
}
|
89
|
+
expect(decoded['policies'][4]).to eq(worker_fetch_policy)
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'should add a policy when #allow_worker_activity_updates is called' do
|
93
|
+
token = @capability.generate_token
|
94
|
+
decoded, header = JWT.decode token, 'foobar'
|
95
|
+
policies_size = decoded['policies'].size
|
96
|
+
|
97
|
+
@capability.allow_worker_activity_updates
|
98
|
+
token = @capability.generate_token
|
99
|
+
decoded, header = JWT.decode token, 'foobar'
|
100
|
+
activity_policy = {
|
101
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789',
|
102
|
+
'method' => 'POST',
|
103
|
+
'query_filter' => {},
|
104
|
+
'post_filter' => {'ActivitySid' => {'required' => true}},
|
105
|
+
'allow' => true
|
106
|
+
}
|
107
|
+
expect(decoded['policies'][-1]).to eq(activity_policy)
|
108
|
+
expect(decoded['policies'].size).to eq(policies_size+1)
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'should add a policy when #allow_task_reservation_updates is called' do
|
112
|
+
token = @capability.generate_token
|
113
|
+
decoded, header = JWT.decode token, 'foobar'
|
114
|
+
policies_size = decoded['policies'].size
|
115
|
+
|
116
|
+
@capability.allow_task_reservation_updates
|
117
|
+
token = @capability.generate_token
|
118
|
+
decoded, header = JWT.decode token, 'foobar'
|
119
|
+
reservation_policy = {
|
120
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**',
|
121
|
+
'method' => 'POST',
|
122
|
+
'query_filter' => {},
|
123
|
+
'post_filter' => {},
|
124
|
+
'allow' => true
|
125
|
+
}
|
126
|
+
expect(decoded['policies'][-1]).to eq(reservation_policy)
|
127
|
+
expect(decoded['policies'].size).to eq(policies_size+1)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
data/spec/task_router_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe Twilio::TaskRouter::Capability do
|
4
4
|
describe 'with a capability' do
|
5
5
|
before :each do
|
6
|
-
@capability = Twilio::TaskRouter::Capability.new 'AC123', 'foobar', 'WS456', '
|
6
|
+
@capability = Twilio::TaskRouter::Capability.new 'AC123', 'foobar', 'WS456', 'WS456'
|
7
7
|
end
|
8
8
|
|
9
9
|
it 'should return a valid jwt when #generate_token is called' do
|
@@ -12,6 +12,9 @@ describe Twilio::TaskRouter::Capability do
|
|
12
12
|
expect(decoded['policies']).not_to be_nil
|
13
13
|
expect(decoded['iss']).not_to be_nil
|
14
14
|
expect(decoded['exp']).not_to be_nil
|
15
|
+
expect(decoded['account_sid']).to eq('AC123')
|
16
|
+
expect(decoded['workspace_sid']).to eq('WS456')
|
17
|
+
expect(decoded['channel']).to eq('WS456')
|
15
18
|
end
|
16
19
|
|
17
20
|
it 'should properly set the iss key in the payload' do
|
@@ -35,12 +38,12 @@ describe Twilio::TaskRouter::Capability do
|
|
35
38
|
expect(decoded['exp']).to eq(seconds + ttl)
|
36
39
|
end
|
37
40
|
|
38
|
-
it 'should allow websocket operations and
|
41
|
+
it 'should allow websocket operations and fetching the workspace by default' do
|
39
42
|
token = @capability.generate_token
|
40
43
|
decoded, header = JWT.decode token, 'foobar'
|
41
44
|
expect(decoded['policies'].size).to eq(3)
|
42
45
|
get_policy = {
|
43
|
-
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/
|
46
|
+
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WS456',
|
44
47
|
"method" => 'GET',
|
45
48
|
"query_filter" => {},
|
46
49
|
"post_filter" => {},
|
@@ -48,7 +51,7 @@ describe Twilio::TaskRouter::Capability do
|
|
48
51
|
}
|
49
52
|
expect(decoded['policies'][0]).to eq(get_policy)
|
50
53
|
post_policy = {
|
51
|
-
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/
|
54
|
+
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WS456',
|
52
55
|
"method" => 'POST',
|
53
56
|
"query_filter" => {},
|
54
57
|
"post_filter" => {},
|
@@ -56,59 +59,52 @@ describe Twilio::TaskRouter::Capability do
|
|
56
59
|
}
|
57
60
|
expect(decoded['policies'][1]).to eq(post_policy)
|
58
61
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
62
|
+
workspace_fetch_policy = {
|
63
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456',
|
64
|
+
'method' => 'GET',
|
65
|
+
'query_filter' => {},
|
66
|
+
'post_filter' => {},
|
67
|
+
'allow' => true
|
65
68
|
}
|
66
|
-
expect(decoded['policies'][2]).to eq(
|
69
|
+
expect(decoded['policies'][2]).to eq(workspace_fetch_policy)
|
67
70
|
end
|
68
71
|
|
69
|
-
it 'should add a policy when #
|
70
|
-
@capability.allow_worker_activity_updates
|
72
|
+
it 'should add a policy when #allow_fetch_subresources is called' do
|
71
73
|
token = @capability.generate_token
|
72
74
|
decoded, header = JWT.decode token, 'foobar'
|
73
|
-
|
74
|
-
activity_policy = {
|
75
|
-
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789',
|
76
|
-
'method' => 'POST',
|
77
|
-
'query_filter' => {},
|
78
|
-
'post_filter' => {'ActivitySid' => {'required' => true}},
|
79
|
-
'allow' => true
|
80
|
-
}
|
81
|
-
expect(decoded['policies'][-1]).to eq(activity_policy)
|
82
|
-
end
|
75
|
+
policies_size = decoded['policies'].size
|
83
76
|
|
84
|
-
|
85
|
-
@capability.allow_worker_fetch_attributes
|
77
|
+
@capability.allow_fetch_subresources
|
86
78
|
token = @capability.generate_token
|
87
79
|
decoded, header = JWT.decode token, 'foobar'
|
88
|
-
|
89
|
-
|
90
|
-
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789',
|
80
|
+
workspace_fetch_policy = {
|
81
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/**',
|
91
82
|
'method' => 'GET',
|
92
83
|
'query_filter' => {},
|
93
84
|
'post_filter' => {},
|
94
85
|
'allow' => true
|
95
86
|
}
|
96
|
-
expect(decoded['policies'][-1]).to eq(
|
87
|
+
expect(decoded['policies'][-1]).to eq(workspace_fetch_policy)
|
88
|
+
expect(decoded['policies'].size).to eq(policies_size+1)
|
97
89
|
end
|
98
90
|
|
99
|
-
it 'should add a policy when #
|
100
|
-
@capability.
|
91
|
+
it 'should add a policy when #allow_update_subresources is called' do
|
92
|
+
token = @capability.generate_token
|
93
|
+
decoded, header = JWT.decode token, 'foobar'
|
94
|
+
policies_size = decoded['policies'].size
|
95
|
+
|
96
|
+
@capability.allow_updates_subresources
|
101
97
|
token = @capability.generate_token
|
102
98
|
decoded, header = JWT.decode token, 'foobar'
|
103
|
-
|
104
|
-
|
105
|
-
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**',
|
99
|
+
workspace_update_policy = {
|
100
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/**',
|
106
101
|
'method' => 'POST',
|
107
102
|
'query_filter' => {},
|
108
|
-
'post_filter' => {
|
103
|
+
'post_filter' => {},
|
109
104
|
'allow' => true
|
110
105
|
}
|
111
|
-
expect(decoded['policies'][-1]).to eq(
|
106
|
+
expect(decoded['policies'][-1]).to eq(workspace_update_policy)
|
107
|
+
expect(decoded['policies'].size).to eq(policies_size+1)
|
112
108
|
end
|
113
109
|
end
|
114
110
|
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Twilio::TaskRouter::Capability do
|
4
|
+
describe 'with a capability' do
|
5
|
+
before :each do
|
6
|
+
@capability = Twilio::TaskRouter::TaskQueueCapability.new 'AC123', 'foobar', 'WS456', 'WQ789'
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should return a valid jwt when #generate_token is called' do
|
10
|
+
token = @capability.generate_token
|
11
|
+
decoded, header = JWT.decode token, 'foobar'
|
12
|
+
expect(decoded['policies']).not_to be_nil
|
13
|
+
expect(decoded['iss']).not_to be_nil
|
14
|
+
expect(decoded['exp']).not_to be_nil
|
15
|
+
expect(decoded['account_sid']).to eq('AC123')
|
16
|
+
expect(decoded['workspace_sid']).to eq('WS456')
|
17
|
+
expect(decoded['taskqueue_sid']).to eq('WQ789')
|
18
|
+
expect(decoded['channel']).to eq('WQ789')
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should properly set the iss key in the payload' do
|
22
|
+
token = @capability.generate_token
|
23
|
+
decoded, header = JWT.decode token, 'foobar'
|
24
|
+
expect(decoded['iss']).to eq('AC123')
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should properly set exp based on the default 1-hour ttl' do
|
28
|
+
seconds = Time.now.to_i
|
29
|
+
token = @capability.generate_token
|
30
|
+
decoded, header = JWT.decode token, 'foobar'
|
31
|
+
expect(decoded['exp']).to eq(seconds + 3600)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should properly set exp based on the ttl arg to #generate_token' do
|
35
|
+
seconds = Time.now.to_i
|
36
|
+
ttl = rand 10000
|
37
|
+
token = @capability.generate_token ttl
|
38
|
+
decoded, header = JWT.decode token, 'foobar'
|
39
|
+
expect(decoded['exp']).to eq(seconds + ttl)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should allow websocket operations and fetching the workspace by default' do
|
43
|
+
token = @capability.generate_token
|
44
|
+
decoded, header = JWT.decode token, 'foobar'
|
45
|
+
expect(decoded['policies'].size).to eq(3)
|
46
|
+
get_policy = {
|
47
|
+
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WQ789',
|
48
|
+
"method" => 'GET',
|
49
|
+
"query_filter" => {},
|
50
|
+
"post_filter" => {},
|
51
|
+
"allow" => true
|
52
|
+
}
|
53
|
+
expect(decoded['policies'][0]).to eq(get_policy)
|
54
|
+
post_policy = {
|
55
|
+
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WQ789',
|
56
|
+
"method" => 'POST',
|
57
|
+
"query_filter" => {},
|
58
|
+
"post_filter" => {},
|
59
|
+
"allow" => true
|
60
|
+
}
|
61
|
+
expect(decoded['policies'][1]).to eq(post_policy)
|
62
|
+
|
63
|
+
taskqueue_fetch_policy = {
|
64
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/TaskQueues/WQ789',
|
65
|
+
'method' => 'GET',
|
66
|
+
'query_filter' => {},
|
67
|
+
'post_filter' => {},
|
68
|
+
'allow' => true
|
69
|
+
}
|
70
|
+
expect(decoded['policies'][2]).to eq(taskqueue_fetch_policy)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should add a policy when #allow_fetch_subresources is called' do
|
74
|
+
token = @capability.generate_token
|
75
|
+
decoded, header = JWT.decode token, 'foobar'
|
76
|
+
policies_size = decoded['policies'].size
|
77
|
+
|
78
|
+
@capability.allow_fetch_subresources
|
79
|
+
token = @capability.generate_token
|
80
|
+
decoded, header = JWT.decode token, 'foobar'
|
81
|
+
taskqueue_fetch_policy = {
|
82
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/TaskQueues/WQ789/**',
|
83
|
+
'method' => 'GET',
|
84
|
+
'query_filter' => {},
|
85
|
+
'post_filter' => {},
|
86
|
+
'allow' => true
|
87
|
+
}
|
88
|
+
expect(decoded['policies'][-1]).to eq(taskqueue_fetch_policy)
|
89
|
+
expect(decoded['policies'].size).to eq(policies_size+1)
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'should add a policy when #allow_update_subresources is called' do
|
93
|
+
token = @capability.generate_token
|
94
|
+
decoded, header = JWT.decode token, 'foobar'
|
95
|
+
policies_size = decoded['policies'].size
|
96
|
+
|
97
|
+
@capability.allow_updates_subresources
|
98
|
+
token = @capability.generate_token
|
99
|
+
decoded, header = JWT.decode token, 'foobar'
|
100
|
+
taskqueue_update_policy = {
|
101
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/TaskQueues/WQ789/**',
|
102
|
+
'method' => 'POST',
|
103
|
+
'query_filter' => {},
|
104
|
+
'post_filter' => {},
|
105
|
+
'allow' => true
|
106
|
+
}
|
107
|
+
expect(decoded['policies'][-1]).to eq(taskqueue_update_policy)
|
108
|
+
expect(decoded['policies'].size).to eq(policies_size+1)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Twilio::TaskRouter::WorkerCapability do
|
4
|
+
describe 'with a capability' do
|
5
|
+
before :each do
|
6
|
+
@capability = Twilio::TaskRouter::WorkerCapability.new 'AC123', 'foobar', 'WS456', 'WK789'
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should return a valid jwt when #generate_token is called' do
|
10
|
+
token = @capability.generate_token
|
11
|
+
decoded, header = JWT.decode token, 'foobar'
|
12
|
+
expect(decoded['policies']).not_to be_nil
|
13
|
+
expect(decoded['iss']).not_to be_nil
|
14
|
+
expect(decoded['exp']).not_to be_nil
|
15
|
+
expect(decoded['account_sid']).to eq('AC123')
|
16
|
+
expect(decoded['workspace_sid']).to eq('WS456')
|
17
|
+
expect(decoded['worker_sid']).to eq('WK789')
|
18
|
+
expect(decoded['channel']).to eq('WK789')
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should properly set the iss key in the payload' do
|
22
|
+
token = @capability.generate_token
|
23
|
+
decoded, header = JWT.decode token, 'foobar'
|
24
|
+
expect(decoded['iss']).to eq('AC123')
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should properly set exp based on the default 1-hour ttl' do
|
28
|
+
seconds = Time.now.to_i
|
29
|
+
token = @capability.generate_token
|
30
|
+
decoded, header = JWT.decode token, 'foobar'
|
31
|
+
expect(decoded['exp']).to eq(seconds + 3600)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should properly set exp based on the ttl arg to #generate_token' do
|
35
|
+
seconds = Time.now.to_i
|
36
|
+
ttl = rand 10000
|
37
|
+
token = @capability.generate_token ttl
|
38
|
+
decoded, header = JWT.decode token, 'foobar'
|
39
|
+
expect(decoded['exp']).to eq(seconds + ttl)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should allow websocket operations and activity list fetches by default' do
|
43
|
+
token = @capability.generate_token
|
44
|
+
decoded, header = JWT.decode token, 'foobar'
|
45
|
+
expect(decoded['policies'].size).to eq(5)
|
46
|
+
get_policy = {
|
47
|
+
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WK789',
|
48
|
+
"method" => 'GET',
|
49
|
+
"query_filter" => {},
|
50
|
+
"post_filter" => {},
|
51
|
+
"allow" => true
|
52
|
+
}
|
53
|
+
expect(decoded['policies'][0]).to eq(get_policy)
|
54
|
+
post_policy = {
|
55
|
+
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WK789',
|
56
|
+
"method" => 'POST',
|
57
|
+
"query_filter" => {},
|
58
|
+
"post_filter" => {},
|
59
|
+
"allow" => true
|
60
|
+
}
|
61
|
+
expect(decoded['policies'][1]).to eq(post_policy)
|
62
|
+
|
63
|
+
worker_fetch_policy = {
|
64
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789',
|
65
|
+
'method' => 'GET',
|
66
|
+
'query_filter' => {},
|
67
|
+
'post_filter' => {},
|
68
|
+
'allow' => true
|
69
|
+
}
|
70
|
+
expect(decoded['policies'][2]).to eq(worker_fetch_policy)
|
71
|
+
|
72
|
+
activities_policy = {
|
73
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Activities',
|
74
|
+
'method' => 'GET',
|
75
|
+
'query_filter' => {},
|
76
|
+
'post_filter' => {},
|
77
|
+
'allow' => true
|
78
|
+
}
|
79
|
+
expect(decoded['policies'][3]).to eq(activities_policy)
|
80
|
+
|
81
|
+
reservations_policy = {
|
82
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**',
|
83
|
+
'method' => 'GET',
|
84
|
+
'query_filter' => {},
|
85
|
+
'post_filter' => {},
|
86
|
+
'allow' => true
|
87
|
+
}
|
88
|
+
expect(decoded['policies'][4]).to eq(reservations_policy)
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should add a policy when #allow_activity_updates is called' do
|
92
|
+
token = @capability.generate_token
|
93
|
+
decoded, header = JWT.decode token, 'foobar'
|
94
|
+
policies_size = decoded['policies'].size
|
95
|
+
|
96
|
+
@capability.allow_activity_updates
|
97
|
+
token = @capability.generate_token
|
98
|
+
decoded, header = JWT.decode token, 'foobar'
|
99
|
+
activity_policy = {
|
100
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789',
|
101
|
+
'method' => 'POST',
|
102
|
+
'query_filter' => {},
|
103
|
+
'post_filter' => {'ActivitySid' => {'required' => true}},
|
104
|
+
'allow' => true
|
105
|
+
}
|
106
|
+
expect(decoded['policies'][-1]).to eq(activity_policy)
|
107
|
+
expect(decoded['policies'].size).to eq(policies_size+1)
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'should add a policy when #allow_reservation_updates is called' do
|
111
|
+
token = @capability.generate_token
|
112
|
+
decoded, header = JWT.decode token, 'foobar'
|
113
|
+
policies_size = decoded['policies'].size
|
114
|
+
|
115
|
+
@capability.allow_reservation_updates
|
116
|
+
token = @capability.generate_token
|
117
|
+
decoded, header = JWT.decode token, 'foobar'
|
118
|
+
reservation_policy = {
|
119
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**',
|
120
|
+
'method' => 'POST',
|
121
|
+
'query_filter' => {},
|
122
|
+
'post_filter' => {},
|
123
|
+
'allow' => true
|
124
|
+
}
|
125
|
+
expect(decoded['policies'][-1]).to eq(reservation_policy)
|
126
|
+
expect(decoded['policies'].size).to eq(policies_size+1)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Twilio::TaskRouter::Capability do
|
4
|
+
describe 'with a capability' do
|
5
|
+
before :each do
|
6
|
+
@capability = Twilio::TaskRouter::WorkspaceCapability.new 'AC123', 'foobar', 'WS456'
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should return a valid jwt when #generate_token is called' do
|
10
|
+
token = @capability.generate_token
|
11
|
+
decoded, header = JWT.decode token, 'foobar'
|
12
|
+
expect(decoded['policies']).not_to be_nil
|
13
|
+
expect(decoded['iss']).not_to be_nil
|
14
|
+
expect(decoded['exp']).not_to be_nil
|
15
|
+
expect(decoded['account_sid']).to eq('AC123')
|
16
|
+
expect(decoded['workspace_sid']).to eq('WS456')
|
17
|
+
expect(decoded['channel']).to eq('WS456')
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should properly set the iss key in the payload' do
|
21
|
+
token = @capability.generate_token
|
22
|
+
decoded, header = JWT.decode token, 'foobar'
|
23
|
+
expect(decoded['iss']).to eq('AC123')
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should properly set exp based on the default 1-hour ttl' do
|
27
|
+
seconds = Time.now.to_i
|
28
|
+
token = @capability.generate_token
|
29
|
+
decoded, header = JWT.decode token, 'foobar'
|
30
|
+
expect(decoded['exp']).to eq(seconds + 3600)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should properly set exp based on the ttl arg to #generate_token' do
|
34
|
+
seconds = Time.now.to_i
|
35
|
+
ttl = rand 10000
|
36
|
+
token = @capability.generate_token ttl
|
37
|
+
decoded, header = JWT.decode token, 'foobar'
|
38
|
+
expect(decoded['exp']).to eq(seconds + ttl)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should allow websocket operations and fetching the workspace by default' do
|
42
|
+
token = @capability.generate_token
|
43
|
+
decoded, header = JWT.decode token, 'foobar'
|
44
|
+
expect(decoded['policies'].size).to eq(3)
|
45
|
+
get_policy = {
|
46
|
+
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WS456',
|
47
|
+
"method" => 'GET',
|
48
|
+
"query_filter" => {},
|
49
|
+
"post_filter" => {},
|
50
|
+
"allow" => true
|
51
|
+
}
|
52
|
+
expect(decoded['policies'][0]).to eq(get_policy)
|
53
|
+
post_policy = {
|
54
|
+
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WS456',
|
55
|
+
"method" => 'POST',
|
56
|
+
"query_filter" => {},
|
57
|
+
"post_filter" => {},
|
58
|
+
"allow" => true
|
59
|
+
}
|
60
|
+
expect(decoded['policies'][1]).to eq(post_policy)
|
61
|
+
|
62
|
+
workspace_fetch_policy = {
|
63
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456',
|
64
|
+
'method' => 'GET',
|
65
|
+
'query_filter' => {},
|
66
|
+
'post_filter' => {},
|
67
|
+
'allow' => true
|
68
|
+
}
|
69
|
+
expect(decoded['policies'][2]).to eq(workspace_fetch_policy)
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should add a policy when #allow_fetch_subresources is called' do
|
73
|
+
token = @capability.generate_token
|
74
|
+
decoded, header = JWT.decode token, 'foobar'
|
75
|
+
policies_size = decoded['policies'].size
|
76
|
+
|
77
|
+
@capability.allow_fetch_subresources
|
78
|
+
token = @capability.generate_token
|
79
|
+
decoded, header = JWT.decode token, 'foobar'
|
80
|
+
workspace_fetch_policy = {
|
81
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/**',
|
82
|
+
'method' => 'GET',
|
83
|
+
'query_filter' => {},
|
84
|
+
'post_filter' => {},
|
85
|
+
'allow' => true
|
86
|
+
}
|
87
|
+
expect(decoded['policies'][-1]).to eq(workspace_fetch_policy)
|
88
|
+
expect(decoded['policies'].size).to eq(policies_size+1)
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should add a policy when #allow_update_subresources is called' do
|
92
|
+
token = @capability.generate_token
|
93
|
+
decoded, header = JWT.decode token, 'foobar'
|
94
|
+
policies_size = decoded['policies'].size
|
95
|
+
|
96
|
+
@capability.allow_updates_subresources
|
97
|
+
token = @capability.generate_token
|
98
|
+
decoded, header = JWT.decode token, 'foobar'
|
99
|
+
workspace_update_policy = {
|
100
|
+
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/**',
|
101
|
+
'method' => 'POST',
|
102
|
+
'query_filter' => {},
|
103
|
+
'post_filter' => {},
|
104
|
+
'allow' => true
|
105
|
+
}
|
106
|
+
expect(decoded['policies'][-1]).to eq(workspace_update_policy)
|
107
|
+
expect(decoded['policies'].size).to eq(policies_size+1)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
metadata
CHANGED
@@ -1,69 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twilio-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Benton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 1.3.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 1.3.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: builder
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 2.1.2
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 2.1.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: jwt
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '1.0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '1.5'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.5'
|
69
69
|
description: A simple library for communicating with the Twilio REST API, building
|
@@ -76,8 +76,8 @@ extra_rdoc_files:
|
|
76
76
|
- README.md
|
77
77
|
- LICENSE.md
|
78
78
|
files:
|
79
|
-
-
|
80
|
-
-
|
79
|
+
- .gitignore
|
80
|
+
- .travis.yml
|
81
81
|
- AUTHORS.md
|
82
82
|
- CHANGES.md
|
83
83
|
- Gemfile
|
@@ -241,7 +241,11 @@ files:
|
|
241
241
|
- spec/rest/utils_spec.rb
|
242
242
|
- spec/spec_helper.rb
|
243
243
|
- spec/support/fakeweb.rb
|
244
|
+
- spec/task_router_deprecated_spec.rb
|
244
245
|
- spec/task_router_spec.rb
|
246
|
+
- spec/task_router_taskqueue_spec.rb
|
247
|
+
- spec/task_router_worker_spec.rb
|
248
|
+
- spec/task_router_workspace_spec.rb
|
245
249
|
- spec/twilio_spec.rb
|
246
250
|
- spec/util/capability_spec.rb
|
247
251
|
- spec/util/client_config_spec.rb
|
@@ -255,27 +259,27 @@ licenses:
|
|
255
259
|
metadata: {}
|
256
260
|
post_install_message:
|
257
261
|
rdoc_options:
|
258
|
-
-
|
259
|
-
-
|
260
|
-
-
|
262
|
+
- --line-numbers
|
263
|
+
- --inline-source
|
264
|
+
- --title
|
261
265
|
- twilio-ruby
|
262
|
-
-
|
266
|
+
- --main
|
263
267
|
- README.md
|
264
268
|
require_paths:
|
265
269
|
- lib
|
266
270
|
required_ruby_version: !ruby/object:Gem::Requirement
|
267
271
|
requirements:
|
268
|
-
- -
|
272
|
+
- - '>='
|
269
273
|
- !ruby/object:Gem::Version
|
270
274
|
version: 1.9.3
|
271
275
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
272
276
|
requirements:
|
273
|
-
- -
|
277
|
+
- - '>='
|
274
278
|
- !ruby/object:Gem::Version
|
275
279
|
version: '0'
|
276
280
|
requirements: []
|
277
281
|
rubyforge_project:
|
278
|
-
rubygems_version: 2.
|
282
|
+
rubygems_version: 2.0.14
|
279
283
|
signing_key:
|
280
284
|
specification_version: 4
|
281
285
|
summary: A simple library for communicating with the Twilio REST API, building TwiML,
|
@@ -306,7 +310,11 @@ test_files:
|
|
306
310
|
- spec/rest/utils_spec.rb
|
307
311
|
- spec/spec_helper.rb
|
308
312
|
- spec/support/fakeweb.rb
|
313
|
+
- spec/task_router_deprecated_spec.rb
|
309
314
|
- spec/task_router_spec.rb
|
315
|
+
- spec/task_router_taskqueue_spec.rb
|
316
|
+
- spec/task_router_worker_spec.rb
|
317
|
+
- spec/task_router_workspace_spec.rb
|
310
318
|
- spec/twilio_spec.rb
|
311
319
|
- spec/util/capability_spec.rb
|
312
320
|
- spec/util/client_config_spec.rb
|