Source code for torequests._py3_patch

# here for python3 patch avoid of python2 SyntaxError
import asyncio
import json
from typing import Tuple, Type
from functools import wraps
# python3.7+ 's asyncio.all_tasks'
try:
    _py36_all_task_patch = asyncio.all_tasks
except (ImportError, AttributeError):
    _py36_all_task_patch = asyncio.Task.all_tasks


def _new_future_await(self):
    loop = asyncio.get_event_loop()
    future = loop.run_in_executor(None, self.result, self._timeout)
    for i in future:
        yield i
    return self.x


class NewResponse(object):
    """Wrap aiohttp's ClientResponse like requests's Response."""
    __slots__ = ('r', 'encoding', 'referer_info')

    def __init__(self, r, encoding=None, referer_info=None):
        self.r = r
        self.encoding = encoding or self.r.get_encoding()
        self.referer_info = referer_info

    def __getattr__(self, name):
        return getattr(self.r, name)

    @property
    def url(self):
        return str(self.r.url)

    @property
    def status_code(self):
        return self.r.status

    def __repr__(self):
        return "<NewResponse [%s]>" % (self.status_code)

    def __bool__(self):
        return self.ok

    def __iter__(self):
        """Allows you to use a response as an iterator."""
        return self.iter_content(128)

    @property
    def ok(self):
        return self.status_code in range(200, 400)

    @property
    def is_redirect(self):
        """True if this Response is a well-formed HTTP redirect that could have
        been processed automatically (by :meth:`Session.resolve_redirects`).
        """
        return "location" in self.headers and self.status_code in range(
            300, 400)

    @property
    def content(self):
        return self._body

    @property
    def text(self):
        return self._body.decode(self.encoding)

    def json(self, encoding=None, loads=json.loads):
        return loads(self.content.decode(encoding or self.encoding))


[docs]def retry(tries=1, exceptions: Tuple[Type[BaseException]] = (Exception,), catch_exception=False): def wrapper(function): @wraps(function) def retry_sync(*args, **kwargs): for _ in range(tries): try: return function(*args, **kwargs) except exceptions as err: error = err if catch_exception: return error raise error @wraps(function) async def retry_async(*args, **kwargs): for _ in range(tries): try: return await function(*args, **kwargs) except exceptions as err: error = err if catch_exception: return error raise error if asyncio.iscoroutinefunction(function): return retry_async else: return retry_sync return wrapper