Пример #1
0
 def __init__(self, meta=None, fields=tuple()):
     if meta is None:
         meta = {}
     self.meta = meta
     self.fields = list(fields)
     self.instances = WeakCollection()
     # Each set of linked subfields means that those subfields are linked and share the same instance
     self.links = DisjointSets()
Пример #2
0
class Class(object):
    def __init__(self, meta=None, fields=tuple()):
        if meta is None:
            meta = {}
        self.meta = meta
        self.fields = list(fields)
        self.instances = WeakCollection()
        # Each set of linked subfields means that those subfields are linked and share the same instance
        self.links = DisjointSets()
        
    def __repr__(self):
        return '<%s, meta=%r, fields=%r>' % (self.__class__.__name__, self.meta, len(self.fields))

    def add_field(self, field):
        self.fields.append(field)
        for instance in self.instances:
            instance.new_field(field)
        
    def create_instance(self, **kw):
        instance = Instance(self, **kw)
        self.instances.add(instance)
        return instance

    def union(self, src_subfield_hierarchy, dst_subfield_hierarchy):
        src_subfield_hierarchy = tuple(src_subfield_hierarchy)
        dst_subfield_hierarchy = tuple(dst_subfield_hierarchy)
        self.links.union(src_subfield_hierarchy, dst_subfield_hierarchy)
        assert dst_subfield_hierarchy in self.links.set_of(src_subfield_hierarchy)
        assert src_subfield_hierarchy in self.links.set_of(dst_subfield_hierarchy)
        
        for instance in self.instances:
            # Find the subfield's_instance for this instance (extract the instance from the deepest level)
            src_subfield_instance = instance.get_subfield_instance(src_subfield_hierarchy, False)
            
            # Tell the instance that the subfield has changed, it will update all internally linked fields to point
            # to the new instance.
            instance.subfield_linked(src_subfield_hierarchy, src_subfield_instance)

    def split(self, subfield_hierarchy):
        self.links.split(subfield_hierarchy)
        for instance in self.instances:
            instance.subfield_unlinked(subfield_hierarchy)