From b5ab44826b0c70e0a604a6d583a5a4f415996db4 Mon Sep 17 00:00:00 2001 From: Paul McCarthy <pauldmccarthy@gmail.com> Date: Thu, 1 Mar 2018 13:57:17 +0000 Subject: [PATCH] Assertions can be disabled via a "disabled" context manager function. --- fsl/utils/assertions.py | 56 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/fsl/utils/assertions.py b/fsl/utils/assertions.py index 8d6e0ba10..b8e5a43b5 100644 --- a/fsl/utils/assertions.py +++ b/fsl/utils/assertions.py @@ -6,22 +6,72 @@ # Paul McCarthy <pauldmccarthy@gmail.com> # """This module contains a handful of miscellaneous assertion routines. + +.. autosummary:: + :nosignatures: + + assertFileExists + assertIsNifti3D + assertIsNifti4D + assertIsNifti + assertNiftiShape + assertIsSurfGifti + assertIsFuncGifti + assertIsMelodicDir + + +The :func:`disabled` context manager can be used to temporarily disable +assertion checks. """ import os.path as op +import contextlib import nibabel as nib import fsl.utils.ensure as ensure import fsl.data.melodicanalysis as fslma +_DISABLE_ASSERTIONS = False +""" +""" + + +@contextlib.contextmanager +def disabled(): + """Context manager which allows assertion checks to be temporarily + disabled. + """ + global _DISABLE_ASSERTIONS + + oldval = _DISABLE_ASSERTIONS + _DISABLE_ASSERTIONS = True + + try: + yield + finally: + _DISABLE_ASSERTIONS = oldval + + +def _canDisable(func): + """Decorator used on assertion functions, allowing them to be disabled + via the :func:`disabled` context manager. + """ + def wrapper(*args, **kwargs): + if not _DISABLE_ASSERTIONS: + return func(*args, **kwargs) + return wrapper + + +@_canDisable def assertFileExists(*args): """Raise an exception if the specified file/folder/s do not exist.""" for f in args: assert op.exists(f), 'file/folder does not exist: {}'.format(f) +@_canDisable def assertIsNifti3D(*args): """Raise an exception if the specified file/s are not 3D nifti.""" for f in args: @@ -31,6 +81,7 @@ def assertIsNifti3D(*args): 'incorrect shape for 3D nifti: {}:{}'.format(d.shape, f) +@_canDisable def assertIsNifti4D(*args): """Raise an exception if the specified file/s are not 4D nifti.""" for f in args: @@ -40,6 +91,7 @@ def assertIsNifti4D(*args): 'incorrect shape for 4D nifti: {}:{}'.format(d.shape, f) +@_canDisable def assertIsNifti(*args): """Raise an exception if the specified file/s are not nifti.""" for f in args: @@ -51,6 +103,7 @@ def assertIsNifti(*args): 'file must be a nifti (.nii or .nii.gz): {}'.format(f) +@_canDisable def assertNiftiShape(shape, *args): """Raise an exception if the specified nifti/s are not specified shape.""" for fname in args: @@ -60,6 +113,7 @@ def assertNiftiShape(shape, *args): shape, d.shape, fname) +@_canDisable def assertIsSurfGifti(*args): """Raise an exception if the specified file/s are not surface gifti.""" for fname in args: @@ -67,6 +121,7 @@ def assertIsSurfGifti(*args): 'file must be a surface gifti (surf.gii): {}'.format(fname) +@_canDisable def assertIsFuncGifti(*args): """Raise an exception if the specified file/s are not functional gifti.""" for fname in args: @@ -74,6 +129,7 @@ def assertIsFuncGifti(*args): 'file must be a functional gifti (func.gii): {}'.format(fname) +@_canDisable def assertIsMelodicDir(path): """Raise an exception if the specified path is not a melodic directory. -- GitLab