def validate(self): """ Validate the current workflow template. At that point, we already know the underlying DAG is valid. This method ensures there's a single root task and all task names are registered tasks. If not valid, this method should raise either `WorkflowRootTaskError` or `UnknownTaskName` exceptions. """ root_nodes = len(self.dag.root_nodes()) if root_nodes != 1: raise WorkflowRootTaskError(root_nodes) for task in self.tasks: TaskRegistry.get(task.name) return True
def test_register_basic_class(self): """ A class that does not inherit from `TaskHolder` is still a valid task holder if registered properly. """ register('basic-task', 'mycoro')(BasicTaskHolder) klass, coro_fn = TaskRegistry.get('basic-task') self.assertIs(klass, BasicTaskHolder) self.assertIs(coro_fn, BasicTaskHolder.mycoro)
def test_valid_registrations(self): """ Check the current registry (provisioned by registered task holder and coroutine) holds the right references. """ # A task holder is registered as a tuple made of (klass, coro_fn) register('my-task-holder', 'do_it')(MyTaskHolder) klass, coro_fn = TaskRegistry.get('my-task-holder') self.assertIs(klass, MyTaskHolder) self.assertIs(coro_fn, MyTaskHolder.do_it) self.assertEqual(MyTaskHolder.TASK_NAME, 'my-task-holder') # A coroutine is registered as a tuple made of (None, coro_fn) register('my-coro-task')(my_coro_task) klass, coro_fn = TaskRegistry.get('my-coro-task') self.assertIs(klass, None) self.assertIs(coro_fn, my_coro_task) # A coroutine can be registered sevral times with distinct names. # Note that an extra parameter passed to register will be ignored. register('other-coro-task', 'dummy')(my_coro_task) klass, coro_fn = TaskRegistry.get('other-coro-task') self.assertIs(klass, None) self.assertIs(coro_fn, my_coro_task)
def test_registry_get_unknown(self): """ Looking for an unknown Tukio task must raise a `KeyError` exception """ with self.assertRaises(UnknownTaskName): TaskRegistry.get('dummy')