# Path: kiel/constants.py
# CLIENT_ID = "kiel"
# 
# API_VERSION = 0
# 
# API_KEYS = {
#     "produce": 0,
#     "fetch": 1,
#     "offset": 2,
#     "metadata": 3,
#     "offset_commit": 8,
#     "offset_fetch": 9,
#     "group_coordinator": 10,
#     "join_group": 11,
#     "heartbeat": 12,
#     "leave_group": 13,
#     "sync_group": 14,
#     "describe_groups": 15,
#     "list_groups": 16,
# }
# 
# Path: kiel/protocol/part.py
# class Part(object):
#     """
#     Composable building block used to define Kafka protocol parts.
# 
#     Behaves much like the `Primitive` class but has named "sub parts"
#     stored in a ``parts`` class attribute, that can hold any `Part` or
#     `Primitive` subclass.
#     """
#     parts = ()
# 
#     def __init__(self, **kwargs):
#         part_names = [item[0] for item in self.parts]
# 
#         for name, value in kwargs.items():
#             if name not in part_names:
#                 raise ValueError("Unknown part name: '%s'" % name)
# 
#             setattr(self, name, value)
# 
#     def render(self, parts=None):
#         """
#         Returns a two-element tuple with the ``struct`` format and values.
# 
#         Iterates over the applicable sub-parts and calls `render()` on them,
#         accumulating the format string and values.
# 
#         Optionally takes a subset of parts to render, default behavior is to
#         render all sub-parts belonging to the class.
#         """
#         if not parts:
#             parts = self.parts
# 
#         fmt = []
#         data = []
# 
#         for name, part_class in parts:
#             if issubclass(part_class, Primitive):
#                 part = part_class(getattr(self, name, None))
#             else:
#                 part = getattr(self, name, None)
# 
#             part_format, part_data = part.render()
# 
#             fmt.extend(part_format)
#             data.extend(part_data)
# 
#         return "".join(fmt), data
# 
#     @classmethod
#     def parse(cls, buff, offset):
#         """
#         Given a buffer and offset, returns the parsed value and new offset.
# 
#         Calls `parse()` on the given buffer for each sub-part in order and
#         creates a new instance with the results.
#         """
#         values = {}
# 
#         for name, part in cls.parts:
#             value, new_offset = part.parse(buff, offset)
# 
#             values[name] = value
#             offset = new_offset
# 
#         return cls(**values), offset
# 
#     def __eq__(self, other):
#         """
#         `Part` instances are equal if all of their sub-parts are also equal.
#         """
#         try:
#             return all([
#                 getattr(self, part_name) == getattr(other, part_name)
#                 for part_name, part_class in self.parts
#             ])
#         except AttributeError:
#             return False
# 
#     def __repr__(self):
# 
#         def subpart_string(part_info):
#             part_name, part_class = part_info
# 
#             if not part_class.__name__.startswith("ArrayOf"):
#                 return "%s=%s" % (part_name, getattr(self, part_name, None))
# 
#             return "%s=[%s]" % (
#                 part_name,
#                 ", ".join([
#                     str(item) for item in getattr(self, part_name, [])
#                 ])
#             )
# 
#         return "%s(%s)" % (
#             self.__class__.__name__,
#             ", ".join([subpart_string(part) for part in self.parts])
#         )
# 
# Path: kiel/protocol/primitives.py
# class Int16(Primitive):
#     """
#     Represents an 16-bit signed integer.
#     """
#     fmt = "h"
# 
# class Int32(Primitive):
#     """
#     Represents an 32-bit signed integer.
#     """
#     fmt = "i"
# 
# class String(VariablePrimitive):
#     """
#     Represents a string value, length denoted by a 16-bit signed integer.
#     """
#     size_primitive = Int16
# 
#     def __repr__(self):
#         return repr(self.value)


