Allow serializing of sets

This commit is contained in:
Kovid Goyal 2017-04-30 09:39:20 +05:30
parent ae38edc6ad
commit baf168e7b7
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -16,12 +16,14 @@ MSGPACK_MIME = 'application/x-msgpack'
def encoder(obj, for_json=False): def encoder(obj, for_json=False):
if isinstance(obj, datetime): if isinstance(obj, datetime):
return {'__datetime__': unicode(obj.isoformat())} return {'__datetime__': unicode(obj.isoformat())}
if isinstance(obj, (set, frozenset)):
return {'__serset__': tuple(obj)}
if obj.__class__.__name__ == 'Metadata': if obj.__class__.__name__ == 'Metadata':
from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.metadata.book.base import Metadata
if isinstance(obj, Metadata): if isinstance(obj, Metadata):
from calibre.ebooks.metadata.book.serialize import metadata_as_dict from calibre.ebooks.metadata.book.serialize import metadata_as_dict
obj = {'__metadata__': metadata_as_dict(obj, encode_cover_data=for_json)} return {'__metadata__': metadata_as_dict(obj, encode_cover_data=for_json)}
return obj raise TypeError('Cannot serialize objects of type {}'.format(type(obj)))
def msgpack_dumps(data): def msgpack_dumps(data):
@ -42,6 +44,9 @@ def decoder(obj, for_json=False):
dt = obj.get('__datetime__') dt = obj.get('__datetime__')
if dt is not None: if dt is not None:
return parse_iso8601(dt, assume_utc=True) return parse_iso8601(dt, assume_utc=True)
s = obj.get('__serset__')
if s is not None:
return set(s)
m = obj.get('__metadata__') m = obj.get('__metadata__')
if m is not None: if m is not None:
from calibre.ebooks.metadata.book.serialize import metadata_from_dict from calibre.ebooks.metadata.book.serialize import metadata_from_dict