entity.py
Go to the documentation of this file.00001 from silme.core.entity import Entity
00002
00003 class EntityDiff(dict):
00004
00005 def __init__(self, id=None):
00006 self.id = id
00007 self.params = {}
00008
00009 def add_hunk(self, type, hunk):
00010 """
00011 adds a hunk to EntityDiff.
00012 predefines types are: id, value
00013
00014 hunk should be a tuple (oldval,newval) or an object that
00015 represents the diff
00016 """
00017 self[type] = hunk
00018
00019 def get_hunk(self, type):
00020 return self[type]
00021
00022 def remove_hunk(self, type):
00023 del self[type]
00024
00025 def empty(self):
00026 return not bool(self)
00027
00028 def add_value(self, value_old, value_new, code='default'):
00029 try:
00030 self['value'][code] = (value_old, value_new)
00031 except:
00032 self['value'] = {code: (value_old, value_new)}
00033
00034 def get_value(self, code='default'):
00035 return self['value'][code]
00036
00037 def entity_diff (self, entity=None, code=None, struct=False):
00038 entitydiff = EntityDiff()
00039 entitydiff.id = self.id
00040 if code is None:
00041 code = self.default_code
00042 value1 = self.get_value(fallback=code)
00043 value2 = entity.get_value(fallback=code)
00044 if value1 != value2:
00045 entitydiff.add_value(value1, value2, code)
00046 if struct == True and self.params.has_key('source') and self.params['source']['type'] == entity.params['source']['type']:
00047 struct1 = self.params['source']['string'][0:self.params['source']['valpos']]+self.params['source']['string'][self.params['source']['valpos']+len(value1):]
00048 struct2 = entity.params['source']['string'][0:entity.params['source']['valpos']]+entity.params['source']['string'][entity.params['source']['valpos']+len(value2):]
00049 if struct1 != struct2:
00050 entitydiff.add_hunk('struct', ((struct1, self.params['source']['valpos']), (struct2, entity.params['source']['valpos'])))
00051 return entitydiff
00052
00053 Entity.diff = entity_diff
00054
00055 def entity_apply_diff(self, entitydiff):
00056 if entitydiff.has_key('value'):
00057 for key, value in entitydiff['value'].items():
00058 if self.value.has_key(key):
00059 self.value[key] = value[1]
00060 if entitydiff.has_key('struct'):
00061 struct = entitydiff.getHunk('struct')[1]
00062 valpos = struct[1]
00063 self.params['source']['string'] = struct[0][0:valpos]+self.get_value()+struct[0][valpos:]
00064
00065 Entity.apply_diff = entity_apply_diff