Source code for nengo.utils.ipython
"""Functions for easy interactions with IPython and IPython notebooks."""
import io
import numpy as np
try:
import IPython
from IPython import get_ipython
from IPython.display import HTML
if IPython.version_info[0] <= 3:
from IPython.nbconvert import PythonExporter
else:
from nbconvert import PythonExporter
if IPython.version_info[0] <= 3:
# pylint: disable=ungrouped-imports
from IPython import nbformat
else:
import nbformat
except ImportError:
def get_ipython():
return None
assert get_ipython
[docs]def check_ipy_version(min_version):
"""Check that ipython version is >= ``min_version``."""
try:
import IPython # pylint: disable=import-outside-toplevel
return IPython.version_info >= min_version
except ImportError:
return False
[docs]def hide_input():
"""Hide the input of the Jupyter notebook input block this is executed in.
Returns a link to toggle the visibility of the input block.
"""
uuid = np.random.randint(np.iinfo(np.int32).max)
script = """
<a id="%(uuid)s" href="javascript:toggle_input_%(uuid)s()"
>Show Input</a>
<script type="text/javascript">
var toggle_input_%(uuid)s;
(function() {
if (typeof jQuery == 'undefined') {
// no jQuery
var link_%(uuid)s = document.getElementById("%(uuid)s");
var cell = link_%(uuid)s;
while (cell.className.split(' ')[0] != "cell"
&& cell.className.split(' ')[0] != "nboutput") {
cell = cell.parentNode;
}
var input_%(uuid)s;
if (cell.className.split(' ')[0] == "cell") {
for (var i = 0; i < cell.children.length; i++) {
if (cell.children[i].className.split(' ')[0]
== "input") {
input_%(uuid)s = cell.children[i];
}
}
} else {
input_%(uuid)s = cell.previousElementSibling;
}
input_%(uuid)s.style.display = "none"; // hide
toggle_input_%(uuid)s = function() {
if (input_%(uuid)s.style.display == "none") {
input_%(uuid)s.style.display = ""; // show
link_%(uuid)s.innerHTML = "Hide Input";
} else {
input_%(uuid)s.style.display = "none"; // hide
link_%(uuid)s.innerHTML = "Show Input";
}
}
} else {
// jQuery
var link_%(uuid)s = $("a[id='%(uuid)s']");
var cell_%(uuid)s = link_%(uuid)s.parents("div.cell:first");
if (cell_%(uuid)s.length == 0) {
cell_%(uuid)s = link_%(uuid)s.parents(
"div.nboutput:first");
}
var input_%(uuid)s = cell_%(uuid)s.children("div.input");
if (input_%(uuid)s.length == 0) {
input_%(uuid)s = cell_%(uuid)s.prev("div.nbinput");
}
input_%(uuid)s.hide();
toggle_input_%(uuid)s = function() {
if (input_%(uuid)s.is(':hidden')) {
input_%(uuid)s.slideDown();
link_%(uuid)s[0].innerHTML = "Hide Input";
} else {
input_%(uuid)s.slideUp();
link_%(uuid)s[0].innerHTML = "Show Input";
}
}
}
}());
</script>
""" % dict(
uuid=uuid
)
return HTML(script)
[docs]def load_notebook(nb_path):
"""Load notebook from file."""
with io.open(nb_path, "r", encoding="utf-8") as f:
nb = nbformat.read(f, as_version=4)
return nb
[docs]def export_py(nb, dest_path=None):
"""Convert notebook to Python script.
Optionally saves script to dest_path.
"""
exporter = PythonExporter()
body, resources = exporter.from_notebook_node(nb)
# Remove all lines with get_ipython
while "get_ipython()" in body:
ind0 = body.find("get_ipython()")
ind1 = body.find("\n", ind0)
body = body[:ind0] + body[(ind1 + 1) :]
if dest_path is not None:
with io.open(dest_path, "w", encoding="utf-8") as f:
f.write(body)
return body
[docs]def iter_cells(nb, cell_type="code"):
"""Iterate over cells of a notebok."""
return (cell for cell in nb.cells if cell.cell_type == cell_type)