Source code for parfive.results
from collections import UserList, namedtuple
import aiohttp
from .utils import FailedDownload
__all__ = ['Results']
[docs]class Results(UserList):
"""
The results of a download from `parfive.Downloader.download`.
This object contains the filenames of successful downloads as well
as a list of any errors encountered in the `~parfive.Results.errors`
property.
"""
def __init__(self, *args, errors=None):
super().__init__(*args)
self._errors = errors or list()
self._error = namedtuple("error", ("filepath_partial", "url", "exception"))
def _get_nice_resp_repr(self, response):
# This is a modified version of aiohttp.ClientResponse.__repr__
if isinstance(response, aiohttp.ClientResponse):
ascii_encodable_url = str(response.url)
if response.reason:
ascii_encodable_reason = response.reason.encode('ascii',
'backslashreplace').decode('ascii')
else:
ascii_encodable_reason = response.reason
return '<ClientResponse({}) [{} {}]>'.format(
ascii_encodable_url, response.status, ascii_encodable_reason)
else:
return repr(response)
def __str__(self):
out = super().__repr__()
if self.errors:
out += '\nErrors:\n'
for error in self.errors:
if isinstance(error, FailedDownload):
resp = self._get_nice_resp_repr(error.exception)
out += f"(url={error.url}, response={resp})\n"
else:
out += "({})".format(repr(error))
return out
def __repr__(self):
out = object.__repr__(self)
out += '\n'
out += str(self)
return out
[docs] def add_error(self, filename, url, exception):
"""
Add an error to the results.
"""
if isinstance(exception, aiohttp.ClientResponse):
exception._headers = None
self._errors.append(self._error(filename, url, exception))
@property
def errors(self):
"""
A list of errors encountered during the download.
The errors are represented as a tuple containing
``(filepath, url, exception)`` where ``filepath`` is a function for
generating a filepath, ``url`` is the url to be downloaded and
``exception`` is the error raised during download.
"""
return self._errors