8000 Use next_page_uri for iterating over a list resource · ftobia/twilio-python@6ef25c8 · GitHub
[go: up one dir, main page]

Skip to content

Commit 6ef25c8

Browse files
committed
Use next_page_uri for iterating over a list resource
1 parent 82d2e15 commit 6ef25c8

File tree

5 files changed

+66
-15
lines changed

5 files changed

+66
-15
lines changed

CHANGES

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ twilio-python Changelog
33

44
Here you can see the full list of changes between each twilio-python release.
55

6+
Version 3.3.8
7+
-----------
8+
9+
- Use next_page_uri when iterating over a list resource
10+
11+
612
Version 3.3.7
713
-----------
814

requirements.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
sphinx
2-
mock
2+
mock==0.8.0
33
httplib2
44
nose
55
pyjwt
66
simplejson
77
unittest2
8+
coverage
9+
nosexcover

tests/test_base_resource.py

Lines changed: 38 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,46 @@ 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(), {}
51+
52+
with self.assertRaises(StopIteration):
53+
self.r.iter().next()
54+
55+
def testRequest(self):
56+
self.r.request = Mock()
57+
self.r.request.return_value = Mock(), {self.r.key: [{'sid': 'foo'}]}
58+
self.r.iter().next()
59+
self.r.request.assert_called_with("GET", "https://api.twilio.com/2010-04-01/Resources", params={})
60+
61+
def testIterOneItem(self):
62+
self.r.request = Mock()
63+
self.r.request.return_value = Mock(), {self.r.key: [{'sid': 'foo'}]}
64+
65+
items = self.r.iter()
66+
items.next()
67+
68+
with self.assertRaises(StopIteration):
69+
items.next()
70+
71+
def testIterNoNextPage(self):
72+
self.r.request = Mock()
73+
self.r.request.return_value = Mock(), {self.r.key: []}
74+
75+
with self.assertRaises(StopIteration):
76+
self.r.iter().next()
77+
4878
def testKeyValue(self):
4979
self.r.key = "Hey"
5080
self.assertEquals(self.r.key, "Hey")
81+
82+
def testInstanceLoading(self):
83+
instance = self.r.load_instance({"sid": "foo"})
84+
85+
self.assertIsInstance(instance, InstanceResource)
86+
self.assertEquals(instance.sid, "foo")
87+
5188

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

twilio/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version_info__ = ('3', '3', '7')
1+
__version_info__ = ('3', '3', '8')
22
__version__ = '.'.join(__version_info__)
33

44

twilio/rest/resources.py

Lines changed: 18 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,24 @@ 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+
params = transform_params(kwargs)
361+
362+
while True:
363+
resp, page = self.request("GET", self.uri, params=params)
364+
365+
if self.key not in page:
366+
raise StopIteration()
367+
368+
for ir in page[self.key]:
369+
yield self.load_instance(ir)
370+
371+
if not page.get('next_page_uri', ''):
372+
raise StopIteration()
373+
374+
o = urlparse(page['next_page_uri'])
375+
params.update(parse_qs(o.query))
376+
371377

372378
def load_instance(self, data):
373379
instance = self.instance(self, data[self.instance.id_key])

0 commit comments

Comments
 (0)
0