From a85e09df89a43de5b659a0fa4ed35bec37c60e04 Mon Sep 17 00:00:00 2001 From: Dana Powers Date: Sat, 28 Nov 2015 19:41:06 +0800 Subject: Rework protocol type definition: AbstractType, Schema, Struct --- kafka/protocol/struct.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 kafka/protocol/struct.py (limited to 'kafka/protocol/struct.py') diff --git a/kafka/protocol/struct.py b/kafka/protocol/struct.py new file mode 100644 index 0000000..77f5fe7 --- /dev/null +++ b/kafka/protocol/struct.py @@ -0,0 +1,52 @@ +from collections import namedtuple +from io import BytesIO + +from .abstract import AbstractType +from .types import Schema + + +class Struct(AbstractType): + SCHEMA = Schema() + + def __init__(self, *args, **kwargs): + if len(args) == len(self.SCHEMA.fields): + for i, name in enumerate(self.SCHEMA.names): + self.__dict__[name] = args[i] + elif len(args) > 0: + raise ValueError('Args must be empty or mirror schema') + else: + self.__dict__.update(kwargs) + + # overloading encode() to support both class and instance + self.encode = self._encode_self + + @classmethod + def encode(cls, item): + bits = [] + for i, field in enumerate(cls.SCHEMA.fields): + bits.append(field.encode(item[i])) + return b''.join(bits) + + def _encode_self(self): + return self.SCHEMA.encode( + [self.__dict__[name] for name in self.SCHEMA.names] + ) + + @classmethod + def decode(cls, data): + if isinstance(data, bytes): + data = BytesIO(data) + return cls(*[field.decode(data) for field in cls.SCHEMA.fields]) + + def __repr__(self): + key_vals =['%s=%r' % (name, self.__dict__[name]) + for name in self.SCHEMA.names] + return self.__class__.__name__ + '(' + ', '.join(key_vals) + ')' + +""" +class MetaStruct(type): + def __new__(cls, clsname, bases, dct): + nt = namedtuple(clsname, [name for (name, _) in dct['SCHEMA']]) + bases = tuple([Struct, nt] + list(bases)) + return super(MetaStruct, cls).__new__(cls, clsname, bases, dct) +""" -- cgit v1.2.1 From 389fa20423eb7c553298aab47d79bfec989c72e2 Mon Sep 17 00:00:00 2001 From: Dana Powers Date: Sun, 29 Nov 2015 23:53:23 +0800 Subject: Recursive repr, display all field names and values for Structs --- kafka/protocol/struct.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'kafka/protocol/struct.py') diff --git a/kafka/protocol/struct.py b/kafka/protocol/struct.py index 77f5fe7..30e233c 100644 --- a/kafka/protocol/struct.py +++ b/kafka/protocol/struct.py @@ -1,4 +1,4 @@ -from collections import namedtuple +#from collections import namedtuple from io import BytesIO from .abstract import AbstractType @@ -39,10 +39,12 @@ class Struct(AbstractType): return cls(*[field.decode(data) for field in cls.SCHEMA.fields]) def __repr__(self): - key_vals =['%s=%r' % (name, self.__dict__[name]) - for name in self.SCHEMA.names] + key_vals = [] + for name, field in zip(self.SCHEMA.names, self.SCHEMA.fields): + key_vals.append('%s=%s' % (name, field.repr(self.__dict__[name]))) return self.__class__.__name__ + '(' + ', '.join(key_vals) + ')' + """ class MetaStruct(type): def __new__(cls, clsname, bases, dct): -- cgit v1.2.1 From efc3d4f466c0d6630c9fff09fb1b90035c5351d7 Mon Sep 17 00:00:00 2001 From: Zack Dever Date: Thu, 3 Dec 2015 17:46:08 -0800 Subject: few small cleanups --- kafka/protocol/struct.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'kafka/protocol/struct.py') diff --git a/kafka/protocol/struct.py b/kafka/protocol/struct.py index 30e233c..5b4c312 100644 --- a/kafka/protocol/struct.py +++ b/kafka/protocol/struct.py @@ -21,7 +21,7 @@ class Struct(AbstractType): self.encode = self._encode_self @classmethod - def encode(cls, item): + def encode(cls, item): # pylint: disable-msg=E0202 bits = [] for i, field in enumerate(cls.SCHEMA.fields): bits.append(field.encode(item[i])) -- cgit v1.2.1 From 1cb732aba10e82232197e19fd84a79cbab6214c6 Mon Sep 17 00:00:00 2001 From: Dana Powers Date: Thu, 10 Dec 2015 17:48:12 -0800 Subject: pylint fixes - temporarily ignore kafka/consumer/group.py - temporarily ignore test/test_protocol.py - disable-msg deprecated; use disable= instead --- kafka/protocol/struct.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'kafka/protocol/struct.py') diff --git a/kafka/protocol/struct.py b/kafka/protocol/struct.py index 5b4c312..d340abf 100644 --- a/kafka/protocol/struct.py +++ b/kafka/protocol/struct.py @@ -21,7 +21,7 @@ class Struct(AbstractType): self.encode = self._encode_self @classmethod - def encode(cls, item): # pylint: disable-msg=E0202 + def encode(cls, item): # pylint: disable=E0202 bits = [] for i, field in enumerate(cls.SCHEMA.fields): bits.append(field.encode(item[i])) -- cgit v1.2.1 From 9fe904e9bbc64a8bcd1fa5876a76ca93b544cdfe Mon Sep 17 00:00:00 2001 From: Dana Powers Date: Fri, 1 Jan 2016 12:11:08 -0800 Subject: Struct __eq__ --- kafka/protocol/struct.py | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'kafka/protocol/struct.py') diff --git a/kafka/protocol/struct.py b/kafka/protocol/struct.py index d340abf..0a96c02 100644 --- a/kafka/protocol/struct.py +++ b/kafka/protocol/struct.py @@ -44,6 +44,13 @@ class Struct(AbstractType): key_vals.append('%s=%s' % (name, field.repr(self.__dict__[name]))) return self.__class__.__name__ + '(' + ', '.join(key_vals) + ')' + def __eq__(self, other): + if self.SCHEMA != other.SCHEMA: + return False + for attr in self.SCHEMA.names: + if self.__dict__[attr] != other.__dict__[attr]: + return False + return True """ class MetaStruct(type): -- cgit v1.2.1 From d73f26d57fe307897b1a6d000ef971764b7f79ee Mon Sep 17 00:00:00 2001 From: Dana Powers Date: Sun, 3 Jan 2016 17:11:46 -0800 Subject: Add __hash__ method to Struct --- kafka/protocol/struct.py | 3 +++ 1 file changed, 3 insertions(+) (limited to 'kafka/protocol/struct.py') diff --git a/kafka/protocol/struct.py b/kafka/protocol/struct.py index 0a96c02..ca1013e 100644 --- a/kafka/protocol/struct.py +++ b/kafka/protocol/struct.py @@ -44,6 +44,9 @@ class Struct(AbstractType): key_vals.append('%s=%s' % (name, field.repr(self.__dict__[name]))) return self.__class__.__name__ + '(' + ', '.join(key_vals) + ')' + def __hash__(self): + return hash(self.encode()) + def __eq__(self, other): if self.SCHEMA != other.SCHEMA: return False -- cgit v1.2.1