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
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
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