Skip to content

Commit a1c940a

Browse files
Merge pull request #2021 from jasongrout/mimebundle
Use _repr_mimebundle_ and require IPython 6.1 or later.
2 parents af90227 + 1fb8776 commit a1c940a

File tree

6 files changed

+14
-46
lines changed

6 files changed

+14
-46
lines changed

ipywidgets/widgets/interaction.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,7 @@ def __init__(self, __interact_f, __options={}, **kwargs):
210210
else:
211211
for widget in self.kwargs_widgets:
212212
widget.observe(self.update, names='value')
213-
214-
self.on_displayed(self.update)
213+
self.update()
215214

216215
# Callback function
217216
def update(self, *args):

ipywidgets/widgets/tests/test_interaction.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,8 @@ def test_call_decorated_on_trait_change(clear_display):
363363
def foo(a='default'):
364364
d['a'] = a
365365
return a
366-
assert len(displayed) == 1
367-
w = displayed[0].children[0]
366+
assert len(displayed) == 2 # display the result and the interact
367+
w = displayed[1].children[0]
368368
check_widget(w,
369369
cls=widgets.Text,
370370
value='default',
@@ -378,7 +378,7 @@ def foo(a='default'):
378378
with patch.object(interaction, 'display', record_display):
379379
w.value = 'called'
380380
assert d['a'] == 'called'
381-
assert len(displayed) == 2
381+
assert len(displayed) == 3
382382
assert w.value == displayed[-1]
383383

384384
def test_call_decorated_kwargs_on_trait_change(clear_display):
@@ -389,8 +389,8 @@ def test_call_decorated_kwargs_on_trait_change(clear_display):
389389
def foo(a='default'):
390390
d['a'] = a
391391
return a
392-
assert len(displayed) == 1
393-
w = displayed[0].children[0]
392+
assert len(displayed) == 2 # display the result and the interact
393+
w = displayed[1].children[0]
394394
check_widget(w,
395395
cls=widgets.Text,
396396
value='kwarg',
@@ -404,7 +404,7 @@ def foo(a='default'):
404404
with patch.object(interaction, 'display', record_display):
405405
w.value = 'called'
406406
assert d['a'] == 'called'
407-
assert len(displayed) == 2
407+
assert len(displayed) == 3
408408
assert w.value == displayed[-1]
409409

410410

ipywidgets/widgets/tests/utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ def close(self, *args, **kwargs):
2727
def setup_test_comm():
2828
_widget_attrs['_comm_default'] = getattr(Widget, '_comm_default', undefined)
2929
Widget._comm_default = lambda self: DummyComm()
30-
_widget_attrs['_ipython_display_'] = Widget._ipython_display_
30+
_widget_attrs['_repr_mimebundle_'] = Widget._repr_mimebundle_
3131
def raise_not_implemented(*args, **kwargs):
3232
raise NotImplementedError()
33-
Widget._ipython_display_ = raise_not_implemented
33+
Widget._repr_mimebundle_ = raise_not_implemented
3434

3535
def teardown_test_comm():
3636
for attr, value in _widget_attrs.items():

ipywidgets/widgets/widget.py

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from traitlets import (
1414
HasTraits, Unicode, Dict, Instance, List, Int, Set, Bytes, observe, default, Container,
1515
Undefined)
16-
from IPython.display import display
1716
from json import loads as jsonloads, dumps as jsondumps
1817

1918
from base64 import standard_b64encode
@@ -381,7 +380,6 @@ def _default_keys(self):
381380
_property_lock = Dict()
382381
_holding_sync = False
383382
_states_to_send = Set()
384-
_display_callbacks = Instance(CallbackDispatcher, ())
385383
_msg_callbacks = Instance(CallbackDispatcher, ())
386384

387385
#-------------------------------------------------------------------------
@@ -449,7 +447,7 @@ def close(self):
449447
Widget.widgets.pop(self.model_id, None)
450448
self.comm.close()
451449
self.comm = None
452-
self._ipython_display_ = None
450+
self._repr_mimebundle_ = None
453451

454452
def send_state(self, key=None):
455453
"""Sends the widget state, or a piece of it, to the front-end, if it exists.
@@ -549,21 +547,6 @@ def on_msg(self, callback, remove=False):
549547
True if the callback should be unregistered."""
550548
self._msg_callbacks.register_callback(callback, remove=remove)
551549

552-
def on_displayed(self, callback, remove=False):
553-
"""(Un)Register a widget displayed callback.
554-
555-
Parameters
556-
----------
557-
callback: method handler
558-
Must have a signature of::
559-
560-
callback(widget, **kwargs)
561-
562-
kwargs from display are passed through without modification.
563-
remove: bool
564-
True if the callback should be unregistered."""
565-
self._display_callbacks.register_callback(callback, remove=remove)
566-
567550
def add_traits(self, **traits):
568551
"""Dynamically add trait attributes to the Widget."""
569552
super().add_traits(**traits)
@@ -671,10 +654,6 @@ def _handle_custom_msg(self, content, buffers):
671654
"""Called when a custom msg is received."""
672655
self._msg_callbacks(self, content, buffers)
673656

674-
def _handle_displayed(self, **kwargs):
675-
"""Called when a view has been displayed for this widget instance"""
676-
self._display_callbacks(self, **kwargs)
677-
678657
@staticmethod
679658
def _trait_to_json(x, self):
680659
"""Convert a trait value to json."""
@@ -685,9 +664,8 @@ def _trait_from_json(x, self):
685664
"""Convert json values to objects."""
686665
return x
687666

688-
def _ipython_display_(self, **kwargs):
689-
"""Called when `IPython.display.display` is called on the widget."""
690-
667+
def _repr_mimebundle_(self, **kwargs):
668+
"""Called when `IPython.display.display` is called."""
691669
plaintext = repr(self)
692670
if len(plaintext) > 110:
693671
plaintext = plaintext[:110] + '…'
@@ -705,10 +683,7 @@ def _ipython_display_(self, **kwargs):
705683
'version_minor': 0,
706684
'model_id': self._model_id
707685
}
708-
display(data, raw=True)
709-
710-
if self._view_name is not None:
711-
self._handle_displayed(**kwargs)
686+
return data
712687

713688
def _send(self, msg, buffers=None):
714689
"""Sends a message to the model in the front-end."""

ipywidgets/widgets/widget_box.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,6 @@ class Box(DOMWidget, CoreWidget):
6262
def __init__(self, children=(), **kwargs):
6363
kwargs['children'] = children
6464
super().__init__(**kwargs)
65-
self.on_displayed(Box._fire_children_displayed)
66-
67-
def _fire_children_displayed(self):
68-
for child in self.children:
69-
child._handle_displayed()
70-
7165

7266
@register
7367
@doc_subst(_doc_snippets)

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@
108108
setuptools_args = {}
109109
install_requires = setuptools_args['install_requires'] = [
110110
'ipykernel>=4.5.1',
111+
'ipython>=6.1.0', # to use _repr_mimebundle
111112
'traitlets>=4.3.1',
112113
# Requiring nbformat to specify bugfix version which is not required by
113114
# notebook.
@@ -120,7 +121,6 @@
120121
]
121122

122123
extras_require = setuptools_args['extras_require'] = {
123-
'': ['ipython>=4.0.0'],
124124
'test': ['pytest>=3.6.0', 'pytest-cov'],
125125
}
126126

0 commit comments

Comments
 (0)