##// END OF EJS Templates
handle missing kernel...
Min RK -
Show More
@@ -25,6 +25,7 b' define(['
25 // Make the object globally available for user convenience & inspection
25 // Make the object globally available for user convenience & inspection
26 IPython.kernelselector = this;
26 IPython.kernelselector = this;
27 this._finish_load = null;
27 this._finish_load = null;
28 this._loaded = false;
28 this.loaded = new Promise(function(resolve, reject) {
29 this.loaded = new Promise(function(resolve, reject) {
29 that._finish_load = resolve;
30 that._finish_load = resolve;
30 });
31 });
@@ -83,6 +84,7 b' define(['
83
84
84 });
85 });
85 // trigger loaded promise
86 // trigger loaded promise
87 this._loaded = true;
86 this._finish_load();
88 this._finish_load();
87 };
89 };
88
90
@@ -154,28 +156,86 b' define(['
154 }
156 }
155 };
157 };
156
158
157 KernelSelector.prototype.set_kernel = function (kernel_name) {
159 KernelSelector.prototype.set_kernel = function (selected) {
158 /** set the kernel by name, ensuring kernelspecs have been loaded, first */
160 /** set the kernel by name, ensuring kernelspecs have been loaded, first
161
162 kernel can be just a kernel name, or a notebook kernelspec metadata
163 (name, project_name, display_name).
164 */
159 var that = this;
165 var that = this;
160 return this.loaded.then(function () {
166 if (typeof selected === 'string') {
161 that._set_kernel(kernel_name);
167 selected = {
162 });
168 name: selected
169 };
170 }
171 if (this._loaded) {
172 this._set_kernel(selected);
173 } else {
174 return this.loaded.then(function () {
175 that._set_kernel(selected);
176 });
177 }
163 };
178 };
164
179
165 KernelSelector.prototype._set_kernel = function (kernel_name) {
180 KernelSelector.prototype._set_kernel = function (selected) {
166 /** Actually set the kernel (kernelspecs have been loaded) */
181 /** Actually set the kernel (kernelspecs have been loaded) */
167 if (kernel_name === this.current_selection) {
182 if (selected.name === this.current_selection) {
168 // only trigger event if value changed
183 // only trigger event if value changed
169 return;
184 return;
170 }
185 }
171 var ks = this.kernelspecs[kernel_name];
186 var ks = this.kernelspecs[selected.name];
187 if (ks === undefined) {
188 if (selected.project_name && selected.project_name.length > 0) {
189 $.map(this.kernelspecs, function (k) {
190 if (k.spec.project_name === selected.project_name) {
191 ks = k;
192 }
193 });
194 }
195 // if still undefined, trigger failure event
196 if (ks === undefined) {
197 this.events.trigger("spec_not_found.Kernel", selected);
198 return;
199 }
200 }
172 if (this.notebook._session_starting) {
201 if (this.notebook._session_starting) {
173 console.error("Cannot change kernel while waiting for pending session start.");
202 console.error("Cannot change kernel while waiting for pending session start.");
174 return;
203 return;
175 }
204 }
176 this.current_selection = kernel_name;
205 this.current_selection = ks.name;
177 this.events.trigger('spec_changed.Kernel', ks);
206 this.events.trigger('spec_changed.Kernel', ks);
178 };
207 };
208
209 KernelSelector.prototype._spec_not_found = function (event, data) {
210 var that = this;
211 var select = $("<select>").addClass('form-control');
212 console.warn("Kernelspec not found:", data);
213 $.map(this.kernelspecs, function (ks) {
214 select.append(
215 $('<option/>').attr('value', ks.name).text(ks.spec.display_name)
216 );
217 });
218
219 var body = $("<form>").addClass("form-inline").append(
220 $("<span>").text(
221 "I couldn't find a kernel matching " + (data.display_name || data.name) + "." +
222 " Please select a kernel:"
223 )
224 ).append(select);
225
226 dialog.modal({
227 title : 'Kernel not found',
228 body : body,
229 buttons : {
230 OK : {
231 class : 'btn-primary',
232 click : function () {
233 that.set_kernel(select.val());
234 }
235 }
236 }
237 });
238 };
179
239
180 KernelSelector.prototype.new_notebook = function (kernel_name) {
240 KernelSelector.prototype.new_notebook = function (kernel_name) {
181
241
@@ -213,7 +273,7 b' define(['
213 KernelSelector.prototype.bind_events = function() {
273 KernelSelector.prototype.bind_events = function() {
214 var that = this;
274 var that = this;
215 this.events.on('spec_changed.Kernel', $.proxy(this._spec_changed, this));
275 this.events.on('spec_changed.Kernel', $.proxy(this._spec_changed, this));
216
276 this.events.on('spec_not_found.Kernel', $.proxy(this._spec_not_found, this));
217 this.events.on('kernel_created.Session', function (event, data) {
277 this.events.on('kernel_created.Session', function (event, data) {
218 that.set_kernel(data.kernel.name);
278 that.set_kernel(data.kernel.name);
219 });
279 });
@@ -2192,18 +2192,14 b' define(['
2192 }
2192 }
2193
2193
2194 if (this.session === null) {
2194 if (this.session === null) {
2195 var kernel_name;
2195 var kernel_name = utils.get_url_param('kernel_name');
2196 if (this.metadata.kernelspec) {
2197 var kernelspec = this.metadata.kernelspec || {};
2198 kernel_name = kernelspec.name;
2199 } else {
2200 kernel_name = utils.get_url_param('kernel_name');
2201 }
2202 if (kernel_name) {
2196 if (kernel_name) {
2203 // setting kernel_name here triggers start_session
2204 this.kernel_selector.set_kernel(kernel_name);
2197 this.kernel_selector.set_kernel(kernel_name);
2198 } else if (this.metadata.kernelspec) {
2199 this.kernel_selector.set_kernel(this.metadata.kernelspec);
2205 } else {
2200 } else {
2206 // start a new session with the server's default kernel
2201 // setting kernel via set_kernel above triggers start_session,
2202 // otherwise start a new session with the server's default kernel
2207 // spec_changed events will fire after kernel is loaded
2203 // spec_changed events will fire after kernel is loaded
2208 this.start_session();
2204 this.start_session();
2209 }
2205 }
General Comments 0
You need to be logged in to leave comments. Login now