Skip to content

Commit 9c3a902

Browse files
takluyverMeeseeksDev[bot]
authored andcommitted
Backport PR #339: avoid calling private method in subclasses of KernelSpecManager
1 parent 7b1114a commit 9c3a902

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)