1
0
mirror of https://github.com/kevin1024/vcrpy.git synced 2025-12-09 01:03:24 +00:00
This commit is contained in:
Kevin McCarthy
2014-05-10 11:51:35 -10:00
parent 6d656717a1
commit 8eb54c012f
6 changed files with 30 additions and 13 deletions

View File

@@ -30,6 +30,7 @@ try:
except ImportError: except ImportError:
from yaml import Loader from yaml import Loader
def preprocess_yaml(cassette): def preprocess_yaml(cassette):
# this is the hack that makes the whole thing work. The old version used # this is the hack that makes the whole thing work. The old version used
# to deserialize to Request objects automatically using pyYaml's !!python # to deserialize to Request objects automatically using pyYaml's !!python
@@ -74,16 +75,21 @@ def _migrate(data):
for k in headers: for k in headers:
headers[k] = [headers[k]] headers[k] = [headers[k]]
response_headers = {} response_headers = {}
for k, v in get_httpmessage(b"".join(h.encode('utf-8') for h in res['headers'])).items(): for k, v in get_httpmessage(
b"".join(h.encode('utf-8') for h in res['headers'])
).items():
response_headers.setdefault(k, []) response_headers.setdefault(k, [])
response_headers[k].append(v) response_headers[k].append(v)
res['headers'] = response_headers res['headers'] = response_headers
interactions.append({'request':req, 'response': res}) interactions.append({'request': req, 'response': res})
return { return {
'requests': [request.Request._from_dict(i['request']) for i in interactions], 'requests': [
'responses': [i['response'] for i in interactions], request.Request._from_dict(i['request']) for i in interactions
],
'responses': [i['response'] for i in interactions],
} }
def migrate_json(in_fp, out_fp): def migrate_json(in_fp, out_fp):
data = json.load(in_fp) data = json.load(in_fp)
if _already_migrated(data): if _already_migrated(data):
@@ -96,9 +102,10 @@ def migrate_json(in_fp, out_fp):
def _list_of_tuples_to_dict(fs): def _list_of_tuples_to_dict(fs):
return dict((k, v) for k, v in fs[0]) return dict((k, v) for k, v in fs[0])
def _already_migrated(data): def _already_migrated(data):
try: try:
if data.get('version')==1: if data.get('version') == 1:
return True return True
except AttributeError: except AttributeError:
return False return False
@@ -109,7 +116,9 @@ def migrate_yml(in_fp, out_fp):
if _already_migrated(data): if _already_migrated(data):
return False return False
for i in range(len(data)): for i in range(len(data)):
data[i]['request']['headers'] = _list_of_tuples_to_dict(data[i]['request']['headers']) data[i]['request']['headers'] = _list_of_tuples_to_dict(
data[i]['request']['headers']
)
interactions = _migrate(data) interactions = _migrate(data)
out_fp.write(serialize(interactions, yamlserializer)) out_fp.write(serialize(interactions, yamlserializer))
return True return True

View File

@@ -2,7 +2,6 @@ from .persisters.filesystem import FilesystemPersister
from .serialize import serialize, deserialize from .serialize import serialize, deserialize
def load_cassette(cassette_path, serializer): def load_cassette(cassette_path, serializer):
with open(cassette_path) as f: with open(cassette_path) as f:
cassette_content = f.read() cassette_content = f.read()

View File

@@ -2,8 +2,9 @@ from vcr.serializers import compat
from vcr.request import Request from vcr.request import Request
import yaml import yaml
#version 1 cassettes started with VCR 1.0.x. Before 1.0.x, there was no versioning. # version 1 cassettes started with VCR 1.0.x.
CASSETTE_FORMAT_VERSION = 1 # Before 1.0.x, there was no versioning.
CASSETTE_FORMAT_VERSION = 1
""" """
Just a general note on the serialization philosophy here: Just a general note on the serialization philosophy here:
@@ -17,9 +18,11 @@ Serializing: bytestring -> string (yaml persists to utf-8)
Deserializing: string (yaml converts from utf-8) -> bytestring Deserializing: string (yaml converts from utf-8) -> bytestring
""" """
def _looks_like_an_old_cassette(data): def _looks_like_an_old_cassette(data):
return isinstance(data, list) and len(data) and 'request' in data[0] return isinstance(data, list) and len(data) and 'request' in data[0]
def _warn_about_old_cassette_format(): def _warn_about_old_cassette_format():
raise ValueError( raise ValueError(
"Your cassette files were generated in an older version " "Your cassette files were generated in an older version "
@@ -27,6 +30,7 @@ def _warn_about_old_cassette_format():
"See http://git.io/mHhLBg for more details." "See http://git.io/mHhLBg for more details."
) )
def deserialize(cassette_string, serializer): def deserialize(cassette_string, serializer):
try: try:
data = serializer.deserialize(cassette_string) data = serializer.deserialize(cassette_string)
@@ -38,7 +42,9 @@ def deserialize(cassette_string, serializer):
_warn_about_old_cassette_format() _warn_about_old_cassette_format()
requests = [Request._from_dict(r['request']) for r in data['interactions']] requests = [Request._from_dict(r['request']) for r in data['interactions']]
responses = [compat.convert_to_bytes(r['response']) for r in data['interactions']] responses = [
compat.convert_to_bytes(r['response']) for r in data['interactions']
]
return requests, responses return requests, responses

View File

@@ -15,6 +15,6 @@ def serialize(cassette_dict):
raise UnicodeDecodeError( raise UnicodeDecodeError(
"Error serializing cassette to JSON. ", "Error serializing cassette to JSON. ",
"Does this HTTP interaction contain binary data? ", "Does this HTTP interaction contain binary data? ",
"If so, use a different serializer (like the yaml serializer) for ", "If so, use a different serializer (like the yaml serializer) ",
"this request" "for this request"
) )

View File

@@ -6,6 +6,7 @@ try:
except ImportError: except ImportError:
from yaml import Loader, Dumper from yaml import Loader, Dumper
def deserialize(cassette_string): def deserialize(cassette_string):
return yaml.load(cassette_string, Loader=Loader) return yaml.load(cassette_string, Loader=Loader)

View File

@@ -50,9 +50,11 @@ def parse_headers(header_list):
header_string = b"" header_string = b""
for key, values in header_list.items(): for key, values in header_list.items():
for v in values: for v in values:
header_string += key.encode('utf-8') + b":" + v.encode('utf-8') + b"\r\n" header_string += \
key.encode('utf-8') + b":" + v.encode('utf-8') + b"\r\n"
return compat.get_httpmessage(header_string) return compat.get_httpmessage(header_string)
def serialize_headers(response): def serialize_headers(response):
out = {} out = {}
for key, values in compat.get_headers(response): for key, values in compat.get_headers(response):