class VarTree(Variable):
    """ A Variable for a :class:`VariableTree` of a particular type. """

    def __init__(self, default_value, allow_none=True, **metadata):
        from openmdao.main.vartree import VariableTree # Break import loop on VariableTree
        if isinstance(default_value, VariableTree):
            klass = default_value.__class__
            if 'iotype' in metadata:
                default_value._iotype = metadata['iotype']
            else:
                metadata['iotype'] = default_value.iotype
        else:
            raise TypeError('default_value must be an instance of VariableTree'
                            ' or subclass')

        metadata.setdefault('copy', 'deep')
        self._allow_none = allow_none
        self.klass = klass
        self._instance = Instance(klass=klass, allow_none=False, factory=None,
                                  args=None, kw=None, **metadata)
        self._instance.default_value = default_value
        super(VarTree, self).__init__(default_value, **metadata)

    def validate(self, obj, name, value):
        """ Validates that a specified value is valid for this trait. """
        if value is None:
            if self._allow_none:
                return value
            self.validate_failed(obj, name, value)

        try:
            value = self._instance.validate(obj, name, value)
        except Exception:
            obj.raise_exception('%r must be an instance of %s.%s' %
                                (name, self._instance.klass.__module__,
                                 self._instance.klass.__name__), TypeError)
        return value

    def post_setattr(self, obj, name, value):
        """ VariableTrees must know their place within the hierarchy, so set
        their parent here.  This keeps side effects out of validate(). """
        if value.parent is not obj:
            value.parent = obj
        value._iotype = self.iotype

    def get_attribute(self, name, value, trait, meta):
        """Return the attribute dictionary for this variable. This dict is
        used by the GUI to populate the edit UI. Slots also return an
        attribute dictionary for the slot pane.

        name: str
          Name of variable

        value: object
          The value of the variable

        trait: CTrait
          The variable's trait

        meta: dict
          Dictionary of metadata for this variable
        """
        io_attr = {}
        io_attr['name'] = name
        io_attr['type'] = trait.trait_type.klass.__name__
        io_attr['ttype'] = 'vartree'

        for field in meta:
            if field not in gui_excludes:
                io_attr[field] = meta[field]

        return io_attr, None
Exemple #2
0
class VarTree(Variable):
    """ A Variable for a :class:`VariableTree` of a particular type. """
    def __init__(self, default_value, allow_none=True, **metadata):
        from openmdao.main.vartree import VariableTree  # Break import loop on VariableTree
        if isinstance(default_value, VariableTree):
            klass = default_value.__class__
            if 'iotype' in metadata:
                default_value._iotype = metadata['iotype']
            else:
                metadata['iotype'] = default_value.iotype
        else:
            raise TypeError('default_value must be an instance of VariableTree'
                            ' or subclass')

        metadata.setdefault('copy', 'deep')
        self._allow_none = allow_none
        self.klass = klass
        self._instance = Instance(klass=klass,
                                  allow_none=False,
                                  factory=None,
                                  args=None,
                                  kw=None,
                                  **metadata)
        self._instance.default_value = default_value
        super(VarTree, self).__init__(default_value, **metadata)

    def validate(self, obj, name, value):
        """ Validates that a specified value is valid for this trait. """
        if value is None:
            if self._allow_none:
                return value
            self.validate_failed(obj, name, value)

        try:
            value = self._instance.validate(obj, name, value)
        except Exception:
            obj.raise_exception(
                '%r must be an instance of %s.%s' %
                (name, self._instance.klass.__module__,
                 self._instance.klass.__name__), TypeError)
        return value

    def post_setattr(self, obj, name, value):
        """ VariableTrees must know their place within the hierarchy, so set
        their parent here.  This keeps side effects out of validate(). """
        if value.parent is not obj:
            value.parent = obj
        value._iotype = self.iotype

    def get_attribute(self, name, value, trait, meta):
        """Return the attribute dictionary for this variable. This dict is
        used by the GUI to populate the edit UI. Slots also return an
        attribute dictionary for the slot pane.

        name: str
          Name of variable

        value: object
          The value of the variable

        trait: CTrait
          The variable's trait

        meta: dict
          Dictionary of metadata for this variable
        """
        io_attr = {}
        io_attr['name'] = name
        io_attr['type'] = trait.trait_type.klass.__name__
        io_attr['ttype'] = 'vartree'

        for field in meta:
            if field not in gui_excludes:
                io_attr[field] = meta[field]

        return io_attr, None
