Skip to content
This repository was archived by the owner on May 13, 2025. It is now read-only.

Commit eaf5ab4

Browse files
committed
Merge pull request #5 from TwilioDevEd/next-gen-rc25
Next gen rc22
2 parents 2795264 + 5aa9c4f commit eaf5ab4

File tree

9 files changed

+158
-69
lines changed

9 files changed

+158
-69
lines changed

Gemfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@ gem 'sqlite3'
55
gem 'uglifier', '>= 1.3.0'
66
gem 'jquery-rails'
77
gem 'turbolinks'
8-
gem 'twilio-ruby'
8+
gem 'twilio-ruby', '>= 5.0.0'
99

1010
group :test do
1111
gem 'rspec-rails'
1212
gem 'pry'
1313
gem 'vcr'
1414
gem 'webmock'
15+
gem 'byebug'
1516
end
1617

1718
group :development do

Gemfile.lock

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ GEM
4141
binding_of_caller (0.7.2)
4242
debug_inspector (>= 0.0.1)
4343
builder (3.2.2)
44+
byebug (9.0.6)
4445
coderay (1.1.1)
4546
coffee-rails (4.1.1)
4647
coffee-script (>= 2.2.0)
@@ -56,6 +57,8 @@ GEM
5657
diff-lcs (1.2.5)
5758
erubis (2.7.0)
5859
execjs (2.7.0)
60+
faraday (0.12.1)
61+
multipart-post (>= 1.2, < 3)
5962
globalid (0.3.6)
6063
activesupport (>= 4.1.0)
6164
hashdiff (0.2.3)
@@ -65,7 +68,8 @@ GEM
6568
railties (>= 4.2.0)
6669
thor (>= 0.14, < 2.0)
6770
json (1.8.3)
68-
jwt (1.5.4)
71+
jwt (1.5.6)
72+
libxml-ruby (3.0.0)
6973
loofah (2.0.3)
7074
nokogiri (>= 1.5.9)
7175
mail (2.6.4)
@@ -76,7 +80,7 @@ GEM
7680
mime-types-data (3.2016.0521)
7781
mini_portile2 (2.1.0)
7882
minitest (5.9.0)
79-
multi_json (1.12.1)
83+
multipart-post (2.0.0)
8084
nokogiri (1.6.8)
8185
mini_portile2 (~> 2.1.0)
8286
pkg-config (~> 1.1.7)
@@ -144,10 +148,10 @@ GEM
144148
thread_safe (0.3.5)
145149
turbolinks (2.5.3)
146150
coffee-rails
147-
twilio-ruby (4.11.1)
148-
builder (>= 2.1.2)
149-
jwt (~> 1.0)
150-
multi_json (>= 1.3.0)
151+
twilio-ruby (5.0.0)
152+
faraday (~> 0.9)
153+
jwt (~> 1.5)
154+
libxml-ruby (= 3.0.0)
151155
tzinfo (1.2.2)
152156
thread_safe (~> 0.1)
153157
uglifier (3.0.0)
@@ -167,17 +171,18 @@ PLATFORMS
167171
ruby
168172

169173
DEPENDENCIES
174+
byebug
170175
jquery-rails
171176
pry
172177
rails (= 4.2.6)
173178
rspec-rails
174179
sqlite3
175180
turbolinks
176-
twilio-ruby
181+
twilio-ruby (>= 5.0.0)
177182
uglifier (>= 1.3.0)
178183
vcr
179184
web-console (~> 2.0)
180185
webmock
181186

182187
BUNDLED WITH
183-
1.11.2
188+
1.15.1

app/controllers/callback_controller.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,13 @@ def redirect_to_voicemail(call_sid)
4141
redirect_url =
4242
"http://twimlets.com/voicemail?Email=#{email}&#{url_message}"
4343

44-
call = client.account.calls.get(call_sid)
45-
call.redirect_to(redirect_url)
44+
client.calls(call_sid).update(url: redirect_url)
4645
end
4746

