import cStringIO as StringIO
class ReadCallbackStream(object):
"""Wraps a string in a read-only file-like object, but also calls
callback(num_bytes_read) whenever read() is called on the stream. Used for
tracking upload progress. Idea taken from this StackOverflow answer:
http://stackoverflow.com/a/5928451/68707
"""
def __init__(self, data, callback):
self._len = len(data)
self._io = StringIO.StringIO(data)
self._callback = callback
def __len__(self):
return self._len
def read(self, *args):
chunk = self._io.read(*args)
if len(chunk) > 0:
self._callback(len(chunk))
return chunk