import binascii
import hashlib
import os
import socket
import struct
from six import BytesIO
from kiel.constants import CLIENT_ID, API_VERSION, API_KEYS
from .part import Part
from .primitives import Int16, Int32, String
    responses and prefacing payloads with client/api metadata.
    """
    api = None

    def __init__(self, **kwargs):
        super(Request, self).__init__(**kwargs)

        self.client_id = CLIENT_ID
        self.api_key = API_KEYS[self.api]
        self.api_version = API_VERSION
        self.correlation_id = generate_correlation_id()

    def serialize(self):
        """
        Returns a bytesring representation of the request instance.

        Prefaces the output with certain information::

          api_key => Int16
          api_version => Int16
          correlation_id => Int32
          client_id => String

        Since this is a ``Part`` subclass the rest is a matter of
        appending the result of a ``render()`` call.
        """
        buff = BytesIO()

        preamble_parts = (
            ("api_key", Int16),

# Path: kiel/constants.py
# CLIENT_ID = "kiel"
# 
# API_VERSION = 0
# 
# API_KEYS = {
#     "produce": 0,
#     "fetch": 1,
#     "offset": 2,
#     "metadata": 3,
#     "offset_commit": 8,
#     "offset_fetch": 9,
#     "group_coordinator": 10,
#     "join_group": 11,
#     "heartbeat": 12,
#     "leave_group": 13,
#     "sync_group": 14,
#     "describe_groups": 15,
#     "list_groups": 16,
# }
# 
# Path: kiel/protocol/part.py
# class Part(object):
#     """
#     Composable building block used to define Kafka protocol parts.
# 
#     Behaves much like the `Primitive` class but has named "sub parts"
#     stored in a ``parts`` class attribute, that can hold any `Part` or
#     `Primitive` subclass.
#     """
#     parts = ()
# 
#     def __init__(self, **kwargs):
#         part_names = [item[0] for item in self.parts]
# 
#         for name, value in kwargs.items():
#             if name not in part_names:
#                 raise ValueError("Unknown part name: '%s'" % name)
# 
#             setattr(self, name, value)
# 
#     def render(self, parts=None):
#         """
#         Returns a two-element tuple with the ``struct`` format and values.
# 
#         Iterates over the applicable sub-parts and calls `render()` on them,
#         accumulating the format string and values.
# 
#         Optionally takes a subset of parts to render, default behavior is to
#         render all sub-parts belonging to the class.
#         """
#         if not parts:
#             parts = self.parts
# 
#         fmt = []
#         data = []
# 
#         for name, part_class in parts:
#             if issubclass(part_class, Primitive):
#                 part = part_class(getattr(self, name, None))
#             else:
#                 part = getattr(self, name, None)
# 
#             part_format, part_data = part.render()
# 
#             fmt.extend(part_format)
#             data.extend(part_data)
# 
#         return "".join(fmt), data
# 
#     @classmethod
#     def parse(cls, buff, offset):
#         """
#         Given a buffer and offset, returns the parsed value and new offset.
# 
#         Calls `parse()` on the given buffer for each sub-part in order and
#         creates a new instance with the results.
#         """
#         values = {}
# 
#         for name, part in cls.parts:
#             value, new_offset = part.parse(buff, offset)
# 
#             values[name] = value
#             offset = new_offset
# 
#         return cls(**values), offset
# 
#     def __eq__(self, other):
#         """
#         `Part` instances are equal if all of their sub-parts are also equal.
#         """
#         try:
#             return all([
#                 getattr(self, part_name) == getattr(other, part_name)
#                 for part_name, part_class in self.parts
#             ])
#         except AttributeError:
#             return False
# 
#     def __repr__(self):
# 
#         def subpart_string(part_info):
#             part_name, part_class = part_info
# 
#             if not part_class.__name__.startswith("ArrayOf"):
#                 return "%s=%s" % (part_name, getattr(self, part_name, None))
# 
#             return "%s=[%s]" % (
#                 part_name,
#                 ", ".join([
#                     str(item) for item in getattr(self, part_name, [])
#                 ])
#             )
# 
#         return "%s(%s)" % (
#             self.__class__.__name__,
#             ", ".join([subpart_string(part) for part in self.parts])
#         )
# 
# Path: kiel/protocol/primitives.py
# class Int16(Primitive):
#     """
#     Represents an 16-bit signed integer.
#     """
#     fmt = "h"
# 
# class Int32(Primitive):
#     """
#     Represents an 32-bit signed integer.
#     """
#     fmt = "i"
# 
# class String(VariablePrimitive):
#     """
#     Represents a string value, length denoted by a 16-bit signed integer.
#     """
#     size_primitive = Int16
# 
#     def __repr__(self):
#         return repr(self.value)


# Path: kiel/protocol/request.py
import binascii
import hashlib
import os
import socket
import struct
from six import BytesIO
from kiel.constants import CLIENT_ID, API_VERSION, API_KEYS
from .part import Part
from .primitives import Int16, Int32, String

    responses and prefacing payloads with client/api metadata.
    """
    api = None

    def __init__(self, **kwargs):
        super(Request, self).__init__(**kwargs)

        self.client_id = CLIENT_ID
        self.api_key = API_KEYS[self.api]
        self.api_version = API_VERSION
        self.correlation_id = generate_correlation_id()

    def serialize(self):
        """
        Returns a bytesring representation of the request instance.

        Prefaces the output with certain information::

          api_key => Int16
          api_version => Int16
          correlation_id => Int32
          client_id => String

        Since this is a ``Part`` subclass the rest is a matter of
        appending the result of a ``render()`` call.
        """
        buff = BytesIO()

        preamble_parts = (
            ("api_key", Int16),

            ("api_version", Int16),