def execute_hooks(event_name, *args, **kwargs): """Execute action hooks based upon parent task state. """ # skip tasks that aren't part of pipeline if not isinstance(kwargs['sender'], PipelineTask): return task_kwargs = deepcopy(kwargs['kwargs']) # inception! state = task_kwargs.get('_pipeline_chain_state', {}) if 'hooks' in state: hooks = [ h for h in state['hooks'] if \ h.event == event_name ] if not hooks: return [] logger.debug('task has hooks: {}'.format(hooks)) context = task_kwargs['_pipeline_chain_state']['build_context'] callbacks = [] for hook in hooks: try: should_execute = safe_eval( hook.predicate, context.eval_context ) except: should_execute = False if should_execute: source = kwargs['args'][0] # wtf callbacks.append(hook.task_action.prepare(source, context)) else: logger.debug('hook {} should not execute.'.format(hook.task_action)) if len(callbacks): logger.debug('Executing some hooks: {}'.format(callbacks)) canvas = group(*callbacks) return canvas.apply_async() return []
def evaluate(self, expression): """Evaluate an expression using context. """ return safe_eval(expression, self.eval_context)