8000 Use the next_page_uri instead of constructing urls · arunssvm/twilio-python@f022e57 · GitHub
[go: up one dir, main page]

Skip to content

Commit f022e57

Browse files
committed
Use the next_page_uri instead of constructing urls
1 parent 82d2e15 commit f022e57

File tree

3 files changed

+56
-13
lines changed

3 files changed

+56
-13
lines changed

requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ nose
55
pyjwt
66
simplejson
77
unittest2
8+
coverage
9+
nosexcover

tests/test_base_resource.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import unittest2 as unittest
77
else:
88
import unittest
9-
from mock import Mock
9+
from mock import Mock, patch
1010
from nose.tools import assert_equals
1111
from nose.tools import raises
1212
from twilio.rest.resources import Resource
@@ -45,9 +45,40 @@ def testListResourceInit(self):
4545
def testKeyValue(self):
4646
self.assertEquals(self.r.key, self.r.name.lower())
4747

48+
def testIterNoKey(self):
49+
self.r.request = Mock()
50+
self.r.request.return_value = Mock(), {}
10000 51+
52+
with self.assertRaises(StopIteration):
53+
self.r.iter().next()
54+
55+
def testIterOneItem(self):
56+
self.r.request = Mock()
57+
self.r.request.return_value = Mock(), {self.r.key: [{'sid': 'foo'}]}
58+
59+
items = self.r.iter()
60+
items.next()
61+
62+
with self.assertRaises(StopIteration):
63+
items.next()
64+
65+
def testIterNoNextPage(self):
66+
self.r.request = Mock()
67+
self.r.request.return_value = Mock(), {self.r.key: []}
68+
69+
with self.assertRaises(StopIteration):
70+
self.r.iter().next()
71+
4872
def testKeyValue(self):
4973
self.r.key = "Hey"
5074
self.assertEquals(self.r.key, "Hey")
75+
76+
def testInstanceLoading(self):
77+
instance = self.r.load_instance({"sid": "foo"})
78+
79+
self.assertIsInstance(instance, InstanceResource)
80+
self.assertEquals(instance.sid, "foo")
81+
5182

5283
def testInstanceLoading(self):
5384
instance = self.r.load_instance({"sid": "foo"})

twilio/rest/resources.py

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from twilio import TwilioException
66
from twilio import TwilioRestException
77
from urllib import urlencode
8-
from urlparse import urlparse
8+
from urlparse import urlparse, parse_qs
99

1010
# import json
1111
try:
@@ -356,18 +356,28 @@ def count(self):
356356
def iter(self, **kwargs):
357357
"""
358358
Return all instance resources using an iterator
359-
Can only be called on classes which implement list()
360-
361-
TODO Make this use the next_url instead
362359
"""
363-
p = 0
364-
try:
365-
while True:
366-
for r in self.list(page=p, **kwargs):
367-
yield r
368-
p += 1
369-
except TwilioRestException:
370-
pass
360+
next_uri = self.uri
361+
params = transform_params(kwargs)
362+
363+
while next_uri:
364+
try:
365+
resp, page = self.request("GET", next_uri, params=params)
366+
367+
if self.key not in page:
368+
raise StopIteration()
369+
370+
for ir in page[self.key]:
371+
yield self.load_instance(ir)
372+
373+
if not page.get('next_page_uri', ''):
374+
raise StopIteration()
375+
376+
o = urlparse(page['next_page_uri'])
377+
params.update(parse_qs(o.query))
378+
except TwilioRestException:
379+
raise StopIteration()
380+
371381

372382
def load_instance(self, data):
373383
instance = self.instance(self, data[self.instance.id_key])

0 commit comments

Comments
 (0)
0