##// END OF EJS Templates
This feature was discussed in #6123, but it doesn't look like anything was ever incorporated into the IPython Notebook....
This feature was discussed in #6123, but it doesn't look like anything was ever incorporated into the IPython Notebook. Here's a brief overview of the changes: - Display of messages from other clients can be toggled on and off from within a notebook, either using the ``<M-m>e`` keyboard shortcut in the web UI, or through the option in the "Kernel" menu. - notebook.js controls whether messages are displayed through a callback that is invoked from kernel.js when no callbacks are available for a message. - The UI displays ``execute_input`` messages originating from an other clients in new cells at the end of the notebook. Output messages (``execute_result`` et al.) will only be displayed if a cell exists with a matching message ID. Pending design questions: - Should each ``execute_input`` message cause a new cell to be created? - Should new cells be placed at the end of the notebook, or elsewhere? If the latter, what criteria should be followed?

File last commit:

r11024:4571a5fb
r19164:17ac8ca3
Show More
test_image_handler.py
94 lines | 3.3 KiB | text/x-python | PythonLexer
Takafumi Arakaki
Add tests for image handlers
r8250 #-----------------------------------------------------------------------------
# Copyright (C) 2012 The IPython Development Team
#
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
import os
Takafumi Arakaki
Use sys.executable instead of find_cmd('python')
r8269 import sys
Takafumi Arakaki
Add tests for image handlers
r8250 import unittest
import base64
MinRK
zmq frontend needs a Client, Manager is optional
r10292 from IPython.kernel import KernelClient
Fernando Perez
Fix all remaining imports that used `IPython.frontend`.
r11024 from IPython.terminal.console.interactiveshell import ZMQTerminalInteractiveShell
Takafumi Arakaki
Open file after it is written
r8270 from IPython.utils.tempdir import TemporaryDirectory
Takafumi Arakaki
Add tests for image handlers
r8250 from IPython.testing.tools import monkeypatch
Takafumi Arakaki
Skip test for PIL handler when it is not available
r8251 from IPython.testing.decorators import skip_without
Takafumi Arakaki
Add tests for image handlers
r8250 from IPython.utils.ipstruct import Struct
SCRIPT_PATH = os.path.join(
os.path.abspath(os.path.dirname(__file__)), 'writetofile.py')
class ZMQTerminalInteractiveShellTestCase(unittest.TestCase):
def setUp(self):
MinRK
zmq frontend needs a Client, Manager is optional
r10292 client = KernelClient()
self.shell = ZMQTerminalInteractiveShell(kernel_client=client)
Takafumi Arakaki
Add tests for image handlers
r8250 self.raw = b'dummy data'
self.mime = 'image/png'
Takafumi Arakaki
Encode to byte before base64.decodestring
r8252 self.data = {self.mime: base64.encodestring(self.raw).decode('ascii')}
Takafumi Arakaki
Add tests for image handlers
r8250
def test_no_call_by_default(self):
def raise_if_called(*args, **kwds):
assert False
shell = self.shell
Takafumi Arakaki
Fix test_no_call_by_default...
r8267 shell.handle_image_PIL = raise_if_called
shell.handle_image_stream = raise_if_called
shell.handle_image_tempfile = raise_if_called
shell.handle_image_callable = raise_if_called
Takafumi Arakaki
Add tests for image handlers
r8250
shell.handle_image(None, None) # arguments are dummy
Takafumi Arakaki
Skip test for PIL handler when it is not available
r8251 @skip_without('PIL')
Takafumi Arakaki
Add tests for image handlers
r8250 def test_handle_image_PIL(self):
import PIL.Image
open_called_with = []
show_called_with = []
def fake_open(arg):
open_called_with.append(arg)
return Struct(show=lambda: show_called_with.append(None))
with monkeypatch(PIL.Image, 'open', fake_open):
self.shell.handle_image_PIL(self.data, self.mime)
Takafumi Arakaki
Use assertEqual when possible
r8268 self.assertEqual(len(open_called_with), 1)
self.assertEqual(len(show_called_with), 1)
self.assertEqual(open_called_with[0].getvalue(), self.raw)
Takafumi Arakaki
Add tests for image handlers
r8250
def check_handler_with_file(self, inpath, handler):
shell = self.shell
configname = '{0}_image_handler'.format(handler)
funcname = 'handle_image_{0}'.format(handler)
assert hasattr(shell, configname)
assert hasattr(shell, funcname)
Takafumi Arakaki
Open file after it is written
r8270 with TemporaryDirectory() as tmpdir:
outpath = os.path.join(tmpdir, 'data')
cmd = [sys.executable, SCRIPT_PATH, inpath, outpath]
Takafumi Arakaki
Add tests for image handlers
r8250 setattr(shell, configname, cmd)
getattr(shell, funcname)(self.data, self.mime)
Takafumi Arakaki
Open file after it is written
r8270 # cmd is called and file is closed. So it's safe to open now.
with open(outpath, 'rb') as file:
transferred = file.read()
Takafumi Arakaki
Add tests for image handlers
r8250
Takafumi Arakaki
Use assertEqual when possible
r8268 self.assertEqual(transferred, self.raw)
Takafumi Arakaki
Add tests for image handlers
r8250
def test_handle_image_stream(self):
self.check_handler_with_file('-', 'stream')
def test_handle_image_tempfile(self):
self.check_handler_with_file('{file}', 'tempfile')
def test_handle_image_callable(self):
called_with = []
self.shell.callable_image_handler = called_with.append
self.shell.handle_image_callable(self.data, self.mime)
Takafumi Arakaki
Use assertEqual when possible
r8268 self.assertEqual(len(called_with), 1)
Takafumi Arakaki
Add tests for image handlers
r8250 assert called_with[0] is self.data