Skip to content

Commit

Permalink
Add AsyncHTMLSession
Browse files Browse the repository at this point in the history
  • Loading branch information
oldani committed Mar 5, 2018
1 parent e5a7be3 commit 23d81af
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 1 deletion.
1 change: 1 addition & 0 deletions Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ pytest = "*"
"e1839a8" = {path = ".", editable = true}
sphinx = "*"
mypy = "*"
pytest-asyncio = "*"


[scripts]
Expand Down
18 changes: 18 additions & 0 deletions requests_html.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import sys
import asyncio
from urllib.parse import urlparse, urlunparse
from concurrent.futures import ThreadPoolExecutor
from concurrent.futures._base import TimeoutError
from functools import partial
from typing import Set, Union, List, MutableMapping, Optional

import pyppeteer
Expand Down Expand Up @@ -599,3 +601,19 @@ def request(self, *args, **kwargs) -> HTMLResponse:
r = super(HTMLSession, self).request(*args, **kwargs)

return HTMLResponse._from_response(r)


class AsyncHTMLSession(requests.Session):
""" """

def __init__(self, *args, **kwargs):
""" Create loop and thread pool. """
self.loop = asyncio.get_event_loop()
self.thread_pool = ThreadPoolExecutor()

super().__init__(*args, **kwargs)

def request(self, *args, **kwargs):
""" Partial original request func and run it in a thread. """
func = partial(super().request, *args, **kwargs)
return self.loop.run_in_executor(self.thread_pool, func)
21 changes: 20 additions & 1 deletion tests/test_requests_html.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import os

import pytest
from requests_html import HTMLSession, HTML
from requests_html import HTMLSession, AsyncHTMLSession, HTML
from requests_file import FileAdapter

session = HTMLSession()
Expand All @@ -15,12 +15,31 @@ def get():
return session.get(url)


@pytest.fixture
def async_get(event_loop):
""" AsyncSession cannot be created global since it will create
a different loop from pytest-asyncio. """
async_session = AsyncHTMLSession()
async_session.mount('file://', FileAdapter())
path = os.path.sep.join((os.path.dirname(os.path.abspath(__file__)), 'python.html'))
url = 'file://{}'.format(path)

return async_session.get(url)


@pytest.mark.ok
def test_file_get():
r = get()
assert r.status_code == 200


@pytest.mark.ok
@pytest.mark.asyncio
async def test_async_file_get(async_get):
r = await async_get
assert r.status_code == 200


@pytest.mark.ok
def test_class_seperation():
r = get()
Expand Down

0 comments on commit 23d81af

Please sign in to comment.