def __init__(self, default_dir=expanduser('~')):
        '''

        Creates a new Filesystem object.


        Takes 1 argument:

        default_dir - The default directory to start in. Set to the users home directory if no value is provided.

        '''

        self.os_instance = Os()

        self.os = self.os_instance.get_os()

        self.homedir = expanduser('~')

        if default_dir is None:
            default_dir = expanduser('~')

        self.working_dir = default_dir
class Filesystem():

    '''

    A simple helper module for making folders and files.

    '''

    def __init__(self, default_dir=expanduser('~')):
        '''

        Creates a new Filesystem object.


        Takes 1 argument:

        default_dir - The default directory to start in. Set to the users home directory if no value is provided.

        '''

        self.os_instance = Os()

        self.os = self.os_instance.get_os()

        self.homedir = expanduser('~')

        if default_dir is None:
            default_dir = expanduser('~')

        self.working_dir = default_dir

    def get_home_dir(self):
        '''

        Returns your home directory.

        '''

        return self.homedir

    def pwd(self):
        '''

        Returns the users current working directory.

        '''

        return self.working_dir

    def get_dir_items(self, directory=None):
        '''

        Returns list of items in a directory, showing hidden folders.


        Takes 1 argument:

        directory - The directory from which to get the directory items. If no directory is provided it is set to the users current working directory.

        '''

        item_list = []

        if directory is None:
            directory = self.pwd()

        for item in os.listdir(directory):
            item_list.append(item)

        return item_list

    def change_directory(self, directory=None, pathtype='absolute'):
        '''

        Changes the users directory. Returns the new directory.


        Takes 2 arguments:

        directory - The directory to change to.
        pathtype - The type of path. Can be either 'absolute' or 'relative'. 'abs' and 'rel' work too.

        '''

        if directory is None:
            directory = self.working_dir

        if pathtype.startswith('abs'):
            os.chdir(directory)
        elif pathtype.startswith('rel'):
            os.chdir(os.path.join(self.working_dir, directory))

        self.working_dir = os.getcwd()

        return self.working_dir

    def make_dir(self, folder_name, folder_path=None, pathtype='abs'):
        '''

        Creates a directory. Returns True if the directory already exists, returns the directory otherwise.


        Takes 3 arguments:

        folder_name - The name of the directory that you wish to create. Value must be provided.
        folder_path - The path to the directory that you wish to create. If no value is provided it is defaulted to the current working directory.
        pathtype - The type of path. Can be either 'abs' or 'rel'. If no value is provided it is defaulted to 'abs'.

        '''

        if folder_path is None and pathtype.startswith('rel'):
            folder_path = self.working_dir

        if folder_name is None:
            return

        if pathtype.startswith('abs'):
            if os.path.exists(os.path.join(folder_path, folder_name)):
                return True
            elif not os.path.exists(os.path.join(folder_path, folder_name)):
                os.makedirs(os.path.join(folder_path, folder_name))

                return folder_path
        elif pathtype.startswith('rel'):
            if os.path.exists(os.path.join(self.working_dir, folder_name)):
                return True
            elif not os.path.exists(os.path.join(self.working_dir, os.path.join(folder_path, folder_name))):
                os.makedirs(
                    os.path.join(self.working_dir, os.path.join(folder_path, folder_name)))

                return os.path.join(self.working_dir, folder_path)

    def remove_dir(self, folder_name, folder_path=None, pathtype='abs'):
        '''

        Removes a specified folder at a specified directory. Note that this also removes all subdirectories and files in that directory. Returns True if the file is successfully removed, False otherwise.

        Takes 3 arguments:

        folder_name - Name of the folder that you wish to remove. This value cannot be blank.
        folder_path - Path to the folder that you wish to remove. If no value is passed this is defaulted to the current working directory.
        pathtype - The type of path. This can either be 'abs' or 'rel'.

        '''

        if folder_path is None and pathtype.startswith('rel'):
            folder_path = self.working_dir

        if folder_name is None:
            print "Sorry! A value must be provided for a directory name.\n\n"

            return

        if pathtype.startswith('abs'):
            if os.path.exists(os.path.join(folder_path, folder_name)):
                shutil.rmtree(os.path.join(folder_path, folder_name))
            elif not os.path.exists(os.path.join(folder_path, folder_name)):
                return False
        elif pathtype.startswith('rel'):
            if os.path.exists(os.path.join(self.working_dir, folder_name)):
                shutil.rmtree(os.path.join(self.working_dir, folder_name))
            elif not os.path.exists(os.path.join(self.working_dir, folder_name)):
                return False

    def dir_exists(self, folder_name, folder_path=None, pathtype='abs'):
        '''

        Checks if a file exists. Returns True if the directory name specified at the directory path exists, False otherwise.


        Takes 3 arguments:

        folder_name - The name of the folder. This cannot be blank.
        folder_path - The path to the folder. If left blank this is defaulted to the current working directory.
        pathtype - The type of path. This can be 'abs' or 'rel'.

        '''

        if folder_path is None and pathtype.startswith('rel'):
            folder_path = self.working_dir

        if folder_name is None:
            print "Sorry! A value must be provided for a directory name.\n\n"

            return

        if pathtype.startswith('abs'):
            if os.path.exists(os.path.join(folder_path, folder_name)):
                return True
            elif not os.path.exists(os.path.join(folder_path, folder_name)):
                return False
        elif pathtype.startswith('rel'):
            if os.path.exists(os.path.join(self.working_dir, folder_name)):
                return True
            elif not os.path.join(os.path.join(self.working_dir, folder_name)):
                return False

    def make_file(self, file_name, file_path, pathtype='abs', filemode='r+'):
        '''

        Creates a new file with the specified name and path. Returns a new file object.


        Takes 4 arguments:

        file_name - Name of the file to create. This cannot be blank.
        file_path - Path to the file to create. If left blank it is defaulted to the current working directory.
        pathtype - Type of path. Can be either 'abs' or 'rel'.
        filemode - Mode to open the file.

        '''

        if file_name is None:
            print "Sorry! A value must be provided for a file name.\n\n"

            return

        if file_path is None and pathtype.startswith('rel'):
            file_path = self.working_dir

        if pathtype.startswith('abs'):
            if not os.path.exists(os.path.join(file_path, file_name)):
                f = open(os.path.join(file_path, file_name), 'a+')

                f.close()

                f = open(os.path.join(file_path, file_name), filemode)

                f.close()

                return f
            else:
                f = open(os.path.join(file_path, file_name), filemode)

                return f
        elif pathtype.startswith('rel'):
            if not os.path.exists(os.path.join(file_path, file_name)):
                f = open(os.path.join(file_path, file_name), 'a+')

                f.close()

                f = open(os.path.join(file_path, file_name), filemode)

                f.close()

                return f
            else:
                f = open(os.path.join(file_path, file_name), filemode)

                return f

    def read_file(self, file_name, file_object=None, file_path=None, pathtype='abs'):
        '''

        Reads a file. Returns contents of the file, False otherwise.


        Takes 4 arguments:

        file_name - Name of the file to read from. This feild is required.
        file_object - File object to read from. If blank this is defaulted to None, and instead creates a file based on the information provided (filename and filepath)
        file_path - Path to the file to create. If blank this is defaulted to the current working directory.
        pathtype - Type of path. Can be 'abs' or 'rel'.

        '''

        if file_name is None and file_object is None:
            print "Sorry! A value must be provided.\n\n"

            return

        if file_name is None:
            print "Sorry! A value must be provided."

            return

        if file_path is None and pathtype.startswith('rel'):
            file_path = self.working_dir

        if file_object is None:
            if pathtype.startswith('abs'):
                f = open(os.path.join(file_path, file_name), 'r')

                print type(f)

                return f.read()
            elif pathtype.startswith('rel'):
                f = open(os.path.join(self.working_dir, filename), 'r')

                return f.read()
        elif file_object is not None:
            return file_object.read()

    def write_file(self, file_name, file_object=None, file_path=None, pathtype='abs', text_to_write='Hello World'):
        '''

        Writes to a file. Returns True if file is successfully written to, False otherwise.


        Takes 5 arguments:

        file_name - The name of the file to write to. A value must be provided for this.
        file_object - An optional parameter that is a file object to write to. A value is not needed if a value is provided for file_name.
        file_path - Path to the file to write to. If blank it is defaulted to the current working directory.
        pathtype - Type of path. Can be 'abs' or 'rel'.
        text_to_write - Text to write to file. If blank is defaulted to 'Hello World!'.

        '''

        if file_name is None and file_object is None:
            print "Sorry! A value must be provided.\n\n"

            return

        if file_name is None:
            print "Sorry! A value must be provided.\n\n"

        if file_path is None and pathtype.startswith('rel'):
            file_path = self.working_dir

        if file_object is None:
            if pathtype.startswith('abs'):
                f = open(os.path.join(file_path, file_name), 'w')

                f.write(text_to_write)

                return True
            elif pathtype.startswith('rel'):
                f = open(os.path.join(file_path, file_name), 'r')

                f.write(text_to_write)

                return True
            else:
                return False
        elif file_object is not None:
            file_object.write(text_to_write)

            return True

    def change_file_mode(self, file_object, filemode):
        '''
        Recreates the file by closing the file_object passed in and opening it again with the new file mode. Returns the new file object.


        Takes 2 arguments:

        file_object - The file object you wish to change the mode of. Cannot be left blank.
        filemode - The new mode to change the file to. Cannot be left blank.

        '''

        if file_object is None:
            print "Sorry! A value must be provided."

            return

        if filemode is None:
            print "Sorry! A value must be provided."

            return

        file_object.close()

        f = open(file_object.name, filemode)

        return f

    def delete_file(self, file_name, file_object=None, file_path=None, pathtype='abs'):
        '''

        Deletes a file. Returns True if the file is successfully deleted, False otherwise.


        Takes 4 arguments:

        file_name - Name of the file you wish to delete. This value cannot be blank.
        file_object - A file object to delete. If blank then it is ignored.
        file_path - Path to the file you wish to delete. If this is blank it is defaulted to the current working directory.
        pathtype - Type of path. Can be either 'abs' or 'rel'.
    
        '''

        if file_name is None and file_object is None:
            print "Sorry! A value must be provided."

            return

        if file_path is None and pathtype.startswith('rel'):
            file_path = self.working_dir

        if file_object is None:
            if pathtype.startswith('abs'):
                if os.path.exists(os.path.join(file_path, file_name)):
                    os.remove(os.path.join(file_path, file_name))

                    return True
                else:
                    return False

            elif pathtype.startswith('rel'):
                if os.path.exists(os.path.join(file_path, file_name)):
                    os.remove(os.path.join(file_path, file_name))

                    return True
                else:
                    return False
        elif file_object is not None:
            os.remove(file_object.name)

    def file_exists(self, file_name, file_path=None, pathtype='abs'):
        '''

        Checks if a file exists. Returns True if file exists, False otherwise.


        Takes 3 arguments:

        file_name - Name of the file to check. Cannot be left blank.
        file_path - Path to the file to check. If left blank is defaulted to the current working directory.
        pathtype - Type of path. Can be either 'rel' or 'abs'.

        '''

        if file_name is None:
            print "Sorry! A value must be provided."

            return

        if file_path is None and pathtype.startswith('rel'):
            file_path = self.working_dir

        return True if os.path.exists(os.path.join(file_path, file_name)) else False

    def get_file_extension(self, file_name, file_path=None, file_object=None, pathtype='abs'):
        '''

        Gets a file extension. Returns the file extension.


        Takes 4 arguments:

        file_name - Name of the file. This cannot be left blank.
        file_path - Path to the file. If blank this is defaulted to the users current working directory.
        file_object - Optional parameter of a file object.
        pathtype - Type of path. Can be either 'abs' or 'rel'.

        '''

        if file_name is None and file_object is None:
            print "Sorry! A value must be provided."

            return

        if file_path is None and pathtype.startswith('rel'):
            file_path = self.working_dir

        if file_object is None:
            extension = os.path.splitext(os.path.join(file_path, file_name))[1]

            return extension
        elif file_object is not None:
            extension = os.path.splitext(file_object.name)[1]

            return extension