From c0e92a0cdb73231a118d08624fa7d31823191d30 Mon Sep 17 00:00:00 2001 From: pfafflabatuiuc <72898175+pfafflabatuiuc@users.noreply.github.com> Date: Mon, 28 Mar 2022 17:06:25 -0500 Subject: [PATCH] Bugfix for clear_meta and expanded has_meta in DataDictBase. --- plottr/data/datadict.py | 8 ++++++-- test/pytest/test_data_dict_base.py | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/plottr/data/datadict.py b/plottr/data/datadict.py index 29a31583..8e555e7b 100644 --- a/plottr/data/datadict.py +++ b/plottr/data/datadict.py @@ -189,6 +189,9 @@ def has_meta(self, key: str) -> bool: if k in self: return True else: + for key, field_dict in self.data_items(): + if k in field_dict: + return True return False def meta_val(self, key: str, data: Union[str, None] = None) -> Any: @@ -244,7 +247,7 @@ def clear_meta(self, data: Union[str, None] = None) -> None: """ Delete meta information. - :param data: if this is not None, delete onlymeta information from data + :param data: if this is not None, delete only meta information from data field `data`. Else, delete all top-level meta, as well as meta for all data fields. @@ -260,7 +263,8 @@ def clear_meta(self, data: Union[str, None] = None) -> None: self.delete_meta(m, d) else: - for m, _ in self.meta_items(data): + data_meta_list = [m for m, _ in self.meta_items(data)] + for m in data_meta_list: self.delete_meta(m, data) def extract(self: T, data: List[str], include_meta: bool = True, diff --git a/test/pytest/test_data_dict_base.py b/test/pytest/test_data_dict_base.py index 3646b470..c47dbd03 100644 --- a/test/pytest/test_data_dict_base.py +++ b/test/pytest/test_data_dict_base.py @@ -55,12 +55,26 @@ def test_meta(): assert dd.meta_val('info')(1) == 0 assert dd.meta_val('@^&', 'x') == 0 + assert dd.has_meta('meta1') + assert dd.has_meta('meta3') + for k in ['meta1', 'meta2', '@^&']: assert dd.meta_val(k, data='x') == dd['x'][f'__{k}__'] assert f'__{k}__' in dd['x'] assert k in [n for n, _ in dd.meta_items('x')] # test stripping of meta information + + # test stripping specific data field + + dd.clear_meta('x') + assert dd.validate() + x_nmeta = 0 + for k, _ in dd['x'].items(): + if k[:2] == '__' and k[-2:] == '__': + x_nmeta += 1 + assert x_nmeta == 0 + dd.clear_meta() assert dd.validate()