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__)