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

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