We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Typo in DataFrame example page
I'm trying out `pn.widget.DataFrame`. I noticed a typo on the example page `https://github.com/pyviz/panel/blob/45177aa5fa30c89ea26a942385bd7878e60dd323/examples/reference/widgets/DataFrame.ipynb`.    
   
Under the list of Core options, `fit_column` should be `fit_columns`.    
   
Side note: The explanation of fit_columns threw me off at first. I was thinking/hoping it would fit to minimum width based on column contents, but instead it expanded to total widget width. I see I can mostly get what I want via a `width` dict so I'll go that route, just wanted to point out it was slightly confusing.   

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `panel/widgets/tables.py`
Content:
```
1 from __future__ import absolute_import, division, unicode_literals
2 
3 
4 import param
5 
6 from bokeh.models import ColumnDataSource
7 from bokeh.models.widgets import (
8     DataTable, TableColumn, NumberEditor, NumberFormatter,
9     DateFormatter, DateEditor, StringFormatter, StringEditor, IntEditor
10 )
11 
12 from ..viewable import Layoutable
13 from ..util import isdatetime
14 from .base import Widget
15 
16 
17 class DataFrame(Widget):
18 
19     editors = param.Dict(default={}, doc="""
20       Bokeh CellEditor to use for a particular column
21       (overrides the default chosen based on the type).""")
22 
23     formatters = param.Dict(default={}, doc="""
24       Bokeh CellFormatter to use for a particular column
25       (overrides the default chosen based on the type).""")
26 
27     fit_columns = param.Boolean(default=True, doc="""
28       Whether columns should be fit to the available width.
29       This results in no horizontal scrollbar showing up, but data
30       can get unreadable if there is no enough space available.""")
31 
32     selection = param.List(default=[], doc="""
33       The currently selected rows of the table.""")
34 
35     row_height = param.Integer(default=25, doc="""
36       The height of each table row.""")
37 
38     widths = param.Dict(default={}, doc="""
39       A mapping from column name to column width.""")
40 
41     value = param.Parameter(default=None)
42 
43     _manual_params = ['value', 'editors', 'formatters', 'selection', 'width']
44 
45     def __init__(self, value=None, **params):
46         super(DataFrame, self).__init__(value=value, **params)
47         self._renamed_cols = {}
48 
49     def _get_columns(self):
50         if self.value is None:
51             return []
52 
53         index = [self.value.index.name or 'index']
54         col_names = index + list(self.value.columns)
55         columns = []
56         for col in col_names:
57             if col in self.value.columns:
58                 data = self.value[col]
59             else:
60                 data = self.value.index
61             kind = data.dtype.kind
62             if kind == 'i':
63                 formatter = NumberFormatter()
64                 editor = IntEditor()
65             elif kind == 'f':
66                 formatter = NumberFormatter(format='0,0.0[00000]')
67                 editor = NumberEditor()
68             elif isdatetime(data):
69                 formatter = DateFormatter(format='%Y-%m-%d %H:%M:%S')
70                 editor = DateEditor()
71             else:
72                 formatter = StringFormatter()
73                 editor = StringEditor()
74             if col in self.editors:
75                 editor = self.editors[col]
76             if col in self.formatters:
77                 formatter = self.formatters[col]
78             if str(col) != col:
79                 self._renamed_cols[str(col)] = col
80             width = self.widths.get(str(col))
81             column = TableColumn(field=str(col), title=str(col),
82                                  editor=editor, formatter=formatter,
83                                  width=width)
84             columns.append(column)
85         return columns
86 
87     def _get_properties(self):
88         props = {p : getattr(self, p) for p in list(Layoutable.param)
89                  if getattr(self, p) is not None}
90         if self.value is None:
91             data = {}
92         else:
93             data = {k if isinstance(k, str) else str(k): v
94                     for k, v in ColumnDataSource.from_df(self.value).items()}
95         if props.get('height', None) is None:
96             length = max([len(v) for v in data.values()]) if data else 0
97             props['height'] = length * self.row_height + 30
98         props['source'] = ColumnDataSource(data=data)
99         props['columns'] = self._get_columns()
100         props['index_position'] = None
101         props['fit_columns'] = self.fit_columns
102         props['row_height'] = self.row_height
103         props['editable'] = not self.disabled
104         return props
105 
106     def _process_param_change(self, msg):
107         if 'disabled' in msg:
108             msg['editable'] = not msg.pop('disabled')
109         return super(DataFrame, self)._process_param_change(msg)
110     
111     def _get_model(self, doc, root=None, parent=None, comm=None):
112         model = DataTable(**self._get_properties())
113         if root is None:
114             root = model
115         self._link_props(model.source, ['data', ('patching', 'data')], doc, root, comm)
116         self._link_props(model.source.selected, ['indices'], doc, root, comm)
117         self._models[root.ref['id']] = (model, parent)
118         return model
119 
120     def _manual_update(self, event, model, doc, root, parent, comm):
121         if event.name == 'value':
122             cds = model.source
123             data = {k if isinstance(k, str) else str(k): v
124                     for k, v in ColumnDataSource.from_df(self.value).items()}
125             cds.data = data
126             model.columns = self._get_columns()
127         elif event.name == 'selection':
128             model.source.selected.indices = self.selection
129         else:
130             for col in model.columns:
131                 if col.name in self.editors:
132                     col.editor = self.editors[col.name]
133                 if col.name in self.formatters:
134                     col.formatter = self.formatters[col.name]
135                 if col.name in self.widths:
136                     col.width = self.widths[col.name]
137 
138     def _process_events(self, events):
139         if 'data' in events:
140             data = events.pop('data')
141             updated = False
142             for k, v in data.items():
143                 if k == 'index':
144                     continue
145                 k = self._renamed_cols.get(k, k)
146                 if isinstance(v, dict):
147                     v = [v for k, v in sorted(v.items(), key=lambda k: int(k[0]))]
148                 try:
149                     isequal = (self.value[k].values == v).all()
150                 except:
151                     isequal = False
152                 if not isequal:
153                     self.value[k] = v
154                     updated = True
155             if updated:
156                 self.param.trigger('value')
157         if 'indices' in events:
158             self.selected = events.pop('indices')
159         super(DataFrame, self)._process_events(events)
160 
161     @property
162     def selected_dataframe(self):
163         """
164         Returns a DataFrame of the currently selected rows.
165         """
166         if not self.selection:
167             return self.value
168         return self.value.iloc[self.selection]
169
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/panel/widgets/tables.py b/panel/widgets/tables.py
--- a/panel/widgets/tables.py
+++ b/panel/widgets/tables.py
@@ -25,7 +25,7 @@
       (overrides the default chosen based on the type).""")
 
     fit_columns = param.Boolean(default=True, doc="""
-      Whether columns should be fit to the available width.
+      Whether columns should expand to the available width.
       This results in no horizontal scrollbar showing up, but data
       can get unreadable if there is no enough space available.""")

{"golden_diff": "diff --git a/panel/widgets/tables.py b/panel/widgets/tables.py\n--- a/panel/widgets/tables.py\n+++ b/panel/widgets/tables.py\n@@ -25,7 +25,7 @@\n       (overrides the default chosen based on the type).\"\"\")\n \n     fit_columns = param.Boolean(default=True, doc=\"\"\"\n-      Whether columns should be fit to the available width.\n+      Whether columns should expand to the available width.\n       This results in no horizontal scrollbar showing up, but data\n       can get unreadable if there is no enough space available.\"\"\")\n", "issue": "Typo in DataFrame example page\nI'm trying out `pn.widget.DataFrame`. I noticed a typo on the example page `https://github.com/pyviz/panel/blob/45177aa5fa30c89ea26a942385bd7878e60dd323/examples/reference/widgets/DataFrame.ipynb`.    \r\n   \r\nUnder the list of Core options, `fit_column` should be `fit_columns`.    \r\n   \r\nSide note: The explanation of fit_columns threw me off at first. I was thinking/hoping it would fit to minimum width based on column contents, but instead it expanded to total widget width. I see I can mostly get what I want via a `width` dict so I'll go that route, just wanted to point out it was slightly confusing.   \n", "before_files": [{"content": "from __future__ import absolute_import, division, unicode_literals\n\n\nimport param\n\nfrom bokeh.models import ColumnDataSource\nfrom bokeh.models.widgets import (\n    DataTable, TableColumn, NumberEditor, NumberFormatter,\n    DateFormatter, DateEditor, StringFormatter, StringEditor, IntEditor\n)\n\nfrom ..viewable import Layoutable\nfrom ..util import isdatetime\nfrom .base import Widget\n\n\nclass DataFrame(Widget):\n\n    editors = param.Dict(default={}, doc=\"\"\"\n      Bokeh CellEditor to use for a particular column\n      (overrides the default chosen based on the type).\"\"\")\n\n    formatters = param.Dict(default={}, doc=\"\"\"\n      Bokeh CellFormatter to use for a particular column\n      (overrides the default chosen based on the type).\"\"\")\n\n    fit_columns = param.Boolean(default=True, doc=\"\"\"\n      Whether columns should be fit to the available width.\n      This results in no horizontal scrollbar showing up, but data\n      can get unreadable if there is no enough space available.\"\"\")\n\n    selection = param.List(default=[], doc=\"\"\"\n      The currently selected rows of the table.\"\"\")\n\n    row_height = param.Integer(default=25, doc=\"\"\"\n      The height of each table row.\"\"\")\n\n    widths = param.Dict(default={}, doc=\"\"\"\n      A mapping from column name to column width.\"\"\")\n\n    value = param.Parameter(default=None)\n\n    _manual_params = ['value', 'editors', 'formatters', 'selection', 'width']\n\n    def __init__(self, value=None, **params):\n        super(DataFrame, self).__init__(value=value, **params)\n        self._renamed_cols = {}\n\n    def _get_columns(self):\n        if self.value is None:\n            return []\n\n        index = [self.value.index.name or 'index']\n        col_names = index + list(self.value.columns)\n        columns = []\n        for col in col_names:\n            if col in self.value.columns:\n                data = self.value[col]\n            else:\n                data = self.value.index\n            kind = data.dtype.kind\n            if kind == 'i':\n                formatter = NumberFormatter()\n                editor = IntEditor()\n            elif kind == 'f':\n                formatter = NumberFormatter(format='0,0.0[00000]')\n                editor = NumberEditor()\n            elif isdatetime(data):\n                formatter = DateFormatter(format='%Y-%m-%d %H:%M:%S')\n                editor = DateEditor()\n            else:\n                formatter = StringFormatter()\n                editor = StringEditor()\n            if col in self.editors:\n                editor = self.editors[col]\n            if col in self.formatters:\n                formatter = self.formatters[col]\n            if str(col) != col:\n                self._renamed_cols[str(col)] = col\n            width = self.widths.get(str(col))\n            column = TableColumn(field=str(col), title=str(col),\n                                 editor=editor, formatter=formatter,\n                                 width=width)\n            columns.append(column)\n        return columns\n\n    def _get_properties(self):\n        props = {p : getattr(self, p) for p in list(Layoutable.param)\n                 if getattr(self, p) is not None}\n        if self.value is None:\n            data = {}\n        else:\n            data = {k if isinstance(k, str) else str(k): v\n                    for k, v in ColumnDataSource.from_df(self.value).items()}\n        if props.get('height', None) is None:\n            length = max([len(v) for v in data.values()]) if data else 0\n            props['height'] = length * self.row_height + 30\n        props['source'] = ColumnDataSource(data=data)\n        props['columns'] = self._get_columns()\n        props['index_position'] = None\n        props['fit_columns'] = self.fit_columns\n        props['row_height'] = self.row_height\n        props['editable'] = not self.disabled\n        return props\n\n    def _process_param_change(self, msg):\n        if 'disabled' in msg:\n            msg['editable'] = not msg.pop('disabled')\n        return super(DataFrame, self)._process_param_change(msg)\n    \n    def _get_model(self, doc, root=None, parent=None, comm=None):\n        model = DataTable(**self._get_properties())\n        if root is None:\n            root = model\n        self._link_props(model.source, ['data', ('patching', 'data')], doc, root, comm)\n        self._link_props(model.source.selected, ['indices'], doc, root, comm)\n        self._models[root.ref['id']] = (model, parent)\n        return model\n\n    def _manual_update(self, event, model, doc, root, parent, comm):\n        if event.name == 'value':\n            cds = model.source\n            data = {k if isinstance(k, str) else str(k): v\n                    for k, v in ColumnDataSource.from_df(self.value).items()}\n            cds.data = data\n            model.columns = self._get_columns()\n        elif event.name == 'selection':\n            model.source.selected.indices = self.selection\n        else:\n            for col in model.columns:\n                if col.name in self.editors:\n                    col.editor = self.editors[col.name]\n                if col.name in self.formatters:\n                    col.formatter = self.formatters[col.name]\n                if col.name in self.widths:\n                    col.width = self.widths[col.name]\n\n    def _process_events(self, events):\n        if 'data' in events:\n            data = events.pop('data')\n            updated = False\n            for k, v in data.items():\n                if k == 'index':\n                    continue\n                k = self._renamed_cols.get(k, k)\n                if isinstance(v, dict):\n                    v = [v for k, v in sorted(v.items(), key=lambda k: int(k[0]))]\n                try:\n                    isequal = (self.value[k].values == v).all()\n                except:\n                    isequal = False\n                if not isequal:\n                    self.value[k] = v\n                    updated = True\n            if updated:\n                self.param.trigger('value')\n        if 'indices' in events:\n            self.selected = events.pop('indices')\n        super(DataFrame, self)._process_events(events)\n\n    @property\n    def selected_dataframe(self):\n        \"\"\"\n        Returns a DataFrame of the currently selected rows.\n        \"\"\"\n        if not self.selection:\n            return self.value\n        return self.value.iloc[self.selection]\n", "path": "panel/widgets/tables.py"}], "after_files": [{"content": "from __future__ import absolute_import, division, unicode_literals\n\n\nimport param\n\nfrom bokeh.models import ColumnDataSource\nfrom bokeh.models.widgets import (\n    DataTable, TableColumn, NumberEditor, NumberFormatter,\n    DateFormatter, DateEditor, StringFormatter, StringEditor, IntEditor\n)\n\nfrom ..viewable import Layoutable\nfrom ..util import isdatetime\nfrom .base import Widget\n\n\nclass DataFrame(Widget):\n\n    editors = param.Dict(default={}, doc=\"\"\"\n      Bokeh CellEditor to use for a particular column\n      (overrides the default chosen based on the type).\"\"\")\n\n    formatters = param.Dict(default={}, doc=\"\"\"\n      Bokeh CellFormatter to use for a particular column\n      (overrides the default chosen based on the type).\"\"\")\n\n    fit_columns = param.Boolean(default=True, doc=\"\"\"\n      Whether columns should expand to the available width.\n      This results in no horizontal scrollbar showing up, but data\n      can get unreadable if there is no enough space available.\"\"\")\n\n    selection = param.List(default=[], doc=\"\"\"\n      The currently selected rows of the table.\"\"\")\n\n    row_height = param.Integer(default=25, doc=\"\"\"\n      The height of each table row.\"\"\")\n\n    widths = param.Dict(default={}, doc=\"\"\"\n      A mapping from column name to column width.\"\"\")\n\n    value = param.Parameter(default=None)\n\n    _manual_params = ['value', 'editors', 'formatters', 'selection', 'width']\n\n    def __init__(self, value=None, **params):\n        super(DataFrame, self).__init__(value=value, **params)\n        self._renamed_cols = {}\n\n    def _get_columns(self):\n        if self.value is None:\n            return []\n\n        index = [self.value.index.name or 'index']\n        col_names = index + list(self.value.columns)\n        columns = []\n        for col in col_names:\n            if col in self.value.columns:\n                data = self.value[col]\n            else:\n                data = self.value.index\n            kind = data.dtype.kind\n            if kind == 'i':\n                formatter = NumberFormatter()\n                editor = IntEditor()\n            elif kind == 'f':\n                formatter = NumberFormatter(format='0,0.0[00000]')\n                editor = NumberEditor()\n            elif isdatetime(data):\n                formatter = DateFormatter(format='%Y-%m-%d %H:%M:%S')\n                editor = DateEditor()\n            else:\n                formatter = StringFormatter()\n                editor = StringEditor()\n            if col in self.editors:\n                editor = self.editors[col]\n            if col in self.formatters:\n                formatter = self.formatters[col]\n            if str(col) != col:\n                self._renamed_cols[str(col)] = col\n            width = self.widths.get(str(col))\n            column = TableColumn(field=str(col), title=str(col),\n                                 editor=editor, formatter=formatter,\n                                 width=width)\n            columns.append(column)\n        return columns\n\n    def _get_properties(self):\n        props = {p : getattr(self, p) for p in list(Layoutable.param)\n                 if getattr(self, p) is not None}\n        if self.value is None:\n            data = {}\n        else:\n            data = {k if isinstance(k, str) else str(k): v\n                    for k, v in ColumnDataSource.from_df(self.value).items()}\n        if props.get('height', None) is None:\n            length = max([len(v) for v in data.values()]) if data else 0\n            props['height'] = length * self.row_height + 30\n        props['source'] = ColumnDataSource(data=data)\n        props['columns'] = self._get_columns()\n        props['index_position'] = None\n        props['fit_columns'] = self.fit_columns\n        props['row_height'] = self.row_height\n        props['editable'] = not self.disabled\n        return props\n\n    def _process_param_change(self, msg):\n        if 'disabled' in msg:\n            msg['editable'] = not msg.pop('disabled')\n        return super(DataFrame, self)._process_param_change(msg)\n    \n    def _get_model(self, doc, root=None, parent=None, comm=None):\n        model = DataTable(**self._get_properties())\n        if root is None:\n            root = model\n        self._link_props(model.source, ['data', ('patching', 'data')], doc, root, comm)\n        self._link_props(model.source.selected, ['indices'], doc, root, comm)\n        self._models[root.ref['id']] = (model, parent)\n        return model\n\n    def _manual_update(self, event, model, doc, root, parent, comm):\n        if event.name == 'value':\n            cds = model.source\n            data = {k if isinstance(k, str) else str(k): v\n                    for k, v in ColumnDataSource.from_df(self.value).items()}\n            cds.data = data\n            model.columns = self._get_columns()\n        elif event.name == 'selection':\n            model.source.selected.indices = self.selection\n        else:\n            for col in model.columns:\n                if col.name in self.editors:\n                    col.editor = self.editors[col.name]\n                if col.name in self.formatters:\n                    col.formatter = self.formatters[col.name]\n                if col.name in self.widths:\n                    col.width = self.widths[col.name]\n\n    def _process_events(self, events):\n        if 'data' in events:\n            data = events.pop('data')\n            updated = False\n            for k, v in data.items():\n                if k == 'index':\n                    continue\n                k = self._renamed_cols.get(k, k)\n                if isinstance(v, dict):\n                    v = [v for k, v in sorted(v.items(), key=lambda k: int(k[0]))]\n                try:\n                    isequal = (self.value[k].values == v).all()\n                except:\n                    isequal = False\n                if not isequal:\n                    self.value[k] = v\n                    updated = True\n            if updated:\n                self.param.trigger('value')\n        if 'indices' in events:\n            self.selected = events.pop('indices')\n        super(DataFrame, self)._process_events(events)\n\n    @property\n    def selected_dataframe(self):\n        \"\"\"\n        Returns a DataFrame of the currently selected rows.\n        \"\"\"\n        if not self.selection:\n            return self.value\n        return self.value.iloc[self.selection]\n", "path": "panel/widgets/tables.py"}]}