Skip to content

Commit 946519c

Browse files
authored
Merge pull request #3241 from effigies/versioncheck
FIX: Warn for min/max_ver traits when tool version can't be parsed
2 parents d7a775b + bf24dba commit 946519c

File tree

2 files changed

+61
-3
lines changed

2 files changed

+61
-3
lines changed

nipype/interfaces/base/core.py

+24-2
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,18 @@ def _check_version_requirements(self, trait_object, raise_exception=True):
276276
version = LooseVersion(str(self.version))
277277
for name in names:
278278
min_ver = LooseVersion(str(trait_object.traits()[name].min_ver))
279-
if min_ver > version:
279+
try:
280+
too_old = min_ver > version
281+
except TypeError as err:
282+
msg = (
283+
f"Nipype cannot validate the package version {version!r} for "
284+
f"{self.__class__.__name__}. Trait {name} requires version >={min_ver}."
285+
)
286+
iflogger.warning(f"{msg}. Please verify validity.")
287+
if config.getboolean("execution", "stop_on_unknown_version"):
288+
raise ValueError(msg) from err
289+
continue
290+
if too_old:
280291
unavailable_traits.append(name)
281292
if not isdefined(getattr(trait_object, name)):
282293
continue
@@ -293,7 +304,18 @@ def _check_version_requirements(self, trait_object, raise_exception=True):
293304
version = LooseVersion(str(self.version))
294305
for name in names:
295306
max_ver = LooseVersion(str(trait_object.traits()[name].max_ver))
296-
if max_ver < version:
307+
try:
308+
too_new = max_ver < version
309+
except TypeError as err:
310+
msg = (
311+
f"Nipype cannot validate the package version {version!r} for "
312+
f"{self.__class__.__name__}. Trait {name} requires version <={max_ver}."
313+
)
314+
iflogger.warning(f"{msg}. Please verify validity.")
315+
if config.getboolean("execution", "stop_on_unknown_version"):
316+
raise ValueError(msg) from err
317+
continue
318+
if too_new:
297319
unavailable_traits.append(name)
298320
if not isdefined(getattr(trait_object, name)):
299321
continue

nipype/interfaces/base/tests/test_core.py

+37-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# vi: set ft=python sts=4 ts=4 sw=4 et:
44
import os
55
import simplejson as json
6+
import logging
67

78
import pytest
89
from unittest import mock
@@ -236,6 +237,41 @@ class DerivedInterface1(nib.BaseInterface):
236237
obj._check_version_requirements(obj.inputs)
237238

238239

240+
def test_input_version_missing(caplog):
241+
class DerivedInterface(nib.BaseInterface):
242+
class input_spec(nib.TraitedSpec):
243+
foo = nib.traits.Int(min_ver="0.9")
244+
bar = nib.traits.Int(max_ver="0.9")
245+
246+
_version = "misparsed-garbage"
247+
248+
obj = DerivedInterface()
249+
obj.inputs.foo = 1
250+
obj.inputs.bar = 1
251+
with caplog.at_level(logging.WARNING, logger="nipype.interface"):
252+
obj._check_version_requirements(obj.inputs)
253+
assert len(caplog.records) == 2
254+
255+
256+
def test_input_version_missing_error():
257+
from nipype import config
258+
259+
class DerivedInterface(nib.BaseInterface):
260+
class input_spec(nib.TraitedSpec):
261+
foo = nib.traits.Int(min_ver="0.9")
262+
bar = nib.traits.Int(max_ver="0.9")
263+
264+
_version = "misparsed-garbage"
265+
266+
with mock.patch.object(config, "getboolean", return_value=True):
267+
obj = DerivedInterface(foo=1)
268+
with pytest.raises(ValueError):
269+
obj._check_version_requirements(obj.inputs)
270+
obj = DerivedInterface(bar=1)
271+
with pytest.raises(ValueError):
272+
obj._check_version_requirements(obj.inputs)
273+
274+
239275
def test_output_version():
240276
class InputSpec(nib.TraitedSpec):
241277
foo = nib.traits.Int(desc="a random int")
@@ -457,7 +493,7 @@ def test_global_CommandLine_output(tmpdir):
457493
ci = BET()
458494
assert ci.terminal_output == "stream" # default case
459495

460-
with mock.patch.object(nib.CommandLine, '_terminal_output'):
496+
with mock.patch.object(nib.CommandLine, "_terminal_output"):
461497
nib.CommandLine.set_default_terminal_output("allatonce")
462498
ci = nib.CommandLine(command="ls -l")
463499
assert ci.terminal_output == "allatonce"

0 commit comments

Comments
 (0)