internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: bokeh/bokeh

Issue:
Uploading actual releases to conda bokeh/label/dev
This suggestion sounds weird at first but uploading the final releases to the bokeh dev channel on anaconda.org results in a much more consistent experience for anyone trying to use the bleeding edge version of bokeh, which is usually the intention behind specifying a dev channel.

As an example if you tried to  ``conda install -c bokeh/label/dev bokeh`` between the 9th of April and the 13th of April you would have ended up with bokeh 1.1.0rc5, which would have been behind the most recent released version. I'd therefore argue that real releases should be tagged with both main and dev tags when uploaded to anaconda.org.


Discussion:
I'm fine with this if someone wants to submit a PR. Bonus points for going through old releases on anaconda.org and adding tags to them as well. 
OK I took care of the anaconda.org update for existing releases:

<img width="1039" alt="Screen Shot 2019-04-29 at 5 27 39 PM" src="https://user-images.githubusercontent.com/1078448/56935154-26399700-6aa4-11e9-9447-f4d6ff67806e.png">

Now that the heavy lifting work of making two four clicks is out of the way, @philippjfr can you make the PR to update here

https://github.com/bokeh/bokeh/blob/dc8cf49e4e4302fd38537ad089ece81fbcca4737/scripts/build_upload.py#L359-L363

I'm not sure if there is way to add both channels to the second upload command? Maybe the safest thing to do is to just copy the "dev" upload line to the else block and do them both in separate commands? Tho maybe uploading the same filename in succession is problematic? I don't know, definitely a quick experiment in another channel/org, or consult with the internal repo (or both) team would be in order. 

Resolving patch:
diff --git a/scripts/build_upload.py b/scripts/build_upload.py
--- a/scripts/build_upload.py
+++ b/scripts/build_upload.py
@@ -358,9 +358,9 @@ def upload_cdn(cdn_token, cdn_id, url=RSURL):
 @upload_wrapper('anaconda')
 def upload_anaconda(token, dev):
     if dev:
-        cmd = "anaconda -t %s upload -u bokeh %s -c dev --force --no-progress"
+        cmd = "anaconda -t %s upload -u bokeh %s -l dev --force --no-progress"
     else:
-        cmd = "anaconda -t %s upload -u bokeh %s --force --no-progress"
+        cmd = "anaconda -t %s upload -u bokeh %s -l dev -l main --force --no-progress"
 
     files = glob.glob("/home/travis/miniconda/conda-bld/noarch/bokeh*.tar.bz2")
     for file in files:


Test patch:
Repository: bokeh/bokeh

Issue:
[BUG] CustomJS callbacks added after initialization do not work
Using latest bokeh any CustomJS callbacks added after an app is initialized do not seem to ever be called. In the example below for instance we add a button which when clicked should add a JS callback triggered when the selection changes (a contrived example I know). However a change in the selection does not trigger the ``console.log`` after the button has been clicked indicating that the JS callback is not registered correctly:

```python
from bokeh.models import ColumnDataSource, CustomJS, Button
from bokeh.plotting import figure, curdoc
from bokeh.layouts import row

p = figure(tools=['box_select'])
cds = ColumnDataSource(data={'x': [1], 'y': [2]})
p.scatter(x='x', y='y', source=cds)

def add_customjs():
    cds.selected.js_on_change('indices', CustomJS(code='console.log("Test")'))

b = Button()
b.on_click(add_customjs)
r = row(p, b)
curdoc().add_root(r)
```

I have checked that the event is sent but haven't yet dug into what happens to the callback on the BokehJS end.

## Versions

Bokeh: 1.1.0
Python: 3.7
OS: OSX 10.13.4


Discussion:
Actually there seem to be two issues here, when I use `push_notebook` instead of a server app the ``js_property_callback`` on the JS frontend is updated but the new callbacks aren't registered. When I try to do the same in a server app it seems the js_property_callback isn't even updated on the frontend.

Resolving patch:
diff --git a/bokeh/model.py b/bokeh/model.py
--- a/bokeh/model.py
+++ b/bokeh/model.py
@@ -538,12 +538,14 @@ def js_on_change(self, event, *callbacks):
         if event in self.properties():
             event = "change:%s" % event
 
