From af0db2fb6fad536dcc7038339cfb40e2a4e823f8 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Wed, 16 Feb 2022 16:30:16 +0100 Subject: [PATCH] Add View variable integration test --- lumen/sources/base.py | 3 --- lumen/target.py | 4 ++-- lumen/tests/sample_dashboard/view_variable.yml | 17 +++++++++++++++++ lumen/tests/test_dashboard.py | 16 ++++++++++++++++ lumen/variables/base.py | 12 +++++++++++- lumen/views/base.py | 6 +++++- 6 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 lumen/tests/sample_dashboard/view_variable.yml diff --git a/lumen/sources/base.py b/lumen/sources/base.py index 16fddb607..b2b7f7168 100644 --- a/lumen/sources/base.py +++ b/lumen/sources/base.py @@ -171,11 +171,9 @@ def _recursive_resolve(cls, spec, source_type): } if 'source' in source_type.param and 'source' in spec: resolved_spec['source'] = cls.from_spec(spec.pop('source')) - print(spec) for k, v in spec.items(): if isinstance(v, str) and v.startswith('@'): refs[k] = v - print(k, v, state.resolve_reference(v)) v = state.resolve_reference(v) elif isinstance(v, dict): v, subrefs = cls._recursive_resolve(v, source_type) @@ -543,7 +541,6 @@ def _load_table(self, table, dask=True): @cached() def get(self, table, **query): - print('>>>>>>', table) dask = query.pop('__dask', self.dask) df = self._load_table(table) df = self._filter_dataframe(df, **query) diff --git a/lumen/target.py b/lumen/target.py index 0476bee64..7215da538 100644 --- a/lumen/target.py +++ b/lumen/target.py @@ -454,8 +454,8 @@ def _update_views(self, invalidate_cache=True, update_views=True, init=False, ev rerender_cache = partial(self._rerender, invalidate_cache=True) transforms = [] for view in linked_views: - if view.controls: - view.param.watch(rerender, view.controls) + if view.refs: + view.param.watch(rerender_cache, view.refs) for transform in view.transforms: if transform.refs and not transform in transforms: transforms.append(transform) diff --git a/lumen/tests/sample_dashboard/view_variable.yml b/lumen/tests/sample_dashboard/view_variable.yml new file mode 100644 index 000000000..e268a75d7 --- /dev/null +++ b/lumen/tests/sample_dashboard/view_variable.yml @@ -0,0 +1,17 @@ +variables: + page_size: + type: constant + default: 20 +sources: + test: + type: 'file' + tables: ['../sources/test.csv'] + kwargs: + parse_dates: ['D'] +targets: + - title: "Test" + source: test + views: + - type: table + table: test + page_size: "@variables.page_size" diff --git a/lumen/tests/test_dashboard.py b/lumen/tests/test_dashboard.py index 1a946d6b8..445f475d7 100644 --- a/lumen/tests/test_dashboard.py +++ b/lumen/tests/test_dashboard.py @@ -73,3 +73,19 @@ def test_dashboard_with_source_variable(set_root, document): state.variables.tables = {'test': '../sources/test2.csv'} pd.testing.assert_frame_equal(table.value, expected.iloc[::-1].reset_index(drop=True)) + +def test_dashboard_with_view_variable(set_root, document): + root = pathlib.Path(__file__).parent / 'sample_dashboard' + set_root(str(root)) + dashboard = Dashboard(str(root / 'view_variable.yml')) + dashboard._render_dashboard() + target = dashboard.targets[0] + target.update() + + table = target._cards[0][0][0] + + assert table.page_size == 20 + + state.variables.page_size = 10 + + assert table.page_size == 10 diff --git a/lumen/variables/base.py b/lumen/variables/base.py index ae1c02724..f32a67591 100644 --- a/lumen/variables/base.py +++ b/lumen/variables/base.py @@ -41,6 +41,11 @@ def __getitem__(self, key): def from_spec(cls, spec): vars = {} for name, var_spec in spec.items(): + if not isinstance(var_spec, dict): + var_spec = { + 'type': 'constant', + 'default': var_spec + } vars[name] = Variable.from_spec(dict(var_spec, name=name), vars) return cls(**vars) @@ -138,7 +143,12 @@ def __init__(self, **params): widget_type = getattr(pn.widgets, kind) if 'value' not in params: params['default'] = default - self._widget = widget_type(**params) + deserialized = {} + for k, v in params.items(): + if k in widget_type.param: + v = widget_type.param[k].deserialize(v) + deserialized[k] = v + self._widget = widget_type(**deserialized) self._widget.link(self, value='value', bidirectional=True) @property diff --git a/lumen/views/base.py b/lumen/views/base.py index b80facda6..14aed2df1 100644 --- a/lumen/views/base.py +++ b/lumen/views/base.py @@ -609,6 +609,9 @@ class Table(View): Renders a Source table using a Panel Table widget. """ + page_size = param.Integer(default=20, bounds=(1, None), doc=""" + Number of rows to render per page, if pagination is enabled.""") + view_type = 'table' _extension = 'tabulator' @@ -617,7 +620,8 @@ def get_panel(self): return pn.widgets.tables.Tabulator(**self._get_params()) def _get_params(self): - return dict(value=self.get_data(), disabled=True, **self.kwargs) + return dict(value=self.get_data(), disabled=True, page_size=self.page_size, + **self.kwargs) class DownloadView(View):