def test_date_slider(document, comm): date_slider = DateSlider(name='DateSlider', value=date(2018, 9, 4), start=date(2018, 9, 1), end=date(2018, 9, 10)) widget = date_slider.get_root(document, comm=comm) assert isinstance(widget, date_slider._widget_type) assert widget.title == 'DateSlider' assert widget.value == 1536019200000 assert widget.start == 1535760000000.0 assert widget.end == 1536537600000.0 epoch = datetime(1970, 1, 1) widget.value = (datetime(2018, 9, 3) - epoch).total_seconds() * 1000 date_slider._process_events({'value': widget.value}) assert date_slider.value == date(2018, 9, 3) date_slider._process_events({ 'value_throttled': (datetime(2018, 9, 3) - epoch).total_seconds() * 1000 }) assert date_slider.value_throttled == date(2018, 9, 3) # Test raw timestamp value: date_slider._process_events( {'value': (datetime(2018, 9, 4) - epoch).total_seconds() * 1000.0}) assert date_slider.value == date(2018, 9, 4) date_slider._process_events({ 'value_throttled': (datetime(2018, 9, 4) - epoch).total_seconds() * 1000.0 }) assert date_slider.value_throttled == date(2018, 9, 4) date_slider.value = date(2018, 9, 6) assert widget.value == 1536192000000 # Testing throttled mode epoch_time = lambda dt: (dt - epoch).total_seconds() * 1000 with config.set(throttled=True): date_slider._process_events( {'value': epoch_time(datetime(2021, 5, 15))}) assert date_slider.value == date(2018, 9, 6) # no change date_slider._process_events( {'value_throttled': epoch_time(datetime(2021, 5, 15))}) assert date_slider.value == date(2021, 5, 15) date_slider.value = date(2021, 5, 12) assert widget.value == 1620777600000
def components(self, obj, fmt=None, comm=True, **kwargs): """ Returns data and metadata dictionaries containing HTML and JS components to include render in app, notebook, or standalone document. """ if isinstance(obj, Plot): plot = obj else: plot, fmt = self._validate(obj, fmt) data, metadata = {}, {} if isinstance(plot, Viewable): registry = list(Stream.registry.items()) objects = plot.object.traverse(lambda x: x) dynamic, streams = False, False for source in objects: dynamic |= isinstance(source, DynamicMap) streams |= any( src is source or (src._plot_id is not None and src._plot_id == source._plot_id) for src, streams in registry for s in streams) embed = (not (dynamic or streams or self.widget_mode == 'live') or config.embed) comm = self.comm_manager.get_server_comm() if comm else None doc = Document() with config.set(embed=embed): model = plot.layout._render_model(doc, comm) if embed: return render_model(model, comm) else: args = (model, doc, comm) if panel_version > '0.9.3': from panel.models.comm_manager import CommManager ref = model.ref['id'] manager = CommManager(comm_id=comm.id, plot_id=ref) client_comm = self.comm_manager.get_client_comm( on_msg=partial(plot._on_msg, ref, manager), on_error=partial(plot._on_error, ref), on_stdout=partial(plot._on_stdout, ref)) manager.client_comm_id = client_comm.id args = args + (manager, ) return render_mimebundle(*args) else: html = self._figure_data(plot, fmt, as_script=True, **kwargs) data['text/html'] = html return (data, {MIME_TYPES['jlab-hv-exec']: metadata})
def test_date_range_slider(document, comm): date_slider = DateRangeSlider(name='DateRangeSlider', value=(datetime(2018, 9, 2), datetime(2018, 9, 4)), start=datetime(2018, 9, 1), end=datetime(2018, 9, 10)) widget = date_slider.get_root(document, comm=comm) assert isinstance(widget, date_slider._widget_type) assert widget.title == 'DateRangeSlider' assert widget.value == (1535846400000, 1536019200000) assert widget.start == 1535760000000 assert widget.end == 1536537600000 epoch = datetime(1970, 1, 1) widget.value = ((datetime(2018, 9, 3) - epoch).total_seconds() * 1000, (datetime(2018, 9, 6) - epoch).total_seconds() * 1000) date_slider._process_events({'value': widget.value}) assert date_slider.value == (datetime(2018, 9, 3), datetime(2018, 9, 6)) value_throttled = ((datetime(2018, 9, 3) - epoch).total_seconds() * 1000, (datetime(2018, 9, 6) - epoch).total_seconds() * 1000) date_slider._process_events({'value_throttled': value_throttled}) assert date_slider.value == (datetime(2018, 9, 3), datetime(2018, 9, 6)) date_slider.value = (datetime(2018, 9, 4), datetime(2018, 9, 6)) assert widget.value == (1536019200000, 1536192000000) # Testing throttled mode epoch_time = lambda dt: (dt - epoch).total_seconds() * 1000 epoch_times = lambda *dts: tuple(map(epoch_time, dts)) with config.set(throttled=True): date_slider._process_events({ 'value': epoch_times(datetime(2021, 2, 15), datetime(2021, 5, 15)) }) assert date_slider.value == (datetime(2018, 9, 4), datetime(2018, 9, 6)) # no change date_slider._process_events({ 'value_throttled': epoch_times(datetime(2021, 2, 15), datetime(2021, 5, 15)) }) assert date_slider.value == (datetime(2021, 2, 15), datetime(2021, 5, 15)) date_slider.value = (datetime(2021, 2, 12), datetime(2021, 5, 12)) assert widget.value == (1613088000000, 1620777600000)
def _render_panel(self, plot, embed=False, comm=True): comm = self.comm_manager.get_server_comm() if comm else None doc = Document() with config.set(embed=embed): model = plot.layout._render_model(doc, comm) if embed: return render_model(model, comm) ref = model.ref['id'] manager = PnCommManager(comm_id=comm.id, plot_id=ref) client_comm = self.comm_manager.get_client_comm( on_msg=partial(plot._on_msg, ref, manager), on_error=partial(plot._on_error, ref), on_stdout=partial(plot._on_stdout, ref) ) manager.client_comm_id = client_comm.id return render_mimebundle(model, doc, comm, manager)
def test_discrete_date_slider(document, comm): dates = OrderedDict([('2016-01-0%d' % i, datetime(2016, 1, i)) for i in range(1, 4)]) discrete_slider = DiscreteSlider(name='DiscreteSlider', value=dates['2016-01-02'], options=dates) box = discrete_slider.get_root(document, comm=comm) assert isinstance(box, BkColumn) label = box.children[0] widget = box.children[1] assert isinstance(label, BkDiv) assert isinstance(widget, BkSlider) assert widget.value == 1 assert widget.start == 0 assert widget.end == 2 assert widget.step == 1 assert label.text == 'DiscreteSlider: <b>2016-01-02</b>' # widget.value = 2 discrete_slider._slider._process_events({'value': 2}) assert discrete_slider.value == dates['2016-01-03'] discrete_slider._slider._process_events({'value_throttled': 2}) assert discrete_slider.value_throttled == dates['2016-01-03'] discrete_slider.value = dates['2016-01-01'] assert widget.value == 0 # Testing throttled mode with config.set(throttled=True): discrete_slider._slider._process_events({'value': 2}) assert discrete_slider.value == dates['2016-01-01'] # no change discrete_slider._slider._process_events({'value_throttled': 2}) assert discrete_slider.value == dates['2016-01-03'] discrete_slider.value = dates['2016-01-02'] assert widget.value == 1
def test_discrete_slider_options_dict(document, comm): options = OrderedDict([('0.1', 0.1), ('1', 1), ('10', 10), ('100', 100)]) discrete_slider = DiscreteSlider(name='DiscreteSlider', value=1, options=options) box = discrete_slider.get_root(document, comm=comm) label = box.children[0] widget = box.children[1] assert isinstance(label, BkDiv) assert isinstance(widget, BkSlider) assert widget.value == 1 assert widget.start == 0 assert widget.end == 3 assert widget.step == 1 assert label.text == 'DiscreteSlider: <b>1</b>' # widget.value = 2 discrete_slider._slider._process_events({'value': 2}) assert discrete_slider.value == 10 discrete_slider._slider._process_events({'value_throttled': 2}) assert discrete_slider.value_throttled == 10 discrete_slider.value = 100 assert widget.value == 3 # Testing throttled mode with config.set(throttled=True): discrete_slider._slider._process_events({'value': 2}) assert discrete_slider.value == options['100'] # no change discrete_slider._slider._process_events({'value_throttled': 2}) assert discrete_slider.value == options['10'] discrete_slider.value = options['1'] assert widget.value == 1
def test_viewable_ipywidget(): pane = Str('A') with config.set(comms='ipywidgets'): data, metadata = pane._repr_mimebundle_() assert 'application/vnd.jupyter.widget-view+json' in data
def components(self, obj, fmt=None, comm=True, **kwargs): """ Returns data and metadata dictionaries containing HTML and JS components to include render in app, notebook, or standalone document. """ if isinstance(obj, Plot): plot = obj else: plot, fmt = self._validate(obj, fmt) data, metadata = {}, {} if isinstance(plot, Viewable): registry = list(Stream.registry.items()) objects = plot.object.traverse(lambda x: x) dynamic, streams = False, False for source in objects: dynamic |= isinstance(source, DynamicMap) streams |= any( src is source or (src._plot_id is not None and src._plot_id == source._plot_id) for src, streams in registry for s in streams ) embed = (not (dynamic or streams or self.widget_mode == 'live') or config.embed) # This part should be factored out in Panel and then imported # here for HoloViews 2.0, which will be able to require a # recent Panel version. if embed or config.comms == 'default': comm = self.comm_manager.get_server_comm() if comm else None doc = Document() with config.set(embed=embed): model = plot.layout._render_model(doc, comm) if embed: return render_model(model, comm) args = (model, doc, comm) if panel_version > '0.9.3': from panel.models.comm_manager import CommManager ref = model.ref['id'] manager = CommManager(comm_id=comm.id, plot_id=ref) client_comm = self.comm_manager.get_client_comm( on_msg=partial(plot._on_msg, ref, manager), on_error=partial(plot._on_error, ref), on_stdout=partial(plot._on_stdout, ref) ) manager.client_comm_id = client_comm.id args = args + (manager,) return render_mimebundle(*args) # Handle rendering object as ipywidget widget = ipywidget(plot, combine_events=True) if hasattr(widget, '_repr_mimebundle_'): return widget._repr_mimebundle() plaintext = repr(widget) if len(plaintext) > 110: plaintext = plaintext[:110] + '…' data = { 'text/plain': plaintext, } if widget._view_name is not None: data['application/vnd.jupyter.widget-view+json'] = { 'version_major': 2, 'version_minor': 0, 'model_id': widget._model_id } if config.comms == 'vscode': # Unfortunately VSCode does not yet handle _repr_mimebundle_ from IPython.display import display display(data, raw=True) return {'text/html': '<div style="display: none"></div>'}, {} return data, {} else: html = self._figure_data(plot, fmt, as_script=True, **kwargs) data['text/html'] = html return (data, {MIME_TYPES['jlab-hv-exec']: metadata})