From 1bfed651aece29b0b4956e3a9a3a0cbd21f0956d Mon Sep 17 00:00:00 2001 From: "Ivan A. Melnikov" Date: Wed, 18 Sep 2013 12:00:32 +0400 Subject: [PATCH] Allow to specify default provides at task definition It is now possible to specify what task provides when task class (deriving from taskflow.task.Task) is defined, using 'default_provides' class attribute or property. This specification may still be overridden when task instance is created via 'provides' constructor parameter. Change-Id: If300c3a35807422d06c0196e84891faebde83c02 --- taskflow/task.py | 6 ++++++ taskflow/tests/unit/test_task.py | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/taskflow/task.py b/taskflow/task.py index 073adbff..1796ba9b 100644 --- a/taskflow/task.py +++ b/taskflow/task.py @@ -204,13 +204,19 @@ class Task(BaseTask): Adds following features to Task: - auto-generates name from type of self - adds all execute argument names to task requirements + - items provided by the task may be specified via + 'default_provides' class attribute or property """ + default_provides = None + def __init__(self, name=None, provides=None, requires=None, auto_extract=True, rebind=None): """Initialize task instance""" if name is None: name = reflection.get_callable_name(self) + if provides is None: + provides = self.default_provides super(Task, self).__init__(name, provides=provides) self.rebind = _build_arg_mapping(self.name, requires, rebind, diff --git a/taskflow/tests/unit/test_task.py b/taskflow/tests/unit/test_task.py index 5c45659e..e661aa40 100644 --- a/taskflow/tests/unit/test_task.py +++ b/taskflow/tests/unit/test_task.py @@ -31,6 +31,13 @@ class KwargsTask(task.Task): pass +class DefaultProvidesTask(task.Task): + default_provides = 'def' + + def execute(self): + return None + + class TaskTestCase(test.TestCase): def test_passed_name(self): @@ -149,3 +156,13 @@ class TaskTestCase(test.TestCase): def test_rebind_list_bad_value(self): with self.assertRaisesRegexp(TypeError, '^Invalid rebind value:'): MyTask(rebind=object()) + + def test_default_provides(self): + task = DefaultProvidesTask() + self.assertEquals(task.provides, set(['def'])) + self.assertEquals(task.save_as, {'def': None}) + + def test_default_provides_can_be_overridden(self): + task = DefaultProvidesTask(provides=('spam', 'eggs')) + self.assertEquals(task.provides, set(['spam', 'eggs'])) + self.assertEquals(task.save_as, {'spam': 0, 'eggs': 1})