Source code for wishbone.protocol.decode.msgpack

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  msgpack.py
#
#  Copyright 2018 Jelle Smet <development@smetj.net>
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 3 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#
#


from wishbone.protocol import Decode
from msgpack import Unpacker
from msgpack.exceptions import BufferFull
from wishbone.error import ProtocolError


[docs]class MSGPack(Decode): '''**Decode MSGpack data into a Python data structure.** Convert a MSGPack bytestring into a Python data structure using the defined charset. Parameters: - charset(string)("utf-8") | The charset to use to decode the bytestring data. - buffer_size(int)(4096) | The max amount of bytes allowed to read for 1 event ''' def __init__(self, charset="utf-8", buffer_size=4096): self.charset = charset self.buffer_size = buffer_size self.unpacker = Unpacker(encoding=self.charset, max_buffer_size=buffer_size) self.handle_buffer_size = True def handleBytes(self, data): try: self.unpacker.feed(data) for value in self.unpacker: if value: yield value else: return yield except BufferFull: self.unpacker = Unpacker(encoding=self.charset, max_buffer_size=self.buffer_size) raise ProtocolError("Buffer of %s bytes full." % (self.buffer_size)) def handleReadLinesMethod(self, data): for item in data.readlines(): for result in self.handler(item): yield result def flush(self): result = next(self.unpacker) if result is None: return yield else: yield result self.unpacker = Unpacker(encoding=self.charset, max_buffer_size=self.buffer_size)