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

change serializer API so it doesn't have to do file stuff

This commit is contained in:
Kevin McCarthy
2013-08-22 18:26:40 -10:00
parent 6005420409
commit 65254b4969
5 changed files with 20 additions and 17 deletions

View File

@@ -114,8 +114,8 @@ The Request object has the following properties
Don't like JSON or YAML? That's OK, VCR.py can serialize to any format Don't like JSON or YAML? That's OK, VCR.py can serialize to any format
you would like. Create your own module or class instance with 2 methods: you would like. Create your own module or class instance with 2 methods:
* `def load(cassette_path)` * `def deserialize(cassette_string)`
* `def dumps(requests, responses)` * `def serialize(cassette_dict)`
Finally, register your class with VCR to use your Finally, register your class with VCR to use your
new serializer. new serializer.
@@ -125,11 +125,11 @@ import vcr
BogoSerializer(object): BogoSerializer(object):
""" """
Must implement load() and dumps() methods Must implement serialize() and deserialize() methods
""" """
pass pass
my_vcr = VCR() my_vcr = vcr.VCR()
my_vcr.register_serializer('bogo', BogoSerializer()) my_vcr.register_serializer('bogo', BogoSerializer())
with my_vcr.use_cassette('test.bogo', serializer='bogo'): with my_vcr.use_cassette('test.bogo', serializer='bogo'):

View File

@@ -53,7 +53,10 @@ class Cassette(object):
return self.data[request] return self.data[request]
def _save(self): def _save(self):
save_cassette(self._path, self.requests, self.responses, serializer=self._serializer) save_cassette(self._path, self._as_dict(), serializer=self._serializer)
def _as_dict(self):
return {"requests": self.requests, "responses": self.responses}
def _load(self): def _load(self):
try: try:

View File

@@ -1,8 +1,9 @@
from .persisters.filesystem import FilesystemPersister from .persisters.filesystem import FilesystemPersister
def load_cassette(cassette_path, serializer): def load_cassette(cassette_path, serializer):
return serializer.load(cassette_path) with open(cassette_path) as f:
return serializer.deserialize(f.read())
def save_cassette(cassette_path, requests, responses, serializer): def save_cassette(cassette_path, cassette_dict, serializer):
data = serializer.dumps(requests, responses) data = serializer.serialize(cassette_dict)
FilesystemPersister.write(cassette_path, data) FilesystemPersister.write(cassette_path, data)

View File

@@ -13,16 +13,15 @@ def _fix_response_unicode(d):
d['body']['string'] = d['body']['string'].encode('utf-8') d['body']['string'] = d['body']['string'].encode('utf-8')
return d return d
def load(cassette_path): def deserialize(cassette_string):
with open(cassette_path) as fh: data = json.loads(cassette_string)
data = json.load(fh)
requests = [Request._from_dict(r['request']) for r in data] requests = [Request._from_dict(r['request']) for r in data]
responses = [_fix_response_unicode(r['response']) for r in data] responses = [_fix_response_unicode(r['response']) for r in data]
return requests, responses return requests, responses
def dumps(requests, responses): def serialize(cassette_dict):
data = ([{ data = ([{
'request': request._to_dict(), 'request': request._to_dict(),
'response': response, 'response': response,
} for request, response in zip(requests, responses)]) } for request, response in zip(cassette_dict['requests'], cassette_dict['responses'])])
return json.dumps(data, indent=4, default=_json_default) return json.dumps(data, indent=4, default=_json_default)

View File

@@ -7,16 +7,16 @@ except ImportError:
from yaml import Loader, Dumper from yaml import Loader, Dumper
def load(cassette_path): def deserialize(cassette_string):
data = yaml.load(open(cassette_path), Loader=Loader) data = yaml.load(cassette_string, Loader=Loader)
requests = [r['request'] for r in data] requests = [r['request'] for r in data]
responses = [r['response'] for r in data] responses = [r['response'] for r in data]
return requests, responses return requests, responses
def dumps(requests, responses): def serialize(cassette_dict):
data = ([{ data = ([{
'request': request, 'request': request,
'response': response, 'response': response,
} for request, response in zip(requests, responses)]) } for request, response in zip(cassette_dict['requests'], cassette_dict['responses'])])
return yaml.dump(data, Dumper=Dumper) return yaml.dump(data, Dumper=Dumper)