Expose class members as Fabric tasks
Fabric has class-based tasks but they are limited: Task class represents a single task.
This module make it possible to have class-based Fabric task sets.
pip install fabric-taskset
TaskSet is a class that can expose its methods as Fabric tasks.
# fabfile.py from fabric.api import local from taskset import TaskSet, task_method class SayBase(TaskSet): def say(self, what): raise NotImplementedError() @task_method(default=True, alias='hi') def hello(self): self.say('hello') @task_method def bye(self): self.say('goodbye') class EchoSay(SayBase): def say(self, what): local('echo ' + what) say = EchoSay().expose_as_module('say')
$ fab -l Available commands: say say.bye say.hello say.hi $ fab say.hi hello
taskset.task_method is a decorator declaring the wrapped method to be task. It acceps the same arguments as fabric.decorators.task so use it on methods just like fabric’s decorator is used on functions.
You can also create an “on-disk” Python module and populate it with tasks:
# my_lib/say.py from taskset import TaskSet, task_method class SayBase(TaskSet): def say(self, what): raise NotImplementedError() @task_method(default=True, alias='hi') def hello(self): self.say('hello') class EchoSay(SayBase): def say(self, what): local('echo ' + what) instance = EchoSay() instance.expose_to_current_module() # fabfile.py from mylib import say
https://github.com/ramusus/fabriclassed is a very similar app. At the time of writing it is focused on old-style Fabric tasks and has a small deployment framework included.
In order to feed my NIH syndrome I create Fabric-taskset which exposes new-style Fabric tasks, provides slightly different API and doesn’t have extra goodies.
This library then evolved to support exposing tasks without creating dummy on-disk modules (thanks to Denis Untevskiy).
- private _expose_to method now returns list, not generator.
- @task decorator is deprecated and replaced with @task_method. This was a bad name because of @fabric.task decorator (thanks Denis Untevskiy);
- Taskset.expose_as_module method that allows to use TaskSet instances from command line without creating dummy modules on disk (thanks Denis Untevskiy).