From 9e72a80a355e13d6613a0deb43478d8f49d8d69a Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Sat, 1 Dec 2018 10:37:53 +0000 Subject: [PATCH 1/3] Use bokeh_msg_handler from pyviz_comms --- holoviews/plotting/bokeh/renderer.py | 31 +--------------------------- 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/holoviews/plotting/bokeh/renderer.py b/holoviews/plotting/bokeh/renderer.py index 3bffa15739..cf2608997a 100644 --- a/holoviews/plotting/bokeh/renderer.py +++ b/holoviews/plotting/bokeh/renderer.py @@ -8,6 +8,7 @@ import param import bokeh +from pyviz_comms import bokeh_msg_handler from param.parameterized import bothmethod from bokeh.application.handlers import FunctionHandler from bokeh.application import Application @@ -34,36 +35,6 @@ """ -# Following JS block becomes body of the message handler callback -bokeh_msg_handler = """ -var plot_id = "{plot_id}"; -if (plot_id in HoloViews.plot_index) {{ - var plot = HoloViews.plot_index[plot_id]; -}} else {{ - var plot = Bokeh.index[plot_id]; -}} - -if (plot_id in HoloViews.receivers) {{ - var receiver = HoloViews.receivers[plot_id]; -}} else if (Bokeh.protocol === undefined) {{ - return; -}} else {{ - var receiver = new Bokeh.protocol.Receiver(); - HoloViews.receivers[plot_id] = receiver; -}} - -if (buffers.length > 0) {{ - receiver.consume(buffers[0].buffer) -}} else {{ - receiver.consume(msg) -}} - -const comm_msg = receiver.message; -if (comm_msg != null) {{ - plot.model.document.apply_json_patch(comm_msg.content, comm_msg.buffers) -}} -""" - default_theme = Theme(json={ 'attrs': { 'Title': {'text_color': 'black', 'text_font_size': '12pt'} From 67f529e65d0105617621b91195664e23ba6a167a Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Sat, 1 Dec 2018 12:15:55 +0000 Subject: [PATCH 2/3] Correctly handle ACK messages --- holoviews/plotting/bokeh/renderer.py | 2 +- holoviews/plotting/widgets/widgets.js | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/holoviews/plotting/bokeh/renderer.py b/holoviews/plotting/bokeh/renderer.py index cf2608997a..23fce57d7c 100644 --- a/holoviews/plotting/bokeh/renderer.py +++ b/holoviews/plotting/bokeh/renderer.py @@ -287,7 +287,7 @@ def _figure_data(self, plot, fmt='html', doc=None, as_script=False, **kwargs): js = '' else: try: - js, div, _ = notebook_content(model, comm_id) + js, div, _ = notebook_content(model) html = NOTEBOOK_DIV.format(plot_script=js, plot_div=div) data = encode_utf8(html) doc.hold() diff --git a/holoviews/plotting/widgets/widgets.js b/holoviews/plotting/widgets/widgets.js index 2351f69708..e3288d6de9 100644 --- a/holoviews/plotting/widgets/widgets.js +++ b/holoviews/plotting/widgets/widgets.js @@ -72,11 +72,11 @@ HoloViewsWidget.prototype.update = function(current){ HoloViewsWidget.prototype.init_comms = function() { var that = this - HoloViews.comm_manager.register_target(this.plot_id, this.id, function (msg) { that.process_msg(msg) }) + HoloViews.comm_manager.register_target(this.plot_id, this.id, function (msg) { that.msg_handler(msg) }) if (!this.cached || this.dynamic) { function ack_callback(msg) { - msg = JSON.parse(msg.content.data); - var comm_id = msg["comm_id"] + var msg = msg.metadata; + var comm_id = msg.comm_id; var comm_status = HoloViews.comm_status[comm_id]; if (that.queue.length > 0) { that.time = Date.now(); @@ -88,7 +88,7 @@ HoloViewsWidget.prototype.init_comms = function() { if ((msg.msg_type == "Ready") && msg.content) { console.log("Python callback returned following output:", msg.content); } else if (msg.msg_type == "Error") { - console.log("Python failed with the following traceback:", msg['traceback']) + console.log("Python failed with the following traceback:", msg.traceback) } } var comm = HoloViews.comm_manager.get_client_comm(this.plot_id, this.id+'_client', ack_callback); @@ -96,6 +96,20 @@ HoloViewsWidget.prototype.init_comms = function() { } } +HoloViewsWidget.prototype.msg_handler = function(msg) { + var metadata = msg.metadata; + if ((metadata.msg_type == "Ready")) { + if (metadata.content) { + console.log("Python callback returned following output:", metadata.content); + } + return; + } else if (metadata.msg_type == "Error") { + console.log("Python failed with the following traceback:", metadata.traceback) + return + } + this.process_msg(msg) +} + HoloViewsWidget.prototype.process_msg = function(msg) { } From b6229d95a4bf6d915368fc5c880171e75f334c10 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Sat, 1 Dec 2018 13:02:43 +0000 Subject: [PATCH 3/3] Minor fixes --- holoviews/plotting/bokeh/renderer.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/holoviews/plotting/bokeh/renderer.py b/holoviews/plotting/bokeh/renderer.py index 23fce57d7c..d460d1b100 100644 --- a/holoviews/plotting/bokeh/renderer.py +++ b/holoviews/plotting/bokeh/renderer.py @@ -85,7 +85,7 @@ class BokehRenderer(Renderer): _loaded = False # Define the handler for updating bokeh plots - comm_msg_handler = bokeh_msg_handler if bokeh_version > '0.12.14' else None + comm_msg_handler = bokeh_msg_handler def __call__(self, obj, fmt=None, doc=None): """ @@ -267,7 +267,6 @@ def _figure_data(self, plot, fmt='html', doc=None, as_script=False, **kwargs): doc.theme = self.theme doc.add_root(model) - comm_id = plot.comm.id if plot.comm else None # Bokeh raises warnings about duplicate tools and empty subplots # but at the holoviews level these are not issues logger = logging.getLogger(bokeh.core.validation.check.__file__)