Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hotfix 0.12.2 #2699

Merged
merged 34 commits into from
Sep 16, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
427285e
Fix #2631 - handle RuntimeError: dictionary changed size during itera…
MarcSkovMadsen Aug 13, 2021
fd4ef81
Ensure tests pass in packaged version (#2636)
philippjfr Aug 16, 2021
eee264c
Add option to hide constant parameters (#2637)
philippjfr Aug 16, 2021
0113b5b
Add support for bokeh 2.4 (#2644)
philippjfr Aug 18, 2021
1f6d950
Ensure sessions get distinct files in config (#2646)
philippjfr Aug 20, 2021
6db7f1e
Fix bug when updating Trend data (#2647)
philippjfr Aug 20, 2021
434db02
Enhance templates docs (#2658)
maximlt Aug 23, 2021
4a035eb
Added on_session_destroyed callback (#2659)
nghenzi Aug 24, 2021
cffe31d
Cleanup
philippjfr Aug 24, 2021
5683131
Ensure sorters are applied correctly after updating Tabulator value (…
philippjfr Aug 24, 2021
d1178e4
Add Folium reference notebook (#2672)
maximlt Aug 27, 2021
261c0cd
Fix compatibility with bokeh 2.4 DocumentCallbackManager (#2687)
philippjfr Aug 29, 2021
4d2fe35
correctly accessing the filtered dataframe for selection of tabulator…
Stubatiger Aug 29, 2021
f41ee93
Ensure threaded servers are killed after test failures (#2688)
philippjfr Aug 29, 2021
9a4d268
Unpin xarray
philippjfr Aug 29, 2021
eb09140
Unescape child literal HTML in ReactiveHTML (#2690)
philippjfr Aug 30, 2021
9d2b8bf
Stricter validation for linking syntax in ReactiveHTML._template (#2689)
philippjfr Aug 30, 2021
66b235c
fix-reloading (#2692)
MarcSkovMadsen Aug 31, 2021
abb91ad
Ensure Trend indicator can be rendered in layout (#2694)
philippjfr Aug 31, 2021
36b9b4f
Resolve remaining compatibility issues with bokeh 2.4 (#2696)
philippjfr Sep 1, 2021
46d6011
resize plot when window resizes (#2704)
MarcSkovMadsen Sep 2, 2021
9de422d
Editable sliders' `name` can be changed (#2678)
maximlt Sep 2, 2021
6109d5f
Switch binder links to latest version (#2705)
philippjfr Sep 2, 2021
ca119e3
fix-plotly-mapbox-relayout (#2717)
MarcSkovMadsen Sep 5, 2021
d87bf4c
Add the version number in the binder badge (#2711)
maximlt Sep 5, 2021
51bbaac
Support assignment operators in ReactiveHTML scripts (#2718)
philippjfr Sep 5, 2021
5d7a023
Fix support for async functions on pn.state.add_periodic_callback (#2…
philippjfr Sep 15, 2021
b2a7b20
Upgrade to bokeh 2.4 and drop compatibility for older versions (#2739)
philippjfr Sep 16, 2021
fe725a0
Update changelog
philippjfr Sep 16, 2021
7b85852
Fix rebase error
philippjfr Sep 16, 2021
fd5bfa5
Fix flake
philippjfr Sep 16, 2021
9ccfd14
Bump panel.js version
philippjfr Sep 16, 2021
afbe062
Fix rc version
maximlt Sep 16, 2021
07785ff
Update bokeh versions
maximlt Sep 16, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ jobs:
DESC: "Python ${{ matrix.python-version }} tests"
HV_REQUIREMENTS: "unit_tests"
PYTHON_VERSION: ${{ matrix.python-version }}
CHANS_DEV: "-c pyviz/label/dev -c bokeh -c conda-forge"
CHANS: "-c pyviz -c bokeh -c conda-forge"
CHANS_DEV: "-c pyviz/label/dev -c bokeh/label/dev -c conda-forge"
CHANS: "-c pyviz -c bokeh/label/dev -c conda-forge"
DISPLAY: ":99.0"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
Expand Down
32 changes: 32 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,37 @@
# Releases

## Version 0.12.2

Date: 2021-09-16

This a patch release with a small number of bug fixes and compatibility for bokeh 2.4. Many thanks to the contributors @Stubatiger, @maximlt, @nghenzi and the maintainers @MarcSkovMadsen and @philippjfr for the fixes in this release.

Enhancements:

Add option to hide constant parameters on `Param` pane (#2637)
Added on_session_destroyed callback (#2659)
- Stricter validation for linking syntax in `ReactiveHTML._template` (#2689)

Bug fixes:

- Improved thread safety (#2631)
- Ensure sessions get distinct files in `config` (#2646)
- Fix bug when updating `Trend` data (#2647)
- Ensure sorters are applied correctly after updating `Tabulator` value (#2639)
- Correctly reflect filtered data on `Tabulator.selection` (#2676)
- Unescape child literal HTML in ReactiveHTML (#2690)
- Ensure Trend indicator can be rendered in layout (#2694)

Documentation:

- Enhance templates docs (#2658)
- Add Folium reference notebook (#2672)

Compatibility:

- Add support for bokeh 2.4 (#2644, #2687, #2696)


## Version 0.12.1

Date: 2021-08-10
Expand Down
2 changes: 2 additions & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ include panel/models/vtk/*.ts
include panel/_templates/*.js
include panel/_templates/*.html
include panel/tests/test_data/*.png
include panel/tests/pane/assets/*.mp3
include panel/tests/pane/assets/*.mp4
recursive-include panel/template *.html
recursive-include panel/template *.css
recursive-include panel/template *.js
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
| Latest dev release | [![Github tag](https://img.shields.io/github/v/tag/holoviz/panel.svg?label=tag&colorB=11ccbb)](https://github.com/holoviz/panel/tags) [![dev-site](https://img.shields.io/website-up-down-green-red/https/pyviz-dev.github.io/panel.svg?label=dev%20website)](https://pyviz-dev.github.io/panel/) |
| Latest release | [![Github release](https://img.shields.io/github/release/holoviz/panel.svg?label=tag&colorB=11ccbb)](https://github.com/holoviz/panel/releases) [![PyPI version](https://img.shields.io/pypi/v/panel.svg?colorB=cc77dd)](https://pypi.python.org/pypi/panel) [![panel version](https://img.shields.io/conda/v/pyviz/panel.svg?colorB=4488ff&style=flat)](https://anaconda.org/pyviz/panel) [![conda-forge version](https://img.shields.io/conda/v/conda-forge/panel.svg?label=conda%7Cconda-forge&colorB=4488ff)](https://anaconda.org/conda-forge/panel) [![defaults version](https://img.shields.io/conda/v/anaconda/panel.svg?label=conda%7Cdefaults&style=flat&colorB=4488ff)](https://anaconda.org/anaconda/panel) |
| Docs | [![gh-pages](https://img.shields.io/github/last-commit/holoviz/panel/gh-pages.svg)](https://github.com/holoviz/panel/tree/gh-pages) [![site](https://img.shields.io/website-up-down-green-red/https/panel.holoviz.org.svg)](https://panel.holoviz.org) |
| Binder | [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/holoviz/panel/master?urlpath=lab/tree/examples) |
| Binder | [![Binder](https://img.shields.io/badge/launch%20v0.12.1-binder-579aca.svg?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFkAAABZCAMAAABi1XidAAAB8lBMVEX///9XmsrmZYH1olJXmsr1olJXmsrmZYH1olJXmsr1olJXmsrmZYH1olL1olJXmsr1olJXmsrmZYH1olL1olJXmsrmZYH1olJXmsr1olL1olJXmsrmZYH1olL1olJXmsrmZYH1olL1olL0nFf1olJXmsrmZYH1olJXmsq8dZb1olJXmsrmZYH1olJXmspXmspXmsr1olL1olJXmsrmZYH1olJXmsr1olL1olJXmsrmZYH1olL1olLeaIVXmsrmZYH1olL1olL1olJXmsrmZYH1olLna31Xmsr1olJXmsr1olJXmsrmZYH1olLqoVr1olJXmsr1olJXmsrmZYH1olL1olKkfaPobXvviGabgadXmsqThKuofKHmZ4Dobnr1olJXmsr1olJXmspXmsr1olJXmsrfZ4TuhWn1olL1olJXmsqBi7X1olJXmspZmslbmMhbmsdemsVfl8ZgmsNim8Jpk8F0m7R4m7F5nLB6jbh7jbiDirOEibOGnKaMhq+PnaCVg6qWg6qegKaff6WhnpKofKGtnomxeZy3noG6dZi+n3vCcpPDcpPGn3bLb4/Mb47UbIrVa4rYoGjdaIbeaIXhoWHmZYHobXvpcHjqdHXreHLroVrsfG/uhGnuh2bwj2Hxk17yl1vzmljzm1j0nlX1olL3AJXWAAAAbXRSTlMAEBAQHx8gICAuLjAwMDw9PUBAQEpQUFBXV1hgYGBkcHBwcXl8gICAgoiIkJCQlJicnJ2goKCmqK+wsLC4usDAwMjP0NDQ1NbW3Nzg4ODi5+3v8PDw8/T09PX29vb39/f5+fr7+/z8/Pz9/v7+zczCxgAABC5JREFUeAHN1ul3k0UUBvCb1CTVpmpaitAGSLSpSuKCLWpbTKNJFGlcSMAFF63iUmRccNG6gLbuxkXU66JAUef/9LSpmXnyLr3T5AO/rzl5zj137p136BISy44fKJXuGN/d19PUfYeO67Znqtf2KH33Id1psXoFdW30sPZ1sMvs2D060AHqws4FHeJojLZqnw53cmfvg+XR8mC0OEjuxrXEkX5ydeVJLVIlV0e10PXk5k7dYeHu7Cj1j+49uKg7uLU61tGLw1lq27ugQYlclHC4bgv7VQ+TAyj5Zc/UjsPvs1sd5cWryWObtvWT2EPa4rtnWW3JkpjggEpbOsPr7F7EyNewtpBIslA7p43HCsnwooXTEc3UmPmCNn5lrqTJxy6nRmcavGZVt/3Da2pD5NHvsOHJCrdc1G2r3DITpU7yic7w/7Rxnjc0kt5GC4djiv2Sz3Fb2iEZg41/ddsFDoyuYrIkmFehz0HR2thPgQqMyQYb2OtB0WxsZ3BeG3+wpRb1vzl2UYBog8FfGhttFKjtAclnZYrRo9ryG9uG/FZQU4AEg8ZE9LjGMzTmqKXPLnlWVnIlQQTvxJf8ip7VgjZjyVPrjw1te5otM7RmP7xm+sK2Gv9I8Gi++BRbEkR9EBw8zRUcKxwp73xkaLiqQb+kGduJTNHG72zcW9LoJgqQxpP3/Tj//c3yB0tqzaml05/+orHLksVO+95kX7/7qgJvnjlrfr2Ggsyx0eoy9uPzN5SPd86aXggOsEKW2Prz7du3VID3/tzs/sSRs2w7ovVHKtjrX2pd7ZMlTxAYfBAL9jiDwfLkq55Tm7ifhMlTGPyCAs7RFRhn47JnlcB9RM5T97ASuZXIcVNuUDIndpDbdsfrqsOppeXl5Y+XVKdjFCTh+zGaVuj0d9zy05PPK3QzBamxdwtTCrzyg/2Rvf2EstUjordGwa/kx9mSJLr8mLLtCW8HHGJc2R5hS219IiF6PnTusOqcMl57gm0Z8kanKMAQg0qSyuZfn7zItsbGyO9QlnxY0eCuD1XL2ys/MsrQhltE7Ug0uFOzufJFE2PxBo/YAx8XPPdDwWN0MrDRYIZF0mSMKCNHgaIVFoBbNoLJ7tEQDKxGF0kcLQimojCZopv0OkNOyWCCg9XMVAi7ARJzQdM2QUh0gmBozjc3Skg6dSBRqDGYSUOu66Zg+I2fNZs/M3/f/Grl/XnyF1Gw3VKCez0PN5IUfFLqvgUN4C0qNqYs5YhPL+aVZYDE4IpUk57oSFnJm4FyCqqOE0jhY2SMyLFoo56zyo6becOS5UVDdj7Vih0zp+tcMhwRpBeLyqtIjlJKAIZSbI8SGSF3k0pA3mR5tHuwPFoa7N7reoq2bqCsAk1HqCu5uvI1n6JuRXI+S1Mco54YmYTwcn6Aeic+kssXi8XpXC4V3t7/ADuTNKaQJdScAAAAAElFTkSuQmCC)](https://mybinder.org/v2/gh/holoviz/panel/v0.12.1?urlpath=lab/tree/examples) |
| Support | [![Discourse](https://img.shields.io/discourse/status?server=https%3A%2F%2Fdiscourse.holoviz.org)](https://discourse.holoviz.org/) |

## What is it?
Expand Down
2 changes: 1 addition & 1 deletion doc/_templates/layout.html
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
{% endfor %}
{% endif %}
{% if ('gallery' in pagename or 'reference' in pagename or 'user_guide' in pagename) and not pagename.endswith('index') %}
<a href="https://mybinder.org/v2/gh/holoviz/panel/master?urlpath=lab/tree/examples/{{ pagename }}.ipynb">Open this example in Binder</a>
<a href="https://mybinder.org/v2/gh/holoviz/panel/{{ last_release }}?urlpath=lab/tree/examples/{{ pagename }}.ipynb">Open this example in Binder</a>
{% endif %}
</div>
{% endblock %}
Expand Down
1 change: 1 addition & 0 deletions doc/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@
templates_path = ['_templates']

html_context.update({
"last_release": f"v{'.'.join(panel.__version__.split('.')[:3])}",
"github_user": "holoviz",
"github_repo": "panel",
"google_analytics_id": "UA-154795830-2",
Expand Down
32 changes: 32 additions & 0 deletions doc/releases.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,37 @@
# Releases

## Version 0.12.2

Date: 2021-09-16

This a patch release with a small number of bug fixes and compatibility for bokeh 2.4. Many thanks to the contributors @Stubatiger, @maximlt, @nghenzi and the maintainers @MarcSkovMadsen and @philippjfr for the fixes in this release.

Enhancements:

- Add option to hide constant parameters on `Param` pane ([#2637](https://github.com/holoviz/panel/issues/2637))
- Added `on_session_destroyed` callback ([#2659](https://github.com/holoviz/panel/issues/2659))
- Stricter validation for linking syntax in `ReactiveHTML._template` ([#2689](https://github.com/holoviz/panel/issues/2689))

Bug fixes:

- Improved thread safety ([#2631](https://github.com/holoviz/panel/issues/2631))
- Ensure sessions get distinct files in `config` ([#2646](https://github.com/holoviz/panel/issues/2646))
- Fix bug when updating `Trend` data ([#2647](https://github.com/holoviz/panel/issues/2647))
- Ensure sorters are applied correctly after updating `Tabulator` value ([#2639](https://github.com/holoviz/panel/issues/2639))
- Correctly reflect filtered data on `Tabulator.selection` ([#2676](https://github.com/holoviz/panel/issues/2676)
- Unescape child literal HTML in ReactiveHTML ([#2690](https://github.com/holoviz/panel/issues/2690))
- Ensure Trend indicator can be rendered in layout ([#2694](https://github.com/holoviz/panel/issues/2694))

Documentation:

- Enhance templates docs ([#2658](https://github.com/holoviz/panel/issues/2658))
- Add Folium reference notebook ([#2672](https://github.com/holoviz/panel/issues/2672))

Compatibility:

- Add support for bokeh 2.4 ([#2644](https://github.com/holoviz/panel/issues/2644), [#2687](https://github.com/holoviz/panel/issues/2687), [#2696](https://github.com/holoviz/panel/issues/2696))


## Version 0.12.1

Date: 2021-08-10
Expand Down
Binary file added examples/assets/template_areas.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
79 changes: 79 additions & 0 deletions examples/reference/panes/Folium.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"source": [
"import folium\n",
"import panel as pn\n",
"\n",
"pn.extension(sizing_mode=\"stretch_width\")"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"The ``Folium`` pane renders [folium](http://python-visualization.github.io/folium/) interactive maps.\n",
"\n",
"#### Parameters:\n",
"\n",
"For layout and styling related parameters see the [customization user guide](../../user_guide/Customization.ipynb).\n",
"\n",
"* **``object``** (object): The Folium object being displayed\n",
"___"
],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"The `Folium` pane uses the built-in HTML representation provided by `folium` to render the map:"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"m = folium.Map(location=[52.51, 13.39], zoom_start=12)\n",
"\n",
"folium_pane = pn.pane.plot.Folium(m, height=400)\n",
"\n",
"folium_pane"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Like any other pane, the `Folium` pane's view can be updated by setting the `object` parameter:"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Add a marker to the map\n",
"folium.Marker(\n",
" [52.516, 13.381], popup=\"<i>Brandenburg Gate</i>\", tooltip=\"Click me!\"\n",
").add_to(m)\n",
"\n",
"folium_pane.object = m"
],
"outputs": [],
"metadata": {}
}
],
"metadata": {
"language_info": {
"name": "python",
"pygments_lexer": "ipython3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
4 changes: 2 additions & 2 deletions examples/reference/templates/Bootstrap.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"For a large variety of use cases we do not need complete control over the exact layout of each individual component on the page, as could be achieved with a [custom template](../../user_guide/Templates.ipynb), we just want to achieve a more polished look and feel. For these cases Panel ships with a number of default templates, which are defined by declaring three main content areas on the page, which can be populated as desired:\n",
"For a large variety of use cases we do not need complete control over the exact layout of each individual component on the page, as could be achieved with a [custom template](../../user_guide/Templates.ipynb), we just want to achieve a more polished look and feel. For these cases Panel ships with a number of default templates, which are defined by declaring four main content areas on the page, which can be populated as desired:\n",
"\n",
"* **`header`**: The header area of the HTML page\n",
"* **`sidebar`**: A collapsible sidebar\n",
"* **`main`**: The main area of the application\n",
"* **`modal`**: A modal area which can be opened and closed from Python\n",
"\n",
"These three areas behave very similarly to other Panel layout components and have list-like semantics. This means we can easily append new components into these areas. Unlike other layout components however, the contents of the areas is fixed once rendered. If you need a dynamic layout you should therefore insert a regular Panel layout component (e.g. a `Column` or `Row`) and modify it in place once added to one of the content areas. \n",
"These four areas behave very similarly to other Panel layout components and have list-like semantics. This means we can easily append new components into these areas. Unlike other layout components however, the contents of the areas is fixed once rendered. If you need a dynamic layout you should therefore insert a regular Panel layout component (e.g. a `Column` or `Row`) and modify it in place once added to one of the content areas. \n",
"\n",
"Templates can allow for us to quickly and easily create web apps for displaying our data. Panel comes with a default Template, and includes multiple Templates that extend the default which add some customization for a better display.\n",
"\n",
Expand Down
2 changes: 1 addition & 1 deletion examples/reference/templates/FastGridTemplate.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"* **`main`**: The main area of the application\n",
"* **`modal`**: A modal area which can be opened and closed from Python\n",
"\n",
"These three areas behave very similarly to other Panel layout components. In particular the header, sidebar and modal behave just like the list-like `Row`/`Column` layouts while the main area behaves like a `GridSpec`. This means we can easily append new components into these areas. Unlike other layout components however, the contents of the areas is fixed once rendered. If you need a dynamic layout you should therefore insert a regular Panel layout component (e.g. a `Column` or `Row`) and modify it in place once added to one of the content areas. \n",
"These four areas behave very similarly to other Panel layout components. In particular the header, sidebar and modal behave just like the list-like `Row`/`Column` layouts while the main area behaves like a `GridSpec`. This means we can easily append new components into these areas. Unlike other layout components however, the contents of the areas is fixed once rendered. If you need a dynamic layout you should therefore insert a regular Panel layout component (e.g. a `Column` or `Row`) and modify it in place once added to one of the content areas. \n",
"\n",
"Templates can allow for us to quickly and easily create web apps for displaying our data. Panel comes with a default Template, and includes multiple Templates that extend the default which add some customization for a better display.\n",
"\n",
Expand Down
4 changes: 2 additions & 2 deletions examples/reference/templates/FastListTemplate.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"For a large variety of use cases we do not need complete control over the exact layout of each individual component on the page, as could be achieved with a [custom template](../../user_guide/Templates.ipynb), we just want to achieve a more polished look and feel. For these cases Panel ships with a number of default templates, which are defined by declaring three main content areas on the page, which can be populated as desired:\n",
"For a large variety of use cases we do not need complete control over the exact layout of each individual component on the page, as could be achieved with a [custom template](../../user_guide/Templates.ipynb), we just want to achieve a more polished look and feel. For these cases Panel ships with a number of default templates, which are defined by declaring four main content areas on the page, which can be populated as desired:\n",
"\n",
"* **`header`**: The header area of the HTML page\n",
"* **`sidebar`**: A collapsible sidebar\n",
"* **`main`**: The main area of the application\n",
"* **`modal`**: A modal area which can be opened and closed from Python\n",
"\n",
"These three areas behave very similarly to other Panel layout components and have list-like semantics. This means we can easily append new components into these areas. Unlike other layout components however, the contents of the areas is fixed once rendered. If you need a dynamic layout you should therefore insert a regular Panel layout component (e.g. a `Column` or `Row`) and modify it in place once added to one of the content areas. \n",
"These four areas behave very similarly to other Panel layout components and have list-like semantics. This means we can easily append new components into these areas. Unlike other layout components however, the contents of the areas is fixed once rendered. If you need a dynamic layout you should therefore insert a regular Panel layout component (e.g. a `Column` or `Row`) and modify it in place once added to one of the content areas. \n",
"\n",
"Templates can allow for us to quickly and easily create web apps for displaying our data. Panel comes with a default Template, and includes multiple Templates that extend the default which add some customization for a better display.\n",
"\n",
Expand Down
Loading