From f7c051cde68380dac5e455046b775cc0594e9eff Mon Sep 17 00:00:00 2001 From: Luiz Menezes Date: Tue, 18 Sep 2018 13:59:40 -0300 Subject: [PATCH] Drop support to asyncio.coroutine (py34 async/await syntax) --- tests/integration/aiohttp_utils.py | 23 ++++++++++++++++------- tests/integration/test_aiohttp.py | 29 ++++++++++++++++++++--------- vcr/_handle_coroutine.py | 8 ++------ vcr/stubs/aiohttp_stubs/__init__.py | 13 ++++--------- 4 files changed, 42 insertions(+), 31 deletions(-) diff --git a/tests/integration/aiohttp_utils.py b/tests/integration/aiohttp_utils.py index b0b2dd6..6f6f15e 100644 --- a/tests/integration/aiohttp_utils.py +++ b/tests/integration/aiohttp_utils.py @@ -2,23 +2,32 @@ import asyncio import aiohttp +from aiohttp.test_utils import TestClient -@asyncio.coroutine -def aiohttp_request(loop, method, url, output='text', encoding='utf-8', content_type=None, **kwargs): +async def aiohttp_request(loop, method, url, output='text', encoding='utf-8', content_type=None, **kwargs): session = aiohttp.ClientSession(loop=loop) response_ctx = session.request(method, url, **kwargs) - response = yield from response_ctx.__aenter__() + response = await response_ctx.__aenter__() if output == 'text': - content = yield from response.text() + content = await response.text() elif output == 'json': content_type = content_type or 'application/json' - content = yield from response.json(encoding=encoding, content_type=content_type) + content = await response.json(encoding=encoding, content_type=content_type) elif output == 'raw': - content = yield from response.read() + content = await response.read() response_ctx._resp.close() - yield from session.close() + await session.close() return response, content + + +def aiohttp_app(): + async def hello(request): + return aiohttp.web.Response(text='hello') + + app = aiohttp.web.Application() + app.router.add_get('/', hello) + return app diff --git a/tests/integration/test_aiohttp.py b/tests/integration/test_aiohttp.py index 4951e69..74aaccc 100644 --- a/tests/integration/test_aiohttp.py +++ b/tests/integration/test_aiohttp.py @@ -5,7 +5,7 @@ asyncio = pytest.importorskip("asyncio") aiohttp = pytest.importorskip("aiohttp") import vcr # noqa: E402 -from .aiohttp_utils import aiohttp_request # noqa: E402 +from .aiohttp_utils import aiohttp_app, aiohttp_request # noqa: E402 def run_in_loop(fn): @@ -156,13 +156,24 @@ def test_params_on_url(tmpdir, scheme): assert cassette.play_count == 1 -async def test_aiohttp_client_does_not_break_with_patching_request(aiohttp_client, tmpdir): - async def hello(request): - return aiohttp.web.Response(text='Hello, world') - - app = aiohttp.web.Application() - app.router.add_get('/', hello) - client = await aiohttp_client(app) +def test_aiohttp_test_client(aiohttp_client, tmpdir): + loop = asyncio.get_event_loop() + app = aiohttp_app() + url = '/' + client = loop.run_until_complete(aiohttp_client(app)) with vcr.use_cassette(str(tmpdir.join('get.yaml'))): - await client.get('/') + response = loop.run_until_complete(client.get(url)) + + assert response.status == 200 + response_text = loop.run_until_complete(response.text()) + assert response_text == 'hello' + + with vcr.use_cassette(str(tmpdir.join('get.yaml'))) as cassette: + response = loop.run_until_complete(client.get(url)) + + request = cassette.requests[0] + assert request.url == str(client.make_url(url)) + response_text = loop.run_until_complete(response.text()) + assert response_text == 'hello' + assert cassette.play_count == 1 diff --git a/vcr/_handle_coroutine.py b/vcr/_handle_coroutine.py index 0b20be6..610305f 100644 --- a/vcr/_handle_coroutine.py +++ b/vcr/_handle_coroutine.py @@ -1,7 +1,3 @@ -import asyncio - - -@asyncio.coroutine -def handle_coroutine(vcr, fn): +async def handle_coroutine(vcr, fn): # noqa: E999 with vcr as cassette: - return (yield from fn(cassette)) # noqa: E999 + return (await fn(cassette)) # noqa: E999 diff --git a/vcr/stubs/aiohttp_stubs/__init__.py b/vcr/stubs/aiohttp_stubs/__init__.py index 78bb658..38f337e 100644 --- a/vcr/stubs/aiohttp_stubs/__init__.py +++ b/vcr/stubs/aiohttp_stubs/__init__.py @@ -25,21 +25,16 @@ class MockClientResponse(ClientResponse): session=None, ) - # TODO: get encoding from header - @asyncio.coroutine - def json(self, *, encoding='utf-8', loads=json.loads, **kwargs): # NOQA: E999 + async def json(self, *, encoding='utf-8', loads=json.loads, **kwargs): # NOQA: E999 return loads(self._body.decode(encoding)) - @asyncio.coroutine - def text(self, encoding='utf-8'): + async def text(self, encoding='utf-8'): return self._body.decode(encoding) - @asyncio.coroutine - def read(self): + async def read(self): return self._body - @asyncio.coroutine - def release(self): + async def release(self): pass