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