Skip to content

Instantly share code, notes, and snippets.

@damontallen
Last active August 29, 2015 14:13
Show Gist options
  • Save damontallen/aa30769b35f4fc2ab35e to your computer and use it in GitHub Desktop.
Save damontallen/aa30769b35f4fc2ab35e to your computer and use it in GitHub Desktop.
An IPython Notebook created to downgrade notebooks which are from version dev 3.0 of IPython to version 2.3 of IPython. I do not guarantee that it will work.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "",
"signature": "sha256:8a2c4c2adb058dcd7f2239fcd85190e2800b978c125e37fa6e27d6c0072c7156"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Version 3.0 dev IPython Notebook Downgrader"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This Notebook is an attempt to make a downgrader for IPython Notebooks written using IPython 3.0 dev to Notebooks that run under version 2.3 of IPython. It has worked on my test cases but I make no guarantee that it will work. The original notebook remains intact and the name of the downgraded version has \"_downgraded\" added to it which may be a problem on Windows in a deeply nested directory if the total path exceeds 256 characters."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import json\n",
"from collections import namedtuple\n",
"import re\n",
"\n",
"def cell_downgrade(cell, language):\n",
" \"Attempts to convert a dev 3 cell to version 2.3\"\n",
" d_graded = {} # create downgraded cell dictionary\n",
" source = cell['source']\n",
" if cell['cell_type'] != \"code\":\n",
" # Check to see if it should be a heading\n",
" if cell['cell_type'] == \"markdown\":\n",
" try:\n",
" pat = re.compile('#+')\n",
" line = source[0]\n",
" result = pat.match(line)\n",
" if result != None:\n",
" level = result.span()[1]\n",
" line = line[level:]\n",
" line = line.strip()\n",
" if len(source)==1:\n",
" d_graded['cell_type'] = \"heading\"\n",
" d_graded['level'] = level\n",
" source[0] = line\n",
" d_graded['metadata'] = {}\n",
" else:\n",
" d_graded['cell_type'] = \"markdown\"\n",
" else:\n",
" d_graded['cell_type'] = \"markdown\"\n",
" except:\n",
" d_graded['cell_type'] = \"markdown\"\n",
" else:\n",
" d_graded['cell_type'] = cell['cell_type']\n",
" d_graded['source'] = source\n",
" else:\n",
" d_graded['cell_type'] = \"code\"\n",
" d_graded['input'] = source\n",
" d_graded['language'] = language \n",
" outputs = []\n",
" try:\n",
" for output in cell['outputs']:\n",
" out_dict = {}\n",
" for key, item in output.items():\n",
" if key == 'name':\n",
" out_dict['stream'] = item\n",
" else:\n",
" out_dict[key] = item\n",
" outputs.append(out_dict)\n",
" d_graded['outputs'] = outputs\n",
" except:\n",
" pass\n",
" try:\n",
" if cell['execution_count'] != None:\n",
" prompt = cell['execution_count'] \n",
" d_graded['prompt_number'] = prompt\n",
" except:\n",
" pass\n",
" # Convert cell metadata\n",
" try:\n",
" m_data = {}\n",
" for key, item in cell['metadata'].items():\n",
" if key == 'collapsed':\n",
" # Headings do not have a value for 'collapsed' \n",
" if d_graded['cell_type'] != \"heading\":\n",
" d_graded[key] = item\n",
" continue\n",
" else:\n",
" m_data[key] = item\n",
" d_graded['metadata'] = m_data\n",
" except:\n",
" print(\"Error with cell metadata:\")\n",
" key = 'metadata'\n",
" m_data = cell.__getitem__(key) if cell.__contains__(key) else None\n",
" print(m_data)\n",
" pass\n",
" return d_graded\n",
"\n",
"def meta_downgrade(metadata):\n",
" d_meta = {}\n",
" d_meta['signature'] = metadata['signature']\n",
" try:\n",
" d_meta['celltoolbar'] = metadata['celltoolbar']\n",
" except:\n",
" pass\n",
" d_meta['name'] = ''\n",
" \n",
" language = metadata['language_info']['name']\n",
" Meta = namedtuple('Meta','metadata language')\n",
" output = Meta(d_meta,language)\n",
" return output\n",
"\n",
"def downgrade(notebook):\n",
" d_grade = {}\n",
" d_grade['nbformat'] = 3\n",
" d_grade['nbformat_minor'] = notebook['nbformat_minor']\n",
" m_d_grade = meta_downgrade(notebook['metadata'])\n",
" d_grade['metadata'] = m_d_grade.metadata\n",
" language = m_d_grade.language\n",
" cells = []\n",
" for cell in notebook['cells']:\n",
" d_cell = cell_downgrade(cell,language)\n",
" cells.append(d_cell)\n",
" d_grade['worksheets'] = [{'cells':cells, 'metadata':{}}]\n",
" \n",
" return d_grade\n",
"\n",
"def convert2old(filename):\n",
" \"Trys to convert a Dev 3 version of an IPython Notebook to version 2.3\"\n",
" with open(filename,'r') as f:\n",
" json_data = json.load(f)\n",
" d_graded = downgrade(json_data)\n",
" name = filename.strip('.ipynb')\n",
" outputname = name + \"_downgraded.ipynb\"\n",
"# print(pr.pformat(d_graded))\n",
" with open(outputname,'w') as f:\n",
" json.dump(d_graded, f, indent=1, sort_keys=True)\n",
" print(\"Downgrade complete.\")"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"convert2old(\"EMPTY_3.ipynb\")\n",
"# convert2old(\"Examples.ipynb\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Downgrade complete.\n"
]
}
],
"prompt_number": 2
}
],
"metadata": {}
}
]
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment