diff --git a/.travis.yml b/.travis.yml index da6f9e8..0e43270 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,29 +7,14 @@ env: - secure: LBSEg/gMj4u4Hrpo3zs6Y/1mTpd2RtcN49mZIFgTdbJ9IhpiNPqcEt647Lz94F9Eses2x2WbNuKqZKZZReY7QLbEzU1m0nN5jlaKrjcG5NR5clNABfFFyhgc0jBikyS4abAG8jc2efeaTrFuQwdoF4sE8YiVrkiVj2X5Xoi6sBk= matrix: - TOX_SUFFIX="flakes" - - TOX_SUFFIX="requests22" - - TOX_SUFFIX="requests23" - - TOX_SUFFIX="requests24" - - TOX_SUFFIX="requests25" - - TOX_SUFFIX="requests26" - TOX_SUFFIX="requests27" - - TOX_SUFFIX="requests211" - - TOX_SUFFIX="requests213" - - TOX_SUFFIX="requests216" - - TOX_SUFFIX="requests218" - - TOX_SUFFIX="requests1" - TOX_SUFFIX="httplib2" - - TOX_SUFFIX="boto" - TOX_SUFFIX="boto3" - - TOX_SUFFIX="urllib319" - - TOX_SUFFIX="urllib3110" - TOX_SUFFIX="urllib3121" - - TOX_SUFFIX="tornado3" - TOX_SUFFIX="tornado4" - TOX_SUFFIX="aiohttp" matrix: allow_failures: - - env: TOX_SUFFIX="boto" - env: TOX_SUFFIX="boto3" exclude: # Only run flakes on a single Python 2.x and a single 3.x @@ -41,17 +26,6 @@ matrix: python: pypy - env: TOX_SUFFIX="flakes" python: "pypy3.5-5.9.0" - - env: TOX_SUFFIX="boto" - python: 3.6 - # Requests 1.x only supports Python <= 3.3 - - env: TOX_SUFFIX="requests1" - python: 3.4 - - env: TOX_SUFFIX="requests1" - python: 3.5 - - env: TOX_SUFFIX="requests1" - python: 3.6 - - env: TOX_SUFFIX="requests1" - python: "pypy3.5-5.9.0" - env: TOX_SUFFIX="aiohttp" python: 2.7 - env: TOX_SUFFIX="aiohttp" diff --git a/README.rst b/README.rst index 5aebd90..8c45df3 100644 --- a/README.rst +++ b/README.rst @@ -51,7 +51,6 @@ VCR.py works great with the following HTTP clients: - urllib3 - tornado - urllib2 -- boto - boto3 diff --git a/tests/integration/aiohttp_utils.py b/tests/integration/aiohttp_utils.py index 5b77fae..991877b 100644 --- a/tests/integration/aiohttp_utils.py +++ b/tests/integration/aiohttp_utils.py @@ -3,11 +3,13 @@ import aiohttp @asyncio.coroutine -def aiohttp_request(loop, method, url, as_text, **kwargs): +def aiohttp_request(loop, method, url, output='text', **kwargs): with aiohttp.ClientSession(loop=loop) as session: response = yield from session.request(method, url, **kwargs) # NOQA: E999 - if as_text: + if output == 'text': content = yield from response.text() # NOQA: E999 - else: + elif output == 'json': content = yield from response.json() # NOQA: E999 + elif output == 'raw': + content = yield from response.read() # NOQA: E999 return response, content diff --git a/tests/integration/test_aiohttp.py b/tests/integration/test_aiohttp.py index 280be3a..bccd4e6 100644 --- a/tests/integration/test_aiohttp.py +++ b/tests/integration/test_aiohttp.py @@ -22,19 +22,19 @@ def run_in_loop(fn): return loop.run_until_complete(task) -def request(method, url, as_text=True, **kwargs): +def request(method, url, output='text', **kwargs): def run(loop): - return aiohttp_request(loop, method, url, as_text, **kwargs) + return aiohttp_request(loop, method, url, output=output, **kwargs) return run_in_loop(run) -def get(url, as_text=True, **kwargs): - return request('GET', url, as_text, **kwargs) +def get(url, output='text', **kwargs): + return request('GET', url, output=output, **kwargs) -def post(url, as_text=True, **kwargs): - return request('POST', url, as_text, **kwargs) +def post(url, output='text', **kwargs): + return request('POST', url, output='text', **kwargs) @pytest.fixture(params=["https", "http"]) @@ -79,14 +79,25 @@ def test_text(tmpdir, scheme): def test_json(tmpdir, scheme): url = scheme + '://httpbin.org/get' with vcr.use_cassette(str(tmpdir.join('json.yaml'))): - _, response_json = get(url, as_text=False) + _, response_json = get(url, output='json') with vcr.use_cassette(str(tmpdir.join('json.yaml'))) as cassette: - _, cassette_response_json = get(url, as_text=False) + _, cassette_response_json = get(url, output='json') assert cassette_response_json == response_json assert cassette.play_count == 1 +def test_binary(tmpdir, scheme): + url = scheme + '://httpbin.org/image/png' + with vcr.use_cassette(str(tmpdir.join('binary.yaml'))): + _, response_binary = get(url, output='raw') + + with vcr.use_cassette(str(tmpdir.join('binary.yaml'))) as cassette: + _, cassette_response_binary = get(url, output='raw') + assert cassette_response_binary == response_binary + assert cassette.play_count == 1 + + def test_post(tmpdir, scheme): data = {'key1': 'value1', 'key2': 'value2'} url = scheme + '://httpbin.org/post' @@ -103,10 +114,10 @@ def test_params(tmpdir, scheme): url = scheme + '://httpbin.org/get' params = {'a': 1, 'b': False, 'c': 'c'} with vcr.use_cassette(str(tmpdir.join('get.yaml'))) as cassette: - _, response_json = get(url, as_text=False, params=params) + _, response_json = get(url, output='json', params=params) with vcr.use_cassette(str(tmpdir.join('get.yaml'))) as cassette: - _, cassette_response_json = get(url, as_text=False, params=params) + _, cassette_response_json = get(url, output='json', params=params) assert cassette_response_json == response_json assert cassette.play_count == 1 @@ -115,15 +126,15 @@ def test_params_same_url_distinct_params(tmpdir, scheme): url = scheme + '://httpbin.org/get' params = {'a': 1, 'b': False, 'c': 'c'} with vcr.use_cassette(str(tmpdir.join('get.yaml'))) as cassette: - _, response_json = get(url, as_text=False, params=params) + _, response_json = get(url, output='json', params=params) with vcr.use_cassette(str(tmpdir.join('get.yaml'))) as cassette: - _, cassette_response_json = get(url, as_text=False, params=params) + _, cassette_response_json = get(url, output='json', params=params) assert cassette_response_json == response_json assert cassette.play_count == 1 other_params = {'other': 'params'} with vcr.use_cassette(str(tmpdir.join('get.yaml'))) as cassette: - response, cassette_response_text = get(url, as_text=True, params=other_params) + response, cassette_response_text = get(url, output='text', params=other_params) assert 'No match for the request' in cassette_response_text assert response.status == 599 diff --git a/tox.ini b/tox.ini index 51e3aae..44f803d 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = {py27,py35,py36,pypy}-{flakes,requests218,requests216,requests213,requests211,requests27,requests26,requests25,requests24,requests23,requests22,requests1,httplib2,urllib319,urllib3110,urllib3121,tornado3,tornado4,boto,boto3,aiohttp} +envlist = {py27,py35,py36,pypy}-{flakes,requests27,httplib2,urllib3121,tornado4,boto3,aiohttp} [testenv:flakes] skipsdist = True @@ -13,35 +13,19 @@ deps = flake8 commands = ./runtests.sh {posargs} deps = - Flask + Flask<1 mock pytest pytest-httpbin PyYAML - requests1: requests==1.2.3 - requests218: requests==2.18.4 - requests216: requests==2.16.3 - requests213: requests==2.13.0 - requests211: requests==2.11.1 requests27: requests==2.7.0 - requests26: requests==2.6.0 - requests25: requests==2.5.0 - requests24: requests==2.4.0 - requests23: requests==2.3.0 - requests22: requests==2.2.1 httplib2: httplib2 - urllib319: urllib3==1.9.1 - urllib3110: urllib3==1.10.2 urllib3121: urllib3==1.21.1 - {py27,py35,py36,pypy}-tornado3: tornado>=3,<4 {py27,py35,py36,pypy}-tornado4: tornado>=4,<5 - {py27,py35,py36,pypy}-tornado3: pytest-tornado {py27,py35,py36,pypy}-tornado4: pytest-tornado - {py27,py35,py36}-tornado3: pycurl {py27,py35,py36}-tornado4: pycurl - boto: boto boto3: boto3 - aiohttp: aiohttp + aiohttp: aiohttp<3 aiohttp: pytest-asyncio [flake8] diff --git a/vcr/cassette.py b/vcr/cassette.py index 4c95877..e22bbea 100644 --- a/vcr/cassette.py +++ b/vcr/cassette.py @@ -175,13 +175,13 @@ class Cassette(object): def use(cls, **kwargs): return CassetteContextDecorator.from_args(cls, **kwargs) - def __init__(self, path, serializer=yamlserializer, persister=FilesystemPersister, record_mode='once', + def __init__(self, path, serializer=None, persister=None, record_mode='once', match_on=(uri, method), before_record_request=None, before_record_response=None, custom_patches=(), inject=False): - self._persister = persister + self._persister = persister or FilesystemPersister self._path = path - self._serializer = serializer + self._serializer = serializer or yamlserializer self._match_on = match_on self._before_record_request = before_record_request or (lambda x: x) self._before_record_response = before_record_response or (lambda x: x) diff --git a/vcr/stubs/aiohttp_stubs/__init__.py b/vcr/stubs/aiohttp_stubs/__init__.py index 28cf8c7..79ce06c 100644 --- a/vcr/stubs/aiohttp_stubs/__init__.py +++ b/vcr/stubs/aiohttp_stubs/__init__.py @@ -21,6 +21,10 @@ class MockClientResponse(ClientResponse): def text(self, encoding='utf-8'): return self.content.decode(encoding) + @asyncio.coroutine + def read(self): + return self.content + @asyncio.coroutine def release(self): pass @@ -71,7 +75,7 @@ def vcr_request(cassette, real_request): 'message': response.reason, }, 'headers': dict(response.headers), - 'body': {'string': (yield from response.text())}, # NOQA: E999 + 'body': {'string': (yield from response.read())}, # NOQA: E999 'url': response.url, } cassette.append(vcr_request, vcr_response)