]> mj.ucw.cz Git - moe.git/blob - t/moe/pipeline.py
Better error reporting
[moe.git] / t / moe / pipeline.py
1 #!/usr/bin/env python
2
3 import sys
4 import bisect
5 import imp
6 import moe.log
7
8 class MoePipeError(Exception):
9     """Failure of the MoePipeline."""
10
11 class MoePipeline:
12     """Moe pipeline."""
13
14     def __init__(self, name):
15         self.pipe = []
16         self.index = -1
17         self.name = name
18
19     def insert(self, pri, name, fun):
20         triple = (pri,name,fun)
21         pos = bisect.bisect(self.pipe, triple)
22         if pos <= self.index:
23             raise MoePipeError, "Pipeline insert cannot alter the past"
24         self.pipe.insert(pos, triple)
25
26     def dump(self, file=sys.stdout):
27         file.write(">>> Pipeline %s\n" % self.name)
28         for pri,name,fun in self.pipe:
29             file.write("%03d %s\n" % (pri,name))
30
31     def run(self, *args):
32         self.index = 0
33         while self.index < len(self.pipe):
34             (pri,name,fun) = self.pipe[self.index]
35             moe.log.verbose(">> Running %s:%s\n" % (self.name,name))
36             fun(*args)
37             self.index += 1
38         self.index = -1
39
40     def add_hook(self, name):
41         modname = "moe.hooks." + name
42         moe.log.verbose(">> Loading hook %s\n" % name)
43         if not sys.modules.has_key(modname):
44             ## FIXME: Configuration variable for the hook directory?
45             try:
46                 fp, path, desc = imp.find_module(name, ["moe/hooks"])
47             except ImportError:
48                 raise MoePipeError, "Cannot find hook module " + modname
49             try:
50                 imp.load_module(modname, fp, path, desc)
51             finally:
52                 fp.close()
53         sys.modules[modname].init(self)
54
55     def configure(self, names):
56         for name in names.split():
57             self.add_hook(name)