##// END OF EJS Templates
Merge pull request #4303 from ipython/multidir...
Merge pull request #4303 from ipython/multidir Add multidirectory support for the Notebook. Major change to URL schemes in the notebook server, documented in [IPEP 16](https://github.com/ipython/ipython/wiki/IPEP-16%3A-Notebook-multi-directory-dashboard-and-URL-mapping).

File last commit:

r11009:e16cf2f8
r13184:1274dc14 merge
Show More
kernel_mixins.py
220 lines | 7.0 KiB | text/x-python | PythonLexer
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408 """ Defines a KernelManager that provides signals and slots.
"""
# System library imports.
from IPython.external.qt import QtCore
# IPython imports.
epatters
BUG: QtKernelManagerMixin does not define PyQt4-safe signals.
r8456 from IPython.utils.traitlets import HasTraits, Type
from util import MetaQObjectHasTraits, SuperQObject
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408
class ChannelQObject(SuperQObject):
# Emitted when the channel is started.
started = QtCore.Signal()
# Emitted when the channel is stopped.
stopped = QtCore.Signal()
#---------------------------------------------------------------------------
# Channel interface
#---------------------------------------------------------------------------
def start(self):
""" Reimplemented to emit signal.
"""
super(ChannelQObject, self).start()
self.started.emit()
def stop(self):
""" Reimplemented to emit signal.
"""
super(ChannelQObject, self).stop()
self.stopped.emit()
#---------------------------------------------------------------------------
epatters
REFACTOR: Terminology change: 'embedded' -> 'in-process'.
r8471 # InProcessChannel interface
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408 #---------------------------------------------------------------------------
def call_handlers_later(self, *args, **kwds):
""" Call the message handlers later.
"""
do_later = lambda: self.call_handlers(*args, **kwds)
QtCore.QTimer.singleShot(0, do_later)
def process_events(self):
""" Process any pending GUI events.
"""
QtCore.QCoreApplication.instance().processEvents()
class QtShellChannelMixin(ChannelQObject):
# Emitted when any message is received.
message_received = QtCore.Signal(object)
MinRK
update Qt to use KernelClient
r10288 # Emitted when a reply has been received for the corresponding request type.
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408 execute_reply = QtCore.Signal(object)
complete_reply = QtCore.Signal(object)
object_info_reply = QtCore.Signal(object)
history_reply = QtCore.Signal(object)
#---------------------------------------------------------------------------
Brian Granger
Cleanup naming and organization of channels....
r9120 # 'ShellChannel' interface
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408 #---------------------------------------------------------------------------
def call_handlers(self, msg):
""" Reimplemented to emit signals instead of making callbacks.
"""
# Emit the generic signal.
self.message_received.emit(msg)
# Emit signals for specialized message types.
msg_type = msg['header']['msg_type']
signal = getattr(self, msg_type, None)
if signal:
signal.emit(msg)
Brian Granger
Cleanup naming and organization of channels....
r9120 class QtIOPubChannelMixin(ChannelQObject):
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408
# Emitted when any message is received.
message_received = QtCore.Signal(object)
# Emitted when a message of type 'stream' is received.
stream_received = QtCore.Signal(object)
# Emitted when a message of type 'pyin' is received.
pyin_received = QtCore.Signal(object)
# Emitted when a message of type 'pyout' is received.
pyout_received = QtCore.Signal(object)
# Emitted when a message of type 'pyerr' is received.
pyerr_received = QtCore.Signal(object)
# Emitted when a message of type 'display_data' is received
display_data_received = QtCore.Signal(object)
# Emitted when a crash report message is received from the kernel's
# last-resort sys.excepthook.
crash_received = QtCore.Signal(object)
# Emitted when a shutdown is noticed.
shutdown_reply_received = QtCore.Signal(object)
#---------------------------------------------------------------------------
Brian Granger
Cleanup naming and organization of channels....
r9120 # 'IOPubChannel' interface
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408 #---------------------------------------------------------------------------
def call_handlers(self, msg):
""" Reimplemented to emit signals instead of making callbacks.
"""
# Emit the generic signal.
self.message_received.emit(msg)
# Emit signals for specialized message types.
msg_type = msg['header']['msg_type']
signal = getattr(self, msg_type + '_received', None)
if signal:
signal.emit(msg)
elif msg_type in ('stdout', 'stderr'):
self.stream_received.emit(msg)
def flush(self):
""" Reimplemented to ensure that signals are dispatched immediately.
"""
Brian Granger
Cleanup naming and organization of channels....
r9120 super(QtIOPubChannelMixin, self).flush()
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408 QtCore.QCoreApplication.instance().processEvents()
class QtStdInChannelMixin(ChannelQObject):
# Emitted when any message is received.
message_received = QtCore.Signal(object)
# Emitted when an input request is received.
input_requested = QtCore.Signal(object)
#---------------------------------------------------------------------------
Brian Granger
Cleanup naming and organization of channels....
r9120 # 'StdInChannel' interface
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408 #---------------------------------------------------------------------------
def call_handlers(self, msg):
""" Reimplemented to emit signals instead of making callbacks.
"""
# Emit the generic signal.
self.message_received.emit(msg)
# Emit signals for specialized message types.
msg_type = msg['header']['msg_type']
if msg_type == 'input_request':
self.input_requested.emit(msg)
class QtHBChannelMixin(ChannelQObject):
# Emitted when the kernel has died.
kernel_died = QtCore.Signal(object)
#---------------------------------------------------------------------------
Brian Granger
Cleanup naming and organization of channels....
r9120 # 'HBChannel' interface
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408 #---------------------------------------------------------------------------
def call_handlers(self, since_last_heartbeat):
""" Reimplemented to emit signals instead of making callbacks.
"""
# Emit the generic signal.
self.kernel_died.emit(since_last_heartbeat)
MinRK
add QtKernelManager with restarter
r10308 class QtKernelRestarterMixin(HasTraits, SuperQObject):
__metaclass__ = MetaQObjectHasTraits
_timer = None
class QtKernelManagerMixin(HasTraits, SuperQObject):
""" A KernelClient that provides signals and slots.
"""
__metaclass__ = MetaQObjectHasTraits
kernel_restarted = QtCore.Signal()
MinRK
update Qt to use KernelClient
r10288 class QtKernelClientMixin(HasTraits, SuperQObject):
""" A KernelClient that provides signals and slots.
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408 """
epatters
BUG: QtKernelManagerMixin does not define PyQt4-safe signals.
r8456 __metaclass__ = MetaQObjectHasTraits
MinRK
update Qt to use KernelClient
r10288 # Emitted when the kernel client has started listening.
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408 started_channels = QtCore.Signal()
MinRK
update Qt to use KernelClient
r10288 # Emitted when the kernel client has stopped listening.
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408 stopped_channels = QtCore.Signal()
# Use Qt-specific channel classes that emit signals.
Brian Granger
Cleanup naming and organization of channels....
r9120 iopub_channel_class = Type(QtIOPubChannelMixin)
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408 shell_channel_class = Type(QtShellChannelMixin)
stdin_channel_class = Type(QtStdInChannelMixin)
hb_channel_class = Type(QtHBChannelMixin)
#---------------------------------------------------------------------------
MinRK
update Qt to use KernelClient
r10288 # 'KernelClient' interface
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408 #---------------------------------------------------------------------------
#------ Channel management -------------------------------------------------
def start_channels(self, *args, **kw):
""" Reimplemented to emit signal.
"""
MinRK
update Qt to use KernelClient
r10288 super(QtKernelClientMixin, self).start_channels(*args, **kw)
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408 self.started_channels.emit()
def stop_channels(self):
""" Reimplemented to emit signal.
"""
MinRK
update Qt to use KernelClient
r10288 super(QtKernelClientMixin, self).stop_channels()
epatters
Refactor kernel managers in preparation for the EmbeddedKernel.
r8408 self.stopped_channels.emit()