def test_object_1(self): c = C() observe.observe(c, self.listener) observe.scan() assert not self.listened c.x = 1 observe.scan() assert self.listened == (c, object, {"x" : 1}, {})
def test_object_2(self): c = C() observe.observe(c, self.listener) observe.scan() assert not self.listened c.x = 1 c.y = "e" observe.scan() assert self.listened == (c, object, {"x" : 1, "y" : "e"}, {})
def test_list_1(self): c = [0] observe.observe(c, self.listener) observe.scan() assert not self.listened c.append(1) observe.scan() assert self.listened == (c, list, [0, 1], [0]) c.remove(0) observe.scan() assert self.listened == (c, list, [1], [0, 1])
def test_set_1(self): c = set([0]) observe.observe(c, self.listener) observe.scan() assert not self.listened c.add(1) observe.scan() assert self.listened == (c, set, set([0, 1]), set([0])) c.remove(0) observe.scan() assert self.listened == (c, set, set([1]), set([0, 1]))
def __init__(self, parent_node, o): self.descr = introsp.description(o.__class__) self.o = o self.o_children_getter = self.descr.children_getter_of(self.o) self.o_children = None self.o_has_children = self.descr.has_children(self.o) super(HierarchyNode, self).__init__(parent_node) observe.observe(self.o, self._listener) if isinstance(self.o_has_children, list) or isinstance(self.o_has_children, set) or isinstance(self.o_has_children, dict): observe.observe(self.o_has_children, self._listener)
def edit(self, o): if o is self.o: return if not self.o is None: observe.unobserve(self.o, self._listener) self.o = o self.descr = introsp.description(o.__class__) if not o is None: self._update() observe.observe(self.o, self._listener) else: self._set_icon_filename_label_details("", "", "")
def create_children(self, old_children = ()): if not self.o_has_children: return [] if self.o_children is None: if isinstance(self.o_has_children, list) or isinstance(self.o_has_children, set) or isinstance(self.o_has_children, dict): observe.unobserve(self.o_has_children, self._listener) self.o_children = self.descr.children_of(self.o) observe.observe(self.o_children, self._listener) # Order them if isinstance(self.o_children, set ): self.o_children = list (self.o_children) elif isinstance(self.o_children, frozenset): self.o_children = tuple(self.o_children) elif isinstance(self.o_children, dict ): self.o_children = self.o_children.values() old = dict([(child.o, child) for child in old_children]) return [old.get(o) or self.__class__(self, o) for o in self.o_children]
def edit(self, o): if o is self.o: return self.descr = introsp.description(o.__class__) if not o is None: attrs = [(self.descr.priority_for_attr(o, attr), editobj2.TRANSLATOR(attr), attr, self.descr.field_for_attr(o, attr)) for attr in self.descr.attrs_of(o)] attrs = [priority_name_attr_Field for priority_name_attr_Field in attrs if priority_name_attr_Field[-1]] attrs.sort() else: attrs = [] if o and self.o and (self.attrs == attrs): if not self.o is None: observe.unobserve(self.o, self._listener) self.o = o self.property_attrs = self.descr.property_attrs_of(o) self.attrs = attrs if not o is None: for field in self.fields.itervalues(): field.edit(o) observe.observe(self.o, self._listener) else: if not self.o is None: observe.unobserve(self.o, self._listener) self._delete_all_fields() self.o = o self.property_attrs = self.descr.property_attrs_of(o) self.attrs = attrs if not o is None: self._set_nb_fields(len(attrs)) i = 0 self.fields = {} for priority, name, attr, Field in attrs: if (Field is editobj2.field.ObjectAttributeField) and isinstance(self.master, editobj2.field.ObjectAttributeField): Field = editobj2.field.EntryField field = self.fields[attr] = Field(self.gui, self, o, attr, self.undo_stack) self._new_field(name, field, self.descr.unit_for_attr(o, attr), i) i += 1 observe.observe(self.o, self._listener)
def _listener(self, o, type, new, old): self.update() if (type is list) or (type is set) or (type is dict): if self.o_children is not None: observe.unobserve(self.o_children, self._listener) self.o_children = self.descr.children_of(self.o) observe.observe(self.o_children, self._listener) self.update_children() elif type is object: if self.o_children is not None: if (self.o_children_getter in new.keys()) or (self.o_children_getter in old.keys()): # XXX Optimizable : verify if self.o_children_getter is a string AND new[self.o_children_getter] == old[self.o_children_getter] observe.unobserve(self.o_children, self._listener) self.o_children = self.descr.children_of(self.o) observe.observe(self.o_children, self._listener) self.update_children() elif type == "__class__": self.descr = introsp.description(self.o.__class__) self.update_children()