diff --git a/IPython/zmq/session.py b/IPython/zmq/session.py index 6f9ad23..4649685 100644 --- a/IPython/zmq/session.py +++ b/IPython/zmq/session.py @@ -357,7 +357,10 @@ class Session(Configurable): format, which is a list of message parts. """ msg = {} - msg['header'] = self.msg_header(msg_type) if header is None else header + header = self.msg_header(msg_type) if header is None else header + msg['header'] = header + msg['msg_id'] = header['msg_id'] + msg['msg_type'] = header['msg_type'] msg['parent_header'] = {} if parent is None else extract_header(parent) msg['content'] = {} if content is None else content sub = {} if subheader is None else subheader @@ -669,7 +672,10 @@ class Session(Configurable): raise ValueError("Invalid Signature: %r"%signature) if not len(msg_list) >= minlen: raise TypeError("malformed message, must have at least %i elements"%minlen) - message['header'] = self.unpack(msg_list[1]) + header = self.unpack(msg_list[1]) + message['header'] = header + message['msg_id'] = header['msg_id'] + message['msg_type'] = header['msg_type'] message['parent_header'] = self.unpack(msg_list[2]) if content: message['content'] = self.unpack(msg_list[3]) diff --git a/IPython/zmq/tests/test_session.py b/IPython/zmq/tests/test_session.py index 7c4cf9d..42ac635 100644 --- a/IPython/zmq/tests/test_session.py +++ b/IPython/zmq/tests/test_session.py @@ -47,13 +47,16 @@ class TestSession(SessionTestCase): def test_msg(self): """message format""" msg = self.session.msg('execute') - thekeys = set('header parent_header content'.split()) + thekeys = set('header parent_header content msg_type msg_id'.split()) s = set(msg.keys()) self.assertEquals(s, thekeys) self.assertTrue(isinstance(msg['content'],dict)) self.assertTrue(isinstance(msg['header'],dict)) self.assertTrue(isinstance(msg['parent_header'],dict)) + self.assertTrue(isinstance(msg['msg_id'],str)) + self.assertTrue(isinstance(msg['msg_type'],str)) self.assertEquals(msg['header']['msg_type'], 'execute') + self.assertEquals(msg['msg_type'], 'execute') def test_serialize(self): msg = self.session.msg('execute',content=dict(a=10)) @@ -61,6 +64,8 @@ class TestSession(SessionTestCase): ident, msg_list = self.session.feed_identities(msg_list) new_msg = self.session.unserialize(msg_list) self.assertEquals(ident[0], b'foo') + self.assertEquals(new_msg['msg_id'],msg['msg_id']) + self.assertEquals(new_msg['msg_type'],msg['msg_type']) self.assertEquals(new_msg['header'],msg['header']) self.assertEquals(new_msg['content'],msg['content']) self.assertEquals(new_msg['parent_header'],msg['parent_header']) @@ -73,6 +78,8 @@ class TestSession(SessionTestCase): ident, msg_list = self.session.feed_identities(socket.data) new_msg = self.session.unserialize(msg_list) self.assertEquals(ident[0], b'foo') + self.assertEquals(new_msg['msg_id'],msg['msg_id']) + self.assertEquals(new_msg['msg_type'],msg['msg_type']) self.assertEquals(new_msg['header'],msg['header']) self.assertEquals(new_msg['content'],msg['content']) self.assertEquals(new_msg['parent_header'],msg['parent_header']) @@ -89,6 +96,8 @@ class TestSession(SessionTestCase): ident, msg_list = self.session.feed_identities(socket.data) new_msg = self.session.unserialize(msg_list) self.assertEquals(ident[0], b'foo') + self.assertEquals(new_msg['msg_id'],msg['msg_id']) + self.assertEquals(new_msg['msg_type'],msg['msg_type']) self.assertEquals(new_msg['header'],msg['header']) self.assertEquals(new_msg['content'],msg['content']) self.assertEquals(new_msg['parent_header'],msg['parent_header']) @@ -99,6 +108,8 @@ class TestSession(SessionTestCase): self.session.send(socket, msg, ident=b'foo', buffers=[b'bar']) ident, new_msg = self.session.recv(socket) self.assertEquals(ident[0], b'foo') + self.assertEquals(new_msg['msg_id'],msg['msg_id']) + self.assertEquals(new_msg['msg_type'],msg['msg_type']) self.assertEquals(new_msg['header'],msg['header']) self.assertEquals(new_msg['content'],msg['content']) self.assertEquals(new_msg['parent_header'],msg['parent_header']) diff --git a/docs/source/development/messaging.txt b/docs/source/development/messaging.txt index f51a189..01670da 100644 --- a/docs/source/development/messaging.txt +++ b/docs/source/development/messaging.txt @@ -108,6 +108,10 @@ generic structure:: # All recognized message type strings are listed below. 'msg_type' : str, }, + # The msg's unique identifier and type are stored in the header, but + # are also accessible at the top-level for convenience. + 'msg_id' : uuid, + 'msg_type' : str, # In a chain of messages, the header from the parent is copied so that # clients can track where messages come from.