00001 from silme.core import L10nPackage, L10nObject, Comment, EntityList, Entity
00002 from silme.diff import L10nObjectDiff, EntityListDiff, BlobDiff
00003
00004 import os
00005
00006 class TextSerializer():
00007 @classmethod
00008 def serialize(cls, element, fallback=None):
00009 if isinstance(element, L10nPackage):
00010 return cls.dump_l10npackage(element)
00011 else:
00012 return cls.dump_l10nobject(element)
00013
00014 @classmethod
00015 def dump_entity (cls, entity, indent=0):
00016 string = (u' '*indent)+u'Entity(id:'+entity.id+u', value:"'+entity.value+u'")\n'
00017 return string
00018
00019 @classmethod
00020 def dump_comment (cls, comment, indent=0):
00021 string = (u' '*indent)+u'Comment(\n'
00022 for element in comment:
00023 string += cls.dump_element(element, indent+1)
00024 string += (u' '*indent)+u')\n'
00025 return string
00026
00027 @classmethod
00028 def dump_string(cls, unicode, indent=0):
00029 return (u' '*indent)+u"String(\""+unicode.replace('\n',"\\n")+"\")\n"
00030
00031 @classmethod
00032 def dump_element(cls, element, indent=0):
00033 if isinstance(element, Entity):
00034 return cls.dump_entity(element, indent)
00035 elif isinstance(element, Comment):
00036 return cls.dump_comment(element, indent)
00037 elif isinstance(element, unicode) or isinstance(element, str):
00038 return cls.dump_string(element, indent)
00039 else:
00040 return element
00041
00042 @classmethod
00043 def dump_l10nobject (cls, l10nobject, indent=0, content=True):
00044 string = (u' '*indent)+u"== L10nObject: " + unicode(l10nobject.id) + u" ==\n"
00045 if content == True:
00046 for element in l10nobject:
00047 string += cls.dump_element(element, indent+1)
00048 return string
00049
00050 @classmethod
00051 def dump_entitylist (cls, elist, indent=0, content=True):
00052 string = (u' '*indent)+u"== EntityList: " + unicode(elist.id) + u" ==\n"
00053 if content == True:
00054 for entity in elist.values():
00055 string += cls.dump_entity(entity, indent+1)
00056 return string
00057
00058 @classmethod
00059 def dump_blob (cls, blob, indent=0):
00060 string = (u' '*indent)+'Blob: ' + blob.id + "\n"
00061 return string
00062
00063 @classmethod
00064 def dump_l10npackage (cls, l10npack, indent=0, content=True):
00065 string = u''
00066 string += (u' '*indent)+u'=== L10nPackage: ' + l10npack.id + u' ===\n'
00067 for key, package in l10npack.packages.items():
00068 string += cls.dump_l10npackage(package, indent+1, content)
00069 for key, object in l10npack.objects.items():
00070 if isinstance(object, L10nObject):
00071 string += cls.dump_l10nobject(object, indent+1, content)
00072 elif isinstance(object, EntityList):
00073 string += cls.dump_entitylist(object, indent+1, content)
00074 else:
00075 string += cls.dump_blob(object, indent+1)
00076 return string
00077
00078
00079
00080 @classmethod
00081 def dump_objectdiff (cls, objectdiff, indent=0):
00082 string = u''
00083 if objectdiff.diff:
00084 string += u' '*indent + 'object modified\n'
00085 else:
00086 string += u' '*indent + 'object not modified\n'
00087 return string
00088
00089 @classmethod
00090 def dump_entitylistdiff (cls, entitylistdiff, indent=0):
00091 string = u''
00092 added = entitylistdiff.get_entities('added')
00093 if len(added):
00094 string += u' '*indent + u'added entites:\n'
00095 for entity in added.values():
00096 string += u' '*(indent+1) + entity.id + u'\n'
00097 removed = entitylistdiff.get_entities('removed')
00098 if len(removed):
00099 string += u' '*indent + u'removed entities:\n'
00100 for entity in removed.values():
00101 string += u' '*(indent+1) + entity.id + u'\n'
00102 modified = entitylistdiff.get_entities('modified')
00103 if len(modified):
00104 string += u' '*indent + u'modified entities:\n'
00105 for entitydiff in modified.values():
00106 string += u' '*(indent+1) + entitydiff.id + u"(value '"+entitydiff.get_value()[0]+u"' -> '"+entitydiff.get_value()[1]+u"')\n"
00107 return string
00108
00109 @classmethod
00110 def dump_l10nobjectdiff (cls, l10nobjectdiff, indent=0):
00111 return cls.dump_entitylistdiff(l10nobjectdiff.get_entitylistdiff(), indent=indent)
00112
00113 @classmethod
00114 def dump_l10npackagediff (cls, l10npackagediff, indent=0):
00115 string = u''
00116 added = l10npackagediff.get_objects('added')
00117 if len(added):
00118 string += u' '*indent + u'\033[1mnew in the latter package:\033[0m\n'
00119 for object in added:
00120 string += u' '*(indent+1) + os.path.join('.', object.id) + u'\n'
00121 removed = l10npackagediff.get_objects('removed')
00122 if len(removed):
00123 string += u' '*indent + u'\033[1mremoved in the latter package:\033[0m\n'
00124 for object in removed:
00125 string += u' '*(indent+1) + os.path.join('.', object.id) + u'\n'
00126 modified = l10npackagediff.get_objects('modified')
00127 if len(modified):
00128 string += u' '*indent + u'\033[1mmodified in the latter package:\033[0m\n'
00129 for object in modified:
00130 string += u' '*(indent+1) + os.path.join('.', object.id) + u'\n'
00131 if isinstance(object, L10nObjectDiff):
00132 string += cls.dump_l10nobjectdiff(l10npackagediff.objects[object.id]['object'], indent+2)
00133 elif isinstance(object, EntityListDiff):
00134 string += cls.dump_entitylistdiff(l10npackagediff.objects[object.id]['object'], indent+2)
00135 elif isinstance(object, BlobDiff):
00136 string += cls.dump_objectdiff(l10npackagediff.objects[object.id]['object'], indent+2)
00137
00138 added = l10npackagediff.get_packages('added')
00139 if len(added):
00140 string += u' '*indent + u'\033[1mnew in the latter package:\033[0m\n'
00141 for package in added:
00142 string += u' '*(indent+1) + os.path.join('.',package.id) + u'\n'
00143 removed = l10npackagediff.get_packages('removed')
00144 if len(removed):
00145 string += u' '*indent + '\033[1mremoved from latter package:\033[0m\n'
00146 for package in removed:
00147 string += u' '*(indent+1) + os.path.join('.',package.id) + u'\n'
00148 modified = l10npackagediff.get_packages('modified')
00149 if len(modified):
00150 string += u' '*indent + u'\033[1mmodified in the latter package:\033[0m\n'
00151 for package in modified:
00152 string += u' '*(indent+1) + os.path.join('.',package.id) + u'\n'
00153 string += cls.dump_l10npackagediff(l10npackagediff.packages[package.id]['package'], indent+2)
00154 if not len(string):
00155 string += u'\nThe packages are identical'
00156 return string