Exemple #3
0
class Slot(Variable):
    """A trait for an object of a particular type or implementing a particular
    interface. Both Traits Interfaces and zope.interface.Interfaces are
    supported.
    """

    def __init__(self, klass=object, allow_none=True, factory=None,
                 args=None, kw=None, **metadata):

        default_value = None
        try:
            iszopeiface = issubclass(klass, zope.interface.Interface)
        except TypeError:
            iszopeiface = False
            if not isclass(klass):
                default_value = klass
                klass = klass.__class__

        metadata.setdefault('copy', 'deep')

        self._allow_none = allow_none
        self.klass = klass

        if has_interface(klass, IContainer) or \
           (isclass(klass) and IContainer.implementedBy(klass)):
            self._is_container = True
        else:
            self._is_container = False

        if iszopeiface:
            self._instance = None
            self.factory = factory
            self.args = args
            self.kw = kw
        else:
            self._instance = Instance(klass=klass, allow_none=allow_none,
                                      factory=factory, args=args, kw=kw,
                                      **metadata)
            if default_value:
                self._instance.default_value = default_value
            else:
                default_value = self._instance.default_value

            if klass.__name__ == 'VariableTree':
                raise TypeError('Slotting of VariableTrees is not supported,'
                                ' please use VarTree instead')

        super(Slot, self).__init__(default_value, **metadata)

    def validate(self, obj, name, value):
        ''' wrapper around Enthought validate method'''

        if value is None:
            if self._allow_none:
                return value
            self.validate_failed(obj, name, value)

        if self._instance is None:  # our iface is a zope.interface
            if not self.klass.providedBy(value):
                self._iface_error(obj, name, self.klass.__name__)
        else:
            try:
                value = self._instance.validate(obj, name, value)
            except Exception:
                if issubclass(self._instance.klass, Interface):
                    self._iface_error(obj, name, self._instance.klass.__name__)
                else:
                    obj.raise_exception("%s must be an instance of class '%s'" %
                                        (name, self._instance.klass.__name__),
                                        TypeError)

        return value

    def post_setattr(self, obj, name, value):
        '''Containers must know their place within the hierarchy, so set their
        parent here.  This keeps side effects out of validate()'''

        if self._is_container and value is not None:
            if value.parent is not obj:
                value.parent = obj

    def _iface_error(self, obj, name, iface_name):
        obj.raise_exception("%s must provide interface '%s'" %
                            (name, iface_name), TypeError)

    def get_attribute(self, name, value, trait, meta):
        """Return the attribute dictionary for this variable. This dict is
        used by the GUI to populate the edit UI. Slots also return an
        attribute dictionary for the slot pane.

        name: str
          Name of variable

        value: object
          The value of the variable

        trait: CTrait
          The variable's trait

        meta: dict
          Dictionary of metadata for this variable
        """

        io_attr = {}
        io_attr['name'] = name
        io_attr['type'] = trait.trait_type.klass.__name__
        io_attr['ttype'] = 'slot'

        slot_attr = {}
        slot_attr['name'] = name

        if value is None:
            slot_attr['filled'] = None
        elif value is []:
            slot_attr['filled'] = []
        else:
            slot_attr['filled'] = type(value).__name__

        slot_attr['klass'] = io_attr['type']
        slot_attr['containertype'] = 'singleton'

        for field in meta:
            if field not in gui_excludes:
                slot_attr[field] = meta[field]
                io_attr[field] = meta[field]

        return io_attr, slot_attr