diff --git a/docs/index.rst b/docs/index.rst index 047dc00..5357cc4 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -15,7 +15,8 @@ Contents: :members: .. autoclass:: Pyre :members: - +.. autoclass:: PyreEvent + :members: Indices and tables ================== diff --git a/pyre/__init__.py b/pyre/__init__.py index 1938917..237e827 100644 --- a/pyre/__init__.py +++ b/pyre/__init__.py @@ -1,3 +1,4 @@ __all__ = ['pyre', 'zbeacon', 'zhelper'] from .pyre import Pyre +from .pyre_event import PyreEvent diff --git a/pyre/pyre_event.py b/pyre/pyre_event.py new file mode 100644 index 0000000..809b6d8 --- /dev/null +++ b/pyre/pyre_event.py @@ -0,0 +1,61 @@ +import zmq, uuid, json + +class PyreEvent(object): + """Parsing Pyre messages + + This class provides a higher-level API to the Pyre.recv() call, by doing + work that you will want to do in many cases, such as unpacking the peer + headers for each ENTER event received. + """ + def __init__(self, node): + """Constructor, creates a new Pyre event. Receive an event from the Pyre node, wraps Pyre.recv. + + Args: + node (Pyre): Pyre node + """ + super(PyreEvent, self).__init__() + try: + incoming = node.recv() + except zmq.ZMQError: + # recv failed. + return None + + self.type = incoming.pop(0).decode('utf-8') + self.peer_uuid_bytes = incoming.pop(0) + self.peer_name = incoming.pop(0).decode('utf-8') + self.headers = None + self.peer_addr = None + self.group = None + self.msg = None + if self.type == "ENTER": + self.headers = json.loads(incoming.pop(0).decode('utf-8')) + self.peer_addr = incoming.pop(0).decode('utf-8') + elif self.type == "JOIN" or self.type == "LEAVE": + self.group = incoming.pop(0).decode('utf-8') + elif self.type == "WHISPER": + self.msg = incoming + elif self.type == "SHOUT": + self.group = incoming.pop(0).decode('utf-8') + self.msg = incoming + + def header(self,name): + """Getter for single header values + + Args: + name (str): Header name + + Returns: + str: Header value + """ + if self.headers and name in self.headers: + return self.headers[name] + return None + + @property + def peer_uuid(self): + """Creates uuid.UUID object + + Returns: + TYPE: uuid.UUID + """ + return uuid.UUID(bytes=self.peer_uuid_bytes)