Skip to content

Commit 2d9a992

Browse files
committed
fix: Allow null kernelspec in OverwriteKernelspec
The Notebook.kernelspec field is nullable, so in the event of a null value, OverwriteKernelspec should not fail. This commit checks for that case before trying to `json.loads` the value.
1 parent ca8370f commit 2d9a992

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

nbgrader/preprocessors/overwritekernelspec.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ def preprocess(self, nb: NotebookNode, resources: ResourcesDict) -> Tuple[Notebo
1717
db_url = resources['nbgrader']['db_url']
1818

1919
with Gradebook(db_url) as gb:
20-
kernelspec = json.loads(
21-
gb.find_notebook(notebook_id, assignment_id).kernelspec)
22-
self.log.debug("Source notebook kernelspec: {}".format(kernelspec))
23-
self.log.debug(
24-
"Submitted notebook kernelspec: {}"
25-
"".format(nb.metadata.get('kernelspec', None))
26-
)
27-
if kernelspec:
20+
kernelspec = gb.find_notebook(notebook_id, assignment_id).kernelspec
21+
if kernelspec is not None:
22+
kernelspec = json.loads(kernelspec)
23+
self.log.debug("Source notebook kernelspec: {}".format(kernelspec))
24+
self.log.debug(
25+
"Submitted notebook kernelspec: {}"
26+
"".format(nb.metadata.get('kernelspec', None))
27+
)
2828
self.log.debug(
2929
"Overwriting submitted notebook kernelspec: {}"
3030
"".format(kernelspec)

nbgrader/tests/preprocessors/test_overwritekernelspec.py

+20-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class TestOverwriteKernelSpec(BaseTestPreprocessor):
4141

4242
def test_overwrite_kernelspec(self, preprocessors, resources, gradebook):
4343
kernelspec = dict(
44-
display_name='blarg',
44+
display_name='Python 3',
4545
name='python3',
4646
language='python',
4747
)
@@ -57,3 +57,22 @@ def test_overwrite_kernelspec(self, preprocessors, resources, gradebook):
5757
notebook = gradebook.find_notebook("test", "ps0")
5858
assert nb.metadata['kernelspec'] == kernelspec
5959
assert json.loads(notebook.kernelspec) == kernelspec
60+
61+
def test_overwrite_kernelspec_null_spec(self, preprocessors, resources, gradebook):
62+
# Create a notebook without a kernelspec
63+
gradebook.add_notebook("test", "ps0")
64+
65+
kernelspec = dict(
66+
display_name="Python 3",
67+
name="python3",
68+
language="python",
69+
)
70+
71+
nb = new_notebook()
72+
nb.metadata["kernelspec"] = kernelspec
73+
nb, resources = preprocessors[1].preprocess(nb, resources)
74+
75+
validate(nb)
76+
notebook = gradebook.find_notebook("test", "ps0")
77+
assert notebook.kernelspec is None
78+
assert nb.metadata["kernelspec"] == kernelspec

0 commit comments

Comments
 (0)