Skip to content

Commit 7927c2d

Browse files
authored
Merge pull request #699 from effigies/rf/delayed_imports
RF: Avoid import-time loading of nose, mock and nibabel.testing
2 parents 4b6ca81 + 937cd9d commit 7927c2d

File tree

9 files changed

+35
-29
lines changed

9 files changed

+35
-29
lines changed

nibabel/__init__.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,19 @@
3434
3535
For more detailed information see the :ref:`manual`.
3636
"""
37+
38+
39+
def setup_test():
40+
""" Set numpy print options to "legacy" for new versions of numpy
41+
42+
If imported into a file, nosetest will run this before any doctests.
43+
"""
44+
import numpy
45+
from distutils.version import LooseVersion
46+
if LooseVersion(numpy.__version__) >= LooseVersion('1.14'):
47+
numpy.set_printoptions(legacy="1.13")
48+
49+
3750
# module imports
3851
from . import analyze as ana
3952
from . import spm99analyze as spm99
@@ -67,19 +80,19 @@
6780
from . import mriutils
6881
from . import streamlines
6982
from . import viewers
70-
from .testing import setup_test
7183

72-
# Note test requirement for "mock". Requirement for "nose" tested by numpy.
73-
try:
74-
import mock
75-
except ImportError:
84+
import pkgutil
85+
86+
if not pkgutil.find_loader('mock'):
7687
def test(*args, **kwargs):
7788
raise RuntimeError('Need "mock" package for tests')
7889
else:
7990
from numpy.testing import Tester
8091
test = Tester().test
8192
bench = Tester().bench
82-
del mock, Tester
93+
del Tester
94+
95+
del pkgutil
8396

8497
from .pkg_info import get_pkg_info as _get_pkg_info
8598

nibabel/affines.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import numpy as np
77

88
from six.moves import reduce
9-
from .testing import setup_test # noqa
9+
from . import setup_test # noqa
1010

1111

1212
class AffineError(ValueError):

nibabel/casting.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from platform import processor, machine
99

1010
import numpy as np
11-
from .testing import setup_test # noqa
11+
from . import setup_test # noqa
1212

1313

1414
class CastingError(Exception):

nibabel/nicom/dwiparams.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
'''
2222
import numpy as np
2323
import numpy.linalg as npl
24-
from ..testing import setup_test as setup_module # noqa
24+
from .. import setup_test as setup_module # noqa
2525

2626

2727
def B2q(B, tol=None):

nibabel/nifti1.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
from .spm99analyze import SpmAnalyzeHeader
2828
from .casting import have_binary128
2929
from .pydicom_compat import have_dicom, pydicom as pdcm
30-
from .testing import setup_test # noqa
30+
from . import setup_test # noqa
3131

3232
# nifti1 flat header definition for Analyze-like first 348 bytes
3333
# first number in comments indicates offset in file header in bytes

nibabel/optpkg.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
""" Routines to support optional packages """
2+
import pkgutil
23
from distutils.version import LooseVersion
3-
44
from six import string_types
5+
from .tripwire import TripWire
56

6-
try:
7-
import nose
8-
except ImportError:
9-
have_nose = False
10-
else:
7+
if pkgutil.find_loader('nose'):
118
have_nose = True
12-
13-
from .tripwire import TripWire
9+
else:
10+
have_nose = False
1411

1512

1613
def _check_pkg_version(pkg, min_version):
@@ -121,6 +118,7 @@ def optional_package(name, trip_msg=None, min_version=None):
121118

122119
def setup_module():
123120
if have_nose:
121+
import nose
124122
raise nose.plugins.skip.SkipTest('No %s for these tests'
125123
% name)
126124
return pkg, False, setup_module

nibabel/quaternions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
import math
2929
import numpy as np
30-
from .testing import setup_test # noqa
30+
from . import setup_test # noqa
3131

3232
MAX_FLOAT = np.maximum_sctype(np.float)
3333
FLOAT_EPS = np.finfo(np.float).eps

nibabel/testing/__init__.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -213,13 +213,3 @@ def assert_arr_dict_equal(dict1, dict2):
213213
for key, value1 in dict1.items():
214214
value2 = dict2[key]
215215
assert_array_equal(value1, value2)
216-
217-
218-
def setup_test():
219-
""" Set numpy print options to "legacy" for new versions of numpy
220-
221-
If imported into a file, nosetest will run this before any doctests.
222-
"""
223-
from distutils.version import LooseVersion
224-
if LooseVersion(np.__version__) >= LooseVersion('1.14'):
225-
np.set_printoptions(legacy="1.13")

nibabel/tests/test_optpkg.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,12 @@ def test_basic():
3838
assert_good('os.path')
3939
# We never have package _not_a_package
4040
assert_bad('_not_a_package')
41+
42+
# setup_module imports nose, so make sure we don't disrupt that
43+
orig_import = builtins.__import__
4144
def raise_Exception(*args, **kwargs):
45+
if args[0] == 'nose':
46+
return orig_import(*args, **kwargs)
4247
raise Exception(
4348
"non ImportError could be thrown by some malfunctioning module "
4449
"upon import, and optional_package should catch it too")

0 commit comments

Comments
 (0)