]> mj.ucw.cz Git - moe.git/commitdiff
A better implementation of the pipeline, including hook loader
authorMartin Mares <mj@ucw.cz>
Sun, 9 Aug 2009 13:06:46 +0000 (15:06 +0200)
committerMartin Mares <mj@ucw.cz>
Sun, 9 Aug 2009 13:06:46 +0000 (15:06 +0200)
t/moe/eval.py
t/moe/pipeline.py [new file with mode: 0644]

index 9ffc4f821021776073d7424dc689bf06487125b6..e5d8d0410764c1e4d8012202222fd418cbff485d 100644 (file)
@@ -1,11 +1,3 @@
 #!/usr/bin/env python
 
 import moe.config
-
-def init_pipeline(cfg, prefix):
-    pipe = {}
-    for k in cfg.keys():
-       if k.startswith(prefix):
-           pri = int(k[len(prefix):])
-           pipe[pri] = cfg[k]
-    return [ pipe[k] for k in sorted(pipe.keys()) ]
diff --git a/t/moe/pipeline.py b/t/moe/pipeline.py
new file mode 100644 (file)
index 0000000..1804c5b
--- /dev/null
@@ -0,0 +1,50 @@
+#!/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)