"""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:
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"
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('+')
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:
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