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