From c66bf0ad5695ef547c7f602e5c8a4607ce4699a0 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Mon, 11 Dec 2017 22:02:49 +0000 Subject: [PATCH] Ensure Compositor does not make superfluous copies --- holoviews/core/options.py | 5 +++-- tests/testbokehcallbacks.py | 17 ++++++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/holoviews/core/options.py b/holoviews/core/options.py index 83e4bb8100..7f3c35d1df 100644 --- a/holoviews/core/options.py +++ b/holoviews/core/options.py @@ -880,9 +880,10 @@ def map(cls, obj, mode='data', backend=None): if overlay_compositors: obj = obj.map(lambda obj: cls.collapse_element(obj, mode=mode, backend=backend), [CompositeOverlay]) - if element_compositors: + element_patterns = [c.pattern for c in element_compositors] + if element_compositors and obj.traverse(lambda x: x, element_patterns): obj = obj.map(lambda obj: cls.collapse_element(obj, mode=mode, backend=backend), - [c.pattern for c in element_compositors]) + element_patterns) return obj diff --git a/tests/testbokehcallbacks.py b/tests/testbokehcallbacks.py index dae0b8e7a5..102918f1ca 100644 --- a/tests/testbokehcallbacks.py +++ b/tests/testbokehcallbacks.py @@ -1,12 +1,14 @@ from unittest import SkipTest from nose.plugins.attrib import attr -from holoviews.element.comparison import ComparisonTestCase +from holoviews.core import NdOverlay from holoviews.core.options import Store - +from holoviews.element import Curve +from holoviews.element.comparison import ComparisonTestCase +from holoviews.streams import Selection1D try: - from holoviews.plotting.bokeh.callbacks import Callback + from holoviews.plotting.bokeh.callbacks import Callback, Selection1DCallback from holoviews.plotting.bokeh.util import bokeh_version from bokeh.events import Tap @@ -52,6 +54,15 @@ def test_customjs_callback_attributes_js_for_cb_data(self): 'data["y1"] = cb_data["geometry"]["y1"];\n') self.assertEqual(js_code, code) + + def test_callback_on_ndoverlay_is_attached(self): + ndoverlay = NdOverlay({i: Curve([i]) for i in range(5)}) + selection = Selection1D(source=ndoverlay) + plot = bokeh_renderer.get_plot(ndoverlay) + self.assertEqual(len(plot.callbacks), 1) + self.assertIsInstance(plot.callbacks[0], Selection1DCallback) + + @attr(optional=1) class TestBokehServerJSCallbacks(ComparisonTestCase):