converter.py
54 lines
| 2.0 KiB
| text/x-python
|
PythonLexer
MinRK
|
r18579 | """API for converting notebooks between versions.""" | ||
Jonathan Frederic
|
r12490 | |||
MinRK
|
r18579 | # Copyright (c) IPython Development Team. | ||
# Distributed under the terms of the Modified BSD License. | ||||
Jonathan Frederic
|
r12490 | |||
MinRK
|
r18603 | from . import versions | ||
from .reader import get_version | ||||
Jonathan Frederic
|
r12490 | |||
Jonathan Frederic
|
r12493 | def convert(nb, to_version): | ||
"""Convert a notebook node object to a specific version. Assumes that | ||||
all the versions starting from 1 to the latest major X are implemented. | ||||
In other words, there should never be a case where v1 v2 v3 v5 exist without | ||||
a v4. Also assumes that all conversions can be made in one step increments | ||||
between major versions and ignores minor revisions. | ||||
Thomas Kluyver
|
r13587 | Parameters | ||
---------- | ||||
Jonathan Frederic
|
r12493 | nb : NotebookNode | ||
to_version : int | ||||
Major revision to convert the notebook to. Can either be an upgrade or | ||||
a downgrade. | ||||
""" | ||||
Jonathan Frederic
|
r12490 | |||
# Get input notebook version. | ||||
Jonathan Frederic
|
r12493 | (version, version_minor) = get_version(nb) | ||
Jonathan Frederic
|
r12490 | |||
MinRK
|
r18603 | # Check if destination is target version, if so return contents | ||
Jonathan Frederic
|
r12493 | if version == to_version: | ||
Jonathan Frederic
|
r12490 | return nb | ||
Jonathan Frederic
|
r12493 | # If the version exist, try to convert to it one step at a time. | ||
Jonathan Frederic
|
r12781 | elif to_version in versions: | ||
Jonathan Frederic
|
r12493 | |||
# Get the the version that this recursion will convert to as a step | ||||
# closer to the final revision. Make sure the newer of the conversion | ||||
# functions is used to perform the conversion. | ||||
if to_version > version: | ||||
step_version = version + 1 | ||||
convert_function = versions[step_version].upgrade | ||||
Jonathan Frederic
|
r12490 | else: | ||
Jonathan Frederic
|
r12493 | step_version = version - 1 | ||
convert_function = versions[version].downgrade | ||||
# Convert and make sure version changed during conversion. | ||||
Jonathan Frederic
|
r12787 | converted = convert_function(nb) | ||
Jonathan Frederic
|
r12493 | if converted.get('nbformat', 1) == version: | ||
MinRK
|
r18602 | raise ValueError("Failed to convert notebook from v%d to v%d." % (version, step_version)) | ||
Jonathan Frederic
|
r12490 | |||
Jonathan Frederic
|
r12921 | # Recursively convert until target version is reached. | ||
Jonathan Frederic
|
r12493 | return convert(converted, to_version) | ||
Jonathan Frederic
|
r12490 | else: | ||
MinRK
|
r18579 | raise ValueError("Cannot convert notebook to v%d because that " \ | ||
Jonathan Frederic
|
r12493 | "version doesn't exist" % (to_version)) | ||