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

Let's do an instance/module-based API for serializers

This commit is contained in:
Kevin McCarthy
2013-08-22 17:39:52 -10:00
parent c5eca93edc
commit 6005420409
5 changed files with 34 additions and 42 deletions

View File

@@ -112,10 +112,10 @@ The Request object has the following properties
## Register your own serializer ## Register your own serializer
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 class that has 2 classmethods: you would like. Create your own module or class instance with 2 methods:
* `def load(cls, cassette_path)` * `def load(cassette_path)`
* `def dumps(cls, requests, responses)` * `def dumps(requests, responses)`
Finally, register your class with VCR to use your Finally, register your class with VCR to use your
new serializer. new serializer.
@@ -125,12 +125,12 @@ import vcr
BogoSerializer(object): BogoSerializer(object):
""" """
Must implement load() and dumps() classmethods Must implement load() and dumps() methods
""" """
pass pass
my_vcr = VCR() my_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'):
# your http here # your http here

View File

@@ -1,7 +1,5 @@
'''The container for recorded requests and responses''' '''The container for recorded requests and responses'''
import os
import tempfile
try: try:
from collections import Counter, OrderedDict from collections import Counter, OrderedDict
except ImportError: except ImportError:
@@ -11,7 +9,7 @@ except ImportError:
# Internal imports # Internal imports
from .patch import install, reset from .patch import install, reset
from .persist import load_cassette, save_cassette from .persist import load_cassette, save_cassette
from .serializers.yamlserializer import YamlSerializer from .serializers import yamlserializer
class Cassette(object): class Cassette(object):
'''A container for recorded requests and responses''' '''A container for recorded requests and responses'''
@@ -22,7 +20,7 @@ class Cassette(object):
new_cassette._load() new_cassette._load()
return new_cassette return new_cassette
def __init__(self, path, serializer=YamlSerializer): def __init__(self, path, serializer=yamlserializer):
self._path = path self._path = path
self._serializer = serializer self._serializer = serializer
self.data = OrderedDict() self.data = OrderedDict()

View File

@@ -1,15 +1,14 @@
import os import os
from .cassette import Cassette from .cassette import Cassette
from .serializers.yamlserializer import YamlSerializer from .serializers import yamlserializer, jsonserializer
from .serializers.jsonserializer import JSONSerializer
class VCR(object): class VCR(object):
def __init__(self, serializer='yaml', cassette_library_dir=None): def __init__(self, serializer='yaml', cassette_library_dir=None):
self.serializer = serializer self.serializer = serializer
self.cassette_library_dir = cassette_library_dir self.cassette_library_dir = cassette_library_dir
self.serializers = { self.serializers = {
'yaml': YamlSerializer, 'yaml': yamlserializer,
'json': JSONSerializer, 'json': jsonserializer,
} }
def _get_serializer(self, serializer_name): def _get_serializer(self, serializer_name):

View File

@@ -13,19 +13,16 @@ 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
class JSONSerializer(object): def load(cassette_path):
@classmethod with open(cassette_path) as fh:
def load(cls, cassette_path): data = json.load(fh)
with open(cassette_path) as fh: requests = [Request._from_dict(r['request']) for r in data]
data = json.load(fh) responses = [_fix_response_unicode(r['response']) for r in data]
requests = [Request._from_dict(r['request']) for r in data] return requests, responses
responses = [_fix_response_unicode(r['response']) for r in data]
return requests, responses
@classmethod def dumps(requests, responses):
def dumps(cls, requests, responses): 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(requests, responses)]) return json.dumps(data, indent=4, default=_json_default)
return json.dumps(data, indent=4, default=_json_default)

View File

@@ -7,18 +7,16 @@ except ImportError:
from yaml import Loader, Dumper from yaml import Loader, Dumper
class YamlSerializer(object): def load(cassette_path):
@classmethod data = yaml.load(open(cassette_path), Loader=Loader)
def load(cls, cassette_path): requests = [r['request'] for r in data]
data = yaml.load(open(cassette_path), Loader=Loader) responses = [r['response'] for r in data]
requests = [r['request'] for r in data] return requests, responses
responses = [r['response'] for r in data]
return requests, responses
@classmethod
def dumps(cls, requests, responses): def dumps(requests, responses):
data = ([{ data = ([{
'request': request, 'request': request,
'response': response, 'response': response,
} for request, response in zip(requests, responses)]) } for request, response in zip(requests, responses)])
return yaml.dump(data, Dumper=Dumper) return yaml.dump(data, Dumper=Dumper)