Source code for bibliopixel.control.action

from . ops import Ops
from . editor import Editor
from . receiver import Receiver
from .. util import deprecated


[docs]class Action(Receiver): """ An Action takes an incoming message, applies Ops to it, and then uses it to set a value on a Editor. """ def __init__(self, address, ops=()): self.address = Editor(address) self.ops = Ops(*ops)
[docs] def set_project(self, project): self.address.set_project(project)
[docs] def receive(self, values): if self.ops: if len(values) == 1: values = [self.ops(values[0])] else: # TODO: They specified ops, but we can't use it. # Should we warn here? Can we use the ops somehow? pass return self.address.receive(values)
def __bool__(self): return bool(self.address or self.ops) def __str__(self): if self.ops: return '%s->%s' % self.address, self.ops return str(self.address)
[docs] @classmethod def make(cls, action): if isinstance(action, str): return cls(action) if isinstance(action, dict): return cls(**action) return cls(*action)
[docs]class ActionList(Receiver): """A list of Actions.""" def __init__(self, actions=None): if isinstance(actions, (str, dict)): actions = [actions] self.actions = tuple(Action.make(a) for a in actions or ())
[docs] def set_project(self, project): for a in self.actions: a.set_project(project)
[docs] def receive(self, msg): values = tuple(msg.values()) for action in self.actions: action.receive(values)
def __bool__(self): return bool(self.actions) def __str__(self): return ' + '.join(str(a) for a in self.actions)