From a2614d71447829cf8a64984776328471e279bab5 Mon Sep 17 00:00:00 2001 From: Min RK Date: Wed, 3 Aug 2016 13:00:02 +0200 Subject: [PATCH] ensure status is included in all replies according to the spec --- ipykernel/ipkernel.py | 7 +++++-- ipykernel/kernelbase.py | 9 +++++--- ipykernel/tests/test_message_spec.py | 31 ++++++++++++++++++---------- 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/ipykernel/ipkernel.py b/ipykernel/ipkernel.py index 1ebade4a5..230563050 100644 --- a/ipykernel/ipkernel.py +++ b/ipykernel/ipkernel.py @@ -205,7 +205,7 @@ def do_execute(self, code, silent, store_history=True, if res.success: reply_content[u'status'] = u'ok' elif isinstance(err, KeyboardInterrupt): - reply_content[u'status'] = u'abort' + reply_content[u'status'] = u'aborted' else: reply_content[u'status'] = u'error' @@ -296,7 +296,10 @@ def do_history(self, hist_access_type, output, raw, session=None, start=None, else: hist = [] - return {'history' : list(hist)} + return { + 'status': 'ok', + 'history' : list(hist), + } def do_shutdown(self, restart): self.shell.exit_now = True diff --git a/ipykernel/kernelbase.py b/ipykernel/kernelbase.py index 9b441375d..e5c831e7f 100644 --- a/ipykernel/kernelbase.py +++ b/ipykernel/kernelbase.py @@ -467,13 +467,14 @@ def do_history(self, hist_access_type, output, raw, session=None, start=None, stop=None, n=None, pattern=None, unique=False): """Override in subclasses to access history. """ - return {'history': []} + return {'status': 'ok', 'history': []} def connect_request(self, stream, ident, parent): if self._recorded_ports is not None: content = self._recorded_ports.copy() else: content = {} + content['status'] = 'ok' msg = self.session.send(stream, 'connect_reply', content, parent, ident) self.log.debug("%s", msg) @@ -490,8 +491,10 @@ def kernel_info(self): } def kernel_info_request(self, stream, ident, parent): + content = {'status': 'ok'} + content.update(self.kernel_info) msg = self.session.send(stream, 'kernel_info_reply', - self.kernel_info, parent, ident) + content, parent, ident) self.log.debug("%s", msg) def comm_info_request(self, stream, ident, parent): @@ -507,7 +510,7 @@ def comm_info_request(self, stream, ident, parent): } else: comms = {} - reply_content = dict(comms=comms) + reply_content = dict(comms=comms, status='ok') msg = self.session.send(stream, 'comm_info_reply', reply_content, parent, ident) self.log.debug("%s", msg) diff --git a/ipykernel/tests/test_message_spec.py b/ipykernel/tests/test_message_spec.py index 06c81b0d3..4991ec288 100644 --- a/ipykernel/tests/test_message_spec.py +++ b/ipykernel/tests/test_message_spec.py @@ -103,11 +103,14 @@ def _data_changed(self, name, old, new): assert mime_pat.match(k) nt.assert_is_instance(v, string_types) + # shell replies +class Reply(Reference): + status = Enum((u'ok', u'error'), default_value=u'ok') -class ExecuteReply(Reference): + +class ExecuteReply(Reply): execution_count = Integer() - status = Enum((u'ok', u'error'), default_value=u'ok') def check(self, d): Reference.check(self, d) @@ -117,18 +120,18 @@ def check(self, d): ExecuteReplyError().check(d) -class ExecuteReplyOkay(Reference): - payload = List(Dict()) +class ExecuteReplyOkay(Reply): + status = Enum(('ok',)) user_expressions = Dict() -class ExecuteReplyError(Reference): +class ExecuteReplyError(Reply): ename = Unicode() evalue = Unicode() traceback = List(Unicode()) -class InspectReply(MimeBundle): +class InspectReply(Reply, MimeBundle): found = Bool() @@ -143,17 +146,19 @@ class Status(Reference): execution_state = Enum((u'busy', u'idle', u'starting'), default_value=u'busy') -class CompleteReply(Reference): +class CompleteReply(Reply): matches = List(Unicode()) cursor_start = Integer() cursor_end = Integer() status = Unicode() + class LanguageInfo(Reference): name = Unicode('python') version = Unicode(sys.version.split()[0]) -class KernelInfoReply(Reference): + +class KernelInfoReply(Reply): protocol_version = Version(min='5.0') implementation = Unicode('ipython') implementation_version = Version(min='2.1') @@ -173,9 +178,10 @@ class ConnectReply(Reference): hb_port = Integer() -class CommInfoReply(Reference): +class CommInfoReply(Reply): comms = Dict() + class IsCompleteReply(Reference): status = Enum((u'complete', u'incomplete', u'invalid', u'unknown'), default_value=u'complete') @@ -184,6 +190,7 @@ def check(self, d): if d['status'] == 'incomplete': IsCompleteReplyIncomplete().check(d) + class IsCompleteReplyIncomplete(Reference): indent = Unicode() @@ -195,7 +202,9 @@ class ExecuteInput(Reference): execution_count = Integer() -Error = ExecuteReplyError +class Error(ExecuteReplyError): + """Errors are the same as ExecuteReply, but without status""" + status = None # no status field class Stream(Reference): @@ -211,7 +220,7 @@ class ExecuteResult(MimeBundle): execution_count = Integer() -class HistoryReply(Reference): +class HistoryReply(Reply): history = List(List())