From edb38312b5435165b6868fd29921927983ff29db 2013-12-16 23:58:08 From: Min RK Date: 2013-12-16 23:58:08 Subject: [PATCH] Merge pull request #4678 from ivanov/console-display-text allow ipython console to handle text/plain display --- diff --git a/IPython/terminal/console/interactiveshell.py b/IPython/terminal/console/interactiveshell.py index 5899ddc..dfe358b 100644 --- a/IPython/terminal/console/interactiveshell.py +++ b/IPython/terminal/console/interactiveshell.py @@ -263,8 +263,12 @@ class ZMQTerminalInteractiveShell(TerminalInteractiveShell): hook.finish_displayhook() elif msg_type == 'display_data': - self.handle_rich_data(sub_msg["content"]["data"]) - + data = sub_msg["content"]["data"] + handled = self.handle_rich_data(data) + if not handled: + # if it was an image, we handled it by now + if 'text/plain' in data: + print(data['text/plain']) _imagemime = { 'image/png': 'png', @@ -276,7 +280,7 @@ class ZMQTerminalInteractiveShell(TerminalInteractiveShell): for mime in self.mime_preference: if mime in data and mime in self._imagemime: self.handle_image(data, mime) - return + return True def handle_image(self, data, mime): handler = getattr( diff --git a/IPython/terminal/console/tests/test_console.py b/IPython/terminal/console/tests/test_console.py index 09351a0..479a06b 100644 --- a/IPython/terminal/console/tests/test_console.py +++ b/IPython/terminal/console/tests/test_console.py @@ -13,14 +13,11 @@ Authors: #----------------------------------------------------------------------------- import sys -import time -import nose.tools as nt from nose import SkipTest import IPython.testing.tools as tt from IPython.testing import decorators as dec -from IPython.utils import py3compat #----------------------------------------------------------------------------- # Tests @@ -29,6 +26,42 @@ from IPython.utils import py3compat @dec.skip_win32 def test_console_starts(): """test that `ipython console` starts a terminal""" + p, pexpect, t = start_console() + p.sendline('5') + idx = p.expect([r'Out\[\d+\]: 5', pexpect.EOF], timeout=t) + idx = p.expect([r'In \[\d+\]', pexpect.EOF], timeout=t) + stop_console(p, pexpect, t) + +def test_help_output(): + """ipython console --help-all works""" + tt.help_all_output_test('console') + + +def test_display_text(): + "Ensure display protocol plain/text key is supported" + # equivalent of: + # + # x = %lsmagic + # from IPython.display import display; display(x); + p, pexpect, t = start_console() + p.sendline('x = %lsmagic') + idx = p.expect([r'In \[\d+\]', pexpect.EOF], timeout=t) + p.sendline('from IPython.display import display; display(x);') + p.expect([r'Available line magics:', pexpect.EOF], timeout=t) + stop_console(p, pexpect, t) + +def stop_console(p, pexpect, t): + "Stop a running `ipython console` running via pexpect" + # send ctrl-D;ctrl-D to exit + p.sendeof() + p.sendeof() + p.expect([pexpect.EOF, pexpect.TIMEOUT], timeout=t) + if p.isalive(): + p.terminate() + + +def start_console(): + "Start `ipython console` using pexpect" from IPython.external import pexpect args = ['console', '--colors=NoColor'] @@ -47,17 +80,4 @@ def test_console_starts(): # timeout after one minute t = 60 idx = p.expect([r'In \[\d+\]', pexpect.EOF], timeout=t) - p.sendline('5') - idx = p.expect([r'Out\[\d+\]: 5', pexpect.EOF], timeout=t) - idx = p.expect([r'In \[\d+\]', pexpect.EOF], timeout=t) - # send ctrl-D;ctrl-D to exit - p.sendeof() - p.sendeof() - p.expect([pexpect.EOF, pexpect.TIMEOUT], timeout=t) - if p.isalive(): - p.terminate() - -def test_help_output(): - """ipython console --help-all works""" - tt.help_all_output_test('console') - + return p, pexpect, t