import sys
import bisect
import imp
+import moe
import moe.log
+class MoePipeError(moe.MoeError):
+ """Failure of the MoePipeline."""
+
+class MoeAbortPipeline(Exception):
+
+ def __init__(self, skip_to=999):
+ self.skip_to = skip_to
+
class MoePipeline:
"""Moe pipeline."""
triple = (pri,name,fun)
pos = bisect.bisect(self.pipe, triple)
if pos <= self.index:
- raise RuntimeError, "MoePipeline.insert cannot alter the past"
+ raise MoePipeError, "Pipeline insert cannot alter the past"
self.pipe.insert(pos, triple)
- def dump(self, file=sys.stdout):
+ def dump(self, file=sys.stdout, prefix=""):
file.write(">>> Pipeline %s\n" % self.name)
for pri,name,fun in self.pipe:
- file.write("%03d %s\n" % (pri,name))
+ file.write("%s%03d %s\n" % (prefix,pri,name))
def run(self, *args):
self.index = 0
+ min_pri = -1
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)
+ if pri >= min_pri:
+ moe.log.default.verbose(">> Running %s:%s\n" % (self.name,name))
+ try:
+ fun(*args)
+ except MoeAbortPipeline, err:
+ min_pri = err.skip_to
+ else:
+ moe.log.default.verbose(">> Skipping %s:%s\n" % (self.name,name))
self.index += 1
self.index = -1
+ moe.log.default.verbose(">> Pipeline %s finished\n" % self.name)
def add_hook(self, name):
modname = "moe.hooks." + name
- moe.log.verbose(">> Loading hook %s\n" % name)
+ moe.log.default.verbose(">> Loading hook %s\n" % name)
if not sys.modules.has_key(modname):
- fp, path, desc = imp.find_module(name, ["moe/hooks"])
+ ## FIXME: Configuration variable for the hook directory?
+ try:
+ fp, path, desc = imp.find_module(name, ["moe/hooks"])
+ except ImportError:
+ raise MoePipeError, "Cannot find hook module " + modname
try:
imp.load_module(modname, fp, path, desc)
finally: