From ce8d9e79c46aec2b7c2f67824a08e6456b071240 Mon Sep 17 00:00:00 2001 From: lalo73 Date: Sun, 6 Jan 2013 16:31:37 -0300 Subject: [PATCH] Added fileSystem module. Needed: Test of fileSystem --- .idea/misc.xml | 3 + cosas_para_lalinhox | 22 ++++++ cosas_para_lalinhox~ | 10 +++ hardware/fileSystem.py | 137 ++++++++++++++++++++++++++++++++---- system_tools/__init__.py | 1 + system_tools/systemTools.py | 24 +++++++ 6 files changed, 185 insertions(+), 12 deletions(-) create mode 100644 cosas_para_lalinhox create mode 100644 cosas_para_lalinhox~ create mode 100644 system_tools/__init__.py create mode 100644 system_tools/systemTools.py diff --git a/.idea/misc.xml b/.idea/misc.xml index a5a06bf..141ce6d 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,8 @@ + + $APPLICATION_HOME_DIR$/lib/pycharm.jar!/resources/html5-schema/html5.rnc + diff --git a/cosas_para_lalinhox b/cosas_para_lalinhox new file mode 100644 index 0000000..0f7775e --- /dev/null +++ b/cosas_para_lalinhox @@ -0,0 +1,22 @@ +from hardware.fileSystem import * + +root = RootDirectory() + +file_1 = File("file_1","data of file 1") +file_2 = File("file_2",1024) +file_3 = File("file_3") + +dir_1 = Directory("dir_1",root) +dir_2 = Directory("dir_2") + +dir_1.addObject(file_1) +dir_1.addObject(file_2) +dir_1.addObject(dir_2) +root.addObject(dir_1) + +dir_2.addObject(file_3) + +disk = HardDisk() +disk.root = root + +disk.getObjectByPath("dir_1/dir_2/") \ No newline at end of file diff --git a/cosas_para_lalinhox~ b/cosas_para_lalinhox~ new file mode 100644 index 0000000..4741dee --- /dev/null +++ b/cosas_para_lalinhox~ @@ -0,0 +1,10 @@ +from hardware.fileSystem import * + +file_1 = File("File_1","Data of file 1") +file_2 = File("File_1",1024) +file_3 = File("File_3") + +dir_1 = Directory("Dir_1") +dir_2 = Directory("Dir_2") + + diff --git a/hardware/fileSystem.py b/hardware/fileSystem.py index 480b250..2336aaa 100644 --- a/hardware/fileSystem.py +++ b/hardware/fileSystem.py @@ -1,27 +1,140 @@ __author__ = 'leandro' +from system_tools.systemTools import checkFileSystemObjectName, checkPathFormat class HardDisk: - def __init__(self): - pass + def __init__(self, name="HardDisk"): + self.name = name + self.root = RootDirectory() + + def getObjectByPath(self, path): + checkPathFormat(path) + split_path = path.split("/") + return self.__getObjectBySplitPath(split_path) + + def __getObjectBySplitPath(self, split_path): + last_object = self.root + size = len(split_path) + for object_name in split_path: + isDirectory = size > 1 + last_object = self.__nextObjectFrom(object_name, last_object, isDirectory) + size -= 1 + + return last_object + + def __nextObjectFrom(self, object_name, last_object, isDirectory): + if object_name == "": + return last_object + elif isDirectory: + return last_object.getDirectory(object_name) + else: + return last_object.getFile(object_name) + + +class GeneralFileSystemObject(object): + def __unicode__(self): + return u"%(name)s" % {"name": self.name} + + def __str__(self): + return "%(name)s" % {"name": self.name} + def __repr__(self): + return "%(name)s" % {"name": self.name} -class GeneralFileSystemObject: - def __init__(self,name): + def __init__(self, name): + checkFileSystemObjectName(name) self.name = name + def addObject(self, object): + raise IsNotDirectory() + + def getDirectory(self, name): + raise IsNotDirectory() + + def getFile(self, name): + raise IsNotDirectory() + + def isDirectory(self): + return False + + def getData(self): + raise IsNotFile() + + def include(self, object_name): + raise IsNotDirectory() + + def father(self): + raise IsNotDirectory() + + +class File(GeneralFileSystemObject): + def __init__(self, name, data=None): + super(File, self).__init__(name) + self.data = data + + def getData(self): + return self.data + + class Directory(GeneralFileSystemObject): - def __init__(self,name): - super(Directory,self).__init__(name) - self.filesAndDirectories = {} + def __init__(self, name, father=None): + super(Directory, self).__init__(name) + self.__father = father + self.objects = {} + + def father(self): + return self.__father + + def isDirectory(self): + return True + + def addObject(self, object): + name = object.name + if object.isDirectory(): + name += "/" + object.father = self + self.objects[name] = object + + def getDirectory(self, name): + return self.__getObjectByType(name, True) + + def getFile(self, name): + return self.__getObjectByType(name, False) - def addFile(self,file,path=""): - pass + def includes(self, object_name): + return object_name in self.objects.keys() + def __getObjectByType(self, name, directory=True): + def nameMatch(name, local_object_name, directory): + local_name = name + if directory: + local_name = name + "/" + return local_name == local_object_name + + for local_object_name in self.objects: + if nameMatch(name, local_object_name, directory): + object = self.objects[local_object_name] + return object + + raise CantFindDirectoryOrFile() + + +class RootDirectory(Directory): + def __init__(self, name="root"): + super(RootDirectory, self).__init__(name, self) #Exceptions -class CantFindDirectory(Exception): - def __init__(self): - super(CantFindDirectory,self).__init__() +class CantFindDirectoryOrFile(Exception): + def __str__(self): + return "Can't find directory or file" + + +class IsNotDirectory(Exception): + def __str__(self): + return "This is not a directory" + +class IsNotFile(Exception): + def __str__(self): + return "This is not a file" diff --git a/system_tools/__init__.py b/system_tools/__init__.py new file mode 100644 index 0000000..0c72454 --- /dev/null +++ b/system_tools/__init__.py @@ -0,0 +1 @@ +__author__ = 'leandro' diff --git a/system_tools/systemTools.py b/system_tools/systemTools.py new file mode 100644 index 0000000..6f3c1aa --- /dev/null +++ b/system_tools/systemTools.py @@ -0,0 +1,24 @@ +__author__ = 'leandro' + +def checkFileSystemObjectName(name): + if "/" in name: + raise BadNameFormat("/") + +def checkPathFormat(path): + if " " in path: + raise BadPatFormat() + +#Exceptions +class BadNameFormat(Exception): + def __init__(self, invalid=""): + self.invalid_character = invalid + + def __str__(self): + return "invalid character '%(invalid)s' in name" % {"invalid": self.invalid_character} + +class BadPatFormat(Exception): + def __init__(self,invalid=""): + self.invalid_character = invalid + + def __str__(self): + return "invalid character '%(invalid)s' in name" % {"invalid": self.invalid_character} \ No newline at end of file