Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 36 additions & 1 deletion IPython/core/magics/basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from logging import error
import io
import os
import platform
from pprint import pformat
import sys
from warnings import warn
Expand Down Expand Up @@ -603,10 +604,44 @@ def notebook(self, s):
)
cells.append(cell)

nb = v4.new_notebook(cells=cells)
kernel_language_info = self._get_kernel_language_info()

nb = v4.new_notebook(
cells=cells,
metadata={
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3",
},
"language_info": kernel_language_info
or {
"codemirror_mode": {
"name": "ipython",
"version": sys.version_info[0],
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": platform.python_version(),
},
},
)
with io.open(outfname, "w", encoding="utf-8") as f:
write(nb, f, version=4)

def _get_kernel_language_info(self) -> dict | None:
"""Get language info from kernel, useful when used in Jupyter Console where kernels exist."""
if not hasattr(self.shell, "kernel"):
return
if not hasattr(self.shell.kernel, "language_info"):
return
if not isinstance(self.shell.kernel.language_info, dict):
return
return self.shell.kernel.language_info

@magics_class
class AsyncMagics(BasicMagics):

Expand Down
13 changes: 13 additions & 0 deletions tests/test_magic.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@

import gc
import io
import json
import os
import platform
import re
import shlex
import signal
Expand Down Expand Up @@ -928,6 +930,17 @@ def test_notebook_export_json():
with TemporaryDirectory() as td:
outfile = os.path.join(td, "nb.ipynb")
_ip.run_line_magic("notebook", "%s" % outfile)
with open(outfile) as f:
exported = json.load(f)

# check metadata
language_info = exported["metadata"]["language_info"]
assert language_info["name"] == "python"
assert language_info["file_extension"] == ".py"
assert language_info["version"] == platform.python_version()

kernelspec = exported["metadata"]["kernelspec"]
assert kernelspec["language"] == "python"


def test_notebook_export_json_with_output():
Expand Down
Loading