Skip to content

Commit 5afac75

Browse files
Merge pull request #3930 from abdelq/ipywidgets-8
Compatibility with ipywidgets v8
2 parents a8a0c9b + 8d7bc28 commit 5afac75

11 files changed

+198
-63
lines changed

Diff for: CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
55
## UNRELEASED
66

77
### Updated
8+
- Support for ipywidgets 8 [#3930](https://github.com/plotly/plotly.py/pull/3930)
89
- Updated Plotly.js to from version 2.16.1 to version 2.17.0. See the [plotly.js CHANGELOG](https://github.com/plotly/plotly.js/blob/master/CHANGELOG.md#2170----2022-12-22) for more information. Notable changes include:
910
- Add `shift` and `autoshift` to cartesian y axes to help avoid overlapping of multiple axes [[#6334](https://github.com/plotly/plotly.js/pull/6334)],
1011
with thanks to [Gamma Technologies](https://www.gtisoft.com) for sponsoring the related development!

Diff for: packages/javascript/jupyterlab-plotly/package-lock.json

+143-39
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: packages/javascript/jupyterlab-plotly/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
"webpack-cli": "^4.0.0"
6161
},
6262
"dependencies": {
63-
"@jupyter-widgets/base": "^2.0.0 || ^3.0.0 || ^4.0.0",
63+
"@jupyter-widgets/base": ">=2.0.0 <7.0.0",
6464
"@jupyterlab/rendermime-interfaces": "^1.3.0 || ^2.0.0 || ^3.0.0",
6565
"@lumino/messaging": "^1.2.3",
6666
"@lumino/widgets": "^1.8.1",

Diff for: packages/javascript/jupyterlab-plotly/src/Figure.ts

+23-5
Original file line numberDiff line numberDiff line change
@@ -716,7 +716,10 @@ export class FigureModel extends DOMWidgetModel {
716716

717717
static serializers: ISerializers = {
718718
...DOMWidgetModel.serializers,
719-
_data: { deserialize: py2js_deserializer, serialize: js2py_serializer },
719+
_data: {
720+
deserialize: py2js_deserializer,
721+
serialize: js2py_serializer,
722+
},
720723
_layout: {
721724
deserialize: py2js_deserializer,
722725
serialize: js2py_serializer,
@@ -807,7 +810,7 @@ export class FigureView extends DOMWidgetView {
807810
resizeEventListener: () => void;
808811

809812
/**
810-
* The perform_render method is called by processPhosphorMessage
813+
* The perform_render method is called by processLuminoMessage
811814
* after the widget's DOM element has been attached to the notebook
812815
* output cell. This happens after the initialize of the
813816
* FigureModel, and it won't happen at all if the Python FigureWidget
@@ -901,10 +904,10 @@ export class FigureView extends DOMWidgetView {
901904
}
902905

903906
/**
904-
* Respond to phosphorjs events
907+
* Respond to Lumino events
905908
*/
906-
processPhosphorMessage(msg: any) {
907-
super.processPhosphorMessage.apply(this, arguments);
909+
_processLuminoMessage(msg: any, _super: any) {
910+
_super.apply(this, arguments);
908911
var that = this;
909912
switch (msg.type) {
910913
case "before-attach":
@@ -939,6 +942,21 @@ export class FigureView extends DOMWidgetView {
939942
}
940943
}
941944

945+
processPhosphorMessage(msg: any) {
946+
this._processLuminoMessage(msg, super["processPhosphorMessage"]);
947+
948+
var that = this;
949+
if (msg.type === "before-attach") {
950+
window.addEventListener("resize", function () {
951+
that.autosizeFigure();
952+
});
953+
}
954+
}
955+
956+
processLuminoMessage(msg: any) {
957+
this._processLuminoMessage(msg, super["processLuminoMessage"]);
958+
}
959+
942960
autosizeFigure() {
943961
var that = this;
944962
var layout = that.model.get("_layout");

Diff for: packages/python/plotly/plotly/basedatatypes.py

+1-9
Original file line numberDiff line numberDiff line change
@@ -819,18 +819,10 @@ def _repr_mimebundle_(self, include=None, exclude=None, validate=True, **kwargs)
819819

820820
renderer_str = pio.renderers.default
821821
renderers = pio._renderers.renderers
822-
renderer_names = renderers._validate_coerce_renderers(renderer_str)
823-
renderers_list = [renderers[name] for name in renderer_names]
824822
from plotly.io._utils import validate_coerce_fig_to_dict
825-
from plotly.io._renderers import MimetypeRenderer
826823

827824
fig_dict = validate_coerce_fig_to_dict(self, validate)
828-
# Mimetype renderers
829-
bundle = {}
830-
for renderer in renderers_list:
831-
if isinstance(renderer, MimetypeRenderer):
832-
bundle.update(renderer.to_mimebundle(fig_dict))
833-
return bundle
825+
return renderers._build_mime_bundle(fig_dict, renderer_str, **kwargs)
834826

835827
def _ipython_display_(self):
836828
"""

Diff for: packages/python/plotly/plotly/basewidget.py

+19-2
Original file line numberDiff line numberDiff line change
@@ -733,12 +733,29 @@ def _handler_js2py_pointsCallback(self, change):
733733

734734
# Display
735735
# -------
736+
def _repr_html_(self):
737+
"""
738+
Customize html representation
739+
"""
740+
raise NotImplementedError # Prefer _repr_mimebundle_
741+
742+
def _repr_mimebundle_(self, include=None, exclude=None, validate=True, **kwargs):
743+
"""
744+
Return mimebundle corresponding to default renderer.
745+
"""
746+
return {
747+
"application/vnd.jupyter.widget-view+json": {
748+
"version_major": 2,
749+
"version_minor": 0,
750+
"model_id": self._model_id,
751+
},
752+
}
753+
736754
def _ipython_display_(self):
737755
"""
738756
Handle rich display of figures in ipython contexts
739757
"""
740-
# Override BaseFigure's display to make sure we display the widget version
741-
widgets.DOMWidget._ipython_display_(self)
758+
raise NotImplementedError # Prefer _repr_mimebundle_
742759

743760
# Callbacks
744761
# ---------

Diff for: packages/python/plotly/plotly/io/_base_renderers.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -609,11 +609,14 @@ def to_mimebundle(self, fig_dict):
609609

610610
def build_filename(self):
611611
ip = IPython.get_ipython() if IPython else None
612-
cell_number = list(ip.history_manager.get_tail(1))[0][1] + 1 if ip else 0
613-
filename = "{dirname}/figure_{cell_number}.html".format(
612+
if ip:
613+
cell_number = next(ip.history_manager.get_tail(1), (0, -1, ""))[1] + 1
614+
else:
615+
cell_number = 0
616+
617+
return "{dirname}/figure_{cell_number}.html".format(
614618
dirname=self.html_directory, cell_number=cell_number
615619
)
616-
return filename
617620

618621
def build_url(self, filename):
619622
return filename

0 commit comments

Comments
 (0)