##// END OF EJS Templates
Backport PR #4118: ZMQ heartbeat channel: catch EINTR exceptions and continue....
Backport PR #4118: ZMQ heartbeat channel: catch EINTR exceptions and continue. The zmq heartbeat channel exits when it encounters an "Interrupted system call", thereby causing the qtconsole to report that it is not responding, despite the console working perfectly fine. Observed in a large Qt application embedding the ipython qtconsole in KDE desktop. Fixes #2310 Inspired by #501

File last commit:

r11643:a9c12437
r12317:bf63ce77
Show More
current.py
226 lines | 6.3 KiB | text/x-python | PythonLexer
Brian E. Granger
More review changes....
r4609 """The official API for working with notebooks in the current format version.
Authors:
* Brian Granger
"""
#-----------------------------------------------------------------------------
# Copyright (C) 2008-2011 The IPython Development Team
#
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
Brian E. Granger
Implemented metadata for notebook format.
r4637 from __future__ import print_function
Brian E. Granger
Full versioning added to nbformat.
r4406 import json
from xml.etree import ElementTree as ET
import re
Brian Granger
Changing rst->plaintext in nbformat.
r6025 from IPython.nbformat import v3
Brian E. Granger
Full versioning added to nbformat.
r4406 from IPython.nbformat import v2
from IPython.nbformat import v1
Brian Granger
Changing rst->plaintext in nbformat.
r6025 from IPython.nbformat.v3 import (
Brian E. Granger
Massive work on the notebook document format....
r4484 NotebookNode,
Brian E. Granger
Created new notebook magic that can export/convert notebooks....
r4520 new_code_cell, new_text_cell, new_notebook, new_output, new_worksheet,
MinRK
add nbformat_minor for minor revisions to nbformat
r7545 parse_filename, new_metadata, new_author, new_heading_cell, nbformat,
nbformat_minor,
Brian E. Granger
Massive work on the notebook document format....
r4484 )
Brian E. Granger
More review changes....
r4609 #-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------
Brian E. Granger
Full versioning added to nbformat.
r4406
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 current_nbformat = nbformat
MinRK
add nbformat_minor for minor revisions to nbformat
r7545 current_nbformat_minor = nbformat_minor
Brian E. Granger
Full versioning added to nbformat.
r4406
MinRK
better message when notebook format is not supported...
r11643 class NBFormatError(ValueError):
pass
Brian E. Granger
Full versioning added to nbformat.
r4406
MinRK
better message when notebook format is not supported...
r11643 class NotJSONError(ValueError):
Brian E. Granger
Full versioning added to nbformat.
r4406 pass
def parse_json(s, **kwargs):
"""Parse a string into a (nbformat, dict) tuple."""
MinRK
better message when notebook format is not supported...
r11643 try:
d = json.loads(s, **kwargs)
except ValueError:
raise NotJSONError("Notebook does not appear to be JSON: %r" % s[:16])
MinRK
add nbformat_minor for minor revisions to nbformat
r7545 nbf = d.get('nbformat', 1)
nbm = d.get('nbformat_minor', 0)
return nbf, nbm, d
Brian E. Granger
Full versioning added to nbformat.
r4406
def parse_py(s, **kwargs):
"""Parse a string into a (nbformat, string) tuple."""
MinRK
add minor-version support to .py export
r7566 nbf = current_nbformat
nbm = current_nbformat_minor
pattern = r'# <nbformat>(?P<nbformat>\d+[\.\d+]*)</nbformat>'
Brian E. Granger
Full versioning added to nbformat.
r4406 m = re.search(pattern,s)
if m is not None:
MinRK
add minor-version support to .py export
r7566 digits = m.group('nbformat').split('.')
nbf = int(digits[0])
if len(digits) > 1:
nbm = int(digits[1])
return nbf, nbm, s
Brian E. Granger
Full versioning added to nbformat.
r4406
def reads_json(s, **kwargs):
"""Read a JSON notebook from a string and return the NotebookNode object."""
MinRK
add nbformat_minor for minor revisions to nbformat
r7545 nbf, minor, d = parse_json(s, **kwargs)
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 if nbf == 1:
Brian E. Granger
Full versioning added to nbformat.
r4406 nb = v1.to_notebook_json(d, **kwargs)
Brian Granger
Fixing minor bugs in nbformat and saving....
r6032 nb = v3.convert_to_this_nbformat(nb, orig_version=1)
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 elif nbf == 2:
Brian E. Granger
Full versioning added to nbformat.
r4406 nb = v2.to_notebook_json(d, **kwargs)
Brian Granger
Fixing minor bugs in nbformat and saving....
r6032 nb = v3.convert_to_this_nbformat(nb, orig_version=2)
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 elif nbf == 3:
Brian Granger
Fixing minor bugs in nbformat and saving....
r6032 nb = v3.to_notebook_json(d, **kwargs)
MinRK
add nbformat_minor for minor revisions to nbformat
r7545 nb = v3.convert_to_this_nbformat(nb, orig_version=3, orig_minor=minor)
Brian E. Granger
Full versioning added to nbformat.
r4406 else:
MinRK
better message when notebook format is not supported...
r11643 raise NBFormatError('Unsupported JSON nbformat version %s (supported version: %i)' % (nbf, 3))
Brian E. Granger
Full versioning added to nbformat.
r4406 return nb
def writes_json(nb, **kwargs):
Brian Granger
Fixing minor bugs in nbformat and saving....
r6032 return v3.writes_json(nb, **kwargs)
Brian E. Granger
Full versioning added to nbformat.
r4406
def reads_py(s, **kwargs):
"""Read a .py notebook from a string and return the NotebookNode object."""
MinRK
add minor-version support to .py export
r7566 nbf, nbm, s = parse_py(s, **kwargs)
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 if nbf == 2:
Brian E. Granger
Full versioning added to nbformat.
r4406 nb = v2.to_notebook_py(s, **kwargs)
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 elif nbf == 3:
Brian Granger
Fixing minor bugs in nbformat and saving....
r6032 nb = v3.to_notebook_py(s, **kwargs)
Brian E. Granger
Full versioning added to nbformat.
r4406 else:
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 raise NBFormatError('Unsupported PY nbformat version: %i' % nbf)
Brian E. Granger
Full versioning added to nbformat.
r4406 return nb
def writes_py(nb, **kwargs):
Brian Granger
Fixing minor bugs in nbformat and saving....
r6032 return v3.writes_py(nb, **kwargs)
Brian E. Granger
Full versioning added to nbformat.
r4406
# High level API
def reads(s, format, **kwargs):
"""Read a notebook from a string and return the NotebookNode object.
This function properly handles notebooks of any version. The notebook
returned will always be in the current version's format.
Parameters
----------
Brian E. Granger
Implemented metadata for notebook format.
r4637 s : unicode
The raw unicode string to read the notebook from.
format : (u'json', u'ipynb', u'py')
Brian E. Granger
Full versioning added to nbformat.
r4406 The format that the string is in.
Returns
-------
nb : NotebookNode
The notebook that was read.
"""
Brian E. Granger
Implemented metadata for notebook format.
r4637 format = unicode(format)
Brian Granger
Removing old xml notebook format.
r6021 if format == u'json' or format == u'ipynb':
Brian E. Granger
Full versioning added to nbformat.
r4406 return reads_json(s, **kwargs)
Brian E. Granger
Implemented metadata for notebook format.
r4637 elif format == u'py':
Brian E. Granger
Full versioning added to nbformat.
r4406 return reads_py(s, **kwargs)
else:
raise NBFormatError('Unsupported format: %s' % format)
def writes(nb, format, **kwargs):
"""Write a notebook to a string in a given format in the current nbformat version.
This function always writes the notebook in the current nbformat version.
Parameters
----------
nb : NotebookNode
The notebook to write.
Brian E. Granger
Implemented metadata for notebook format.
r4637 format : (u'json', u'ipynb', u'py')
Brian E. Granger
Full versioning added to nbformat.
r4406 The format to write the notebook in.
Returns
-------
Brian E. Granger
Implemented metadata for notebook format.
r4637 s : unicode
Brian E. Granger
Full versioning added to nbformat.
r4406 The notebook string.
"""
Brian E. Granger
Implemented metadata for notebook format.
r4637 format = unicode(format)
Brian Granger
Removing old xml notebook format.
r6021 if format == u'json' or format == u'ipynb':
Brian E. Granger
Full versioning added to nbformat.
r4406 return writes_json(nb, **kwargs)
Brian E. Granger
Implemented metadata for notebook format.
r4637 elif format == u'py':
Brian E. Granger
Full versioning added to nbformat.
r4406 return writes_py(nb, **kwargs)
else:
raise NBFormatError('Unsupported format: %s' % format)
def read(fp, format, **kwargs):
"""Read a notebook from a file and return the NotebookNode object.
This function properly handles notebooks of any version. The notebook
returned will always be in the current version's format.
Parameters
----------
fp : file
Any file-like object with a read method.
Brian E. Granger
Implemented metadata for notebook format.
r4637 format : (u'json', u'ipynb', u'py')
Brian E. Granger
Full versioning added to nbformat.
r4406 The format that the string is in.
Returns
-------
nb : NotebookNode
The notebook that was read.
"""
return reads(fp.read(), format, **kwargs)
def write(nb, fp, format, **kwargs):
"""Write a notebook to a file in a given format in the current nbformat version.
This function always writes the notebook in the current nbformat version.
Parameters
----------
nb : NotebookNode
The notebook to write.
fp : file
Any file-like object with a write method.
Brian E. Granger
Implemented metadata for notebook format.
r4637 format : (u'json', u'ipynb', u'py')
Brian E. Granger
Full versioning added to nbformat.
r4406 The format to write the notebook in.
Returns
-------
Brian E. Granger
Implemented metadata for notebook format.
r4637 s : unicode
Brian E. Granger
Full versioning added to nbformat.
r4406 The notebook string.
"""
return fp.write(writes(nb, format, **kwargs))
Brian E. Granger
Implemented metadata for notebook format.
r4637 def _convert_to_metadata():
"""Convert to a notebook having notebook metadata."""
import glob
for fname in glob.glob('*.ipynb'):
print('Converting file:',fname)
with open(fname,'r') as f:
nb = read(f,u'json')
md = new_metadata()
if u'name' in nb:
md.name = nb.name
del nb[u'name']
nb.metadata = md
with open(fname,'w') as f:
write(nb, f, u'json')
Brian E. Granger
Full versioning added to nbformat.
r4406