From: Martin Mares Date: Sat, 8 Aug 2009 15:13:54 +0000 (+0200) Subject: Implemented overrides X-Git-Tag: python-dummy-working~96 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=87f05a2acc1e680a0fc17f507d2a4e23e2d185c6;p=moe.git Implemented overrides --- diff --git a/t/moe/config.py b/t/moe/config.py index 7c41fa2..f2ca641 100644 --- a/t/moe/config.py +++ b/t/moe/config.py @@ -16,7 +16,7 @@ class MoeConfig: """Moe configuration file.""" def __init__(self, file=None, name=None): - self.cfg = {} + self.vars = {} if file is not None: self.load(file) elif name is not None: @@ -34,24 +34,24 @@ class MoeConfig: v = x[sep+1:] if k.endswith("+"): k = k[:-1] - if not self.cfg.has_key(k): - self.cfg[k] = [('a','')]; + if not self.vars.has_key(k): + self.vars[k] = [('a','')]; else: - self.cfg[k] = [] + self.vars[k] = [] if not key_pattern.match(k): raise MoeConfigInvalid, "Malformed name of configuration variable" if v.startswith("'"): v=v[1:] if not v.endswith("'"): raise MoeConfigInvalid, "Misquoted string" - self.cfg[k].append(('s', v[:-1])) + self.vars[k].append(('s', v[:-1])) elif v.startswith('"'): v=v[1:] if not v.endswith('"'): raise MoeConfigInvalid, "Misquoted string" - self.parse_interpolated(self.cfg[k], v[:-1]) + self.parse_interpolated(self.vars[k], v[:-1]) else: - self.cfg[k].append(('s', v)) + self.parse_interpolated(self.vars[k], v) else: raise MoeConfigInvalid, "Parse error" @@ -93,7 +93,7 @@ class MoeConfig: s = s[p:] def dump(self, file=sys.stdout): - for k,v in self.cfg.items(): + for k,v in self.vars.items(): file.write(k) if len(v) > 0 and v[0][0] == 'a': file.write('+') @@ -131,8 +131,8 @@ class MoeConfigStack: def do_get(self, k, pos): while pos >= 0: cfg = self.stk[pos] - if cfg.cfg.has_key(k): - new = cfg.cfg[k] + if cfg.vars.has_key(k): + new = cfg.vars[k] if new[0][0] == 'a': v = self.do_get(k, pos-1) else: @@ -145,3 +145,44 @@ class MoeConfigStack: return v pos -= 1 return '' + + def keys(self): + seen = {} + for cfg in self.stk: + for k in cfg.vars.keys(): + seen[k] = None + return seen.keys() + + def dump(self, file=sys.stdout): + for k in self.keys(): + v = self[k] + file.write("%s=%s\n" % (k,v)) + + def dump_defs(self, file=sys.stdout): + file.write("Configuration stack:\n") + level = 0 + for cfg in self.stk: + level += 1 + file.write("(level %d)\n" % level) + cfg.dump(file) + file.write("(end)\n") + + def apply_overrides(self, prefix): + newstk = [] + for cfg in self.stk: + over = MoeConfig() + changed = False + for k in cfg.vars.keys(): + if k.startswith(prefix): + over.vars[k[len(prefix):]] = cfg.vars[k] + changed = True + if changed: + clean = MoeConfig() + for k in cfg.vars.keys(): + if not k.startswith(prefix): + clean.vars[k] = cfg.vars[k] + newstk.append(clean) + newstk.append(over) + else: + newstk.append(cfg) + self.stk = newstk diff --git a/t/test.py b/t/test.py index 2460a21..d503b7c 100755 --- a/t/test.py +++ b/t/test.py @@ -20,4 +20,10 @@ s = moe.config.MoeConfigStack() s.push(c) s.push(d) -print s['a'] +s.dump_defs() + +s.apply_overrides("x_") +s.dump_defs() + +print "***" +s.dump()