From 9c9364dc9aa639fef14831e21d82cea145629dc0 Mon Sep 17 00:00:00 2001 From: Marc Wouts Date: Sun, 14 Oct 2018 22:04:16 +0200 Subject: [PATCH] Robust conversion of metadata to YAML #99 --- jupytext/header.py | 11 ++--- .../notebook_with_complex_metadata.ipynb | 46 +++++++++++++++++++ .../notebook_with_complex_metadata.Rmd | 27 +++++++++++ .../notebook_with_complex_metadata.md | 27 +++++++++++ .../notebook_with_complex_metadata.py | 26 +++++++++++ .../notebook_with_complex_metadata.py | 25 ++++++++++ .../notebook_with_complex_metadata.py | 25 ++++++++++ 7 files changed, 180 insertions(+), 7 deletions(-) create mode 100644 tests/notebooks/ipynb_py/notebook_with_complex_metadata.ipynb create mode 100644 tests/notebooks/mirror/ipynb_to_Rmd/notebook_with_complex_metadata.Rmd create mode 100644 tests/notebooks/mirror/ipynb_to_md/notebook_with_complex_metadata.md create mode 100644 tests/notebooks/mirror/ipynb_to_percent/notebook_with_complex_metadata.py create mode 100644 tests/notebooks/mirror/ipynb_to_script/notebook_with_complex_metadata.py create mode 100644 tests/notebooks/mirror/ipynb_to_sphinx/notebook_with_complex_metadata.py diff --git a/jupytext/header.py b/jupytext/header.py index 696676b08..94c71d5d9 100644 --- a/jupytext/header.py +++ b/jupytext/header.py @@ -3,12 +3,15 @@ import re import yaml +from yaml.representer import SafeRepresenter import nbformat from nbformat.v4.nbbase import new_raw_cell from .version import __version__ from .cell_to_text import comment_lines from .languages import _SCRIPT_EXTENSIONS +SafeRepresenter.add_representer(nbformat.NotebookNode, SafeRepresenter.represent_dict) + _HEADER_RE = re.compile(r"^---\s*$") _BLANK_RE = re.compile(r"^\s*$") _JUPYTER_RE = re.compile(r"^jupyter\s*:\s*$") @@ -25,12 +28,6 @@ def insert_or_test_version_number(): return INSERT_AND_CHECK_VERSION_NUMBER -def _as_dict(metadata): - if isinstance(metadata, nbformat.NotebookNode): - return {k: _as_dict(metadata[k]) for k in metadata.keys()} - return metadata - - def uncomment_line(line, prefix): """Remove prefix (and space) from line""" if not prefix: @@ -91,7 +88,7 @@ def metadata_and_cell_to_header(notebook, text_format, ext): skipline = not cell.metadata.get('noskipline', False) notebook.cells = notebook.cells[1:] - metadata = _as_dict(notebook.get('metadata', {})) + metadata = notebook.get('metadata', {}) if insert_or_test_version_number(): metadata.setdefault('jupytext', {})['text_representation'] = { diff --git a/tests/notebooks/ipynb_py/notebook_with_complex_metadata.ipynb b/tests/notebooks/ipynb_py/notebook_with_complex_metadata.ipynb new file mode 100644 index 000000000..081e225ef --- /dev/null +++ b/tests/notebooks/ipynb_py/notebook_with_complex_metadata.ipynb @@ -0,0 +1,46 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.1" + }, + "widgets": { + "state": { + "a65a11f142ca44eebc913788d256adcb": { + "views": [ + { + "cell_index": 92 + } + ] + } + }, + "version": "1.2.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/notebooks/mirror/ipynb_to_Rmd/notebook_with_complex_metadata.Rmd b/tests/notebooks/mirror/ipynb_to_Rmd/notebook_with_complex_metadata.Rmd new file mode 100644 index 000000000..3cf1df3e2 --- /dev/null +++ b/tests/notebooks/mirror/ipynb_to_Rmd/notebook_with_complex_metadata.Rmd @@ -0,0 +1,27 @@ +--- +jupyter: + kernelspec: + display_name: Python 3 + language: python + name: python3 + language_info: + codemirror_mode: + name: ipython + version: 3 + file_extension: .py + mimetype: text/x-python + name: python + nbconvert_exporter: python + pygments_lexer: ipython3 + version: 3.5.1 + widgets: + state: + a65a11f142ca44eebc913788d256adcb: + views: + - cell_index: 92 + version: 1.2.0 +--- + +```{python} + +``` diff --git a/tests/notebooks/mirror/ipynb_to_md/notebook_with_complex_metadata.md b/tests/notebooks/mirror/ipynb_to_md/notebook_with_complex_metadata.md new file mode 100644 index 000000000..bb4a50abf --- /dev/null +++ b/tests/notebooks/mirror/ipynb_to_md/notebook_with_complex_metadata.md @@ -0,0 +1,27 @@ +--- +jupyter: + kernelspec: + display_name: Python 3 + language: python + name: python3 + language_info: + codemirror_mode: + name: ipython + version: 3 + file_extension: .py + mimetype: text/x-python + name: python + nbconvert_exporter: python + pygments_lexer: ipython3 + version: 3.5.1 + widgets: + state: + a65a11f142ca44eebc913788d256adcb: + views: + - cell_index: 92 + version: 1.2.0 +--- + +```python + +``` diff --git a/tests/notebooks/mirror/ipynb_to_percent/notebook_with_complex_metadata.py b/tests/notebooks/mirror/ipynb_to_percent/notebook_with_complex_metadata.py new file mode 100644 index 000000000..e47fdf3c7 --- /dev/null +++ b/tests/notebooks/mirror/ipynb_to_percent/notebook_with_complex_metadata.py @@ -0,0 +1,26 @@ +# --- +# jupyter: +# kernelspec: +# display_name: Python 3 +# language: python +# name: python3 +# language_info: +# codemirror_mode: +# name: ipython +# version: 3 +# file_extension: .py +# mimetype: text/x-python +# name: python +# nbconvert_exporter: python +# pygments_lexer: ipython3 +# version: 3.5.1 +# widgets: +# state: +# a65a11f142ca44eebc913788d256adcb: +# views: +# - cell_index: 92 +# version: 1.2.0 +# --- + +# %% + diff --git a/tests/notebooks/mirror/ipynb_to_script/notebook_with_complex_metadata.py b/tests/notebooks/mirror/ipynb_to_script/notebook_with_complex_metadata.py new file mode 100644 index 000000000..3ad6e292c --- /dev/null +++ b/tests/notebooks/mirror/ipynb_to_script/notebook_with_complex_metadata.py @@ -0,0 +1,25 @@ +# --- +# jupyter: +# kernelspec: +# display_name: Python 3 +# language: python +# name: python3 +# language_info: +# codemirror_mode: +# name: ipython +# version: 3 +# file_extension: .py +# mimetype: text/x-python +# name: python +# nbconvert_exporter: python +# pygments_lexer: ipython3 +# version: 3.5.1 +# widgets: +# state: +# a65a11f142ca44eebc913788d256adcb: +# views: +# - cell_index: 92 +# version: 1.2.0 +# --- + + diff --git a/tests/notebooks/mirror/ipynb_to_sphinx/notebook_with_complex_metadata.py b/tests/notebooks/mirror/ipynb_to_sphinx/notebook_with_complex_metadata.py new file mode 100644 index 000000000..3ad6e292c --- /dev/null +++ b/tests/notebooks/mirror/ipynb_to_sphinx/notebook_with_complex_metadata.py @@ -0,0 +1,25 @@ +# --- +# jupyter: +# kernelspec: +# display_name: Python 3 +# language: python +# name: python3 +# language_info: +# codemirror_mode: +# name: ipython +# version: 3 +# file_extension: .py +# mimetype: text/x-python +# name: python +# nbconvert_exporter: python +# pygments_lexer: ipython3 +# version: 3.5.1 +# widgets: +# state: +# a65a11f142ca44eebc913788d256adcb: +# views: +# - cell_index: 92 +# version: 1.2.0 +# --- + +