Source code for parfive.results

from collections import UserList, namedtuple

import aiohttp

from .utils import FailedDownload

__all__ = ["Results"]


class Error(namedtuple("error", ("filepath_partial", "url", "exception"))):
    def __str__(self):
        filepath_partial = ""
        if isinstance(self.filepath_partial, str):
            filepath_partial = f"{self.filepath_partial},\n"
        return filepath_partial + f"{self.url},\n{self.exception}"

    def __repr__(self):
        return f"{object.__repr__(self)}\n{self}"


[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() 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 f"<ClientResponse({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 += f"({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(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