From e4235189eb0d8f3d62a8f1e7ac29ff8d7ac26247 Mon Sep 17 00:00:00 2001 From: Taylor Salo Date: Thu, 25 Jan 2024 16:31:18 -0500 Subject: [PATCH] Support lists in bids_filter containing null or * --- fmriprep/cli/parser.py | 21 ++++++++++++++++----- fmriprep/config.py | 17 +++++++++++++---- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/fmriprep/cli/parser.py b/fmriprep/cli/parser.py index a62ab7f7f..9e426b771 100644 --- a/fmriprep/cli/parser.py +++ b/fmriprep/cli/parser.py @@ -90,13 +90,24 @@ def _to_gb(value): def _drop_sub(value): return value[4:] if value.startswith("sub-") else value - def _filter_pybids_none_any(dct): + def _process_value(value): import bids - return { - k: bids.layout.Query.NONE if v is None else (bids.layout.Query.ANY if v == "*" else v) - for k, v in dct.items() - } + if value is None: + return bids.layout.Query.NONE + elif value == "*": + return bids.layout.Query.ANY + else: + return value + + def _filter_pybids_none_any(dct): + d = {} + for k, v in dct.items(): + if isinstance(v, list): + d[k] = [_process_value(val) for val in v] + else: + d[k] = _process_value(v) + return d def _bids_filter(value, parser): from json import JSONDecodeError, loads diff --git a/fmriprep/config.py b/fmriprep/config.py index ad0761f35..1dfc7783f 100644 --- a/fmriprep/config.py +++ b/fmriprep/config.py @@ -493,12 +493,21 @@ def init(cls): if cls.bids_filters: from bids.layout import Query + def _process_value(value): + """Convert string with "Query" in it to Query object.""" + if isinstance(value, list): + return [_process_value(val) for val in value] + else: + return ( + getattr(Query, value[7:-4]) + if not isinstance(value, Query) and "Query" in value + else value + ) + # unserialize pybids Query enum values for acq, filters in cls.bids_filters.items(): - cls.bids_filters[acq] = { - k: getattr(Query, v[7:-4]) if not isinstance(v, Query) and "Query" in v else v - for k, v in filters.items() - } + for k, v in filters.items(): + cls.bids_filters[acq][k] = _process_value(v) if "all" in cls.debug: cls.debug = list(DEBUG_MODES)