Make kernel_name override update notebook kernelspec metadata#868
Make kernel_name override update notebook kernelspec metadata#868huyhoang171106 wants to merge 4 commits intonteract:mainfrom
kernel_name override update notebook kernelspec metadata#868Conversation
…tadata Signed-off-by: Nguyen Huy Hoang <181364121+huyhoang171106@users.noreply.github.com>
…tadata Signed-off-by: Nguyen Huy Hoang <181364121+huyhoang171106@users.noreply.github.com>
…tadata Signed-off-by: Nguyen Huy Hoang <181364121+huyhoang171106@users.noreply.github.com>
…tadata Signed-off-by: Nguyen Huy Hoang <181364121+huyhoang171106@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
This PR addresses issue #856 by ensuring that when a kernel_name override is provided to papermill (including via the CLI), the output notebook’s metadata.kernelspec is rewritten so downstream notebook consumers display the overridden kernel.
Changes:
- Add logic to persist
kernel_nameintonb.metadata.kernelspec.nameanddisplay_namebefore writing the output notebook. - Thread
kernel_nameintoprepare_notebook_metadata(...)so the rewrite happens consistently (including--prepare-only). - Add a CLI test asserting the output notebook metadata reflects the overridden kernel.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| papermill/execute.py | Introduces metadata rewrite helper and passes kernel_name into metadata preparation. |
| papermill/cli.py | Updates --kernel help text to reflect overriding notebook metadata. |
| papermill/tests/init.py | Adds a test constant for a kernel override name. |
| papermill/tests/test_cli.py | Adds a regression test validating kernelspec metadata is updated in the output notebook. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| if not kernel_name: | ||
| return nb | ||
|
|
||
| kernelspec = nb.metadata.get('kernelspec', {}) |
There was a problem hiding this comment.
_override_kernel_name_in_metadata assumes nb.metadata['kernelspec'] is a mapping; if a notebook has kernelspec=None (or any non-dict), this will raise when assigning ['name']/['display_name']. Consider normalizing kernelspec to an empty dict when it's missing or not a dict-like object before writing into it.
| kernelspec = nb.metadata.get('kernelspec', {}) | |
| kernelspec = nb.metadata.get('kernelspec') | |
| if not kernelspec: | |
| kernelspec = {} | |
| elif not isinstance(kernelspec, dict): | |
| # Normalize non-dict, mapping-like objects to a plain dict; fall back to empty dict otherwise. | |
| try: | |
| kernelspec = dict(kernelspec) | |
| except TypeError: | |
| kernelspec = {} |
Summary
The current execution flow appears to pass
kernel_nameto the execution engine, but does not reliably persist that override into the output notebook metadata. As a result, notebook consumers (e.g., JupyterHub UI) still show the originalkernelspec.display_nameand/orkernelspec.name. This file should be updated so that whenkernel_nameis provided, the in-memory notebook object has its metadata rewritten before output is saved.Files changed
papermill/execute.py(modified)papermill/cli.py(modified)papermill/tests/__init__.py(modified)papermill/tests/test_cli.py(modified)Testing
What does this PR do?
Fixes #<issue_number>
Closes #856