--- /dev/null
+#!/usr/bin/env python
+
+import sys
+import bisect
+import imp
+import moe.log
+
+class MoePipeline:
+ """Moe pipeline."""
+
+ def __init__(self, name):
+ self.pipe = []
+ self.index = -1
+ self.name = name
+
+ def insert(self, pri, name, fun):
+ triple = (pri,name,fun)
+ pos = bisect.bisect(self.pipe, triple)
+ if pos <= self.index:
+ raise RuntimeError, "MoePipeline.insert cannot alter the past"
+ self.pipe.insert(pos, triple)
+
+ def dump(self, file=sys.stdout):
+ file.write(">>> Pipeline %s\n" % self.name)
+ for pri,name,fun in self.pipe:
+ file.write("%03d %s\n" % (pri,name))
+
+ def run(self, *args):
+ self.index = 0
+ while self.index < len(self.pipe):
+ (pri,name,fun) = self.pipe[self.index]
+ moe.log.verbose(">> Running %s:%s\n" % (self.name,name))
+ fun(*args)
+ self.index += 1
+ self.index = -1
+
+ def add_hook(self, name):
+ modname = "moe.hooks." + name
+ moe.log.verbose(">> Loading hook %s\n" % name)
+ if not sys.modules.has_key(modname):
+ fp, path, desc = imp.find_module(name, ["moe/hooks"])
+ try:
+ imp.load_module(modname, fp, path, desc)
+ finally:
+ fp.close()
+ sys.modules[modname].init(self)
+
+ def configure(self, names):
+ for name in names.split():
+ self.add_hook(name)