def modify_doc(doc): source = ColumnDataSource(dict(x=[1, 2], y=[1, 1])) plot = Plot(plot_height=400, plot_width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y', size=20)) plot.add_tools( CustomAction(callback=CustomJS(args=dict(s=source), code=RECORD("data", "s.data")))) button = Toggle(css_classes=['foo']) def cb(value): if value: source.data = dict(x=[10, 20], y=[10, 10]) else: source.data = dict(x=[100, 200], y=[100, 100]) button.on_click(cb) doc.add_root(column(button, plot))
def test_js_on_change_executes(self, bokeh_model_page) -> None: slider = DateRangeSlider(start=start, end=end, value=value, css_classes=["foo"], width=300) slider.js_on_change('value', CustomJS(code=RECORD("value", "cb_obj.value"))) page = bokeh_model_page(slider) drag_range_slider(page.driver, ".foo", "lower", 50) results = page.results assert datetime.fromtimestamp(results['value'][0] / 1000) > datetime( *date.fromisoformat("2017-08-04").timetuple()[:3]) drag_range_slider(page.driver, ".foo", "upper", -70) assert datetime.fromtimestamp(results['value'][1] / 1000) < datetime( *date.fromisoformat("2017-08-09").timetuple()[:3]) assert page.has_no_console_errors()
def test_spinner_smallest_step(self, bokeh_model_page) -> None: spinner = Spinner(value=0, low=0, high=1, step=1e-16, css_classes=["foo"]) spinner.js_on_change('value', CustomJS(code=RECORD("value", "cb_obj.value"))) page = bokeh_model_page(spinner) input_el = page.driver.find_element_by_css_selector('.foo input') enter_text_in_element(page.driver, input_el, "0.43654644333534") results = page.results assert results['value'] == 0.43654644333534 enter_text_in_element(page.driver, input_el, "1e-16", click=2) results = page.results assert results['value'] == 1e-16 assert page.has_no_console_errors()
def test_low_high(self, single_plot_page: SinglePlotPage) -> None: source = ColumnDataSource(dict(x=[1, 2], y=[1, 1])) plot = Plot(height=400, width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y', size=20)) num_input = NumericInput(value=4, low=-1, high=10) num_input.js_on_change('value', CustomJS(code=RECORD("value", "cb_obj.value"))) page = single_plot_page(column(num_input, plot)) el = find_element_for(page.driver, num_input, "input") assert el.get_attribute('value') == "4" enter_text_in_element(page.driver, el, "30", click=2) assert el.get_attribute('value') == "10" enter_text_in_element(page.driver, el, "-10", click=2) assert el.get_attribute('value') == "-1"
def test_js_on_change_executes(self, bokeh_model_page: BokehModelPage) -> None: group = RadioButtonGroup(labels=LABELS) group.js_on_event( 'button_click', CustomJS(code=RECORD("active", "cb_obj.origin.active"))) page = bokeh_model_page(group) el = find_element_for(page.driver, group, ".bk-btn:nth-child(3)") el.click() results = page.results assert results['active'] == 2 el = find_element_for(page.driver, group, ".bk-btn:nth-child(1)") el.click() results = page.results assert results['active'] == 0 assert page.has_no_console_errors()
def modify_doc(doc): source = ColumnDataSource(dict(x=[1, 2], y=[1, 1], val=["a", "b"])) plot = Plot(plot_height=400, plot_width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_tools( CustomAction(callback=CustomJS(args=dict(s=source), code=RECORD("data", "s.data")))) plot.add_glyph(source, Circle(x='x', y='y', size=20)) dp = DatePicker(title='Select date', value=datetime(2019, 9, 20), min_date=datetime(2019, 9, 1), max_date=datetime.utcnow(), css_classes=["foo"]) def cb(attr, old, new): source.data['val'] = [old, new] dp.on_change('value', cb) doc.add_root(column(dp, plot))
def modify_doc(doc): plot = Plot(plot_height=400, plot_width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_tools( CustomAction(callback=CustomJS(args=dict(s=source), code=RECORD("data", "s.data")))) table = DataTable(columns=[ TableColumn(field="x", title="x", sortable=True), TableColumn(field="y", title="y", sortable=True, editor=NumberEditor()) ], source=source, editable=True) doc.add_root(column(plot, table))
def test_js_on_change_executes(self, bokeh_model_page: BokehModelPage) -> None: button = Dropdown(label="Dropdown button", menu=items) button.js_on_event('menu_item_click', CustomJS(code=RECORD("value", "this.item"))) page = bokeh_model_page(button) button_el = find_element_for(page.driver, button, "button") button_el.click() item = find_element_for(page.driver, button, ".bk-menu > *:nth-child(1)") item.click() results = page.results assert results == {'value': "item_1_value"} button_el = find_element_for(page.driver, button, "button") button_el.click() item = find_element_for(page.driver, button, ".bk-menu > *:nth-child(3)") item.click() results = page.results assert results == {'value': "item_3_value"} button_el = find_element_for(page.driver, button, "button") button_el.click() item = find_element_for(page.driver, button, ".bk-menu > *:nth-child(2)") item.click() results = page.results assert results == {'value': "item_2_value"} assert page.has_no_console_errors()
def modify_doc(doc): source = ColumnDataSource(dict(xs=[[1, 2]], ys=[[1, 1]])) plot = Plot(plot_height=400, plot_width=400, x_range=Range1d(0, 3), y_range=Range1d(0, 3), min_border=0) renderer = plot.add_glyph(source, MultiLine(xs='xs', ys='ys')) tool = PolyDrawTool(renderers=[renderer]) plot.add_tools(tool) plot.toolbar.active_multi = tool div = Div(text='False') def cb(attr, old, new): if cds_data_almost_equal(new, expected): div.text = 'True' source.on_change('data', cb) code = RECORD("matches", "div.text") plot.add_tools( CustomAction(callback=CustomJS(args=dict(div=div), code=code))) doc.add_root(column(plot, div))
def modify_doc(doc): source = ColumnDataSource(dict(x=[1, 2], y=[1, 1], val=["a", "b"])) plot = Plot(plot_height=400, plot_width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y', size=20)) plot.add_tools( CustomAction(callback=CustomJS(args=dict(s=source), code=RECORD("data", "s.data")))) input_box = AutocompleteInput(css_classes=["foo"]) input_box.title = "title" input_box.value = "400" input_box.completions = [ "100001", "12344556", "12344557", "3194567289", "209374209374" ] def cb(attr, old, new): source.data['val'] = [old, new] input_box.on_change('value', cb) doc.add_root(column(input_box, plot))
def test_js_on_change_executes(self, bokeh_model_page): group = RadioButtonGroup(labels=LABELS, css_classes=["foo"]) group.js_on_click(CustomJS(code=RECORD("active", "cb_obj.active"))) page = bokeh_model_page(group) el = page.driver.find_element_by_css_selector( 'div.foo div label input[value="2"]') el = el.find_element_by_xpath('..') el.click() results = page.results assert results['active'] == 2 el = page.driver.find_element_by_css_selector( 'div.foo div label input[value="0"]') el = el.find_element_by_xpath('..') el.click() results = page.results assert results['active'] == 0 assert page.has_no_console_errors()
def test_glyph_selection_updates_table(self, single_plot_page) -> None: plot = Plot(height=800, width=1000) data = {'x': [1,2,3,4], 'y': [1, 1, 1, 1]} source = ColumnDataSource(data) table = DataTable(columns=[ TableColumn(field="x", title="x", sortable=True), TableColumn(field="y", title="y", sortable=True, editor=NumberEditor()) ], source=source, editable=True) plot.add_glyph(source, Rect(x='x', y='y', width=1.5, height=1)) plot.add_tools(TapTool(callback=CustomJS(code=RECORD("indices", "cb_data.source.selected.indices")))) page = single_plot_page(column(plot, table)) page.click_canvas_at_position(500, 400) assert set(page.results["indices"]) == {1, 2} assert get_table_selected_rows(page.driver) == {1, 2} assert page.has_no_console_errors() assert page.has_no_console_errors()
def modify_doc(doc): source = ColumnDataSource(dict(x=[1, 2], y=[1, 1], val=["a", "b"])) plot = Plot(height=400, width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y', size=20)) plot.tags.append( CustomJS(name="custom-action", args=dict(s=source), code=RECORD("data", "s.data"))) input_box.title = "title" input_box.options = [ "100001", "12344556", "12344557", "3194567289", "209374209374" ] input_box.value = ["12344556", "12344557"] def cb(attr, old, new): source.data['val'] = [old, new] input_box.on_change('value', cb) doc.add_root(row(input_box, plot))
def modify_doc(doc): renderer = plot.add_glyph(source, MultiLine(xs='xs', ys='ys')) tool = PolyEditTool(renderers=[renderer]) psource = ColumnDataSource(dict(x=[], y=[])) prenderer = plot.add_glyph(psource, Circle(x='x', y='y', size=10)) tool.vertex_renderer = prenderer plot.add_tools(tool) plot.toolbar.active_multi = tool plot.toolbar_sticky = False div = Div(text='False') def cb(attr, old, new): try: if cds_data_almost_equal(new, expected): div.text = 'True' except ValueError: return source.on_change('data', cb) code = RECORD("matches", "div.text") plot.tags.append( CustomJS(name="custom-action", args=dict(div=div), code=code)) doc.add_root(column(plot, div))
def modify_doc(doc): source = ColumnDataSource(dict(x=[1, 2], y=[1, 1], val=["a", "b"])) plot = Plot(height=400, width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y', size=20)) plot.add_tools( CustomAction(callback=CustomJS(args=dict(s=source), code=RECORD("data", "s.data")))) slider = DateSlider(start=start, end=end, value=value, css_classes=["foo"], width=300, step=24 * 3600 * 1000) def cb(attr, old, new): source.data['val'] = [slider.value_as_date.isoformat()] slider.on_change('value', cb) doc.add_root(column(slider, plot))
def modify_doc(doc): source = ColumnDataSource(dict(x=[1, 2], y=[1, 1], val=["a", "b"])) plot = Plot(plot_height=400, plot_width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y', size=20)) plot.add_tools( CustomAction(callback=CustomJS(args=dict(s=source), code=RECORD("data", "s.data")))) slider = RangeSlider(start=0, end=10, value=(1, 9), title="bar", css_classes=["foo"], width=300) def cb(attr, old, new): source.data['val'] = [old, new] slider.on_change('value', cb) doc.add_root(column(slider, plot))
def test_js_on_change_executes(self, bokeh_model_page): button = Dropdown(label="Dropdown button", menu=items, css_classes=["foo"]) button.js_on_event('menu_item_click', CustomJS(code=RECORD("value", "this.item"))) page = bokeh_model_page(button) button = page.driver.find_element_by_css_selector('.foo button') button.click() item = page.driver.find_element_by_css_selector( ".foo .bk-menu > *:nth-child(1)") item.click() results = page.results assert results == {'value': "item_1_value"} button = page.driver.find_element_by_css_selector('.foo button') button.click() item = page.driver.find_element_by_css_selector( ".foo .bk-menu > *:nth-child(3)") item.click() results = page.results assert results == {'value': "item_3_value"} button = page.driver.find_element_by_css_selector('.foo button') button.click() item = page.driver.find_element_by_css_selector( ".foo .bk-menu > *:nth-child(2)") item.click() results = page.results assert results == {'value': "item_2_value"} assert page.has_no_console_errors()
def modify_doc(doc): source = ColumnDataSource(dict(x=[1, 2], y=[1, 1])) plot = Plot(height=400, width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y', size=20)) plot.tags.append( CustomJS(name="custom-action", args=dict(s=source), code=RECORD("data", "s.data"))) def cb(event): item = event.item if item == "item_1_value": source.data = dict(x=[10, 20], y=[10, 10]) elif item == "item_2_value": source.data = dict(x=[100, 200], y=[100, 100]) elif item == "item_3_value": source.data = dict(x=[1000, 2000], y=[1000, 1000]) button.on_event('menu_item_click', cb) doc.add_root(column(button, plot))
def test_callback_property_executes(self, single_plot_page): source = ColumnDataSource(dict(x=[1, 2], y=[1, 1])) plot = Plot(plot_height=400, plot_width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y', size=20)) spinner = Spinner(css_classes=['foo'], step=1, value=0) spinner.callback = CustomJS(code=RECORD("value", "cb_obj.value")) page = single_plot_page(column(spinner, plot)) el = page.driver.find_element_by_css_selector('.foo input') enter_value_in_spinner(page.driver, el, 4) results = page.results assert results['value'] == 4 enter_value_in_spinner(page.driver, el, -5.1) results = page.results assert results['value'] == -5 assert page.has_no_console_errors()
def modify_doc(doc): source = ColumnDataSource(dict(x=[1, 2], y=[1, 1], val=["a", "b"])) plot = Plot(height=400, width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y', size=20)) plot.tags.append(CustomJS(name="custom-action", args=dict(s=source), code=RECORD("data", "s.data"))) def cb(event): source.data['val'] = (group.active + [0, 0])[:2] # keep col length at 2, padded with zero group.on_event('button_click', cb) doc.add_root(column(group, plot))
def modify_doc(doc): source = ColumnDataSource(dict(x=[1, 2], y=[1, 1], val=["a", "b"])) plot = Plot(height=400, width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y', size=20)) plot.tags.append(CustomJS(name="custom-action", args=dict(s=source), code=RECORD("data", "s.data"))) def cb(attr, old, new): source.data['val'] = [old, new] select.on_change('value', cb) doc.add_root(column(select, plot))
def test_spinner_spinning_events(self, bokeh_model_page) -> None: spinner = Spinner(value=0, low=0, high=1, step=0.01, css_classes=["foo"]) spinner.js_on_change('value', CustomJS(code=RECORD("value", "cb_obj.value"))) page = bokeh_model_page(spinner) input_el = page.driver.find_element_by_css_selector('.foo input') btn_up_el = page.driver.find_element_by_css_selector( '.foo .bk-spin-btn-up') btn_down_el = page.driver.find_element_by_css_selector( '.foo .bk-spin-btn-down') enter_text_in_element(page.driver, input_el, "0.5") results = page.results assert results['value'] == 0.5 #click btn up actions = ActionChains(page.driver) actions.click(on_element=btn_up_el) actions.perform() results = page.results assert results['value'] == 0.51 #dbl click btn down actions = ActionChains(page.driver) actions.double_click(on_element=btn_down_el) actions.perform() results = page.results assert results['value'] == 0.49 #arrow up actions = ActionChains(page.driver) actions.click(on_element=input_el) actions.send_keys(Keys.ARROW_UP) actions.perform() results = page.results assert results['value'] == 0.50 #arrow down actions = ActionChains(page.driver) actions.click(on_element=input_el) actions.key_down(Keys.ARROW_DOWN) actions.perform() results = page.results assert results['value'] == 0.49 #page up actions = ActionChains(page.driver) actions.click(on_element=input_el) actions.key_down(Keys.PAGE_UP) actions.perform() results = page.results assert results['value'] == 0.59 #page down actions = ActionChains(page.driver) actions.click(on_element=input_el) actions.key_down(Keys.PAGE_DOWN) actions.perform() results = page.results assert results['value'] == 0.49 assert page.has_no_console_errors()
def modify_doc(doc): plot = Plot(height=400, width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.tags.append(CustomJS(name="custom-action", args=dict(s=source), code=RECORD("data", "s.data"))) button.js_on_event('button_click', CustomJS(args=dict(s=source), code="s.patch({'x': [[1, 100]]})")) doc.add_root(column(button, plot))