##// END OF EJS Templates
Merge pull request #2649 from tkf/kernel-version...
Min RK -
r9095:22c83b3c merge
parent child Browse files
Show More
@@ -38,6 +38,9 b" __version__ = '.'.join(map(str, _ver))"
38 38 version = __version__ # backwards compatibility name
39 39 version_info = (_version_major, _version_minor, _version_micro, _version_extra)
40 40
41 # Change this when incrementing the kernel protocol version
42 kernel_protocol_version_info = (4, 0)
43
41 44 description = "IPython: Productive Interactive Computing"
42 45
43 46 long_description = \
@@ -39,6 +39,7 b' from IPython.config.configurable import Configurable'
39 39 from IPython.config.application import boolean_flag, catch_config_error
40 40 from IPython.core.application import ProfileDir
41 41 from IPython.core.error import StdinNotImplementedError
42 from IPython.core import release
42 43 from IPython.core.shellapp import (
43 44 InteractiveShellApp, shell_flags, shell_aliases
44 45 )
@@ -61,6 +62,11 b' from zmqshell import ZMQInteractiveShell'
61 62 # Main kernel class
62 63 #-----------------------------------------------------------------------------
63 64
65 protocol_version = list(release.kernel_protocol_version_info)
66 ipython_version = list(release.version_info)
67 language_version = list(sys.version_info[:3])
68
69
64 70 class Kernel(Configurable):
65 71
66 72 #---------------------------------------------------------------------------
@@ -156,6 +162,7 b' class Kernel(Configurable):'
156 162 # Build dict of handlers for message types
157 163 msg_types = [ 'execute_request', 'complete_request',
158 164 'object_info_request', 'history_request',
165 'kernel_info_request',
159 166 'connect_request', 'shutdown_request',
160 167 'apply_request',
161 168 ]
@@ -509,6 +516,17 b' class Kernel(Configurable):'
509 516 content, parent, ident)
510 517 self.log.debug("%s", msg)
511 518
519 def kernel_info_request(self, stream, ident, parent):
520 vinfo = {
521 'protocol_version': protocol_version,
522 'ipython_version': ipython_version,
523 'language_version': language_version,
524 'language': 'python',
525 }
526 msg = self.session.send(stream, 'kernel_info_reply',
527 vinfo, parent, ident)
528 self.log.debug("%s", msg)
529
512 530 def shutdown_request(self, stream, ident, parent):
513 531 self.shell.exit_now = True
514 532 content = dict(status='ok')
@@ -363,6 +363,12 b' class ShellSocketChannel(ZMQSocketChannel):'
363 363 self._queue_send(msg)
364 364 return msg['header']['msg_id']
365 365
366 def kernel_info(self):
367 """Request kernel info."""
368 msg = self.session.msg('kernel_info_request')
369 self._queue_send(msg)
370 return msg['header']['msg_id']
371
366 372 def shutdown(self, restart=False):
367 373 """Request an immediate kernel shutdown.
368 374
@@ -43,7 +43,6 b' from zmq.utils import jsonapi'
43 43 from zmq.eventloop.ioloop import IOLoop
44 44 from zmq.eventloop.zmqstream import ZMQStream
45 45
46 import IPython
47 46 from IPython.config.application import Application, boolean_flag
48 47 from IPython.config.configurable import Configurable, LoggingConfigurable
49 48 from IPython.utils.importstring import import_item
@@ -75,7 +74,6 b' def squash_unicode(obj):'
75 74 # globals and defaults
76 75 #-----------------------------------------------------------------------------
77 76
78 _version_info_list = list(IPython.version_info)
79 77 # ISO8601-ify datetime objects
80 78 json_packer = lambda obj: jsonapi.dumps(obj, default=date_default)
81 79 json_unpacker = lambda s: extract_dates(jsonapi.loads(s))
@@ -188,7 +186,6 b' class Message(object):'
188 186
189 187 def msg_header(msg_id, msg_type, username, session):
190 188 date = datetime.now()
191 version = _version_info_list
192 189 return locals()
193 190
194 191 def extract_header(msg_or_header):
@@ -21,7 +21,7 b' from ..blockingkernelmanager import BlockingKernelManager'
21 21 from IPython.testing import decorators as dec
22 22 from IPython.utils import io
23 23 from IPython.utils.traitlets import (
24 HasTraits, TraitError, Bool, Unicode, Dict, Integer, List, Enum,
24 HasTraits, TraitError, Bool, Unicode, Dict, Integer, List, Enum, Any,
25 25 )
26 26
27 27 #-----------------------------------------------------------------------------
@@ -84,6 +84,16 b" def execute(code='', **kwargs):"
84 84
85 85 class Reference(HasTraits):
86 86
87 """
88 Base class for message spec specification testing.
89
90 This class is the core of the message specification test. The
91 idea is that child classes implement trait attributes for each
92 message keys, so that message keys can be tested against these
93 traits using :meth:`check` method.
94
95 """
96
87 97 def check(self, d):
88 98 """validate a dict against our traits"""
89 99 for key in self.trait_names():
@@ -185,6 +195,25 b' class CompleteReply(Reference):'
185 195 matches = List(Unicode)
186 196
187 197
198 def Version(num, trait=Integer):
199 return List(trait, default_value=[0] * num, minlen=num, maxlen=num)
200
201
202 class KernelInfoReply(Reference):
203
204 protocol_version = Version(2)
205 ipython_version = Version(4, Any)
206 language_version = Version(3)
207 language = Unicode()
208
209 def _ipython_version_changed(self, name, old, new):
210 for v in new:
211 nt.assert_true(
212 isinstance(v, int) or isinstance(v, basestring),
213 'expected int or string as version component, got {0!r}'
214 .format(v))
215
216
188 217 # IOPub messages
189 218
190 219 class PyIn(Reference):
@@ -226,12 +255,16 b' references = {'
226 255 'object_info_reply' : OInfoReply(),
227 256 'status' : Status(),
228 257 'complete_reply' : CompleteReply(),
258 'kernel_info_reply': KernelInfoReply(),
229 259 'pyin' : PyIn(),
230 260 'pyout' : PyOut(),
231 261 'pyerr' : PyErr(),
232 262 'stream' : Stream(),
233 263 'display_data' : DisplayData(),
234 264 }
265 """
266 Specifications of `content` part of the reply messages.
267 """
235 268
236 269
237 270 def validate_message(msg, msg_type=None, parent=None):
@@ -421,6 +454,18 b' def test_complete():'
421 454 yield nt.assert_true(name in matches, "Missing match: %r" % name)
422 455
423 456
457 @dec.parametric
458 def test_kernel_info_request():
459 flush_channels()
460
461 shell = KM.shell_channel
462
463 msg_id = shell.kernel_info()
464 reply = shell.get_msg(timeout=2)
465 for tst in validate_message(reply, 'kernel_info_reply', msg_id):
466 yield tst
467
468
424 469 # IOPub channel
425 470
426 471
@@ -670,6 +670,47 b' Message type: ``connect_reply``::'
670 670 }
671 671
672 672
673 Kernel info
674 -----------
675
676 If a client needs to know what protocol the kernel supports, it can
677 ask version number of the messaging protocol supported by the kernel.
678 This message can be used to fetch other core information of the
679 kernel, including language (e.g., Python), language version number and
680 IPython version number.
681
682 Message type: ``kernel_info_request``::
683
684 content = {
685 }
686
687 Message type: ``kernel_info_reply``::
688
689 content = {
690 # Version of messaging protocol (mandatory).
691 # The first integer indicates major version. It is incremented when
692 # there is any backward incompatible change.
693 # The second integer indicates minor version. It is incremented when
694 # there is any backward compatible change.
695 'protocol_version': [int, int],
696
697 # IPython version number (optional).
698 # Non-python kernel backend may not have this version number.
699 # The last component is an extra field, which may be 'dev' or
700 # 'rc1' in development version. It is an empty string for
701 # released version.
702 'ipython_version': [int, int, int, str],
703
704 # Language version number (mandatory).
705 # It is Python version number (e.g., [2, 7, 3]) for the kernel
706 # included in IPython.
707 'language_version': [int, ...],
708
709 # Programming language in which kernel is implemented (mandatory).
710 # Kernel included in IPython returns 'python'.
711 'language': str,
712 }
713
673 714
674 715 Kernel shutdown
675 716 ---------------
General Comments 0
You need to be logged in to leave comments. Login now