Source code for testoot.serializers
import json
import pickle
from io import IOBase
from typing import Optional
from testoot.base import TestootSerializer, FileType
from testoot.exceptions import UnserializableTypeError
[docs]class BinarySerializer(TestootSerializer):
"""Serializer for binary data."""
[docs] def __init__(self, file_type_hint: Optional[FileType] = None):
super().__init__(file_type_hint=file_type_hint if file_type_hint else
FileType(mime='application/octet-stream',
override_file_ext='.bin'))
[docs] def load(self, stream: IOBase) -> any:
return stream.read()
[docs] def dump(self, obj: any, stream: IOBase):
if not isinstance(obj, bytes):
raise UnserializableTypeError('Only bytes type is supported '
'in BinarySerializer!')
return stream.write(obj)
[docs]class JsonSerializer(TestootSerializer):
"""Serializer for only json data."""
[docs] def __init__(self, file_type_hint: Optional[FileType] = None):
super().__init__(mode='t',
file_type_hint=file_type_hint if file_type_hint else
FileType(mime='application/json'))
[docs] def load(self, stream: IOBase) -> any:
return json.load(stream)
[docs] def dump(self, obj: any, stream: IOBase):
json.dump(obj, stream, indent=2, ensure_ascii=False)
[docs]class StringSerializer(TestootSerializer):
"""Serializer only for string type (utf-8)."""
[docs] def __init__(self, file_type_hint: Optional[FileType] = None):
super().__init__(file_type_hint=file_type_hint if file_type_hint else
FileType(mime='text/plain', override_file_ext='.txt'))
[docs] def load(self, stream: IOBase) -> any:
return stream.read().decode('utf-8')
[docs] def dump(self, obj: any, stream: IOBase):
if not isinstance(obj, str):
raise UnserializableTypeError('Only str type is supported '
'in StringSerializer!')
return stream.write(obj.encode('utf-8'))
[docs]class PickleSerializer(TestootSerializer):
"""Binary serializer for almost all Python objects."""
PICKLE_PROTOCOL_VERSION = 4
[docs] def __init__(self, file_type_hint: Optional[FileType] = None):
super().__init__(file_type_hint=file_type_hint if file_type_hint else
FileType(mime='application/octet-stream',
override_file_ext='.bin'))
[docs] def load(self, stream: IOBase) -> any:
return pickle.load(stream)
[docs] def dump(self, obj: any, stream: IOBase):
return pickle.dump(obj, stream, protocol=self.PICKLE_PROTOCOL_VERSION)