def generate_tasks(name, gen_result, gen_doc=None): """Create tasks from a task generator result. @param name: (string) name of taskgen function @param gen_result: value returned by a task generator function @param gen_doc: (string/None) docstring from the task generator function @return: (tuple) task,list of subtasks """ # task described as a dictionary if isinstance(gen_result, dict): if 'name' in gen_result: raise InvalidTask("Task %s. Only subtasks use field name."%name) gen_result['name'] = name # Use task generator docstring # if no doc present in task dict if not 'doc' in gen_result: gen_result['doc'] = gen_doc return [dict_to_task(gen_result)] # a generator if isgenerator(gen_result): group_task = Task(name, None, doc=gen_doc) tasks = [group_task] # the generator return subtasks as dictionaries . for task_dict in gen_result: # check valid input if not isinstance(task_dict, dict): raise InvalidTask("Task %s must yield dictionaries"% name) if 'name' not in task_dict: raise InvalidTask("Task %s must contain field name. %s"% (name,task_dict)) # name is task.subtask task_dict['name'] = "%s:%s"% (name, task_dict.get('name')) sub_task = dict_to_task(task_dict) sub_task.is_subtask = True tasks.append(sub_task) # add task dependencies to group task. group_task.task_dep = [task.name for task in tasks[1:]] return tasks raise InvalidTask("Task %s. Must return a dictionary. got %s" % (name, type(gen_result)))