+        old = {k: [cb for cb in cbs] for k, cbs in self.js_property_callbacks.items()}
         if event not in self.js_property_callbacks:
             self.js_property_callbacks[event] = []
         for callback in callbacks:
             if callback in self.js_property_callbacks[event]:
                 continue
             self.js_property_callbacks[event].append(callback)
+        self.trigger('js_property_callbacks', old, self.js_property_callbacks)
 
     def layout(self, side, plot):
         '''


Test patch:
Repository: bokeh/bokeh

Issue:
Allow to offset plot frame's side panel annotations
**Is your feature request related to a problem? Please describe.**
I would like to be able to offset a plot title away from the plot area by an arbitrary amount. Currently the plot border area is dynamically minimized to fit the Title and the Title height appears to be the text height plus a hardcoded offset (https://github.com/bokeh/bokeh/blob/master/bokehjs/src/lib/models/annotations/title.ts#L109)

**Describe the solution you'd like**
I would like to implement a Title.text_line_height (similar to Text.text_line_height), so that the title annotation could have an arbitrary height. We may have to reconsider the Title.vertical_align property (which sets the title inside of the height + hardcoded offset box). This may be better replaced with a Title.text_baseline prop.

**Describe alternatives you've considered**
None

**Additional context**
None



Discussion:
It appears that the Text glyph only supports top/middle/bottom baselines, so perhaps mirroring that and migrating towards Title.text_baseline from Title.vertical_align be enough and good for consistency sake.

Resolving patch:
diff --git a/bokeh/models/annotations.py b/bokeh/models/annotations.py
--- a/bokeh/models/annotations.py
+++ b/bokeh/models/annotations.py
@@ -985,6 +985,12 @@ class Title(TextAnnotation):
     Alignment of the text in its enclosing space, *along* the direction of the text.
     """)
 
+    text_line_height = Float(default=1.0, help="""
+    How much additional space should be allocated for the title. The value is provided
+    as a number, but should be treated as a percentage of font size. The default is
+    100%, which means no additional space will be used.
+    """)
+
     offset = Float(default=0, help="""
     Offset the text by a number of pixels (can be positive or negative). Shifts the text in
     different directions based on the location of the title:


Test patch:
diff --git a/bokeh/models/tests/test_annotations.py b/bokeh/models/tests/test_annotations.py
--- a/bokeh/models/tests/test_annotations.py
+++ b/bokeh/models/tests/test_annotations.py
@@ -381,6 +381,7 @@ def test_Title():
     assert title.text_font_style == 'bold'
     assert title.text_color == '#444444'
     assert title.text_alpha == 1.0
+    assert title.text_line_height == 1.0
     check_fill_properties(title, "background_", None, 1.0)
     check_line_properties(title, "border_", None, 1.0, 1.0)
     check_properties_existence(title, [
@@ -395,6 +396,7 @@ def test_Title():
         "text_font_style",
         "text_color",
         "text_alpha",
+        "text_line_height",
         "render_mode"],
         prefix('border_', LINE),
         prefix('background_', FILL))
Repository: bokeh/bokeh

Issue:
[BUG] layout accepts name as keyword arg but doesn't pass to underlying objects
#### software version info
bokeh 1.0.4
python 3.7.1

#### Description of expected behavior and the observed behavior
`bokeh.layouts.layout()` should be capable of taking a `name` argument for use in embedding as described [here](https://bokeh.pydata.org/en/latest/docs/user_guide/embed.html#standard-template).  Currently you can pass a `name` but it fizzles silently.
#### Complete, minimal, self-contained example code that reproduces the issue

```

from bokeh.plotting import figure
from bokeh.layouts import layout

if __name__ == "__main__":
    fig = figure()
    fig2 = figure()
    lay = layout([fig, fig2], name='test')
    print(lay.name)

```

output:

```
(base) $ python test_layout.py
None
```

Looking at the [underlying code](https://github.com/bokeh/bokeh/blob/master/bokeh/layouts.py#L182), this could be fixed by having `_create_grid()` in `bokeh.layouts` take the remaining `kwargs` and pass to the `column()` or `row()` calls.  I'd be happy to contribute a PR for this provided a fix doesn't already exist that I missed.


Discussion:
This is is till present in 1.1.1dev so a PR would definitely be appreciated!

Resolving patch:
diff --git a/bokeh/layouts.py b/bokeh/layouts.py
--- a/bokeh/layouts.py
+++ b/bokeh/layouts.py
@@ -219,7 +219,7 @@ def layout(*args, **kwargs):
     children = _handle_children(*args, children=children)
 
     # Make the grid
-    return _create_grid(children, sizing_mode)
+    return _create_grid(children, sizing_mode, **kwargs)
 
 def gridplot(children, sizing_mode=None, toolbar_location='above', ncols=None,
              plot_width=None, plot_height=None, toolbar_options=None, merge_tools=True):
@@ -590,7 +590,7 @@ def _handle_children(*args, **kwargs):
     return children
 
 
-def _create_grid(iterable, sizing_mode, layer=0):
+def _create_grid(iterable, sizing_mode, layer=0, **kwargs):
     """Recursively create grid from input lists."""
     return_list = []
     for item in iterable:
@@ -606,8 +606,8 @@ def _create_grid(iterable, sizing_mode, layer=0):
                 Tried to insert: %s of type %s""" % (item, type(item))
             )
     if layer % 2 == 0:
-        return column(children=return_list, sizing_mode=sizing_mode)
-    return row(children=return_list, sizing_mode=sizing_mode)
+        return column(children=return_list, sizing_mode=sizing_mode, **kwargs)
+    return row(children=return_list, sizing_mode=sizing_mode, **kwargs)
 
 
 def _chunks(l, ncols):


Test patch:
diff --git a/bokeh/tests/test_layouts.py b/bokeh/tests/test_layouts.py
--- a/bokeh/tests/test_layouts.py
+++ b/bokeh/tests/test_layouts.py
@@ -85,6 +85,14 @@ def test_layout_simple():
         assert isinstance(r, Row)
 
 
+def test_layout_kwargs():
+    p1, p2, p3, p4 = figure(), figure(), figure(), figure()
+
+    grid = layout([[p1, p2], [p3, p4]], sizing_mode='fixed', name='simple')
+
+    assert grid.name == 'simple'
+
+
 def test_layout_nested():
     p1, p2, p3, p4, p5, p6 = figure(), figure(), figure(), figure(), figure(), figure()
Repository: bokeh/bokeh

Issue:
remove h_symmetry, v_symmetry




Discussion:

Resolving patch:
diff --git a/bokeh/models/plots.py b/bokeh/models/plots.py
--- a/bokeh/models/plots.py
+++ b/bokeh/models/plots.py
@@ -35,7 +35,6 @@
 from ..core.validation.errors import BAD_EXTRA_RANGE_NAME, REQUIRED_RANGE, REQUIRED_SCALE, INCOMPATIBLE_SCALE_AND_RANGE
 from ..core.validation.warnings import MISSING_RENDERERS, FIXED_SIZING_MODE, FIXED_WIDTH_POLICY, FIXED_HEIGHT_POLICY
 from ..model import Model, collect_filtered_models
-from ..util.deprecation import deprecated
 from ..util.string import nice_join
 
 from .annotations import Legend, Title
@@ -617,23 +616,6 @@ def _scale(cls, scale):
     it will override ``min_border``.
     """)
 
-
-    @property
-    def h_symmetry(self):
-        deprecated("h_symmetry has been non-functional since before Bokeh 1.0 and will be removed at Bokeh 2.0")
-
-    @h_symmetry.setter
-    def h_symmetry(self, _):
-        deprecated("h_symmetry has been non-functional since before Bokeh 1.0 and will be removed at Bokeh 2.0")
-
-    @property
-    def v_symmetry(self):
-        deprecated("v_symmetry has been non-functional since before Bokeh 1.0 and will be removed at Bokeh 2.0")
-
-    @v_symmetry.setter
-    def v_symmetry(self, _):
-        deprecated("v_symmetry has been non-functional since before Bokeh 1.0 and will be removed at Bokeh 2.0")
-
     lod_factor = Int(10, help="""
     Decimation factor to use when applying level-of-detail decimation.
     """)


Test patch:
Repository: bokeh/bokeh

Issue:
Fix YAMLLoadWarning in deps.py
> scripts/deps.py:17: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.



Discussion:

Resolving patch:
diff --git a/scripts/deps.py b/scripts/deps.py
--- a/scripts/deps.py
+++ b/scripts/deps.py
@@ -14,7 +14,8 @@ def _setup(**kw): data.update(kw)
     return data
 
 meta_src = jinja2.Template(open("conda.recipe/meta.yaml").read())
-meta_src = yaml.load(meta_src.render(load_setup_py_data=load_setup_py_data))
+meta_src = yaml.load(meta_src.render(load_setup_py_data=load_setup_py_data),
+                     Loader=yaml.FullLoader)
 
 section = {
     "build"  : meta_src["requirements"]["build"],


Test patch:
Repository: bokeh/bokeh

Issue:
Color regex needs raw string
Warning in CI: 

> bokeh/core/property/color.py:137
  /home/travis/build/bokeh/bokeh/bokeh/core/property/color.py:137: DeprecationWarning: invalid escape sequence \d
    value = colors.RGB(*[int(val) for val in re.findall("\d+", value)[:3]]).to_hex()



Discussion:

Resolving patch:
diff --git a/bokeh/core/property/color.py b/bokeh/core/property/color.py
--- a/bokeh/core/property/color.py
+++ b/bokeh/core/property/color.py
@@ -137,7 +137,7 @@ def transform(self, value):
         if isinstance(value, string_types):
             value = value.lower()
             if value.startswith('rgb'):
-                value = colors.RGB(*[int(val) for val in re.findall("\d+", value)[:3]]).to_hex()
+                value = colors.RGB(*[int(val) for val in re.findall(r"\d+", value)[:3]]).to_hex()
             elif value in enums.NamedColor:
                 value = getattr(colors.named, value).to_hex()
         elif isinstance(value, tuple):


Test patch:
Repository: bokeh/bokeh

Issue:
[BUG] Development guide missing `test` argument for conda install and pytest install failure on windows
### Missing `test` argument

The current [developement guide](https://bokeh.pydata.org/en/latest/docs/dev_guide/setup.html#conda-packages) is missing the `test` argument for windows setups. 

As for OSX / Linux (bash / sh), it is: 
- ```conda install `python scripts/deps.py build run test```.

As for windows, the `test` argument is missing for the `deps.py`:
- ```conda install $(python scripts/deps.py build run).split() | where {$_}```
- ```for /F "delims=" %i in ('python scripts\deps.py build run') do (conda install %i)```

Instead, it should be:
- ```conda install $(python scripts/deps.py build run test).split() | where {$_}```
- ```for /F "delims=" %i in ('python scripts\deps.py build run test') do (conda install %i)```

### `pytest<5.0.0` fails
In addition, running ```for /F "delims=" %i in ('python scripts\deps.py build run test') do (conda install %i)``` fails with error `System can't find given file.` which is due to `pytest<5.0.0`. Providing double quotes actually fixes the issue -> `conda install "pytest<5.0.0"`.


Discussion:

Resolving patch:
diff --git a/scripts/deps.py b/scripts/deps.py
--- a/scripts/deps.py
+++ b/scripts/deps.py
@@ -1,4 +1,5 @@
 import sys
+import platform
 import jinja2
 import yaml
 
@@ -31,6 +32,10 @@ def _setup(**kw): data.update(kw)
 # bare python unpins python version causing upgrade to latest
 if 'python' in spec: spec.remove('python')
 
+# add double quotes to specs for windows, fixes #9065
+if "windows" in platform.platform().lower():
+    spec = ['"{}"'.format(s) for s in spec]
+
 deps = ""
 deps += " ".join(s for s in spec)
 deps = deps.replace(' >=', '>=')  # conda syntax doesn't allow spaces b/w pkg name and version spec


Test patch:
Repository: bokeh/bokeh

Issue:
[BUG] double slash before prefix in autoreload.js
Python 2.7
Bokeh 1.2.0

Resource urls in autoreload.js have double slashes before prefix if server has a prefix

```python
from bokeh.server.tests.utils import ManagedServerLoop, url, http_get

def test_urls_in_autoreloadjs():
    with ManagedServerLoop(Application(), prefix='PREFIX') as server:
        absolute_url = '{server}{prefix}/'.format(server=url(server),  prefix=server.prefix)
        resp = http_get(
            server.io_loop,
            absolute_url + 'autoload.js?bokeh-autoload-element=foo&bokeh-absolute-url=' + absolute_url
        )
        js_code = resp.buffer.read()
        assert not re.findall('\/\/PREFIX', js_code)
```

So autoreload.js can't load files
![image](https://user-images.githubusercontent.com/17899808/61289719-ae415a00-a7d2-11e9-87ab-d26573896b4b.png)



Discussion:

Resolving patch:
diff --git a/bokeh/server/views/autoload_js_handler.py b/bokeh/server/views/autoload_js_handler.py
--- a/bokeh/server/views/autoload_js_handler.py
+++ b/bokeh/server/views/autoload_js_handler.py
@@ -68,7 +68,7 @@ def get(self, *args, **kwargs):
         absolute_url = self.get_argument("bokeh-absolute-url", default=None)
 
         if absolute_url:
-            server_url = '{uri.scheme}://{uri.netloc}/'.format(uri=urlparse(absolute_url))
+            server_url = '{uri.scheme}://{uri.netloc}'.format(uri=urlparse(absolute_url))
         else:
             server_url = None
         resources = self.application.resources(server_url)


Test patch:
Repository: bokeh/bokeh

Issue:
Update dataset for parallel coords plot examples
The example currently does this:
```
df = pd.read_csv("https://raw.githubusercontent.com/bcdunbar/datasets/master/parcoords_data.csv")
```

Which is not really great. We should add a data set to `sampledata` and use that. 



Discussion:

Resolving patch:
diff --git a/examples/custom/parallel_plot/parallel_plot.py b/examples/custom/parallel_plot/parallel_plot.py
--- a/examples/custom/parallel_plot/parallel_plot.py
+++ b/examples/custom/parallel_plot/parallel_plot.py
@@ -1,11 +1,11 @@
 import numpy as np
-import pandas as pd
 
 from bokeh.plotting import figure
 from bokeh.layouts import column
 from bokeh.models import (Range1d, ColumnDataSource, Div, LinearAxis,
                           LinearColorMapper, MultiLine,
                           FixedTicker, BasicTickFormatter, FuncTickFormatter)
+from bokeh.sampledata.autompg import autompg_clean as df
 
 from parallel_selection_tool import ParallelSelectionTool
 from parallel_reset import ParallelResetTool
@@ -109,7 +109,9 @@ def parallel_plot(df, color=None, palette=None):
 if __name__ == '__main__':
     from bokeh.palettes import Viridis256
     from bokeh.io import show
-    df = pd.read_csv("https://raw.githubusercontent.com/bcdunbar/datasets/master/parcoords_data.csv")
+    del df['origin']
+    del df['mfr']
+    del df['name']
     p = parallel_plot(df=df, color=df[df.columns[0]], palette=Viridis256)
     div = Div(text="Select up and down column grid lines to define filters. Double click a filter to reset it.")
     show(column(div, p))


Test patch:
diff --git a/scripts/ci/test.examples b/scripts/ci/test.examples
--- a/scripts/ci/test.examples
+++ b/scripts/ci/test.examples
@@ -14,6 +14,5 @@ py.test -s -v -m examples       \
     --tb line                   \
     --diff-ref FETCH_HEAD       \
     --self-contained-html       \
-    --upload                    \
     --report-path=examples.html \
     ${EXTRA_CMD}
diff --git a/tests/baselines/examples/custom/parallel_plot/parallel_plot b/tests/baselines/examples/custom/parallel_plot/parallel_plot
--- a/tests/baselines/examples/custom/parallel_plot/parallel_plot
+++ b/tests/baselines/examples/custom/parallel_plot/parallel_plot
@@ -10,9 +10,5 @@ Column bbox=[0, 0, 1000, 629]
     LinearAxis bbox=[970, 5, 0, 571]
     LinearAxis bbox=[970, 5, 0, 571]
     LinearAxis bbox=[970, 5, 0, 571]
-    LinearAxis bbox=[970, 5, 0, 571]
-    LinearAxis bbox=[970, 5, 0, 571]
-    LinearAxis bbox=[970, 5, 0, 571]
-    LinearAxis bbox=[970, 5, 0, 571]
     Title bbox=[5, 5, 965, 0]
     ToolbarPanel bbox=[970, 5, 30, 571]
Repository: bokeh/bokeh

Issue:
Generate ES6 (ES2015) compatible bundles
This is the first step to make ES6 target the default. For now bundles will be generated, but otherwise nothing changes. At 2.0 ES6 bundles will replace ES5. Support for IE and phantomjs will still be possible, either by explicitly including legacy bundles or by using conditional comments and including both (perfectly suitable for non-`INLINE` cases). I'm doing this in two steps, because I want to limit the surface area of changes and possible merge conflicts.


Discussion:

Resolving patch:
diff --git a/bokeh/io/export.py b/bokeh/io/export.py
--- a/bokeh/io/export.py
+++ b/bokeh/io/export.py
@@ -28,7 +28,7 @@
 from tempfile import mkstemp
 
 # External imports
-from six import raise_from, b
+from six import raise_from
 
 # Bokeh imports
 from ..embed import file_html
@@ -239,8 +239,8 @@ def get_svgs(obj, driver=None, timeout=5, **kwargs):
     '''
     with _tmp_html() as tmp:
         html = get_layout_html(obj, **kwargs)
