8000 Merge pull request #251 from twilio/resync-edge · randy3465/twilio-python@adda737 · GitHub
[go: up one dir, main page]

Skip to content

Commit adda737

Browse files
committed
Merge pull request twilio#251 from twilio/resync-edge
Resync edge
2 parents 4ae57f8 + 4763b91 commit adda737

17 files changed

+415
-193
lines changed

.travis.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ python:
55
- '3.2'
66
- '3.3'
77
- '3.4'
8+
- '3.5'
89
install:
9-
- pip install . --use-mirrors
10-
- pip install -r requirements.txt --use-mirrors
11-
- pip install -r tests/requirements.txt --use-mirrors
10+
- pip install .
11+
- pip install -r requirements.txt
12+
- pip install -r tests/requirements.txt
1213
script:
1314
- flake8 --ignore=F401 twilio
1415
- flake8 --ignore=E123,E126,E128,E501 tests

CHANGES.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@ Released November 25, 2015:
4040

4141
- Adds support for python 3.5.
4242

43+
Version 4.9.2
44+
-------------
45+
46+
Released November 25, 2015:
47+
48+
- Fix for SIP Trunking bug
49+
4350
Version 5.0.1-edg A93C e
4451
-------------
4552

@@ -75,7 +82,7 @@ Released November 2, 2015:
7582

7683
- Add SMS pricing endpoint
7784

78-
Version 4.6.0-edge
85+
Version 4.6.0
7986
-------------
8087

8188
Released October 28, 2015:

tests/requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
sphinx
2-
httplib2==0.8
32
mock==0.8.0
43
nose
54
coverage

