##// END OF EJS Templates
Backport jupyter/notebook#89...
Backport jupyter/notebook#89 fix highlighting of non-python kernels. mock the cm_config property also when set, unlike in non backported version of this PR

File last commit:

r19223:abf4ddf4
r21377:45aa5dda
Show More
client.py
156 lines | 5.5 KiB | text/x-python | PythonLexer
MinRK
update inprocess kernel to new layout...
r10298 """A client for in-process kernels."""
MinRK
split in process Manager and Client
r10297
#-----------------------------------------------------------------------------
# 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.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
MinRK
update inprocess kernel to new layout...
r10298 # IPython imports
Thomas Kluyver
Collapse Qt in-process channel classes together
r19222 from IPython.kernel.inprocess.socket import DummySocket
MinRK
update inprocess kernel to new layout...
r10298 from IPython.utils.traitlets import Type, Instance
from IPython.kernel.clientabc import KernelClientABC
from IPython.kernel.client import KernelClient
MinRK
split in process Manager and Client
r10297
MinRK
update inprocess kernel to new layout...
r10298 # Local imports
from .channels import (
Thomas Kluyver
Collapse inprocess channel classes together
r19223 InProcessChannel,
MinRK
update inprocess kernel to new layout...
r10298 InProcessHBChannel,
MinRK
split in process Manager and Client
r10297
MinRK
update inprocess kernel to new layout...
r10298 )
MinRK
split in process Manager and Client
r10297
#-----------------------------------------------------------------------------
MinRK
update inprocess kernel to new layout...
r10298 # Main kernel Client class
MinRK
split in process Manager and Client
r10297 #-----------------------------------------------------------------------------
MinRK
update inprocess kernel to new layout...
r10298 class InProcessKernelClient(KernelClient):
"""A client for an in-process kernel.
MinRK
split in process Manager and Client
r10297
This class implements the interface of
MinRK
update inprocess kernel to new layout...
r10298 `IPython.kernel.clientabc.KernelClientABC` and allows
MinRK
split in process Manager and Client
r10297 (asynchronous) frontends to be used seamlessly with an in-process kernel.
MinRK
update inprocess kernel to new layout...
r10298 See `IPython.kernel.client.KernelClient` for docstrings.
MinRK
split in process Manager and Client
r10297 """
# The classes to use for the various channels.
Thomas Kluyver
Collapse inprocess channel classes together
r19223 shell_channel_class = Type(InProcessChannel)
iopub_channel_class = Type(InProcessChannel)
stdin_channel_class = Type(InProcessChannel)
MinRK
split in process Manager and Client
r10297 hb_channel_class = Type(InProcessHBChannel)
Thomas Kluyver
Rename KernelBase & Kernel to Kernel & IPythonKernel
r17095 kernel = Instance('IPython.kernel.inprocess.ipkernel.InProcessKernel')
MinRK
split in process Manager and Client
r10297
#--------------------------------------------------------------------------
MinRK
update inprocess kernel to new layout...
r10298 # Channel management methods
MinRK
split in process Manager and Client
r10297 #--------------------------------------------------------------------------
MinRK
update inprocess kernel to new layout...
r10298 def start_channels(self, *args, **kwargs):
super(InProcessKernelClient, self).start_channels(self)
self.kernel.frontends.append(self)
MinRK
split in process Manager and Client
r10297
@property
def shell_channel(self):
if self._shell_channel is None:
self._shell_channel = self.shell_channel_class(self)
return self._shell_channel
@property
def iopub_channel(self):
if self._iopub_channel is None:
self._iopub_channel = self.iopub_channel_class(self)
return self._iopub_channel
@property
def stdin_channel(self):
if self._stdin_channel is None:
self._stdin_channel = self.stdin_channel_class(self)
return self._stdin_channel
@property
def hb_channel(self):
if self._hb_channel is None:
self._hb_channel = self.hb_channel_class(self)
return self._hb_channel
Thomas Kluyver
Collapse Qt in-process channel classes together
r19222 # Methods for sending specific messages
# -------------------------------------
def execute(self, code, silent=False, store_history=True,
user_expressions={}, allow_stdin=None):
if allow_stdin is None:
allow_stdin = self.allow_stdin
content = dict(code=code, silent=silent, store_history=store_history,
user_expressions=user_expressions,
allow_stdin=allow_stdin)
msg = self.session.msg('execute_request', content)
self._dispatch_to_kernel(msg)
return msg['header']['msg_id']
def complete(self, code, cursor_pos=None):
if cursor_pos is None:
cursor_pos = len(code)
content = dict(code=code, cursor_pos=cursor_pos)
msg = self.session.msg('complete_request', content)
self._dispatch_to_kernel(msg)
return msg['header']['msg_id']
def inspect(self, code, cursor_pos=None, detail_level=0):
if cursor_pos is None:
cursor_pos = len(code)
content = dict(code=code, cursor_pos=cursor_pos,
detail_level=detail_level,
)
msg = self.session.msg('inspect_request', content)
self._dispatch_to_kernel(msg)
return msg['header']['msg_id']
def history(self, raw=True, output=False, hist_access_type='range', **kwds):
content = dict(raw=raw, output=output,
hist_access_type=hist_access_type, **kwds)
msg = self.session.msg('history_request', content)
self._dispatch_to_kernel(msg)
return msg['header']['msg_id']
def shutdown(self, restart=False):
# FIXME: What to do here?
raise NotImplementedError('Cannot shutdown in-process kernel')
def kernel_info(self):
"""Request kernel info."""
msg = self.session.msg('kernel_info_request')
self._dispatch_to_kernel(msg)
return msg['header']['msg_id']
def input(self, string):
if self.kernel is None:
raise RuntimeError('Cannot send input reply. No kernel exists.')
self.kernel.raw_input_str = string
def _dispatch_to_kernel(self, msg):
""" Send a message to the kernel and handle a reply.
"""
kernel = self.kernel
if kernel is None:
raise RuntimeError('Cannot send request. No kernel exists.')
stream = DummySocket()
self.session.send(stream, msg)
msg_parts = stream.recv_multipart()
kernel.dispatch_shell(stream, msg_parts)
idents, reply_msg = self.session.recv(stream, copy=False)
self.shell_channel.call_handlers_later(reply_msg)
MinRK
split in process Manager and Client
r10297
#-----------------------------------------------------------------------------
# ABC Registration
#-----------------------------------------------------------------------------
MinRK
update inprocess kernel to new layout...
r10298 KernelClientABC.register(InProcessKernelClient)