Skip to content

Instantly share code, notes, and snippets.

@chrisgorgo
Created April 7, 2010 20:22
Show Gist options
  • Save chrisgorgo/359398 to your computer and use it in GitHub Desktop.
Save chrisgorgo/359398 to your computer and use it in GitHub Desktop.
'''
Created on Apr 7, 2010
@author: filo
'''
from nipype.interfaces.base import traits, isdefined
from enthought.traits.has_traits import HasTraits
class OutputMultiPath(traits.List):
""" Implements a user friendly traits that accepts one or more
paths to files or directories
XXX This should only be used as a final resort. We should stick to
established Traits to the extent possible.
XXX This needs to be vetted by somebody who understands traits
>>> from nipype.interfaces.base import MultiPath
>>> class A(traits.HasTraits):
... foo = MultiPath(File(exists=False))
>>> a = A()
>>> a
[]
>>> a.foo = '/software/temp/foo.txt'
>>> a.foo
'/software/temp/foo.txt'
>>> a.foo = ['/software/temp/foo.txt']
>>> a.foo
'/software/temp/foo.txt'
>>> a.foo = ['/software/temp/foo.txt', '/software/temp/goo.txt']
>>> a.foo
['/software/temp/foo.txt', '/software/temp/goo.txt']
"""
info_text = 'a list of paths'
def __init__(self, trait = None, value = None, **metadata):
if trait:
self.info_text = 'a list of %s' % trait.info()
super(MultiPath, self).__init__(trait, value,
**metadata)
def get(self, object, name):
value = self.get_value(object, name)
if value:
if len(value)==1:
return value[0]
return value
def set(self, object, name, value):
self.set_value(object, name, value)
def validate(self, object, name, value):
newvalue = value
if isinstance(value, str):
newvalue = [value]
if not isdefined(value):
return value
else:
return super(MultiPath, self).validate(object, name, newvalue)
class InputMultiPath(traits.List):
""" Implements a user friendly traits that accepts one or more
paths to files or directories
XXX This should only be used as a final resort. We should stick to
established Traits to the extent possible.
XXX This needs to be vetted by somebody who understands traits
>>> from nipype.interfaces.base import MultiPath
>>> class A(traits.HasTraits):
... foo = MultiPath(File(exists=False))
>>> a = A()
>>> a
[]
>>> a.foo = '/software/temp/foo.txt'
>>> a.foo
'/software/temp/foo.txt'
>>> a.foo = ['/software/temp/foo.txt']
>>> a.foo
'/software/temp/foo.txt'
>>> a.foo = ['/software/temp/foo.txt', '/software/temp/goo.txt']
>>> a.foo
['/software/temp/foo.txt', '/software/temp/goo.txt']
"""
info_text = 'a list of paths'
def __init__(self, trait = None, value = None, **metadata):
if trait:
self.info_text = 'a list of %s' % trait.info()
super(InputMultiPath, self).__init__(trait, value,
**metadata)
def get(self, object, name):
value = self.get_value(object, name)
return value
def set(self, object, name, value):
self.set_value(object, name, value)
def validate(self, object, name, value):
newvalue = value
if isinstance(value, str):
newvalue = [value]
if not isdefined(value):
return value
else:
return super(InputMultiPath, self).validate(object, name, newvalue)
class Test(traits.HasTraits):
foo = OutputMultiPath(traits.File())
boo = InputMultiPath(traits.File())
t = Test()
t.foo = 'abc'
print t.foo
t.foo = ['abc']
print t.foo
t.foo = 'abc'
print t.foo
t.foo = ['abc', 'abc']
print t.foo
t.boo = 'abc'
print t.boo
t.boo = ['abc']
print t.boo
t.boo = 'abc'
print t.boo
t.boo = ['abc', 'abc']
print t.boo
@satra
Copy link

satra commented Apr 7, 2010

class OutputMultiPath(traits.List):
""" Implements a user friendly traits that accepts one or more
paths to files or directories

XXX This should only be used as a final resort. We should stick to
established Traits to the extent possible.

XXX This needs to be vetted by somebody who understands traits

>>> from nipype.interfaces.base import MultiPath
>>> class A(traits.HasTraits):
...     foo = MultiPath(File(exists=False))
>>> a = A()
>>> a
[]

>>> a.foo = '/software/temp/foo.txt'
>>> a.foo
'/software/temp/foo.txt'

>>> a.foo = ['/software/temp/foo.txt']
>>> a.foo
'/software/temp/foo.txt'

>>> a.foo = ['/software/temp/foo.txt', '/software/temp/goo.txt']
>>> a.foo
['/software/temp/foo.txt', '/software/temp/goo.txt']

"""

def __init__(self, trait  = None, **metadata):
    super(OutputMultiPath, self).__init__(trait, **metadata)

def get(self, object, name):
    value = self.get_value(object, name)
    if isdefined(value):
        if len(value)==1:
            return value[0]
    return value

def set(self, object, name, value):
    if isdefined(value):
        self.set_value(object, name, value)

def validate(self, object, name, value):
    if not isdefined(value):
        return value
    newvalue = value
    if isinstance(value, str):
        newvalue = [value]
    return super(OutputMultiPath, self).validate(object, name, newvalue)

class InputMultiPath(traits.List):
""" Implements a user friendly traits that accepts one or more
paths to files or directories

XXX This should only be used as a final resort. We should stick to
established Traits to the extent possible.

XXX This needs to be vetted by somebody who understands traits

>>> from nipype.interfaces.base import MultiPath
>>> class A(traits.HasTraits):
...     foo = MultiPath(File(exists=False))
>>> a = A()
>>> a
[]

>>> a.foo = '/software/temp/foo.txt'
>>> a.foo
'/software/temp/foo.txt'

>>> a.foo = ['/software/temp/foo.txt']
>>> a.foo
'/software/temp/foo.txt'

>>> a.foo = ['/software/temp/foo.txt', '/software/temp/goo.txt']
>>> a.foo
['/software/temp/foo.txt', '/software/temp/goo.txt']

"""

def __init__(self, trait  = None, **metadata):
    super(InputMultiPath, self).__init__(trait, **metadata)

def get(self, object, name):
    value = self.get_value(object, name)
    return value

def set(self, object, name, value):
    self.set_value(object, name, value)

def validate(self, object, name, value):
    if not isdefined(value):
        return value
    newvalue = value
    if isinstance(value, str):
        newvalue = [value]
    return super(InputMultiPath, self).validate(object, name, newvalue)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment