From 3eb6d72bb510b4f0698119f36963a0ad8d7c8bd5 Mon Sep 17 00:00:00 2001 From: Thomas Kluyver Date: Fri, 15 Dec 2017 11:30:24 +0000 Subject: [PATCH 1/2] Find available kernelspecs more efficiently Closes gh-3135 --- notebook/services/kernelspecs/handlers.py | 30 ++++++++++++++--------- setup.py | 2 +- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/notebook/services/kernelspecs/handlers.py b/notebook/services/kernelspecs/handlers.py index 7de1e2b093..d272db2f71 100644 --- a/notebook/services/kernelspecs/handlers.py +++ b/notebook/services/kernelspecs/handlers.py @@ -16,17 +16,19 @@ from ...base.handlers import APIHandler from ...utils import url_path_join, url_unescape -def kernelspec_model(handler, name): +def kernelspec_model(handler, name, spec_dict, resource_dir): """Load a KernelSpec by name and return the REST API model""" - ksm = handler.kernel_spec_manager - spec = ksm.get_kernel_spec(name) - d = {'name': name} - d['spec'] = spec.to_dict() - d['resources'] = resources = {} - resource_dir = spec.resource_dir + d = { + 'name': name, + 'spec': spec_dict, + 'resources': {} + } + + # Add resource files if they exist + resource_dir = resource_dir for resource in ['kernel.js', 'kernel.css']: if os.path.exists(pjoin(resource_dir, resource)): - resources[resource] = url_path_join( + d['resources'][resource] = url_path_join( handler.base_url, 'kernelspecs', name, @@ -35,7 +37,7 @@ def kernelspec_model(handler, name): for logo_file in glob.glob(pjoin(resource_dir, 'logo-*')): fname = os.path.basename(logo_file) no_ext, _ = os.path.splitext(fname) - resources[no_ext] = url_path_join( + d['resources'][no_ext] = url_path_join( handler.base_url, 'kernelspecs', name, @@ -52,9 +54,10 @@ def get(self): model = {} model['default'] = km.default_kernel_name model['kernelspecs'] = specs = {} - for kernel_name in ksm.find_kernel_specs(): + for kernel_name, kernel_info in ksm.get_all_specs().items(): try: - d = kernelspec_model(self, kernel_name) + d = kernelspec_model(self, kernel_name, kernel_info['spec'], + kernel_info['resource_dir']) except Exception: self.log.error("Failed to load kernel spec: '%s'", kernel_name, exc_info=True) continue @@ -67,10 +70,13 @@ class KernelSpecHandler(APIHandler): @web.authenticated def get(self, kernel_name): + ksm = self.kernel_spec_manager + kernel_name = url_unescape(kernel_name) try: - model = kernelspec_model(self, url_unescape(kernel_name)) + spec = ksm.get_kernel_spec(kernel_name) except KeyError: raise web.HTTPError(404, u'Kernel spec %s not found' % kernel_name) + model = kernelspec_model(self, kernel_name, spec.to_dict(), spec.resource_dir) self.set_header("Content-Type", 'application/json') self.finish(json.dumps(model)) diff --git a/setup.py b/setup.py index ace0ac4f4f..87c12ee942 100755 --- a/setup.py +++ b/setup.py @@ -148,7 +148,7 @@ 'ipython_genutils', 'traitlets>=4.2.1', 'jupyter_core>=4.4.0', - 'jupyter_client', + 'jupyter_client>=4.2.0', 'nbformat', 'nbconvert', 'ipykernel', # bless IPython kernel for now From 3f035c5ba9ecd38ce944a87e7e5826f15eb8b208 Mon Sep 17 00:00:00 2001 From: Thomas Kluyver Date: Tue, 19 Dec 2017 14:03:50 +0000 Subject: [PATCH 2/2] Bump jupyter_client dependency to 5.2 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 87c12ee942..58dcb87717 100755 --- a/setup.py +++ b/setup.py @@ -148,7 +148,7 @@ 'ipython_genutils', 'traitlets>=4.2.1', 'jupyter_core>=4.4.0', - 'jupyter_client>=4.2.0', + 'jupyter_client>=5.2.0', 'nbformat', 'nbconvert', 'ipykernel', # bless IPython kernel for now