Downloading image with --progress fails
Downloading image with --progress fails with "RequestIdProxy object is
not an iterator". This is because to display download progress
VerboseFileWrapper in progressbar requires object of IterableWithLength,
but after support of returning request-id [1] to caller it returns
RequestIdProxy object which is wrapped around IterableWithLength
and response.
To resolve this issue overridden next and __next__ methods in
RequestIdProxy so that it can act as iterator for python 2.x
and 3.x as well.
[1] 610177a779
Closes-Bug: #1670464
Change-Id: I188e67c2487b7e4178ea246f02154bbcbc35a2b1
This commit is contained in:
@@ -494,6 +494,13 @@ class RequestIdProxy(wrapt.ObjectProxy):
|
|||||||
def wrapped(self):
|
def wrapped(self):
|
||||||
return self._self_wrapped
|
return self._self_wrapped
|
||||||
|
|
||||||
|
# Overriden next method to act as iterator
|
||||||
|
def next(self):
|
||||||
|
return next(self._self_wrapped)
|
||||||
|
|
||||||
|
# In Python 3, __next__() has replaced next().
|
||||||
|
__next__ = next
|
||||||
|
|
||||||
|
|
||||||
class GeneratorProxy(wrapt.ObjectProxy):
|
class GeneratorProxy(wrapt.ObjectProxy):
|
||||||
def __init__(self, wrapped):
|
def __init__(self, wrapped):
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
import requests
|
||||||
import six
|
import six
|
||||||
import testtools
|
import testtools
|
||||||
|
|
||||||
@@ -27,12 +28,16 @@ class TestProgressBarWrapper(testtools.TestCase):
|
|||||||
|
|
||||||
def test_iter_iterator_display_progress_bar(self):
|
def test_iter_iterator_display_progress_bar(self):
|
||||||
size = 100
|
size = 100
|
||||||
|
# create fake response object to return request-id with iterator
|
||||||
|
resp = requests.Response()
|
||||||
|
resp.headers['x-openstack-request-id'] = 'req-1234'
|
||||||
iterator_with_len = utils.IterableWithLength(iter('X' * 100), size)
|
iterator_with_len = utils.IterableWithLength(iter('X' * 100), size)
|
||||||
|
requestid_proxy = utils.RequestIdProxy((iterator_with_len, resp))
|
||||||
saved_stdout = sys.stdout
|
saved_stdout = sys.stdout
|
||||||
try:
|
try:
|
||||||
sys.stdout = output = test_utils.FakeTTYStdout()
|
sys.stdout = output = test_utils.FakeTTYStdout()
|
||||||
# Consume iterator.
|
# Consume iterator.
|
||||||
data = list(progressbar.VerboseIteratorWrapper(iterator_with_len,
|
data = list(progressbar.VerboseIteratorWrapper(requestid_proxy,
|
||||||
size))
|
size))
|
||||||
self.assertEqual(['X'] * 100, data)
|
self.assertEqual(['X'] * 100, data)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
|
Reference in New Issue
Block a user