Skip to content

Commit 815c0aa

Browse files
authored
Merge pull request #340 from jupyter/auto-backport-of-pr-339
Backport PR #339 on branch 5.x
2 parents 7b1114a + 9c3a902 commit 815c0aa

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

jupyter_client/kernelspec.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,14 @@ def get_all_specs(self):
254254
res = {}
255255
for kname, resource_dir in d.items():
256256
try:
257-
spec = self._get_kernel_spec_by_name(kname, resource_dir)
257+
if self.__class__ is KernelSpecManager:
258+
spec = self._get_kernel_spec_by_name(kname, resource_dir)
259+
else:
260+
# avoid calling private methods in subclasses,
261+
# which may have overridden find_kernel_specs
262+
# and get_kernel_spec, but not the newer get_all_specs
263+
spec = self.get_kernel_spec(kname)
264+
258265
res[kname] = {
259266
"resource_dir": resource_dir,
260267
"spec": spec.to_dict()

jupyter_client/tests/test_kernelspec.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
# Copyright (c) Jupyter Development Team.
55
# Distributed under the terms of the Modified BSD License.
66

7+
import copy
78
import io
89
import json
910
from logging import StreamHandler
1011
import os
1112
from os.path import join as pjoin
1213
from subprocess import Popen, PIPE, STDOUT
1314
import sys
15+
import tempfile
1416
import unittest
1517

1618
import pytest
@@ -156,7 +158,7 @@ def test_validate_kernel_name(self):
156158
'Haskell-1-2-3',
157159
]:
158160
assert kernelspec._is_valid_kernel_name(good)
159-
161+
160162
for bad in [
161163
'has space',
162164
u'ünicode',
@@ -165,4 +167,33 @@ def test_validate_kernel_name(self):
165167
]:
166168
assert not kernelspec._is_valid_kernel_name(bad)
167169

168-
170+
def test_subclass(self):
171+
"""Test get_all_specs in subclasses that override find_kernel_specs"""
172+
ksm = self.ksm
173+
resource_dir = tempfile.gettempdir()
174+
native_name = kernelspec.NATIVE_KERNEL_NAME
175+
native_kernel = ksm.get_kernel_spec(native_name)
176+
177+
class MyKSM(kernelspec.KernelSpecManager):
178+
def get_kernel_spec(self, name):
179+
spec = copy.copy(native_kernel)
180+
if name == 'fake':
181+
spec.name = name
182+
spec.resource_dir = resource_dir
183+
elif name == native_name:
184+
pass
185+
else:
186+
raise KeyError(name)
187+
return spec
188+
189+
def find_kernel_specs(self):
190+
return {
191+
'fake': resource_dir,
192+
native_name: native_kernel.resource_dir,
193+
}
194+
195+
# ensure that get_all_specs doesn't raise if only
196+
# find_kernel_specs and get_kernel_spec are defined
197+
myksm = MyKSM()
198+
specs = myksm.get_all_specs()
199+
assert sorted(specs) == ['fake', native_name]

0 commit comments

Comments
 (0)