Skip to content

Commit 5d2c5e2

Browse files
authoredOct 28, 2021
Update state filter (#1664)
* Add test for widget rendering. * Save notebook metadata in `Exporter` * Add tests
1 parent 11ea593 commit 5d2c5e2

7 files changed

+144
-13
lines changed
 

‎nbconvert/exporters/exporter.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ def __init__(self, config=None, **kw):
112112
super().__init__(config=with_default_config, **kw)
113113

114114
self._init_preprocessors()
115-
115+
self._nb_metadata = {}
116116

117117
@property
118118
def default_config(self):
@@ -141,7 +141,12 @@ def from_notebook_node(self, nb, resources=None, **kw):
141141

142142
# Preprocess
143143
nb_copy, resources = self._preprocess(nb_copy, resources)
144-
144+
notebook_name = ''
145+
if resources is not None:
146+
name = resources.get('metadata', {}).get('name', '')
147+
path = resources.get('metadata', {}).get('path', '')
148+
notebook_name = os.path.join(path, name)
149+
self._nb_metadata[notebook_name] = nb_copy.metadata
145150
return nb_copy, resources
146151

147152
def from_filename(self, filename: str, resources: Optional[dict] = None, **kw):

‎nbconvert/exporters/html.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ def from_notebook_node(self, nb, resources=None, **kw):
137137
langinfo = nb.metadata.get('language_info', {})
138138
lexer = langinfo.get('pygments_lexer', langinfo.get('name', None))
139139
highlight_code = self.filters.get('highlight_code', Highlight2HTML(pygments_lexer=lexer, parent=self))
140-
filter_data_type = WidgetsDataTypeFilter(notebook_metadata=nb.metadata, parent=self)
140+
141+
filter_data_type = WidgetsDataTypeFilter(notebook_metadata=self._nb_metadata, parent=self, resources=resources)
141142

142143
self.register_filter('highlight_code', highlight_code)
143144
self.register_filter('filter_data_type', filter_data_type)
@@ -167,7 +168,6 @@ def resources_include_url(name):
167168
pieces = split_template_path(name)
168169
for searchpath in self.template_paths:
169170
filename = os.path.join(searchpath, *pieces)
170-
print(filename, os.path.exists(filename))
171171
if os.path.exists(filename):
172172
with open(filename, "rb") as f:
173173
data = f.read()

‎nbconvert/exporters/tests/test_templateexporter.py

+1
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,7 @@ def test_raw_template_init(self):
326326
class AttrExporter(RSTExporter):
327327

328328
def __init__(self, *args, **kwargs):
329+
super().__init__(*args, **kwargs)
329330
self.raw_template = raw_template
330331

331332
exporter_init = AttrExporter()

‎nbconvert/filters/widgetsdatatypefilter.py

+14-9
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
#-----------------------------------------------------------------------------
2020

2121
from warnings import warn
22-
22+
import os
2323
from ..utils.base import NbConvertBase
2424

2525
__all__ = ['WidgetsDataTypeFilter']
@@ -33,13 +33,13 @@ class WidgetsDataTypeFilter(NbConvertBase):
3333
""" Returns the preferred display format, excluding the widget output if
3434
there is no widget state available """
3535

36-
def __init__(self, notebook_metadata=None, **kwargs):
37-
metadata = notebook_metadata or {}
38-
39-
self.widgets_state = (
40-
metadata['widgets'][WIDGET_STATE_MIMETYPE]['state'] if
41-
metadata.get('widgets') is not None else {}
42-
)
36+
def __init__(self, notebook_metadata=None, resources=None, **kwargs):
37+
self.metadata = notebook_metadata
38+
self.notebook_path = ''
39+
if resources is not None:
40+
name = resources.get('metadata', {}).get('name', '')
41+
path = resources.get('metadata', {}).get('path', '')
42+
self.notebook_path = os.path.join(path, name)
4343

4444
super().__init__(**kwargs)
4545

@@ -51,12 +51,17 @@ def __call__(self, output):
5151
`output` is dict with structure {mimetype-of-element: value-of-element}
5252
5353
"""
54+
metadata = self.metadata.get(self.notebook_path, {})
55+
widgets_state = (
56+
metadata['widgets'][WIDGET_STATE_MIMETYPE]['state'] if
57+
metadata.get('widgets') is not None else {}
58+
)
5459
for fmt in self.display_data_priority:
5560
if fmt in output:
5661
# If there is no widget state available, we skip this mimetype
5762
if (
5863
fmt == WIDGET_VIEW_MIMETYPE and
59-
output[WIDGET_VIEW_MIMETYPE]['model_id'] not in self.widgets_state
64+
output[WIDGET_VIEW_MIMETYPE]['model_id'] not in widgets_state
6065
):
6166
continue
6267

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": null,
6+
"id": "036cb3ce-96fe-4159-8145-40bb74b263f9",
7+
"metadata": {},
8+
"outputs": [],
9+
"source": [
10+
"import ipywidgets as widgets\n",
11+
"widgets.IntSlider(\n",
12+
" value=7,\n",
13+
" min=0,\n",
14+
" max=10,\n",
15+
" step=1,\n",
16+
" description='Test:',\n",
17+
" disabled=False,\n",
18+
" continuous_update=False,\n",
19+
" orientation='horizontal',\n",
20+
" readout=True,\n",
21+
" readout_format='d'\n",
22+
")"
23+
]
24+
}
25+
],
26+
"metadata": {
27+
"kernelspec": {
28+
"display_name": "Python 3 (ipykernel)",
29+
"language": "python",
30+
"name": "python3"
31+
},
32+
"language_info": {
33+
"codemirror_mode": {
34+
"name": "ipython",
35+
"version": 3
36+
},
37+
"file_extension": ".py",
38+
"mimetype": "text/x-python",
39+
"name": "python",
40+
"nbconvert_exporter": "python",
41+
"pygments_lexer": "ipython3",
42+
"version": "3.9.7"
43+
}
44+
},
45+
"nbformat": 4,
46+
"nbformat_minor": 5
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": null,
6+
"id": "036cb3ce-96fe-4159-8145-40bb74b263f9",
7+
"metadata": {},
8+
"outputs": [],
9+
"source": [
10+
"import ipywidgets as widgets\n",
11+
"widgets.IntSlider(\n",
12+
" value=7,\n",
13+
" min=0,\n",
14+
" max=10,\n",
15+
" step=1,\n",
16+
" description='Test:',\n",
17+
" disabled=False,\n",
18+
" continuous_update=False,\n",
19+
" orientation='horizontal',\n",
20+
" readout=True,\n",
21+
" readout_format='d'\n",
22+
")"
23+
]
24+
}
25+
],
26+
"metadata": {
27+
"kernelspec": {
28+
"display_name": "Python 3 (ipykernel)",
29+
"language": "python",
30+
"name": "python3"
31+
},
32+
"language_info": {
33+
"codemirror_mode": {
34+
"name": "ipython",
35+
"version": 3
36+
},
37+
"file_extension": ".py",
38+
"mimetype": "text/x-python",
39+
"name": "python",
40+
"nbconvert_exporter": "python",
41+
"pygments_lexer": "ipython3",
42+
"version": "3.9.7"
43+
}
44+
},
45+
"nbformat": 4,
46+
"nbformat_minor": 5
47+
}

‎nbconvert/tests/test_nbconvertapp.py

+26
Original file line numberDiff line numberDiff line change
@@ -570,3 +570,29 @@ def test_widgets_from_htmlexporter(self):
570570
output, _ = HTMLExporter().from_notebook_node(nb)
571571

572572
assert "var widgetRendererSrc = 'https://unpkg.com/@jupyter-widgets/html-manager@*/dist/embed-amd.js';" in output
573+
574+
def test_execute_widgets_from_nbconvert(self):
575+
"""Check jupyter widgets render"""
576+
notebookName = "Unexecuted_widget"
577+
with self.create_temp_cwd([f"{notebookName}.ipynb"]):
578+
self.nbconvert(
579+
f"{notebookName}.ipynb --execute --log-level 0 --to html")
580+
assert os.path.isfile(f"{notebookName}.html")
581+
with open(f"{notebookName}.html", "r", encoding="utf8") as f:
582+
text = f.read()
583+
assert '<script type="application/vnd.jupyter.widget-view+json">' in text
584+
assert '<script type="application/vnd.jupyter.widget-state+json">' in text
585+
586+
def test_execute_multiple_notebooks(self):
587+
"""Check jupyter widgets render in case of batch convert"""
588+
notebookName = "Unexecuted_widget"
589+
with self.create_temp_cwd([f"{notebookName}*.ipynb"]):
590+
self.nbconvert(
591+
"*.ipynb --execute --log-level 0 --to html")
592+
593+
for name in (notebookName, f"{notebookName}_2"):
594+
assert os.path.isfile(f"{name}.html")
595+
with open(f"{name}.html", "r", encoding="utf8") as f:
596+
text = f.read()
597+
assert '<script type="application/vnd.jupyter.widget-view+json">' in text
598+
assert '<script type="application/vnd.jupyter.widget-state+json">' in text

0 commit comments

Comments
 (0)