1
0
mirror of https://github.com/kevin1024/vcrpy.git synced 2025-12-09 01:03:24 +00:00

Adding json serializer

This commit is contained in:
shu zOMG chen
2013-08-18 21:43:14 -10:00
committed by Kevin McCarthy
parent 3e247a2efb
commit 51f0f1bacd
10 changed files with 134 additions and 55 deletions

View File

@@ -1,44 +1,21 @@
import tempfile
import os
import yaml
from .persisters.filesystem import FilesystemPersister
from .serializers.yamlserializer import YamlSerializer
from .serializers.jsonserializer import JSONSerializer
# Use the libYAML versions if possible
try:
from yaml import CLoader as Loader, CDumper as Dumper
except ImportError:
from yaml import Loader, Dumper
def _get_serializer_cls(serializer):
serializer_cls = {
'yaml': YamlSerializer,
'json': JSONSerializer,
}.get(serializer)
if not serializer_cls:
raise ImportError('Invalid serializer %s' % serializer)
return serializer_cls
def _serialize_cassette(requests, responses):
'''Return a serializable version of the cassette'''
return ([{
'request': request,
'response': response,
} for request, response in zip(requests, responses)])
def _deserialize_cassette(data):
requests = [r['request'] for r in data]
responses = [r['response'] for r in data]
return requests, responses
def _secure_write(path, contents):
"""
We'll overwrite the old version securely by writing out a temporary
version and then moving it to replace the old version
"""
dirname, filename = os.path.split(path)
fd, name = tempfile.mkstemp(dir=dirname, prefix=filename)
with os.fdopen(fd, 'w') as fout:
fout.write(contents)
os.rename(name, path)
def load_cassette(cassette_path):
data = yaml.load(open(cassette_path), Loader=Loader)
return _deserialize_cassette(data)
def save_cassette(cassette_path, requests, responses):
dirname, filename = os.path.split(cassette_path)
if dirname and not os.path.exists(dirname):
os.makedirs(dirname)
data = _serialize_cassette(requests, responses)
data = yaml.dump(data, Dumper=Dumper)
_secure_write(cassette_path, data)
def load_cassette(cassette_path, serializer):
serializer_cls = _get_serializer_cls(serializer)
return serializer_cls.load(cassette_path)
def save_cassette(cassette_path, requests, responses, serializer):
serializer_cls = _get_serializer_cls(serializer)
data = serializer_cls.dumps(requests, responses)
FilesystemPersister.write(cassette_path, data)