From 3bf0a46eb75da3a3933496fc7b3c39c6fc5de57a Mon Sep 17 00:00:00 2001 From: Maxime Liquet <35924738+maximlt@users.noreply.github.com> Date: Wed, 8 Feb 2023 20:57:51 +0100 Subject: [PATCH 01/16] keywords and like filters aren't regex (#4423) --- panel/widgets/tables.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/panel/widgets/tables.py b/panel/widgets/tables.py index 82c4f54f0f..845f75f6a9 100644 --- a/panel/widgets/tables.py +++ b/panel/widgets/tables.py @@ -469,7 +469,7 @@ def _get_header_filters(self, df): elif op == 'in': filters.append(col.isin(val)) elif op == 'like': - filters.append(col.str.lower().str.contains(val.lower())) + filters.append(col.str.contains(val, case=False, regex=False)) elif op == 'starts': filters.append(col.str.startsWith(val)) elif op == 'ends': @@ -477,14 +477,14 @@ def _get_header_filters(self, df): elif op == 'keywords': match_all = filt_def.get(col_name, {}).get('matchAll', False) sep = filt_def.get(col_name, {}).get('separator', ' ') - matches = val.lower().split(sep) + matches = val.split(sep) if match_all: for match in matches: - filters.append(col.str.lower().str.contains(match)) + filters.append(col.str.contains(match, case=False, regex=False)) else: - filt = col.str.lower().str.contains(matches[0]) + filt = col.str.contains(matches[0], case=False, regex=False) for match in matches[1:]: - filt |= col.str.lower().str.contains(match) + filt |= col.str.contains(match, case=False, regex=False) filters.append(filt) elif op == 'regex': raise ValueError("Regex filtering not supported.") From 6fb898283bd136197f31fd006a1a6af56e8ffa62 Mon Sep 17 00:00:00 2001 From: Maxime Liquet <35924738+maximlt@users.noreply.github.com> Date: Wed, 1 Mar 2023 18:10:41 +0100 Subject: [PATCH 02/16] add examples folder dynamically added to the distrib (#4484) --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index 1d82fe5ab4..605d16099d 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -25,6 +25,7 @@ global-exclude *.py[co] global-exclude *~ global-exclude *.ipynb_checkpoints/* global-exclude *.whl +graft panel/examples graft examples graft doc/ graft panel/dist From fefcfa01b3c7fda97b09eaef604d4be7f2ff3234 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20H=C3=B8xbro=20Hansen?= Date: Wed, 1 Mar 2023 18:47:49 +0100 Subject: [PATCH 03/16] Small bug fixes (#4481) * comparable_array with nan_equal=True * Fix cache --- panel/io/cache.py | 5 ++--- panel/io/model.py | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/panel/io/cache.py b/panel/io/cache.py index ac6d28f3b9..d3b685d34b 100644 --- a/panel/io/cache.py +++ b/panel/io/cache.py @@ -364,8 +364,7 @@ def wrapped_func(*args, **kwargs): func_cache = state._memoize_cache.get(func_hash) - empty = func_cache is None - if empty: + if func_cache is None: if to_disk: from diskcache import Index cache = Index(os.path.join(cache_path, func_hash)) @@ -376,7 +375,7 @@ def wrapped_func(*args, **kwargs): if ttl is not None: _cleanup_ttl(func_cache, ttl, time) - if not empty and hash_value in func_cache: + if hash_value in func_cache: with lock: ret, ts, count, _ = func_cache[hash_value] func_cache[hash_value] = (ret, ts, count+1, time) diff --git a/panel/io/model.py b/panel/io/model.py index cc2e20c6dd..673d455459 100644 --- a/panel/io/model.py +++ b/panel/io/model.py @@ -39,10 +39,10 @@ class comparable_array(np.ndarray): """ def __eq__(self, other: Any) -> bool: - return super().__eq__(other).all().item() + return np.array_equal(self, other, equal_nan=True) def __ne__(self, other: Any) -> bool: - return super().__ne__(other).all().item() + return not np.array_equal(self, other, equal_nan=True) def monkeypatch_events(events: List['DocumentChangedEvent']) -> None: """ From ea02cdcd67a21757d705ceadaa2f14d010ccea0d Mon Sep 17 00:00:00 2001 From: maximlt Date: Thu, 2 Feb 2023 15:06:52 +0100 Subject: [PATCH 04/16] use the right name for the method that gets the image data --- panel/pane/plot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panel/pane/plot.py b/panel/pane/plot.py index 281549591f..3065a2be74 100644 --- a/panel/pane/plot.py +++ b/panel/pane/plot.py @@ -361,7 +361,7 @@ class RGGPlot(PNG): def applies(cls, obj: Any) -> float | bool | None: return type(obj).__name__ == 'GGPlot' and hasattr(obj, 'r_repr') - def _img(self): + def _data(self): from rpy2 import robjects from rpy2.robjects.lib import grdevices with grdevices.render_to_bytesio(grdevices.png, From 61c0069c6ac30514dc3cb180beba08e2d26b432f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 18:57:16 +0100 Subject: [PATCH 05/16] Bump cryptography in /examples/apps/django_multi_apps (#4418) --- examples/apps/django_multi_apps/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/apps/django_multi_apps/requirements.txt b/examples/apps/django_multi_apps/requirements.txt index a59eed3575..ec9afc4ef4 100644 --- a/examples/apps/django_multi_apps/requirements.txt +++ b/examples/apps/django_multi_apps/requirements.txt @@ -8,7 +8,7 @@ cffi==1.13.2 channels==2.4.0 colorcet==2.0.5 constantly==15.1.0 -cryptography==3.3.2 +cryptography==39.0.1 daphne==2.4.1 Django==3.1.14 holoviews==1.13.2 From 199ded7ad0448a1541d3bc16ec40f7c8e5faeb63 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Tue, 21 Feb 2023 14:49:34 +0000 Subject: [PATCH 06/16] Use latest react-grid from CDN (#4461) * Use latest react-grid from CDN * Fix url * Fix React template --- panel/template/fast/grid/fast_grid_template.html | 2 +- panel/template/react/__init__.py | 2 +- panel/template/react/react.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/panel/template/fast/grid/fast_grid_template.html b/panel/template/fast/grid/fast_grid_template.html index 84c80cca39..6c622e8e12 100644 --- a/panel/template/fast/grid/fast_grid_template.html +++ b/panel/template/fast/grid/fast_grid_template.html @@ -454,7 +454,7 @@ ); } } - ReactDOM.render(, document.getElementById('responsive-grid')) + ReactDOM.render(, document.getElementById('responsive-grid')); addFullScreenToggle() diff --git a/panel/template/react/__init__.py b/panel/template/react/__init__.py index 940869a65f..467d15efc9 100644 --- a/panel/template/react/__init__.py +++ b/panel/template/react/__init__.py @@ -55,7 +55,7 @@ class ReactTemplate(BasicTemplate): 'react': f"{config.npm_cdn}/react@18/umd/react.production.min.js", 'react-dom': f"{config.npm_cdn}/react-dom@18/umd/react-dom.production.min.js", 'babel': f"{config.npm_cdn}/babel-standalone@latest/babel.min.js", - 'react-grid': "https://cdnjs.cloudflare.com/ajax/libs/react-grid-layout/1.1.1/react-grid-layout.min.js" + 'react-grid': f"{config.npm_cdn}/react-grid-layout@1.3.4/dist/react-grid-layout.min.js" }, 'css': { 'bootstrap': CSS_URLS['bootstrap4'], diff --git a/panel/template/react/react.html b/panel/template/react/react.html index ac41f96659..ea512c5354 100644 --- a/panel/template/react/react.html +++ b/panel/template/react/react.html @@ -259,7 +259,7 @@ ); } } - ReactDOM.render(, document.getElementById('responsive-grid')) + ReactDOM.render(, document.getElementById('responsive-grid')); {{ embed(roots.js_area) }} From ce46500a568c01ecab26a6235ebdfac2074c100b Mon Sep 17 00:00:00 2001 From: maximlt Date: Thu, 2 Mar 2023 11:56:07 +0100 Subject: [PATCH 07/16] prepare release notes --- doc/releases.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/doc/releases.md b/doc/releases.md index 73351cda1c..e78d5050ff 100644 --- a/doc/releases.md +++ b/doc/releases.md @@ -2,6 +2,24 @@ See [the HoloViz blog](https://blog.holoviz.org/tag/panel.html) for a visual summary of the major features added in each release. +## Version 0.14.4 + +Date: 2023-03-02 + +This release is a small bug fix release preceding the upcoming major release of Panel 1.0. Many thanks to the contributors to this release which include @MarcSkovMadsen, @maximlt, @Hoxbro and @philippjfr. + +### Bugs + +- Client-side search filters don't use regex ([4423](https://github.com/holoviz/panel/pull/4423)) +- Fix RGGPlot pane ([#4380](https://github.com/holoviz/panel/pull/4380)) +- Distribute again the examples folder ([#4484](https://github.com/holoviz/panel/pull/4484)) +- Array comparison matches NaNs ([#4481](https://github.com/holoviz/panel/pull/4481)) +- Use cache from previous sessions when using `to_disk` ([#4481](https://github.com/holoviz/panel/pull/4481)) + +### Misc + +- Use latest react-grid from CDN ([#4461](https://github.com/holoviz/panel/pull/4461)) + ## Version 0.14.3 Date: 2023-01-28 From b4805e381540d0f0d3878adfa8d93d33834b7e26 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Thu, 2 Mar 2023 13:56:40 +0000 Subject: [PATCH 08/16] Modify sys.path when running inside Jupyter Kernel (#4489) --- panel/io/jupyter_server_extension.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/panel/io/jupyter_server_extension.py b/panel/io/jupyter_server_extension.py index df114a5d70..4a338d5b75 100644 --- a/panel/io/jupyter_server_extension.py +++ b/panel/io/jupyter_server_extension.py @@ -109,9 +109,11 @@ def get_server_root_dir(settings): EXECUTION_TEMPLATE = """ import os import pathlib +import sys app = '{{ path }}' os.chdir(str(pathlib.Path(app).parent)) +sys.path = [os.getcwd()] + sys.path[1:] from panel.io.jupyter_executor import PanelExecutor executor = PanelExecutor(app, '{{ token }}', '{{ root_url }}') @@ -233,6 +235,7 @@ async def get(self, path=None): ) self.finish(html) return + kernel_env = {**os.environ} kernel_id = await ensure_async( ( From 097a5707d6f3644a335b58d2fc994c8f90b8d68d Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Thu, 2 Mar 2023 13:49:31 +0000 Subject: [PATCH 09/16] Add support for altair and vega-lite v5 (#4488) --- examples/reference/panes/Vega.ipynb | 32 +++++++----- panel/pane/vega.py | 47 +++++++++++++---- panel/tests/pane/test_vega.py | 80 ++++++++++++++++++++++++++--- 3 files changed, 129 insertions(+), 30 deletions(-) diff --git a/examples/reference/panes/Vega.ipynb b/examples/reference/panes/Vega.ipynb index 16b67d7e29..6a5e89ab71 100644 --- a/examples/reference/panes/Vega.ipynb +++ b/examples/reference/panes/Vega.ipynb @@ -48,7 +48,7 @@ "outputs": [], "source": [ "vegalite = {\n", - " \"$schema\": \"https://vega.github.io/schema/vega-lite/v3.json\",\n", + " \"$schema\": \"https://vega.github.io/schema/vega-lite/v5.json\",\n", " \"data\": {\"url\": \"https://raw.githubusercontent.com/vega/vega/master/docs/data/barley.json\"},\n", " \"mark\": \"bar\",\n", " \"encoding\": {\n", @@ -92,7 +92,7 @@ "outputs": [], "source": [ "vgl_pane.object = {\n", - " \"$schema\": \"https://vega.github.io/schema/vega-lite/v3.json\",\n", + " \"$schema\": \"https://vega.github.io/schema/vega-lite/v5.json\",\n", " \"data\": {\n", " \"url\": \"https://raw.githubusercontent.com/vega/vega/master/docs/data/disasters.csv\"\n", " },\n", @@ -109,11 +109,16 @@ " },\n", " \"encoding\": {\n", " \"x\": {\n", - " \"field\": \"Year\",\n", - " \"type\": \"nominal\",\n", - " \"axis\": {\"labelAngle\": 90}\n", + " \"field\": \"Year\",\n", + " \"type\": \"quantitative\",\n", + " \"axis\": {\"labelAngle\": 90},\n", + " \"scale\": {\"zero\": False}\n", + " },\n", + " \"y\": {\n", + " \"field\": \"Entity\",\n", + " \"type\": \"nominal\",\n", + " \"axis\": {\"title\": \"\"}\n", " },\n", - " \"y\": {\"field\": \"Entity\", \"type\": \"nominal\", \"axis\": {\"title\": \"\"}},\n", " \"size\": {\n", " \"field\": \"Deaths\",\n", " \"type\": \"quantitative\",\n", @@ -525,15 +530,16 @@ "source": [ "from vega_datasets import data\n", "\n", - "\n", - "df = data.seattle_temps()[:100]\n", + "temps = data.seattle_temps()[:300]\n", "\n", "brush = alt.selection_interval(name='brush')\n", "\n", - "chart = alt.Chart(df).mark_circle().encode(\n", + "chart = alt.Chart(temps).mark_circle().encode(\n", " x='date:T',\n", - " y='temp:Q',\n", + " y=alt.Y('temp:Q', scale={'zero': False}),\n", " color=alt.condition(brush, alt.value('coral'), alt.value('lightgray'))\n", + ").properties(\n", + " width=500\n", ").add_selection(\n", " brush\n", ")\n", @@ -541,16 +547,14 @@ "def filtered_table(selection):\n", " if not selection:\n", " return '## No selection'\n", - " print(selection)\n", " query = ' & '.join(\n", " f'\"{pd.to_datetime(values[0], unit=\"ms\")}\" <= `{col}` <= \"{pd.to_datetime(values[1], unit=\"ms\")}\"'\n", - " if pd.api.types.is_datetime64_any_dtype(df[col]) else f'{values[0]} <= `{col}` <= {values[1]}'\n", + " if pd.api.types.is_datetime64_any_dtype(temps[col]) else f'{values[0]} <= `{col}` <= {values[1]}'\n", " for col, values in selection.items()\n", " )\n", - " print(query)\n", " return pn.Column(\n", " f'Query: {query}',\n", - " pn.pane.DataFrame(df.query(query), width=600, height=300)\n", + " pn.pane.DataFrame(temps.query(query), width=600, height=300)\n", " )\n", "\n", "\n", diff --git a/panel/pane/vega.py b/panel/pane/vega.py index d113e22a8a..a3d0549308 100644 --- a/panel/pane/vega.py +++ b/panel/pane/vega.py @@ -1,5 +1,6 @@ from __future__ import annotations +import re import sys from typing import ( @@ -40,33 +41,59 @@ def ds_as_cds(dataset): _containers = ['hconcat', 'vconcat', 'layer'] +SCHEMA_REGEX = re.compile('^v(\d+)\.\d+\.\d+.json') + def _isin(obj, attr): if isinstance(obj, dict): return attr in obj else: return hasattr(obj, attr) -def _get_type(spec): - if isinstance(spec, dict): - return spec.get('type', 'interval') +def _get_type(spec, version): + if version >= 5: + if isinstance(spec, dict): + return spec.get('select', {}).get('type', 'interval') + else: + return getattr(spec.select, 'type', 'interval') else: - return getattr(spec, 'type', 'interval') - + if isinstance(spec, dict): + return spec.get('type', 'interval') + else: + return getattr(spec, 'type', 'interval') -def _get_selections(obj): +def _get_schema_version(obj, default_version: int = 5) -> int: + if Vega.is_altair(obj): + schema = obj.to_dict().get('$schema', '') + else: + schema = obj.get('$schema', '') + version = schema.split('/')[-1] + match = SCHEMA_REGEX.fullmatch(version) + if match is None or not match.groups(): + return default_version + return int(match.groups()[0]) + +def _get_selections(obj, version=None): + if version is None: + version = _get_schema_version(obj) + key = 'params' if version >= 5 else 'selection' selections = {} - if _isin(obj, 'selection'): + if _isin(obj, key): + params = obj[key] + if version >= 5 and isinstance(params, list): + params = { + p.name if hasattr(p, 'name') else p['name']: p for p in params + if getattr(p, 'param_type', None) == 'selection' or _isin(p, 'select') + } try: selections.update({ - name: _get_type(spec) - for name, spec in obj['selection'].items() + name: _get_type(spec, version) for name, spec in params.items() }) except (AttributeError, TypeError): pass for c in _containers: if _isin(obj, c): for subobj in obj[c]: - selections.update(_get_selections(subobj)) + selections.update(_get_selections(subobj, version=version)) return selections diff --git a/panel/tests/pane/test_vega.py b/panel/tests/pane/test_vega.py index 57a525c77a..7f1a30d379 100644 --- a/panel/tests/pane/test_vega.py +++ b/panel/tests/pane/test_vega.py @@ -10,7 +10,6 @@ altair_available = pytest.mark.skipif(alt is None, reason="requires altair") - import numpy as np import panel as pn @@ -21,6 +20,7 @@ blank_schema = {'$schema': ''} vega4_config = {'view': {'continuousHeight': 300, 'continuousWidth': 400}} +vega5_config = {'view': {'continuousHeight': 300, 'continuousWidth': 300}} vega_example = { 'config': { @@ -38,6 +38,62 @@ '$schema': 'https://vega.github.io/schema/vega-lite/v3.2.1.json' } +vega4_selection_example = { + 'config': {'view': {'continuousWidth': 300, 'continuousHeight': 300}}, + 'data': {'url': 'https://raw.githubusercontent.com/vega/vega/master/docs/data/penguins.json'}, + 'mark': {'type': 'point'}, + 'encoding': { + 'color': { + 'condition': { + 'selection': 'brush', + 'field': 'Species', + 'type': 'nominal' + }, + 'value': 'lightgray'}, + 'x': { + 'field': 'Beak Length (mm)', + 'scale': {'zero': False}, + 'type': 'quantitative' + }, + 'y': { + 'field': 'Beak Depth (mm)', + 'scale': {'zero': False}, + 'type': 'quantitative'} + }, + 'height': 250, + 'selection': {'brush': {'type': 'interval'}}, + 'width': 250, + '$schema': 'https://vega.github.io/schema/vega-lite/v4.17.0.json' +} + +vega5_selection_example = { + 'config': {'view': {'continuousWidth': 300, 'continuousHeight': 300}}, + 'data': {'url': 'https://raw.githubusercontent.com/vega/vega/master/docs/data/penguins.json'}, + 'mark': {'type': 'point'}, + 'encoding': { + 'color': { + 'condition': { + 'param': 'brush', + 'field': 'Species', + 'type': 'nominal' + }, + 'value': 'lightgray'}, + 'x': { + 'field': 'Beak Length (mm)', + 'scale': {'zero': False}, + 'type': 'quantitative' + }, + 'y': { + 'field': 'Beak Depth (mm)', + 'scale': {'zero': False}, + 'type': 'quantitative'} + }, + 'height': 250, + 'params': [{'name': 'brush', 'select': {'type': 'interval'}}], + 'width': 250, + '$schema': 'https://vega.github.io/schema/vega-lite/v5.6.1.json' +} + vega_inline_example = { 'config': { 'view': {'width': 400, 'height': 300}, @@ -190,6 +246,14 @@ def test_vega_pane_inline(document, comm): assert pane._models == {} +def test_vega_lite_4_selection_spec(document, comm): + vega = Vega(vega4_selection_example) + assert vega._selections == {'brush': 'interval'} + +def test_vega_lite_5_selection_spec(document, comm): + vega = Vega(vega5_selection_example) + assert vega._selections == {'brush': 'interval'} + def altair_example(): import altair as alt data = alt.Data(values=[{'x': 'A', 'y': 5}, @@ -203,22 +267,23 @@ def altair_example(): ) return chart - @altair_available def test_get_vega_pane_type_from_altair(): assert PaneBase.get_pane_type(altair_example()) is Vega - @altair_available def test_altair_pane(document, comm): - pane = pn.panel(altair_example()) + pane = Vega(altair_example()) # Create pane model = pane.get_root(document, comm=comm) assert isinstance(model, VegaPlot) expected = dict(vega_example, data={}) - if altair_version >= Version('4.0.0'): + if altair_version >= Version('5.0.0rc1'): + expected['mark'] = {'type': 'bar'} + expected['config'] = vega5_config + elif altair_version >= Version('4.0.0'): expected['config'] = vega4_config assert dict(model.data, **blank_schema) == dict(expected, **blank_schema) @@ -231,7 +296,10 @@ def test_altair_pane(document, comm): chart.data.values[0]['x'] = 'C' pane.object = chart point_example = dict(vega_example, data={}, mark='point') - if altair_version >= Version('4.0.0'): + if altair_version >= Version('5.0.0rc1'): + point_example['mark'] = {'type': 'point'} + point_example['config'] = vega5_config + elif altair_version >= Version('4.0.0'): point_example['config'] = vega4_config assert dict(model.data, **blank_schema) == dict(point_example, **blank_schema) cds_data = model.data_sources['data'].data From 6d570e877f796127dcfe429214f8b5fcb3befa3f Mon Sep 17 00:00:00 2001 From: maximlt Date: Fri, 3 Mar 2023 08:58:38 +0100 Subject: [PATCH 10/16] update release notes --- doc/releases.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/doc/releases.md b/doc/releases.md index e78d5050ff..59216f845b 100644 --- a/doc/releases.md +++ b/doc/releases.md @@ -4,17 +4,22 @@ See [the HoloViz blog](https://blog.holoviz.org/tag/panel.html) for a visual sum ## Version 0.14.4 -Date: 2023-03-02 +Date: 2023-03-03 This release is a small bug fix release preceding the upcoming major release of Panel 1.0. Many thanks to the contributors to this release which include @MarcSkovMadsen, @maximlt, @Hoxbro and @philippjfr. ### Bugs -- Client-side search filters don't use regex ([4423](https://github.com/holoviz/panel/pull/4423)) -- Fix RGGPlot pane ([#4380](https://github.com/holoviz/panel/pull/4380)) -- Distribute again the examples folder ([#4484](https://github.com/holoviz/panel/pull/4484)) -- Array comparison matches NaNs ([#4481](https://github.com/holoviz/panel/pull/4481)) +- Fix client-side string filters by not parsing them as regex ([4423](https://github.com/holoviz/panel/pull/4423)) +- Fix the RGGPlot pane ([#4380](https://github.com/holoviz/panel/pull/4380)) +- Fix `panel examples` command by ensuring examples are correctly packaged ([#4484](https://github.com/holoviz/panel/pull/4484)) +- Fix event generation by considering NaNs as equal when comparing Numpy arrays ([#4481](https://github.com/holoviz/panel/pull/4481)) - Use cache from previous sessions when using `to_disk` ([#4481](https://github.com/holoviz/panel/pull/4481)) +- Fix relative imports when running inside Jupyter Kernel ([#4489](https://github.com/holoviz/panel/pull/4489)) + +### Enhancements + +- Add support for altair and vega-lite v5 ([#4488](https://github.com/holoviz/panel/pull/4488)) ### Misc From 612dd0fd6ca5f936b3ef1e411d1376ff06fb4feb Mon Sep 17 00:00:00 2001 From: maximlt Date: Fri, 3 Mar 2023 10:54:01 +0100 Subject: [PATCH 11/16] Bump panel.js version to 0.14.4-rc.1 --- panel/package-lock.json | 4 ++-- panel/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/panel/package-lock.json b/panel/package-lock.json index 493cd7a849..493f38c755 100644 --- a/panel/package-lock.json +++ b/panel/package-lock.json @@ -1,12 +1,12 @@ { "name": "@holoviz/panel", - "version": "0.14.3", + "version": "0.14.4-rc.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@holoviz/panel", - "version": "0.14.3", + "version": "0.14.4-rc.1", "license": "BSD-3-Clause", "dependencies": { "@bokeh/bokehjs": "^2.4.3", diff --git a/panel/package.json b/panel/package.json index 734804f821..08920f9695 100644 --- a/panel/package.json +++ b/panel/package.json @@ -1,6 +1,6 @@ { "name": "@holoviz/panel", - "version": "0.14.3", + "version": "0.14.4-rc.1", "description": "A high level dashboarding library for python visualization libraries.", "license": "BSD-3-Clause", "repository": { From 4c12999a325df496a5583941e5d3577f20a6a8e6 Mon Sep 17 00:00:00 2001 From: maximlt Date: Fri, 3 Mar 2023 15:04:47 +0100 Subject: [PATCH 12/16] improve release notes --- doc/releases.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/releases.md b/doc/releases.md index 59216f845b..5489a0001b 100644 --- a/doc/releases.md +++ b/doc/releases.md @@ -10,7 +10,7 @@ This release is a small bug fix release preceding the upcoming major release of ### Bugs -- Fix client-side string filters by not parsing them as regex ([4423](https://github.com/holoviz/panel/pull/4423)) +- Fix `Tabulator` client-side string filters by not parsing them as regex ([4423](https://github.com/holoviz/panel/pull/4423)) - Fix the RGGPlot pane ([#4380](https://github.com/holoviz/panel/pull/4380)) - Fix `panel examples` command by ensuring examples are correctly packaged ([#4484](https://github.com/holoviz/panel/pull/4484)) - Fix event generation by considering NaNs as equal when comparing Numpy arrays ([#4481](https://github.com/holoviz/panel/pull/4481)) From 276a7d5e017bb755805e0f0e91d66b3a2a1afefe Mon Sep 17 00:00:00 2001 From: maximlt Date: Fri, 3 Mar 2023 15:16:35 +0100 Subject: [PATCH 13/16] update CHANGELOG for 0.14.4 --- CHANGELOG.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78510240be..f270556970 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # Releases +## Version 0.14.4 + +Date: 2023-03-03 + +This release is a small bug fix release preceding the upcoming major release of Panel 1.0. Many thanks to the contributors to this release which include @MarcSkovMadsen, @maximlt, @Hoxbro and @philippjfr. + +### Bugs + +- Fix `Tabulator` client-side string filters by not parsing them as regex ([4423](https://github.com/holoviz/panel/pull/4423)) +- Fix the RGGPlot pane ([#4380](https://github.com/holoviz/panel/pull/4380)) +- Fix `panel examples` command by ensuring examples are correctly packaged ([#4484](https://github.com/holoviz/panel/pull/4484)) +- Fix event generation by considering NaNs as equal when comparing Numpy arrays ([#4481](https://github.com/holoviz/panel/pull/4481)) +- Use cache from previous sessions when using `to_disk` ([#4481](https://github.com/holoviz/panel/pull/4481)) +- Fix relative imports when running inside Jupyter Kernel ([#4489](https://github.com/holoviz/panel/pull/4489)) + +### Enhancements + +- Add support for altair and vega-lite v5 ([#4488](https://github.com/holoviz/panel/pull/4488)) + +### Misc + +- Use latest react-grid from CDN ([#4461](https://github.com/holoviz/panel/pull/4461)) + ## Version 0.14.3 Date: 2023-01-28 From b63d0881cae4188dff3a3dfe36d071ba34898592 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Fri, 3 Mar 2023 18:04:03 +0100 Subject: [PATCH 14/16] Do not re-create Vega.selections object unless selections changed (#4497) --- panel/pane/vega.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/panel/pane/vega.py b/panel/pane/vega.py index a3d0549308..7f534c6e45 100644 --- a/panel/pane/vega.py +++ b/panel/pane/vega.py @@ -171,6 +171,8 @@ def _update_selections(self, *args): e: param.Dict() if stype == 'interval' else param.List() for e, stype in self._selections.items() } + if self.selection and (set(self.selection.param) - {'name'}) == set(params): + return self.selection = type('Selection', (param.Parameterized,), params)() @classmethod From b300f959334a1120a25203c33183acccb31fb51c Mon Sep 17 00:00:00 2001 From: maximlt Date: Fri, 3 Mar 2023 18:15:55 +0100 Subject: [PATCH 15/16] update changelog --- CHANGELOG.md | 1 + doc/releases.md | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f270556970..2a9736a7ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ This release is a small bug fix release preceding the upcoming major release of - Fix event generation by considering NaNs as equal when comparing Numpy arrays ([#4481](https://github.com/holoviz/panel/pull/4481)) - Use cache from previous sessions when using `to_disk` ([#4481](https://github.com/holoviz/panel/pull/4481)) - Fix relative imports when running inside Jupyter Kernel ([#4489](https://github.com/holoviz/panel/pull/4489)) +- Do not re-create `Vega.selections` object unless selections changed ([#4497](https://github.com/holoviz/panel/pull/4497)) ### Enhancements diff --git a/doc/releases.md b/doc/releases.md index 5489a0001b..2475942df6 100644 --- a/doc/releases.md +++ b/doc/releases.md @@ -16,6 +16,7 @@ This release is a small bug fix release preceding the upcoming major release of - Fix event generation by considering NaNs as equal when comparing Numpy arrays ([#4481](https://github.com/holoviz/panel/pull/4481)) - Use cache from previous sessions when using `to_disk` ([#4481](https://github.com/holoviz/panel/pull/4481)) - Fix relative imports when running inside Jupyter Kernel ([#4489](https://github.com/holoviz/panel/pull/4489)) +- Do not re-create `Vega.selections` object unless selections changed ([#4497](https://github.com/holoviz/panel/pull/4497)) ### Enhancements From 8caf5ab7488f1137fb5c6ce57b7a99e846a9df4f Mon Sep 17 00:00:00 2001 From: maximlt Date: Fri, 3 Mar 2023 18:17:12 +0100 Subject: [PATCH 16/16] Bump panel.js version to 0.14.4-rc.2 --- panel/package-lock.json | 4 ++-- panel/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/panel/package-lock.json b/panel/package-lock.json index 493f38c755..2ef5944f9f 100644 --- a/panel/package-lock.json +++ b/panel/package-lock.json @@ -1,12 +1,12 @@ { "name": "@holoviz/panel", - "version": "0.14.4-rc.1", + "version": "0.14.4-rc.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@holoviz/panel", - "version": "0.14.4-rc.1", + "version": "0.14.4-rc.2", "license": "BSD-3-Clause", "dependencies": { "@bokeh/bokehjs": "^2.4.3", diff --git a/panel/package.json b/panel/package.json index 08920f9695..8434194ed7 100644 --- a/panel/package.json +++ b/panel/package.json @@ -1,6 +1,6 @@ { "name": "@holoviz/panel", - "version": "0.14.4-rc.1", + "version": "0.14.4-rc.2", "description": "A high level dashboarding library for python visualization libraries.", "license": "BSD-3-Clause", "repository": {