-        with io.open(tmp.path, mode="wb") as file:
-            file.write(b(html))
+        with io.open(tmp.path, mode="w", encoding="utf-8") as file:
+            file.write(decode_utf8(html))
 
         web_driver = driver if driver is not None else webdriver_control.get()
 


Test patch:
diff --git a/bokehjs/test/size.ts b/bokehjs/test/size.ts
--- a/bokehjs/test/size.ts
+++ b/bokehjs/test/size.ts
@@ -7,11 +7,17 @@ const build_dir = path.normalize(`${__dirname}/..`) // build/test -> build
 
 const LIMITS: {[key: string]: number} = {
   // js
-  "js/bokeh.min.js":           750,
-  "js/bokeh-widgets.min.js":   100,
-  "js/bokeh-tables.min.js":    270,
-  "js/bokeh-api.min.js":        90,
-  "js/bokeh-gl.min.js":         70,
+  "js/bokeh.min.js":             770,
+  "js/bokeh-widgets.min.js":     100,
+  "js/bokeh-tables.min.js":      270,
+  "js/bokeh-api.min.js":          90,
+  "js/bokeh-gl.min.js":           70,
+  // es6
+  "js/bokeh-es6.min.js":         640,
+  "js/bokeh-widgets-es6.min.js":  90,
+  "js/bokeh-tables-es6.min.js":  250,
+  "js/bokeh-api-es6.min.js":      90,
+  "js/bokeh-gl-es6.min.js":       70,
   // css
   "css/bokeh.min.css":           0,
   "css/bokeh-widgets.min.css":   0,
Repository: bokeh/bokeh

Issue:
[FEATURE] Print full stacktrace on error
See discussion on [discussion forum](https://discourse.bokeh.org/t/debugging-recommendations/3934)

**Is your feature request related to a problem? Please describe.**
My underlying application is getting very big and when running into problems the debugging takes me a lot of time. 

For example I now just get the line:
2019-08-26 13:57:29,620 error handling message Message ‘EVENT’ (revision 1) content: ‘{“event_name”:“button_click”,“event_values”:{“model_id”:“1027”}}’: ValueError(‘Wrong number of items passed 2, placement implies 1’)

**Describe the solution you'd like**
My desired solution is to see the stacktrace which includes the file and line of the source of the error.

@bryevdv pointed me to the protocol_handler.py script

**Describe alternatives you've considered**
The alternative is to set debug level, but I only want error handling improved, not have a full log. Also, I want the error to show directly, because I may not know how to reproduce it on a running server.

PR created

**Additional context**
I am not worried about the log getting too long. Errors should in general not occur, they should be fixed or at least be caught in case they are acceptable


Discussion:

Resolving patch:
diff --git a/bokeh/server/protocol_handler.py b/bokeh/server/protocol_handler.py
--- a/bokeh/server/protocol_handler.py
+++ b/bokeh/server/protocol_handler.py
@@ -99,8 +99,8 @@ def handle(self, message, connection):
         try:
             work = yield handler(message, connection)
         except Exception as e:
-            log.error("error handling message %r: %r", message, e)
-            log.debug("  message header %r content %r", message.header, message.content, exc_info=1)
+            log.error("error handling message\n message: %r \n error: %r",
+                      message, e, exc_info=True)
             work = connection.error(message, repr(e))
         raise gen.Return(work)
 


Test patch: