From 1d6a0d9ed4666d261ca2b93cfc3fb561c5fdbd6f 2014-10-24 23:24:24 From: Thomas Kluyver Date: 2014-10-24 23:24:24 Subject: [PATCH] Move language info from kernelspec to kernel_info_reply --- diff --git a/IPython/html/static/notebook/js/notebook.js b/IPython/html/static/notebook/js/notebook.js index 3b03d7c..9c151be 100644 --- a/IPython/html/static/notebook/js/notebook.js +++ b/IPython/html/static/notebook/js/notebook.js @@ -207,9 +207,18 @@ define([ }); this.events.on('spec_changed.Kernel', function(event, data) { - that.set_kernelspec_metadata(data); + that.metadata.kernelspec = + {name: data.name, display_name: data.display_name}; + }); + + this.events.on('kernel_ready.Kernel', function(event, data) { + var kinfo = data.kernel.info_reply + var langinfo = kinfo.language_info || {}; + if (!langinfo.name) langinfo.name = kinfo.language; + + that.metadata.language_info = langinfo; // Mode 'null' should be plain, unhighlighted text. - cm_mode = data.codemirror_mode || data.language || 'null' + var cm_mode = langinfo.codemirror_mode || langinfo.language || 'null' that.set_codemirror_mode(cm_mode); }); @@ -329,21 +338,11 @@ define([ md: this.metadata, callback: function (md) { that.metadata = md; - }, + }, name: 'Notebook', notebook: this, keyboard_manager: this.keyboard_manager}); }; - - Notebook.prototype.set_kernelspec_metadata = function(ks) { - var tostore = {}; - $.map(ks, function(value, field) { - if (field !== 'argv' && field !== 'env') { - tostore[field] = value; - } - }); - this.metadata.kernelspec = tostore; - } // Cell indexing, retrieval, etc. @@ -1811,6 +1810,14 @@ define([ this.events.trigger('spec_changed.Kernel', this.metadata.kernelspec); } + // Set the codemirror mode from language_info metadata + if (this.metadata.language_info !== undefined) { + var langinfo = this.metadata.language_info; + // Mode 'null' should be plain, unhighlighted text. + var cm_mode = langinfo.codemirror_mode || langinfo.language || 'null' + this.set_codemirror_mode(cm_mode); + } + // Only handle 1 worksheet for now. var worksheet = content.worksheets[0]; if (worksheet !== undefined) { diff --git a/IPython/html/static/services/kernels/kernel.js b/IPython/html/static/services/kernels/kernel.js index 9ad4fcb..38ac473 100644 --- a/IPython/html/static/services/kernels/kernel.js +++ b/IPython/html/static/services/kernels/kernel.js @@ -46,6 +46,7 @@ define([ this.username = "username"; this.session_id = utils.uuid(); this._msg_callbacks = {}; + this.info_reply = {}; // kernel_info_reply stored here after starting if (typeof(WebSocket) !== 'undefined') { this.WebSocket = WebSocket; @@ -398,7 +399,8 @@ define([ this.events.trigger('kernel_starting.Kernel', {kernel: this}); // get kernel info so we know what state the kernel is in var that = this; - this.kernel_info(function () { + this.kernel_info(function (reply) { + that.info_reply = reply.content; that.events.trigger('kernel_ready.Kernel', {kernel: that}); }); }; @@ -925,7 +927,8 @@ define([ } else if (execution_state === 'starting') { this.events.trigger('kernel_starting.Kernel', {kernel: this}); var that = this; - this.kernel_info(function () { + this.kernel_info(function (reply) { + that.info_reply = reply.content; that.events.trigger('kernel_ready.Kernel', {kernel: that}); }); diff --git a/IPython/kernel/kernelspec.py b/IPython/kernel/kernelspec.py index 63ea62a..58d3250 100644 --- a/IPython/kernel/kernelspec.py +++ b/IPython/kernel/kernelspec.py @@ -36,18 +36,9 @@ def _pythonfirst(s): class KernelSpec(HasTraits): argv = List() display_name = Unicode() - language = Unicode() - codemirror_mode = Any() # can be unicode or dict - pygments_lexer = Unicode() env = Dict() resource_dir = Unicode() - def _codemirror_mode_default(self): - return self.language - - def _pygments_lexer_default(self): - return self.language - @classmethod def from_resource_dir(cls, resource_dir): """Create a KernelSpec object by reading kernel.json @@ -63,12 +54,7 @@ class KernelSpec(HasTraits): d = dict(argv=self.argv, env=self.env, display_name=self.display_name, - language=self.language, ) - if self.codemirror_mode != self.language: - d['codemirror_mode'] = self.codemirror_mode - if self.pygments_lexer != self.language: - d['pygments_lexer'] = self.pygments_lexer return d @@ -118,12 +104,8 @@ class KernelSpecManager(HasTraits): process. This will put its informatino in the user kernels directory. """ return {'argv': make_ipkernel_cmd(), - 'display_name': 'IPython (Python %d)' % (3 if PY3 else 2), - 'language': 'python', - 'codemirror_mode': {'name': 'ipython', - 'version': sys.version_info[0]}, - 'pygments_lexer': 'ipython%d' % (3 if PY3 else 2), - } + 'display_name': 'IPython (Python %d)' % (3 if PY3 else 2), + } @property def _native_kernel_resource_dir(self): diff --git a/IPython/kernel/zmq/ipkernel.py b/IPython/kernel/zmq/ipkernel.py index 793cd48..d698729 100644 --- a/IPython/kernel/zmq/ipkernel.py +++ b/IPython/kernel/zmq/ipkernel.py @@ -68,6 +68,11 @@ class IPythonKernel(KernelBase): implementation_version = release.version language = 'python' language_version = sys.version.split()[0] + language_info = {'mimetype': 'text/x-python', + 'codemirror_mode': {'name': 'ipython', + 'version': sys.version_info[0]}, + 'pygments_lexer': 'ipython%d' % (3 if PY3 else 2), + } @property def banner(self): return self.shell.banner diff --git a/IPython/kernel/zmq/kernelbase.py b/IPython/kernel/zmq/kernelbase.py index 85f7beb..42b38c0 100755 --- a/IPython/kernel/zmq/kernelbase.py +++ b/IPython/kernel/zmq/kernelbase.py @@ -60,6 +60,10 @@ class Kernel(SingletonConfigurable): def _ident_default(self): return unicode_type(uuid.uuid4()) + # This should be overridden by wrapper kernels that implement any real + # language. + language_info = {} + # Private interface _darwin_app_nap = Bool(True, config=True, @@ -453,6 +457,7 @@ class Kernel(SingletonConfigurable): 'implementation_version': self.implementation_version, 'language': self.language, 'language_version': self.language_version, + 'language_info': self.language_info, 'banner': self.banner, }