From eee2c3662323b6743a7d11777e0ce9115254639f Mon Sep 17 00:00:00 2001 From: Michiel Cottaar <MichielCottaar@gmail.com> Date: Thu, 2 May 2019 13:46:52 +0100 Subject: [PATCH] BUG: check invalid characters in the FileTree Also made small fixes to trees that contained invalid characters --- fsl/utils/filetree/parse.py | 20 ++++++++++++++++++++ fsl/utils/filetree/trees/HCP_Surface.tree | 2 +- fsl/utils/filetree/trees/freesurfer.tree | 4 ++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/fsl/utils/filetree/parse.py b/fsl/utils/filetree/parse.py index 11a8f1f22..f76fe9b72 100644 --- a/fsl/utils/filetree/parse.py +++ b/fsl/utils/filetree/parse.py @@ -38,6 +38,21 @@ def list_all_trees() -> List[str]: return trees +def check_forbidden_characters(text, characters, text_type): + """ + Checks the text for forbidden characters + + raises ValueError if one is found + + :param text: string with the text + :param characters: sequence of forbidden characters + :param text_type: type of the text to raise in error message + """ + bad = [character for character in characters if character in text] + if len(bad) > 0: + raise ValueError(f'Invalid character(s) "{"".join(bad)}" in {text_type}: {text}') + + def read_line(line: str) -> Tuple[int, PurePath, str]: """ Parses line from the tree file @@ -54,11 +69,14 @@ def read_line(line: str) -> Tuple[int, PurePath, str]: match = re.match(r'^(\s*)(\S*)\s*\((\S*)\)\s*$', line) if match is not None: gr = match.groups() + check_forbidden_characters(gr[1], r'<>"/\|?*', 'file or directory name') + check_forbidden_characters(gr[2], r'(){}/', 'short name') return len(gr[0]), PurePath(gr[1]), gr[2] match = re.match(r'^(\s*)(\S*)\s*$', line) if match is not None: gr = match.groups() short_name = gr[1].split('.')[0] + check_forbidden_characters(gr[1], r'<>"/\|?*', 'file or directory name') return len(gr[0]), PurePath(gr[1]), short_name raise ValueError('Unrecognized line %s' % line) @@ -79,6 +97,8 @@ def read_subtree_line(line: str, directory: str) -> Tuple[int, "filetree.FileTre if match is None: raise ValueError("Sub-tree line could not be parsed: {}".format(line.strip())) spaces, type_name, variables_str, short_name = match.groups() + check_forbidden_characters(type_name, r'<>:"/\|?*', 'sub-tree name') + check_forbidden_characters(short_name, r'(){}/', 'sub-tree name') variables = {} if len(variables_str.strip()) != 0: diff --git a/fsl/utils/filetree/trees/HCP_Surface.tree b/fsl/utils/filetree/trees/HCP_Surface.tree index 0d6e02539..9db03d9cc 100644 --- a/fsl/utils/filetree/trees/HCP_Surface.tree +++ b/fsl/utils/filetree/trees/HCP_Surface.tree @@ -27,6 +27,6 @@ {subject}.sulc_MSMAll.{space}.dscalar.nii (sulc_msm_cifti) {subject}.thickness_MSMAll.{space}.dscalar.nii (thick_msm_cifti) {subject}.curvature_MSMAll.{space}.dscalar.nii (curv_msm_cifti) -{subject}.BA.32k_fs_LR.dlabel.nii (BA_cifti)) +{subject}.BA.32k_fs_LR.dlabel.nii (BA_cifti) {subject}.aparc.32k_fs_LR.dlabel.nii (aparc_cifti) {subject}.aparc.a2009s.32k_fs_LR.dlabel.nii (aparc2009_cifti) diff --git a/fsl/utils/filetree/trees/freesurfer.tree b/fsl/utils/filetree/trees/freesurfer.tree index 8a20ac211..cd6df40ba 100644 --- a/fsl/utils/filetree/trees/freesurfer.tree +++ b/fsl/utils/filetree/trees/freesurfer.tree @@ -67,10 +67,10 @@ aparc.a2009s+aseg.mgz (aparc_a2009s_aseg) aseg.mgz - label/ + label {hemi}h.aparc.annot (aparc.annot) - stats/ + stats aseg.stats (aseg_stats) wmparc.stats (wmparc_stats) -- GitLab