Skip to content

Commit 7d310dd

Browse files
authored
Merge pull request #3049 from satra/enh/et
ENH: Delay etelemetry for non-interactive sessions, report bad versions
2 parents 5405950 + c7e3934 commit 7d310dd

File tree

3 files changed

+46
-8
lines changed

3 files changed

+46
-8
lines changed

.et

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{ "bad_versions" : [ "1.2.1",
2+
"1.2.3"]
3+
}

nipype/__init__.py

+37-8
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@
2222

2323
config = NipypeConfig()
2424
logging = Logging(config)
25-
logger = logging.getLogger('nipype.utils')
2625

27-
INIT_MSG = "Running {packname} version {version} (latest: {latest})".format
2826

2927
class NipypeTester(object):
3028
def __call__(self, doctests=True, parallel=False):
@@ -60,15 +58,46 @@ def get_info():
6058
Rename, Function, Select, Merge)
6159

6260

63-
if config.getboolean('execution', 'check_version'):
61+
def check_latest_version(raise_exception=False):
62+
"""Check for the latest version of the library
63+
64+
parameters:
65+
raise_exception: boolean
66+
Raise a RuntimeError if a bad version is being used
67+
"""
6468
import etelemetry
69+
logger = logging.getLogger('nipype.utils')
70+
71+
INIT_MSG = "Running {packname} version {version} (latest: {latest})".format
6572

66-
latest = {"version": 'Unknown'}
73+
latest = {"version": 'Unknown', "bad_versions": []}
74+
result = None
6775
try:
68-
latest = etelemetry.get_project("nipy/nipype")
76+
result = etelemetry.get_project("nipy/nipype")
6977
except Exception as e:
7078
logger.warning("Could not check for version updates: \n%s", e)
7179
finally:
72-
logger.info(INIT_MSG(packname='nipype',
73-
version=__version__,
74-
latest=latest["version"]))
80+
if result:
81+
latest.update(**result)
82+
if LooseVersion(__version__) != LooseVersion(latest["version"]):
83+
logger.info(INIT_MSG(packname='nipype',
84+
version=__version__,
85+
latest=latest["version"]))
86+
if latest["bad_versions"] and \
87+
any([LooseVersion(__version__) == LooseVersion(ver)
88+
for ver in latest["bad_versions"]]):
89+
message = ('You are using a version of Nipype with a critical '
90+
'bug. Please use a different version.')
91+
if raise_exception:
92+
raise RuntimeError(message)
93+
else:
94+
logger.critical(message)
95+
return latest
96+
97+
# Run telemetry on import for interactive sessions, such as IPython, Jupyter notebooks, Python REPL
98+
if config.getboolean('execution', 'check_version'):
99+
import __main__
100+
if not hasattr(__main__, '__file__'):
101+
from .interfaces.base import BaseInterface
102+
if BaseInterface._etelemetry_version_data is None:
103+
BaseInterface._etelemetry_version_data = check_latest_version()

nipype/interfaces/base/core.py

+6
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,15 @@ class BaseInterface(Interface):
166166
_redirect_x = False
167167
references_ = []
168168
resource_monitor = True # Enabled for this interface IFF enabled in the config
169+
_etelemetry_version_data = None
169170

170171
def __init__(self, from_file=None, resource_monitor=None,
171172
ignore_exception=False, **inputs):
173+
if config.getboolean('execution', 'check_version'):
174+
from ... import check_latest_version
175+
if BaseInterface._etelemetry_version_data is None:
176+
BaseInterface._etelemetry_version_data = check_latest_version()
177+
172178
if not self.input_spec:
173179
raise Exception(
174180
'No input_spec in class: %s' % self.__class__.__name__)

0 commit comments

Comments
 (0)