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