4847
def notify_offline_status(phone_number)
4948
message = 'Your status has changed to Offline. Reply with '\
5049
'"On" to get back Online'
51-
client.account.messages.create(
50+
client.messages.create(
5251
to: phone_number,
5352
from: ENV['TWILIO_NUMBER'],
5453
body: message

app/controllers/message_controller.rb

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ def incoming
1515

1616
worker_sid = WorkspaceInfo.instance.workers[from_number][:sid]
1717
client
18-
.workspace
19-
.workers
20-
.get(worker_sid)
18+
.workspaces(WorkspaceInfo.instance.workspace_sid)
19+
.workers(worker_sid)
20+
.fetch
2121
.update(activity_sid: activity_sid)
2222

2323
render xml: TwimlGenerator.generate_confirm_message(status)
@@ -26,10 +26,11 @@ def incoming
2626
private
2727

2828
def client
29-
Twilio::REST::TaskRouterClient.new(
29+
client_instance = Twilio::REST::Client.new(
3030
ENV['TWILIO_ACCOUNT_SID'],
31-
ENV['TWILIO_AUTH_TOKEN'],
32-
WorkspaceInfo.instance.workspace_sid
31+
ENV['TWILIO_AUTH_TOKEN']
3332
)
33+
34+
client_instance.taskrouter.v1
3435
end
3536
end

lib/twiml_generator.rb

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,29 @@
11
module TwimlGenerator
22
def self.generate_gather_product(callback_url)
3-
Twilio::TwiML::Response.new do |r|
4-
r.Gather numDigits: 1, action: callback_url, method: 'POST' do |g|
5-
g.Say 'Welcome to the Twilio support line!'
6-
g.Say 'To get specialized help with programmable voice press 1, '\
7-
'or press 2 for programmable SMS'
8-
end
9-
end.to_xml
3+
response = Twilio::TwiML::VoiceResponse.new
4+
gather = Twilio::TwiML::Gather.new(num_digits: 1,
5+
action: callback_url,
6+
method: 'POST')
7+
gather.say 'Welcome to the Twilio support line!'
8+
gather.say 'To get specialized help with programmable voice press 1, '\
9+
'or press 2 for programmable SMS'
10+
11+
response.append(gather)
12+
response.to_s
1013
end
1114

1215
def self.generate_task_enqueue(selected_product)
13-
Twilio::TwiML::Response.new do |r|
14-
r.Enqueue workflowSid: WorkspaceInfo.instance.workflow_sid do |e|
15-
e.Task "{\"selected_product\": \"#{selected_product}\"}"
16-
end
17-
end.to_xml
16+
enqueue = Twilio::TwiML::Enqueue.new(nil, workflow_sid: WorkspaceInfo.instance.workflow_sid)
17+
enqueue.task "{\"selected_product\": \"#{selected_product}\"}"
18+
19+
response = Twilio::TwiML::VoiceResponse.new
20+
response.append(enqueue)
21+
response.to_s
1822
end
1923

2024
def self.generate_confirm_message(status)
21-
Twilio::TwiML::Response.new do |r|
22-
r.Message "Your status has changed to #{status}"
23-
end.to_xml
25+
response = Twilio::TwiML::MessagingResponse.new
26+
response.message(body: "Your status has changed to #{status}")
27+
response.to_s
2428
end
2529
end

lib/workspace_config.rb

Lines changed: 50 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ def setup
2424
@workspace_sid = create_workspace
2525
@client = taskrouter_client
2626
WorkspaceInfo.instance.workers = create_workers
27-
queues = create_task_queues
28-
workflow_sid = create_workflow(queues).sid
27+
workflow_sid = create_workflow.sid
2928
WorkspaceInfo.instance.workflow_sid = workflow_sid
3029
idle_activity_sid = activity_by_name('Idle').sid
3130
WorkspaceInfo.instance.post_work_activity_sid = idle_activity_sid
@@ -39,11 +38,12 @@ def setup
3938
attr_reader :client, :account_sid, :auth_token
4039

4140
def taskrouter_client
42-
Twilio::REST::TaskRouterClient.new(
41+
client_instance = Twilio::REST::Client.new(
4342
account_sid,
44-
auth_token,
45-
workspace_sid
43+
auth_token
4644
)
45+
46+
client_instance.taskrouter.v1
4747
end
4848

4949
def create_workspace
@@ -72,15 +72,15 @@ def create_workers
7272
end
7373

7474
def create_worker(name, attributes)
75-
client.workspace.workers.create(
75+
client.workspaces(@workspace_sid).workers.create(
7676
friendly_name: name,
7777
attributes: attributes,
7878
activity_sid: activity_by_name('Idle').sid
7979
)
8080
end
8181

8282
def activity_by_name(name)
83-
client.workspace.activities.list(friendly_name: name).first
83+
client.workspaces(@workspace_sid).activities.list(friendly_name: name).first
8484
end
8585

8686
def create_task_queues
@@ -102,26 +102,19 @@ def create_task_queues
102102
end
103103

104104
def create_task_queue(name, reservation_sid, assignment_sid, target_workers)
105-
client.workspace.task_queues.create(
105+
client.workspaces(@workspace_sid).task_queues.create(
106106
friendly_name: name,
107107
reservation_activity_sid: reservation_sid,
108108
assignment_activity_sid: assignment_sid,
109109
target_workers: target_workers
110110
)
111111
end
112112

113-
def create_workflow(queues)
114-
default_rule_target = create_rule_target(queues[:all].sid, 1, QUEUE_TIMEOUT, '1==1')
115-
voice_rule_target = create_rule_target(queues[:voice].sid, 5, QUEUE_TIMEOUT, nil)
116-
sms_rule_target = create_rule_target(queues[:sms].sid, 5, QUEUE_TIMEOUT, nil)
117-
voice_rule = create_rule('selected_product=="ProgrammableVoice"',
118-
[voice_rule_target, default_rule_target])
119-
sms_rule = create_rule('selected_product=="ProgrammableSMS"',
120-
[sms_rule_target, default_rule_target])
121-
122-
rules = [voice_rule, sms_rule]
123-
config = Twilio::TaskRouter::WorkflowConfiguration.new(rules, default_rule_target)
124-
client.workspace.workflows.create(
113+
def create_workflow
114+
queues = create_task_queues
115+
config = workflow_config(queues)
116+
117+
client.workspaces(@workspace_sid).workflows.create(
125118
configuration: config.to_json,
126119
friendly_name: WORKFLOW_NAME,
127120
assignment_callback_url: ASSIGNMENT_CALLBACK_URL,
@@ -130,16 +123,46 @@ def create_workflow(queues)
130123
)
131124
end
132125

133-
def create_rule_target(queue_sid, priority, timeout, expression)
134-
Twilio::TaskRouter::WorkflowRuleTarget.new(queue_sid, priority, timeout,
135-
expression)
126+
def workspace_sid
127+
@workspace_sid || 'no_workspace_yet'
136128
end
137129

138-
def create_rule(expression, targets)
139-
Twilio::TaskRouter::WorkflowRule.new(expression, targets)
130+
def workflow_config(queues)
131+
default_target = default_rule_target(queues[:all].sid)
132+
133+
{
134+
task_routing: {
135+
filters: [
136+
{
137+
expression: 'selected_product=="ProgrammableVoice"',
138+
targets: [
139+
rule_target(queues[:voice].sid),
140+
default_target
141+
]
142+
},
143+
{
144+
expression: 'selected_product=="ProgrammableSMS"',
145+
targets: [
146+
rule_target(queues[:sms].sid),
147+
default_target
148+
]
149+
}
150+
],
151+
default_filter: default_target
152+
}
153+
}
140154
end
141155

142-
def workspace_sid
143-
@workspace_sid || 'no_workspace_yet'
156+
def rule_target(sid)
157+
{ queue: sid, priority: 5, timeout: QUEUE_TIMEOUT }
158+
end
159+
160+
def default_rule_target(sid)
161+
{
162+
queue: sid,
163+
priority: 1,
164+
timeout: QUEUE_TIMEOUT,
165+
expression: '1==1'
166+
}
144167
end
145168
end

spec/controllers/callback_controller_spec.rb

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
message_body = 'Your status has changed to Offline. Reply with '\
3838
'"On" to get back Online'
3939

40-
expect(client_double).to receive_message_chain(:account, :messages).and_return(messages_double)
40+
expect(client_double).to receive(:messages).and_return(messages_double)
4141
expect(messages_double)
4242
.to receive(:create)
4343
.with(from: ENV['TWILIO_NUMBER'], to: worker_number, body: message_body)
@@ -74,13 +74,12 @@
7474
url_message = { Message: message }.to_query
7575
redirect_url =
7676
"http://twimlets.com/voicemail?Email=#{email}&#{url_message}"
77-
calls_double = double(:calls)
7877
call_double = double(:call)
7978

80-
allow(client_double).to receive_message_chain(:account, :calls).and_return(calls_double)
81-
expect(calls_double).to receive(:get).with(call_sid).and_return(call_double)
82-
expect(call_double).to receive(:redirect_to)
83-
.with(redirect_url)
79+
allow(client_double).to receive(:calls).with(call_sid)
80+
.and_return(call_double)
81+
expect(call_double).to receive(:update)
82+
.with(url: redirect_url)
8483

8584
post :events,
8685
EventType: 'workflow.timeout',

spec/controllers/message_controller_spec.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@
1818
workers_double = double(:workers)
1919
worker_double = double(:worker)
2020

21-
allow(Twilio::REST::TaskRouterClient).to receive(:new).and_return(client_double)
22-
allow(client_double).to receive_message_chain(:workspace, :workers).and_return(workers_double)
23-
expect(workers_double).to receive(:get).with(worker_sid).and_return(worker_double)
21+
allow(Twilio::REST::Client).to receive_message_chain(:new, :taskrouter, :v1)
22+
.and_return(client_double)
23+
allow(client_double).to receive_message_chain(:workspaces, :workers).and_return(workers_double)
24+
expect(workers_double).to receive(:fetch).and_return(worker_double)
2425
expect(worker_double).to receive(:update).with(activity_sid: idle_activity_sid)
2526

2627
expected_response = '<Response></Response>'

0 commit comments

Comments
 (0)