From a8320f5eeb899d5aa888774b7ae2846f491d59f5 2013-08-17 04:01:51 From: MinRK Date: 2013-08-17 04:01:51 Subject: [PATCH] subclass RichOutput in ExecuteReply they are very similar add another test for good measure. --- diff --git a/IPython/parallel/client/client.py b/IPython/parallel/client/client.py index 31d3391..092272e 100644 --- a/IPython/parallel/client/client.py +++ b/IPython/parallel/client/client.py @@ -34,6 +34,7 @@ from IPython.config.configurable import MultipleInstanceError from IPython.core.application import BaseIPythonApplication from IPython.core.profiledir import ProfileDir, ProfileDirError +from IPython.utils.capture import RichOutput from IPython.utils.coloransi import TermColors from IPython.utils.jsonutil import rekey from IPython.utils.localinterfaces import LOCALHOST, LOCAL_IPS @@ -75,7 +76,7 @@ def spin_first(f, self, *args, **kwargs): #-------------------------------------------------------------------------- -class ExecuteReply(object): +class ExecuteReply(RichOutput): """wrapper for finished Execute results""" def __init__(self, msg_id, content, metadata): self.msg_id = msg_id @@ -83,6 +84,39 @@ class ExecuteReply(object): self.execution_count = content['execution_count'] self.metadata = metadata + # RichOutput overrides + + @property + def source(self): + pyout = self.metadata['pyout'] + if pyout: + return pyout.get('source', '') + + @property + def data(self): + pyout = self.metadata['pyout'] + if pyout: + return pyout.get('data', {}) + + @property + def _metadata(self): + pyout = self.metadata['pyout'] + if pyout: + return pyout.get('metadata', {}) + + def display(self): + from IPython.display import publish_display_data + publish_display_data(self.source, self.data, self.metadata) + + def _repr_mime_(self, mime): + if mime not in self.data: + return + data = self.data[mime] + if mime in self._metadata: + return data, self._metadata[mime] + else: + return data + def __getitem__(self, key): return self.metadata[key] @@ -128,34 +162,6 @@ class ExecuteReply(object): self.metadata['engine_id'], self.execution_count ) + normal + text_out ) - - def _repr_html_(self): - pyout = self.metadata['pyout'] or {'data':{}} - return pyout['data'].get("text/html") - - def _repr_latex_(self): - pyout = self.metadata['pyout'] or {'data':{}} - return pyout['data'].get("text/latex") - - def _repr_json_(self): - pyout = self.metadata['pyout'] or {'data':{}} - return pyout['data'].get("application/json") - - def _repr_javascript_(self): - pyout = self.metadata['pyout'] or {'data':{}} - return pyout['data'].get("application/javascript") - - def _repr_png_(self): - pyout = self.metadata['pyout'] or {'data':{}} - return pyout['data'].get("image/png") - - def _repr_jpeg_(self): - pyout = self.metadata['pyout'] or {'data':{}} - return pyout['data'].get("image/jpeg") - - def _repr_svg_(self): - pyout = self.metadata['pyout'] or {'data':{}} - return pyout['data'].get("image/svg+xml") class Metadata(dict): diff --git a/IPython/parallel/tests/test_view.py b/IPython/parallel/tests/test_view.py index 42ac54e..40b0353 100644 --- a/IPython/parallel/tests/test_view.py +++ b/IPython/parallel/tests/test_view.py @@ -16,6 +16,7 @@ Authors: # Imports #------------------------------------------------------------------------------- +import base64 import sys import platform import time @@ -536,6 +537,18 @@ class TestView(ClusterTestCase, ParametricTestCase): self.assertEqual(str(er), "" % er.execution_count) self.assertEqual(er.pyout['data']['text/plain'], '5') + def test_execute_reply_rich(self): + e0 = self.client[self.client.ids[0]] + e0.block = True + e0.execute("from IPython.display import Image, HTML") + ar = e0.execute("Image(data=b'garbage', format='png', width=10)", silent=False) + er = ar.get() + b64data = base64.encodestring(b'garbage').decode('ascii') + self.assertEqual(er._repr_png_(), (b64data, dict(width=10))) + ar = e0.execute("HTML('bold')", silent=False) + er = ar.get() + self.assertEqual(er._repr_html_(), "bold") + def test_execute_reply_stdout(self): e0 = self.client[self.client.ids[0]] e0.block = True