entitylist.py

Go to the documentation of this file.
00001 from silme.core.entity import EntityList, Entity
00002 
00003 def intersect(a, b):
00004     """ returns what's in both a and b """
00005     return list(set(a) & set(b))
00006 
00007 def difference(a, b):
00008     """ returns what's in b and not in a """
00009     return list(set(b).difference(set(a))) 
00010 
00011 class EntityListDiff(dict):
00012     def __init__(self):
00013         self.id = None
00014         self.uri = None
00015 
00016     def empty(self):
00017         return not bool(len(self))
00018 
00019     # pos - may be a number or a tuple ('after','id') or ('before','id')
00020     def add(self, flag, entity, id, pos=None):
00021         self[id] = {'elem': entity, 'flags': [flag], 'pos':pos}
00022 
00023     def remove(self, id):
00024         if id in self:
00025             del self[id]
00026 
00027     def get_entity(self, id):
00028         try:
00029             return self[id]['elem']
00030         except KeyError:
00031             raise KeyError('No such id: '+id)
00032 
00033     def get_entities(self, type='all'):
00034         entities = {}
00035         for item in self.values():
00036             if type=='all' or type in item['flags']:
00037                 if isinstance(item['elem'], Entity):
00038                     item['elem'].params['diff_flags'] = item['flags']
00039                 entities[item['elem'].id] = item['elem']
00040         return entities
00041 
00042 def entitylist_diff (self, entitylist, flags=None, values=True):
00043     if flags == None:
00044         flags = ['added','removed','modified']
00045     entitylistdiff = EntityListDiff()
00046     entitylistdiff.id = self.id
00047     entitylistdiff.uri = (self.uri, entitylist.uri)
00048     entities1 = self.get_entity_ids()
00049     entities2 = entitylist.get_entity_ids()
00050 
00051     isect = intersect(entities1, entities2)
00052     if 'removed' in flags:
00053         for item in difference(isect, entities1):
00054             entitylistdiff.add('removed', id=item, entity=self[item])
00055     if 'added' in flags:
00056         for item in difference(isect, entities2):
00057             entitylistdiff.add('added', id=item, entity=entitylist[item])
00058 
00059     if ('modified' in flags and values is True) or ('unmodified' in flags):
00060         for item in isect:
00061             if values is False:
00062                 entitylistdiff.add('unmodified', id=item, entity=self[item])
00063             else:
00064                 entity = self[item]
00065                 entity2 = entitylist[item]
00066                 entitydiff = entity.diff(entity2)
00067                 if entitydiff.empty():
00068                     if 'unmodified' in flags:
00069                         entitylistdiff.add('unmodified', id=item, entity=entity)
00070                 else:
00071                     if 'modified' in flags:
00072                         entitylistdiff.add('modified', id=item, entity=entitydiff)
00073     return entitylistdiff
00074 
00075 EntityList.diff = entitylist_diff
00076 
00077 def entitylist_apply_diff (self, entitylistdiff):
00078     for key, item in entitylistdiff.items():
00079         if 'removed' in item['flags']:
00080             self.remove_entity(key)
00081         elif 'modified' in item['flags']:
00082             self.get_entity(key).apply_diff(item['elem'])
00083         elif 'added' in item['flags']:
00084             if isinstance(item['elem'], tuple):
00085                 self.add_entity(item['elem'][0], pos=item['elem'][1])
00086             else:
00087                 self.add_entity(item['elem'])
00088 
00089 EntityList.apply_diff = entitylist_apply_diff

Generated on Tue May 12 17:37:27 2009 for silme by  doxygen 1.5.8