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