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:
10
README.md
10
README.md
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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)
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user