def dispatch(self, action, arguments): name = CAPABS.get_name(action) results = [] for index, backend in enumerate(self.backends): method = backend.get_method(action) if method: try: if action == CAPABS.SEARCH: results.append(method(*arguments)) else: results.extend(map(method, arguments)) except DeferToNextBackend: if index != len(self.backends) - 1: next_backend = self.backends[index + 1] log.info("deferring to " + next_backend.__class__.__name__) continue else: log.warning("backend {} does not support method {}"\ .format(backend.__class__.__name__, name)) results = flatten_lazy(results) try: first = next(results) results = itertools.chain([first], results) except StopIteration: log.notice("no results") sys.exit(0) return getattr(self, "post_" + name.lower())(results)
def current_action_name(self): return CAPABS.get_name(self.current_action)