You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2011/11/01 22:56:11 UTC

svn commit: r1196310 - in /libcloud/trunk: libcloud/utils.py test/test_utils.py

Author: tomaz
Date: Tue Nov  1 21:56:10 2011
New Revision: 1196310

URL: http://svn.apache.org/viewvc?rev=1196310&view=rev
Log:
Add exhaust_iterator function and tests for it.

Modified:
    libcloud/trunk/libcloud/utils.py
    libcloud/trunk/test/test_utils.py

Modified: libcloud/trunk/libcloud/utils.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/utils.py?rev=1196310&r1=1196309&r2=1196310&view=diff
==============================================================================
--- libcloud/trunk/libcloud/utils.py (original)
+++ libcloud/trunk/libcloud/utils.py Tue Nov  1 21:56:10 2011
@@ -70,6 +70,34 @@ def read_in_chunks(iterator, chunk_size=
             yield data
             data = ''
 
+def exhaust_iterator(iterator):
+    """
+    Exhaust an iterator and return all data returned by it.
+
+    @type iterator: C{Iterator}
+    @param response: An object which implements an iterator interface
+                     or a File like object with read method.
+
+    @rtype C{str}
+    @return Data returned by the iterator.
+    """
+    data = ''
+
+    try:
+        chunk = str(iterator.next())
+    except StopIteration:
+        chunk = ''
+
+    while len(chunk) > 0:
+        data += chunk
+
+        try:
+            chunk = str(iterator.next())
+        except StopIteration:
+            chunk = ''
+
+    return data
+
 def guess_file_mime_type(file_path):
     filename = os.path.basename(file_path)
     (mimetype, encoding) = mimetypes.guess_type(filename)

Modified: libcloud/trunk/test/test_utils.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/test/test_utils.py?rev=1196310&r1=1196309&r2=1196310&view=diff
==============================================================================
--- libcloud/trunk/test/test_utils.py (original)
+++ libcloud/trunk/test/test_utils.py Tue Nov  1 21:56:10 2011
@@ -18,6 +18,7 @@ import sys
 import unittest
 import warnings
 import os.path
+from StringIO import StringIO
 
 # In Python > 2.7 DeprecationWarnings are disabled by default
 warnings.simplefilter('default')
@@ -129,5 +130,31 @@ class TestUtils(unittest.TestCase):
 
             self.assertEqual(index, 548)
 
+    def test_exhaust_iterator(self):
+        def iterator_func():
+            for x in range(0, 1000):
+                yield 'aa'
+
+        data = 'aa' * 1000
+        iterator = libcloud.utils.read_in_chunks(iterator=iterator_func())
+        result = libcloud.utils.exhaust_iterator(iterator=iterator)
+        self.assertEqual(result, data)
+
+        result = libcloud.utils.exhaust_iterator(iterator=iterator_func())
+        self.assertEqual(result, data)
+
+
+        data = '12345678990'
+        iterator = StringIO(data)
+        result = libcloud.utils.exhaust_iterator(iterator=iterator)
+        self.assertEqual(result, data)
+
+    def test_exhaust_iterator_empty_iterator(self):
+        data = ''
+        iterator = StringIO(data)
+        result = libcloud.utils.exhaust_iterator(iterator=iterator)
+        self.assertEqual(result, data)
+
+
 if __name__ == '__main__':
     sys.exit(unittest.main())