3131
3232from ...external .due import due
3333
34- from .traits_extension import traits , isdefined
34+ from .traits_extension import traits , isdefined , Undefined
3535from .specs import (
3636 BaseInterfaceInputSpec ,
3737 CommandLineInputSpec ,
@@ -180,7 +180,16 @@ def __init__(
180180 if not self .input_spec :
181181 raise Exception ("No input_spec in class: %s" % self .__class__ .__name__ )
182182
183- self .inputs = self .input_spec (** inputs )
183+ # Create input spec, disable any defaults that are unavailable due to
184+ # version, and then apply the inputs that were passed.
185+ self .inputs = self .input_spec ()
186+ unavailable_traits = self ._check_version_requirements (
187+ self .inputs , permissive = True
188+ )
189+ if unavailable_traits :
190+ self .inputs .trait_set (** {k : Undefined for k in unavailable_traits })
191+ self .inputs .trait_set (** inputs )
192+
184193 self .ignore_exception = ignore_exception
185194
186195 if resource_monitor is not None :
@@ -264,8 +273,12 @@ def _check_mandatory_inputs(self):
264273 ):
265274 self ._check_requires (spec , name , getattr (self .inputs , name ))
266275
267- def _check_version_requirements (self , trait_object , raise_exception = True ):
276+ def _check_version_requirements (self , trait_object , permissive = False ):
268277 """ Raises an exception on version mismatch
278+
279+ Set the ``permissive`` attribute to True to suppress warnings and exceptions.
280+ This is currently only used in __init__ to silently identify unavailable
281+ traits.
269282 """
270283 unavailable_traits = []
271284 # check minimum version
@@ -283,15 +296,16 @@ def _check_version_requirements(self, trait_object, raise_exception=True):
283296 f"Nipype cannot validate the package version { version !r} for "
284297 f"{ self .__class__ .__name__ } . Trait { name } requires version >={ min_ver } ."
285298 )
286- iflogger .warning (f"{ msg } . Please verify validity." )
299+ if not permissive :
300+ iflogger .warning (f"{ msg } . Please verify validity." )
287301 if config .getboolean ("execution" , "stop_on_unknown_version" ):
288302 raise ValueError (msg ) from err
289303 continue
290304 if too_old :
291305 unavailable_traits .append (name )
292306 if not isdefined (getattr (trait_object , name )):
293307 continue
294- if raise_exception :
308+ if not permissive :
295309 raise Exception (
296310 "Trait %s (%s) (version %s < required %s)"
297311 % (name , self .__class__ .__name__ , version , min_ver )
@@ -311,15 +325,16 @@ def _check_version_requirements(self, trait_object, raise_exception=True):
311325 f"Nipype cannot validate the package version { version !r} for "
312326 f"{ self .__class__ .__name__ } . Trait { name } requires version <={ max_ver } ."
313327 )
314- iflogger .warning (f"{ msg } . Please verify validity." )
328+ if not permissive :
329+ iflogger .warning (f"{ msg } . Please verify validity." )
315330 if config .getboolean ("execution" , "stop_on_unknown_version" ):
316331 raise ValueError (msg ) from err
317332 continue
318333 if too_new :
319334 unavailable_traits .append (name )
320335 if not isdefined (getattr (trait_object , name )):
321336 continue
322- if raise_exception :
337+ if not permissive :
323338 raise Exception (
324339 "Trait %s (%s) (version %s > required %s)"
325340 % (name , self .__class__ .__name__ , version , max_ver )
0 commit comments