diff --git a/README.md b/README.md index 2259367..73f2ac1 100644 --- a/README.md +++ b/README.md @@ -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 you would like. Create your own module or class instance with 2 methods: - * `def load(cassette_path)` - * `def dumps(requests, responses)` + * `def deserialize(cassette_string)` + * `def serialize(cassette_dict)` Finally, register your class with VCR to use your new serializer. @@ -125,11 +125,11 @@ import vcr BogoSerializer(object): """ - Must implement load() and dumps() methods + Must implement serialize() and deserialize() methods """ pass -my_vcr = VCR() +my_vcr = vcr.VCR() my_vcr.register_serializer('bogo', BogoSerializer()) with my_vcr.use_cassette('test.bogo', serializer='bogo'): diff --git a/vcr/cassette.py b/vcr/cassette.py index e77c735..87c9ed3 100644 --- a/vcr/cassette.py +++ b/vcr/cassette.py @@ -53,7 +53,10 @@ class Cassette(object): return self.data[request] 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): try: diff --git a/vcr/persist.py b/vcr/persist.py index ed142ff..22e2b08 100644 --- a/vcr/persist.py +++ b/vcr/persist.py @@ -1,8 +1,9 @@ from .persisters.filesystem import FilesystemPersister 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): - data = serializer.dumps(requests, responses) +def save_cassette(cassette_path, cassette_dict, serializer): + data = serializer.serialize(cassette_dict) FilesystemPersister.write(cassette_path, data) diff --git a/vcr/serializers/jsonserializer.py b/vcr/serializers/jsonserializer.py index cc24e3e..4575064 100644 --- a/vcr/serializers/jsonserializer.py +++ b/vcr/serializers/jsonserializer.py @@ -13,16 +13,15 @@ def _fix_response_unicode(d): d['body']['string'] = d['body']['string'].encode('utf-8') return d -def load(cassette_path): - with open(cassette_path) as fh: - data = json.load(fh) +def deserialize(cassette_string): + data = json.loads(cassette_string) requests = [Request._from_dict(r['request']) for r in data] responses = [_fix_response_unicode(r['response']) for r in data] return requests, responses -def dumps(requests, responses): +def serialize(cassette_dict): data = ([{ 'request': request._to_dict(), '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) diff --git a/vcr/serializers/yamlserializer.py b/vcr/serializers/yamlserializer.py index de99ada..70ae550 100644 --- a/vcr/serializers/yamlserializer.py +++ b/vcr/serializers/yamlserializer.py @@ -7,16 +7,16 @@ except ImportError: from yaml import Loader, Dumper -def load(cassette_path): - data = yaml.load(open(cassette_path), Loader=Loader) +def deserialize(cassette_string): + data = yaml.load(cassette_string, Loader=Loader) requests = [r['request'] for r in data] responses = [r['response'] for r in data] return requests, responses -def dumps(requests, responses): +def serialize(cassette_dict): data = ([{ 'request': request, '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)