Imports all python modules in specified directories and returns subclasses of BaseTask from them

        :param propagate_exceptions: a flag that indicates if exceptions from single file import shall be raised during the
            whole directory lookup
        :param dir_path: fully qualified directory path, where all python modules will be search for subclasses of BaseTask
        :type dir_path: `str`
        :return: a dict of CustomTasks, where key is CustomTask.name, and value is a CustomClass task itself
        :rtype: `dict`

def load_tasks_from_dir(self, dir_path, propagate_exceptions=False):
        """ Imports all python modules in specified directories and returns subclasses of BaseTask from them

        :param propagate_exceptions: a flag that indicates if exceptions from single file import shall be raised during the
            whole directory lookup
        :param dir_path: fully qualified directory path, where all python modules will be search for subclasses of BaseTask
        :type dir_path: `str`
        :return: a dict of CustomTasks, where key is CustomTask.name, and value is a CustomClass task itself
        :rtype: `dict`
        """
        if not os.path.exists(dir_path):
            raise GOSTaskException()
        if os.path.isfile(dir_path):
            raise GOSTaskException()
        result = {}
        for file_basename in os.listdir(dir_path):
            full_file_path = os.path.join(dir_path, file_basename)
            try:
                result.update(self.load_tasks_from_file(full_file_path))
            except (GOSTaskException, GOSIOException):
                if propagate_exceptions:
                    raise
        return result