Repository: bokeh/bokeh

Issue:
[BUG] NumericInput and Spinner several bugs
First bug concern the modification of the input text when a key not allowed is pressed
The input value state is register only when a correct key is pressed so if we use the arrows to update the value the new state is not recorded
In the following gif, I use the input to enter the value 25, then I update this value using arrows and I press a wrong key.
The value is set to 25 instead of 44
![ezgif com-video-to-gif](https://user-images.githubusercontent.com/18531147/89308419-86899200-d672-11ea-8eb7-f5be30098db4.gif)

Incrementation using mouse click is too sensible as we can see in the following gif it's hard to increment only by 1:
![ezgif com-video-to-gif (1)](https://user-images.githubusercontent.com/18531147/89308830-0152ad00-d673-11ea-86bb-82f17ba0cb4f.gif)
It can be control by the `interval` property but I think I will implement an heuristic which start slowly and increase the speed of the increment function of the press duration

padding should be added to the input text to not overlap with arrows
![image](https://user-images.githubusercontent.com/18531147/89308580-b769c700-d672-11ea-85c1-efda429b58c7.png)





Discussion:

Resolving patch:
diff --git a/bokeh/models/widgets/inputs.py b/bokeh/models/widgets/inputs.py
--- a/bokeh/models/widgets/inputs.py
+++ b/bokeh/models/widgets/inputs.py
@@ -220,10 +220,6 @@ class Spinner(NumericInput):
     down keys are pressed
     """)
 
-    interval = Either(Int, Float, default=50, help="""
-    Defines the time in ms between two changes when arrows or keys are pressed
-    """)
-
     wheel_wait = Either(Int, Float, default=100, help="""
     Defines the debounce time in ms before updating `value_throttled` when the
     mouse wheel is used to change the input


Test patch:
diff --git a/tests/integration/widgets/test_numeric_input.py b/tests/integration/widgets/test_numeric_input.py
--- a/tests/integration/widgets/test_numeric_input.py
+++ b/tests/integration/widgets/test_numeric_input.py
@@ -194,10 +194,10 @@ def test_int_inputs(self, single_plot_page) -> None:
         values_to_enter = ["0", "1", "-1", "+5",
                           "0.1", "-0.1", "+0.1", "-.1", "+.1",
                           "1e-6", "1.e5", "-1e+3", "-1.e-5",
-                          "a", ""]
+                          "a"]
 
         expected_results = [0, 1, -1, 5, 1, -1, 1, -1, 1,
-                            10, 10, -13, -15, -15, None]
+                            10, 10, -13, -15, None]
 
         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)
@@ -220,10 +220,10 @@ def test_float_inputs(self, single_plot_page) -> None:
         values_to_enter = ["0", "1", "-1", "+5",
                           "0.1", "-0.1", "+0.1", "-.1", "+.1",
                           "1e-6", "1.e5", "-1e+3", "-1.e-5",
-                          "a", "1ea"]
+                          "a"]
 
         expected_results = [0, 1, -1, 5, 0.1, -0.1, 0.1, -0.1, 0.1,
-                            1e-6, 10, -1e3, -1e-5, -1e-5, None]
+                            1e-6, 10, -1e3, -1e-5, None]
 
         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)