mirror of
https://github.com/kevin1024/vcrpy.git
synced 2025-12-10 17:45:35 +00:00
Merge branch 'master' of github.com:kevin1024/vcrpy into patch-1
This commit is contained in:
26
.travis.yml
26
.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"
|
||||
|
||||
@@ -51,7 +51,6 @@ VCR.py works great with the following HTTP clients:
|
||||
- urllib3
|
||||
- tornado
|
||||
- urllib2
|
||||
- boto
|
||||
- boto3
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
22
tox.ini
22
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]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user