# -*- coding: utf-8 -*- import StringIO import hashlib import os import os.path import zlib class Object : ## # Save the object on the disk. def save( self ) : header = "author " + self.author + "\n" header += "parent " + self.parent + "\n" header += "#\n" #end of header store = header + self.content # if object was never stored, it doesn't have a name attribute # so we hash it contents name = getattr( self, "name", hashlib.sha1( store ).hexdigest() ) path = name[:2] + '/' + name[2:] if ( not os.path.exists( name[:2] ) ) : os.mkdir( name[:2] ) if ( not os.path.exists( path ) ) : os.mkdir( path ) file = open( path + "/object", 'w' ) file.write( zlib.compress( store ) ) file.close() return name ## # Class constructor. # If a name is provided, try to load the object from the disk def __init__( self, name = None ) : if ( name != None ) : path = name[:2] + '/' + name[2:] + '/object' if ( os.path.exists( path ) ) : file = open( name[:2] + '/' + name[2:] + '/object','r') contentStream = StringIO.StringIO( zlib.decompress( file.read() ) ) for line in contentStream : if ( line == "#\n") : self.content = contentStream.read() break key, sep, value = line.rstrip('\n').partition(' ') setattr(self, key, value) def appendTo(self) : pass def appendChild(self) : pass if __name__== '__main__' : x = Object() x.parent = "test parent" x.author = "test author" x.content = "test content" name = x.save() y = Object(name) print y.author print y.parent print y.content