tests/task_router/test_capability.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,29 +59,36 @@ def test_defaults(self):
5959
)
6060
expected = [
6161
{
62-
'url': 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Activities',
62+
'url': websocket_url,
6363
'method': 'GET',
6464
'allow': True,
6565
'query_filter': {},
6666
'post_filter': {},
6767
},
6868
{
69-
'url': 'https://taskrouter.twilio.com/v1/Workspaces/{0}/Tasks/**'.format(self.workspace_sid),
69+
'url': websocket_url,
70+
'method': 'POST',
71+
'allow': True,
72+
'query_filter': {},
73+
'post_filter': {},
74+
},
75+
{
76+
'url': 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Activities',
7077
'method': 'GET',
7178
'allow': True,
7279
'query_filter': {},
7380
'post_filter': {},
7481
},
7582
{
76-
'url': websocket_url,
83+
'url': 'https://taskrouter.twilio.com/v1/Workspaces/{0}/Tasks/**'.format(self.workspace_sid),
7784
'method': 'GET',
7885
'allow': True,
7986
'query_filter': {},
8087
'post_filter': {},
8188
},
8289
{
83-
'url': websocket_url,
84-
'method': 'POST',
90+
'url': 'https://taskrouter.twilio.com/v1/Workspaces/{0}/Workers/{1}/Reservations/**'.format(self.workspace_sid, self.worker_sid),
91+
'method': 'GET',
8592
'allow': True,
8693
'query_filter': {},
8794
'post_filter': {},

tests/task_router/test_task_router_capability.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,15 @@ def test_worker_default(self):
7272
self.check_decoded(decoded, account_sid, workspace_sid, worker_sid, worker_sid)
7373

7474
policies = decoded['policies']
75-
self.assertEqual(len(policies), 5)
75+
self.assertEqual(len(policies), 6)
7676

7777
for method, url, policy in [
78-
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Activities", policies[0]),
79-
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**", policies[1]),
80-
('GET', "https://taskrouter.twilio.com/v1/wschannels/AC123/WK789", policies[2]),
81-
('POST', "https://event-bridge.twilio.com/v1/wschannels/AC123/WK789", policies[3]),
82-
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789", policies[4])
78+
('GET', "https://event-bridge.twilio.com/v1/wschannels/AC123/WK789", policies[0]),
79+
('POST', "https://event-bridge.twilio.com/v1/wschannels/AC123/WK789", policies[1]),
80+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789", policies[2])
81+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Activities", policies[3]),
82+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**", policies[4]),
83+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789/Reservations/**", policies[5])
8384
]:
8485
yield self.check_policy, method, url, policy
8586

@@ -128,15 +129,16 @@ def test_deprecated_worker(self):
128129
self.check_decoded(decoded, account_sid, workspace_sid, worker_sid, worker_sid)
129130

130131
policies = decoded['policies']
131-
self.assertEqual(len(policies), 5)
132+
self.assertEqual(len(policies), 6)
132133

133-
# should expect 5 policies
134+
# should expect 6 policies
134135
for method, url, policy in [
135-
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Activities", policies[0]),
136-
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**", policies[1]),
137-
('GET', "https://event-bridge.twilio.com/v1/wschannels/AC123/WK789", policies[2]),
138-
('POST', "https://event-bridge.twilio.com/v1/wschannels/AC123/WK789", policies[3]),
139-
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789", policies[4])
136+
('GET', "https://event-bridge.twilio.com/v1/wschannels/AC123/WK789", policies[0]),
137+
('POST', "https://event-bridge.twilio.com/v1/wschannels/AC123/WK789", policies[1]),
138+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Activities", policies[2]),
139+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**", policies[3]),
140+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789/Reservations/**", policies[4]),
141+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789", policies[5])
140142
]:
141143
yield self.check_policy, method, url, policy
142144

tests/task_router/test_task_router_worker_capability.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -72,17 +72,18 @@ def test_defaults(self):
7272

7373
websocket_url = 'https://event-bridge.twilio.com/v1/wschannels/{0}/{1}'.format(self.account_sid, self.worker_sid)
7474

75-
# expect 5 policies
75+
# expect 6 policies
7676
policies = decoded['policies']
77-
self.assertEqual(len(policies), 5)
77+
self.assertEqual(len(policies), 6)
7878

79-
# should expect 5 policies
79+
# should expect 6 policies
8080
for method, url, policy in [
8181
('GET', websocket_url, policies[0]),
8282
('POST', websocket_url, policies[1]),
8383
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789", policies[2]),
84-
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**", policies[3]),
85-
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Activities", policies[4])
84+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Activities", policies[3])
85+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**", policies[4]),
86+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789/Reservations/**", policies[5])
8687
]:
8788
yield self.check_policy, method, url, policy
8889

@@ -98,8 +99,8 @@ def test_allow_activity_updates(self):
9899
self.assertNotEqual(None, decoded)
99100

100101
policies = decoded['policies']
101-
self.assertEqual(len(policies), 6)
102-
policy = policies[5]
102+
self.assertEqual(len(policies), 7)
103+
policy = policies[6]
103104

104105
url = "https://taskrouter.twilio.com/v1/Workspaces/{0}/Workers/{1}".format(self.workspace_sid, self.worker_sid)
105106

@@ -121,13 +122,15 @@ def test_allow_reservation_updates(self):
121122
self.assertNotEqual(None, decoded)
122123

123124
policies = decoded['policies']
124-
self.assertEqual(len(policies), 6)
125-
126-
policy = policies[5]
125+
self.assertEqual(len(policies), 8)
127126

128-
url = "https://taskrouter.twilio.com/v1/Workspaces/{0}/Tasks/**".format(self.workspace_sid)
127+
taskPolicy = policies[6]
128+
tasksUrl = "https://taskrouter.twilio.com/v1/Workspaces/{0}/Tasks/**".format(self.workspace_sid)
129+
self.check_policy('POST', tasksUrl, taskPolicy)
129130

130-
self.check_policy('POST', url, policy)
131+
workerReservationsPolicy = policies[7]
132+
reservationsUrl = "https://taskrouter.twilio.com/v1/Workspaces/{0}/Workers/{1}/Reservations/**".format(self.workspace_sid, self.worker_sid)
133+
self.check_policy('POST', reservationsUrl, workerReservationsPolicy)
131134

132135
if __name__ == "__main__":
133136
unittest.main()

tests/task_router/test_workflow_config.py

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,203 @@ def test_from_json2(self):
7878
self.assertEqual(2, len(config.task_routing.filters))
7979
self.assertEqual(4, len(config.task_routing.default_filter))
8080

81+
def test_from_json_with_filter_friendly_name(self):
82+
data = {
83+
'task_routing':
84+
{
85+
'filters': [
86+
{
87+
'expression': 'type == "sales"',
88+
'filter_friendly_name': 'Sales',
89+
'targets': [
90+
{
91+
92+
'queue': 'WQec62de0e1148b8477f2e24579779c8b1',
93+
'expression': 'task.language IN worker.languages'
94+
}
95+
]
96+
},
97+
{
98+
'expression': 'type == "marketing"',
99+
'filter_friendly_name': 'Marketing',
100+
'targets': [
101+
{
102+
'queue': 'WQ2acd4c1a41ffadce5d1bac9e1ce2fa9f',
103+
'expression': 'task.language IN worker.languages'
104+
}
105+
]
106+
},
107+
{
108+
'expression': 'type == "support"',
109+
'filter_friendly_name': 'Support',
110+
'targets': [
111+
{
112+
'queue': 'WQe5eb317eb23500ade45087ea6522896c',
113+
'expression': 'task.language IN worker.languages'
114+
}
115+
]
116+
}
117+
],
118+
'default_filter':
119+
{
120+
'queue': 'WQ05f810d2d130344fd56e3c91ece2e594'
121+
}
122+
}
123+
}
124+
# marshal object
125+
config = WorkflowConfig.json2obj(json.dumps(data))
126+
self.assertEqual(3, len(config.task_routing.filters))
127+
self.assertEqual(1, len(config.task_routing.default_filter))
128+
129+
# check that the configuration was marshaled to "friendly_name" and not "filter_friendly_name"
130+
expected_config_data = {
131+
"task_routing":
132+
{
133+
"default_filter":
134+
{
135+
"queue": "WQ05f810d2d130344fd56e3c91ece2e594"
136+
},
137+
"filters": [
138+
{
139+
"expression": "type == \"sales\"",
140+
"friendly_name": "Sales",
141+
"targets": [
142+
{
143+
"expression": "task.language IN worker.languages",
144+
"queue": "WQec62de0e1148b8477f2e24579779c8b1"
145+
}
146+
]
147+
},
148+
{
149+
"expression": "type == \"marketing\"",
150+
"friendly_name": "Marketing",
151+
"targets": [
152+
{
153+
"expression": "task.language IN worker.languages",
154+
"queue": "WQ2acd4c1a41ffadce5d1bac9e1ce2fa9f"
155+
}
156+
]
157+
},
158+
{
159+
"expression": "type == \"support\"",
160+
"friendly_name": "Support",
161+
"targets": [
162+
{
163+
"expression": "task.language IN worker.languages",
164+
"queue": "WQe5eb317eb23500ade45087ea6522896c"
165+
}
166+
]
167+
}
168+
]
169+
}
170+
}
171+
172+
expected_config_json = json.dumps(expected_config_data,
173+
sort_keys=True,
174+
indent=4)
175+
# check that marshaling back stays as "friendly_name"
176+
self.assertEqual(config.to_json(), expected_config_json)
177+
178+
def test_from_json_with_both_filter_and_friendly_name(self):
179+
data = {
180+
'task_routing':
181+
{
182+
'filters': [
183+
{
184+
'expression': 'type == "sales"',
185+
'filter_friendly_name': "Sales",
186+
'friendly_name': 'Sales2',
187+
'targets': [
188+
{
189+
190+
'queue': 'WQec62de0e1148b8477f2e24579779c8b1',
191+
'expression': 'task.language IN worker.languages'
192+
}
193+
]
194+
},
195+
{
196+
'expression': 'type == "marketing"',
197+
'filter_friendly_name': 'Marketing',
198+
'friendly_name': 'Marketing2',
199+
'targets': [
200+
{
201+
'queue': 'WQ2acd4c1a41ffadce5d1bac9e1ce2fa9f',
202+
'expression': 'task.language IN worker.languages'
203+
}
204+
]
205+
},
206+
{
207+
'expression': 'type == "support"',
208+
'filter_friendly_name': 'Support',
209+
'friendly_name': 'Support2',
210+
'targets': [
211+
{
212+
'queue': 'WQe5eb317eb23500ade45087ea6522896c',
213+
'expression': 'task.language IN worker.languages'
214+
}
215+
]
216+
}
217+
],
218+
'default_filter':
219+
{
220+
'queue': 'WQ05f810d2d130344fd56e3c91ece2e594'
221+
}
222+
}
223+
}
224+
# marshal object
225+
config = WorkflowConfig.json2obj(json.dumps(data))
226+
self.assertEqual(3, len(config.task_routing.filters))
227+
self.assertEqual(1, len(config.task_routing.default_filter))
228+
229+
# check that the configuration was marshaled to "friendly_name" and not "filter_friendly_name"
230+
expected_config_data = {
231+
"task_routing":
232+
{
233+
"default_filter":
234+
{
235+
"queue": "WQ05f810d2d130344fd56e3c91ece2e594"
236+
},
237+
"filters": [
238+
{
239+
"expression": "type == \"sales\"",
240+
"friendly_name": "Sales",
241+
"targets": [
242+
{
243+
"expression": "task.language IN worker.languages",
244+
"queue": "WQec62de0e1148b8477f2e24579779c8b1"
245+
}
246+
]
247+
},
248+
{
249+
"expression": "type == \"marketing\"",
250+
"friendly_name": "Marketing",
251+
"targets": [
252+
{
253+
"expression": "task.language IN worker.languages",
254+
"queue": "WQ2acd4c1a41ffadce5d1bac9e1ce2fa9f"
255+
}
256+
]
257+
},
258+
{
259+
"expression": "type == \"support\"",
260+
"friendly_name": "Support",
261+
"targets": [
262+
{
263+
"expression": "task.language IN worker.languages",
264 538E +
"queue": "WQe5eb317eb23500ade45087ea6522896c"
265+
}
266+
]
267+
}
268+
]
269+
}
270+
}
271+
272+
expected_config_json = json.dumps(expected_config_data,
273+
sort_keys=True,
274+
indent=4)
275+
# check that marshaling back stays as "friendly_name"
276+
self.assertEqual(config.to_json(), expected_config_json)
277+
81278
def is_json(self, myjson):
82 3EC3 279
try:
83280
json.loads(myjson)

0 commit comments

Comments
 (0)
0