# -*- coding: utf-8 -*- import StringIO import hashlib import os import os.path import zlib import datetime class Object : ## # Save the object on the disk. def save( self ) : header = "author " + self.author + "\n" header += "parent " + self.parent + "\n" header += "created " + self.created + "\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 if not hasattr( self, "name" ) : self.name = hashlib.sha1( store ).hexdigest() path = self.name[:2] + '/' + self.name[2:] if ( not os.path.exists( self.name[:2] ) ) : os.mkdir( self.name[:2] ) if ( not os.path.exists( path ) ) : os.mkdir( path ) file = open( path + "/object", 'w' ) file.write( zlib.compress( store ) ) file.close() return self.name ## # Class constructor. def __init__( self, author = None, parent = None, content = None ) : self.author = str(author) self.parent = str(parent) self.created = str( datetime.datetime.now() ) self.content = str(content) self.name = hashlib.sha1( self.author + self.parent + self.created ).hexdigest() ## # Create an object from a file object # @param name The name of the object to load @staticmethod def load( name ) : result = Object() 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") : result.content = contentStream.read() break key, sep, value = line.rstrip('\n').partition(' ') setattr(result, key, value) return result def appendTo(self) : pass def appendChild(self, child) : if not hasattr(self, "name") : pass if child.parent != self.name : pass if ( not os.path.exists( self.name[:2] ) ) : os.mkdir( self.name[:2] ) if ( not os.path.exists( path ) ) : os.mkdir( path ) file = open( path + "/childs", 'w+' ) file.write( child.name ) file.close() if __name__== '__main__' : x = Object("test parent", "test author") name = x.save() y = Object.load(name) print y.author print y.parent print y.content print y.created