"""Python API for composing notebook elements The Python representation of a notebook is a nested structure of dictionary subclasses that support attribute access (ipython_genutils.ipstruct.Struct). The functions in this module are merely helpers to build the structs in the right form. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from ..notebooknode import NotebookNode # Change the nbformat_minor and nbformat_schema variables when incrementing the # nbformat version # current major version nbformat = 4 # current minor version nbformat_minor = 4 # schema files for (major, minor) version tuples. (None, None) means the current version nbformat_schema = { (None, None): 'nbformat.v4.schema.json', (4, 0): 'nbformat.v4.0.schema.json', (4, 1): 'nbformat.v4.1.schema.json', (4, 2): 'nbformat.v4.2.schema.json', (4, 3): 'nbformat.v4.3.schema.json', (4, 4): 'nbformat.v4.4.schema.json' } def validate(node, ref=None): """validate a v4 node""" from .. import validate return validate(node, ref=ref, version=nbformat) def new_output(output_type, data=None, **kwargs): """Create a new output, to go in the ``cell.outputs`` list of a code cell.""" output = NotebookNode(output_type=output_type) # populate defaults: if output_type == 'stream': output.name = u'stdout' output.text = u'' elif output_type == 'display_data': output.metadata = NotebookNode() output.data = NotebookNode() elif output_type == 'execute_result': output.metadata = NotebookNode() output.data = NotebookNode() output.execution_count = None elif output_type == 'error': output.ename = "NotImplementedError" output.evalue = "" output.traceback = [] # load from args: output.update(kwargs) if data is not None: output.data = data # validate validate(output, output_type) return output def output_from_msg(msg): """Create a NotebookNode for an output from a kernel's IOPub message. Returns ------- NotebookNode: the output as a notebook node. Raises ------ ValueError: if the message is not an output message. """ msg_type = msg['header']['msg_type'] content = msg['content'] if msg_type == 'execute_result': return new_output(output_type=msg_type, metadata=content['metadata'], data=content['data'], execution_count=content['execution_count'], ) elif msg_type == 'stream': return new_output(output_type=msg_type, name=content['name'], text=content['text'], ) elif msg_type == 'display_data': return new_output(output_type=msg_type, metadata=content['metadata'], data=content['data'], ) elif msg_type == 'error': return new_output(output_type=msg_type, ename=content['ename'], evalue=content['evalue'], traceback=content['traceback'], ) else: raise ValueError("Unrecognized output msg type: %r" % msg_type) def new_code_cell(source='', **kwargs): """Create a new code cell""" cell = NotebookNode( cell_type='code', metadata=NotebookNode(), execution_count=None, source=source, outputs=[], ) cell.update(kwargs) validate(cell, 'code_cell') return cell def new_markdown_cell(source='', **kwargs): """Create a new markdown cell""" cell = NotebookNode( cell_type='markdown', source=source, metadata=NotebookNode(), ) cell.update(kwargs) validate(cell, 'markdown_cell') return cell def new_raw_cell(source='', **kwargs): """Create a new raw cell""" cell = NotebookNode( cell_type='raw', source=source, metadata=NotebookNode(), ) cell.update(kwargs) validate(cell, 'raw_cell') return cell def new_notebook(**kwargs): """Create a new notebook""" nb = NotebookNode( nbformat=nbformat, nbformat_minor=nbformat_minor, metadata=NotebookNode(), cells=[], ) nb.update(kwargs) validate(nb) return nb