From 6ba9ea2737e216af88f604227d3ef2b232b76893 Mon Sep 17 00:00:00 2001 From: David Kerkeslager Date: Fri, 30 Sep 2016 12:30:41 -0400 Subject: [PATCH] Move tagged object into the same module as the tags --- serial/serial/binary.py | 85 ++++++++++++++----------------- serial/serial/{tag.py => tags.py} | 10 ++++ serial/test_binary.py | 60 +++++++++++----------- 3 files changed, 78 insertions(+), 77 deletions(-) rename serial/serial/{tag.py => tags.py} (61%) diff --git a/serial/serial/binary.py b/serial/serial/binary.py index 55fe8c3..960acef 100644 --- a/serial/serial/binary.py +++ b/serial/serial/binary.py @@ -1,17 +1,8 @@ -import collections import functools import io import struct -from . import tag - -TaggedObject = collections.namedtuple( - 'TaggedObject', - [ - 'tag', - 'instance', - ], -) +from . import tags def _make_tag_only_serializer(tag, expected_value): tag = bytes([tag]) @@ -47,26 +38,26 @@ def _serialize_tuple(to): fmt = '!BI' - return struct.pack('!BI', tag.TUPLE, len(payload)) + payload + return struct.pack('!BI', tags.TUPLE, len(payload)) + payload _TAGS_TO_SERIALIZERS = { - tag.NULL: _make_tag_only_serializer(tag.NULL, None), - tag.TRUE: _make_tag_only_serializer(tag.TRUE, True), - tag.FALSE: _make_tag_only_serializer(tag.FALSE, False), - tag.UINT8: _make_struct_serializer('B'), - tag.UINT16: _make_struct_serializer('H'), - tag.UINT32: _make_struct_serializer('I'), - tag.UINT64: _make_struct_serializer('Q'), - tag.INT8: _make_struct_serializer('b'), - tag.INT16: _make_struct_serializer('h'), - tag.INT32: _make_struct_serializer('i'), - tag.INT64: _make_struct_serializer('q'), - tag.BINARY: _make_string_serializer(lambda s: s), - tag.UTF8: _make_string_serializer(lambda s: s.encode('utf-8')), - tag.UTF16: _make_string_serializer(lambda s: s.encode('utf-16')), - tag.UTF32: _make_string_serializer(lambda s: s.encode('utf-32')), - tag.TUPLE: _serialize_tuple, + tags.NULL: _make_tag_only_serializer(tags.NULL, None), + tags.TRUE: _make_tag_only_serializer(tags.TRUE, True), + tags.FALSE: _make_tag_only_serializer(tags.FALSE, False), + tags.UINT8: _make_struct_serializer('B'), + tags.UINT16: _make_struct_serializer('H'), + tags.UINT32: _make_struct_serializer('I'), + tags.UINT64: _make_struct_serializer('Q'), + tags.INT8: _make_struct_serializer('b'), + tags.INT16: _make_struct_serializer('h'), + tags.INT32: _make_struct_serializer('i'), + tags.INT64: _make_struct_serializer('q'), + tags.BINARY: _make_string_serializer(lambda s: s), + tags.UTF8: _make_string_serializer(lambda s: s.encode('utf-8')), + tags.UTF16: _make_string_serializer(lambda s: s.encode('utf-16')), + tags.UTF32: _make_string_serializer(lambda s: s.encode('utf-32')), + tags.TUPLE: _serialize_tuple, } def serialize(to): @@ -74,7 +65,7 @@ def serialize(to): def _make_tag_only_parser(tag, value): def parser(b): - return 0, TaggedObject(tag = tag, instance = value) + return 0, tags.TaggedObject(tag = tag, instance = value) return parser @@ -86,7 +77,7 @@ def _make_struct_deserializer(tag, fmt): def parser(b): b = b.read(size) assert len(b) == size - return size, TaggedObject(tag = tag, instance = unpacker(b)[0]) + return size, tags.TaggedObject(tag = tag, instance = unpacker(b)[0]) return parser @@ -109,7 +100,7 @@ def _make_string_deserializer(tag, decoder): def parser(b): bytes_read, payload = _read_length_then_payload(b) - return bytes_read, TaggedObject(tag = tag, instance = decoder(payload)) + return bytes_read, tags.TaggedObject(tag = tag, instance = decoder(payload)) return parser @@ -126,25 +117,25 @@ def _deserialize_tuple(b): total_bytes_read += partial_bytes_read instance.append(item) - return bytes_read, TaggedObject(tag = tag.TUPLE, instance = tuple(instance)) + return bytes_read, tags.TaggedObject(tag = tags.TUPLE, instance = tuple(instance)) _TAGS_TO_PARSERS = { - tag.NULL: _make_tag_only_parser(tag.NULL, None), - tag.TRUE: _make_tag_only_parser(tag.TRUE, True), - tag.FALSE: _make_tag_only_parser(tag.FALSE, False), - tag.UINT8: _make_struct_deserializer(tag.UINT8, 'B'), - tag.UINT16: _make_struct_deserializer(tag.UINT16, 'H'), - tag.UINT32: _make_struct_deserializer(tag.UINT32, 'I'), - tag.UINT64: _make_struct_deserializer(tag.UINT64, 'Q'), - tag.INT8: _make_struct_deserializer(tag.INT8, 'b'), - tag.INT16: _make_struct_deserializer(tag.INT16, 'h'), - tag.INT32: _make_struct_deserializer(tag.INT32, 'i'), - tag.INT64: _make_struct_deserializer(tag.INT64, 'q'), - tag.BINARY: _make_string_deserializer(tag.BINARY, lambda b: b), - tag.UTF8: _make_string_deserializer(tag.UTF8, lambda b: b.decode('utf-8')), - tag.UTF16: _make_string_deserializer(tag.UTF16, lambda b: b.decode('utf-16')), - tag.UTF32: _make_string_deserializer(tag.UTF32, lambda b: b.decode('utf-32')), - tag.TUPLE: _deserialize_tuple, + tags.NULL: _make_tag_only_parser(tags.NULL, None), + tags.TRUE: _make_tag_only_parser(tags.TRUE, True), + tags.FALSE: _make_tag_only_parser(tags.FALSE, False), + tags.UINT8: _make_struct_deserializer(tags.UINT8, 'B'), + tags.UINT16: _make_struct_deserializer(tags.UINT16, 'H'), + tags.UINT32: _make_struct_deserializer(tags.UINT32, 'I'), + tags.UINT64: _make_struct_deserializer(tags.UINT64, 'Q'), + tags.INT8: _make_struct_deserializer(tags.INT8, 'b'), + tags.INT16: _make_struct_deserializer(tags.INT16, 'h'), + tags.INT32: _make_struct_deserializer(tags.INT32, 'i'), + tags.INT64: _make_struct_deserializer(tags.INT64, 'q'), + tags.BINARY: _make_string_deserializer(tags.BINARY, lambda b: b), + tags.UTF8: _make_string_deserializer(tags.UTF8, lambda b: b.decode('utf-8')), + tags.UTF16: _make_string_deserializer(tags.UTF16, lambda b: b.decode('utf-16')), + tags.UTF32: _make_string_deserializer(tags.UTF32, lambda b: b.decode('utf-32')), + tags.TUPLE: _deserialize_tuple, } def _deserialize_partial(b): diff --git a/serial/serial/tag.py b/serial/serial/tags.py similarity index 61% rename from serial/serial/tag.py rename to serial/serial/tags.py index 0c67029..0409d92 100644 --- a/serial/serial/tag.py +++ b/serial/serial/tags.py @@ -1,3 +1,5 @@ +import collections + NULL = 0x00 TRUE = 0x01 FALSE = 0x02 @@ -14,3 +16,11 @@ UTF8 = 0x21 UTF16 = 0x22 UTF32 = 0x23 TUPLE = 0x30 + +TaggedObject = collections.namedtuple( + 'TaggedObject', + [ + 'tag', + 'instance', + ], +) diff --git a/serial/test_binary.py b/serial/test_binary.py index 0c7b65d..c4cdd3b 100644 --- a/serial/test_binary.py +++ b/serial/test_binary.py @@ -1,41 +1,41 @@ import unittest -from serial import binary, tag +from serial import binary, tags EXAMPLE_REPRESENTATIONS = [ - (binary.TaggedObject(tag.NULL, None), b'\x00'), - (binary.TaggedObject(tag.TRUE, True), b'\x01'), - (binary.TaggedObject(tag.FALSE, False), b'\x02'), - (binary.TaggedObject(tag.UINT8, 7), b'\x03\x07'), - (binary.TaggedObject(tag.UINT16, 7), b'\x04\x00\x07'), - (binary.TaggedObject(tag.UINT32, 7), b'\x05\x00\x00\x00\x07'), - (binary.TaggedObject(tag.UINT64, 7), b'\x06\x00\x00\x00\x00\x00\x00\x00\x07'), - (binary.TaggedObject(tag.INT8, 7), b'\x10\x07'), - (binary.TaggedObject(tag.INT16, 7), b'\x11\x00\x07'), - (binary.TaggedObject(tag.INT32, 7), b'\x12\x00\x00\x00\x07'), - (binary.TaggedObject(tag.INT64, 7), b'\x13\x00\x00\x00\x00\x00\x00\x00\x07'), - (binary.TaggedObject(tag.UINT8, 254), b'\x03\xfe'), - (binary.TaggedObject(tag.UINT16, 65534), b'\x04\xff\xfe'), - (binary.TaggedObject(tag.UINT32, 4294967294), b'\x05\xff\xff\xff\xfe'), - (binary.TaggedObject(tag.UINT64, 18446744073709551614), b'\x06\xff\xff\xff\xff\xff\xff\xff\xfe'), - (binary.TaggedObject(tag.INT8, -2), b'\x10\xfe'), - (binary.TaggedObject(tag.INT16, -2), b'\x11\xff\xfe'), - (binary.TaggedObject(tag.INT32, -2), b'\x12\xff\xff\xff\xfe'), - (binary.TaggedObject(tag.INT64, -2), b'\x13\xff\xff\xff\xff\xff\xff\xff\xfe'), - (binary.TaggedObject(tag.BINARY, b'\xde\xad\xbe\xef'), b'\x20\x00\x00\x00\x04\xde\xad\xbe\xef'), - (binary.TaggedObject(tag.UTF8, 'Lol!'), b'\x21\x00\x00\x00\x04Lol!'), - (binary.TaggedObject(tag.UTF16, 'かわ'), b'\x22\x00\x00\x00\x06\xff\xfeK0\x8f0'), - (binary.TaggedObject(tag.UTF32, '漢'), b'\x23\x00\x00\x00\x08\xff\xfe\x00\x00"o\x00\x00'), + (tags.TaggedObject(tags.NULL, None), b'\x00'), + (tags.TaggedObject(tags.TRUE, True), b'\x01'), + (tags.TaggedObject(tags.FALSE, False), b'\x02'), + (tags.TaggedObject(tags.UINT8, 7), b'\x03\x07'), + (tags.TaggedObject(tags.UINT16, 7), b'\x04\x00\x07'), + (tags.TaggedObject(tags.UINT32, 7), b'\x05\x00\x00\x00\x07'), + (tags.TaggedObject(tags.UINT64, 7), b'\x06\x00\x00\x00\x00\x00\x00\x00\x07'), + (tags.TaggedObject(tags.INT8, 7), b'\x10\x07'), + (tags.TaggedObject(tags.INT16, 7), b'\x11\x00\x07'), + (tags.TaggedObject(tags.INT32, 7), b'\x12\x00\x00\x00\x07'), + (tags.TaggedObject(tags.INT64, 7), b'\x13\x00\x00\x00\x00\x00\x00\x00\x07'), + (tags.TaggedObject(tags.UINT8, 254), b'\x03\xfe'), + (tags.TaggedObject(tags.UINT16, 65534), b'\x04\xff\xfe'), + (tags.TaggedObject(tags.UINT32, 4294967294), b'\x05\xff\xff\xff\xfe'), + (tags.TaggedObject(tags.UINT64, 18446744073709551614), b'\x06\xff\xff\xff\xff\xff\xff\xff\xfe'), + (tags.TaggedObject(tags.INT8, -2), b'\x10\xfe'), + (tags.TaggedObject(tags.INT16, -2), b'\x11\xff\xfe'), + (tags.TaggedObject(tags.INT32, -2), b'\x12\xff\xff\xff\xfe'), + (tags.TaggedObject(tags.INT64, -2), b'\x13\xff\xff\xff\xff\xff\xff\xff\xfe'), + (tags.TaggedObject(tags.BINARY, b'\xde\xad\xbe\xef'), b'\x20\x00\x00\x00\x04\xde\xad\xbe\xef'), + (tags.TaggedObject(tags.UTF8, 'Lol!'), b'\x21\x00\x00\x00\x04Lol!'), + (tags.TaggedObject(tags.UTF16, 'かわ'), b'\x22\x00\x00\x00\x06\xff\xfeK0\x8f0'), + (tags.TaggedObject(tags.UTF32, '漢'), b'\x23\x00\x00\x00\x08\xff\xfe\x00\x00"o\x00\x00'), ( - binary.TaggedObject( - tag.TUPLE, + tags.TaggedObject( + tags.TUPLE, ( - binary.TaggedObject( - tag.TRUE, + tags.TaggedObject( + tags.TRUE, True, ), - binary.TaggedObject( - tag.UINT8, + tags.TaggedObject( + tags.UINT8, 7, ), ), -- 2.20.1