2 # -*- coding: utf-8 -*-
4 class Attribute(object):
22 BOOL : lambda x : str(x).lower() in ("1","on","yes","true"),
30 # Attribute is only modifiable during experiment design
32 # Attribute is read only and can't be modified by the user
33 # Note: ReadOnly implies DesignOnly
35 # Attribute is invisible to the user but can be modified
37 # Attribute has no default value in the testbed instance.
38 # So it needs to be set explicitely
39 HasNoDefaultValue = 0x08
41 def __init__(self, name, help, type, value = None, range = None,
42 allowed = None, flags = NoFlags, validation_function = None,
44 if not type in Attribute.types:
45 raise AttributeError("invalid type %s " % type)
51 # range: max and min possible values
53 # list of possible values
54 self._allowed = allowed
55 self._validation_function = validation_function
56 self._modified = False
57 self._category = category
77 return (self._flags & Attribute.Invisible) == Attribute.Invisible
81 return (self._flags & Attribute.ReadOnly) == Attribute.ReadOnly
84 def has_no_default_value(self):
85 return (self._flags & Attribute.HasNoDefaultValue) == \
86 Attribute.HasNoDefaultValue
89 def design_only(self):
90 return (self._flags & Attribute.DesignOnly) == Attribute.DesignOnly
109 def validation_function(self):
110 return self._validation_function
115 def set_value(self, value):
116 if self.is_valid_value(value):
118 self._modified = True
120 raise ValueError("Invalid value %s for attribute %s" %
121 (str(value), self.name))
123 value = property(get_value, set_value)
125 def is_valid_value(self, value):
126 return self._is_in_range(value) and \
127 self._is_in_allowed_values(value) and \
128 self._is_valid(value)
130 def _is_in_range(self, value):
131 return not self.range or \
132 (value >= self.range[0] and value <= self.range[1])
134 def _is_in_allowed_values(self, value):
135 return not self._allowed or value in self._allowed
137 def _is_valid(self, value):
138 return not self._validation_function or \
139 self._validation_function(self, value)
141 class AttributesMap(object):
142 """AttributesMap is the base class for every object whose attributes
143 are going to be manipulated by the end-user in a script or GUI.
146 super(AttributesMap, self).__init__()
147 self._attributes = dict()
150 def attributes(self):
151 return self._attributes.values()
154 def attributes_list(self):
155 return self._attributes.keys()
157 def set_attribute_value(self, name, value):
158 self._attributes[name].value = value
160 def get_attribute_value(self, name):
161 return self._attributes[name].value
163 def get_attribute_help(self, name):
164 return self._attributes[name].help
166 def get_attribute_type(self, name):
167 return self._attributes[name].type
169 def get_attribute_range(self, name):
170 if not self._attributes[name].range:
172 return self._attributes[name].range
174 def get_attribute_allowed(self, name):
175 return self._attributes[name].allowed
177 def get_attribute_category(self, name):
178 return self._attributes[name].category
180 def is_attribute_read_only(self, name):
181 return self._attributes[name].read_only
183 def is_attribute_invisible(self, name):
184 return self._attributes[name].invisible
186 def is_attribute_design_only(self, name):
187 return self._attributes[name].design_only
189 def has_attribute_no_default_value(self, name):
190 return self._attributes[name].has_no_default_value
192 def is_attribute_modified(self, name):
193 return self._attributes[name].modified
195 def is_attribute_value_valid(self, name, value):
196 return self._attributes[name].is_valid_value(value)
198 def add_attribute(self, name, help, type, value = None, range = None,
199 allowed = None, flags = Attribute.NoFlags, validation_function = None,
201 if name in self._attributes:
202 raise AttributeError("Attribute %s already exists" % name)
203 attribute = Attribute(name, help, type, value, range, allowed, flags,
204 validation_function, category)
205 self._attributes[name] = attribute
207 def del_attribute(self, name):
208 del self._attributes[name]
210 def has_attribute(self, name):
211 return name in self._attributes
214 self._attributes = dict()