Last active
August 29, 2015 14:13
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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": {} | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment