Show More
@@ -523,7 +523,6 b' class InteractiveShell(SingletonConfigurable):' | |||||
523 | self.init_pdb() |
|
523 | self.init_pdb() | |
524 | self.init_extension_manager() |
|
524 | self.init_extension_manager() | |
525 | self.init_payload() |
|
525 | self.init_payload() | |
526 | self.init_comms() |
|
|||
527 | self.hooks.late_startup_hook() |
|
526 | self.hooks.late_startup_hook() | |
528 | self.events.trigger('shell_initialized', self) |
|
527 | self.events.trigger('shell_initialized', self) | |
529 | atexit.register(self.atexit_operations) |
|
528 | atexit.register(self.atexit_operations) | |
@@ -2419,14 +2418,6 b' class InteractiveShell(SingletonConfigurable):' | |||||
2419 | self.configurables.append(self.payload_manager) |
|
2418 | self.configurables.append(self.payload_manager) | |
2420 |
|
2419 | |||
2421 | #------------------------------------------------------------------------- |
|
2420 | #------------------------------------------------------------------------- | |
2422 | # Things related to widgets |
|
|||
2423 | #------------------------------------------------------------------------- |
|
|||
2424 |
|
||||
2425 | def init_comms(self): |
|
|||
2426 | # not implemented in the base class |
|
|||
2427 | pass |
|
|||
2428 |
|
||||
2429 | #------------------------------------------------------------------------- |
|
|||
2430 | # Things related to the prefilter |
|
2421 | # Things related to the prefilter | |
2431 | #------------------------------------------------------------------------- |
|
2422 | #------------------------------------------------------------------------- | |
2432 |
|
2423 |
@@ -22,6 +22,9 b' from IPython.utils.py3compat import annotate' | |||||
22 | class DummyComm(Comm): |
|
22 | class DummyComm(Comm): | |
23 | comm_id = 'a-b-c-d' |
|
23 | comm_id = 'a-b-c-d' | |
24 |
|
24 | |||
|
25 | def open(self, *args, **kwargs): | |||
|
26 | pass | |||
|
27 | ||||
25 | def send(self, *args, **kwargs): |
|
28 | def send(self, *args, **kwargs): | |
26 | pass |
|
29 | pass | |
27 |
|
30 |
@@ -6,7 +6,7 b'' | |||||
6 | import uuid |
|
6 | import uuid | |
7 |
|
7 | |||
8 | from IPython.config import LoggingConfigurable |
|
8 | from IPython.config import LoggingConfigurable | |
9 | from IPython.core.getipython import get_ipython |
|
9 | from IPython.kernel.zmq.kernelbase import Kernel | |
10 |
|
10 | |||
11 | from IPython.utils.jsonutil import json_clean |
|
11 | from IPython.utils.jsonutil import json_clean | |
12 | from IPython.utils.traitlets import Instance, Unicode, Bytes, Bool, Dict, Any |
|
12 | from IPython.utils.traitlets import Instance, Unicode, Bytes, Bool, Dict, Any | |
@@ -14,18 +14,21 b' from IPython.utils.traitlets import Instance, Unicode, Bytes, Bool, Dict, Any' | |||||
14 |
|
14 | |||
15 | class Comm(LoggingConfigurable): |
|
15 | class Comm(LoggingConfigurable): | |
16 |
|
16 | |||
17 | shell = Instance('IPython.core.interactiveshell.InteractiveShellABC') |
|
17 | # If this is instantiated by a non-IPython kernel, shell will be None | |
18 | def _shell_default(self): |
|
18 | shell = Instance('IPython.core.interactiveshell.InteractiveShellABC', | |
19 | return get_ipython() |
|
19 | allow_none=True) | |
|
20 | kernel = Instance('IPython.kernel.zmq.kernelbase.Kernel') | |||
|
21 | def _kernel_default(self): | |||
|
22 | if Kernel.initialized(): | |||
|
23 | return Kernel.instance() | |||
20 |
|
24 | |||
21 | iopub_socket = Any() |
|
25 | iopub_socket = Any() | |
22 | def _iopub_socket_default(self): |
|
26 | def _iopub_socket_default(self): | |
23 |
return self. |
|
27 | return self.kernel.iopub_socket | |
24 | session = Instance('IPython.kernel.zmq.session.Session') |
|
28 | session = Instance('IPython.kernel.zmq.session.Session') | |
25 | def _session_default(self): |
|
29 | def _session_default(self): | |
26 | if self.shell is None or not hasattr(self.shell, 'kernel'): |
|
30 | if self.kernel is not None: | |
27 | return |
|
31 | return self.kernel.session | |
28 | return self.shell.kernel.session |
|
|||
29 |
|
32 | |||
30 | target_name = Unicode('comm') |
|
33 | target_name = Unicode('comm') | |
31 |
|
34 | |||
@@ -56,16 +59,15 b' class Comm(LoggingConfigurable):' | |||||
56 |
|
59 | |||
57 | def _publish_msg(self, msg_type, data=None, metadata=None, **keys): |
|
60 | def _publish_msg(self, msg_type, data=None, metadata=None, **keys): | |
58 | """Helper for sending a comm message on IOPub""" |
|
61 | """Helper for sending a comm message on IOPub""" | |
59 | if self.session is not None: |
|
62 | data = {} if data is None else data | |
60 |
|
|
63 | metadata = {} if metadata is None else metadata | |
61 | metadata = {} if metadata is None else metadata |
|
64 | content = json_clean(dict(data=data, comm_id=self.comm_id, **keys)) | |
62 | content = json_clean(dict(data=data, comm_id=self.comm_id, **keys)) |
|
65 | self.session.send(self.iopub_socket, msg_type, | |
63 | self.session.send(self.iopub_socket, msg_type, |
|
66 | content, | |
64 | content, |
|
67 | metadata=json_clean(metadata), | |
65 | metadata=json_clean(metadata), |
|
68 | parent=self.kernel._parent_header, | |
66 |
|
|
69 | ident=self.topic, | |
67 | ident=self.topic, |
|
70 | ) | |
68 | ) |
|
|||
69 |
|
71 | |||
70 | def __del__(self): |
|
72 | def __del__(self): | |
71 | """trigger close on gc""" |
|
73 | """trigger close on gc""" | |
@@ -77,10 +79,13 b' class Comm(LoggingConfigurable):' | |||||
77 | """Open the frontend-side version of this comm""" |
|
79 | """Open the frontend-side version of this comm""" | |
78 | if data is None: |
|
80 | if data is None: | |
79 | data = self._open_data |
|
81 | data = self._open_data | |
|
82 | comm_manager = getattr(self.kernel, 'comm_manager', None) | |||
|
83 | if comm_manager is None: | |||
|
84 | raise RuntimeError("Comms cannot be opened without a kernel " | |||
|
85 | "and a comm_manager attached to that kernel.") | |||
|
86 | ||||
|
87 | comm_manager.register_comm(self) | |||
80 | self._closed = False |
|
88 | self._closed = False | |
81 | ip = get_ipython() |
|
|||
82 | if hasattr(ip, 'comm_manager'): |
|
|||
83 | ip.comm_manager.register_comm(self) |
|
|||
84 | self._publish_msg('comm_open', data, metadata, target_name=self.target_name) |
|
89 | self._publish_msg('comm_open', data, metadata, target_name=self.target_name) | |
85 |
|
90 | |||
86 | def close(self, data=None, metadata=None): |
|
91 | def close(self, data=None, metadata=None): | |
@@ -91,9 +96,7 b' class Comm(LoggingConfigurable):' | |||||
91 | if data is None: |
|
96 | if data is None: | |
92 | data = self._close_data |
|
97 | data = self._close_data | |
93 | self._publish_msg('comm_close', data, metadata) |
|
98 | self._publish_msg('comm_close', data, metadata) | |
94 | ip = get_ipython() |
|
99 | self.kernel.comm_manager.unregister_comm(self) | |
95 | if hasattr(ip, 'comm_manager'): |
|
|||
96 | ip.comm_manager.unregister_comm(self) |
|
|||
97 | self._closed = True |
|
100 | self._closed = True | |
98 |
|
101 | |||
99 | def send(self, data=None, metadata=None): |
|
102 | def send(self, data=None, metadata=None): | |
@@ -132,9 +135,11 b' class Comm(LoggingConfigurable):' | |||||
132 | """Handle a comm_msg message""" |
|
135 | """Handle a comm_msg message""" | |
133 | self.log.debug("handle_msg[%s](%s)", self.comm_id, msg) |
|
136 | self.log.debug("handle_msg[%s](%s)", self.comm_id, msg) | |
134 | if self._msg_callback: |
|
137 | if self._msg_callback: | |
135 | self.shell.events.trigger('pre_execute') |
|
138 | if self.shell: | |
|
139 | self.shell.events.trigger('pre_execute') | |||
136 | self._msg_callback(msg) |
|
140 | self._msg_callback(msg) | |
137 | self.shell.events.trigger('post_execute') |
|
141 | if self.shell: | |
|
142 | self.shell.events.trigger('post_execute') | |||
138 |
|
143 | |||
139 |
|
144 | |||
140 | __all__ = ['Comm'] |
|
145 | __all__ = ['Comm'] |
@@ -28,17 +28,17 b' def lazy_keys(dikt):' | |||||
28 | class CommManager(LoggingConfigurable): |
|
28 | class CommManager(LoggingConfigurable): | |
29 | """Manager for Comms in the Kernel""" |
|
29 | """Manager for Comms in the Kernel""" | |
30 |
|
30 | |||
31 | shell = Instance('IPython.core.interactiveshell.InteractiveShellABC') |
|
31 | # If this is instantiated by a non-IPython kernel, shell will be None | |
32 | def _shell_default(self): |
|
32 | shell = Instance('IPython.core.interactiveshell.InteractiveShellABC', | |
33 | return get_ipython() |
|
33 | allow_none=True) | |
|
34 | kernel = Instance('IPython.kernel.zmq.kernelbase.Kernel') | |||
|
35 | ||||
34 | iopub_socket = Any() |
|
36 | iopub_socket = Any() | |
35 | def _iopub_socket_default(self): |
|
37 | def _iopub_socket_default(self): | |
36 |
return self. |
|
38 | return self.kernel.iopub_socket | |
37 | session = Instance('IPython.kernel.zmq.session.Session') |
|
39 | session = Instance('IPython.kernel.zmq.session.Session') | |
38 | def _session_default(self): |
|
40 | def _session_default(self): | |
39 | if self.shell is None: |
|
41 | return self.kernel.session | |
40 | return |
|
|||
41 | return self.shell.kernel.session |
|
|||
42 |
|
42 | |||
43 | comms = Dict() |
|
43 | comms = Dict() | |
44 | targets = Dict() |
|
44 | targets = Dict() | |
@@ -68,6 +68,7 b' class CommManager(LoggingConfigurable):' | |||||
68 | """Register a new comm""" |
|
68 | """Register a new comm""" | |
69 | comm_id = comm.comm_id |
|
69 | comm_id = comm.comm_id | |
70 | comm.shell = self.shell |
|
70 | comm.shell = self.shell | |
|
71 | comm.kernel = self.kernel | |||
71 | comm.iopub_socket = self.iopub_socket |
|
72 | comm.iopub_socket = self.iopub_socket | |
72 | self.comms[comm_id] = comm |
|
73 | self.comms[comm_id] = comm | |
73 | return comm_id |
|
74 | return comm_id | |
@@ -102,6 +103,7 b' class CommManager(LoggingConfigurable):' | |||||
102 | f = self.targets.get(target_name, None) |
|
103 | f = self.targets.get(target_name, None) | |
103 | comm = Comm(comm_id=comm_id, |
|
104 | comm = Comm(comm_id=comm_id, | |
104 | shell=self.shell, |
|
105 | shell=self.shell, | |
|
106 | kernel=self.kernel, | |||
105 | iopub_socket=self.iopub_socket, |
|
107 | iopub_socket=self.iopub_socket, | |
106 | primary=False, |
|
108 | primary=False, | |
107 | ) |
|
109 | ) |
@@ -10,6 +10,7 b' from IPython.utils.tokenutil import token_at_cursor' | |||||
10 | from IPython.utils.traitlets import Instance, Type, Any |
|
10 | from IPython.utils.traitlets import Instance, Type, Any | |
11 | from IPython.utils.decorators import undoc |
|
11 | from IPython.utils.decorators import undoc | |
12 |
|
12 | |||
|
13 | from ..comm import CommManager | |||
13 | from .kernelbase import Kernel as KernelBase |
|
14 | from .kernelbase import Kernel as KernelBase | |
14 | from .serialize import serialize_object, unpack_apply_message |
|
15 | from .serialize import serialize_object, unpack_apply_message | |
15 | from .zmqshell import ZMQInteractiveShell |
|
16 | from .zmqshell import ZMQInteractiveShell | |
@@ -55,10 +56,12 b' class IPythonKernel(KernelBase):' | |||||
55 | # TMP - hack while developing |
|
56 | # TMP - hack while developing | |
56 | self.shell._reply_content = None |
|
57 | self.shell._reply_content = None | |
57 |
|
58 | |||
|
59 | self.comm_manager = CommManager(shell=self.shell, parent=self, | |||
|
60 | kernel=self) | |||
|
61 | self.shell.configurables.append(self.comm_manager) | |||
58 | comm_msg_types = [ 'comm_open', 'comm_msg', 'comm_close' ] |
|
62 | comm_msg_types = [ 'comm_open', 'comm_msg', 'comm_close' ] | |
59 | comm_manager = self.shell.comm_manager |
|
|||
60 | for msg_type in comm_msg_types: |
|
63 | for msg_type in comm_msg_types: | |
61 | self.shell_handlers[msg_type] = getattr(comm_manager, msg_type) |
|
64 | self.shell_handlers[msg_type] = getattr(self.comm_manager, msg_type) | |
62 |
|
65 | |||
63 | # Kernel info fields |
|
66 | # Kernel info fields | |
64 | implementation = 'ipython' |
|
67 | implementation = 'ipython' |
@@ -302,7 +302,7 b' class IPKernelApp(BaseIPythonApplication, InteractiveShellApp,' | |||||
302 | shell_stream = ZMQStream(self.shell_socket) |
|
302 | shell_stream = ZMQStream(self.shell_socket) | |
303 | control_stream = ZMQStream(self.control_socket) |
|
303 | control_stream = ZMQStream(self.control_socket) | |
304 |
|
304 | |||
305 | kernel_factory = self.kernel_class |
|
305 | kernel_factory = self.kernel_class.instance | |
306 |
|
306 | |||
307 | kernel = kernel_factory(parent=self, session=self.session, |
|
307 | kernel = kernel_factory(parent=self, session=self.session, | |
308 | shell_streams=[shell_stream, control_stream], |
|
308 | shell_streams=[shell_stream, control_stream], |
@@ -19,7 +19,7 b' import zmq' | |||||
19 | from zmq.eventloop import ioloop |
|
19 | from zmq.eventloop import ioloop | |
20 | from zmq.eventloop.zmqstream import ZMQStream |
|
20 | from zmq.eventloop.zmqstream import ZMQStream | |
21 |
|
21 | |||
22 | from IPython.config.configurable import Configurable |
|
22 | from IPython.config.configurable import SingletonConfigurable | |
23 | from IPython.core.error import StdinNotImplementedError |
|
23 | from IPython.core.error import StdinNotImplementedError | |
24 | from IPython.core import release |
|
24 | from IPython.core import release | |
25 | from IPython.utils import py3compat |
|
25 | from IPython.utils import py3compat | |
@@ -32,7 +32,7 b' from IPython.utils.traitlets import (' | |||||
32 | from .session import Session |
|
32 | from .session import Session | |
33 |
|
33 | |||
34 |
|
34 | |||
35 | class Kernel(Configurable): |
|
35 | class Kernel(SingletonConfigurable): | |
36 |
|
36 | |||
37 | #--------------------------------------------------------------------------- |
|
37 | #--------------------------------------------------------------------------- | |
38 | # Kernel interface |
|
38 | # Kernel interface |
@@ -49,7 +49,6 b' from IPython.utils.warn import error' | |||||
49 | from IPython.kernel.zmq.displayhook import ZMQShellDisplayHook |
|
49 | from IPython.kernel.zmq.displayhook import ZMQShellDisplayHook | |
50 | from IPython.kernel.zmq.datapub import ZMQDataPublisher |
|
50 | from IPython.kernel.zmq.datapub import ZMQDataPublisher | |
51 | from IPython.kernel.zmq.session import extract_header |
|
51 | from IPython.kernel.zmq.session import extract_header | |
52 | from IPython.kernel.comm import CommManager |
|
|||
53 | from .session import Session |
|
52 | from .session import Session | |
54 |
|
53 | |||
55 | #----------------------------------------------------------------------------- |
|
54 | #----------------------------------------------------------------------------- | |
@@ -563,10 +562,6 b' class ZMQInteractiveShell(InteractiveShell):' | |||||
563 | super(ZMQInteractiveShell, self).init_magics() |
|
562 | super(ZMQInteractiveShell, self).init_magics() | |
564 | self.register_magics(KernelMagics) |
|
563 | self.register_magics(KernelMagics) | |
565 | self.magics_manager.register_alias('ed', 'edit') |
|
564 | self.magics_manager.register_alias('ed', 'edit') | |
566 |
|
||||
567 | def init_comms(self): |
|
|||
568 | self.comm_manager = CommManager(shell=self, parent=self) |
|
|||
569 | self.configurables.append(self.comm_manager) |
|
|||
570 |
|
565 | |||
571 |
|
566 | |||
572 | InteractiveShellABC.register(ZMQInteractiveShell) |
|
567 | InteractiveShellABC.register(ZMQInteractiveShell) |
General Comments 0
You need to be logged in to leave comments.
Login now