From 72657b1e01a615920375ad655f2ecfa391d10337 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sun, 9 Aug 2009 15:06:46 +0200 Subject: [PATCH] A better implementation of the pipeline, including hook loader --- t/moe/eval.py | 8 -------- t/moe/pipeline.py | 50 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 t/moe/pipeline.py diff --git a/t/moe/eval.py b/t/moe/eval.py index 9ffc4f8..e5d8d04 100644 --- a/t/moe/eval.py +++ b/t/moe/eval.py @@ -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 index 0000000..1804c5b --- /dev/null +++ b/t/moe/pipeline.py @@ -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) -- 2.39.2